Advertisement
aadddrr

cb_submit_cg_realization_20170925

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