Advertisement
aadddrr

gl_process_formula_recurring

Jan 22nd, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION gl_process_formula_recurring(character varying, bigint, bigint, character varying, character varying, character varying, bigint)
  2.   RETURNS void AS
  3. $BODY$
  4. DECLARE
  5.     pSessionId          ALIAS FOR $1;
  6.     pTenantId           ALIAS FOR $2;
  7.     pOuId               ALIAS FOR $3;
  8.     pYearMonth          ALIAS FOR $4;
  9.     pWhenProcess        ALIAS FOR $5;
  10.     pDatetime           ALIAS FOR $6;
  11.     pUserId             ALIAS FOR $7;
  12.    
  13.     vEmptyId                bigint;
  14.     vRoundingAmount         integer;
  15.     vEmptyValue             character varying(1);
  16.    
  17.    
  18.     -- variable untuk tulis ke tabel jurnal trx
  19.     vJournalTypeRecurring   character varying(20);
  20.     vDocTypeIdRecurring     bigint;
  21.     vPartnerId              bigint;
  22.     vWarehouseId            bigint;
  23.     vDocIdRecurring         bigint;
  24.     vDocNoRecurring         character varying(20);     
  25.     vDocDateRecurring       character varying(8);
  26.     vExtDocNo               character varying(20);
  27.     vExtDocDate             character varying(8);
  28.     vStatusDraft            character varying(1);
  29.     vCashBankId             bigint;
  30.     vRefDocTypeId           bigint;
  31.     vRefId                  bigint;
  32.     vDocDate                character varying(8);
  33.    
  34.     vTypeRate               character varying(3);
  35.     vFLAG_SOURCE_COA        character varying(2);
  36.     vEomDate                character varying(8);
  37.  
  38.     vRestOfMonth                numeric;
  39. BEGIN
  40.    
  41.     vEmptyId := -99;   
  42.     vEmptyValue := ' ';
  43.     vTypeRate := 'COM';
  44.     vStatusDraft := 'D';
  45.    
  46.     -- variable untuk tulis ke tabel jurnal trx
  47.     vJournalTypeRecurring   := 'GL.FORMULA';   
  48.     vDocTypeIdRecurring     := '1'; -- Recurring = 1, Allocation = 2
  49.     vDocIdRecurring         := 751; -- docid baru untuk jurnal formula
  50.     vDocNoRecurring         := vEmptyValue;
  51.     vDocDateRecurring       := vEmptyValue;
  52.     vPartnerId              := vEmptyId;
  53.     vWarehouseId            := vEmptyId;
  54.     vExtDocNo               := vEmptyValue;
  55.     vExtDocDate             := vEmptyValue;
  56.     vCashBankId             := vEmptyId;
  57.    
  58.     vRefDocTypeId           := vEmptyId;
  59.     vRefId                  := vEmptyId;
  60.     vDocDate                := vEmptyValue;
  61.     vFLAG_SOURCE_COA        := 'GL';
  62.    
  63.     vRoundingAmount := CAST(f_get_value_system_config_by_param_code(pTenantId,'rounding.gl.amount') AS integer);   
  64.    
  65.     vEomDate := TO_CHAR(TO_DATE(pYearMonth||'01','YYYYMMDD') + INTERVAL '1 MONTH - 1 DAY', 'YYYYMMDD');
  66.    
  67.      -- step 1 : insert ke temp, ambil dari tabel formula recurring
  68.      -- step 2 : update kembali ke saldo formula , formula yang ada disaldo  
  69.      -- step 3 : insert yang tidak ada di saldo
  70.      -- step 4 : insert ke saldo dari tabel gl formula , untuk formula yang belum ada disaldo
  71.      -- step 5 : tulis ke log
  72.      -- Step 6 : tulis ke gl_journal_trx
  73.      -- Step 7 : tulis ke tt_journal_trx_item
  74.      -- Step 8 : tulis ke gl_journal_trx_item  
  75.      -- Step 9 : tulis ke gl_journal_trx_mapping     
  76.      -- Step 10: tulis semua formula yang di process ke Admin process Formula
  77.      -- Step 11: update  process di glformulaprocess
  78.    
  79.      -- ambil data detail journal formula recurring
  80.     INSERT INTO tt_gl_journal_formula_recurring(
  81.             session_id, journal_formula_recurring_id, tenant_id, journal_formula_id,
  82.             line_no, recurring_curr_code, recurring_amount, recurring_rate_date,
  83.             sign_journal, ou_branch_id, sub_ou_id, coa_id, ou_rc_id, segment_id,
  84.             amount_factor_x, amount_factor_y, remark, used_recurr_amount, balance_used_amount, rounding_amount,
  85.             start_periode, end_periode, journal_trx_id)
  86.     SELECT pSessionId, C.journal_formula_recurring_id, C.tenant_id, C.journal_formula_id,
  87.             C.line_no, C.recurring_curr_code, C.recurring_amount, C.recurring_rate_date,
  88.             C.sign_journal, C.ou_branch_id, C.sub_ou_id, C.coa_id, C.ou_rc_id, C.segment_id,
  89.             C.amount_factor_x, C.amount_factor_y, C.remark,
  90.             ROUND(C.recurring_amount * C.amount_factor_x / C.amount_factor_y, vRoundingAmount), 0, 0,
  91.             B.start_periode, B.end_periode, vEmptyId
  92.     FROM gl_journal_formula A INNER JOIN gl_journal_formula_process B ON A.journal_formula_id = B.journal_formula_id
  93.                             INNER JOIN gl_journal_formula_recurring C ON A.journal_formula_id = C.journal_formula_id
  94.     WHERE A.tenant_id = pTenantId AND
  95.         A.flg_validate = 'Y' AND
  96.         pYearMonth BETWEEN B.start_periode AND B.end_periode AND
  97.         NOT EXISTS ( SELECT 1 FROM gl_admin_process_formula E
  98.                     WHERE  E.tenant_id = A.tenant_id AND  
  99.                             E.journal_formula_id = A.journal_formula_id AND
  100.                             E.year_month = pYearMonth AND
  101.                             E.flag_process = 'Y');
  102.    
  103.     -- hitung nilai berjalan recurring amount, ini jika saldo sudah pernah dibuat / bukan periode pertama kali
  104.     UPDATE tt_gl_journal_formula_recurring A SET balance_used_amount = B.used_recurr_amount
  105.     FROM gl_journal_formula_recurring_balance B
  106.     WHERE A.session_id = pSessionId AND
  107.         A.journal_formula_recurring_id = B.journal_formula_recurring_id;
  108.    
  109.     -- jika periode terakhir maka harus hitung nilai pembulatan nya
  110.     UPDATE tt_gl_journal_formula_recurring A SET rounding_amount = recurring_amount - used_recurr_amount - balance_used_amount
  111.     WHERE A.session_id = pSessionId AND
  112.         A.end_periode = pYearMonth;
  113.  
  114.     SELECT DATE_PART('YEAR',
  115.             AGE(TO_TIMESTAMP(A.end_periode, 'YYYYMM'), TO_TIMESTAMP(A.start_periode, 'YYYYMM'))
  116.         ) * 12 + DATE_PART('MONTH',
  117.             AGE(TO_TIMESTAMP(A.end_periode, 'YYYYMM'), TO_TIMESTAMP(A.start_periode, 'YYYYMM'))
  118.         ) INTO vRestOfMonth
  119.     FROM tt_gl_journal_formula_recurring A
  120.     WHERE A.session_id = pSessionId AND
  121.         A.start_periode = pYearMonth;
  122.    
  123.     -- buat balance untuk periode proses = start periode
  124.     INSERT INTO gl_journal_formula_recurring_balance(
  125.             tenant_id, journal_formula_recurring_id, journal_formula_id,
  126.             beg_recurr_amount, used_recurr_amount,
  127.             rest_of_month,
  128.             create_datetime, create_user_id, update_datetime, update_user_id, version)
  129.     SELECT A.tenant_id, A.journal_formula_recurring_id, A.journal_formula_id,
  130.             A.recurring_amount, A.used_recurr_amount,
  131.             vRestOfMonth,
  132.             pDatetime, pUserId, pDatetime, pUserId, 0          
  133.     FROM tt_gl_journal_formula_recurring A
  134.     WHERE A.session_id = pSessionId AND
  135.         A.start_periode = pYearMonth;
  136.        
  137.     -- update balance untuk nilai used amount, dan sisa bulan
  138.     UPDATE gl_journal_formula_recurring_balance A SET used_recurr_amount = A.used_recurr_amount + B.used_recurr_amount + B.rounding_amount,
  139.                                                         rest_of_month = A.rest_of_month - 1
  140.     FROM tt_gl_journal_formula_recurring B
  141.     WHERE B.session_id = pSessionId AND
  142.         A.journal_formula_id = B.journal_formula_id AND
  143.         A.journal_formula_recurring_id = B.journal_formula_recurring_id AND
  144.         B.start_periode <> pYearMonth;
  145.  
  146.     -- buat log data used recurring amount
  147.     INSERT INTO gl_log_journal_formula_recurring_balance
  148.     (tenant_id, journal_formula_recurring_id,
  149.     journal_formula_id, year_month, used_recurr_amount, rounding_amount,
  150.     create_datetime, create_user_id, update_datetime, update_user_id, version)
  151.     SELECT A.tenant_id, A.journal_formula_recurring_id,
  152.         A.journal_formula_id, pYearMonth, A.used_recurr_amount, A.rounding_amount,
  153.         pDatetime, pUserId, pDatetime, pUserId, 0
  154.     FROM tt_gl_journal_formula_recurring A
  155.     WHERE A.session_id = pSessionId;
  156.    
  157.     INSERT INTO gl_admin_process_formula
  158.     (tenant_id, ou_id, journal_formula_id, journal_trx_id,
  159.     year_month, flag_process, process_datetime, process_user_id,
  160.     version, create_datetime, create_user_id, update_datetime, update_user_id)            
  161.     SELECT pTenantId, pOuId , A.journal_formula_id, NEXTVAL('gl_journal_trx_seq'),
  162.            pYearMonth, 'Y', pDatetime, pUserId,
  163.            0, pDatetime, pUserId, pDatetime,pUserId
  164.     FROM tt_gl_journal_formula_recurring A
  165.     WHERE A.session_id = pSessionId
  166.     GROUP BY A.journal_formula_id;
  167.  
  168.     UPDATE tt_gl_journal_formula_recurring A SET journal_trx_id = B.journal_trx_id
  169.     FROM gl_admin_process_formula B
  170.     WHERE A.session_id = pSessionId AND
  171.         A.journal_formula_id = B.journal_formula_id AND
  172.         B.year_month = pYearMonth;
  173.                
  174.     UPDATE gl_journal_formula_process A SET flg_process = 'Y' , last_process = pYearMonth,
  175.                                             update_datetime = pDatetime, update_user_id = pUserId,
  176.                                             version = version + 1
  177.     FROM (SELECT journal_formula_id FROM tt_gl_journal_formula_recurring WHERE session_id = pSessionId GROUP BY journal_formula_id) B
  178.     WHERE A.journal_formula_id = B.journal_formula_id;
  179.          
  180.     INSERT INTO gl_journal_trx
  181.     (journal_trx_id, tenant_id, journal_type, doc_type_id, doc_id, doc_no, doc_date,
  182.     ou_bu_id, ou_branch_id, ou_sub_bu_id, partner_id, cashbank_id, warehouse_id, ext_doc_no, ext_doc_date,  
  183.     ref_doc_type_id, ref_id, due_date, curr_code, remark, status_doc, workflow_status,
  184.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  185.     SELECT B.journal_trx_id, A.tenant_id, vJournalTypeRecurring, vDocTypeIdRecurring, B.journal_trx_id,
  186.         'JR'||'/'||A.journal_formula_id||'/'|| pYearMonth, vEomDate,   
  187.         A.ou_id, A.ou_branch_id, A.sub_ou_id, vPartnerId, vCashBankId, vWarehouseId, vExtDocNo, vExtDocDate,
  188.         vEmptyId, A.journal_formula_id, vEomDate,
  189.         f_get_value_system_config_by_param_code(A.tenant_id, 'ValutaBuku'), A.formula_desc, vStatusDraft, 'DRAFT',
  190.         0, pDatetime, pUserId, pDatetime, pUserId
  191.     FROM gl_journal_formula A,
  192.         (SELECT journal_trx_id, journal_formula_id FROM tt_gl_journal_formula_recurring WHERE session_id = pSessionId) B
  193.     WHERE A.journal_formula_id = B.journal_formula_id;
  194.          
  195.     INSERT INTO tt_journal_trx_item
  196.     (session_id, tenant_id, journal_trx_id, line_no,
  197.     ref_doc_type_id, ref_id,
  198.     partner_id, product_id, cashbank_id, ou_rc_id,
  199.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  200.     coa_id, curr_code, qty, uom_id,
  201.     amount, journal_date, type_rate,
  202.     numerator_rate, denominator_rate, journal_desc, remark)
  203.     SELECT pSessionId, A.tenant_id, A.journal_trx_id, A.line_no,
  204.         vEmptyId, A.journal_formula_recurring_id,
  205.         vEmptyId, vEmptyId, vEmptyId, A.ou_rc_id,
  206.         vEmptyId, A.sign_journal, vFLAG_SOURCE_COA, vEmptyId,
  207.         A.coa_id, f_get_value_system_config_by_param_code(A.tenant_id, 'ValutaBuku'), 0, vEmptyId,
  208.         A.used_recurr_amount + A.rounding_amount, vEomDate, vTypeRate,
  209.         1, 1, 'JV_RECURR_TARGET', A.remark
  210.     FROM tt_gl_journal_formula_recurring A
  211.     WHERE A.session_id = pSessionId;
  212.        
  213.      --- Step 8 : tulis ke gl_journal_trx_item 
  214.     INSERT INTO gl_journal_trx_item
  215.     (tenant_id, journal_trx_id, line_no,
  216.     ref_doc_type_id, ref_id,
  217.     partner_id, product_id, cashbank_id, ou_rc_id,
  218.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  219.     coa_id, curr_code, qty, uom_id,
  220.     amount, journal_date, type_rate,
  221.     numerator_rate, denominator_rate, gl_curr_code, gl_amount, journal_desc, remark,
  222.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  223.     SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id),
  224.         A.ref_doc_type_id, A.ref_id,
  225.         A.partner_id, A.product_id, A.cashbank_id, A.ou_rc_id,
  226.         A.segmen_id, A.sign_journal, A.flg_source_coa, A.activity_gl_id,
  227.         A.coa_id, A.curr_code, A.qty, A.uom_id,
  228.         A.amount, A.journal_date, A.type_rate,
  229.         A.numerator_rate, A.denominator_rate, A.curr_code, A.amount, A.journal_desc, A.remark,
  230.         0, pDatetime, pUserId, pDatetime, pUserId
  231.     FROM tt_journal_trx_item A
  232.     WHERE A.session_id = pSessionId;
  233.  
  234.      --- Step 9 : tulis ke gl_journal_trx_mapping      
  235.     INSERT INTO gl_journal_trx_mapping
  236.     (tenant_id, journal_trx_id, line_no,
  237.     ref_doc_type_id, ref_id,
  238.     partner_id, product_id, cashbank_id, ou_rc_id,
  239.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  240.     coa_id, curr_code, qty, uom_id,
  241.     amount, journal_date, type_rate,
  242.     numerator_rate, denominator_rate, gl_curr_code, gl_amount, journal_desc, remark,
  243.     "version", create_datetime, create_user_id, update_datetime, update_user_id)       
  244.     SELECT B.tenant_id, B.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY B.journal_trx_id),
  245.         vEmptyId, A.journal_formula_id,
  246.         vEmptyId, vEmptyId, vEmptyId, A.ou_rc_id,
  247.         vEmptyId, A.sign_journal, vFLAG_SOURCE_COA, vEmptyId,
  248.         A.coa_id, recurring_curr_code, 0, vEmptyId,
  249.         B.amount,      
  250.         vEomDate,
  251.         vTypeRate,
  252.         1, 1, f_get_value_system_config_by_param_code(B.tenant_id, 'ValutaBuku'),
  253.         B.amount,
  254.         'JV_RECURR_MAPPING', A.remark,
  255.         0, pDatetime, pUserId, pDatetime, pUserId
  256.     FROM gl_journal_formula_mapping A,
  257.         (SELECT tenant_id, journal_trx_id, journal_formula_id, recurring_curr_code, SUM(used_recurr_amount + rounding_amount) AS amount
  258.         FROM tt_gl_journal_formula_recurring
  259.         WHERE session_id = pSessionId
  260.         GROUP BY tenant_id, journal_trx_id, journal_formula_id, recurring_curr_code) B
  261.     WHERE A.journal_formula_id = B.journal_formula_id;
  262.  
  263.     DELETE FROM tt_journal_trx_item WHERE session_id = pSessionId;
  264.                
  265.     DELETE FROM tt_gl_journal_formula_recurring WHERE  session_id = pSessionId;
  266.    
  267.  END;
  268. $BODY$
  269.   LANGUAGE plpgsql VOLATILE
  270.   COST 100;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement