Advertisement
aadddrr

cb_submit_cg_realization_20170925_2

Sep 24th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Function: cb_submit_cg_realization(bigint, character varying, character varying)
  2. /**
  3.  * Modified by Adrian, Sep 25, 2017
  4.  * Menambahkan perhitungan cost amount pada saat update cb_cashbank_balance
  5.  */
  6.  
  7. DROP FUNCTION cb_submit_cg_realization(bigint, character varying, character varying);
  8.  
  9. CREATE OR REPLACE FUNCTION cb_submit_cg_realization(bigint, character varying, character varying)
  10.   RETURNS void AS
  11. $BODY$
  12. DECLARE
  13.     pTenantId           ALIAS FOR $1;
  14.     pSessionId          ALIAS FOR $2;
  15.     pProcessNo          ALIAS FOR $3;
  16.  
  17.     vProcessId              bigint;
  18.     vDocId                  bigint;
  19.     vUserId                 bigint;
  20.     vDatetime               character varying(14);
  21.     vEmptyId                bigint;
  22.     vStatusRelease          character varying(1);
  23.     vStatusDraft            character varying(1);
  24.     vSignDebit              character varying(1);
  25.     vSignCredit             character varying(1);
  26.     vTypeRate               character varying(3);
  27.     vActivityCOA            character varying(10);
  28.     vCashBankCOA            character varying(10);
  29.     vJournalTrxId           bigint;
  30.     vCashBankId             bigint;
  31.     vDocDate                character varying(8);
  32.     vCashBankAmount         numeric;
  33.     vStatusAccept           character varying(10);
  34.     vStatusReject           character varying(10);
  35.     vGroupCoaPiutangCekGiro character varying(20);
  36.    
  37.     vDocJournal             DOC_JOURNAL%ROWTYPE;
  38.     vOuStructure            OU_BU_STRUCTURE%ROWTYPE;
  39.     result                  RECORD;
  40.     vCostAmount             numeric;
  41.     vCBAmount               numeric;
  42.     vSystemCOA              character varying(10);
  43.    
  44.     BEGIN
  45.     vEmptyId    := -99;
  46.     vStatusRelease := 'R';
  47.     vStatusDraft    := 'D';
  48.     vSignDebit := 'D';
  49.     vSignCredit := 'C';
  50.     vTypeRate := 'COM';
  51.     vActivityCOA := 'ACTIVITY';
  52.     vCashBankCOA := 'CASHBANK';
  53.     vStatusAccept := 'ACCEPT';
  54.     vStatusReject := 'REJECT';
  55.     vGroupCoaPiutangCekGiro := 'AyatSilangCekGiro';
  56.     vSystemCOA := 'SYSTEM';
  57.    
  58.     --emptying temp table
  59.     DELETE FROM tt_journal_trx_item WHERE session_id = pSessionId;
  60.  
  61.     --get variable
  62.     SELECT A.process_message_id INTO vProcessId
  63.     FROM t_process_message A
  64.     WHERE A.tenant_id = pTenantId AND
  65.         A.process_name = 'cb_submit_cg_realization' AND
  66.         A.process_no = pProcessNo;
  67.        
  68.     SELECT CAST(A.process_parameter_value AS bigint) INTO vDocId
  69.     FROM t_process_parameter A
  70.     WHERE A.process_message_id = vProcessId AND
  71.         A.process_parameter_key = 'cashbankInId';
  72.    
  73.     SELECT CAST(A.process_parameter_value AS bigint) INTO vUserId
  74.     FROM t_process_parameter A
  75.     WHERE A.process_message_id = vProcessId AND
  76.         A.process_parameter_key = 'userId';
  77.  
  78.     SELECT CAST(A.process_parameter_value AS character varying(14)) INTO vDatetime
  79.     FROM t_process_parameter A
  80.     WHERE A.process_message_id = vProcessId AND
  81.         A.process_parameter_key = 'datetime';
  82.  
  83.     --get detail document
  84.     SELECT f_get_ou_bu_structure(A.ou_id) AS ou, f_get_document_journal(A.doc_type_id) as doc
  85.     FROM cb_in_out_cashbank A
  86.     WHERE A.in_out_cashbank_id = vDocId
  87.     LIMIT 1 INTO result;
  88.  
  89.     vOuStructure := result.ou;
  90.     vDocJournal := result.doc;
  91.    
  92.     --get cashbankId
  93.     SELECT cashbank_id INTO vCashBankId
  94.     FROM cb_cheque_giro_realization
  95.     WHERE in_out_cashbank_id = vDocId
  96.     LIMIT 1;
  97.    
  98.     --insert and then update data cashbank balance
  99.     INSERT INTO cb_cashbank_balance
  100.     (tenant_id, ou_id, cashbank_id, cash_bank_date,
  101.     rec_type, curr_code, amount,
  102.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  103.     SELECT A.tenant_id, C.ou_id, B.cashbank_id, A.doc_date,
  104.         vSignDebit, B.curr_code, 0,
  105.         0, vDatetime, vUserId, vDatetime, vUserId
  106.     FROM cb_in_out_cashbank A
  107.         INNER JOIN cb_cheque_giro_realization B ON A.in_out_cashbank_id = B.in_out_cashbank_id
  108.         INNER JOIN m_cashbank_ou C ON B.cashbank_id = C.cashbank_id
  109.     WHERE A.in_out_cashbank_id = vDocId AND
  110.         B.realization_status = vStatusAccept AND
  111.         NOT EXISTS (SELECT 1 FROM cb_cashbank_balance D
  112.                     WHERE A.tenant_id = D.tenant_id AND
  113.                             C.ou_id = D.ou_id AND
  114.                             B.cashbank_id = D.cashbank_id AND
  115.                             A.doc_date = D.cash_bank_date AND
  116.                             D.rec_type = vSignDebit)
  117.     GROUP BY A.tenant_id, C.ou_id, B.cashbank_id, A.doc_date, B.curr_code;
  118.    
  119.     WITH amount AS (
  120.         SELECT A.tenant_id, A.ou_id, A.doc_date, B.cashbank_id, SUM(B.cheque_giro_amount) AS cheque_giro_amount
  121.         FROM cb_in_out_cashbank A
  122.             INNER JOIN cb_cheque_giro_realization B ON A.in_out_cashbank_id = B.in_out_cashbank_id
  123.         WHERE A.in_out_cashbank_id = vDocId AND
  124.             B.realization_status = vStatusAccept
  125.         GROUP BY A.tenant_id, A.ou_id, A.doc_date, B.cashbank_id
  126.     )
  127.     UPDATE cb_cashbank_balance D
  128.     SET amount = D.amount + A.cheque_giro_amount,
  129.         version = D.version + 1,
  130.         update_datetime = vDatetime,
  131.         update_user_id = vUserId
  132.     FROM amount A
  133.     WHERE D.tenant_id = A.tenant_id AND
  134.           D.ou_id = A.ou_id AND
  135.           D.cashbank_id = A.cashbank_id AND
  136.           D.cash_bank_date = A.doc_date AND  
  137.           D.rec_type = vSignDebit;
  138.          
  139.     WITH cost_amount AS (
  140.         WITH tt_in_out_cashbank AS(
  141.             SELECT A.in_out_cashbank_id, B.cashbank_id
  142.             FROM cb_in_out_cashbank A
  143.             INNER JOIN cb_cheque_giro_realization B ON A.in_out_cashbank_id = B.in_out_cashbank_id
  144.             GROUP BY A.in_out_cashbank_id, B.cashbank_id
  145.         )
  146.         SELECT A.tenant_id, A.ou_id, A.doc_date, B.cashbank_id, SUM(C.cost_amount) AS cost_amount
  147.         FROM cb_in_out_cashbank A
  148.         INNER JOIN tt_in_out_cashbank B ON A.in_out_cashbank_id = B.in_out_cashbank_id
  149.         INNER JOIN cb_in_out_cashbank_cost C ON A.in_out_cashbank_id = C.in_out_cashbank_id
  150.         WHERE A.in_out_cashbank_id = vDocId
  151.         GROUP BY A.tenant_id, A.ou_id, A.doc_date, B.cashbank_id
  152.     )
  153.     UPDATE cb_cashbank_balance D
  154.     SET amount = D.amount - A.cost_amount,
  155.         version = D.version + 1,
  156.         update_datetime = vDatetime,
  157.         update_user_id = vUserId
  158.     FROM cost_amount A
  159.     WHERE D.tenant_id = A.tenant_id AND
  160.           D.ou_id = A.ou_id AND
  161.           D.cashbank_id = A.cashbank_id AND
  162.           D.cash_bank_date = A.doc_date AND  
  163.           D.rec_type = vSignDebit;
  164.            
  165.     -- update cb_in_out_cashbank : status doc to R
  166.     UPDATE cb_in_out_cashbank
  167.     SET status_doc = vStatusRelease,
  168.         version = version + 1,
  169.         update_datetime = vDatetime,
  170.         update_user_id = vUserId
  171.     WHERE in_out_cashbank_id = vDocId;
  172.    
  173.     --update data cheque/giro balance yg statusnya ACCEPT
  174.     UPDATE cb_cheque_giro_balance A
  175.     SET flg_realization = 'Y',
  176.         realization_doc_type_id = B.doc_type_id,
  177.         realization_doc_no = B.doc_no,
  178.         realization_doc_date = B.doc_date,
  179.         version = A.version + 1,
  180.         update_datetime = vDatetime,
  181.         update_user_id = vUserId,
  182.         remark = C.remark
  183.     FROM cb_in_out_cashbank B
  184.         INNER JOIN cb_cheque_giro_realization C ON B.in_out_cashbank_id = C.in_out_cashbank_id
  185.     WHERE B.in_out_cashbank_id = vDocId AND
  186.         A.cheque_giro_balance_id = C.ref_balance_id AND
  187.         C.realization_status = vStatusAccept;
  188.    
  189.     --update data cheque/giro balance yg statusnya REJECT
  190.     UPDATE cb_cheque_giro_balance A
  191.     SET flg_realization = 'N',
  192.         flg_deposit = 'N',
  193.         version = A.version + 1,
  194.         update_datetime = vDatetime,
  195.         update_user_id = vUserId,
  196.         remark = C.remark
  197.     FROM cb_in_out_cashbank B
  198.         INNER JOIN cb_cheque_giro_realization C ON B.in_out_cashbank_id = C.in_out_cashbank_id
  199.     WHERE B.in_out_cashbank_id = vDocId AND
  200.         A.cheque_giro_balance_id = C.ref_balance_id AND
  201.         C.realization_status = vStatusReject;
  202.    
  203.     /*
  204.      * jurnal :
  205.      *      Credit  CHEQUE_GIRO
  206.      * Debit        CHEQUE_GIRO_COST
  207.      * Debit        CASH_BANK
  208.      */
  209.     PERFORM gl_manage_admin_journal_trx(A.tenant_id, (vOuStructure).ou_bu_id, A.ou_id, (vDocJournal).journal_type, (vDocJournal).ledger_code, f_get_year_month_date(A.doc_date), 'DAILY', vDatetime, vUserId)
  210.     FROM cb_in_out_cashbank A
  211.     WHERE A.in_out_cashbank_id = vDocId;
  212.    
  213.     SELECT NEXTVAL('gl_journal_trx_seq') INTO vJournalTrxId;
  214.    
  215.     INSERT INTO gl_journal_trx
  216.     (journal_trx_id, tenant_id, journal_type, doc_type_id, doc_id, doc_no, doc_date,
  217.     ou_bu_id, ou_branch_id, ou_sub_bu_id, partner_id, cashbank_id, warehouse_id, ext_doc_no, ext_doc_date,  
  218.     ref_doc_type_id, ref_id, due_date, curr_code, remark, status_doc, workflow_status,
  219.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  220.     SELECT vJournalTrxId, A.tenant_id, (vDocJournal).journal_type, A.doc_type_id, A.in_out_cashbank_id, A.doc_no, A.doc_date,
  221.         (vOuStructure).ou_bu_id, (vOuStructure).ou_branch_id, (vOuStructure).ou_sub_bu_id, A.partner_id, vEmptyId, vEmptyId, A.ext_doc_no, A.ext_doc_date,
  222.         A.ref_doc_type_id, A.ref_id, A.doc_date, A.ref_curr_code, A.remark, vStatusDraft, 'DRAFT',
  223.         0, vDatetime, vUserId, vDatetime, vUserId
  224.     FROM cb_in_out_cashbank A
  225.     WHERE A.in_out_cashbank_id = vDocId;
  226.  
  227.     INSERT INTO tt_journal_trx_item
  228.     (session_id, tenant_id, journal_trx_id, line_no,
  229.     ref_doc_type_id, ref_id,
  230.     partner_id, product_id, cashbank_id, ou_rc_id,
  231.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  232.     coa_id, curr_code, qty, uom_id,
  233.     amount, journal_date, type_rate,
  234.     numerator_rate, denominator_rate, journal_desc, remark)
  235.     SELECT pSessionId, A.tenant_id, vJournalTrxId, 1,
  236.         A.doc_type_id, A.in_out_cashbank_id,
  237.         B.partner_id, vEmptyId, B.cashbank_id, vEmptyId,
  238.         vEmptyId, vSignCredit, vSystemCOA, vEmptyId,
  239.         f_get_system_coa_by_group_coa(A.tenant_id , vGroupCoaPiutangCekGiro), B.curr_code, 0, vEmptyId,
  240.         B.cheque_giro_amount, A.doc_date, vTypeRate,
  241.         1, 1, 'CHEQUE_GIRO', A.remark
  242.     FROM cb_in_out_cashbank A
  243.         INNER JOIN cb_cheque_giro_realization B ON A.in_out_cashbank_id = B.in_out_cashbank_id
  244.     WHERE A.in_out_cashbank_id = vDocId AND
  245.         B.realization_status = vStatusAccept;
  246.        
  247.     INSERT INTO tt_journal_trx_item
  248.     (session_id, tenant_id, journal_trx_id, line_no,
  249.     ref_doc_type_id, ref_id,
  250.     partner_id, product_id, cashbank_id, ou_rc_id,
  251.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  252.     coa_id, curr_code, qty, uom_id,
  253.     amount, journal_date, type_rate,
  254.     numerator_rate, denominator_rate, journal_desc, remark)
  255.     SELECT pSessionId, A.tenant_id, vJournalTrxId, 1,
  256.         A.doc_type_id, B.in_out_cashbank_cost_id,
  257.         vEmptyId, vEmptyId, vEmptyId, B.ou_rc_id,
  258.         B.segment_id, vSignDebit, vActivityCOA, B.activity_gl_id,
  259.         E.coa_id, B.curr_code, 0, vEmptyId,
  260.         B.cost_amount, A.doc_date, vTypeRate,
  261.         1, 1, 'CHEQUE_GIRO_COST', B.remark
  262.     FROM cb_in_out_cashbank A
  263.         INNER JOIN cb_in_out_cashbank_cost B ON A.in_out_cashbank_id = B.in_out_cashbank_id
  264.         INNER JOIN m_activity_gl E ON B.activity_gl_id = E.activity_gl_id
  265.     WHERE A.in_out_cashbank_id = vDocId;
  266.    
  267.     -- SUM All Cost
  268.     IF EXISTS(SELECT 1 FROM cb_in_out_cashbank_cost A WHERE A.in_out_cashbank_id = vDocId) THEN
  269.         SELECT SUM(A.cost_amount) INTO vCostAmount
  270.         FROM cb_in_out_cashbank_cost A
  271.         WHERE A.in_out_cashbank_id = vDocId;
  272.     ELSE
  273.         vCostAmount := 0;
  274.     END IF;
  275.    
  276.     -- SUM All CashBank for Accept Cheque/Giro
  277.     IF EXISTS(SELECT 1 FROM cb_cheque_giro_realization A WHERE A.in_out_cashbank_id = vDocId AND A.realization_status = vStatusAccept) THEN
  278.         SELECT SUM(A.cheque_giro_amount) INTO vCBAmount
  279.         FROM cb_cheque_giro_realization A
  280.         WHERE A.in_out_cashbank_id = vDocId AND
  281.             A.realization_status = vStatusAccept;
  282.     ELSE
  283.         vCBAmount := 0;
  284.     END IF;
  285.    
  286.     INSERT INTO tt_journal_trx_item
  287.     (session_id, tenant_id, journal_trx_id, line_no,
  288.     ref_doc_type_id, ref_id,
  289.     partner_id, product_id, cashbank_id, ou_rc_id,
  290.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  291.     coa_id, curr_code, qty, uom_id,
  292.     amount, journal_date, type_rate,
  293.     numerator_rate, denominator_rate, journal_desc, remark)
  294.     SELECT pSessionId, A.tenant_id, vJournalTrxId, 1,
  295.         A.doc_type_id, A.in_out_cashbank_id,
  296.         vEmptyId, vEmptyId, B.cashbank_id, vEmptyId,
  297.         vEmptyId, vSignDebit, vCashBankCOA, vEmptyId,
  298.         B.coa_id, B.curr_code, 0, vEmptyId,
  299.         (vCBAmount - vCostAmount) AS amount, A.doc_date, vTypeRate,
  300.         1, 1, 'CASH_BANK', A.remark
  301.     FROM cb_in_out_cashbank A, m_cashbank B
  302.     WHERE A.in_out_cashbank_id = vDocId AND
  303.         B.cashbank_id = vCashBankId;
  304.  
  305.     INSERT INTO gl_journal_trx_item
  306.     (tenant_id, journal_trx_id, line_no,
  307.     ref_doc_type_id, ref_id,
  308.     partner_id, product_id, cashbank_id, ou_rc_id,
  309.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  310.     coa_id, curr_code, qty, uom_id,
  311.     amount, journal_date, type_rate,
  312.     numerator_rate, denominator_rate, journal_desc, remark,
  313.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  314.     SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id ),
  315.         A.ref_doc_type_id, A.ref_id,
  316.         A.partner_id, A.product_id, A.cashbank_id, A.ou_rc_id,
  317.         A.segmen_id, A.sign_journal, A.flg_source_coa, A.activity_gl_id,
  318.         A.coa_id, A.curr_code, A.qty, A.uom_id,
  319.         A.amount, A.journal_date, A.type_rate,
  320.         A.numerator_rate, A.denominator_rate, A.journal_desc, A.remark,
  321.         0, vDatetime, vUserId, vDatetime, vUserId
  322.     FROM tt_journal_trx_item A
  323.     WHERE A.session_id = pSessionId
  324.     AND A.journal_desc IN ('CHEQUE_GIRO_COST', 'CASH_BANK');
  325.    
  326.     INSERT INTO gl_journal_trx_mapping
  327.     (tenant_id, journal_trx_id, line_no,
  328.     ref_doc_type_id, ref_id,
  329.     partner_id, product_id, cashbank_id, ou_rc_id,
  330.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  331.     coa_id, curr_code, qty, uom_id,
  332.     amount, journal_date, type_rate,
  333.     numerator_rate, denominator_rate, journal_desc, remark,
  334.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  335.     SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id ),
  336.         A.ref_doc_type_id, A.ref_id,
  337.         A.partner_id, A.product_id, A.cashbank_id, A.ou_rc_id,
  338.         A.segmen_id, A.sign_journal, A.flg_source_coa, A.activity_gl_id,
  339.         A.coa_id, A.curr_code, A.qty, A.uom_id,
  340.         A.amount, A.journal_date, A.type_rate,
  341.         A.numerator_rate, A.denominator_rate, A.journal_desc, A.remark,
  342.         0, vDatetime, vUserId, vDatetime, vUserId
  343.     FROM tt_journal_trx_item A
  344.     WHERE A.session_id = pSessionId
  345.     AND A.journal_desc = 'CHEQUE_GIRO';
  346.  
  347.     --emptying temp table
  348.     DELETE FROM tt_journal_trx_item WHERE session_id = pSessionId; 
  349.    
  350. END;   
  351. $BODY$
  352.   LANGUAGE plpgsql VOLATILE
  353.   COST 100;
  354.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement