Advertisement
dchrissandy

Untitled

Feb 10th, 2021
849
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION "public"."gl_process_forex_ar" (in int8, in varchar, in int8, in varchar, in varchar, in int8) RETURNS void AS
  2. $BODY$
  3. DECLARE
  4.  
  5.     pTenantId               ALIAS FOR $1;
  6.     pSessionId              ALIAS FOR $2;
  7.     pOuId                   ALIAS FOR $3;
  8.     pYearMonth              ALIAS FOR $4;
  9.     pDatetime               ALIAS FOR $5;
  10.     pUserId                 ALIAS FOR $6;
  11.  
  12.     vNextYearMonth          character varying(6);
  13.     vNextYearMonthBeg       character varying(8);
  14.     vYearMonthBeg           character varying(8);
  15.     vSignDebt               character varying(1);
  16.     vSignCredit             character varying(1);
  17.     vCurrGL                 character varying(5);
  18.     vTypeRateCom            character varying(5);
  19.     vTypeRateEom            character varying(5);
  20.     vRoundingDigit          integer;
  21.     vSystemCOA              character varying(10);
  22.     vJournalTrxId           bigint;
  23.     vEmptyValue             character varying(1);
  24.     vEmptyId                bigint;
  25.     vStatusRelease          character varying(1);
  26.     vStatusApproved         character varying(10);
  27.     vForexArDocTypeId       bigint;
  28.     vForexCoaId             bigint;
  29.     vDateEndOfMonth         character varying(8);
  30.    
  31.     vDocJournal             DOC_JOURNAL%ROWTYPE;
  32.     vOuStructure            OU_BU_STRUCTURE%ROWTYPE;
  33.    
  34. BEGIN
  35.    
  36.     vSignDebt = 'D';
  37.     vSignCredit = 'C';
  38.     vTypeRateCom := 'COM';
  39.     vTypeRateEom := 'EOM';
  40.     vStatusRelease := 'R';
  41.     vStatusApproved := 'APPROVED';
  42.     vSystemCOA := 'SYSTEM';
  43.     vEmptyId    := -99;
  44.     vEmptyValue := ' ';
  45.     vForexArDocTypeId := 733;
  46.  
  47.     SELECT TO_CHAR(TO_DATE(MAX(pYearMonth),'YYYYMM') + interval '1 Month','YYYYMM') INTO vNextYearMonth;
  48.     SELECT TO_CHAR(TO_DATE(MAX(pYearMonth),'YYYYMM') + interval '1 Month - 1 day','YYYYMMDD') INTO vDateEndOfMonth;
  49.     SELECT pYearMonth || '01' INTO vYearMonthBeg;
  50.     SELECT vNextYearMonth || '01' INTO vNextYearMonthBeg;
  51.    
  52.     vCurrGL := f_get_value_system_config_by_param_code(pTenantId,'ValutaBuku');
  53.     vRoundingDigit := CAST(f_get_value_system_config_by_param_code(pTenantId,'rounding.gl.amount') AS integer);
  54.     vDocJournal := f_get_document_journal(vForexArDocTypeId);
  55.     vOuStructure := f_get_ou_bu_structure(pOuId);
  56.     vForexCoaId := f_get_system_coa_by_group_coa(pTenantId, 'PerkiraanBiayaSelisihKurs');
  57.  
  58.     DELETE FROM tt_journal_trx_item WHERE session_id = pSessionId; 
  59.     DELETE FROM tt_gl_forex_ar WHERE session_id = pSessionId;
  60.     DELETE FROM tt_gl_forex_ar_summary_coa WHERE session_id = pSessionId;
  61.  
  62.     /*
  63.      * Ambil saldo akhir invoice AR yang masih mempunyai sisa saldo (balance_amount - invoice_amount > 0)
  64.      */
  65.     INSERT INTO tt_gl_forex_ar (
  66.         session_id, date_year_month, tenant_id, ou_id, doc_type_id, invoice_id, doc_no, doc_date,
  67.         partner_id, coa_id, curr_code,
  68.         amount, gl_curr_code, initial_gl_amount, eom_gl_amount, add_forex_amount)
  69.     SELECT pSessionId, A.date_year_month, A.tenant_id, A.ou_id, A.doc_type_id, A.invoice_id, B.doc_no, B.doc_date,
  70.         B.partner_id, f_get_ar_coa_partner(A.tenant_id, B.partner_id), B.curr_code,
  71.         A.balance_amount - A.payment_amount, vCurrGL, 0, 0, 0
  72.     FROM fi_summary_monthly_ar A, fi_invoice_ar_balance B
  73.     WHERE A.tenant_id = pTenantId AND
  74.         A.date_year_month = pYearMonth AND
  75.         A.ou_id = pOuId AND
  76.         A.balance_amount - A.payment_amount <> 0 AND
  77.         A.doc_type_id = B.doc_type_id AND
  78.         A.invoice_id = B.invoice_ar_balance_id AND
  79.         B.doc_type_id NOT IN (252,254);
  80.  
  81.     /*
  82.      * Ambil saldo akhir invoice tax AR yang masih mempunyai sisa saldo (balance_amount - invoice_amount > 0)
  83.      */
  84.     INSERT INTO tt_gl_forex_ar (
  85.         session_id, date_year_month, tenant_id, ou_id, doc_type_id, invoice_id, doc_no, doc_date,
  86.         partner_id, coa_id, curr_code,
  87.         amount, gl_curr_code, initial_gl_amount, eom_gl_amount, add_forex_amount)
  88.     SELECT pSessionId, A.date_year_month, A.tenant_id, A.ou_id, A.doc_type_id, A.invoice_id, B.tax_no, B.tax_date,
  89.         B.partner_id, f_get_ar_coa_partner(A.tenant_id, B.partner_id), B.tax_curr_code,
  90.         A.balance_amount - A.payment_amount, vCurrGL, 0, 0, 0
  91.     FROM fi_summary_monthly_ar A, fi_invoice_tax_ar_balance B
  92.     WHERE A.tenant_id = pTenantId AND
  93.         A.date_year_month = pYearMonth AND
  94.         A.ou_id = pOuId AND
  95.         A.balance_amount - A.payment_amount <> 0 AND
  96.         A.doc_type_id = B.doc_type_id AND
  97.         A.invoice_id = B.invoice_tax_ar_balance_id AND
  98.         B.doc_type_id <> 283;
  99.  
  100.     /*
  101.      * Update initial_gl_amount = eom_gl_amount = amount, untuk invoice yg curr_code = curr code GL
  102.      */
  103.     UPDATE tt_gl_forex_ar SET initial_gl_amount = amount, eom_gl_amount = amount
  104.     WHERE session_id = pSessionId AND curr_code = gl_curr_code;
  105.  
  106.     /*
  107.      * Update initial_gl_amount = amount * exc rate sesuai doc_date, untuk invoice yg curr_code <> curr code GL
  108.      */
  109.     UPDATE tt_gl_forex_ar
  110.     SET initial_gl_amount = ROUND(tt_gl_forex_ar.amount * B.amount_to / B.amount_from, vRoundingDigit)
  111.     FROM m_exchange_rate B
  112.     WHERE tt_gl_forex_ar.session_id = pSessionId AND
  113.         tt_gl_forex_ar.curr_code <> tt_gl_forex_ar.gl_curr_code AND
  114.         tt_gl_forex_ar.tenant_id = B.tenant_id AND
  115.         tt_gl_forex_ar.curr_code = B.curr_code_from AND
  116.         tt_gl_forex_ar.gl_curr_code = B.curr_code_to AND
  117.         tt_gl_forex_ar.doc_date = B.date_from AND
  118.         B.type_exchange_rate = vTypeRateCom;
  119.  
  120.     /*
  121.      * Update eom_gl_amount = amount * exc rate EoM, untuk invoice yg curr_code <> curr code GL
  122.      */
  123.     UPDATE tt_gl_forex_ar
  124.     SET eom_gl_amount = ROUND(tt_gl_forex_ar.amount * B.amount_to / B.amount_from, vRoundingDigit)
  125.     FROM m_exchange_rate B
  126.     WHERE tt_gl_forex_ar.session_id = pSessionId AND
  127.         tt_gl_forex_ar.curr_code <> tt_gl_forex_ar.gl_curr_code AND
  128.         tt_gl_forex_ar.tenant_id = B.tenant_id AND
  129.         tt_gl_forex_ar.curr_code = B.curr_code_from AND
  130.         tt_gl_forex_ar.gl_curr_code = B.curr_code_to AND
  131.         B.date_to = vDateEndOfMonth AND
  132.         B.type_exchange_rate = vTypeRateEom;
  133.    
  134.     /*
  135.      * Hitung jumlah eom_gl_amount berdasarkan coa
  136.      */
  137.     INSERT INTO tt_gl_forex_ar_summary_coa
  138.         (session_id, coa_id, total_eom_gl_amount, total_forex_eom_gl_amount, trial_balance_amount, diff_amount)
  139.     SELECT A.session_id, A.coa_id, SUM(A.eom_gl_amount),
  140.         SUM(CASE WHEN A.curr_code = A.gl_curr_code THEN 0 ELSE A.eom_gl_amount END), 0, 0
  141.     FROM tt_gl_forex_ar A
  142.     WHERE session_id = pSessionId
  143.     GROUP BY A.session_id, A.coa_id;
  144.    
  145.     /*
  146.      * Update nilai trial_balance_amount, yaitu sum end_balance_3 dr tt_sum_gl_trial_balance, berdasarkan coa
  147.      */
  148.     UPDATE tt_gl_forex_ar_summary_coa
  149.     SET trial_balance_amount = trial_balance_amount + (
  150.         SELECT SUM(B.end_balance_3)
  151.         FROM tt_sum_gl_trial_balance B
  152.         WHERE tt_gl_forex_ar_summary_coa.session_id = B.session_id AND
  153.             tt_gl_forex_ar_summary_coa.coa_id = B.coa_id)
  154.     WHERE session_id = pSessionId;
  155.        
  156.     /*
  157.      * Update nilai selisih antara nilai trial balance terhadap nilai EoM gl amount.
  158.      */
  159.     UPDATE tt_gl_forex_ar_summary_coa
  160.     SET diff_amount = total_eom_gl_amount - trial_balance_amount  
  161.     WHERE session_id = pSessionId;
  162.    
  163.     /*
  164.      * Add by WTC, 20151125:
  165.      * Jika ada selisih, dan ada saldo dokumen valas, maka lakukan alokasi ke dokumen valas.
  166.      * Jika ada selisih, namun tidak ada saldo dokumen valas, maka buat journal AR terhadap pembulatan nilai.
  167.      *
  168.      * Alokasikan nilai selisih antara nilai trial balance terhadap nilai EoM gl amount, ke semua dokumen AR secara prorate.
  169.      * Pengalokasian nilai cukup untuk dokumen2 yg currency nya tidak sama dengan currency GL (valas), karena diasumsikan untuk
  170.      * dokumen yg currency nya sama dengan currency GL, tidak ada selisih kurs.
  171.      * Dengan demikian, saat perhitungan alokasi, total nilai EoM gl amount yg dijadikan acuan, hanya dari dokumen2 dgn
  172.      * valas.
  173.      */
  174.     UPDATE tt_gl_forex_ar
  175.     SET add_forex_amount = ROUND(tt_gl_forex_ar.eom_gl_amount * B.diff_amount / B.total_forex_eom_gl_amount, vRoundingDigit)
  176.     FROM tt_gl_forex_ar_summary_coa B
  177.     WHERE tt_gl_forex_ar.session_id = pSessionId AND
  178.         tt_gl_forex_ar.session_id = B.session_id AND
  179.         tt_gl_forex_ar.coa_id = B.coa_id AND
  180.         tt_gl_forex_ar.curr_code <> tt_gl_forex_ar.gl_curr_code AND
  181.         B.diff_amount <> 0 AND
  182.         B.total_forex_eom_gl_amount <> 0;
  183.        
  184.     /*
  185.      * Hitung nilai sisa diff_amount setelah dialokasikan ke semua dokumen AR.
  186.      * Nilai sisa ini merupakan sisa hasil pembulatan saat alokasi.
  187.      * Nilai sisa ini akan diupdate ke dokumen AR dengan nilai saldo terbesar per COA.
  188.      */
  189.     UPDATE tt_gl_forex_ar_summary_coa
  190.     SET diff_amount = diff_amount - (SELECT SUM(B.add_forex_amount)
  191.                                     FROM tt_gl_forex_ar B
  192.                                     WHERE tt_gl_forex_ar_summary_coa.session_id = B.session_id AND
  193.                                         tt_gl_forex_ar_summary_coa.coa_id = B.coa_id)
  194.     WHERE tt_gl_forex_ar_summary_coa.session_id = pSessionId;
  195.        
  196.     UPDATE tt_gl_forex_ar
  197.     SET add_forex_amount = add_forex_amount + B.diff_amount
  198.     FROM tt_gl_forex_ar_summary_coa B
  199.     WHERE tt_gl_forex_ar.session_id = pSessionId AND
  200.         tt_gl_forex_ar.session_id = B.session_id AND
  201.         tt_gl_forex_ar.coa_id = B.coa_id AND
  202.         B.diff_amount <> 0 AND
  203.         B.total_forex_eom_gl_amount <> 0 AND
  204.         tt_gl_forex_ar.gl_forex_ar_id = (SELECT C.gl_forex_ar_id
  205.                                          FROM tt_gl_forex_ar C
  206.                                          WHERE B.session_id = C.session_id AND
  207.                                             B.coa_id = C.coa_id AND
  208.                                             C.curr_code <> C.gl_curr_code
  209.                                          ORDER BY C.eom_gl_amount DESC, C.doc_date DESC, C.doc_no DESC
  210.                                          LIMIT 1);
  211.    
  212.     /*
  213.      * Cari coa_id yg terdaftar di type partner supplier dan memiliki nilai di temp trial balance,
  214.      * namun tidak memiliki dokumen AR (tidak terdaftar di tt_gl_forex_ar_summary_coa).
  215.      * Insert coa_id tersebut ke tt_gl_forex_ar.
  216.      * Hal ini perlu dilakukan agar jika terjadi bug program atau kesalahan input oleh user,
  217.      * dapat terlihat dari nilai forex AR yg tidak sesuai harapan.
  218.      */
  219.     INSERT INTO tt_gl_forex_ar (
  220.         session_id, date_year_month, tenant_id, ou_id, doc_type_id, invoice_id, doc_no, doc_date,
  221.         partner_id, coa_id, curr_code,
  222.         amount, gl_curr_code, initial_gl_amount, eom_gl_amount, add_forex_amount)
  223.     SELECT A.session_id, A.date_year_month, A.tenant_id, A.ou_bu_id, vEmptyId, vEmptyId, 'NO DOC', vEmptyValue,
  224.         vEmptyId, A.coa_id, vCurrGL, 0, vCurrGL, 0, 0, SUM(A.end_balance_3)
  225.     FROM tt_sum_gl_trial_balance A, m_type_partner B, m_partner_type C, m_partner D
  226.     WHERE A.session_id = pSessionId AND
  227.         A.tenant_id = pTenantId AND
  228.         A.date_year_month = pYearMonth AND
  229.         A.ou_bu_id = pOuId AND
  230.         A.coa_id = B.coa_id AND
  231.         B.type_partner_id = C.type_partner_id AND
  232.         C.group_partner = 'C' AND
  233.         C.partner_id = D.partner_id AND
  234.         D.tenant_id = A.tenant_id AND
  235.         NOT EXISTS (SELECT 1 FROM tt_gl_forex_ar_summary_coa E
  236.                     WHERE A.session_id = E.session_id AND A.coa_id = E.coa_id)
  237.     GROUP BY A.session_id, A.date_year_month, A.tenant_id, A.ou_bu_id, A.coa_id
  238.     HAVING SUM(A.end_balance_3) <> 0;
  239.    
  240.     /*
  241.      * Buat data journal apabila ada nilai forex
  242.      */
  243.     IF EXISTS (SELECT 1 FROM tt_gl_forex_ar_summary_coa WHERE session_id = pSessionId AND total_eom_gl_amount <> trial_balance_amount) THEN
  244.         -- Buat data jurnal forex untuk tahun bulan ybs
  245.         PERFORM gl_manage_admin_journal_trx(pTenantId, (vOuStructure).ou_bu_id, pOuId, (vDocJournal).journal_type, (vDocJournal).ledger_code, pYearMonth, 'MONTHLY', pDatetime, pUserId);
  246.        
  247.         SELECT NEXTVAL('gl_journal_trx_seq') INTO vJournalTrxId;
  248.        
  249.         /*
  250.          * Insert data gl_journal_trx. 1 data gl_journal_trx untuk semua
  251.          */
  252.         INSERT INTO gl_journal_trx
  253.         (journal_trx_id, tenant_id, journal_type, doc_type_id, doc_id, doc_no, doc_date,
  254.         ou_bu_id, ou_branch_id, ou_sub_bu_id, partner_id, cashbank_id, warehouse_id, ext_doc_no, ext_doc_date,  
  255.         ref_doc_type_id, ref_id, due_date, curr_code, remark, status_doc, workflow_status,
  256.         "version", create_datetime, create_user_id, update_datetime, update_user_id)
  257.         VALUES (vJournalTrxId, pTenantId, (vDocJournal).journal_type, vForexArDocTypeId, vForexArDocTypeId, vDateEndOfMonth, vDateEndOfMonth,
  258.             (vOuStructure).ou_bu_id, (vOuStructure).ou_branch_id, (vOuStructure).ou_sub_bu_id, vEmptyId, vEmptyId, vEmptyId, vEmptyValue, vEmptyValue,
  259.             vEmptyId, vEmptyId, vDateEndOfMonth, vCurrGL, 'FOREX AR', vStatusRelease, vStatusApproved,
  260.             0, pDatetime, pUserId, pDatetime, pUserId);
  261.            
  262.         /*
  263.          * Insert data temp item journal yang nilai forex > 0
  264.          * Note: Debit AR
  265.          */
  266.         INSERT INTO tt_journal_trx_item
  267.         (session_id, tenant_id, journal_trx_id, line_no,
  268.         ref_doc_type_id, ref_id,
  269.         partner_id, product_id, cashbank_id, ou_rc_id,
  270.         segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  271.         coa_id, curr_code, qty, uom_id,
  272.         amount, journal_date, type_rate,
  273.         numerator_rate, denominator_rate, journal_desc, remark)
  274.         SELECT pSessionId, pTenantId, vJournalTrxId, 1,
  275.             A.doc_type_id, A.invoice_id,
  276.             A.partner_id, vEmptyId, vEmptyId, vEmptyId,
  277.             vEmptyId, vSignDebt, vSystemCOA, vEmptyId,
  278.             A.coa_id, A.gl_curr_code, 0, vEmptyId,
  279.             A.add_forex_amount, vDateEndOfMonth, vTypeRateEom,
  280.             1, 1, 'FX_AR', f_get_partner_name(A.partner_id) || ' ; ' ||A.doc_no || ' ; ' || A.doc_date
  281.         FROM tt_gl_forex_ar A
  282.         WHERE A.session_id = pSessionId AND
  283.             A.add_forex_amount > 0;
  284.            
  285.         /*
  286.          * Insert data temp item journal yang nilai forex < 0
  287.          * Note: Credit AR
  288.          */
  289.         INSERT INTO tt_journal_trx_item
  290.         (session_id, tenant_id, journal_trx_id, line_no,
  291.         ref_doc_type_id, ref_id,
  292.         partner_id, product_id, cashbank_id, ou_rc_id,
  293.         segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  294.         coa_id, curr_code, qty, uom_id,
  295.         amount, journal_date, type_rate,
  296.         numerator_rate, denominator_rate, journal_desc, remark)
  297.         SELECT pSessionId, pTenantId, vJournalTrxId, 1,
  298.             A.doc_type_id, A.invoice_id,
  299.             A.partner_id, vEmptyId, vEmptyId, vEmptyId,
  300.             vEmptyId, vSignCredit, vSystemCOA, vEmptyId,
  301.             A.coa_id, A.gl_curr_code, 0, vEmptyId,
  302.             A.add_forex_amount * -1, vDateEndOfMonth, vTypeRateEom,
  303.             1, 1, 'FX_AR', f_get_partner_name(A.partner_id) || ' ; ' ||A.doc_no || ' ; ' || A.doc_date
  304.         FROM tt_gl_forex_ar A
  305.         WHERE A.session_id = pSessionId AND
  306.             A.add_forex_amount < 0;
  307.            
  308.         /*
  309.          * Insert data temp item journal untuk forex.
  310.          * Diasumsikan hasil jumlahnya bernilai positif, maka perlu membuat Credit Forex.
  311.          * 20170816, WTC, tambahkan filter yang memiliki O/S document AR saja. Yang tanpa O/S document AR, akan dijurnal terhadap rounding
  312.          */
  313.         INSERT INTO tt_journal_trx_item
  314.         (session_id, tenant_id, journal_trx_id, line_no,
  315.         ref_doc_type_id, ref_id,
  316.         partner_id, product_id, cashbank_id, ou_rc_id,
  317.         segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  318.         coa_id, curr_code, qty, uom_id,
  319.         amount, journal_date, type_rate,
  320.         numerator_rate, denominator_rate, journal_desc, remark)
  321.         SELECT pSessionId, pTenantId, vJournalTrxId, 1,
  322.             vEmptyId, vEmptyId,
  323.             vEmptyId, vEmptyId, vEmptyId, vEmptyId,
  324.             vEmptyId, vSignCredit, vSystemCOA, vEmptyId,
  325.             vForexCoaId, vCurrGL, 0, vEmptyId,
  326.             SUM(A.add_forex_amount), vDateEndOfMonth, vTypeRateEom,
  327.             1, 1, 'UNREAL_FX', 'Unrealize Forex'
  328.         FROM tt_gl_forex_ar A
  329.         WHERE A.session_id = pSessionId
  330.             AND A.invoice_id <> vEmptyId
  331.         GROUP BY A.session_id
  332.         HAVING SUM(A.add_forex_amount) <> 0;
  333.            
  334.         /*
  335.          * Insert data temp item journal AR, apabila total valas nya = 0 dan memiliki O/S document AR
  336.          * Note: Debit AR, jika diff_amount > 0
  337.          *       Credit AR, jika diff_amount < 0
  338.          */
  339.         INSERT INTO tt_journal_trx_item
  340.         (session_id, tenant_id, journal_trx_id, line_no,
  341.         ref_doc_type_id, ref_id,
  342.         partner_id, product_id, cashbank_id, ou_rc_id,
  343.         segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  344.         coa_id, curr_code, qty, uom_id,
  345.         amount, journal_date, type_rate,
  346.         numerator_rate, denominator_rate, journal_desc, remark)
  347.         SELECT pSessionId, pTenantId, vJournalTrxId, 1,
  348.             vEmptyId, vEmptyId,
  349.             vEmptyId, vEmptyId, vEmptyId, vEmptyId,
  350.             vEmptyId, CASE WHEN A.diff_amount > 0 THEN vSignDebt ELSE vSignCredit END, vSystemCOA, vEmptyId,
  351.             A.coa_id, vCurrGL, 0, vEmptyId,
  352.             ABS(A.diff_amount), vDateEndOfMonth, vTypeRateEom,
  353.             1, 1, 'FX_AR', 'FOREX AR'
  354.         FROM tt_gl_forex_ar_summary_coa A
  355.         WHERE A.session_id = pSessionId AND
  356.             A.total_forex_eom_gl_amount = 0;
  357.            
  358.         /*
  359.          * Insert temp data journal item untuk rounding, apabila total valas nya = 0 dan memiliki O/S document AR
  360.          * Note: credit rounding
  361.          */
  362.         INSERT INTO tt_journal_trx_item
  363.         (session_id, tenant_id, journal_trx_id, line_no,
  364.         ref_doc_type_id, ref_id,
  365.         partner_id, product_id, cashbank_id, ou_rc_id,
  366.         segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  367.         coa_id, curr_code, qty, uom_id,
  368.         amount, journal_date, type_rate,
  369.         numerator_rate, denominator_rate, journal_desc, remark)
  370.         SELECT pSessionId, pTenantId, vJournalTrxId, 1,
  371.             vEmptyId, vEmptyId,
  372.             vEmptyId, vEmptyId, vEmptyId, vEmptyId,
  373.             vEmptyId, vSignCredit, vSystemCOA, vEmptyId,
  374.             f_get_coa_id_for_rounding(pTenantId), vCurrGL, 0, vEmptyId,
  375.             SUM(A.diff_amount), vDateEndOfMonth, vTypeRateEom,
  376.             1, 1, 'ROUNDING', 'FOREX AR'
  377.         FROM tt_gl_forex_ar_summary_coa A
  378.         WHERE A.session_id = pSessionId AND
  379.             A.total_forex_eom_gl_amount = 0
  380.         GROUP BY A.session_id
  381.         HAVING SUM(A.diff_amount) <> 0;
  382.            
  383.         /*
  384.          * Insert temp data journal item untuk rounding, apabila total valas nya = 0 dan memiliki O/S document AR
  385.          * Note: debit rounding
  386.          */
  387.         INSERT INTO tt_journal_trx_item
  388.         (session_id, tenant_id, journal_trx_id, line_no,
  389.         ref_doc_type_id, ref_id,
  390.         partner_id, product_id, cashbank_id, ou_rc_id,
  391.         segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  392.         coa_id, curr_code, qty, uom_id,
  393.         amount, journal_date, type_rate,
  394.         numerator_rate, denominator_rate, journal_desc, remark)
  395.         SELECT pSessionId, pTenantId, vJournalTrxId, 1,
  396.             vEmptyId, vEmptyId,
  397.             vEmptyId, vEmptyId, vEmptyId, vEmptyId,
  398.             vEmptyId, vSignCredit, vSystemCOA, vEmptyId,
  399.             f_get_coa_id_for_rounding(pTenantId), vCurrGL, 0, vEmptyId,
  400.             SUM(A.add_forex_amount), vDateEndOfMonth, vTypeRateEom,
  401.             1, 1, 'ROUNDING', 'FOREX AR'
  402.         FROM tt_gl_forex_ar A
  403.         WHERE A.session_id = pSessionId AND
  404.             A.invoice_id = vEmptyId
  405.         GROUP BY f_get_coa_id_for_rounding(pTenantId);
  406.            
  407.         /*
  408.          * Jumlah amount forex hasil perhitungan di atas dapat bernilai negatif atau positif.
  409.          * Jika bernilai negatif, maka update sign_journal = D dan amount = -amount (agar menjadi positif),
  410.          * yang artinya Debit Forex.
  411.          */
  412.         UPDATE tt_journal_trx_item SET sign_journal = vSignDebt, amount = amount * -1
  413.         WHERE session_id = pSessionId AND journal_desc IN ('UNREAL_FX', 'ROUNDING') AND amount < 0;
  414.  
  415.         /*
  416.          * Insert temp data journal item
  417.          */
  418.         INSERT INTO gl_journal_trx_item
  419.         (tenant_id, journal_trx_id, line_no,
  420.         ref_doc_type_id, ref_id,
  421.         partner_id, product_id, cashbank_id, ou_rc_id,
  422.         segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  423.         coa_id, curr_code, qty, uom_id,
  424.         amount, journal_date, type_rate,
  425.         numerator_rate, denominator_rate, gl_curr_code, gl_amount, journal_desc, remark,
  426.         "version", create_datetime, create_user_id, update_datetime, update_user_id)
  427.         SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id ),
  428.             A.ref_doc_type_id, A.ref_id,
  429.             A.partner_id, A.product_id, A.cashbank_id, A.ou_rc_id,
  430.             A.segmen_id, A.sign_journal, A.flg_source_coa, A.activity_gl_id,
  431.             A.coa_id, A.curr_code, A.qty, A.uom_id,
  432.             A.amount, A.journal_date, A.type_rate,
  433.             A.numerator_rate, A.denominator_rate, A.curr_code, A.amount, A.journal_desc, A.remark,
  434.             0, pDatetime, pUserId, pDatetime, pUserId
  435.         FROM tt_journal_trx_item A
  436.         WHERE A.session_id = pSessionId
  437.             AND A.journal_desc = 'FX_AR';
  438.        
  439.         INSERT INTO gl_journal_trx_mapping
  440.         (tenant_id, journal_trx_id, line_no,
  441.         ref_doc_type_id, ref_id,
  442.         partner_id, product_id, cashbank_id, ou_rc_id,
  443.         segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  444.         coa_id, curr_code, qty, uom_id,
  445.         amount, journal_date, type_rate,
  446.         numerator_rate, denominator_rate, gl_curr_code, gl_amount, journal_desc, remark,
  447.         "version", create_datetime, create_user_id, update_datetime, update_user_id)
  448.         SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id ),
  449.             A.ref_doc_type_id, A.ref_id,
  450.             A.partner_id, A.product_id, A.cashbank_id, A.ou_rc_id,
  451.             A.segmen_id, A.sign_journal, A.flg_source_coa, A.activity_gl_id,
  452.             A.coa_id, A.curr_code, A.qty, A.uom_id,
  453.             A.amount, A.journal_date, A.type_rate,
  454.             A.numerator_rate, A.denominator_rate, A.curr_code, A.amount, A.journal_desc, A.remark,
  455.             0, pDatetime, pUserId, pDatetime, pUserId
  456.         FROM tt_journal_trx_item A
  457.         WHERE A.session_id = pSessionId
  458.             AND A.journal_desc IN ('UNREAL_FX', 'ROUNDING');
  459.    
  460.         /*
  461.          * Insert data temp jurnal item ke temp trial balance, khusus untuk mengisi nilai mut_debit_3 dan mut_credit_3
  462.          */
  463.         INSERT INTO tt_gl_trial_balance (
  464.             session_id, tenant_id, date_year_month, ou_bu_id, ou_branch_id, ou_sub_bu_id, ou_rc_id,
  465.             segmen_id, coa_id, sign_coa, beg_balance_1, mut_debit_1, mut_credit_1, end_balance_1,
  466.             mut_debit_2, mut_credit_2, end_balance_2,
  467.             mut_debit_3,
  468.             mut_credit_3, end_balance_3, amount)
  469.         SELECT A.session_id, A.tenant_id, pYearMonth, B.ou_bu_id, B.ou_branch_id, B.ou_sub_bu_id, A.ou_rc_id,
  470.             A.segmen_id, A.coa_id, C.sign_coa, 0, 0, 0, 0,
  471.             0, 0, 0,
  472.             CASE WHEN A.sign_journal = vSignDebt THEN A.amount ELSE 0 END,
  473.             CASE WHEN A.sign_journal = vSignCredit THEN A.amount ELSE 0 END, 0, 0
  474.         FROM tt_journal_trx_item A, gl_journal_trx B, m_coa C
  475.         WHERE A.session_id = pSessionId AND
  476.             A.journal_trx_id = B.journal_trx_id AND
  477.             A.coa_id = C.coa_id;
  478.        
  479.         /*
  480.          * Insert juga data temp summary journal trx
  481.          */
  482.         INSERT INTO tt_gl_summary_journal_trx (
  483.             session_id, tenant_id, date_year_month, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  484.             partner_id, product_id, cashbank_id, ou_rc_id, segment_id, sign_journal, coa_id, sign_coa,
  485.             curr_code, trx_amount, gl_curr_code, gl_amount, journal_process_periode, journal_type)
  486.         SELECT A.session_id, A.tenant_id, pYearMonth, B.ou_bu_id, B.ou_branch_id, B.ou_sub_bu_id,
  487.             A.partner_id, A.product_id, A.cashbank_id, A.ou_rc_id, A.segmen_id, A.sign_journal, A.coa_id, C.sign_coa,
  488.             A.curr_code, A.amount, A.curr_code, A.amount, 'MONTHLY', B.journal_type
  489.         FROM tt_journal_trx_item A, gl_journal_trx B, m_coa C
  490.         WHERE A.session_id = pSessionId AND
  491.             A.journal_trx_id = B.journal_trx_id AND
  492.             A.coa_id = C.coa_id;
  493.    
  494.         -- Add by WTC, 20151125, tambahkan jurnal balik forex untuk awal tahun bulan berikutnya
  495.         -- Hal ini diperlukan agar tidak terjadi selisih forex
  496.         IF EXISTS (SELECT 1 FROM tt_gl_forex_ar WHERE add_forex_amount <> 0 AND invoice_id <> vEmptyId AND session_id = pSessionId) THEN
  497.             PERFORM gl_manage_admin_journal_trx(pTenantId, (vOuStructure).ou_bu_id, pOuId, (vDocJournal).journal_type, (vDocJournal).ledger_code, vNextYearMonth, 'MONTHLY', pDatetime, pUserId);
  498.            
  499.             SELECT NEXTVAL('gl_journal_trx_seq') INTO vJournalTrxId;
  500.            
  501.             /*
  502.              * Insert data gl_journal_trx. 1 data gl_journal_trx untuk semua
  503.              */
  504.             INSERT INTO gl_journal_trx
  505.             (journal_trx_id, tenant_id, journal_type, doc_type_id, doc_id, doc_no, doc_date,
  506.             ou_bu_id, ou_branch_id, ou_sub_bu_id, partner_id, cashbank_id, warehouse_id, ext_doc_no, ext_doc_date,  
  507.             ref_doc_type_id, ref_id, due_date, curr_code, remark, status_doc, workflow_status,
  508.             "version", create_datetime, create_user_id, update_datetime, update_user_id)
  509.             VALUES (vJournalTrxId, pTenantId, (vDocJournal).journal_type, vForexArDocTypeId, vForexArDocTypeId, vNextYearMonthBeg, vNextYearMonthBeg,
  510.                 (vOuStructure).ou_bu_id, (vOuStructure).ou_branch_id, (vOuStructure).ou_sub_bu_id, vEmptyId, vEmptyId, vEmptyId, vEmptyValue, vEmptyValue,
  511.                 vEmptyId, vEmptyId, vNextYearMonthBeg, vCurrGL, 'REVERSED FOREX AR OF PREV YEAR MONTH', vStatusRelease, vStatusApproved,
  512.                 0, pDatetime, pUserId, pDatetime, pUserId);
  513.        
  514.             /*
  515.              * Insert temp data journal item
  516.              */
  517.             INSERT INTO gl_journal_trx_item
  518.             (tenant_id, journal_trx_id, line_no,
  519.             ref_doc_type_id, ref_id,
  520.             partner_id, product_id, cashbank_id, ou_rc_id,
  521.             segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  522.             coa_id, curr_code, qty, uom_id,
  523.             amount, journal_date, type_rate,
  524.             numerator_rate, denominator_rate, gl_curr_code, gl_amount, journal_desc, remark,
  525.             "version", create_datetime, create_user_id, update_datetime, update_user_id)
  526.             SELECT pTenantId, vJournalTrxId, ROW_NUMBER() OVER ( PARTITION BY vJournalTrxId),
  527.                 vEmptyId, vEmptyId,
  528.                 vEmptyId, vEmptyId, vEmptyId, vEmptyId,
  529.                 vEmptyId, CASE WHEN (A.total_eom_gl_amount - A.trial_balance_amount) > 0 THEN vSignCredit ELSE vSignDebt END, vSystemCOA, vEmptyId,
  530.                 A.coa_id, vCurrGL, 0, vEmptyId,
  531.                 ABS(A.total_eom_gl_amount - A.trial_balance_amount), vNextYearMonthBeg, vTypeRateEom,
  532.                 1, 1, vCurrGL, ABS(A.total_eom_gl_amount - A.trial_balance_amount), 'FX_AR', 'FOREX AR',
  533.                 0, pDatetime, pUserId, pDatetime, pUserId
  534.             FROM tt_gl_forex_ar_summary_coa A
  535.             WHERE A.session_id = pSessionId;
  536.            
  537.             INSERT INTO gl_journal_trx_mapping
  538.             (tenant_id, journal_trx_id, line_no,
  539.             ref_doc_type_id, ref_id,
  540.             partner_id, product_id, cashbank_id, ou_rc_id,
  541.             segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  542.             coa_id, curr_code, qty, uom_id,
  543.             amount, journal_date, type_rate,
  544.             numerator_rate, denominator_rate, gl_curr_code, gl_amount, journal_desc, remark,
  545.             "version", create_datetime, create_user_id, update_datetime, update_user_id)
  546.             SELECT A.tenant_id, vJournalTrxId, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id ),
  547.                 A.ref_doc_type_id, A.ref_id,
  548.                 A.partner_id, A.product_id, A.cashbank_id, A.ou_rc_id,
  549.                 A.segmen_id, CASE A.sign_journal WHEN vSignDebt THEN vSignCredit ELSE vSignDebt END, A.flg_source_coa, A.activity_gl_id,
  550.                 A.coa_id, A.curr_code, A.qty, A.uom_id,
  551.                 A.amount, vNextYearMonthBeg, A.type_rate,
  552.                 A.numerator_rate, A.denominator_rate, A.curr_code, A.amount, A.journal_desc, A.remark,
  553.                 0, pDatetime, pUserId, pDatetime, pUserId
  554.             FROM tt_journal_trx_item A
  555.             WHERE A.session_id = pSessionId
  556.                 AND A.journal_desc IN ('UNREAL_FX');
  557.         END IF;
  558.                
  559.         DELETE FROM tt_journal_trx_item WHERE session_id = pSessionId; 
  560.     END IF;
  561.  
  562.     DELETE FROM tt_gl_forex_ar WHERE session_id = pSessionId;
  563.     DELETE FROM tt_gl_forex_ar_summary_coa WHERE session_id = pSessionId;
  564. END;
  565. $BODY$
  566. LANGUAGE 'plpgsql'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement