Advertisement
aadddrr

gl_process_journal_formula_recurring_201808201516

Aug 20th, 2018
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * Adrian, Aug 16, 2018
  3.  */
  4.  
  5. CREATE OR REPLACE FUNCTION gl_process_journal_formula_recurring(bigint, character varying, character varying)
  6.   RETURNS void AS
  7. $BODY$
  8. DECLARE
  9.    
  10.     pTenantId           ALIAS FOR $1;
  11.     pSessionId          ALIAS FOR $2;
  12.     pProcessNo          ALIAS FOR $3;
  13.    
  14.     vProcessId              bigint;
  15.     vJournalFormulaId       bigint;
  16.     vYearMonth              character varying(6);
  17.     vUserId                 bigint;
  18.     vDatetime               character varying(14);
  19.     vJournalVoucherDocNo    character varying;
  20.    
  21.     vEmptyId                bigint;
  22.     vRoundingAmount         integer;
  23.     vEmptyValue             character varying(1);
  24.     vNo                     character varying(1);
  25.     vYes                    character varying(1);
  26.     vFinal                  character varying(1);
  27.     vOuId                   bigint;
  28.     vGlLedgerCode           character varying;
  29.     vStatusLedgerDone       character varying;
  30.     vExtDocNo               character varying;
  31.     vExtDocDate             character varying;
  32.     vPeriod                 bigint;
  33.    
  34.     vJournalTypeJournalVoucher  character varying(20);
  35.     vDocTypeIdJournalVOucher    bigint;
  36.     vStatusDraft                character varying(1);
  37.     vTypeRate                   character varying(3);
  38.     vFLAG_SOURCE_COA            character varying(3);
  39.     vEomDate                    character varying(8);
  40.     vJournalTrxId               bigint;
  41.  
  42. BEGIN
  43.    
  44.     vEmptyId := -99;   
  45.     vEmptyValue := ' ';
  46.     vNo := 'N';
  47.     vYes := 'Y';
  48.     vFinal := 'F';
  49.     vGlLedgerCode := 'GL';
  50.     vStatusLedgerDone := '1';
  51.     vTypeRate := 'COM';
  52.     vStatusDraft := 'D';
  53.     vDocTypeIdJournalVoucher := 721;
  54.     vFLAG_SOURCE_COA := 'COA';
  55.    
  56.     SELECT A.process_message_id INTO vProcessId
  57.     FROM t_process_message A
  58.     WHERE A.tenant_id = pTenantId AND
  59.         A.process_name = 'gl_process_journal_formula_recurring' AND
  60.         A.process_no = pProcessNo;
  61.        
  62.     SELECT CAST(A.process_parameter_value AS bigint) INTO vJournalFormulaId
  63.     FROM t_process_parameter A
  64.     WHERE A.process_message_id = vProcessId AND
  65.         A.process_parameter_key = 'journalFormulaId';
  66.        
  67.     SELECT CAST(A.process_parameter_value AS character varying(6)) INTO vYearMonth
  68.     FROM t_process_parameter A
  69.     WHERE A.process_message_id = vProcessId AND
  70.         A.process_parameter_key = 'yearMonth';
  71.        
  72.         SELECT CAST(A.process_parameter_value AS bigint) INTO vUserId
  73.     FROM t_process_parameter A
  74.     WHERE A.process_message_id = vProcessId AND
  75.         A.process_parameter_key = 'userId';
  76.  
  77.     SELECT CAST(A.process_parameter_value AS character varying(14)) INTO vDatetime
  78.     FROM t_process_parameter A
  79.     WHERE A.process_message_id = vProcessId AND
  80.         A.process_parameter_key = 'datetime';
  81.  
  82.     SELECT CAST(A.process_parameter_value AS character varying) INTO vJournalVoucherDocNo
  83.     FROM t_process_parameter A
  84.     WHERE A.process_message_id = vProcessId AND
  85.         A.process_parameter_key = 'journalVoucherDocNo';
  86.    
  87.     vRoundingAmount := CAST(f_get_value_system_config_by_param_code(pTenantId,'rounding.gl.amount') AS integer);   
  88.    
  89.     vEomDate := TO_CHAR(TO_DATE(vYearMonth||'01','YYYYMMDD') + INTERVAL '1 MONTH - 1 DAY', 'YYYYMMDD');
  90.    
  91.     SELECT journal_type FROM m_document_journal WHERE doc_type_id = vDocTypeIdJournalVoucher INTO vJournalTypeJournalVoucher;
  92.    
  93.     SELECT NEXTVAL('gl_journal_trx_seq') INTO vJournalTrxId;
  94.    
  95.    
  96.    
  97.     DELETE FROM tt_journal_trx_item WHERE session_id = pSessionId;
  98.                
  99.     DELETE FROM tt_gl_journal_formula_recurring WHERE  session_id = pSessionId;
  100.    
  101.    
  102.     -- Validasi Journal Formula ada
  103.     SELECT A.ou_id, A.ext_doc_no, A.ext_doc_date
  104.     INTO vOuId, vExtDocNo, vExtDocDate
  105.     FROM gl_journal_formula A
  106.     WHERE A.journal_formula_id = vJournalFormulaId
  107.         AND A.tenant_id = pTenantId
  108.         AND A.flg_validate = vYes;
  109.        
  110.     IF NOT FOUND THEN
  111.         RAISE EXCEPTION 'Journal Formula Recurring is not found or is not valid yet';
  112.     END IF;
  113.    
  114.     -- Validasi belum tutup bulan
  115.     IF EXISTS (SELECT 1 FROM m_admin_process_ledger e, m_ou_structure f
  116.         WHERE e.tenant_id = pTenantId AND e.ou_id = f.ou_bu_id AND f.ou_id = vOuId AND
  117.             e.date_year_month = vYearMonth AND e.ledger_code = vGlLedgerCode
  118.             AND e.status_ledger = vStatusLedgerDone) THEN
  119.         RAISE EXCEPTION 'Ledger GL for OU % and Period % already closed', vOuId, vYearMonth;
  120.     END IF;
  121.    
  122.     -- Validasi Journal Formula untuk bulan tersebut belum diproses
  123.     IF EXISTS (SELECT 1 FROM gl_admin_process_formula A
  124.         WHERE A.journal_formula_id = vJournalFormulaId
  125.             AND A.year_month = vYearMonth) THEN
  126.         RAISE EXCEPTION 'Journal Formula Recurring with Id % and Period % already processed', vJournalFormulaId, vYearMonth;
  127.     END IF;
  128.    
  129.      -- Insert detail recurring ke table temp
  130.     INSERT INTO tt_gl_journal_formula_recurring(
  131.             session_id, journal_formula_recurring_id, tenant_id, journal_formula_id,
  132.             line_no, recurring_curr_code, recurring_amount, recurring_rate_date,
  133.             sign_journal, ou_branch_id, sub_ou_id, coa_id, ou_rc_id, segment_id,
  134.             amount_factor_x, amount_factor_y, remark,
  135.             used_recurr_amount,
  136.             balance_used_amount, rounding_amount,
  137.             start_periode, end_periode, journal_trx_id)
  138.     SELECT pSessionId, C.journal_formula_recurring_id, C.tenant_id, C.journal_formula_id,
  139.             C.line_no, C.recurring_curr_code, C.recurring_amount, C.recurring_rate_date,
  140.             C.sign_journal, C.ou_branch_id, C.sub_ou_id, C.coa_id, C.ou_rc_id, C.segment_id,
  141.             C.amount_factor_x, C.amount_factor_y, C.remark,
  142.             CASE WHEN ROUND(C.recurring_amount * C.amount_factor_x / C.amount_factor_y, vRoundingAmount) > D.beg_recurr_amount THEN
  143.                 D.beg_recurr_amount
  144.             ELSE
  145.                 ROUND(C.recurring_amount * C.amount_factor_x / C.amount_factor_y, vRoundingAmount)
  146.             END,
  147.             0, 0,
  148.             B.start_periode, B.end_periode, vEmptyId
  149.     FROM gl_journal_formula A INNER JOIN gl_journal_formula_process B ON A.journal_formula_id = B.journal_formula_id
  150.                             INNER JOIN gl_journal_formula_recurring C ON A.journal_formula_id = C.journal_formula_id
  151.                             LEFT JOIN gl_journal_formula_recurring_balance D ON C.tenant_id = D.tenant_id AND C.journal_formula_recurring_id = D.journal_formula_recurring_id
  152.     WHERE A.tenant_id = pTenantId AND
  153.         A.flg_validate = vYes AND
  154.         vYearMonth BETWEEN B.start_periode AND B.end_periode AND
  155.         A.journal_formula_id = vJournalFormulaId AND
  156.         NOT EXISTS ( SELECT 1 FROM gl_admin_process_formula E
  157.                     WHERE  E.tenant_id = A.tenant_id AND  
  158.                             E.journal_formula_id = A.journal_formula_id AND
  159.                             E.year_month = vYearMonth AND
  160.                             E.flag_process = vYes);
  161.    
  162.      -- Update saldo terakhir ke table temp
  163.     UPDATE tt_gl_journal_formula_recurring A SET balance_used_amount = B.recurr_on_the_road
  164.     FROM gl_journal_formula_recurring_balance B
  165.     WHERE A.session_id = pSessionId AND
  166.         A.journal_formula_recurring_id = B.journal_formula_recurring_id;
  167.    
  168.     -- Untuk periode terakhir, Jika x * periode / y = 1, hitung pembulatan
  169.     SELECT CAST(DATE_PART('YEAR',
  170.         AGE(TO_TIMESTAMP(A.end_periode, 'YYYYMM'), TO_TIMESTAMP(A.start_periode, 'YYYYMM'))
  171.     ) * 12 + DATE_PART('MONTH',
  172.         AGE(TO_TIMESTAMP(A.end_periode, 'YYYYMM'), TO_TIMESTAMP(A.start_periode, 'YYYYMM'))
  173.     ) + 1 AS bigint)
  174.     FROM gl_journal_formula_process A
  175.     WHERE A.journal_formula_id = vJournalFormulaId
  176.     INTO vPeriod;
  177.    
  178.     UPDATE tt_gl_journal_formula_recurring A SET rounding_amount = recurring_amount - used_recurr_amount - balance_used_amount
  179.     WHERE A.session_id = pSessionId AND
  180.         A.end_periode = vYearMonth AND
  181.         (A.amount_factor_x * vPeriod / A.amount_factor_y) = 1;
  182.        
  183.    
  184.        
  185.     -- Update balance untuk nilai used amount, dan sisa bulan
  186.     -- untuk process yang sudah pernah dijalankan
  187.     UPDATE gl_journal_formula_recurring_balance A SET used_recurr_amount = B.used_recurr_amount + B.rounding_amount,
  188.                                                         rest_of_month = A.rest_of_month - 1,
  189.                                                         recurr_on_the_road = A.recurr_on_the_road + B.used_recurr_amount + B.rounding_amount,
  190.                                                         total_rounding_amount = A.total_rounding_amount + B.rounding_amount,
  191.                                                         beg_recurr_amount = A.beg_recurr_amount - B.used_recurr_amount - B.rounding_amount,
  192.                                                         update_datetime = vDatetime,
  193.                                                         update_user_id = vUserId,
  194.                                                         version = version + 1
  195.     FROM tt_gl_journal_formula_recurring B
  196.     WHERE B.session_id = pSessionId AND
  197.         A.journal_formula_id = B.journal_formula_id AND
  198.         A.journal_formula_recurring_id = B.journal_formula_recurring_id AND
  199.         --B.start_periode <> vYearMonth
  200.         EXISTS (
  201.             SELECT 1
  202.             FROM gl_journal_formula_recurring_balance Z
  203.             WHERE Z.tenant_id = B.tenant_id
  204.                 AND Z.journal_formula_recurring_id = B.journal_formula_recurring_id
  205.         );
  206.    
  207.     -- Insert saldo untuk process pertama kali
  208.     INSERT INTO gl_journal_formula_recurring_balance(
  209.             tenant_id, journal_formula_recurring_id, journal_formula_id,
  210.             beg_recurr_amount, used_recurr_amount,
  211.             rest_of_month,
  212.             recurr_on_the_road, total_rounding_amount,
  213.             create_datetime, create_user_id, update_datetime, update_user_id, version)
  214.     SELECT A.tenant_id, A.journal_formula_recurring_id, A.journal_formula_id,
  215.             A.recurring_amount - (A.used_recurr_amount + A.rounding_amount), A.used_recurr_amount + A.rounding_amount,
  216.             DATE_PART('YEAR',
  217.                 AGE(TO_TIMESTAMP(A.end_periode, 'YYYYMM'), TO_TIMESTAMP(A.start_periode, 'YYYYMM'))
  218.             ) * 12 + DATE_PART('MONTH',
  219.                 AGE(TO_TIMESTAMP(A.end_periode, 'YYYYMM'), TO_TIMESTAMP(A.start_periode, 'YYYYMM'))
  220.             ),
  221.             A.used_recurr_amount + A.rounding_amount , A.rounding_amount,
  222.             vDatetime, vUserId, vDatetime, vUserId, 0          
  223.     FROM tt_gl_journal_formula_recurring A
  224.     WHERE A.session_id = pSessionId AND
  225.         --A.start_periode = vYearMonth
  226.         NOT EXISTS (
  227.             SELECT 1
  228.             FROM gl_journal_formula_recurring_balance Z
  229.             WHERE Z.tenant_id = A.tenant_id
  230.                 AND Z.journal_formula_recurring_id = A.journal_formula_recurring_id
  231.         );
  232.  
  233.     -- Insert log recurring
  234.     INSERT INTO gl_log_journal_formula_recurring_balance
  235.     (tenant_id, journal_formula_recurring_id,
  236.     journal_formula_id, year_month, used_recurr_amount, rounding_amount,
  237.     create_datetime, create_user_id, update_datetime, update_user_id, version)
  238.     SELECT A.tenant_id, A.journal_formula_recurring_id,
  239.         A.journal_formula_id, vYearMonth, A.used_recurr_amount + A.rounding_amount, A.rounding_amount,
  240.         vDatetime, vUserId, vDatetime, vUserId, 0
  241.     FROM tt_gl_journal_formula_recurring A
  242.     WHERE A.session_id = pSessionId;
  243.    
  244.     -- Insert admin process formula
  245.     INSERT INTO gl_admin_process_formula
  246.     (tenant_id, ou_id, journal_formula_id, journal_trx_id,
  247.     year_month, flag_process, process_datetime, process_user_id,
  248.     version, create_datetime, create_user_id, update_datetime, update_user_id)            
  249.     SELECT pTenantId, vOuId , A.journal_formula_id, vJournalTrxId,
  250.            vYearMonth, vYes, vDatetime, vUserId,
  251.            0, vDatetime, vUserId, vDatetime,vUserId
  252.     FROM tt_gl_journal_formula_recurring A
  253.     WHERE A.session_id = pSessionId
  254.     GROUP BY A.journal_formula_id;
  255.  
  256.     -- Update journal_trx_id pada table temp
  257.     UPDATE tt_gl_journal_formula_recurring A SET journal_trx_id = vJournalTrxId
  258.     WHERE A.session_id = pSessionId;
  259.            
  260.     -- Update gl_journal_formula_process
  261.     UPDATE gl_journal_formula_process A SET flg_process = vYes, last_process = vYearMonth,
  262.                                             update_datetime = vDatetime, update_user_id = vUserId,
  263.                                             version = version + 1
  264.     WHERE A.journal_formula_id = vJournalFormulaId;
  265.    
  266.     -- Update flg_process pada gl_journal_formula_process menjadi Final
  267.     -- Jika last_process = end_periode
  268.     UPDATE gl_journal_formula_process A SET flg_process = vFinal
  269.     WHERE A.journal_formula_id = vJournalFormulaId
  270.         AND A.last_process = A.end_periode;
  271.          
  272.     -- Insert header Journal Voucher
  273.     INSERT INTO gl_journal_trx
  274.     (journal_trx_id, tenant_id, journal_type, doc_type_id, doc_id,
  275.     doc_no, doc_date,
  276.     ou_bu_id, ou_branch_id, ou_sub_bu_id, partner_id, cashbank_id, warehouse_id, ext_doc_no, ext_doc_date,  
  277.     ref_doc_type_id, ref_id, due_date,
  278.     curr_code, remark, status_doc, workflow_status,
  279.     flg_fix, flg_validate,
  280.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  281.     SELECT vJournalTrxId, A.tenant_id, vJournalTypeJournalVoucher, vDocTypeIdJournalVoucher, vEmptyId,
  282.         vJournalVoucherDocNo, vEomDate,    
  283.         A.ou_id, A.ou_branch_id, A.sub_ou_id, vEmptyId, vEmptyId, vEmptyId, vExtDocNo, vExtDocDate,
  284.         vEmptyId, A.journal_formula_id, vEomDate,
  285.         f_get_value_system_config_by_param_code(A.tenant_id, 'ValutaBuku'), A.formula_name || ' - ' || A.formula_desc, vStatusDraft, 'DRAFT',
  286.         vNo, vYes,
  287.         0, vDatetime, vUserId, vDatetime, vUserId
  288.     FROM gl_journal_formula A
  289.     WHERE A.journal_formula_id = vJournalFormulaId;
  290.    
  291.    
  292.     INSERT INTO tt_journal_trx_item
  293.     (session_id, tenant_id, journal_trx_id, line_no,
  294.     ref_doc_type_id, ref_id,
  295.     partner_id, product_id, cashbank_id, ou_rc_id,
  296.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  297.     coa_id, curr_code, qty, uom_id,
  298.     amount, journal_date, type_rate,
  299.     numerator_rate, denominator_rate, journal_desc, remark,
  300.     ou_id, sub_ou_id)
  301.     SELECT pSessionId, A.tenant_id, A.journal_trx_id, A.line_no,
  302.         vEmptyId, A.journal_formula_recurring_id,
  303.         vEmptyId, vEmptyId, vEmptyId, A.ou_rc_id,
  304.         vEmptyId, A.sign_journal, vFLAG_SOURCE_COA, vEmptyId,
  305.         A.coa_id, f_get_value_system_config_by_param_code(A.tenant_id, 'ValutaBuku'), 0, vEmptyId,
  306.         A.used_recurr_amount + A.rounding_amount, vEomDate, vTypeRate,
  307.         1, 1, 'JF.' || vYearMonth, A.remark,
  308.         A.ou_branch_id, A.sub_ou_id
  309.     FROM tt_gl_journal_formula_recurring A
  310.     WHERE A.session_id = pSessionId AND
  311.         A.used_recurr_amount + A.rounding_amount <> 0;
  312.    
  313.     -- Insert item Journal Voucher
  314.     -- Untuk mapping Journal Formula Recurring 
  315.     INSERT INTO gl_journal_trx_item
  316.     (tenant_id, journal_trx_id, line_no,
  317.     ref_doc_type_id, ref_id,
  318.     partner_id, product_id, cashbank_id, ou_rc_id,
  319.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  320.     coa_id, curr_code, qty, uom_id,
  321.     amount, journal_date, type_rate,
  322.     numerator_rate, denominator_rate, gl_curr_code, gl_amount, journal_desc, remark,
  323.     "version", create_datetime, create_user_id, update_datetime, update_user_id,
  324.     ou_branch_id, ou_sub_bu_id)
  325.     SELECT B.tenant_id, B.journal_trx_id, 1,
  326.         vEmptyId, A.journal_formula_mapping_id,
  327.         vEmptyId, vEmptyId, vEmptyId, A.ou_rc_id,
  328.         A.segment_id, A.sign_journal, vFLAG_SOURCE_COA, vEmptyId,
  329.         A.coa_id, B.recurring_curr_code, 0, vEmptyId,
  330.         B.amount, vEomDate, vTypeRate,
  331.         1, 1, B.recurring_curr_code, B.amount, 'JF.' || vYearMonth, A.remark,
  332.         0, vDatetime, vUserId, vDatetime, vUserId,
  333.         A.ou_branch_id, A.sub_ou_id
  334.     FROM gl_journal_formula_mapping A,
  335.         (SELECT tenant_id, journal_trx_id, journal_formula_id, recurring_curr_code, SUM(used_recurr_amount + rounding_amount) AS amount
  336.         FROM tt_gl_journal_formula_recurring
  337.         WHERE session_id = pSessionId
  338.         GROUP BY tenant_id, journal_trx_id, journal_formula_id, recurring_curr_code) B
  339.     WHERE A.journal_formula_id = B.journal_formula_id AND
  340.         B.amount <> 0;
  341.        
  342.     -- Insert item Journal Voucher
  343.     -- Untuk detail Journal Formula Recurring  
  344.     INSERT INTO gl_journal_trx_item
  345.     (tenant_id, journal_trx_id, line_no,
  346.     ref_doc_type_id, ref_id,
  347.     partner_id, product_id, cashbank_id, ou_rc_id,
  348.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  349.     coa_id, curr_code, qty, uom_id,
  350.     amount, journal_date, type_rate,
  351.     numerator_rate, denominator_rate, gl_curr_code, gl_amount, journal_desc, remark,
  352.     "version", create_datetime, create_user_id, update_datetime, update_user_id,
  353.     ou_branch_id, ou_sub_bu_id)
  354.     SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id) + 1,
  355.         A.ref_doc_type_id, A.ref_id,
  356.         A.partner_id, A.product_id, A.cashbank_id, A.ou_rc_id,
  357.         A.segmen_id, A.sign_journal, A.flg_source_coa, A.activity_gl_id,
  358.         A.coa_id, A.curr_code, A.qty, A.uom_id,
  359.         A.amount, A.journal_date, A.type_rate,
  360.         A.numerator_rate, A.denominator_rate, A.curr_code, A.amount, A.journal_desc, A.remark,
  361.         0, vDatetime, vUserId, vDatetime, vUserId,
  362.         A.ou_id, A.sub_ou_id
  363.     FROM tt_journal_trx_item A
  364.     WHERE A.session_id = pSessionId;
  365.  
  366.     DELETE FROM tt_journal_trx_item WHERE session_id = pSessionId;
  367.                
  368.     DELETE FROM tt_gl_journal_formula_recurring WHERE  session_id = pSessionId;
  369.    
  370.  END;
  371. $BODY$
  372.   LANGUAGE plpgsql VOLATILE
  373.   COST 100;
  374.  /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement