Advertisement
aadddrr

cb_cancel_submit_cb_in_ar_PERBAIKAN_20180604

Jun 4th, 2018
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * @author fredi, 19 March 2015
  3.  * For cancel submit/approve cash bank in ar
  4.  *
  5.  * custom by fitra 2018-04-27
  6.  * perbaikan validasi kecukupan balance bank untuk bank overdraft lihat limit nya
  7.  */
  8. /**
  9.  * Modified by Adrian, Jun 4, 2018
  10.  * Memperbaiki query hapus gl_journal_trx
  11.  */
  12.  
  13. CREATE OR REPLACE FUNCTION cb_cancel_submit_cb_in_ar(bigint, character varying, bigint, character varying, bigint, character varying, character varying)
  14.   RETURNS void AS
  15. $BODY$
  16. DECLARE
  17.     pTenantId               ALIAS FOR $1;
  18.     pSessionId              ALIAS FOR $2;
  19.     pUserId                 ALIAS FOR $3; -- for update user id in transaction
  20.     pDatetime               ALIAS FOR $4;
  21.     pCbInArId               ALIAS FOR $5; -- In out cb id
  22.     pRemarkApproval         ALIAS FOR $6; -- Remark for appear in approval reset history
  23.     pPrevProcessNo          ALIAS FOR $7; -- Substitute for renaming prevous process no
  24.  
  25.     vCashbankLedgerCode     character varying := 'CASH.BANK';
  26.     vStatusLedgerNotDone    character varying := '0';
  27.     vInProgress             character varying := 'I';
  28.     vYes                    character varying := 'Y';
  29.     vFunctionSubmit         character varying := 'cb_submit_cb_in_ar';
  30.     vStatusDocRelease       character varying := 'R';
  31.     vStatusDocDraft         character varying := 'D';
  32.     vWorkflowStatusDraft    character varying := 'DRAFT';
  33.     vDocTypeCbInAr  bigint := 621;
  34.     vSignDebit              character varying := 'D';
  35.    
  36.     vDocTypeId      bigint;
  37.     vOuId           bigint;
  38.     vDocNo          character varying;
  39.     vDocDate        character varying;
  40.     vScheme         character varying;
  41.     vStatusDoc      character varying;
  42.    
  43.     vDocJournal     DOC_JOURNAL%ROWTYPE;
  44.     vOuStructure    OU_BU_STRUCTURE%ROWTYPE;
  45.     result          RECORD;
  46.  
  47.     vCashBankId     bigint;
  48.     vJournalTrxId   bigint;
  49.     vCashBankAmount numeric;
  50.     vCurrCode       character varying;
  51.     vCostAmount     numeric;
  52.     vCurrentCashBankBalance     numeric;
  53.    
  54.     vBankType               character varying;
  55.     vBankTypeOverDraft      character varying:='O';
  56.     vCreditLimitOverDraft   numeric;
  57.    
  58.     vEmptyId                bigint := -99;
  59.        
  60. BEGIN
  61.     /**
  62.      * Cancel submit in ar
  63.      * 1. Find document cb_in_out_cashbank, must release and match doc type
  64.      * 2. Cek status ledger not yet closed
  65.      * 3. Cek fi_receipt_ar_balance not yet used on allocation cashbank ar
  66.      * 4. Cek saldo current cashbank f_get_cashbank_balance - sum(cb in ar) must >= 0
  67.      * 5. DELETE fi_receipt_ar_balance
  68.      * 6. UPDATE cb_cashbank_balance, SET amount = amount - sum(cb in ar)
  69.      * 7. Update cb_in_out_cashbank, set doc_status to D
  70.      * 8. PERFORM cancel gl_cancel_admin_journal_trx
  71.      * 9. DELETE gl_journal_trx
  72.      * 10. DELETE gl_journal_trx_item
  73.      * 11. DELETE gl_journal_trx_mapping
  74.      * 12. PERFORM f_reset_approval_to_draft
  75.      * 13. UPDATE t_process_message
  76.      */
  77.    
  78.     -- * 1. Find document cb_in_out_cashbank, must release and match doc type
  79.     SELECT A.ou_id, A.doc_date, A.doc_type_id, A.doc_no, A.status_doc, B.scheme
  80.     INTO vOuId, vDocDate, vDocTypeId, vDocNo, vStatusDoc, vScheme  
  81.     FROM cb_in_out_cashbank A
  82.     INNER JOIN m_document B ON A.doc_type_id = B.doc_type_id
  83.     WHERE A.in_out_cashbank_id = pCbInArId
  84.         AND A.doc_type_id = vDocTypeCbInAr
  85.         AND A.status_doc = vStatusDocRelease;
  86.    
  87.     IF FOUND THEN
  88.         -- * 2. Cek status ledger not yet closed
  89.         IF EXISTS (
  90.             SELECT 1
  91.             FROM m_admin_process_ledger e, m_ou_structure f, t_ou g
  92.             WHERE e.tenant_id = pTenantId
  93.                 AND e.ou_id = f.ou_bu_id
  94.                 AND f.ou_id = vOuId
  95.                 AND e.date_year_month = SUBSTR(vDocDate, 1, 6)
  96.                 AND e.ledger_code = vCashbankLedgerCode AND
  97.                 f.ou_id = g.ou_id AND e.status_ledger = vStatusLedgerNotDone) THEN
  98.                
  99.             -- * 3. Cek fi_receipt_ar_balance not yet used on allocation cashbank ar
  100.             IF NOT EXISTS (
  101.                 SELECT 1
  102.                 FROM fi_receipt_ar_balance A
  103.                 WHERE A.receipt_ar_balance_id = pCbInArId
  104.                     AND flg_alloc IN (vInProgress, vYes)
  105.             ) THEN
  106.                 --* 4. Cek saldo current cashbank f_get_cashbank_balance - sum(cb in ar) must >= 0
  107.                 SELECT A.doc_date AS doc_date, f_get_ou_bu_structure(A.ou_id) AS ou, f_get_document_journal(A.doc_type_id) as doc,
  108.                     B.cashbank_id AS cashbank_id, B.cashbank_amount AS cashbank_amount, B.curr_code AS curr_code
  109.                 FROM cb_in_out_cashbank A,cb_in_out_cashbank_payment B
  110.                 WHERE A.in_out_cashbank_id = pCbInArId AND
  111.                     A.in_out_cashbank_id = B.in_out_cashbank_id LIMIT 1 INTO result;
  112.            
  113.                 vDocDate := result.doc_date;
  114.                 vCashBankId := result.cashbank_id;
  115.                 vCashBankAmount := result.cashbank_amount;
  116.                 vCurrCode := result.curr_code;
  117.                 vOuStructure := result.ou;
  118.                 vDocJournal := result.doc;
  119.                    
  120.                 IF EXISTS(SELECT 1 FROM cb_in_out_cashbank_cost A WHERE A.in_out_cashbank_id = pCbInArId AND A.curr_code = vCurrCode) THEN
  121.                     SELECT SUM(A.cost_amount) INTO vCostAmount
  122.                     FROM cb_in_out_cashbank_cost A
  123.                     WHERE A.in_out_cashbank_id = pCbInArId AND
  124.                         A.curr_code = vCurrCode
  125.                     GROUP BY A.in_out_cashbank_id;
  126.                 ELSE
  127.                     vCostAmount := 0;
  128.                 END IF;
  129.            
  130.                 vCurrentCashBankBalance := f_get_cashbank_balance(vCashBankId, vDocDate);
  131.                
  132.                 SELECT flg_cash_bank, credit_limit INTO vBankType, vCreditLimitOverDraft
  133.                 FROM m_cashbank WHERE cashbank_id =vCashBankId;
  134.                
  135.                 IF (vCurrentCashBankBalance - (vCashBankAmount - vCostAmount) >= 0 OR
  136.                    (vBankType = vBankTypeOverDraft AND (vCurrentCashBankBalance - (vCashBankAmount - vCostAmount) + vCreditLimitOverDraft >= 0 ))) THEN
  137.                    
  138.                      -- * 5. DELETE fi_receipt_ar_balance
  139.                      DELETE FROM fi_receipt_ar_balance A
  140.                      WHERE A.receipt_ar_balance_id = pCbInArId;
  141.                      
  142.                      --* 6. UPDATE cb_cashbank_balance, SET amount = amount - sum(cb in ar)
  143.                      UPDATE cb_cashbank_balance A
  144.                      SET amount = A.amount - (vCashBankAmount - vCostAmount),
  145.                         version = A.version + 1,
  146.                         update_datetime = pDatetime,
  147.                         update_user_id = pUserId
  148.                      FROM m_cashbank_ou D
  149.                      WHERE A.cash_bank_date = vDocDate
  150.                           AND D.cashbank_id = A.cashbank_id
  151.                           AND A.tenant_id = pTenantId
  152.                           AND A.cashbank_id = vCashBankId
  153.                           AND A.ou_id = D.ou_id
  154.                           AND A.rec_type = vSignDebit;
  155.                          
  156.                     -- * 7. Update cb_in_out_cashbank, set doc_status to DRAFT
  157.                     UPDATE cb_in_out_cashbank
  158.                     SET status_doc = vStatusDocDraft,
  159.                         workflow_status = vWorkflowStatusDraft,
  160.                         version = version + 1,
  161.                         update_datetime = pDatetime,
  162.                         update_user_id = pUserId
  163.                     WHERE in_out_cashbank_id = pCbInArId;
  164.                    
  165.                     --* 8. PERFORM cancel gl_cancel_admin_journal_trx
  166.                     PERFORM gl_cancel_admin_journal_trx(pTenantId, (vOuStructure).ou_bu_id, vOuId, (vDocJournal).journal_type, f_get_year_month_date(vDocDate), 'DAILY', pDatetime, pUserId);
  167.                    
  168.                    
  169.                     -- pre 9 Find journal trx id
  170.                     SELECT journal_trx_id INTO vJournalTrxId
  171.                     FROM gl_journal_trx
  172.                     WHERE tenant_id = pTenantId
  173.                         AND journal_type = (vDocJournal).journal_type
  174.                         AND doc_type_id = vDocTypeId
  175.                         AND doc_id = pCbInArId
  176.                         AND doc_no = vDocNo
  177.                         AND doc_date = vDocDate
  178.                         AND ou_bu_id = (vOuStructure).ou_bu_id
  179.                         AND ou_branch_id = vEmptyId
  180.                         AND ou_sub_bu_id = vEmptyId;
  181.                    
  182.                     -- * 9. DELETE gl_journal_trx
  183.                     DELETE FROM gl_journal_trx
  184.                     WHERE journal_trx_id = vJournalTrxId;
  185.                    
  186.                     -- * 10. DELETE gl_journal_trx_item
  187.                     DELETE FROM gl_journal_trx_item
  188.                     WHERE journal_trx_id = vJournalTrxId;
  189.  
  190.                     -- * 11. DELETE gl_journal_trx_mapping
  191.                     DELETE FROM gl_journal_trx_mapping
  192.                     WHERE journal_trx_id = vJournalTrxId;
  193.  
  194.                     -- * 12. PERFORM f_reset_approval_to_draft
  195.                     PERFORM f_reset_approval_to_draft(pTenantId, pSessionId, vScheme, pCbInArId, vDocNo, pDatetime, pRemarkApproval);
  196.  
  197.                     -- * 13. UPDATE t_process_message
  198.                     UPDATE t_process_message
  199.                     SET process_no = pPrevProcessNo,
  200.                         update_datetime = pDatetime,
  201.                         update_user_id = pUserId,
  202.                         version = version + 1
  203.                     WHERE tenant_id = pTenantId
  204.                         AND process_name = vFunctionSubmit
  205.                         AND process_no = pCbInArId || '_' || vDocNo;
  206.                    
  207.                 ELSE
  208.                     IF (vBankType = vBankTypeOverDraft) THEN
  209.                         RAISE EXCEPTION 'Cancellation will cause balance over credit limit. Current balance: %, CB In AR Amount: %, Credit Limit: %',
  210.                                                                                 TRIM(to_char(vCurrentCashBankBalance,'999,999,999,999.99')),
  211.                                                                                 TRIM(to_char(vCashBankAmount,'999,999,999,999.99')),
  212.                                                                                 TRIM(to_char(vCreditLimitOverDraft,'999,999,999,999.99'));
  213.                     ELSE
  214.                         RAISE EXCEPTION 'Not enough cash/bank balance. Current cash/bank balance: %, CB In AR: %' ,TRIM(to_char(vCurrentCashBankBalance,'999,999,999,999.99')), TRIM(to_char(vCashBankAmount,'999,999,999,999.99'));
  215.                     END IF;
  216.                 END IF;
  217.             ELSE
  218.                 RAISE EXCEPTION 'Cashbank In AR document already been used by Allocation Cashbank AR';
  219.             END IF;
  220.         ELSE
  221.             RAISE EXCEPTION 'Admin Process Ledger for Cash Bank in year month % is already closed', SUBSTR(vDocDate, 1, 6);
  222.         END IF;
  223.     ELSE
  224.         RAISE EXCEPTION 'Document with id % is not found or document is on approval progress', pCbInArId;
  225.     END IF;
  226. END;   
  227. $BODY$
  228.   LANGUAGE plpgsql VOLATILE
  229.   COST 100;
  230. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement