Advertisement
samuel025

Function Submit DO Receipt JEN-9

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