Advertisement
samuel025

Function Submit DO Receipt Stagging

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