Advertisement
aadddrr

CANCEL SUBMIT DO RECEIPT

Feb 20th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION in_cancel_submit_do_receipt(bigint, character varying, bigint, character varying, bigint, character varying, character varying)
  2.   RETURNS void AS
  3. $BODY$
  4. DECLARE
  5.     pTenantId                           ALIAS FOR $1;
  6.     pSessionId                          ALIAS FOR $2;
  7.     pUserId                             ALIAS FOR $3;
  8.     pDatetime                           ALIAS FOR $4;
  9.     pDoReceiptId                        ALIAS FOR $5;
  10.     pRemarkApproval                     ALIAS FOR $6;
  11.     pPrevProcessNo                      ALIAS FOR $7;
  12.    
  13.     vDoReceiptDocTypeId                 bigint;
  14.     vEmptyId                            bigint;
  15.     vFunctionSubmit                     character varying;
  16.     vStatusDocReleased                  character varying;
  17.     vStatusDocDraft                     character varying;
  18.     vStatusDocInProgress                character varying;
  19.     vStatusDocFinal                     character varying;
  20.     vStatusDocVoid                      character varying;
  21.     vWorkflowStatusDraft                character varying;
  22.     vWorkflowStatusApproved             character varying;
  23.     vYes                                character varying;
  24.     vNo                                 character varying;
  25.     vZero                               bigint;
  26.     vEmptyValue                         character varying(1);
  27.    
  28.     vOuId                               bigint;
  29.     vJournalTrxId                       bigint;
  30.     vDocNo                              character varying;
  31.     vDocDate                            character varying;
  32.     vScheme                             character varying;
  33.     vSalesOrderId                       bigint;
  34.     vDeliveryOrderId                    bigint;
  35.     vSalesInvoiceTempId                 bigint;
  36.     VWarehouseOuId                      bigint;
  37.    
  38.     vDocJournal                         DOC_JOURNAL%ROWTYPE;
  39.     vOuStructure                        OU_BU_STRUCTURE%ROWTYPE;
  40.     result                              RECORD;
  41.    
  42.     vLedgerCode                         character varying;
  43.     vStatusLedgerNotDone                character varying;
  44.    
  45.     vOuStructureJournalItem             OU_BU_STRUCTURE%ROWTYPE;
  46.    
  47.     vDeliveryOrderDocTypeId             bigint;
  48.     vSalesOrderDocTypeId                bigint;
  49.     vSalesInvoiceTempDocTypeId          bigint;
  50.    
  51.     vInvoiceArBalanceId                 bigint;
  52.     vJointDppPpn                        character varying(1);
  53.     vFakturPajakKeluaran                bigint;
  54.    
  55. BEGIN
  56.  
  57.     vDoReceiptDocTypeId := 526;
  58.     vEmptyId := -99;
  59.     vFunctionSubmit := 'in_submit_do_receipt';     
  60.     vStatusDocReleased := 'R'
  61.     vStatusDocDraft := 'D';
  62.     vStatusDocInProgress := 'I';
  63.     vStatusDocFinal := 'F';
  64.     vStatusDocVoid := 'V';
  65.     vWorkflowStatusDraft := 'DRAFT';
  66.     vWorkflowStatusApproved := 'APPROVED';
  67.     vYes := 'Y';
  68.     vNo := 'N';
  69.     vZero := 0;
  70.    
  71.     vLedgerCode := 'INV';
  72.     vStatusLedgerNotDone := '0';
  73.    
  74.     vDeliveryOrderDocTypeId := 311;
  75.     vSalesOrderDocTypeId := 301;
  76.     vSalesInvoiceTempDocTypeId := 361;
  77.    
  78.     vEmptyValue := ' ';
  79.     vJointDppPpn := f_get_value_system_config_by_param_code(pTenantId, 'joint.dpp.ppn.balance');
  80.     vFakturPajakKeluaran := 281;
  81.    
  82.     --RAISE EXCEPTION 'Function Submit For Document DO Receipt';
  83.        
  84.     -- get data
  85.     select f_get_ou_bu_structure(A.ou_id) AS ou, A.ou_id, A.doc_no, A.doc_date,
  86.             f_get_document_journal(A.doc_type_id) as doc, C.scheme,
  87.             A.ref_id AS do_id,
  88.             D.ou_id AS warehouse_ou_id
  89.     FROM in_do_receipt A, in_do_receipt_item B, m_document C, m_warehouse_ou D
  90.     WHERE A.do_receipt_id = B.do_receipt_id AND
  91.         A.doc_type_id = C.doc_type_id AND
  92.         A.warehouse_id = D.warehouse_id AND
  93.         A.do_receipt_id = pDoReceiptId AND
  94.         A.doc_type_id = vDoReceiptDocTypeId
  95.         AND A.status_doc = vStatusDocReleased INTO result;
  96.        
  97.     IF FOUND THEN
  98.         vOuStructure := result.ou;
  99.         vOuId := result.ou_id;
  100.         vDocNo := result.doc_no;
  101.         vDocDate := result.doc_date;
  102.         vDocJournal := result.doc;
  103.         vScheme := result.scheme;
  104.         vDeliveryOrderId := result.do_id;
  105.         VWarehouseOuId := result.warehouse_ou_id;
  106.        
  107.         -- Cek status ledger not yet closed
  108.         IF EXISTS (
  109.             SELECT 1
  110.             FROM m_admin_process_ledger e, m_ou_structure f, t_ou g
  111.             WHERE e.tenant_id = pTenantId
  112.                 AND e.ou_id = f.ou_bu_id
  113.                 AND f.ou_id = vOuId
  114.                 AND e.date_year_month = SUBSTR(vDocDate, 1, 6)
  115.                 AND e.ledger_code = vLedgerCode AND
  116.                 f.ou_id = g.ou_id AND e.status_ledger = vStatusLedgerNotDone) THEN
  117.        
  118.             /*
  119.              * validasi belum digunakan untuk invoice
  120.              */
  121.             IF NOT EXISTS (
  122.                 SELECT (1)
  123.                 FROM sl_so_balance_invoice A, in_do_receipt_item B, in_do_receipt C, in_balance_do_item D, sl_so_item E, sl_so F
  124.                 WHERE C.do_receipt_id = pDoReceiptId
  125.                     AND B.do_receipt_id = C.do_receipt_id
  126.                     AND B.ref_id = D.do_item_id
  127.                     AND D.so_item_id = E.so_item_id
  128.                     AND E.so_id = F.so_id
  129.                     AND B.qty_return > 0
  130.                     AND A.tenant_id = C.tenant_id
  131.                     AND A.ou_id = C.ou_id
  132.                     AND A.partner_id = F.partner_bill_to_id
  133.                     AND A.ref_doc_type_id = C.ref_doc_type_id
  134.                     AND A.ref_id = C.ref_id
  135.                     AND A.ref_item_id = B.ref_id
  136.                     AND A.flg_invoice <> vNo
  137.                     AND A.invoice_id <> vEmptyId
  138.                 ) THEN
  139.                
  140.                 /*
  141.                  * validasi tax belum digunakan untuk invoice
  142.                  */
  143.                 IF NOT EXISTS (
  144.                     SELECT (1)
  145.                     FROM sl_so_balance_invoice_tax A, in_do_receipt_item B, in_do_receipt C, in_balance_do_item D, sl_so_item E, sl_so F
  146.                     WHERE C.do_receipt_id = pDoReceiptId
  147.                         AND B.do_receipt_id = C.do_receipt_id
  148.                         AND B.ref_id = D.do_item_id
  149.                         AND D.so_item_id = E.so_item_id
  150.                         AND E.so_id = F.so_id
  151.                         AND B.qty_return > 0
  152.                         AND A.tenant_id = C.tenant_id
  153.                         AND A.ou_id = C.ou_id
  154.                         AND A.partner_id = F.partner_bill_to_id
  155.                         AND A.ref_doc_type_id = C.ref_doc_type_id
  156.                         AND A.ref_id = C.ref_id
  157.                         AND A.ref_item_id = B.ref_id
  158.                         AND A.tax_id = E.tax_id
  159.                         AND A.flg_invoice <> vNo
  160.                         AND A.invoice_id <> vEmptyId
  161.                     ) THEN
  162.                
  163.                     /*
  164.                      * 1. update status doc in_do_receipt
  165.                      * 2. add sl_log_so_balance_item
  166.                      * 3. add sl_so_balance_invoice
  167.                      * 4. add sl_so_balance_invoice_tax
  168.                      * 5. update sl_so_balance_invoice untuk Do Id
  169.                      * 6. update sl_so_balance_invoice_tax untuk Do Id
  170.                      * 7. void sales invoice temporer untuk So Id
  171.                      * 8. delete data sales invoice temporer dari fi_invoice_ar_balance dan fi_invoice_tax_ar_balance
  172.                      * 9. add in_log_product_balance_stock
  173.                      * 10. update in_product_balance_stock
  174.                      * 11. update in_balance_do_item
  175.                      * 12. update sl_so_balance_item - status dan qty
  176.                      * 13. update status sl_so. Jika seluruh balance item sudah final/cancel, maka status menjadi Final.
  177.                      * 14. add gl_journal_trx
  178.                      * 15. add gl_journal_trx_item
  179.                      * 16. add gl_journal_trx_mapping
  180.                      *
  181.                      */
  182.                        
  183.                     SELECT ref_id INTO vSalesOrderId
  184.                     FROM sl_do
  185.                     WHERE do_id = vDeliveryOrderId;
  186.                    
  187.                     /*
  188.                      * update status doc in_do_receipt
  189.                      */
  190.                     UPDATE in_do_receipt SET status_doc = vStatusDocDraft, workflow_status = vWorkflowStatusDraft, version = version + 1, update_datetime = pDatetime, update_user_id = pUserId
  191.                     WHERE do_receipt_id = pDoReceiptId
  192.                         AND status_doc = vStatusDocReleased;
  193.                        
  194.                     /*
  195.                      * hapus data log sl_log_so_balance_item
  196.                      */
  197.                     DELETE
  198.                     FROM sl_log_so_balance_item Z  
  199.                     WHERE EXISTS (
  200.                         SELECT (1)
  201.                         FROM in_do_receipt_item A
  202.                         INNER JOIN in_do_receipt B ON B.do_receipt_id = A.do_receipt_id
  203.                         WHERE A.do_receipt_id = pDoReceiptId
  204.                             AND Z.ref_id = A.do_receipt_id
  205.                             AND Z.ref_doc_type_id = B.doc_type_id
  206.                             AND Z.ref_item_id = A.do_receipt_item_id
  207.                             AND A.qty_return > 0
  208.                     );
  209.                    
  210.                     /*
  211.                      * hapus data sl_so_balance_Invoice
  212.                      */
  213.                     DELETE
  214.                     FROM sl_so_balance_invoice Z   
  215.                     WHERE EXISTS (
  216.                         SELECT (1)
  217.                         FROM in_do_receipt A
  218.                         INNER JOIN in_do_receipt_item B ON B.do_receipt_id = A.do_receipt_id
  219.                         INNER JOIN in_balance_do_item C ON C.do_item_id = B.ref_id
  220.                         INNER JOIN sl_so_item D ON D.so_item_id = C.so_item_id
  221.                         INNER JOIN sl_so E ON E.so_id = D.so_id
  222.                         WHERE A.do_receipt_id = pDoReceiptId
  223.                             AND Z.tenant_id = A.tenant_id
  224.                             AND Z.ou_id = A.ou_id
  225.                             AND Z.partner_id = E.partner_bill_to_id
  226.                             AND Z.ref_doc_type_id = A.ref_doc_type_id
  227.                             AND Z.ref_id = A.ref_id
  228.                             AND Z.ref_item_id = B.ref_id
  229.                             AND Z.flg_invoice = vNo
  230.                             AND Z.invoice_id = vEmptyId
  231.                     );
  232.                    
  233.                     /*
  234.                      * hapus data sl_so_balance_Invoice_tax
  235.                      */
  236.                     DELETE
  237.                     FROM sl_so_balance_invoice_tax Z   
  238.                     WHERE EXISTS (
  239.                         SELECT (1)
  240.                         FROM in_do_receipt A
  241.                         INNER JOIN in_do_receipt_item B ON B.do_receipt_id = A.do_receipt_id
  242.                         INNER JOIN in_balance_do_item C ON C.do_item_id = B.ref_id
  243.                         INNER JOIN sl_so_item D ON D.so_item_id = C.so_item_id
  244.                         INNER JOIN sl_so E ON E.so_id = D.so_id
  245.                         WHERE A.do_receipt_id = pDoReceiptId
  246.                             AND Z.tenant_id = A.tenant_id
  247.                             AND Z.ou_id = A.ou_id
  248.                             AND Z.partner_id = E.partner_bill_to_id
  249.                             AND Z.ref_doc_type_id = A.ref_doc_type_id
  250.                             AND Z.ref_id = A.ref_id
  251.                             AND Z.ref_item_id = B.ref_id
  252.                             AND Z.tax_id = D.tax_id
  253.                             AND Z.flg_invoice = vNo
  254.                             AND Z.invoice_id = vEmptyId
  255.                     );
  256.                    
  257.                    
  258.                     /*************** INV TEMP ***************/
  259.                    
  260.                     /*
  261.                      * update sl_so_balance_invoice, dan sl_so_balance_invoice_tax
  262.                      */
  263.                     UPDATE sl_so_balance_invoice SET flg_invoice = vStatusDocInProgress, flg_invoice_temp = vNo, invoice_id = vEmptyId
  264.                     WHERE ref_id = vDeliveryOrderId AND
  265.                         ref_doc_type_id = vDoReceiptDocTypeId;
  266.                
  267.                     UPDATE sl_so_balance_invoice_tax SET flg_invoice = vNo, invoice_id = vEmptyId
  268.                     WHERE ref_id = vDeliveryOrderId AND
  269.                         ref_doc_type_id = vDoReceiptDocTypeId;
  270.                    
  271.                     /*
  272.                      * update status data sales invoice temporer yang menggunakan DO Item id yang sama dng Do Receipt :
  273.                      * 1. cari invoice temp id yang memiliki data DO Item yang sama dengan DO Receipt
  274.                      * 2. update status doc invoice temp sesuai id yang diperoleh di langkah ke 1
  275.                      */
  276.                     SELECT A.invoice_temp_id INTO vSalesInvoiceTempId
  277.                     FROM sl_invoice_temp_item A, in_do_receipt_item B, in_do_receipt C, sl_invoice_temp D
  278.                     WHERE A.ref_doc_type_id = B.ref_doc_type_id AND
  279.                         A.ref_id = vDeliveryOrderId AND
  280.                         A.ref_item_id = B.ref_id AND
  281.                         B.do_receipt_id = C.do_receipt_id AND
  282.                         C.ref_id = A.ref_id AND
  283.                         B.do_receipt_id = pDoReceiptId AND     
  284.                         A.invoice_temp_id = D.invoice_temp_id AND
  285.                         D.status_doc = vStatusDocVoid;
  286.                        
  287.                     IF FOUND THEN
  288.                        
  289.                         UPDATE sl_invoice_temp SET status_doc = vStatusDocReleased, update_datetime = pDatetime, update_user_id = pUserId
  290.                         WHERE invoice_temp_id = vSalesInvoiceTempId
  291.                             AND status_doc = vWorkflowStatusApproved;
  292.                        
  293.                         /*
  294.                          * update sl_so_balance_invoice
  295.                          */
  296.                         UPDATE sl_so_balance_invoice SET flg_invoice_temp = vYes
  297.                         WHERE ref_id = vDeliveryOrderId AND
  298.                             ref_doc_type_id = vDoReceiptDocTypeId;
  299.                            
  300.                         /*
  301.                          * update advance invoice
  302.                          */
  303.                         UPDATE sl_so_balance_advance_invoice B SET flg_invoice = vNo, flg_invoice_temp = vYes, invoice_id = vEmptyId
  304.                         WHERE B.so_id = vSalesOrderId
  305.                         AND EXISTS (
  306.                             SELECT 1 FROM sl_invoice_temp_advance A
  307.                             WHERE A.ref_id = B.ref_id
  308.                             AND A.ref_doc_type_id = B.ref_doc_type_id
  309.                             AND A.invoice_temp_id = vSalesInvoiceTempId
  310.                         );
  311.                    
  312.                         /*
  313.                          * update nomor faktur pajak
  314.                          */
  315.                         UPDATE m_gen_tax_number A
  316.                         SET
  317.                         invoice_id = vSalesInvoiceTempId, invoice_doc_type_id = B.doc_type_id, invoice_doc_no = B.inv_doc_no, invoice_doc_date = B.inv_doc_date
  318.                         FROM sl_invoice_temp B
  319.                         WHERE A.invoice_doc_no = vEmptyValue
  320.                             AND A.invoice_doc_date = vEmptyValue
  321.                             AND A.invoice_doc_type_id = vEmptyId
  322.                             AND A.invoice_id = vEmptyId
  323.                             AND B.invoice_temp_id = vSalesInvoiceTempId;
  324.                            
  325.                         SELECT nextval('fi_invoice_ar_balance_seq') INTO vInvoiceArBalanceId;
  326.            
  327.                         IF vJointDppPpn = 'N' THEN
  328.                             INSERT INTO fi_invoice_ar_balance
  329.                             ( invoice_ar_balance_id, tenant_id, ou_id, doc_type_id, invoice_ar_id,
  330.                             doc_no, doc_date, ext_doc_no, ext_doc_date,
  331.                             ref_doc_type_id, ref_id,  partner_id, due_date,  
  332.                             curr_code, amount, remark, payment_amount, flg_payment,
  333.                             "version", create_datetime, create_user_id, update_datetime, update_user_id)
  334.                             SELECT vInvoiceArBalanceId, A.tenant_id, A.ou_id, A.doc_type_id, A.invoice_temp_id,
  335.                                     A.doc_no, A.doc_date, A.ext_doc_no, A.ext_doc_date,
  336.                                     A.ref_doc_type_id, A.ref_id, A.partner_id, A.due_date,
  337.                                     A.curr_code, A.total_amount, A.remark, 0, vFlagPayment,
  338.                                     0, vDatetime, vUserId, vDatetime, vUserId
  339.                             FROM sl_invoice_temp A
  340.                             WHERE A.invoice_temp_id = vSalesInvoiceTempId;
  341.                            
  342.                             UPDATE fi_invoice_ar_balance A
  343.                             SET flg_payment = vYes
  344.                             WHERE A.invoice_ar_balance_id = vInvoiceArBalanceId
  345.                                 AND A.amount = 0;
  346.                            
  347.                             INSERT INTO fi_invoice_tax_ar_balance
  348.                             (tenant_id, ou_id, doc_type_id, invoice_ar_balance_id,
  349.                             partner_id, tax_id, tax_no, tax_date,
  350.                             curr_code, tax_amount, tax_curr_code, gov_tax_amount,
  351.                             due_date, remark, payment_amount, flg_payment,
  352.                             "version", create_datetime, create_user_id, update_datetime, update_user_id)
  353.                             SELECT A.tenant_id, A.ou_id, vFakturPajakKeluaran, C.invoice_ar_balance_id,    
  354.                                 A.partner_id, B.tax_id, B.tax_no, B.tax_date,
  355.                                 A.curr_code, B.tax_amount, B.tax_curr_code, B.gov_tax_amount,
  356.                                 A.due_date, B.remark, 0, vNo,
  357.                                 0, vDatetime, vUserId, vDatetime, vUserId
  358.                             FROM sl_invoice_temp A, sl_invoice_temp_tax B, fi_invoice_ar_balance C
  359.                             WHERE A.invoice_temp_id = vSalesInvoiceTempId AND
  360.                                 A.invoice_temp_id = B.invoice_temp_id AND
  361.                                 A.tenant_id = C.tenant_id AND
  362.                                 A.doc_type_id = C.doc_type_id AND
  363.                                 A.invoice_temp_id = C.invoice_ar_id;
  364.                         ELSE
  365.                             INSERT INTO fi_invoice_ar_balance
  366.                             ( invoice_ar_balance_id, tenant_id, ou_id, doc_type_id, invoice_ar_id,
  367.                             doc_no, doc_date, ext_doc_no, ext_doc_date,
  368.                             ref_doc_type_id, ref_id,  partner_id, due_date,  
  369.                             curr_code, amount, remark, payment_amount, flg_payment,
  370.                             "version", create_datetime, create_user_id, update_datetime, update_user_id)
  371.                             SELECT vInvoiceArBalanceId, A.tenant_id, A.ou_id, A.doc_type_id, A.invoice_temp_id,
  372.                                     A.doc_no, A.doc_date, A.ext_doc_no, A.ext_doc_date,
  373.                                     A.ref_doc_type_id, A.ref_id, A.partner_id, A.due_date,
  374.                                     A.curr_code, A.total_amount + COALESCE(B.gov_tax_amount, 0), A.remark, 0, vNo,
  375.                                     0, vDatetime, vUserId, vDatetime, vUserId
  376.                             FROM sl_invoice_temp A
  377.                             LEFT OUTER JOIN sl_invoice_temp_tax B ON A.invoice_temp_id = B.invoice_temp_id
  378.                             WHERE A.invoice_temp_id = vSalesInvoiceTempId;
  379.                            
  380.                             UPDATE fi_invoice_ar_balance A
  381.                             SET flg_payment = vYes
  382.                             WHERE A.invoice_ar_balance_id = vInvoiceArBalanceId
  383.                                 AND A.amount = 0;
  384.                         END IF;
  385.                
  386.                         PERFORM fi_insert_invoice_ar_balance_due_date(pTenantId, pSessionId, vInvoiceArBalanceId, vUserId, vDatetime);
  387.                    
  388.                     END IF;
  389.                        
  390.                     /************** INV TEMP ***********************/
  391.                        
  392.                     /*
  393.                      * hapus data log product balance stock
  394.                      * ref item id = do_receipt_id
  395.                      */      
  396.                     DELETE
  397.                     FROM in_log_product_balance_stock Z
  398.                     WHERE EXISTS (
  399.                         SELECT (1)
  400.                         FROM in_do_receipt A
  401.                         INNER JOIN in_do_receipt_item B ON B.do_receipt_id = A.do_receipt_id
  402.                         INNER JOIN in_do_receipt_product C ON C.do_receipt_item_id = B.do_receipt_item_id
  403.                         WHERE A.do_receipt_id = pDoReceiptId
  404.                             AND Z.tenant_id = A.tenant_id
  405.                             AND Z.ou_id = A.ou_id
  406.                             AND Z.doc_type_id = A.doc_type_id
  407.                             AND Z.ref_id = A.do_receipt_id
  408.                             AND Z.doc_date = A.doc_date
  409.                             AND Z.warehouse_id = A.warehouse_id
  410.                             AND Z.product_id = C.product_id
  411.                             AND Z.product_balance_id = C.product_balance_id
  412.                             AND Z.product_status = C.product_status
  413.                     );
  414.                    
  415.                     /*
  416.                      * update in_product_balance_stock
  417.                      */
  418.                     WITH tt_in_product_balance_summary AS (
  419.                         SELECT  C.product_id, C.tenant_id, A.warehouse_id, C.product_balance_id, C.product_status, SUM(C.qty_return) AS qty_return
  420.                         FROM    in_do_receipt A, in_do_receipt_item B, in_do_receipt_product C
  421.                         WHERE   A.do_receipt_id = pDoReceiptId
  422.                                 AND A.do_receipt_id = B.do_receipt_id
  423.                                 AND B.do_receipt_item_id = C.do_receipt_item_id
  424.                                 AND C.qty_return > 0
  425.                         GROUP BY C.product_id, C.tenant_id, A.warehouse_id, C.product_balance_id, C.product_status
  426.                     )
  427.                     UPDATE in_product_balance_stock SET qty = qty - A.qty_return, update_datetime = pDatetime, update_user_id = pUserId
  428.                     FROM tt_in_product_balance_summary A
  429.                     WHERE in_product_balance_stock.product_id = A.product_id AND
  430.                         in_product_balance_stock.tenant_id = A.tenant_id AND
  431.                         in_product_balance_stock.warehouse_id = A.warehouse_id AND
  432.                         in_product_balance_stock.product_balance_id = A.product_balance_id AND
  433.                         in_product_balance_stock.product_status = A.product_status;
  434.                        
  435.                     /*
  436.                      * update data balance do item
  437.                      */
  438.                     UPDATE in_balance_do_item SET qty_dlv_int = qty_dlv_int + A.qty_return,
  439.                                                 qty_dlv = in_balance_do_item.qty_dlv + (A.qty_return * in_balance_do_item.qty_dlv / (qty_dlv_int + A.qty_return)),
  440.                                                 status_item = vStatusDocInProgress, update_datetime = pDatetime, update_user_id = pUserId
  441.                     FROM in_do_receipt_item A
  442.                     WHERE A.do_receipt_id = pDoReceiptId AND
  443.                         in_balance_do_item.do_item_id = A.ref_id AND
  444.                         A.qty_return > 0;
  445.                        
  446.                     UPDATE in_balance_do_item
  447.                     SET status_item = vStatusDocInProgress,
  448.                         update_datetime = pDatetime,
  449.                         update_user_id = pUserId
  450.                     FROM in_do_receipt A
  451.                     WHERE A.do_receipt_id = pDoReceiptId AND
  452.                         in_balance_do_item.do_id = A.ref_id AND
  453.                         A.ref_doc_type_id = vDeliveryOrderDocTypeId;
  454.                    
  455.                     /*
  456.                      * update status SO
  457.                      */
  458.                     UPDATE sl_so
  459.                     SET status_doc = vStatusDocInProgress,
  460.                         flg_old_status = status_doc,
  461.                         update_datetime = pDatetime,
  462.                         update_user_id = pUserId,
  463.                         version = version + 1
  464.                     WHERE so_id = vSalesOrderId;
  465.                    
  466.                     /*
  467.                      * update flg invoice so balance inv
  468.                      */
  469.                     UPDATE sl_so_balance_invoice
  470.                     SET flg_invoice = vStatusDocInProgress,
  471.                         update_datetime = pDatetime,
  472.                         update_user_id = pUserId,
  473.                         version = version + 1
  474.                     WHERE so_id = vSalesOrderId
  475.                         AND ref_id = vDeliveryOrderId;
  476.                        
  477.                     /*
  478.                      * update status so balance item
  479.                      */
  480.                     UPDATE sl_so_balance_item B
  481.                     SET status_item = vStatusDocInProgress,
  482.                         flg_old_status = status_doc,
  483.                         update_datetime = pDatetime,
  484.                         update_user_id = pUserId,
  485.                         version = B.version + 1
  486.                     FROM sl_so A
  487.                     INNER JOIN sl_so_item C ON A.so_id = C.so_id
  488.                     INNER JOIN sl_do_item D ON D.ref_id = C.so_item_id
  489.                     WHERE B.so_item_id = C.so_item_id
  490.                         AND A.so_id = vSalesOrderId
  491.                         AND D.do_id = vDeliveryOrderId;
  492.                        
  493.                     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),
  494.                                                 qty_dlv_int = sl_so_balance_item.qty_dlv_int + A.qty_return,
  495.                                                 status_item = vStatusDocInProgress
  496.                     FROM in_do_receipt_item A, in_balance_do_item B
  497.                     WHERE A.do_receipt_id = pDoReceiptId AND
  498.                         A.ref_id = B.do_item_id AND
  499.                         sl_so_balance_item.so_item_id = B.so_item_id AND
  500.                         A.qty_return > 0;
  501.                        
  502.                     UPDATE sl_so SET status_doc = vStatusDocInProgress
  503.                     WHERE so_id = vSalesOrderId;
  504.                    
  505.                     IF (vOuId <> vWarehouseOuId) THEN
  506.                         SELECT f_get_ou_bu_structure(vWarehouseOuId) as ou_structure INTO result;
  507.                         vOuStructureJournalItem := result.ou_structure;
  508.                     ELSE
  509.                         vOuStructureJournalItem := ROW(-99, -99, -99);
  510.                     END IF;
  511.                    
  512.                     -- PERFORM cancel gl_cancel_admin_journal_trx
  513.                     PERFORM gl_cancel_admin_journal_trx(pTenantId, (vOuStructure).ou_bu_id, vOuId, (vDocJournal).journal_type, f_get_year_month_date(vDocDate), 'MONTHLY', pDatetime, pUserId);
  514.                    
  515.                     -- Find journal trx id
  516.                     SELECT journal_trx_id INTO vJournalTrxId
  517.                     FROM gl_journal_trx
  518.                     WHERE tenant_id = pTenantId
  519.                         AND journal_type = (vDocJournal).journal_type
  520.                         AND doc_type_id = vDoReceiptDocTypeId
  521.                         AND doc_id = pDoReceiptId
  522.                         AND doc_no = vDocNo
  523.                         AND doc_date = vDocDate
  524.                         AND ou_bu_id = (vOuStructure).ou_bu_id
  525.                         AND ou_branch_id = (vOuStructure).ou_branch_id
  526.                         AND ou_sub_bu_id = (vOuStructure).ou_sub_bu_id;
  527.                    
  528.                     -- DELETE gl_journal_trx
  529.                     DELETE FROM gl_journal_trx
  530.                     WHERE journal_trx_id = vJournalTrxId;
  531.                    
  532.                     -- DELETE gl_journal_trx_item
  533.                     DELETE FROM gl_journal_trx_item
  534.                     WHERE journal_trx_id = vJournalTrxId;
  535.            
  536.                     -- DELETE gl_journal_trx_mapping
  537.                     DELETE FROM gl_journal_trx_mapping
  538.                     WHERE journal_trx_id = vJournalTrxId;
  539.                    
  540.                     -- PERFORM f_reset_approval_to_draft
  541.                     PERFORM f_reset_approval_to_draft(pTenantId, pSessionId, vScheme, pDoReceiptId, vDocNo, pDatetime, pRemarkApproval);
  542.                        
  543.                     -- UPDATE t_process_message
  544.                     UPDATE t_process_message
  545.                     SET process_no = pPrevProcessNo,
  546.                         update_datetime = pDatetime,
  547.                         update_user_id = pUserId,
  548.                         version = version + 1
  549.                     WHERE tenant_id = pTenantId
  550.                         AND process_name = vFunctionSubmit
  551.                         AND process_no = pDoReceiptId || '_' || vDocNo;
  552.                    
  553.                 ELSE
  554.                     RAISE EXCEPTION 'Document with id % is aready used for invoice', pDoReceiptId;
  555.                 END IF;
  556.                
  557.             ELSE
  558.                 RAISE EXCEPTION 'Document with id % is aready used for invoice', pDoReceiptId;
  559.             END IF;
  560.                
  561.         ELSE
  562.             RAISE EXCEPTION 'Admin Process Ledger for Inventory in year month % is already closed', SUBSTR(vDocDate, 1, 6);
  563.         END IF;
  564.        
  565.     ELSE
  566.         RAISE EXCEPTION 'Document with id % is not found or document is on approval progress', pDoReceiptId;
  567.     END IF;
  568.    
  569. END;
  570. $BODY$
  571.   LANGUAGE plpgsql VOLATILE
  572.   COST 100;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement