Advertisement
samuel025

Perbaikan Function Submit DO Receipt

Dec 21st, 2021
1,216
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.     AND invoice_id <> vEmptyId
  138.     LIMIT 1;
  139.  
  140.     /*
  141.      * update status doc in_do_receipt menjadi Release
  142.      */
  143.     UPDATE in_do_receipt SET status_doc = vStatusRelease, version = version + 1, update_datetime = vDatetime, update_user_id = vUserId
  144.     WHERE do_receipt_id = vDoReceiptId;
  145.  
  146.     /*
  147.      * buat data log sl_log_so_balance_item
  148.      */
  149.     INSERT INTO sl_log_so_balance_item
  150.     (tenant_id, so_id, so_item_id, ref_doc_type_id, ref_id, ref_item_id,
  151.      qty_trx, trx_uom_id, qty_int, base_uom_id, remark,
  152.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  153.     SELECT A.tenant_id, C.so_id, C.so_item_id, A.doc_type_id, A.do_receipt_id, B.do_receipt_item_id,
  154.         B.qty_return * D.qty_so / D.qty_int, D.so_uom_id, B.qty_return, B.uom_id, B.remark,
  155.         0, vDatetime, vUserId, vDatetime, vUserId
  156.     FROM in_do_receipt A, in_do_receipt_item B, in_balance_do_item C, sl_so_item D
  157.     WHERE A.do_receipt_id = vDoReceiptId AND
  158.           A.do_receipt_id = B.do_receipt_id AND
  159.           B.ref_id = C.do_item_id AND
  160.           C.so_item_id = D.so_item_id AND
  161.           B.qty_return > 0;
  162.  
  163.     /*
  164.      * buat data sl_so_balance_Invoice
  165.      * supaya dapat ditarik saat buat sales invoice
  166.      */
  167.     INSERT INTO sl_so_balance_invoice
  168.         (tenant_id, ou_id, partner_id, so_id,
  169.         ref_doc_type_id, ref_id, ref_doc_no, ref_doc_date, ref_item_id, qty_dlv_so, so_uom_id,
  170.         curr_code, price_so, item_amount, flg_invoice, invoice_id,
  171.         regular_disc_amount, promo_disc_amount, adj_regular_disc_amount, adj_promo_disc_amount,
  172.         "version", create_datetime, create_user_id, update_datetime, update_user_id,
  173.         do_receipt_item_id, gross_sell_price_so, flg_tax_amount, tax_id, tax_percentage, discount_percentage, discount_amount)
  174.        
  175.     SELECT A.tenant_id, A.ou_id, G.partner_id, C.so_id,
  176.             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,
  177.             D.curr_code, G.price_so,
  178.             -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),
  179.             vFlagInvoice, vEmptyId,
  180.             -1 * (G.discount_amount * (B.qty_return * D.qty_so / D.qty_int)),
  181.             0, 0, 0,
  182.             0, vDatetime, vUserId, vDatetime, vUserId,
  183.             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
  184.            
  185.     FROM in_do_receipt A, in_do_receipt_item B, in_balance_do_item C, sl_so_item D, sl_so_balance_invoice G
  186.     WHERE A.do_receipt_id = vDoReceiptId AND
  187.           A.do_receipt_id = B.do_receipt_id AND
  188.           B.ref_id = C.do_item_id AND
  189.           C.so_item_id = D.so_item_id AND
  190.           G.ref_doc_type_id = A.ref_doc_type_id AND
  191.           G.ref_id = A.ref_id AND
  192.           G.ref_item_id = B.ref_id AND
  193.           B.qty_return > 0 AND G.do_receipt_item_id = -99;
  194.          
  195.     /*
  196.      * buat data sl_so_balance_invoice_tax
  197.      * supaya dapat ditarik saat buat sales invoice
  198.      */
  199.     INSERT INTO sl_so_balance_invoice_tax
  200.     (tenant_id, ou_id, partner_id, so_id,
  201.     ref_doc_type_id, ref_id, ref_item_id, tax_id, flg_amount,
  202.     tax_percentage, curr_code, base_amount, tax_amount, flg_invoice, invoice_id,
  203.     "version", create_datetime, create_user_id, update_datetime, update_user_id,
  204.     do_receipt_item_id)
  205.     SELECT A.tenant_id, A.ou_id, G.partner_id, C.so_id,
  206.         A.ref_doc_type_id, A.ref_id, B.ref_id, G.tax_id, E.flg_amount,
  207.         D.tax_percentage, D.curr_code,
  208.         -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),
  209.         -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),
  210.         vFlagInvoice, vEmptyId,
  211.         0, vDatetime, vUserId, vDatetime, vUserId,
  212.         B.do_receipt_item_id
  213.     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
  214.     WHERE A.do_receipt_id = vDoReceiptId AND
  215.           A.do_receipt_id = B.do_receipt_id AND
  216.           B.ref_id = C.do_item_id AND
  217.           C.so_item_id = D.so_item_id AND
  218.           G.tax_id = E.tax_id AND
  219.           D.so_id = F.so_id AND
  220.           B.qty_return > 0 AND
  221.          
  222.           G.ref_doc_type_id = A.ref_doc_type_id AND
  223.           G.ref_id = A.ref_id AND
  224.           G.ref_item_id = B.ref_id AND
  225.           G.do_receipt_item_id = -99;
  226.           /*
  227.           G.do_id = vDoId AND
  228.           G.do_id = H.do_id AND
  229.           H.ref_id = D.so_item_id AND
  230.           D.tax_id = E.tax_id AND
  231.           D.so_id = F.so_id;
  232.           */
  233.          
  234.          
  235.          
  236.  
  237.     /*
  238.      * update sl_so_balance_invoice, dan sl_so_balance_invoice_tax
  239.      * yang sudah dibuat oleh sales invoice temporer
  240.      */
  241.  
  242.     UPDATE sl_so_balance_invoice A SET flg_invoice = vFlagInvoice, flg_invoice_temp = vFlagInvoice, invoice_id = vEmptyId
  243.     WHERE A.so_id = vSoId
  244.     AND A.flg_invoice = vNo
  245.     AND A.flg_invoice_temp = vYes
  246.     AND A.invoice_id = vInvoiceId
  247.     AND EXISTS (SELECT 1 FROM sl_invoice_temp B WHERE A.so_id = B.ref_id AND B.ref_doc_type_id = vSoDocTypeId);
  248.  
  249.     UPDATE sl_so_balance_invoice_tax A SET flg_invoice = vFlagInvoice, invoice_id = vEmptyId
  250.     WHERE A.so_id = vSoId
  251.     AND A.flg_invoice = vYes
  252.     AND A.invoice_id = vInvoiceId
  253.     AND EXISTS (SELECT 1 FROM sl_invoice_temp B WHERE A.so_id = B.ref_id AND B.ref_doc_type_id = vSoDocTypeId);
  254.  
  255.     /*
  256.      * void data sales invoice temporer yang menggunakan DO Item id yang sama dng Do Receipt :
  257.      * 1. cari invoice temp id yang memiliki data DO Item yang sama dengan DO Receipt
  258.      * 2. update status doc invoice temp sesuai id yang diperoleh di langkah ke 1
  259.      */
  260.     SELECT A.invoice_temp_id INTO vSlsInvTempId
  261.     FROM sl_invoice_temp_item A, in_do_receipt_item B, in_do_receipt C, sl_invoice_temp D
  262.     WHERE A.ref_doc_type_id = B.ref_doc_type_id AND
  263.         A.ref_id = vDoId AND
  264.         A.ref_item_id = B.ref_id AND
  265.         B.do_receipt_id = C.do_receipt_id AND
  266.         C.ref_id = A.ref_id AND
  267.         B.do_receipt_id = vDoReceiptId AND
  268.         A.invoice_temp_id = D.invoice_temp_id AND
  269.         D.status_doc <> vStatusVoid;
  270.  
  271.     UPDATE sl_invoice_temp SET status_doc = vStatusVoid, update_datetime = vDatetime, update_user_id = vUserId
  272.     WHERE invoice_temp_id = vSlsInvTempId;
  273.  
  274.     /*
  275.      * advance invoice  harus diupdate juga supaya bisa dipakai lagi
  276.      */
  277.     UPDATE sl_so_balance_advance_invoice B SET flg_invoice = vFlagInvoice, flg_invoice_temp = vFlagInvoice, invoice_id = vEmptyId
  278.     WHERE B.so_id = vSoId
  279.     AND EXISTS (
  280.         SELECT 1 FROM sl_invoice_temp_advance A
  281.         WHERE A.ref_id = B.ref_id
  282.         AND A.ref_doc_type_id = B.ref_doc_type_id
  283.         AND A.invoice_temp_id = vSlsInvTempId
  284.     );
  285.  
  286.     /*
  287.      * nomor faktur pajak boleh digunakan kembali untuk temp sales invoice yang di void gara2 DO Receipt
  288.      *
  289.      */
  290.     UPDATE m_gen_tax_number A
  291.     SET invoice_id = vEmptyId, invoice_doc_type_id = vEmptyId, invoice_doc_no = vEmptyValue, invoice_doc_date = vEmptyValue
  292.     FROM sl_invoice_temp B
  293.     WHERE A.invoice_doc_no = B.inv_doc_no
  294.     AND A.invoice_doc_date = B.inv_doc_date
  295.     AND A.invoice_doc_type_id = B.doc_type_id
  296.     AND A.invoice_id = vSlsInvTempId
  297.     AND B.invoice_temp_id = vSlsInvTempId;
  298.  
  299.     /*
  300.      * Ambil nomor dokumen SI untuk dilakukan pengecekan SI masiih ada/tidak
  301.      */
  302.      SELECT A.doc_no INTO vDocNoSI
  303.      FROM sl_invoice A, sl_invoice_temp B
  304.      WHERE B.invoice_temp_id = vSlsInvTempId
  305.         AND A.doc_no = B.inv_doc_no;
  306.  
  307.      IF vDocNoSI IS NULL THEN
  308.  
  309.         /*
  310.          * nomor dokumen SI boleh digunakan kembali untuk temp sales invoice yang di void gara2 DO Receipt
  311.          *
  312.          */
  313.         UPDATE autonum_generated A
  314.         SET flg_unused = vYes
  315.         FROM sl_invoice_temp B
  316.         WHERE A.value_auto_num = B.inv_doc_no
  317.         AND B.invoice_temp_id = vSlsInvTempId;
  318.  
  319.         /*
  320.          * ambil id autonum
  321.          */
  322.          SELECT A.autonum_generated_id INTO vAutoNumId
  323.          FROM autonum_generated A, sl_invoice_temp B
  324.          WHERE A.value_auto_num = B.inv_doc_no
  325.          AND B.invoice_temp_id = vSlsInvTempId;
  326.  
  327.         /*
  328.          * delete autonum_ref_mapping berdasarkan variable autonumId yg sudah diambil sebelumnya
  329.          */
  330.          IF vAutoNumId IS NOT NULL THEN
  331.          DELETE FROM autonum_ref_mapping WHERE autonum_generated_id = vAutoNumId;
  332.          END IF;
  333.  
  334.      END IF;
  335.  
  336.     /*
  337.      * delete data sales invoice temporer dari fi_invoice_ar_balance dan fi_invoice_tax_ar_balance
  338.      */
  339.    
  340.     DELETE FROM fi_invoice_tax_ar_balance A
  341.     WHERE A.tenant_id = pTenantId AND
  342.     EXISTS (
  343.         SELECT 1 FROM fi_invoice_ar_balance B
  344.         WHERE A.tenant_id = B.tenant_id
  345.         AND A.invoice_ar_balance_id = B.invoice_ar_balance_id
  346.         AND B.doc_type_id = vSlsInvTempDocTypeId
  347.         AND B.invoice_ar_id = vSlsInvTempId
  348.     );
  349.    
  350.     DELETE FROM fi_invoice_ar_balance A
  351.     WHERE A.tenant_id = pTenantId AND
  352.           A.doc_type_id = vSlsInvTempDocTypeId AND
  353.           A.invoice_ar_id = vSlsInvTempId;
  354.    
  355.    
  356.     /*
  357.      * buat data log product balance stock
  358.      * ref item id = do_receipt_id
  359.      */      
  360.     INSERT INTO in_log_product_balance_stock
  361.     (tenant_id, ou_id, doc_type_id, ref_id, doc_no, doc_date, partner_id,
  362.      product_id, product_balance_id, warehouse_id, product_status, base_uom_id, qty,
  363.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  364.     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,
  365.         C.product_id, C.product_balance_id, A.warehouse_id, C.product_status, C.uom_id, SUM(C.qty_return),
  366.         0, vDatetime, vUserId, vDatetime, vUserId      
  367.     FROM in_do_receipt A, in_do_receipt_item B, in_do_receipt_product C, sl_do D, m_warehouse_ou E
  368.     WHERE A.do_receipt_id = vDoReceiptId AND
  369.         A.do_receipt_id = B.do_receipt_id AND
  370.         B.do_receipt_item_id = C.do_receipt_item_id AND
  371.         A.ref_id = D.do_id AND
  372.         A.warehouse_id = E.warehouse_id
  373.     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,
  374.             C.product_id, C.product_balance_id, A.warehouse_id, C.product_status, C.uom_id;
  375.  
  376.     /*
  377.      * update in_product_balance_stock
  378.      * mod by Didit, 30 Des 2016
  379.      * perbaiki jika ada 1 produk yang sama (product dan product balance) tapi ada lebih dari 1 record di tabel itemnya akan menjadi salah
  380.      */
  381.     WITH tt_in_product_balance_summary AS (
  382.         SELECT  C.product_id, C.tenant_id, A.warehouse_id, C.product_balance_id, C.product_status, SUM(C.qty_return) AS qty_return
  383.         FROM    in_do_receipt A, in_do_receipt_item B, in_do_receipt_product C
  384.         WHERE   A.do_receipt_id = vDoReceiptId
  385.                 AND A.do_receipt_id = B.do_receipt_id
  386.                 AND B.do_receipt_item_id = C.do_receipt_item_id
  387.                 AND C.qty_return > 0
  388.         GROUP BY C.product_id, C.tenant_id, A.warehouse_id, C.product_balance_id, C.product_status
  389.     )
  390.     UPDATE in_product_balance_stock SET qty = qty + A.qty_return, update_datetime = vDatetime, update_user_id = vUserId, version = version + 1
  391.     FROM tt_in_product_balance_summary A
  392.     WHERE in_product_balance_stock.product_id = A.product_id AND
  393.         in_product_balance_stock.tenant_id = A.tenant_id AND
  394.         in_product_balance_stock.warehouse_id = A.warehouse_id AND
  395.         in_product_balance_stock.product_balance_id = A.product_balance_id AND
  396.         in_product_balance_stock.product_status = A.product_status;
  397.            
  398.     /*
  399.      * update data balance do item sehubungan dengan product yang dikembalian/tidak diterima oleh customer,
  400.      * sehingga saat akan membuat return note, hanya barang yang memang diterima oleh customer
  401.      */
  402.     UPDATE in_balance_do_item SET qty_dlv_int = qty_dlv_int - A.qty_return,
  403.                                 qty_dlv = in_balance_do_item.qty_dlv - (A.qty_return * in_balance_do_item.qty_dlv / in_balance_do_item.qty_dlv_int),
  404.                                 status_item = vStatusRelease, update_datetime = vDatetime, update_user_id = vUserId
  405.     FROM in_do_receipt_item A
  406.     WHERE A.do_receipt_id = vDoReceiptId AND
  407.         in_balance_do_item.do_item_id = A.ref_id AND
  408.         A.qty_return > 0;
  409.        
  410.     UPDATE in_balance_do_item
  411.     SET status_item = vStatusRelease,
  412.         update_datetime = vDatetime,
  413.         update_user_id = vUserId
  414.     FROM in_do_receipt A
  415.     WHERE A.do_receipt_id = vDoReceiptId AND
  416.         in_balance_do_item.do_id = A.ref_id AND
  417.         A.ref_doc_type_id = vDoDocTypeId;
  418.        
  419.     /*
  420.      * update status SO seperti semula
  421.      */
  422.     UPDATE sl_so
  423.     SET status_doc = flg_old_status,
  424.         flg_old_status = vEmptyValue,
  425.         update_datetime = vDatetime,
  426.         update_user_id = vUserId,
  427.         version = version + 1
  428.     WHERE so_id = vSoId;
  429.    
  430.     /*
  431.      * update flg invoice so balance inv
  432.      */
  433.     UPDATE sl_so_balance_invoice
  434.     SET flg_invoice = vNo,
  435.         update_datetime = vDatetime,
  436.         update_user_id = vUserId,
  437.         version = version + 1
  438.     WHERE so_id = vSoId
  439.         AND ref_id = vDoId;
  440.    
  441.     /*
  442.      * update status so balance item
  443.      */
  444.     UPDATE sl_so_balance_item B
  445.     SET status_item = B.flg_old_status,
  446.         flg_old_status = vEmptyValue,
  447.         update_datetime = vDatetime,
  448.         update_user_id = vUserId,
  449.         version = B.version + 1
  450.     FROM sl_so A
  451.     INNER JOIN sl_so_item C ON A.so_id = C.so_id
  452.     INNER JOIN sl_do_item D ON D.ref_id = C.so_item_id
  453.     WHERE B.so_item_id = C.so_item_id
  454.         AND A.so_id = vSoId
  455.         AND D.do_id = vDoId;
  456.        
  457.     /*
  458.      * status item SO akan berubah menjadi Release, karena ada nya barang yang dikembalikan oleh customer
  459.      */    
  460.     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),
  461.                                 qty_dlv_int = sl_so_balance_item.qty_dlv_int - A.qty_return,
  462.                                 status_item = vStatusRelease
  463.     FROM in_do_receipt_item A, in_balance_do_item B
  464.     WHERE A.do_receipt_id = vDoReceiptId AND
  465.         A.ref_id = B.do_item_id AND
  466.         sl_so_balance_item.so_item_id = B.so_item_id AND
  467.         A.qty_return > 0;
  468.        
  469.     UPDATE sl_so SET status_doc = vStatusRelease
  470.     WHERE so_id = vSoId;   
  471.        
  472.     /*
  473.      * @author TKP, 9 Jun 2016
  474.      * Cek jika OU pada warehouse sama dengan OU pada dokumen maka nilai ou_bu_id dan ou_sub_bu_id =-99
  475.      * 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;
  476.      */
  477.    
  478.     SELECT A.ou_id, B.ou_id INTO vOuId, vOuWarehouseId
  479.     FROM in_do_receipt A
  480.     INNER JOIN m_warehouse_ou B ON A.warehouse_id = B.warehouse_id
  481.     WHERE A.do_receipt_id = vDoReceiptId;
  482.    
  483.     IF (vOuId <> vOuWarehouseId) THEN
  484.         SELECT f_get_ou_bu_structure(vOuWarehouseId) as ou_structure INTO result;
  485.         vOuStructureJournalItem := result.ou_structure;
  486.     ELSE
  487.         vOuStructureJournalItem := ROW(-99, -99, -99);
  488.     END IF;
  489.    
  490.     /*
  491.      * membuat data transaksi jurnal :
  492.      * 1. buat admin
  493.      * 2. buat temlate jurnal
  494.      */
  495.  
  496.     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)
  497.     FROM in_do_receipt A
  498.     WHERE A.do_receipt_id = vDoReceiptId;
  499.    
  500.     SELECT NEXTVAL('gl_journal_trx_seq') INTO vJournalTrxId;
  501.    
  502.     INSERT INTO gl_journal_trx
  503.     (journal_trx_id, tenant_id, journal_type, doc_type_id, doc_id, doc_no, doc_date,
  504.     ou_bu_id, ou_branch_id, ou_sub_bu_id, partner_id, cashbank_id, warehouse_id, ext_doc_no, ext_doc_date,  
  505.     ref_doc_type_id, ref_id, due_date, curr_code, remark, status_doc, workflow_status,
  506.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  507.     SELECT vJournalTrxId, A.tenant_id, (vDocJournal).journal_type, A.doc_type_id, A.do_receipt_id, A.doc_no, A.doc_date,
  508.         (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,
  509.         A.ref_doc_type_id, A.ref_id, A.doc_date, C.curr_code, A.remark, vStatusDraft, 'DRAFT',
  510.         0, vDatetime, vUserId, vDatetime, vUserId
  511.     FROM in_do_receipt A, sl_do B, sl_so C
  512.     WHERE A.do_receipt_id = vDoReceiptId AND
  513.         A.ref_id = B.do_id AND
  514.         B.ref_id = C.so_id;
  515.    
  516.     INSERT INTO tt_journal_trx_item
  517.     (session_id, tenant_id, journal_trx_id, line_no,
  518.     ref_doc_type_id, ref_id,
  519.     partner_id, product_id, cashbank_id, ou_rc_id,
  520.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  521.     coa_id, curr_code, qty, uom_id,
  522.     amount, journal_date, type_rate,
  523.     numerator_rate, denominator_rate, journal_desc, remark)
  524.     SELECT pSessionId, A.tenant_id, vJournalTrxId, 1,
  525.         A.doc_type_id, B.do_receipt_item_id,
  526.         C.partner_ship_to_id, B.product_id, vEmptyId, vEmptyId,
  527.         vEmptyId, vSignDebit, vProductCOA, vEmptyId,
  528.         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,
  529.         0, A.doc_date, vTypeRate,
  530.         1, 1, 'PRODUCT_STOCK', B.remark
  531.     FROM in_do_receipt A, in_do_receipt_item B, sl_do C
  532.     WHERE A.do_receipt_id = vDoReceiptId AND
  533.         A.do_receipt_id = B.do_receipt_id AND
  534.         A.ref_id = C.do_id;
  535.        
  536.     INSERT INTO gl_journal_trx_item
  537.     (tenant_id, journal_trx_id, line_no,
  538.     ref_doc_type_id, ref_id,
  539.     partner_id, product_id, cashbank_id, ou_rc_id,
  540.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  541.     coa_id, curr_code, qty, uom_id,
  542.     amount, journal_date, type_rate,
  543.     numerator_rate, denominator_rate, journal_desc, remark,
  544.     "version", create_datetime, create_user_id, update_datetime, update_user_id,
  545.     ou_branch_id, ou_sub_bu_id)
  546.     SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id),
  547.         A.ref_doc_type_id, A.ref_id,
  548.         A.partner_id, A.product_id, A.cashbank_id, A.ou_rc_id,
  549.         A.segmen_id, A.sign_journal, A.flg_source_coa, A.activity_gl_id,
  550.         A.coa_id, A.curr_code, A.qty, A.uom_id,
  551.         A.amount, A.journal_date, A.type_rate,
  552.         A.numerator_rate, A.denominator_rate, A.journal_desc, A.remark,
  553.         0, vDatetime, vUserId, vDatetime, vUserId,
  554.         (vOuStructureJournalItem).ou_branch_id, (vOuStructureJournalItem).ou_sub_bu_id
  555.     FROM tt_journal_trx_item A
  556.     WHERE A.session_id = pSessionId;
  557.    
  558.     INSERT INTO gl_journal_trx_mapping
  559.     (tenant_id, journal_trx_id, line_no,
  560.     ref_doc_type_id, ref_id,
  561.     partner_id, product_id, cashbank_id, ou_rc_id,
  562.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  563.     coa_id, curr_code, qty, uom_id,
  564.     amount, journal_date, type_rate,
  565.     numerator_rate, denominator_rate, journal_desc, remark,
  566.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  567.     SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id ),
  568.         A.ref_doc_type_id, A.ref_id,
  569.         A.partner_id, A.product_id, A.cashbank_id, A.ou_rc_id,
  570.         A.segmen_id, vSignCredit, A.flg_source_coa, A.activity_gl_id,
  571.         f_get_system_coa_by_group_coa(A.tenant_id, 'PersediaanInTransit'), A.curr_code, A.qty, A.uom_id,
  572.         A.amount, A.journal_date, A.type_rate,
  573.         A.numerator_rate, A.denominator_rate, 'PRODUCT_STOCK_IN_TRANSIT', A.remark,
  574.         0, vDatetime, vUserId, vDatetime, vUserId
  575.     FROM tt_journal_trx_item A
  576.     WHERE A.session_id = pSessionId;
  577.        
  578.     DELETE FROM tt_journal_trx_item WHERE session_id = pSessionId; 
  579. END;   
  580. $BODY$
  581.   LANGUAGE plpgsql VOLATILE
  582.   COST 100;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement