samuel025

Function Submit DO Receipt New

Dec 21st, 2021 (edited)
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION in_submit_do_receipt(bigint, character varying, character varying)
  2.   RETURNS void AS
  3. $BODY$
  4. DECLARE
  5.     pTenantId           ALIAS FOR $1;
  6.     pSessionId          ALIAS FOR $2;
  7.     pProcessNo          ALIAS FOR $3;
  8.  
  9.     vProcessId              bigint;
  10.     vDoReceiptId                    bigint;
  11.     vUserId                 bigint;
  12.     vDatetime               character varying(14);
  13.     vFlagInvoice            character varying(1);
  14.     vEmptyId                bigint;
  15.     vStatusRelease          character varying(1);
  16.     vStatusDraft            character varying(1);  
  17.     vStatusFinal            character varying(1);
  18.     vStatusVoid             character varying(1);
  19.     vEmptyValue             character varying(1);
  20.     vProductStatus          character varying(5);
  21.     vSignDebit              character varying(1);
  22.     vSignCredit             character varying(1);
  23.     vTypeRate               character varying(3);
  24.     vProductCOA             character varying(10);
  25.     vSystemCOA              character varying(10);
  26.     vSoId                   bigint;
  27.     vDoId                   bigint;
  28.     vInvoiceId              bigint;
  29.     vUnfinishedItem         bigint;
  30.     vParentOuId             bigint;
  31.     vJournalTrxId           bigint;    
  32.     vJournalType            character varying(20);
  33.     vDocNoSI                character varying(50);
  34.     vOuId                   bigint;
  35.     vOuWarehouseId          bigint;
  36.     vAutoNumId              bigint;
  37.    
  38.     vDocJournal                 DOC_JOURNAL%ROWTYPE;
  39.     vOuStructure                OU_BU_STRUCTURE%ROWTYPE;
  40.     vOuStructureJournalItem     OU_BU_STRUCTURE%ROWTYPE;
  41.     result                      RECORD;
  42.    
  43.     vDoReceiptDocTypeId     bigint;
  44.     vRoundingModeNonTax     character varying(5);
  45.     vDoDocTypeId            bigint;
  46.     vSoDocTypeId            bigint;
  47.     vSlsInvTempId           bigint;
  48.     vSlsInvTempDocTypeId    bigint;
  49.     vNo                     character varying(5);
  50.     vYes                    character varying(5);
  51. BEGIN
  52.  
  53.     vFlagInvoice := 'N';
  54.     vEmptyId := -99;
  55.     vStatusRelease := 'R';
  56.     vStatusVoid := 'V';
  57.     vStatusDraft := 'D';
  58.     vStatusFinal := 'F';
  59.     vEmptyValue := ' ';
  60.     vProductStatus := 'GOOD';
  61.     vSignDebit := 'D';
  62.     vSignCredit := 'C';
  63.     vTypeRate := 'COM';
  64.     vProductCOA := 'PRODUCT';
  65.     vSystemCOA := 'SYSTEM';
  66.     vUnfinishedItem := 0;
  67.     vNo := 'N';
  68.     vYes := 'Y';
  69.  
  70.     vDoReceiptDocTypeId = 526;
  71.     vDoDocTypeId := 311;
  72.     vSoDocTypeId := 301;
  73.     vSlsInvTempDocTypeId := 361;
  74.  
  75.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'rounding.mode.non.tax') INTO vRoundingModeNonTax;
  76.  
  77.  
  78.     SELECT A.process_message_id INTO vProcessId
  79.     FROM t_process_message A
  80.     WHERE A.tenant_id = pTenantId AND
  81.         A.process_name = 'in_submit_do_receipt' AND
  82.         A.process_no = pProcessNo;
  83.  
  84.     SELECT CAST(A.process_parameter_value AS bigint) INTO vDoReceiptId
  85.     FROM t_process_parameter A
  86.     WHERE A.process_message_id = vProcessId AND
  87.         A.process_parameter_key = 'doReceiptId';
  88.  
  89.     SELECT CAST(A.process_parameter_value AS bigint) INTO vUserId
  90.     FROM t_process_parameter A
  91.     WHERE A.process_message_id = vProcessId AND
  92.         A.process_parameter_key = 'userId';
  93.  
  94.     SELECT CAST(A.process_parameter_value AS character varying(14)) INTO vDatetime
  95.     FROM t_process_parameter A
  96.     WHERE A.process_message_id = vProcessId AND
  97.         A.process_parameter_key = 'datetime';
  98.  
  99.     DELETE FROM tt_journal_trx_item WHERE session_id = pSessionId;
  100. /*
  101.  * 1. update status doc in_do_receipt
  102.  * 2. add sl_log_so_balance_item
  103.  * 3. add sl_so_balance_invoice
  104.  * 4. add sl_so_balance_invoice_tax
  105.  * 5. update sl_so_balance_invoice untuk Do Id
  106.  * 6. update sl_so_balance_invoice_tax untuk Do Id
  107.  * 7. void sales invoice temporer untuk So Id
  108.  * 8. delete data sales invoice temporer dari fi_invoice_ar_balance dan fi_invoice_tax_ar_balance
  109.  * 9. add in_log_product_balance_stock
  110.  * 10. update in_product_balance_stock
  111.  * 11. update in_balance_do_item
  112.  * 12. update sl_so_balance_item - status dan qty
  113.  * 13. update status sl_so. Jika seluruh balance item sudah final/cancel, maka status menjadi Final.
  114.  * 14. add gl_journal_trx
  115.  * 15. add gl_journal_trx_item
  116.  * 16. add gl_journal_trx_mapping
  117.  *
  118.  */
  119.  
  120.     SELECT A.ref_id, f_get_ou_bu_structure(A.ou_id) AS ou, f_get_document_journal(A.doc_type_id) as doc
  121.     FROM in_do_receipt A
  122.     WHERE A.do_receipt_id = vDoReceiptId INTO result;
  123.  
  124.     vDoId := result.ref_id;
  125.     vOuStructure := result.ou;
  126.     vDocJournal := result.doc;
  127.  
  128.     SELECT ref_id INTO vSoId
  129.     FROM sl_do
  130.     WHERE do_id = vDoId;
  131.  
  132.     SELECT invoice_id INTO vInvoiceId
  133.     FROM sl_so_balance_invoice
  134.     WHERE so_id = vSoId
  135.     AND ref_id = vDoId
  136.     AND ref_doc_type_id = vDoDocTypeId
  137.     LIMIT 1;
  138.  
  139.     /*
  140.      * update status doc in_do_receipt menjadi Release
  141.      */
  142.     UPDATE in_do_receipt SET status_doc = vStatusRelease, version = version + 1, update_datetime = vDatetime, update_user_id = vUserId
  143.     WHERE do_receipt_id = vDoReceiptId;
  144.  
  145.     /*
  146.      * buat data log sl_log_so_balance_item
  147.      */
  148.     INSERT INTO sl_log_so_balance_item
  149.     (tenant_id, so_id, so_item_id, ref_doc_type_id, ref_id, ref_item_id,
  150.      qty_trx, trx_uom_id, qty_int, base_uom_id, remark,
  151.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  152.     SELECT A.tenant_id, C.so_id, C.so_item_id, A.doc_type_id, A.do_receipt_id, B.do_receipt_item_id,
  153.         B.qty_return * D.qty_so / D.qty_int, D.so_uom_id, B.qty_return, B.uom_id, B.remark,
  154.         0, vDatetime, vUserId, vDatetime, vUserId
  155.     FROM in_do_receipt A, in_do_receipt_item B, in_balance_do_item C, sl_so_item D
  156.     WHERE A.do_receipt_id = vDoReceiptId AND
  157.           A.do_receipt_id = B.do_receipt_id AND
  158.           B.ref_id = C.do_item_id AND
  159.           C.so_item_id = D.so_item_id AND
  160.           B.qty_return > 0;
  161.  
  162.     /*
  163.      * buat data sl_so_balance_Invoice
  164.      * supaya dapat ditarik saat buat sales invoice
  165.      */
  166.     INSERT INTO sl_so_balance_invoice
  167.         (tenant_id, ou_id, partner_id, so_id,
  168.         ref_doc_type_id, ref_id, ref_doc_no, ref_doc_date, ref_item_id, qty_dlv_so, so_uom_id,
  169.         curr_code, price_so, item_amount, flg_invoice, invoice_id,
  170.         regular_disc_amount, promo_disc_amount, adj_regular_disc_amount, adj_promo_disc_amount,
  171.         "version", create_datetime, create_user_id, update_datetime, update_user_id,
  172.         do_receipt_item_id, gross_sell_price_so, flg_tax_amount, tax_id, tax_percentage, discount_percentage, discount_amount)
  173.        
  174.     SELECT A.tenant_id, A.ou_id, G.partner_id, C.so_id,
  175.             A.ref_doc_type_id, A.ref_id, G.ref_doc_no, G.ref_doc_date, B.ref_id, -1 * B.qty_return * D.qty_so / D.qty_int, D.so_uom_id,
  176.             D.curr_code, G.price_so,
  177.             -1 * f_get_amount_before_tax_and_disc((B.qty_return * D.qty_so / D.qty_int) * G.gross_sell_price_so, (B.qty_return * D.qty_so / D.qty_int) * G.discount_amount, G.flg_tax_amount, G.tax_percentage, f_get_digit_decimal_doc_curr(vDoReceiptDocTypeId, D.curr_code), vRoundingModeNonTax),
  178.             vFlagInvoice, vEmptyId,
  179.             -1 * (G.discount_amount * (B.qty_return * D.qty_so / D.qty_int)),
  180.             0, 0, 0,
  181.             0, vDatetime, vUserId, vDatetime, vUserId,
  182.             B.do_receipt_item_id, G.gross_sell_price_so, G.flg_tax_amount, G.tax_id, G.tax_percentage, G.discount_percentage, G.discount_amount
  183.            
  184.     FROM in_do_receipt A, in_do_receipt_item B, in_balance_do_item C, sl_so_item D, sl_so_balance_invoice G
  185.     WHERE A.do_receipt_id = vDoReceiptId AND
  186.           A.do_receipt_id = B.do_receipt_id AND
  187.           B.ref_id = C.do_item_id AND
  188.           C.so_item_id = D.so_item_id AND
  189.           G.ref_doc_type_id = A.ref_doc_type_id AND
  190.           G.ref_id = A.ref_id AND
  191.           G.ref_item_id = B.ref_id AND
  192.           B.qty_return > 0 AND G.do_receipt_item_id = -99;
  193.          
  194.     /*
  195.      * buat data sl_so_balance_invoice_tax
  196.      * supaya dapat ditarik saat buat sales invoice
  197.      */
  198.     INSERT INTO sl_so_balance_invoice_tax
  199.     (tenant_id, ou_id, partner_id, so_id,
  200.     ref_doc_type_id, ref_id, ref_item_id, tax_id, flg_amount,
  201.     tax_percentage, curr_code, base_amount, tax_amount, flg_invoice, invoice_id,
  202.     "version", create_datetime, create_user_id, update_datetime, update_user_id,
  203.     do_receipt_item_id)
  204.     SELECT A.tenant_id, A.ou_id, G.partner_id, C.so_id,
  205.         A.ref_doc_type_id, A.ref_id, B.ref_id, G.tax_id, E.flg_amount,
  206.         D.tax_percentage, D.curr_code,
  207.         -1 * f_get_amount_before_tax_and_disc((B.qty_return * D.qty_so / D.qty_int) * G.gross_sell_price_so, (B.qty_return * D.qty_so / D.qty_int) * G.discount_amount, G.flg_tax_amount, G.tax_percentage, f_get_digit_decimal_doc_curr(vDoReceiptDocTypeId, D.curr_code), vRoundingModeNonTax),
  208.         -1 * f_tax_rounding(A.tenant_id, f_get_amount_before_tax((B.qty_return * D.qty_so / D.qty_int) * (G.gross_sell_price_so - G.discount_amount), G.flg_tax_amount, G.tax_percentage, f_get_digit_decimal_doc_curr(vDoReceiptDocTypeId, D.curr_code), vRoundingModeNonTax), G.tax_percentage),
  209.         vFlagInvoice, vEmptyId,
  210.         0, vDatetime, vUserId, vDatetime, vUserId,
  211.         B.do_receipt_item_id
  212.     FROM in_do_receipt A, in_do_receipt_item B, in_balance_do_item C, sl_so_item D, m_tax E, sl_so F, sl_so_balance_invoice G
  213.     WHERE A.do_receipt_id = vDoReceiptId AND
  214.           A.do_receipt_id = B.do_receipt_id AND
  215.           B.ref_id = C.do_item_id AND
  216.           C.so_item_id = D.so_item_id AND
  217.           G.tax_id = E.tax_id AND
  218.           D.so_id = F.so_id AND
  219.           B.qty_return > 0 AND
  220.          
  221.           G.ref_doc_type_id = A.ref_doc_type_id AND
  222.           G.ref_id = A.ref_id AND
  223.           G.ref_item_id = B.ref_id AND
  224.           G.do_receipt_item_id = -99;
  225.           /*
  226.           G.do_id = vDoId AND
  227.           G.do_id = H.do_id AND
  228.           H.ref_id = D.so_item_id AND
  229.           D.tax_id = E.tax_id AND
  230.           D.so_id = F.so_id;
  231.           */
  232.          
  233.          
  234.          
  235.  
  236.     /*
  237.      * update sl_so_balance_invoice, dan sl_so_balance_invoice_tax
  238.      * yang sudah dibuat oleh sales invoice temporer
  239.      */
  240.  
  241.     UPDATE sl_so_balance_invoice A SET flg_invoice = vFlagInvoice, flg_invoice_temp = vFlagInvoice, invoice_id = vEmptyId
  242.     WHERE A.so_id = vSoId
  243.     AND A.flg_invoice = vNo
  244.     AND A.flg_invoice_temp = vYes
  245.     AND A.invoice_id = vInvoiceId
  246.     AND EXISTS (SELECT 1 FROM sl_invoice_temp B WHERE A.so_id = B.ref_id AND B.ref_doc_type_id = vSoDocTypeId);
  247.  
  248.     UPDATE sl_so_balance_invoice_tax A SET flg_invoice = vFlagInvoice, invoice_id = vEmptyId
  249.     WHERE A.so_id = vSoId
  250.     AND A.flg_invoice = vYes
  251.     AND A.invoice_id = vInvoiceId
  252.     AND EXISTS (SELECT 1 FROM sl_invoice_temp B WHERE A.so_id = B.ref_id AND B.ref_doc_type_id = vSoDocTypeId);
  253.  
  254.     /*
  255.      * void data sales invoice temporer yang menggunakan DO Item id yang sama dng Do Receipt :
  256.      * 1. cari invoice temp id yang memiliki data DO Item yang sama dengan DO Receipt
  257.      * 2. update status doc invoice temp sesuai id yang diperoleh di langkah ke 1
  258.      */
  259.     SELECT A.invoice_temp_id INTO vSlsInvTempId
  260.     FROM sl_invoice_temp_item A, in_do_receipt_item B, in_do_receipt C, sl_invoice_temp D
  261.     WHERE A.ref_doc_type_id = B.ref_doc_type_id AND
  262.         A.ref_id = vDoId AND
  263.         A.ref_item_id = B.ref_id AND
  264.         B.do_receipt_id = C.do_receipt_id AND
  265.         C.ref_id = A.ref_id AND
  266.         B.do_receipt_id = vDoReceiptId AND
  267.         A.invoice_temp_id = D.invoice_temp_id AND
  268.         D.status_doc <> vStatusVoid;
  269.  
  270.     UPDATE sl_invoice_temp SET status_doc = vStatusVoid, update_datetime = vDatetime, update_user_id = vUserId
  271.     WHERE invoice_temp_id = vSlsInvTempId;
  272.  
  273.     /*
  274.      * advance invoice  harus diupdate juga supaya bisa dipakai lagi
  275.      */
  276.     UPDATE sl_so_balance_advance_invoice B SET flg_invoice = vFlagInvoice, flg_invoice_temp = vFlagInvoice, invoice_id = vEmptyId
  277.     WHERE B.so_id = vSoId
  278.     AND EXISTS (
  279.         SELECT 1 FROM sl_invoice_temp_advance A
  280.         WHERE A.ref_id = B.ref_id
  281.         AND A.ref_doc_type_id = B.ref_doc_type_id
  282.         AND A.invoice_temp_id = vSlsInvTempId
  283.     );
  284.  
  285.     /*
  286.      * nomor faktur pajak boleh digunakan kembali untuk temp sales invoice yang di void gara2 DO Receipt
  287.      *
  288.      */
  289.     UPDATE m_gen_tax_number A
  290.     SET invoice_id = vEmptyId, invoice_doc_type_id = vEmptyId, invoice_doc_no = vEmptyValue, invoice_doc_date = vEmptyValue
  291.     FROM sl_invoice_temp B
  292.     WHERE A.invoice_doc_no = B.inv_doc_no
  293.     AND A.invoice_doc_date = B.inv_doc_date
  294.     AND A.invoice_doc_type_id = B.doc_type_id
  295.     AND A.invoice_id = vSlsInvTempId
  296.     AND B.invoice_temp_id = vSlsInvTempId;
  297.  
  298.     /*
  299.      * Ambil nomor dokumen SI untuk dilakukan pengecekan SI masiih ada/tidak
  300.      */
  301.      SELECT A.doc_no INTO vDocNoSI
  302.      FROM sl_invoice A, sl_invoice_temp B
  303.      WHERE B.invoice_temp_id = vSlsInvTempId
  304.         AND A.doc_no = B.inv_doc_no;
  305.  
  306.      IF vDocNoSI IS NULL THEN
  307.  
  308.         /*
  309.          * nomor dokumen SI boleh digunakan kembali untuk temp sales invoice yang di void gara2 DO Receipt
  310.          *
  311.          */
  312.         UPDATE autonum_generated A
  313.         SET flg_unused = vYes
  314.         FROM sl_invoice_temp B
  315.         WHERE A.value_auto_num = B.inv_doc_no
  316.         AND B.invoice_temp_id = vSlsInvTempId;
  317.  
  318.         /*
  319.          * ambil id autonum
  320.          */
  321.          SELECT A.autonum_generated_id INTO vAutoNumId
  322.          FROM autonum_generated A, sl_invoice_temp B
  323.          WHERE A.value_auto_num = B.inv_doc_no
  324.          AND B.invoice_temp_id = vSlsInvTempId;
  325.  
  326.         /*
  327.          * delete autonum_ref_mapping berdasarkan variable autonumId yg sudah diambil sebelumnya
  328.          */
  329.          IF vAutoNumId IS NOT NULL THEN
  330.          DELETE FROM autonum_ref_mapping WHERE autonum_generated_id = vAutoNumId;
  331.          END IF;
  332.  
  333.      END IF;
  334.  
  335.     /*
  336.      * delete data sales invoice temporer dari fi_invoice_ar_balance dan fi_invoice_tax_ar_balance
  337.      */
  338.    
  339.     DELETE FROM fi_invoice_tax_ar_balance A
  340.     WHERE A.tenant_id = pTenantId AND
  341.     EXISTS (
  342.         SELECT 1 FROM fi_invoice_ar_balance B
  343.         WHERE A.tenant_id = B.tenant_id
  344.         AND A.invoice_ar_balance_id = B.invoice_ar_balance_id
  345.         AND B.doc_type_id = vSlsInvTempDocTypeId
  346.         AND B.invoice_ar_id = vSlsInvTempId
  347.     );
  348.    
  349.     DELETE FROM fi_invoice_ar_balance A
  350.     WHERE A.tenant_id = pTenantId AND
  351.           A.doc_type_id = vSlsInvTempDocTypeId AND
  352.           A.invoice_ar_id = vSlsInvTempId;
  353.    
  354.    
  355.     /*
  356.      * buat data log product balance stock
  357.      * ref item id = do_receipt_id
  358.      */      
  359.     INSERT INTO in_log_product_balance_stock
  360.     (tenant_id, ou_id, doc_type_id, ref_id, doc_no, doc_date, partner_id,
  361.      product_id, product_balance_id, warehouse_id, product_status, base_uom_id, qty,
  362.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  363.     SELECT A.tenant_id, E.ou_id, A.doc_type_id, A.do_receipt_id, A.doc_no, A.doc_date, D.partner_ship_to_id,
  364.         C.product_id, C.product_balance_id, A.warehouse_id, C.product_status, C.uom_id, SUM(C.qty_return),
  365.         0, vDatetime, vUserId, vDatetime, vUserId      
  366.     FROM in_do_receipt A, in_do_receipt_item B, in_do_receipt_product C, sl_do D, m_warehouse_ou E
  367.     WHERE A.do_receipt_id = vDoReceiptId AND
  368.         A.do_receipt_id = B.do_receipt_id AND
  369.         B.do_receipt_item_id = C.do_receipt_item_id AND
  370.         A.ref_id = D.do_id AND
  371.         A.warehouse_id = E.warehouse_id
  372.     GROUP BY A.tenant_id, E.ou_id, A.doc_type_id, A.do_receipt_id, A.doc_no, A.doc_date, D.partner_ship_to_id,
  373.             C.product_id, C.product_balance_id, A.warehouse_id, C.product_status, C.uom_id;
  374.  
  375.     /*
  376.      * update in_product_balance_stock
  377.      * mod by Didit, 30 Des 2016
  378.      * perbaiki jika ada 1 produk yang sama (product dan product balance) tapi ada lebih dari 1 record di tabel itemnya akan menjadi salah
  379.      */
  380.     WITH tt_in_product_balance_summary AS (
  381.         SELECT  C.product_id, C.tenant_id, A.warehouse_id, C.product_balance_id, C.product_status, SUM(C.qty_return) AS qty_return
  382.         FROM    in_do_receipt A, in_do_receipt_item B, in_do_receipt_product C
  383.         WHERE   A.do_receipt_id = vDoReceiptId
  384.                 AND A.do_receipt_id = B.do_receipt_id
  385.                 AND B.do_receipt_item_id = C.do_receipt_item_id
  386.                 AND C.qty_return > 0
  387.         GROUP BY C.product_id, C.tenant_id, A.warehouse_id, C.product_balance_id, C.product_status
  388.     )
  389.     UPDATE in_product_balance_stock SET qty = qty + A.qty_return, update_datetime = vDatetime, update_user_id = vUserId, version = version + 1
  390.     FROM tt_in_product_balance_summary A
  391.     WHERE in_product_balance_stock.product_id = A.product_id AND
  392.         in_product_balance_stock.tenant_id = A.tenant_id AND
  393.         in_product_balance_stock.warehouse_id = A.warehouse_id AND
  394.         in_product_balance_stock.product_balance_id = A.product_balance_id AND
  395.         in_product_balance_stock.product_status = A.product_status;
  396.            
  397.     /*
  398.      * update data balance do item sehubungan dengan product yang dikembalian/tidak diterima oleh customer,
  399.      * sehingga saat akan membuat return note, hanya barang yang memang diterima oleh customer
  400.      */
  401.     UPDATE in_balance_do_item SET qty_dlv_int = qty_dlv_int - A.qty_return,
  402.                                 qty_dlv = in_balance_do_item.qty_dlv - (A.qty_return * in_balance_do_item.qty_dlv / in_balance_do_item.qty_dlv_int),
  403.                                 status_item = vStatusRelease, update_datetime = vDatetime, update_user_id = vUserId
  404.     FROM in_do_receipt_item A
  405.     WHERE A.do_receipt_id = vDoReceiptId AND
  406.         in_balance_do_item.do_item_id = A.ref_id AND
  407.         A.qty_return > 0;
  408.        
  409.     UPDATE in_balance_do_item
  410.     SET status_item = vStatusRelease,
  411.         update_datetime = vDatetime,
  412.         update_user_id = vUserId
  413.     FROM in_do_receipt A
  414.     WHERE A.do_receipt_id = vDoReceiptId AND
  415.         in_balance_do_item.do_id = A.ref_id AND
  416.         A.ref_doc_type_id = vDoDocTypeId;
  417.        
  418.     /*
  419.      * update status SO seperti semula
  420.      */
  421.     UPDATE sl_so
  422.     SET status_doc = flg_old_status,
  423.         flg_old_status = vEmptyValue,
  424.         update_datetime = vDatetime,
  425.         update_user_id = vUserId,
  426.         version = version + 1
  427.     WHERE so_id = vSoId;
  428.    
  429.     /*
  430.      * update flg invoice so balance inv
  431.      */
  432.     UPDATE sl_so_balance_invoice
  433.     SET flg_invoice = vNo,
  434.         update_datetime = vDatetime,
  435.         update_user_id = vUserId,
  436.         version = version + 1
  437.     WHERE so_id = vSoId
  438.         AND ref_id = vDoId;
  439.    
  440.     /*
  441.      * update status so balance item
  442.      */
  443.     UPDATE sl_so_balance_item B
  444.     SET status_item = B.flg_old_status,
  445.         flg_old_status = vEmptyValue,
  446.         update_datetime = vDatetime,
  447.         update_user_id = vUserId,
  448.         version = B.version + 1
  449.     FROM sl_so A
  450.     INNER JOIN sl_so_item C ON A.so_id = C.so_id
  451.     INNER JOIN sl_do_item D ON D.ref_id = C.so_item_id
  452.     WHERE B.so_item_id = C.so_item_id
  453.         AND A.so_id = vSoId
  454.         AND D.do_id = vDoId;
  455.        
  456.     /*
  457.      * status item SO akan berubah menjadi Release, karena ada nya barang yang dikembalikan oleh customer
  458.      */    
  459.     UPDATE sl_so_balance_item SET qty_dlv = sl_so_balance_item.qty_dlv - (A.qty_return * sl_so_balance_item.qty_so / sl_so_balance_item.qty_so_int),
  460.                                 qty_dlv_int = sl_so_balance_item.qty_dlv_int - A.qty_return,
  461.                                 status_item = vStatusRelease
  462.     FROM in_do_receipt_item A, in_balance_do_item B
  463.     WHERE A.do_receipt_id = vDoReceiptId AND
  464.         A.ref_id = B.do_item_id AND
  465.         sl_so_balance_item.so_item_id = B.so_item_id AND
  466.         A.qty_return > 0;
  467.        
  468.     UPDATE sl_so SET status_doc = vStatusRelease
  469.     WHERE so_id = vSoId;   
  470.        
  471.     /*
  472.      * @author TKP, 9 Jun 2016
  473.      * Cek jika OU pada warehouse sama dengan OU pada dokumen maka nilai ou_bu_id dan ou_sub_bu_id =-99
  474.      * jika OU pada warehouse tidak sama dengan OU pada dokumen maka nilai ou_bu_id dan ou_sub_bu_id didapat pada f_get_ou_bu_structure;
  475.      */
  476.    
  477.     SELECT A.ou_id, B.ou_id INTO vOuId, vOuWarehouseId
  478.     FROM in_do_receipt A
  479.     INNER JOIN m_warehouse_ou B ON A.warehouse_id = B.warehouse_id
  480.     WHERE A.do_receipt_id = vDoReceiptId;
  481.    
  482.     IF (vOuId <> vOuWarehouseId) THEN
  483.         SELECT f_get_ou_bu_structure(vOuWarehouseId) as ou_structure INTO result;
  484.         vOuStructureJournalItem := result.ou_structure;
  485.     ELSE
  486.         vOuStructureJournalItem := ROW(-99, -99, -99);
  487.     END IF;
  488.    
  489.     /*
  490.      * membuat data transaksi jurnal :
  491.      * 1. buat admin
  492.      * 2. buat temlate jurnal
  493.      */
  494.  
  495.     PERFORM gl_manage_admin_journal_trx(A.tenant_id, (vOuStructure).ou_bu_id, A.ou_id, (vDocJournal).journal_type, (vDocJournal).ledger_code, f_get_year_month_date(A.doc_date), 'MONTHLY', vDatetime, vUserId)
  496.     FROM in_do_receipt A
  497.     WHERE A.do_receipt_id = vDoReceiptId;
  498.    
  499.     SELECT NEXTVAL('gl_journal_trx_seq') INTO vJournalTrxId;
  500.    
  501.     INSERT INTO gl_journal_trx
  502.     (journal_trx_id, tenant_id, journal_type, doc_type_id, doc_id, doc_no, doc_date,
  503.     ou_bu_id, ou_branch_id, ou_sub_bu_id, partner_id, cashbank_id, warehouse_id, ext_doc_no, ext_doc_date,  
  504.     ref_doc_type_id, ref_id, due_date, curr_code, remark, status_doc, workflow_status,
  505.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  506.     SELECT vJournalTrxId, A.tenant_id, (vDocJournal).journal_type, A.doc_type_id, A.do_receipt_id, A.doc_no, A.doc_date,
  507.         (vOuStructure).ou_bu_id, (vOuStructure).ou_branch_id, (vOuStructure).ou_sub_bu_id, B.partner_ship_to_id, vEmptyId, A.warehouse_id, A.ext_doc_no, A.ext_doc_date,
  508.         A.ref_doc_type_id, A.ref_id, A.doc_date, C.curr_code, A.remark, vStatusDraft, 'DRAFT',
  509.         0, vDatetime, vUserId, vDatetime, vUserId
  510.     FROM in_do_receipt A, sl_do B, sl_so C
  511.     WHERE A.do_receipt_id = vDoReceiptId AND
  512.         A.ref_id = B.do_id AND
  513.         B.ref_id = C.so_id;
  514.    
  515.     INSERT INTO tt_journal_trx_item
  516.     (session_id, tenant_id, journal_trx_id, line_no,
  517.     ref_doc_type_id, ref_id,
  518.     partner_id, product_id, cashbank_id, ou_rc_id,
  519.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  520.     coa_id, curr_code, qty, uom_id,
  521.     amount, journal_date, type_rate,
  522.     numerator_rate, denominator_rate, journal_desc, remark)
  523.     SELECT pSessionId, A.tenant_id, vJournalTrxId, 1,
  524.         A.doc_type_id, B.do_receipt_item_id,
  525.         C.partner_ship_to_id, B.product_id, vEmptyId, vEmptyId,
  526.         vEmptyId, vSignDebit, vProductCOA, vEmptyId,
  527.         f_get_product_coa_group_product(A.tenant_id, B.product_id), f_get_value_system_config_by_param_code(pTenantId, 'ValutaBuku'), B.qty_return, B.uom_id,
  528.         0, A.doc_date, vTypeRate,
  529.         1, 1, 'PRODUCT_STOCK', B.remark
  530.     FROM in_do_receipt A, in_do_receipt_item B, sl_do C
  531.     WHERE A.do_receipt_id = vDoReceiptId AND
  532.         A.do_receipt_id = B.do_receipt_id AND
  533.         A.ref_id = C.do_id;
  534.        
  535.     INSERT INTO gl_journal_trx_item
  536.     (tenant_id, journal_trx_id, line_no,
  537.     ref_doc_type_id, ref_id,
  538.     partner_id, product_id, cashbank_id, ou_rc_id,
  539.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  540.     coa_id, curr_code, qty, uom_id,
  541.     amount, journal_date, type_rate,
  542.     numerator_rate, denominator_rate, journal_desc, remark,
  543.     "version", create_datetime, create_user_id, update_datetime, update_user_id,
  544.     ou_branch_id, ou_sub_bu_id)
  545.     SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id),
  546.         A.ref_doc_type_id, A.ref_id,
  547.         A.partner_id, A.product_id, A.cashbank_id, A.ou_rc_id,
  548.         A.segmen_id, A.sign_journal, A.flg_source_coa, A.activity_gl_id,
  549.         A.coa_id, A.curr_code, A.qty, A.uom_id,
  550.         A.amount, A.journal_date, A.type_rate,
  551.         A.numerator_rate, A.denominator_rate, A.journal_desc, A.remark,
  552.         0, vDatetime, vUserId, vDatetime, vUserId,
  553.         (vOuStructureJournalItem).ou_branch_id, (vOuStructureJournalItem).ou_sub_bu_id
  554.     FROM tt_journal_trx_item A
  555.     WHERE A.session_id = pSessionId;
  556.    
  557.     INSERT INTO gl_journal_trx_mapping
  558.     (tenant_id, journal_trx_id, line_no,
  559.     ref_doc_type_id, ref_id,
  560.     partner_id, product_id, cashbank_id, ou_rc_id,
  561.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  562.     coa_id, curr_code, qty, uom_id,
  563.     amount, journal_date, type_rate,
  564.     numerator_rate, denominator_rate, journal_desc, remark,
  565.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  566.     SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id ),
  567.         A.ref_doc_type_id, A.ref_id,
  568.         A.partner_id, A.product_id, A.cashbank_id, A.ou_rc_id,
  569.         A.segmen_id, vSignCredit, A.flg_source_coa, A.activity_gl_id,
  570.         f_get_system_coa_by_group_coa(A.tenant_id, 'PersediaanInTransit'), A.curr_code, A.qty, A.uom_id,
  571.         A.amount, A.journal_date, A.type_rate,
  572.         A.numerator_rate, A.denominator_rate, 'PRODUCT_STOCK_IN_TRANSIT', A.remark,
  573.         0, vDatetime, vUserId, vDatetime, vUserId
  574.     FROM tt_journal_trx_item A
  575.     WHERE A.session_id = pSessionId;
  576.        
  577.     DELETE FROM tt_journal_trx_item WHERE session_id = pSessionId; 
  578. END;   
  579. $BODY$
  580.   LANGUAGE plpgsql VOLATILE
  581.   COST 100;
  582.   /
  583.  
Add Comment
Please, Sign In to add comment