Advertisement
aadddrr

cb_cancel_submit_cg_realization_20170925

Sep 24th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Adrian, Mar 22, 2017
  2. /**
  3.  * Modified by Adrian, Sep 25, 2017
  4.  * Menambahkan perhitungan cost amount pada saat update cb_cashbank_balance
  5.  */
  6.  
  7. CREATE OR REPLACE FUNCTION cb_cancel_submit_cg_realization(bigint, character varying, bigint, character varying, bigint, character varying, character varying)
  8.   RETURNS void AS
  9. $BODY$
  10. DECLARE
  11.     pTenantId                           ALIAS FOR $1;
  12.     pSessionId                          ALIAS FOR $2;
  13.     pUserId                             ALIAS FOR $3;
  14.     pDatetime                           ALIAS FOR $4;
  15.     pDocId                              ALIAS FOR $5;
  16.     pRemarkApproval                     ALIAS FOR $6;
  17.     pPrevProcessNo                      ALIAS FOR $7;
  18.    
  19.     vDocType                            bigint;
  20.     vEmptyId                            bigint;
  21.     vFunctionSubmit                     character varying;
  22.     vStatusDocReleased                  character varying;
  23.     vStatusDocDraft                     character varying;
  24.     vStatusDocInProgress                character varying;
  25.     vStatusDocVoid                      character varying;
  26.     vWorkflowStatusDraft                character varying;
  27.     vYes                                character varying;
  28.     vNo                                 character varying;
  29.     vZero                               bigint;
  30.    
  31.     vOuId                               bigint;
  32.     vJournalTrxId                       bigint;
  33.     vDocNo                              character varying;
  34.     vDocDate                            character varying;
  35.     vScheme                             character varying;
  36.    
  37.     vDocJournal                         DOC_JOURNAL%ROWTYPE;
  38.     vOuStructure                        OU_BU_STRUCTURE%ROWTYPE;
  39.     result                              RECORD;
  40.    
  41.     vLedgerCode                         character varying;
  42.     vStatusLedgerNotDone                character varying;
  43.    
  44.     vOuStructureJournalItem             OU_BU_STRUCTURE%ROWTYPE;
  45.    
  46.     vRefAmount                          numeric;
  47.     vSignDebit                          character varying(1);
  48.     vSignCredit                         character varying(1);
  49.     vTypeRate                           character varying(3);
  50.     vActivityCOA                        character varying(10);
  51.     vRefId                              bigint;
  52.     vRefDocTypeId                       bigint;
  53.     vCbInOtherId                        bigint;
  54.     vPaymentAmountConversion            numeric;
  55.    
  56.     vStatusAccept                       character varying(10);
  57.     vStatusReject                       character varying(10);
  58.     vEmpty                              character varying;
  59.    
  60.     vRecTypeKredit                      character varying(1);
  61.    
  62. BEGIN
  63.    
  64.     vDocType := 625;
  65.     vEmptyId := -99;
  66.     vFunctionSubmit := 'cb_submit_cg_realization';     
  67.     vStatusDocReleased := 'R'
  68.     vStatusDocDraft := 'D';
  69.     vStatusDocInProgress := 'I';
  70.     vStatusDocVoid := 'V';
  71.     vWorkflowStatusDraft := 'DRAFT';
  72.     vYes := 'Y';
  73.     vNo := 'N';
  74.     vZero := 0;
  75.    
  76.     vLedgerCode := 'CASH.BANK';
  77.     vStatusLedgerNotDone := '0';
  78.    
  79.     vSignDebit := 'D';
  80.    
  81.     vStatusAccept := 'ACCEPT';
  82.     vStatusReject := 'REJECT';
  83.     vEmpty := '';
  84.    
  85.     vRecTypeKredit := 'K';
  86.  
  87.     --RAISE EXCEPTION 'Function Submit For Document Cheque Giro Realization is not yet Created';
  88.    
  89.     -- get data
  90.     select f_get_ou_bu_structure(A.ou_id) AS ou, A.ou_id, A.doc_no, A.doc_date,
  91.         f_get_document_journal(A.doc_type_id) as doc, C.scheme
  92.     FROM cb_in_out_cashbank A, m_document C
  93.     WHERE A.in_out_cashbank_id = pDocId AND
  94.         A.doc_type_id = C.doc_type_id AND
  95.         A.doc_type_id = vDocType AND
  96.         A.status_doc = vStatusDocReleased
  97.     INTO result;
  98.    
  99.     IF FOUND THEN
  100.         vOuStructure := result.ou;
  101.         vOuId := result.ou_id;
  102.         vDocNo := result.doc_no;
  103.         vDocDate := result.doc_date;
  104.         vDocJournal := result.doc;
  105.         vScheme := result.scheme;
  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 flg_realization for accepted cg
  120.              */
  121.             IF NOT EXISTS (
  122.                 SELECT (1)
  123.                 FROM cb_cheque_giro_balance A, cb_in_out_cashbank B, cb_cheque_giro_realization C
  124.                 WHERE B.in_out_cashbank_id = pDocId
  125.                     AND B.in_out_cashbank_id = C.in_out_cashbank_id
  126.                     AND A.cheque_giro_balance_id = C.ref_balance_id
  127.                     AND C.realization_status = vStatusAccept
  128.                     AND flg_realization <> vYes        
  129.             ) THEN
  130.                
  131.                 /*
  132.                  * validasi flg_realization dan flg_deposit for rejected cg
  133.                  */
  134.                 IF NOT EXISTS (
  135.                     SELECT (1)
  136.                     FROM cb_cheque_giro_balance A, cb_in_out_cashbank B, cb_cheque_giro_realization C
  137.                     WHERE B.in_out_cashbank_id = pDocId
  138.                         AND B.in_out_cashbank_id = C.in_out_cashbank_id
  139.                         AND A.cheque_giro_balance_id = C.ref_balance_id
  140.                         AND C.realization_status = vStatusReject
  141.                         AND (
  142.                             flg_realization <> vNo
  143.                             OR flg_deposit <> vNo
  144.                         )
  145.                 ) THEN
  146.            
  147.                     --update data cashbank balance
  148.                     WITH amount AS (
  149.                         SELECT A.tenant_id, A.ou_id, A.doc_date, B.cashbank_id, SUM(B.cheque_giro_amount) AS cheque_giro_amount
  150.                         FROM cb_in_out_cashbank A
  151.                             INNER JOIN cb_cheque_giro_realization B ON A.in_out_cashbank_id = B.in_out_cashbank_id
  152.                         WHERE A.in_out_cashbank_id = pDocId AND
  153.                             B.realization_status = vStatusAccept
  154.                         GROUP BY A.tenant_id, A.ou_id, A.doc_date, B.cashbank_id
  155.                     )
  156.                     UPDATE cb_cashbank_balance D
  157.                     SET amount = D.amount - A.cheque_giro_amount,
  158.                         version = D.version + 1,
  159.                         update_datetime = pDatetime,
  160.                         update_user_id = pUserId
  161.                     FROM amount A
  162.                     WHERE D.tenant_id = A.tenant_id AND
  163.                           D.ou_id = A.ou_id AND
  164.                           D.cashbank_id = A.cashbank_id AND
  165.                           D.cash_bank_date = A.doc_date AND  
  166.                           D.rec_type = vSignDebit;
  167.                          
  168.                     WITH cost_amount AS (
  169.                         WITH tt_in_out_cashbank AS(
  170.                             SELECT A.in_out_cashbank_id, B.cashbank_id
  171.                             FROM cb_in_out_cashbank A
  172.                             INNER JOIN cb_cheque_giro_realization B ON A.in_out_cashbank_id = B.in_out_cashbank_id
  173.                             GROUP BY A.in_out_cashbank_id, B.cashbank_id
  174.                         )
  175.                         SELECT A.tenant_id, A.ou_id, A.doc_date, B.cashbank_id, SUM(C.cost_amount) AS cost_amount
  176.                         FROM cb_in_out_cashbank A
  177.                         INNER JOIN tt_in_out_cashbank B ON A.in_out_cashbank_id = B.in_out_cashbank_id
  178.                         INNER JOIN cb_in_out_cashbank_cost C ON A.in_out_cashbank_id = C.in_out_cashbank_id
  179.                         WHERE A.in_out_cashbank_id = pDocId
  180.                         GROUP BY A.tenant_id, A.ou_id, A.doc_date, B.cashbank_id
  181.                     )
  182.                     UPDATE cb_cashbank_balance D
  183.                     SET amount = D.amount - A.cost_amount,
  184.                         version = D.version + 1,
  185.                         update_datetime = pDatetime,
  186.                         update_user_id = pUserId
  187.                     FROM cost_amount A
  188.                     WHERE D.tenant_id = A.tenant_id AND
  189.                           D.ou_id = A.ou_id AND
  190.                           D.cashbank_id = A.cashbank_id AND
  191.                           D.cash_bank_date = A.doc_date AND  
  192.                           D.rec_type = vRecTypeKredit;
  193.            
  194.                     -- update cb_in_out_cashbank
  195.                     UPDATE cb_in_out_cashbank
  196.                     SET status_doc = vStatusDocDraft,
  197.                         workflow_status = vWorkflowStatusDraft,
  198.                         version = version + 1,
  199.                         update_datetime = pDatetime,
  200.                         update_user_id = pUserId
  201.                     WHERE in_out_cashbank_id = pDocId;           
  202.                          
  203.                     --update data cheque/giro balance yg statusnya ACCEPT
  204.                     WITH old_remark AS (
  205.                         SELECT log_deposit_administation_cg_id, remark, cheque_giro_balance_id,
  206.                             ROW_NUMBER() OVER(
  207.                                 PARTITION BY cheque_giro_balance_id
  208.                                 ORDER BY log_deposit_administation_cg_id DESC
  209.                             ) AS row_number
  210.                         FROM cb_log_deposit_administration_cheque_giro
  211.                     )
  212.                     UPDATE cb_cheque_giro_balance A
  213.                     SET flg_realization = vNo,
  214.                         realization_doc_type_id = vEmptyId,
  215.                         realization_doc_no = vEmpty,
  216.                         realization_doc_date = vEmpty,
  217.                         version = A.version + 1,
  218.                         update_datetime = pDatetime,
  219.                         update_user_id = pUserId,
  220.                         remark = D.remark
  221.                     FROM cb_in_out_cashbank B
  222.                         INNER JOIN cb_cheque_giro_realization C ON B.in_out_cashbank_id = C.in_out_cashbank_id
  223.                         INNER JOIN old_remark D ON D.cheque_giro_balance_id = C.ref_balance_id  
  224.                     WHERE B.in_out_cashbank_id = pDocId AND
  225.                         A.cheque_giro_balance_id = C.ref_balance_id AND
  226.                         D.row_number = 1 AND
  227.                         C.realization_status = vStatusAccept;      
  228.                          
  229.                     --update data cheque/giro balance yg statusnya REJECT
  230.                     WITH old_remark AS (
  231.                         SELECT log_deposit_administation_cg_id, remark, cheque_giro_balance_id,
  232.                             ROW_NUMBER() OVER(
  233.                                 PARTITION BY cheque_giro_balance_id
  234.                                 ORDER BY log_deposit_administation_cg_id DESC
  235.                             ) AS row_number
  236.                         FROM cb_log_deposit_administration_cheque_giro
  237.                     )
  238.                     UPDATE cb_cheque_giro_balance A
  239.                     SET flg_realization = vNo,
  240.                         flg_deposit = vYes,
  241.                         version = A.version + 1,
  242.                         update_datetime = pDatetime,
  243.                         update_user_id = pUserId,
  244.                         remark = D.remark
  245.                     FROM cb_in_out_cashbank B
  246.                         INNER JOIN cb_cheque_giro_realization C ON B.in_out_cashbank_id = C.in_out_cashbank_id
  247.                         INNER JOIN old_remark D ON D.cheque_giro_balance_id = C.ref_balance_id  
  248.                     WHERE B.in_out_cashbank_id = pDocId AND
  249.                         A.cheque_giro_balance_id = C.ref_balance_id AND
  250.                         D.row_number = 1 AND
  251.                         C.realization_status = vStatusReject;
  252.                        
  253.                     -- PERFORM cancel gl_cancel_admin_journal_trx
  254.                     PERFORM gl_cancel_admin_journal_trx(pTenantId, (vOuStructure).ou_bu_id, vOuId, (vDocJournal).journal_type, f_get_year_month_date(vDocDate), 'DAILY', pDatetime, pUserId);
  255.                    
  256.                     -- Find journal trx id
  257.                     SELECT journal_trx_id INTO vJournalTrxId
  258.                     FROM gl_journal_trx
  259.                     WHERE tenant_id = pTenantId
  260.                         AND journal_type = (vDocJournal).journal_type
  261.                         AND doc_type_id = vDocType
  262.                         AND doc_id = pDocId
  263.                         AND doc_no = vDocNo
  264.                         AND doc_date = vDocDate
  265.                         AND ou_bu_id = (vOuStructure).ou_bu_id
  266.                         AND ou_branch_id = (vOuStructure).ou_branch_id
  267.                         AND ou_sub_bu_id = (vOuStructure).ou_sub_bu_id;
  268.                    
  269.                     -- DELETE gl_journal_trx
  270.                     DELETE FROM gl_journal_trx
  271.                     WHERE journal_trx_id = vJournalTrxId;
  272.                    
  273.                     -- DELETE gl_journal_trx_item
  274.                     DELETE FROM gl_journal_trx_item
  275.                     WHERE journal_trx_id = vJournalTrxId;
  276.            
  277.                     -- DELETE gl_journal_trx_mapping
  278.                     DELETE FROM gl_journal_trx_mapping
  279.                     WHERE journal_trx_id = vJournalTrxId;
  280.                    
  281.                     -- PERFORM f_reset_approval_to_draft
  282.                     PERFORM f_reset_approval_to_draft(pTenantId, pSessionId, vScheme, pDocId, vDocNo, pDatetime, pRemarkApproval);
  283.                        
  284.                     -- UPDATE t_process_message
  285.                     UPDATE t_process_message
  286.                     SET process_no = pPrevProcessNo,
  287.                         update_datetime = pDatetime,
  288.                         update_user_id = pUserId,
  289.                         version = version + 1
  290.                     WHERE tenant_id = pTenantId
  291.                         AND process_name = vFunctionSubmit
  292.                         AND process_no = pDocId || '_' || vDocNo;
  293.            
  294.                 ELSE
  295.                     RAISE EXCEPTION 'Item in document with id % is already used for other documnet', pDocId;
  296.                 END IF;
  297.            
  298.             ELSE
  299.                 RAISE EXCEPTION 'Item in document with id % is already used for other documnet', pDocId;
  300.             END IF;
  301.        
  302.         ELSE
  303.             RAISE EXCEPTION 'Admin Process Ledger for Cashbank in year month % is already closed', SUBSTR(vDocDate, 1, 6);
  304.         END IF;
  305.                
  306.     ELSE
  307.         RAISE EXCEPTION 'Document with id % is not found or is on approval progress', pDocId;
  308.     END IF;
  309.    
  310. END;
  311. $BODY$
  312.   LANGUAGE plpgsql VOLATILE
  313.   COST 100;
  314.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement