samuel025

Function Cancel Submit TSI

Nov 28th, 2021
765
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --Adrian, Feb 28, 2017
  2.  
  3. CREATE OR REPLACE FUNCTION sl_cancel_submit_sales_invoice_temp(bigint, character varying, bigint, character varying, bigint, character varying, character varying)
  4.   RETURNS void AS
  5. $BODY$
  6. DECLARE
  7.     pTenantId                           ALIAS FOR $1;
  8.     pSessionId                          ALIAS FOR $2;
  9.     pUserId                             ALIAS FOR $3;
  10.     pDatetime                           ALIAS FOR $4;
  11.     pSalesInvoiceTempId                 ALIAS FOR $5;
  12.     pRemarkApproval                     ALIAS FOR $6;
  13.     pPrevProcessNo                      ALIAS FOR $7;
  14.    
  15.     vSalesInvoiceTempDocTypeId          bigint;
  16.     vFunctionSubmit                     character varying;
  17.     vStatusDocReleased                  character varying;
  18.     vStatusDocDraft                     character varying;
  19.     vStatusDocInProgress                character varying;
  20.     vWorkflowStatusDraft                character varying;
  21.     vEmptyId                            bigint;
  22.     vZero                               bigint;
  23.     vYes                                character varying;
  24.     vNo                                 character varying;
  25.     vDoDocTypeId                        bigint;
  26.     vJointDppPpn                        character varying(1);
  27.    
  28.     vOuId                               bigint;
  29.     vDocNo                              character varying;
  30.     vDocDate                            character varying;
  31.     vScheme                             character varying;
  32.    
  33.     result                              RECORD;
  34.    
  35.     vInvArBalanceId                     bigint;
  36.     vInvTaxArBalanceId                  bigint;
  37.     vDoId                               bigint;
  38.    
  39.     vPaymentAmount                      numeric;
  40.     vPaymentAmountTax                   numeric;
  41.     vFlgPayment                         character varying;
  42.     vFlgPaymentTax                      character varying;
  43.    
  44. BEGIN
  45.  
  46.     vSalesInvoiceTempDocTypeId := 361;
  47.     vFunctionSubmit := 'sl_submit_sales_invoice_temp';
  48.     vStatusDocReleased := 'R';
  49.     vStatusDocDraft := 'D';
  50.     vStatusDocInProgress := 'I';
  51.     vWorkflowStatusDraft := 'DRAFT';
  52.     vEmptyId := -99;
  53.     vZero := 0;
  54.     vYes = 'Y';
  55.     vNo = 'N';
  56.     vDoDocTypeId := 311;
  57.     vJointDppPpn := f_get_value_system_config_by_param_code(pTenantId, 'joint.dpp.ppn.balance');
  58.    
  59.     --RAISE EXCEPTION 'Function Submit For Document Temporary Sales Invoice is not yet Created';
  60.    
  61.     -- get data
  62.     select A.ou_id, A.doc_no, A.doc_date, C.scheme
  63.     FROM sl_invoice_temp A, m_document C
  64.     WHERE A.doc_type_id = C.doc_type_id AND
  65.         A.invoice_temp_id = pSalesInvoiceTempId AND
  66.         A.doc_type_id = vSalesInvoiceTempDocTypeId
  67.         AND A.status_doc = vStatusDocReleased INTO result;
  68.        
  69.     IF FOUND THEN
  70.         vOuId := result.ou_id;
  71.         vDocNo := result.doc_no;
  72.         vDocDate := result.doc_date;
  73.         vScheme := result.scheme;
  74.        
  75.         /*
  76.          * validasi belum digunakan oleh invoice
  77.          */
  78.         IF NOT EXISTS (
  79.             SELECT (1) FROM sl_so_balance_invoice A, sl_invoice_temp B, sl_invoice_temp_item C
  80.             WHERE B.invoice_temp_id = pSalesInvoiceTempId AND
  81.                 B.invoice_temp_id = C.invoice_temp_id AND
  82.                 A.ou_id = B.ou_id AND
  83.                 A.so_id = B.ref_id AND
  84.                 A.ref_doc_type_id = vDoDocTypeId AND
  85.                 A.ref_id = C.ref_id AND
  86.                 A.ref_item_id = C.ref_item_id AND
  87.                 A.do_receipt_item_id = C.do_receipt_item_id AND
  88.                 A.flg_invoice = vYes
  89.             ) THEN
  90.        
  91.             /*
  92.              * validasi belum digunakan oleh invoice
  93.              */
  94.             IF NOT EXISTS (
  95.                 SELECT (1) FROM sl_do_inv A, sl_invoice_temp_item B, sl_do C
  96.                 WHERE B.invoice_temp_id = pSalesInvoiceTempId
  97.                     AND B.ref_id = C.do_id
  98.                     AND A.do_id = C.do_id
  99.                     AND A.flg_invoice = vYes
  100.                 ) THEN
  101.                
  102.                 /*
  103.                  * validasi belum digunakan oleh invoice
  104.                  */
  105.                 IF NOT EXISTS (
  106.                     SELECT (1) FROM sl_so_balance_advance_invoice A, sl_invoice_temp_advance B
  107.                     WHERE B.ref_id = A.ref_id
  108.                         AND B.invoice_temp_id = pSalesInvoiceTempId
  109.                         AND A.flg_invoice = vYes
  110.                     ) THEN
  111.                    
  112.                     -- Sales Invoice yang hendak dibatalkan harus belum pernah dialokasi sama sekali
  113.                     SELECT A.invoice_ar_balance_id, A.payment_amount, A.flg_payment
  114.                     INTO vInvArBalanceId, vPaymentAmount, vFlgPayment
  115.                     FROM fi_invoice_ar_balance A
  116.                     WHERE A.invoice_ar_id = pSalesInvoiceTempId
  117.                         AND A.doc_type_id = vSalesInvoiceTempDocTypeId;
  118.                    
  119.                     SELECT A.invoice_tax_ar_balance_id, A.payment_amount, A.flg_payment
  120.                     INTO vInvTaxArBalanceId, vPaymentAmountTax, vFlgPaymentTax
  121.                     FROM fi_invoice_tax_ar_balance A
  122.                     WHERE A.invoice_ar_balance_id = vInvArBalanceId;
  123.                    
  124.                    
  125.                     --1) cek saldo dokumen Sales Invoice-nya apakah payment_amountnya tidak 0 atau flg_payment tidak sama dengan 'N' di fi_invoice_ar_balance berdasarkan dokumen Sales Invoice terkait.
  126.                     --  Apabila tidak sesuai dengan kondisi tersebut, maka muncul exception dan berhenti prosesnya.
  127.                     --2) cek saldo tax dokumen Sales Invoice-nya apakah payment_amountnya tidak 0 atau flg_payment tidak sama dengan 'N' di fi_invoice_tax_ar_balance berdasarkan dokumen Sales Invoice terkait.
  128.                     --  Apabila tidak sesuai dengan kondisi tersebut, maka muncul exception dan berhenti prosesnya.
  129.                     IF EXISTS (
  130.                         SELECT 1
  131.                         FROM fi_invoice_ar_balance A
  132.                         WHERE A.invoice_ar_balance_id = vInvArBalanceId
  133.                             AND (A.flg_payment IN ( vYes, vStatusDocInProgress ) OR A.payment_amount <> 0) )
  134.                         OR
  135.                        
  136.                         EXISTS (
  137.                             SELECT 1
  138.                             FROM fi_invoice_tax_ar_balance A
  139.                             INNER JOIN fi_invoice_ar_balance B ON A.invoice_ar_balance_id = B.invoice_ar_balance_id
  140.                             WHERE B.invoice_ar_balance_id = vInvArBalanceId
  141.                                 AND (A.flg_payment IN ( vYes, vStatusDocInProgress ) OR A.payment_amount <> 0) )
  142.                     THEN
  143.                         RAISE EXCEPTION 'Document is already used in allocation process, process aborted';
  144.                     ELSE
  145.                
  146.                         /*
  147.                          * 1. update status doc sl_invoice_temp
  148.                          * 2. update sl_so_balance_invoice
  149.                          * 3. update sl_so_balance_invoice_tax
  150.                          * 4. delete fi_invoice_ar_balance
  151.                          * 5. delete fi_invoice_tax_ar_balance
  152.                          * 6. delete sl_do_inv
  153.                          */    
  154.                        
  155.                         -- 1. update status doc sl_invoice_temp
  156.                         UPDATE sl_invoice_temp SET status_doc = vStatusDocDraft, workflow_status = vWorkflowStatusDraft,  update_datetime = pDatetime, update_user_id = pUserId
  157.                         WHERE invoice_temp_id = pSalesInvoiceTempId
  158.                             AND status_doc = vStatusDocReleased;
  159.                            
  160.                         -- 2. update sl_so_balance_invoice
  161.                         UPDATE sl_so_balance_invoice A SET flg_invoice_temp = vNo, update_datetime = pDatetime, update_user_id = pUserId
  162.                         FROM sl_invoice_temp B, sl_invoice_temp_item C
  163.                         WHERE B.invoice_temp_id = pSalesInvoiceTempId AND
  164.                             B.invoice_temp_id = C.invoice_temp_id AND
  165.                             A.ou_id = B.ou_id AND
  166.                             A.so_id = B.ref_id AND
  167.                             A.ref_doc_type_id = vDoDocTypeId AND
  168.                             A.ref_id = C.ref_id AND
  169.                             A.ref_item_id = C.ref_item_id AND
  170.                             A.do_receipt_item_id = C.do_receipt_item_id AND
  171.                             A.flg_invoice = vNo AND
  172.                             A.flg_invoice_temp = vYes;
  173.                            
  174.                         -- 3. update sl_so_balance_invoice_tax 
  175.                         UPDATE sl_so_balance_invoice_tax A SET flg_invoice = vNo, update_datetime = pDatetime, update_user_id = pUserId
  176.                         FROM sl_invoice_temp B, sl_invoice_temp_item C
  177.                         WHERE B.invoice_temp_id = pSalesInvoiceTempId AND
  178.                             B.invoice_temp_id = C.invoice_temp_id AND
  179.                             A.ou_id = B.ou_id AND
  180.                             A.so_id = B.ref_id AND
  181.                             A.ref_doc_type_id = vDoDocTypeId AND
  182.                             A.ref_id = C.ref_id AND
  183.                             A.ref_item_id = C.ref_item_id AND
  184.                             A.do_receipt_item_id = C.do_receipt_item_id;
  185.                            
  186.                         -- 4. delete fi_invoice_ar_balance
  187.                         -- 5. delete fi_invoice_tax_ar_balance
  188.                         /*SELECT invoice_ar_balance_id INTO vInvArBalanceId
  189.                         FROM fi_invoice_ar_balance A, sl_invoice_temp B
  190.                         WHERE A.invoice_ar_id = pSalesInvoiceTempId AND A.doc_type_id = vSalesInvoiceTempDocTypeId;*/
  191.                        
  192.                         /*SELECT invoice_tax_ar_balance_id INTO vInvTaxArBalanceId
  193.                         FROM fi_invoice_tax_ar_balance A
  194.                         WHERE A.invoice_ar_balance_id = vInvArBalanceId;*/
  195.                
  196.                         DELETE FROM fi_invoice_ar_balance_due_date WHERE invoice_ar_balance_id = vInvArBalanceId;
  197.                        
  198.                         DELETE FROM fi_invoice_tax_ar_balance_due_date WHERE invoice_tax_ar_balance_id = vInvTaxArBalanceId;
  199.                        
  200.                         DELETE FROM fi_invoice_ar_balance WHERE invoice_ar_balance_id = vInvArBalanceId;
  201.                        
  202.                         DELETE FROM fi_invoice_tax_ar_balance WHERE invoice_ar_balance_id = vInvArBalanceId;
  203.                    
  204.                         -- 6. delete sl_do_inv
  205.                         DELETE FROM sl_do_inv Z
  206.                         WHERE EXISTS (
  207.                             SELECT (1)
  208.                             FROM sl_invoice_temp_item A, sl_do B
  209.                             WHERE A.invoice_temp_id = pSalesInvoiceTempId
  210.                                 AND A.ref_id = B.do_id
  211.                                 AND Z.do_id = B.do_id
  212.                                 AND Z.flg_invoice = vNo
  213.                             );
  214.                            
  215.                         /*
  216.                          * update flg saldo so advance invoice
  217.                          */
  218.                         UPDATE sl_so_balance_advance_invoice
  219.                         SET flg_invoice_temp = vNo, invoice_id = vEmptyId,
  220.                             update_datetime = pDatetime, update_user_id = pUserId,
  221.                             version = sl_so_balance_advance_invoice.version + 1
  222.                         FROM sl_invoice_temp_advance A
  223.                         WHERE A.ref_id = sl_so_balance_advance_invoice.ref_id
  224.                             AND A.invoice_temp_id = pSalesInvoiceTempId;
  225.                
  226.                         -- PERFORM f_reset_approval_to_draft
  227.                         PERFORM f_reset_approval_to_draft(pTenantId, pSessionId, vScheme, pSalesInvoiceTempId, vDocNo, pDatetime, pRemarkApproval);
  228.    
  229.                         -- UPDATE t_process_message
  230.                         UPDATE t_process_message
  231.                         SET process_no = pPrevProcessNo,
  232.                             update_datetime = pDatetime,
  233.                             update_user_id = pUserId,
  234.                             version = version + 1
  235.                         WHERE tenant_id = pTenantId
  236.                             AND process_name = vFunctionSubmit
  237.                             AND process_no = pSalesInvoiceTempId || '_' || vDocNo;
  238.                    
  239.                     END IF;
  240.                            
  241.                 ELSE
  242.                     RAISE EXCEPTION 'Document with id % is already used in invoice', pSalesInvoiceTempId;
  243.                 END IF;
  244.            
  245.             ELSE
  246.                 RAISE EXCEPTION 'Document with id % is already used in invoice', pSalesInvoiceTempId;
  247.             END IF;
  248.                
  249.         ELSE
  250.             RAISE EXCEPTION 'Document with id % is already used in invoice', pSalesInvoiceTempId;
  251.         END IF;
  252.            
  253.     ELSE
  254.         RAISE EXCEPTION 'Document with id % is not found ,is void, or is on approval progress', pSalesInvoiceTempId;
  255.     END IF;
  256.    
  257. END;
  258. $BODY$
  259.   LANGUAGE plpgsql VOLATILE
  260.   COST 100;
  261.   /
RAW Paste Data