Advertisement
aadddrr

cb_cancel_submit_cb_in_ar

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