Advertisement
aadddrr

in_process_costing_raw_materials

Feb 5th, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION in_process_costing_raw_materials(bigint, character varying, character varying, bigint, character varying, bigint)
  2.   RETURNS void AS
  3. $BODY$
  4. DECLARE
  5.  
  6.     pTenantId           ALIAS FOR $1;
  7.     pSessionId          ALIAS FOR $2;
  8.     pYearMonth          ALIAS FOR $3;
  9.     pOuId               ALIAS FOR $4;
  10.     pDatetime           ALIAS FOR $5;
  11.     pUserId             ALIAS FOR $6;
  12.  
  13.     vNextYearMonth          character varying(6);
  14.     vCurrGL                 character varying(5);
  15.     vFlagNo                 character varying(1);
  16.     vFlagYes                character varying(1);
  17.     vEmptyValue             character varying(1);
  18.     vEmptyId                bigint;
  19.     vDocTypeAwal            bigint;
  20.     vGroupProductFG         character varying(5);
  21.     vGroupProductRM         character varying(5);
  22.     vRoundingDigit          integer;
  23.     vTypeRate               character varying(5);
  24.     vStatusRelease          character varying(1);
  25. BEGIN
  26.    
  27.     vFlagNo := 'N';
  28.     vFlagYes := 'Y';
  29.     vDocTypeAwal := -99;
  30.     vEmptyId := -99;
  31.     vEmptyValue := ' ';
  32.     vGroupProductFG := 'FG';
  33.     vGroupProductRM := 'RM';
  34.     vTypeRate := 'COM';
  35.     vStatusRelease := 'R';
  36.    
  37.     SELECT TO_CHAR(TO_DATE(MAX(pYearMonth),'YYYYMM') + interval '1 Month','YYYYMM') INTO vNextYearMonth;
  38.    
  39.     vCurrGL := f_get_value_system_config_by_param_code(pTenantId,'ValutaBuku');
  40.     vRoundingDigit := CAST(f_get_value_system_config_by_param_code(pTenantId,'rounding.gl.amount') AS integer);
  41.  
  42.     DELETE FROM tt_in_doc_product_price WHERE session_id = pSessionId;
  43.    
  44.     DELETE FROM tt_in_add_product_unamount WHERE session_id = pSessionId;
  45.    
  46.     DELETE FROM tt_in_product_base_price WHERE session_id = pSessionId;
  47.    
  48.     DELETE FROM tt_in_summary_monthly_product WHERE session_id = pSessionId;
  49.    
  50.     DELETE FROM tt_in_summary_monthly_cogs WHERE session_id = pSessionId;
  51.    
  52.     DELETE FROM tt_in_summary_monthly_amount_remain WHERE session_id = pSessionId;
  53.    
  54.     /*
  55.      * costing product hanya berdasarkan ou business unit ( artinya tbl cogs hanya ada ou_id )
  56.      */
  57.    
  58.     /*
  59.      * membuat summary nilai pembelian berdasarkan hasil jurnal
  60.      * untuk transaksi receive goods
  61.      * NK, 16 Feb 2015 : Pembelian Internal menghasilkan dokumen semua sesuai doc type Receive Goods
  62.      * Receive Goods : 111
  63.      */
  64.     INSERT INTO in_summary_monthly_amount
  65.     (date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  66.     doc_type_id, product_id, base_uom_id, qty,
  67.     gl_curr_code, gl_amount, flg_amount,
  68.     "version", create_datetime, create_user_id, update_datetime, update_user_id, remark)
  69.     SELECT pYearMonth, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  70.         A.doc_type_id, C.product_id, C.uom_id, SUM(C.qty),
  71.         C.gl_curr_code, SUM(C.gl_amount), 'PURCH_PRICE',
  72.         0, pDatetime, pUserId, pDatetime, pUserId, vGroupProductRM
  73.     FROM gl_journal_trx A, dt_date B, gl_journal_trx_item C, m_document_journal D, vw_raw_materials_product E
  74.     WHERE A.tenant_id = pTenantId AND
  75.         A.ou_bu_id = pOuId AND
  76.         A.status_doc = vStatusRelease AND
  77.         A.doc_date = B.string_date AND
  78.         B.year_month_date = pYearMonth AND
  79.         A.journal_trx_id = C.journal_trx_id AND
  80.         A.doc_type_id = D.doc_type_id AND
  81.         D.ledger_code IN ('PURCH') AND
  82.         C.journal_desc = 'PRODUCT_STOCK' AND
  83.         A.doc_type_id IN (111) AND
  84.         C.product_id = E.product_id
  85.     GROUP BY A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id, A.doc_type_id, C.product_id, C.uom_id, C.gl_curr_code;
  86.  
  87.     /*
  88.      * ambil data receive goods dari in_summary_monthly_amount yang product Raw Materials
  89.      * NK, 16 Feb 2015 : receive goods internal menggunakan doc type receive goods
  90.      */        
  91.     INSERT INTO tt_in_doc_product_price
  92.     (session_id, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id, product_id,
  93.      doc_type_id, ref_id, doc_no, doc_date,
  94.      curr_code, amount, qty, uom_id,
  95.      numerator_rate, denominator_rate,
  96.      gl_curr_code, gl_amount)
  97.     SELECT pSessionId, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id, A.product_id,
  98.         A.doc_type_id, vEmptyId, vEmptyValue, vEmptyValue,
  99.         A.gl_curr_code, A.gl_amount, A.qty, A.base_uom_id,
  100.         1, 1,
  101.         A.gl_curr_code, A.gl_amount
  102.     FROM in_summary_monthly_amount A, vw_raw_materials_product E
  103.     WHERE A.date_year_month = pYearMonth AND
  104.         A.doc_type_id IN (111) AND
  105.         A.tenant_id = pTenantId AND
  106.         A.ou_bu_id = pOuId AND
  107.         A.product_id = E.product_id;   
  108.        
  109.     /*
  110.      * ambil data adjusment stok amount
  111.      * jika curr <> curr G/L, maka lakukan hitung rate untuk ke nilai sesuai valuta G/L
  112.      * 522 : adj stock amount ( mempengaruhi COGS )
  113.      * 523 : adj stock amount balance ( mempengaruhi saldo akhir )
  114.      * 528 : costing allocation to product ( mempengaruhi COGS )
  115.      */
  116.     INSERT INTO tt_in_doc_product_price
  117.     (session_id, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id, product_id,
  118.      doc_type_id, ref_id, doc_no, doc_date,
  119.      curr_code, amount, qty, uom_id,
  120.      numerator_rate, denominator_rate,
  121.      gl_curr_code, gl_amount)
  122.     SELECT pSessionId, A.tenant_id, B.ou_bu_id, B.ou_branch_id, B.ou_sub_bu_id, A.product_id,
  123.         A.doc_type_id, A.ref_id, A.doc_no, A.doc_date,
  124.         A.curr_code, A.amount, A.qty, A.uom_id,
  125.         1, 1, vCurrGL, ROUND( A.amount, vRoundingDigit)
  126.     FROM in_product_price_balance A, m_ou_structure B, dt_date C, vw_raw_materials_product E
  127.     WHERE A.doc_date = C.string_date AND
  128.         C.year_month_date = pYearMonth AND
  129.         A.tenant_id = pTenantId AND
  130.         A.ou_id = B.ou_id AND
  131.         B.ou_bu_id = pOuId AND
  132.         A.doc_type_id IN (522, 523, 528) AND
  133.         A.product_id = E.product_id;   
  134.    
  135.     -- hitung nilai pembukuan untuk transaksi adjusment stok amount
  136.     UPDATE tt_in_doc_product_price SET numerator_rate = B.amount_to, denominator_rate = B.amount_from
  137.     FROM m_exchange_rate B
  138.     WHERE tt_in_doc_product_price.session_id = pSessionId AND
  139.         tt_in_doc_product_price.tenant_id = B.tenant_id AND
  140.         B.type_exchange_rate = vTypeRate AND
  141.         tt_in_doc_product_price.doc_date = B.date_from AND
  142.         tt_in_doc_product_price.curr_code = B.curr_code_from AND
  143.         tt_in_doc_product_price.gl_curr_code = B.curr_code_to AND
  144.         tt_in_doc_product_price.doc_type_id IN (522, 523, 528) AND
  145.         tt_in_doc_product_price.curr_code <> vCurrGL;
  146.  
  147.     UPDATE tt_in_doc_product_price SET gl_amount = ROUND(amount * numerator_rate / denominator_rate, vRoundingDigit)
  148.     WHERE tt_in_doc_product_price.session_id = pSessionId AND
  149.           tt_in_doc_product_price.doc_type_id IN (522, 523, 528) AND
  150.           tt_in_doc_product_price.curr_code <> vCurrGL;
  151.          
  152.     /*
  153.      * product non assembly
  154.      * ambil data transaksi yg tambah stok, tp belum memiliki nilai
  155.      * 1.return note : 502
  156.      * 2.adj stok qty plus : 521
  157.      * 3.adj stok outlet qty plus : 413
  158.      */
  159.     INSERT INTO tt_in_add_product_unamount
  160.     (session_id, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id, product_id,
  161.      doc_type_id, qty, uom_id, gl_curr_code, gl_amount, flg_amount)
  162.     SELECT pSessionId, A.tenant_id, B.ou_bu_id, B.ou_branch_id, B.ou_sub_bu_id, A.product_id,
  163.         A.doc_type_id, A.qty, A.base_uom_id, vCurrGL, 0, vEmptyValue
  164.     FROM in_log_product_balance_stock A, m_ou_structure B, dt_date C, vw_raw_materials_product E
  165.     WHERE A.ou_id = B.ou_id AND
  166.         B.ou_bu_id = pOuId AND
  167.         A.doc_date = C.string_date AND
  168.         C.year_month_date = pYearMonth AND
  169.         A.doc_type_id = 502 AND
  170.         A.product_id = E.product_id;   
  171.  
  172.     INSERT INTO tt_in_add_product_unamount
  173.     (session_id, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id, product_id,
  174.      doc_type_id, qty, uom_id, gl_curr_code, gl_amount, flg_amount)
  175.     SELECT pSessionId, A.tenant_id, B.ou_bu_id, B.ou_branch_id, B.ou_sub_bu_id, A.product_id,
  176.         A.doc_type_id, A.qty, A.base_uom_id, vCurrGL, 0, vEmptyValue
  177.     FROM in_log_product_balance_stock A, m_ou_structure B, dt_date C, vw_raw_materials_product E
  178.     WHERE A.ou_id = B.ou_id AND
  179.         B.ou_bu_id = pOuId AND
  180.         A.doc_date = C.string_date AND
  181.         C.year_month_date = pYearMonth AND
  182.         A.doc_type_id IN ( 521, 413 ) AND
  183.         A.product_id = E.product_id AND
  184.         A.qty > 0
  185.        
  186. /* NK, 25 Jan 2014, di submit adj stok qty diubah sehingga log product balance stock akan ada 2 kelompok,
  187.  * kelompok yang qty > 0 dan qty < 0
  188.                    
  189.     INSERT INTO tt_in_add_product_unamount
  190.     (session_id, tenant_id, ou_id, sub_ou_id, product_id,
  191.      doc_type_id, qty, uom_id, gl_curr_code, gl_amount, flg_amount)
  192.     SELECT pSessionId, A.tenant_id, D.ou_bu_id, D.ou_id, B.product_id,
  193.         A.doc_type_id, B.qty_realization, B.base_uom_id, vCurrGL, 0, vEmptyValue
  194.     FROM in_inventory A, in_inventory_item B, dt_date C, m_ou_structure D, vw_raw_materials_product E
  195.     WHERE A.tenant_id = pTenantId AND
  196.         A.doc_date = C.string_date AND
  197.         C.year_month_date = pYearMonth AND
  198.         A.inventory_id = B.inventory_id AND
  199.         A.ou_from_id = D.ou_id AND
  200.         D.ou_bu_id = pOuId AND
  201.         A.doc_type_id = 521 AND
  202.         B.qty_realization > 0 AND
  203.         B.product_id = E.product_id;   
  204.                    
  205.     INSERT INTO tt_in_add_product_unamount
  206.     (session_id, tenant_id, ou_id, sub_ou_id, product_id,
  207.      doc_type_id, qty, uom_id, gl_curr_code, gl_amount, flg_amount)
  208.     SELECT pSessionId, A.tenant_id, D.ou_bu_id, D.ou_id, B.product_id,
  209.         A.doc_type_id, B.qty_realization, B.base_uom_id, vCurrGL, 0, vEmptyValue
  210.     FROM i_trx_inventory A, i_trx_inventory_item B, dt_date C, m_ou_structure D, vw_raw_materials_product E
  211.     WHERE A.tenant_id = pTenantId AND
  212.         A.doc_date = C.string_date AND
  213.         C.year_month_date = pYearMonth AND
  214.         A.trx_inventory_id = B.trx_inventory_id AND
  215.         A.ou_id = D.ou_id AND
  216.         D.ou_bu_id = pOuId AND
  217.         A.doc_type_id = 413 AND
  218.         B.qty_realization > 0 AND
  219.         B.product_id = E.product_id;   
  220.  */
  221.     /*
  222.      * buat data yang akan menjadi acuan harga standard
  223.      * 1.data purch price di bulan bersangkutan
  224.      * 2.data nilai barang di awal bulan
  225.      * 3.data master harga standard
  226.      */
  227.     INSERT INTO tt_in_product_base_price
  228.     (session_id, tenant_id, ou_id, product_id,
  229.      flg_amount, qty, uom_id, gl_curr_code, gl_amount)
  230.     SELECT A.session_id, A.tenant_id, A.ou_bu_id, A.product_id,
  231.         'PURCH_PRICE', SUM(A.qty), A.uom_id, A.gl_curr_code, SUM(A.gl_amount)
  232.     FROM tt_in_doc_product_price A
  233.     WHERE A.session_id = pSessionId AND
  234.         A.doc_type_id IN (111)
  235.     GROUP BY A.session_id, A.tenant_id, A.ou_bu_id, A.product_id,
  236.         A.uom_id, A.gl_curr_code;
  237.    
  238.     INSERT INTO tt_in_product_base_price
  239.     (session_id, tenant_id, ou_id, product_id,
  240.      flg_amount, qty, uom_id, gl_curr_code, gl_amount)
  241.     SELECT pSessionId, A.tenant_id, A.ou_bu_id, A.product_id,
  242.         'BGN_BALANCE', SUM(A.qty), A.base_uom_id, A.gl_curr_code, SUM(A.gl_amount)
  243.     FROM in_summary_monthly_amount A, vw_raw_materials_product E
  244.     WHERE A.date_year_month = pYearMonth AND
  245.         A.doc_type_id = vDocTypeAwal AND
  246.         A.tenant_id = pTenantId AND
  247.         A.ou_bu_id = pOuId AND
  248.         A.product_id = E.product_id
  249.     GROUP BY A.tenant_id, A.ou_bu_id, A.product_id,
  250.         A.base_uom_id, A.gl_curr_code;
  251.    
  252.     INSERT INTO tt_in_product_base_price
  253.     (session_id, tenant_id, ou_id, product_id,
  254.      flg_amount, qty, uom_id, gl_curr_code, gl_amount)
  255.     SELECT pSessionId, A.tenant_id, A.ou_id, A.product_id,
  256.         'STANDARD_PRICE', 0, E.base_uom_id, A.curr_code, SUM(A.amount)
  257.     FROM in_product_standard_cogs A, vw_raw_materials_product E
  258.     WHERE A.tenant_id = pTenantId AND
  259.         A.ou_id = pOuId AND
  260.         A.year_month_date = pYearMonth AND
  261.         A.product_id = E.product_id
  262.     GROUP BY A.tenant_id, A.ou_id, A.product_id, A.curr_code, E.base_uom_id;
  263.    
  264.     /*
  265.      * isi nilai data tt_in_add_product_unamount dengan urutan :
  266.      * 1. update dengan data flg amount STANDARD_PRICE
  267.      * 2. jika belum ada, update dengan data flg amount BGN_BALANCE
  268.      * 3. jika belum ada, update dengan data flg amount PURCH_PRICE
  269.      */
  270.    
  271.     UPDATE tt_in_add_product_unamount SET gl_amount = tt_in_add_product_unamount.qty * A.gl_amount, flg_amount = A.flg_amount
  272.     FROM tt_in_product_base_price A
  273.     WHERE A.session_id = pSessionId AND
  274.         tt_in_add_product_unamount.session_id = A.session_id AND
  275.         tt_in_add_product_unamount.tenant_id = A.tenant_id AND
  276.         tt_in_add_product_unamount.ou_bu_id = A.ou_id AND
  277.         tt_in_add_product_unamount.product_id = A.product_id AND
  278.         tt_in_add_product_unamount.flg_amount = vEmptyValue AND
  279.         A.flg_amount = 'STANDARD_PRICE';
  280.    
  281.     UPDATE tt_in_add_product_unamount SET gl_amount = ROUND(tt_in_add_product_unamount.qty * ( A.gl_amount / A.qty ), vRoundingDigit), flg_amount = A.flg_amount
  282.     FROM tt_in_product_base_price A
  283.     WHERE A.session_id = pSessionId AND
  284.         tt_in_add_product_unamount.session_id = A.session_id AND
  285.         tt_in_add_product_unamount.tenant_id = A.tenant_id AND
  286.         tt_in_add_product_unamount.ou_bu_id = A.ou_id AND
  287.         tt_in_add_product_unamount.product_id = A.product_id AND
  288.         tt_in_add_product_unamount.flg_amount = vEmptyValue AND    
  289.         A.flg_amount = 'BGN_BALANCE';
  290.        
  291.     UPDATE tt_in_add_product_unamount SET gl_amount = ROUND(tt_in_add_product_unamount.qty * ( A.gl_amount / A.qty ), vRoundingDigit), flg_amount = A.flg_amount
  292.     FROM tt_in_product_base_price A
  293.     WHERE A.session_id = pSessionId AND
  294.         tt_in_add_product_unamount.session_id = A.session_id AND
  295.         tt_in_add_product_unamount.tenant_id = A.tenant_id AND
  296.         tt_in_add_product_unamount.ou_bu_id = A.ou_id AND
  297.         tt_in_add_product_unamount.product_id = A.product_id AND
  298.         tt_in_add_product_unamount.flg_amount = vEmptyValue AND    
  299.         A.flg_amount = 'PURCH_PRICE';
  300.  
  301.        
  302. /*
  303.  *  menghitung harga rata rata product (non assembly ) berdasarkan :
  304.  *  1. harga purchasing
  305.  *  2. harga adj stock amount ( bukan yg balance amount )
  306.  *  3. transaksi tambah stok qty, dengan harga sudah diproses : retur jual, adj stok qty > 0
  307.  *  4. harga saldo awal
  308.  */    
  309.     INSERT INTO tt_in_summary_monthly_product
  310.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  311.     doc_type_id, product_id, base_uom_id, qty,
  312.     gl_curr_code, gl_amount, flg_amount)
  313.     SELECT pSessionId, pYearMonth, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  314.         A.doc_type_id, A.product_id, A.uom_id, SUM(A.qty),
  315.         A.gl_curr_code, SUM(A.gl_amount), 'PURCH_PRICE'
  316.     FROM tt_in_doc_product_price A
  317.     WHERE A.session_id = pSessionId AND
  318.         A.doc_type_id IN (111)
  319.     GROUP BY A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id, A.doc_type_id, A.product_id, A.uom_id, A.gl_curr_code;
  320.    
  321.     INSERT INTO tt_in_summary_monthly_product
  322.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  323.     doc_type_id, product_id, base_uom_id, qty,
  324.     gl_curr_code, gl_amount, flg_amount)
  325.     SELECT pSessionId, pYearMonth, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  326.         A.doc_type_id, A.product_id, A.uom_id, SUM(A.qty),
  327.         A.gl_curr_code, SUM(A.gl_amount), 'TRANSACTION'
  328.     FROM tt_in_doc_product_price A
  329.     WHERE A.session_id = pSessionId AND
  330.         A.doc_type_id IN ( 522, 528 )
  331.     GROUP BY A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id, A.doc_type_id, A.product_id, A.uom_id, A.gl_curr_code;
  332.  
  333.     INSERT INTO tt_in_summary_monthly_product
  334.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  335.     doc_type_id, product_id, base_uom_id, qty,
  336.     gl_curr_code, gl_amount, flg_amount)
  337.     SELECT pSessionId, pYearMonth, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  338.         A.doc_type_id, A.product_id, A.uom_id, SUM(A.qty),
  339.         A.gl_curr_code, SUM(A.gl_amount), A.flg_amount
  340.     FROM tt_in_add_product_unamount A
  341.     WHERE A.session_id = pSessionId
  342.     GROUP BY A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id, A.doc_type_id, A.product_id, A.uom_id, A.gl_curr_code, A.flg_amount;
  343.  
  344.     INSERT INTO tt_in_summary_monthly_product
  345.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  346.     doc_type_id, product_id, base_uom_id, qty,
  347.     gl_curr_code, gl_amount, flg_amount)
  348.     SELECT pSessionId, pYearMonth, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  349.         A.doc_type_id, A.product_id, A.base_uom_id, SUM(A.qty),
  350.         A.gl_curr_code, SUM(A.gl_amount), A.flg_amount
  351.     FROM in_summary_monthly_amount A, vw_raw_materials_product E
  352.     WHERE A.date_year_month = pYearMonth AND
  353.         A.doc_type_id = vDocTypeAwal AND
  354.         A.ou_bu_id = pOuId AND
  355.         A.tenant_id = pTenantId AND
  356.         A.product_id = E.product_id
  357.     GROUP BY A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id, A.doc_type_id, A.product_id, A.base_uom_id, A.gl_curr_code, A.flg_amount;
  358.  
  359.     /*
  360.      * hitung harga rata-rata sebagai dasar harga pokok
  361.      */
  362.     INSERT INTO tt_in_summary_monthly_cogs
  363.     (session_id, date_year_month, tenant_id, ou_id,
  364.     product_id, qty_total, curr_code, amount_total, avg_price)
  365.     SELECT pSessionId, pYearMonth, A.tenant_id, A.ou_bu_id,
  366.         A.product_id, SUM(A.qty), A.gl_curr_code, SUM(A.gl_amount), 0
  367.     FROM tt_in_summary_monthly_product A
  368.     WHERE A.session_id = pSessionId
  369.     GROUP BY A.tenant_id, A.ou_bu_id, A.product_id, A.gl_curr_code;
  370.    
  371.     UPDATE tt_in_summary_monthly_cogs
  372.       SET avg_price = amount_total / qty_total
  373.     WHERE session_id = pSessionId AND
  374.       qty_total <> 0;
  375.    
  376.     /*
  377.      * memberikan nilai untuk transaksi stok yang mengurangi qty, sesuai harga rata rata bulan ini
  378.      * transaksi selain adj stok qty(521) dan adj stok qty outlet(413) , yang qty < 0
  379.      * transaksi pemakaian Nota klaim (511), DO (311) , POS Shop (431), Pos Shop In Shop(431)
  380.      * NK, 16 Feb 2015 : tambahan transaksi DO Receipt ( 526 )
  381.      * Sales Invoice Konsinyasi(354), DO Internal tidak jadi dipakai(154)
  382.      * Return POS Shop, Return POS SHop In SHop belum ada
  383.      */
  384.     INSERT INTO tt_in_summary_monthly_product
  385.     (session_id, date_year_month, tenant_id,  ou_bu_id, ou_branch_id, ou_sub_bu_id,
  386.     doc_type_id, product_id, base_uom_id, qty,
  387.     gl_curr_code, gl_amount, flg_amount)
  388.     SELECT pSessionId, pYearMonth, A.tenant_id, B.ou_bu_id, B.ou_branch_id, B.ou_sub_bu_id,
  389.         A.doc_type_id, A.product_id, A.base_uom_id, SUM(A.qty),
  390.         vCurrGL, 0, 'MONTHLY_AVG'
  391.     FROM in_log_product_balance_stock A, m_ou_structure B, dt_date C, vw_raw_materials_product E
  392.     WHERE A.ou_id = B.ou_id AND
  393.         B.ou_bu_id = pOuId AND
  394.         A.doc_date = C.string_date AND
  395.         C.year_month_date = pYearMonth AND
  396.         A.doc_type_id IN (511,311,431,526) AND
  397.         A.product_id = E.product_id
  398.     GROUP BY A.tenant_id, B.ou_bu_id, B.ou_branch_id, B.ou_sub_bu_id, A.doc_type_id, A.product_id, A.base_uom_id;  
  399.  
  400.     INSERT INTO tt_in_summary_monthly_product
  401.     (session_id, date_year_month, tenant_id,  ou_bu_id, ou_branch_id, ou_sub_bu_id,
  402.     doc_type_id, product_id, base_uom_id, qty,
  403.     gl_curr_code, gl_amount, flg_amount)
  404.     SELECT pSessionId, pYearMonth, A.tenant_id, B.ou_bu_id, B.ou_branch_id, B.ou_sub_bu_id,
  405.         431, A.product_id, A.base_uom_id, SUM(A.qty),
  406.         vCurrGL, 0, 'MONTHLY_AVG'
  407.     FROM in_log_product_balance_stock A, m_ou_structure B, dt_date C, vw_raw_materials_product E
  408.     WHERE A.ou_id = B.ou_id AND
  409.         B.ou_bu_id = pOuId AND
  410.         A.doc_date = C.string_date AND
  411.         C.year_month_date = pYearMonth AND
  412.         A.doc_type_id IN (401,402,403,404,405,406) AND
  413.         A.product_id = E.product_id
  414.     GROUP BY A.tenant_id, B.ou_bu_id, B.ou_branch_id, B.ou_sub_bu_id, A.product_id, A.base_uom_id
  415.     HAVING SUM(A.qty) <> 0;
  416.    
  417.     INSERT INTO tt_in_summary_monthly_product
  418.     (session_id, date_year_month, tenant_id,  ou_bu_id, ou_branch_id, ou_sub_bu_id,
  419.     doc_type_id, product_id, base_uom_id, qty,
  420.     gl_curr_code, gl_amount, flg_amount)
  421.     SELECT pSessionId, pYearMonth, A.tenant_id, B.ou_bu_id, B.ou_branch_id, B.ou_sub_bu_id,
  422.         A.doc_type_id, A.product_id, A.base_uom_id, SUM(A.qty),
  423.         vCurrGL, 0, 'MONTHLY_AVG'
  424.     FROM in_log_product_balance_stock A, m_ou_structure B, dt_date C, vw_raw_materials_product E
  425.     WHERE A.ou_id = B.ou_id AND
  426.         B.ou_bu_id = pOuId AND
  427.         A.doc_date = C.string_date AND
  428.         C.year_month_date = pYearMonth AND
  429.         A.doc_type_id IN (521, 413) AND
  430.         A.product_id = E.product_id AND
  431.         A.qty < 0
  432.     GROUP BY A.tenant_id, B.ou_bu_id, B.ou_branch_id, B.ou_sub_bu_id, A.doc_type_id, A.product_id, A.base_uom_id;
  433.    
  434. /*  NK, 25 Jan 2014, submit adj stok qty diubah sehingga menghasilkan 2 jenis log data product balance stock
  435.  *  qty < 0 dan qty > 0 dipisahkan
  436.     INSERT INTO tt_in_summary_monthly_product
  437.     (session_id, date_year_month, tenant_id, ou_id, sub_ou_id,
  438.     doc_type_id, product_id, base_uom_id, qty,
  439.     gl_curr_code, gl_amount, flg_amount)
  440.     SELECT pSessionId, pYearMonth, A.tenant_id, C.ou_bu_id, C.ou_id,
  441.         A.doc_type_id, B.product_id, B.base_uom_id, SUM(B.qty_realization),
  442.         vCurrGL, 0, 'MONTHLY_AVG'
  443.     FROM in_inventory A, in_inventory_item B, m_ou_structure C, dt_date D, vw_raw_materials_product E
  444.     WHERE A.ou_from_id = C.ou_id AND
  445.         C.ou_bu_id = pOuId AND
  446.         A.inventory_id = B.inventory_id AND
  447.         A.doc_date = D.string_date AND
  448.         D.year_month_date = pYearMonth AND
  449.         A.doc_type_id IN (521, 413) AND
  450.         B.qty_realization < 0 AND
  451.         B.product_id = E.product_id
  452.     GROUP BY A.tenant_id, C.ou_bu_id, C.ou_id, A.doc_type_id, B.product_id, B.base_uom_id;
  453. */
  454.     UPDATE tt_in_summary_monthly_product SET gl_amount = ROUND(qty * (A.amount_total / A.qty_total), vRoundingDigit)
  455.     FROM tt_in_summary_monthly_cogs A
  456.     WHERE A.session_id = pSessionId AND
  457.         tt_in_summary_monthly_product.session_id = A.session_id AND
  458.         tt_in_summary_monthly_product.tenant_id = A.tenant_id AND
  459.         tt_in_summary_monthly_product.ou_bu_id = A.ou_id AND
  460.         tt_in_summary_monthly_product.product_id = A.product_id AND
  461.         tt_in_summary_monthly_product.doc_type_id IN (511,311,431,526,521,413) AND
  462.         tt_in_summary_monthly_product.flg_amount = 'MONTHLY_AVG';
  463.  
  464.     /*
  465.      * untuk menghitung saldo akhir di bulan tersebut, dengan cara membuat record saldo awal untuk bulan berikutnya
  466.      * 1. ambil data adj stok balance amount ( adjust nilai akhir saldo barang )
  467.      * 2. hitung saldo akhir
  468.      */    
  469.     INSERT INTO tt_in_summary_monthly_product
  470.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  471.     doc_type_id, product_id, base_uom_id, qty,
  472.     gl_curr_code, gl_amount, flg_amount)
  473.     SELECT pSessionId, pYearMonth, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  474.         A.doc_type_id, A.product_id, A.uom_id, SUM(A.qty),
  475.         A.gl_curr_code, SUM(A.gl_amount), 'TRANSACTION'
  476.     FROM tt_in_doc_product_price A
  477.     WHERE A.session_id = pSessionId AND
  478.         A.doc_type_id = 523
  479.     GROUP BY A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id, A.doc_type_id, A.product_id, A.uom_id, A.gl_curr_code;
  480.        
  481.     /*
  482.      * Persiapan data saldo awal untuk bulan berikutnya. Periksa terlebih dahulu apakah ada data yg qty = 0, tetapi gl_amount <> 0.
  483.      * Nilai gl_amount tsb akan dialokasikan ke data transaksi pengeluaran stok dengan id terbesar untuk product ybs.
  484.      */
  485.     INSERT INTO tt_in_summary_monthly_amount_remain
  486.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  487.     doc_type_id, product_id, base_uom_id, qty,
  488.     gl_curr_code, gl_amount, flg_amount, summary_monthly_product_id)
  489.     SELECT pSessionId, A.date_year_month, A.tenant_id, A.ou_bu_id, vEmptyId, vEmptyId,
  490.         vDocTypeAwal, A.product_id, A.base_uom_id, SUM(A.qty),
  491.         vCurrGL, SUM(A.gl_amount), 'BGN_BALANCE', vEmptyId
  492.     FROM tt_in_summary_monthly_product A
  493.     WHERE A.session_id = pSessionId
  494.     GROUP BY A.date_year_month, A.tenant_id, A.ou_bu_id, A.product_id, A.base_uom_id;
  495.    
  496.     -- Cari id data sebagai penampung alokasi nilai
  497.     UPDATE tt_in_summary_monthly_amount_remain
  498.         SET summary_monthly_product_id = (
  499.             SELECT MAX(A.summary_monthly_product_id)
  500.             FROM tt_in_summary_monthly_product A
  501.             WHERE A.session_id = pSessionId AND
  502.                 tt_in_summary_monthly_amount_remain.session_id = A.session_id AND
  503.                 tt_in_summary_monthly_amount_remain.date_year_month = A.date_year_month AND
  504.                 tt_in_summary_monthly_amount_remain.tenant_id = A.tenant_id AND
  505.                 tt_in_summary_monthly_amount_remain.ou_bu_id = A.ou_bu_id AND
  506.                 tt_in_summary_monthly_amount_remain.product_id = A.product_id AND
  507.                 A.doc_type_id IN (511,311,431,526,521,413) AND
  508.                 A.flg_amount = 'MONTHLY_AVG')
  509.     WHERE session_id = pSessionId AND qty = 0 AND gl_amount <> 0;
  510.    
  511.     /*
  512.      * NK, 16 Feb 2015
  513.      * simpan terlebih dahulu data product yang qty = 0, dan nilai <> 0
  514.      * dimana nilai dari product tersebut akan dialokasi ke trx yang menggunakan produk tersebut
  515.      */
  516.     INSERT INTO in_summary_monthly_zero_qty_amount
  517.     (date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  518.     product_id, qty_sum, base_uom_id, gl_curr_code, amount_sum,
  519.     doc_type_id, qty, gl_amount, remark)
  520.     SELECT A.date_year_month, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  521.         A.product_id, A.qty, A.base_uom_id, A.gl_curr_code, A.gl_amount,
  522.         B.doc_type_id, B.qty, B.gl_amount, vGroupProductRM
  523.     FROM tt_in_summary_monthly_amount_remain A, tt_in_summary_monthly_product B
  524.     WHERE A.session_id = pSessionId AND
  525.         A.summary_monthly_product_id <> vEmptyId AND
  526.         B.summary_monthly_product_id = A.summary_monthly_product_id;
  527.                
  528.     UPDATE tt_in_summary_monthly_product SET gl_amount = tt_in_summary_monthly_product.gl_amount - A.gl_amount
  529.     FROM tt_in_summary_monthly_amount_remain A
  530.     WHERE A.session_id = pSessionId AND
  531.         A.summary_monthly_product_id <> vEmptyId AND
  532.         tt_in_summary_monthly_product.summary_monthly_product_id = A.summary_monthly_product_id;
  533.        
  534.     INSERT INTO tt_in_summary_monthly_product
  535.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  536.     doc_type_id, product_id, base_uom_id, qty, gl_curr_code, gl_amount, flg_amount)
  537.     SELECT A.session_id, vNextYearMonth, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  538.         A.doc_type_id, A.product_id, A.base_uom_id, A.qty, A.gl_curr_code, A.gl_amount, A.flg_amount
  539.     FROM tt_in_summary_monthly_amount_remain A
  540.     WHERE A.session_id = pSessionId AND A.qty > 0;
  541.                
  542.     INSERT INTO in_summary_monthly_cogs
  543.     (date_year_month, tenant_id, ou_id, product_id,
  544.     qty_total, curr_code, amount_total, avg_price,
  545.     "version", create_datetime, create_user_id, update_datetime, update_user_id, remark)
  546.     SELECT A.date_year_month, A.tenant_id, A.ou_id, A.product_id,
  547.             A.qty_total, A.curr_code, A.amount_total, A.avg_price,
  548.             0, pDatetime, pUserId, pDatetime, pUserId, vGroupProductRM
  549.     FROM tt_in_summary_monthly_cogs A
  550.     WHERE A.session_id = pSessionId;
  551.        
  552.     INSERT INTO in_summary_monthly_amount
  553.     (date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  554.     doc_type_id, product_id, base_uom_id, qty,
  555.     gl_curr_code, gl_amount, flg_amount,
  556.     "version", create_datetime, create_user_id, update_datetime, update_user_id, remark)
  557.     SELECT A.date_year_month, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  558.         A.doc_type_id, A.product_id, A.base_uom_id, A.qty,
  559.         A.gl_curr_code, A.gl_amount, A.flg_amount,
  560.         0, pDatetime, pUserId, pDatetime, pUserId, vGroupProductRM
  561.     FROM tt_in_summary_monthly_product A
  562.     WHERE A.session_id = pSessionId AND
  563.             A.date_year_month = pYearMonth AND
  564.             A.doc_type_id NOT IN (vDocTypeAwal, 111);
  565.  
  566.     INSERT INTO in_summary_monthly_amount
  567.     (date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  568.     doc_type_id, product_id, base_uom_id, qty,
  569.     gl_curr_code, gl_amount, flg_amount,
  570.     "version", create_datetime, create_user_id, update_datetime, update_user_id, remark)
  571.     SELECT A.date_year_month, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  572.         A.doc_type_id, A.product_id, A.base_uom_id, A.qty,
  573.         A.gl_curr_code, A.gl_amount, A.flg_amount,
  574.         0, pDatetime, pUserId, pDatetime, pUserId, vGroupProductRM
  575.     FROM tt_in_summary_monthly_product A
  576.     WHERE A.session_id = pSessionId AND
  577.         A.date_year_month = vNextYearMonth;
  578.        
  579.     DELETE FROM tt_in_doc_product_price WHERE session_id = pSessionId;
  580.    
  581.     DELETE FROM tt_in_add_product_unamount WHERE session_id = pSessionId;
  582.    
  583.     DELETE FROM tt_in_product_base_price WHERE session_id = pSessionId;
  584.    
  585.     DELETE FROM tt_in_summary_monthly_product WHERE session_id = pSessionId;
  586.    
  587.     DELETE FROM tt_in_summary_monthly_cogs WHERE session_id = pSessionId;
  588.    
  589.     DELETE FROM tt_in_summary_monthly_amount_remain WHERE session_id = pSessionId;
  590.    
  591.  END;
  592. $BODY$
  593.   LANGUAGE plpgsql VOLATILE
  594.   COST 100;
  595.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement