Advertisement
tercnem

COSTING FG

May 21st, 2018
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Function: in_process_costing_finish_goods(bigint, character varying, character varying, bigint, character varying, bigint)
  2.  
  3. -- DROP FUNCTION in_process_costing_finish_goods(bigint, character varying, character varying, bigint, character varying, bigint);
  4.  
  5. --Custom by Fitra 2018 Mei 21, penulisan data ke in_summary_monthly_amount berdasarkan ou bu
  6.  
  7. CREATE OR REPLACE FUNCTION in_process_costing_finish_goods(bigint, character varying, character varying, bigint, character varying, bigint)
  8.   RETURNS void AS
  9. $BODY$
  10. DECLARE
  11.  
  12.     pTenantId           ALIAS FOR $1;
  13.     pSessionId          ALIAS FOR $2;
  14.     pYearMonth          ALIAS FOR $3;
  15.     pOuId               ALIAS FOR $4;
  16.     pDatetime           ALIAS FOR $5;
  17.     pUserId             ALIAS FOR $6;
  18.  
  19.     vNextYearMonth          character varying(6);
  20.     vCurrGL                 character varying(5);
  21.     vFlagNo                 character varying(1);
  22.     vFlagYes                character varying(1);
  23.     vEmptyValue             character varying(1);
  24.     vEmptyId                bigint;
  25.     vDocTypeAwal            bigint;
  26.     vGroupProductFG         character varying(5);
  27.  
  28.     vRoundingDigit          integer;
  29.     vTypeRate               character varying(5);
  30.     vStatusRelease          character varying(1);
  31. BEGIN
  32.    
  33.     vFlagNo := 'N';
  34.     vFlagYes := 'Y';
  35.     vDocTypeAwal := -99;
  36.     vEmptyId := -99;
  37.     vEmptyValue := ' ';
  38.     vGroupProductFG := 'FG';
  39.  
  40.     vTypeRate := 'COM';
  41.     vStatusRelease := 'R';
  42.    
  43.     SELECT TO_CHAR(TO_DATE(MAX(pYearMonth),'YYYYMM') + interval '1 Month','YYYYMM') INTO vNextYearMonth;
  44.    
  45.     vCurrGL := f_get_value_system_config_by_param_code(pTenantId,'ValutaBuku');
  46.     vRoundingDigit := CAST(f_get_value_system_config_by_param_code(pTenantId,'rounding.gl.amount') AS integer);
  47.  
  48.     DELETE FROM tt_in_doc_product_price WHERE session_id = pSessionId;
  49.    
  50.     DELETE FROM tt_in_add_product_unamount WHERE session_id = pSessionId;
  51.    
  52.     DELETE FROM tt_in_product_base_price WHERE session_id = pSessionId;
  53.    
  54.     DELETE FROM tt_in_summary_monthly_product WHERE session_id = pSessionId;
  55.    
  56.     DELETE FROM tt_in_summary_monthly_cogs WHERE session_id = pSessionId;
  57.    
  58.     DELETE FROM tt_in_summary_monthly_amount_remain WHERE session_id = pSessionId;
  59.    
  60.     DELETE FROM tt_in_summary_monthly_assembly_cogs WHERE session_id = pSessionId; 
  61.    
  62.     DELETE FROM tt_in_summary_monthly_product_assembly WHERE session_id = pSessionId;  
  63.    
  64.     DELETE FROM tt_in_summary_monthly_amount_remain_assembly WHERE session_id = pSessionId;
  65.    
  66.     /*
  67.      * costing product hanya berdasarkan ou business unit, jadi untuk sementara sub_ou_id diisi dengan -99
  68.      */
  69.    
  70.     /*
  71.      * membuat summary nilai pembelian berdasarkan hasil jurnal
  72.      * untuk transaksi receive goods
  73.      * NK, 16 Feb 2015 : Pembelian Internal menghasilkan dokumen semua sesuai doc type Receive Goods
  74.      * Receive Goods : 111
  75.      */
  76.     INSERT INTO in_summary_monthly_amount
  77.     (date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  78.     doc_type_id, product_id, base_uom_id, qty,
  79.     gl_curr_code, gl_amount, flg_amount,
  80.     "version", create_datetime, create_user_id, update_datetime, update_user_id, remark)
  81.     SELECT pYearMonth, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  82.         A.doc_type_id, C.product_id, C.uom_id, SUM(C.qty),
  83.         C.gl_curr_code, SUM(C.gl_amount), 'PURCH_PRICE',
  84.         0, pDatetime, pUserId, pDatetime, pUserId, vGroupProductFG
  85.     FROM gl_journal_trx A, dt_date B, gl_journal_trx_item C, m_document_journal D, vw_finish_goods_product E
  86.     WHERE A.tenant_id = pTenantId AND
  87.         A.ou_bu_id = pOuId AND
  88.         A.status_doc = vStatusRelease AND
  89.         A.doc_date = B.string_date AND
  90.         B.year_month_date = pYearMonth AND
  91.         A.journal_trx_id = C.journal_trx_id AND
  92.         A.doc_type_id = D.doc_type_id AND
  93.         D.ledger_code IN ('PURCH') AND
  94.         C.journal_desc = 'PRODUCT_STOCK' AND
  95.         A.doc_type_id IN (111) AND
  96.         C.product_id = E.product_id
  97.     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;
  98.  
  99.     /*
  100.      * ambil daftar product yang akan diproses,hny yang group FINISH GOODS
  101.      * dan berikan tanda jika barang tersebut adalah barang assembly
  102.      * NOT USED ANYMORE, NK 31 DES 2013, USE VIEW
  103.     INSERT INTO tt_in_product
  104.     (session_id, product_id, base_uom_id, flg_assembly)
  105.     SELECT pSessionId, A.product_id, A.base_uom_id, vFlagNo
  106.     FROM m_product A, m_ctgr_product B, m_group_product C
  107.     WHERE A.ctgr_product_id = B.ctgr_product_id AND
  108.         B.group_product_id = C.group_product_id AND
  109.         C.group_product_code = vGroupProductFG;
  110.        
  111.     UPDATE tt_in_product SET flg_assembly = vFlagYes
  112.     WHERE EXISTS (SELECT 1 FROM m_ext_product A
  113.                 WHERE tt_in_product.product_id = A.product_id);
  114.      */  
  115.     /*
  116.      * ambil data receive goods dari in_summary_monthly_amount yang product Finish Goods
  117.      * NK, 16 Feb 2015 : receive goods internal menggunakan doc type receive goods
  118.      */        
  119.     INSERT INTO tt_in_doc_product_price
  120.     (session_id, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id, product_id,
  121.      doc_type_id, ref_id, doc_no, doc_date,
  122.      curr_code, amount, qty, uom_id,
  123.      numerator_rate, denominator_rate,
  124.      gl_curr_code, gl_amount)
  125.     SELECT pSessionId, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id, A.product_id,
  126.         A.doc_type_id, vEmptyId, vEmptyValue, vEmptyValue,
  127.         A.gl_curr_code, A.gl_amount, A.qty, A.base_uom_id,
  128.         1, 1,
  129.         A.gl_curr_code, A.gl_amount
  130.     FROM in_summary_monthly_amount A, vw_finish_goods_product E
  131.     WHERE A.date_year_month = pYearMonth AND
  132.         A.doc_type_id IN (111) AND
  133.         A.tenant_id = pTenantId AND
  134.         A.ou_bu_id = pOuId AND
  135.         A.product_id = E.product_id;   
  136.        
  137.     /*
  138.      * ambil data adjusment stok amount
  139.      * jika curr <> curr G/L, maka lakukan hitung rate untuk ke nilai sesuai valuta G/L
  140.      * 522 : adj stock amount ( mempengaruhi COGS )
  141.      * 523 : adj stock amount balance ( mempengaruhi saldo akhir )
  142.      * 528 : costing allocation to product ( mempengaruhi COGS )
  143.      */
  144.     INSERT INTO tt_in_doc_product_price
  145.     (session_id, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id, product_id,
  146.      doc_type_id, ref_id, doc_no, doc_date,
  147.      curr_code, amount, qty, uom_id,
  148.      numerator_rate, denominator_rate,
  149.      gl_curr_code, gl_amount)
  150.     SELECT pSessionId, A.tenant_id, B.ou_bu_id, B.ou_branch_id, B.ou_sub_bu_id, A.product_id,
  151.         A.doc_type_id, A.ref_id, A.doc_no, A.doc_date,
  152.         A.curr_code, A.amount, A.qty, A.uom_id,
  153.         1, 1, vCurrGL, ROUND( A.amount, vRoundingDigit)
  154.     FROM in_product_price_balance A, m_ou_structure B, dt_date C, vw_finish_goods_product E
  155.     WHERE A.doc_date = C.string_date AND
  156.         C.year_month_date = pYearMonth AND
  157.         A.tenant_id = pTenantId AND
  158.         A.ou_id = B.ou_id AND
  159.         B.ou_bu_id = pOuId AND
  160.         A.doc_type_id IN (522, 523, 528) AND
  161.         A.product_id = E.product_id;   
  162.    
  163.     -- hitung nilai pembukuan untuk transaksi adjusment stok amount
  164.     UPDATE tt_in_doc_product_price SET numerator_rate = B.amount_to, denominator_rate = B.amount_from
  165.     FROM m_exchange_rate B
  166.     WHERE tt_in_doc_product_price.session_id = pSessionId AND
  167.         tt_in_doc_product_price.tenant_id = B.tenant_id AND
  168.         B.type_exchange_rate = vTypeRate AND
  169.         tt_in_doc_product_price.doc_date = B.date_from AND
  170.         tt_in_doc_product_price.curr_code = B.curr_code_from AND
  171.         tt_in_doc_product_price.gl_curr_code = B.curr_code_to AND
  172.         tt_in_doc_product_price.doc_type_id IN (522, 523, 528) AND
  173.         tt_in_doc_product_price.curr_code <> vCurrGL;
  174.  
  175.     UPDATE tt_in_doc_product_price SET gl_amount = ROUND(amount * numerator_rate / denominator_rate, vRoundingDigit)
  176.     WHERE tt_in_doc_product_price.session_id = pSessionId AND
  177.           tt_in_doc_product_price.doc_type_id IN (522, 523, 528) AND
  178.           tt_in_doc_product_price.curr_code <> vCurrGL;
  179.          
  180.     /*
  181.      * product non assembly
  182.      * ambil data transaksi yg tambah stok, tp belum memiliki nilai
  183.      * 1.return note : 502
  184.      * 2.adj stok qty plus : 521
  185.      * 3.adj stok outlet qty plus : 413
  186.      */
  187.     INSERT INTO tt_in_add_product_unamount
  188.     (session_id, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id, product_id,
  189.      doc_type_id, qty, uom_id, gl_curr_code, gl_amount, flg_amount)
  190.     SELECT pSessionId, A.tenant_id, B.ou_bu_id, B.ou_branch_id, B.ou_sub_bu_id, A.product_id,
  191.         A.doc_type_id, A.qty, A.base_uom_id, vCurrGL, 0, vEmptyValue
  192.     FROM in_log_product_balance_stock A, m_ou_structure B, dt_date C, vw_finish_goods_product E
  193.     WHERE A.ou_id = B.ou_id AND
  194.         B.ou_bu_id = pOuId AND
  195.         A.doc_date = C.string_date AND
  196.         C.year_month_date = pYearMonth AND
  197.         A.doc_type_id = 502 AND
  198.         A.product_id = E.product_id;   
  199.  
  200.     INSERT INTO tt_in_add_product_unamount
  201.     (session_id, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id, product_id,
  202.      doc_type_id, qty, uom_id, gl_curr_code, gl_amount, flg_amount)
  203.     SELECT pSessionId, A.tenant_id, B.ou_bu_id, B.ou_branch_id, B.ou_sub_bu_id, A.product_id,
  204.         A.doc_type_id, A.qty, A.base_uom_id, vCurrGL, 0, vEmptyValue
  205.     FROM in_log_product_balance_stock A, m_ou_structure B, dt_date C, vw_finish_goods_product E
  206.     WHERE A.ou_id = B.ou_id AND
  207.         B.ou_bu_id = pOuId AND
  208.         A.doc_date = C.string_date AND
  209.         C.year_month_date = pYearMonth AND
  210.         A.doc_type_id IN ( 521, 413 ) AND
  211.         A.product_id = E.product_id AND
  212.         A.qty > 0
  213.        
  214. /* NK, 25 Jan 2014, di submit adj stok qty diubah sehingga log product balance stock akan ada 2 kelompok,
  215.  * kelompok yang qty > 0 dan qty < 0
  216.                    
  217.     INSERT INTO tt_in_add_product_unamount
  218.     (session_id, tenant_id, ou_id, sub_ou_id, product_id,
  219.      doc_type_id, qty, uom_id, gl_curr_code, gl_amount, flg_amount)
  220.     SELECT pSessionId, A.tenant_id, D.ou_bu_id, D.ou_id, B.product_id,
  221.         A.doc_type_id, B.qty_realization, B.base_uom_id, vCurrGL, 0, vEmptyValue
  222.     FROM in_inventory A, in_inventory_item B, dt_date C, m_ou_structure D, vw_finish_goods_product E
  223.     WHERE A.tenant_id = pTenantId AND
  224.         A.doc_date = C.string_date AND
  225.         C.year_month_date = pYearMonth AND
  226.         A.inventory_id = B.inventory_id AND
  227.         A.ou_from_id = D.ou_id AND
  228.         D.ou_bu_id = pOuId AND
  229.         A.doc_type_id = 521 AND
  230.         B.qty_realization > 0 AND
  231.         B.product_id = E.product_id;   
  232.                    
  233.     INSERT INTO tt_in_add_product_unamount
  234.     (session_id, tenant_id, ou_id, sub_ou_id, product_id,
  235.      doc_type_id, qty, uom_id, gl_curr_code, gl_amount, flg_amount)
  236.     SELECT pSessionId, A.tenant_id, D.ou_bu_id, D.ou_id, B.product_id,
  237.         A.doc_type_id, B.qty_realization, B.base_uom_id, vCurrGL, 0, vEmptyValue
  238.     FROM i_trx_inventory A, i_trx_inventory_item B, dt_date C, m_ou_structure D, vw_finish_goods_product E
  239.     WHERE A.tenant_id = pTenantId AND
  240.         A.doc_date = C.string_date AND
  241.         C.year_month_date = pYearMonth AND
  242.         A.trx_inventory_id = B.trx_inventory_id AND
  243.         A.ou_id = D.ou_id AND
  244.         D.ou_bu_id = pOuId AND
  245.         A.doc_type_id = 413 AND
  246.         B.qty_realization > 0 AND
  247.         B.product_id = E.product_id;   
  248.  */
  249.     /*
  250.      * buat data yang akan menjadi acuan harga standard
  251.      * 1.data purch price di bulan bersangkutan
  252.      * 2.data nilai barang di awal bulan
  253.      * 3.data master harga standard
  254.      */
  255.     INSERT INTO tt_in_product_base_price
  256.     (session_id, tenant_id, ou_id, product_id,
  257.      flg_amount, qty, uom_id, gl_curr_code, gl_amount)
  258.     SELECT A.session_id, A.tenant_id, A.ou_bu_id, A.product_id,
  259.         'PURCH_PRICE', SUM(A.qty), A.uom_id, A.gl_curr_code, SUM(A.gl_amount)
  260.     FROM tt_in_doc_product_price A
  261.     WHERE A.session_id = pSessionId AND
  262.         A.doc_type_id IN ( 111)
  263.     GROUP BY A.session_id, A.tenant_id, A.ou_bu_id, A.product_id,
  264.         A.uom_id, A.gl_curr_code;
  265.    
  266.     INSERT INTO tt_in_product_base_price
  267.     (session_id, tenant_id, ou_id, product_id,
  268.      flg_amount, qty, uom_id, gl_curr_code, gl_amount)
  269.     SELECT pSessionId, A.tenant_id, A.ou_bu_id, A.product_id,
  270.         'BGN_BALANCE', SUM(A.qty), A.base_uom_id, A.gl_curr_code, SUM(A.gl_amount)
  271.     FROM in_summary_monthly_amount A, vw_finish_goods_product E
  272.     WHERE A.date_year_month = pYearMonth AND
  273.         A.doc_type_id = vDocTypeAwal AND
  274.         A.tenant_id = pTenantId AND
  275.         A.ou_bu_id = pOuId AND
  276.         A.product_id = E.product_id
  277.     GROUP BY A.tenant_id, A.ou_bu_id, A.product_id,
  278.         A.base_uom_id, A.gl_curr_code;
  279.    
  280.     INSERT INTO tt_in_product_base_price
  281.     (session_id, tenant_id, ou_id, product_id,
  282.      flg_amount, qty, uom_id, gl_curr_code, gl_amount)
  283.     SELECT pSessionId, A.tenant_id, A.ou_id, A.product_id,
  284.         'STANDARD_PRICE', 0, E.base_uom_id, A.curr_code, SUM(A.amount)
  285.     FROM in_product_standard_cogs A, vw_finish_goods_product E
  286.     WHERE A.tenant_id = pTenantId AND
  287.         A.ou_id = pOuId AND
  288.         A.year_month_date = pYearMonth AND
  289.         A.product_id = E.product_id
  290.     GROUP BY A.tenant_id, A.ou_id, A.product_id, A.curr_code, E.base_uom_id;
  291.    
  292.     /*
  293.      * isi nilai data tt_in_add_product_unamount dengan urutan :
  294.      * 1. update dengan data flg amount STANDARD_PRICE
  295.      * 2. jika belum ada, update dengan data flg amount BGN_BALANCE
  296.      * 3. jika belum ada, update dengan data flg amount PURCH_PRICE
  297.      */
  298.    
  299.     UPDATE tt_in_add_product_unamount SET gl_amount = tt_in_add_product_unamount.qty * A.gl_amount, flg_amount = A.flg_amount
  300.     FROM tt_in_product_base_price A
  301.     WHERE A.session_id = pSessionId AND
  302.         tt_in_add_product_unamount.session_id = A.session_id AND
  303.         tt_in_add_product_unamount.tenant_id = A.tenant_id AND
  304.         tt_in_add_product_unamount.ou_bu_id = A.ou_id AND
  305.         tt_in_add_product_unamount.product_id = A.product_id AND
  306.         tt_in_add_product_unamount.flg_amount = vEmptyValue AND
  307.         A.flg_amount = 'STANDARD_PRICE';
  308.    
  309.     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
  310.     FROM tt_in_product_base_price A
  311.     WHERE A.session_id = pSessionId AND
  312.         tt_in_add_product_unamount.session_id = A.session_id AND
  313.         tt_in_add_product_unamount.tenant_id = A.tenant_id AND
  314.         tt_in_add_product_unamount.ou_bu_id = A.ou_id AND
  315.         tt_in_add_product_unamount.product_id = A.product_id AND
  316.         tt_in_add_product_unamount.flg_amount = vEmptyValue AND    
  317.         A.flg_amount = 'BGN_BALANCE';
  318.        
  319.     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
  320.     FROM tt_in_product_base_price A
  321.     WHERE A.session_id = pSessionId AND
  322.         tt_in_add_product_unamount.session_id = A.session_id AND
  323.         tt_in_add_product_unamount.tenant_id = A.tenant_id AND
  324.         tt_in_add_product_unamount.ou_bu_id = A.ou_id AND
  325.         tt_in_add_product_unamount.product_id = A.product_id AND
  326.         tt_in_add_product_unamount.flg_amount = vEmptyValue AND    
  327.         A.flg_amount = 'PURCH_PRICE';
  328.  
  329.        
  330. /*
  331.  *  menghitung harga rata rata product (non assembly ) berdasarkan :
  332.  *  1. harga purchasing
  333.  *  2. harga adj stock amount ( bukan yg balance amount ), cost allocation product
  334.  *  3. transaksi tambah stok qty, dengan harga sudah diproses : retur jual, adj stok qty > 0
  335.  *  4. harga saldo awal
  336.  */    
  337.     INSERT INTO tt_in_summary_monthly_product
  338.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  339.     doc_type_id, product_id, base_uom_id, qty,
  340.     gl_curr_code, gl_amount, flg_amount)
  341.     SELECT pSessionId, pYearMonth, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  342.         A.doc_type_id, A.product_id, A.uom_id, SUM(A.qty),
  343.         A.gl_curr_code, SUM(A.gl_amount), 'PURCH_PRICE'
  344.     FROM tt_in_doc_product_price A
  345.     WHERE A.session_id = pSessionId AND
  346.         A.doc_type_id IN (111)
  347.     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;
  348.    
  349.     INSERT INTO tt_in_summary_monthly_product
  350.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  351.     doc_type_id, product_id, base_uom_id, qty,
  352.     gl_curr_code, gl_amount, flg_amount)
  353.     SELECT pSessionId, pYearMonth, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  354.         A.doc_type_id, A.product_id, A.uom_id, SUM(A.qty),
  355.         A.gl_curr_code, SUM(A.gl_amount), 'TRANSACTION'
  356.     FROM tt_in_doc_product_price A
  357.     WHERE A.session_id = pSessionId AND
  358.         A.doc_type_id IN ( 522, 528 )
  359.     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;
  360.  
  361.     INSERT INTO tt_in_summary_monthly_product
  362.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  363.     doc_type_id, product_id, base_uom_id, qty,
  364.     gl_curr_code, gl_amount, flg_amount)
  365.     SELECT pSessionId, pYearMonth, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  366.         A.doc_type_id, A.product_id, A.uom_id, SUM(A.qty),
  367.         A.gl_curr_code, SUM(A.gl_amount), A.flg_amount
  368.     FROM tt_in_add_product_unamount A
  369.     WHERE A.session_id = pSessionId
  370.     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;
  371.  
  372.     INSERT INTO tt_in_summary_monthly_product
  373.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  374.     doc_type_id, product_id, base_uom_id, qty,
  375.     gl_curr_code, gl_amount, flg_amount)
  376.     SELECT pSessionId, pYearMonth, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  377.         A.doc_type_id, A.product_id, A.base_uom_id, SUM(A.qty),
  378.         A.gl_curr_code, SUM(A.gl_amount), A.flg_amount
  379.     FROM in_summary_monthly_amount A, vw_finish_goods_product E
  380.     WHERE A.date_year_month = pYearMonth AND
  381.         A.doc_type_id = vDocTypeAwal AND
  382.         A.ou_bu_id = pOuId AND
  383.         A.tenant_id = pTenantId AND
  384.         A.product_id = E.product_id
  385.     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;
  386.  
  387.     /*
  388.      * hitung harga rata-rata sebagai dasar harga pokok
  389.      */
  390.     INSERT INTO tt_in_summary_monthly_cogs
  391.     (session_id, date_year_month, tenant_id, ou_id,
  392.     product_id, qty_total, curr_code, amount_total, avg_price)
  393.     SELECT pSessionId, pYearMonth, A.tenant_id, A.ou_bu_id,
  394.         A.product_id, SUM(A.qty), A.gl_curr_code, SUM(A.gl_amount), 0
  395.     FROM tt_in_summary_monthly_product A
  396.     WHERE A.session_id = pSessionId
  397.     GROUP BY A.tenant_id, A.ou_bu_id, A.product_id, A.gl_curr_code;
  398.    
  399.     UPDATE tt_in_summary_monthly_cogs
  400.       SET avg_price = amount_total / qty_total
  401.     WHERE session_id = pSessionId AND
  402.       qty_total <> 0;
  403.    
  404.     /*
  405.      * memberikan nilai untuk transaksi stok yang mengurangi qty, sesuai harga rata rata bulan ini
  406.      * transaksi selain adj stok qty dan adj stok qty outlet , yang qty < 0
  407.      * transaksi pemakaian Nota klaim, DO, DO Internal, Sales Invoice Konsinyasi, POS Shop, Return POS Shop, Pos Shop In Shop, Return POS Shop In Shop
  408.      * transaksi pemakaian Nota klaim (511), DO (311) , POS Shop (431), Pos Shop In Shop(431)
  409.      * NK, 16 Feb 2015 : tambahan transaksi DO Receipt ( 526 )
  410.      * Sales Invoice Konsinyasi(354), DO Internal tidak jadi dipakai(154)
  411.      * Return POS Shop, Return POS SHop In SHop belum ada
  412.  
  413.      */
  414.     INSERT INTO tt_in_summary_monthly_product
  415.     (session_id, date_year_month, tenant_id,  ou_bu_id, ou_branch_id, ou_sub_bu_id,
  416.     doc_type_id, product_id, base_uom_id, qty,
  417.     gl_curr_code, gl_amount, flg_amount)
  418.     SELECT pSessionId, pYearMonth, A.tenant_id, B.ou_bu_id, B.ou_branch_id, B.ou_sub_bu_id,
  419.         A.doc_type_id, A.product_id, A.base_uom_id, SUM(A.qty),
  420.         vCurrGL, 0, 'MONTHLY_AVG'
  421.     FROM in_log_product_balance_stock A, m_ou_structure B, dt_date C, vw_finish_goods_product E
  422.     WHERE A.ou_id = B.ou_id AND
  423.         B.ou_bu_id = pOuId AND
  424.         A.doc_date = C.string_date AND
  425.         C.year_month_date = pYearMonth AND
  426.         A.doc_type_id IN (511,311,431,526) AND
  427.         A.product_id = E.product_id
  428.     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;  
  429.  
  430.     INSERT INTO tt_in_summary_monthly_product
  431.     (session_id, date_year_month, tenant_id,  ou_bu_id, ou_branch_id, ou_sub_bu_id,
  432.     doc_type_id, product_id, base_uom_id, qty,
  433.     gl_curr_code, gl_amount, flg_amount)
  434.     SELECT pSessionId, pYearMonth, A.tenant_id, B.ou_bu_id, B.ou_branch_id, B.ou_sub_bu_id,
  435.         A.doc_type_id, A.product_id, A.base_uom_id, SUM(A.qty),
  436.         vCurrGL, 0, 'MONTHLY_AVG'
  437.     FROM in_log_product_balance_stock A, m_ou_structure B, dt_date C, vw_finish_goods_product E
  438.     WHERE A.ou_id = B.ou_id AND
  439.         B.ou_bu_id = pOuId AND
  440.         A.doc_date = C.string_date AND
  441.         C.year_month_date = pYearMonth AND
  442.         A.doc_type_id IN (521, 413) AND
  443.         A.product_id = E.product_id AND
  444.         A.qty < 0
  445.     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;
  446.    
  447. /*  NK, 25 Jan 2014, submit adj stok qty diubah sehingga menghasilkan 2 jenis log data product balance stock
  448.  *  qty < 0 dan qty > 0 dipisahkan
  449.     INSERT INTO tt_in_summary_monthly_product
  450.     (session_id, date_year_month, tenant_id, ou_id, sub_ou_id,
  451.     doc_type_id, product_id, base_uom_id, qty,
  452.     gl_curr_code, gl_amount, flg_amount)
  453.     SELECT pSessionId, pYearMonth, A.tenant_id, C.ou_bu_id, C.ou_id,
  454.         A.doc_type_id, B.product_id, B.base_uom_id, SUM(B.qty_realization),
  455.         vCurrGL, 0, 'MONTHLY_AVG'
  456.     FROM in_inventory A, in_inventory_item B, m_ou_structure C, dt_date D, vw_finish_goods_product E
  457.     WHERE A.ou_from_id = C.ou_id AND
  458.         C.ou_bu_id = pOuId AND
  459.         A.inventory_id = B.inventory_id AND
  460.         A.doc_date = D.string_date AND
  461.         D.date_year_month = pYearMonth AND
  462.         A.doc_type_id IN (521, 413) AND
  463.         B.qty_realization < 0 AND
  464.         B.product_id = E.product_id
  465.     GROUP BY A.tenant_id, C.ou_bu_id, C.ou_id, A.doc_type_id, B.product_id, B.base_uom_id;
  466. */
  467.     UPDATE tt_in_summary_monthly_product SET gl_amount = ROUND(qty * (A.amount_total / A.qty_total), vRoundingDigit)
  468.     FROM tt_in_summary_monthly_cogs A
  469.     WHERE A.session_id = pSessionId AND
  470.         tt_in_summary_monthly_product.session_id = A.session_id AND
  471.         tt_in_summary_monthly_product.tenant_id = A.tenant_id AND
  472.         tt_in_summary_monthly_product.ou_bu_id = A.ou_id AND
  473.         tt_in_summary_monthly_product.product_id = A.product_id AND
  474.         tt_in_summary_monthly_product.doc_type_id IN (511,311,431,526,521,413) AND
  475.         tt_in_summary_monthly_product.flg_amount = 'MONTHLY_AVG' AND
  476.         A.qty_total <> 0;
  477.  
  478.     /*
  479.      * untuk menghitung saldo akhir di bulan tersebut, dengan cara membuat record saldo awal untuk bulan berikutnya
  480.      * 1. ambil data adj stok balance amount ( adjust nilai akhir saldo barang )
  481.      * 2. hitung saldo akhir
  482.      */    
  483.     INSERT INTO tt_in_summary_monthly_product
  484.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  485.     doc_type_id, product_id, base_uom_id, qty,
  486.     gl_curr_code, gl_amount, flg_amount)
  487.     SELECT pSessionId, pYearMonth, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  488.         A.doc_type_id, A.product_id, A.uom_id, SUM(A.qty),
  489.         A.gl_curr_code, SUM(A.gl_amount), 'TRANSACTION'
  490.     FROM tt_in_doc_product_price A
  491.     WHERE A.session_id = pSessionId AND
  492.         A.doc_type_id = 523
  493.     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;
  494.        
  495.     /*
  496.      * Persiapan data saldo awal untuk bulan berikutnya. Periksa terlebih dahulu apakah ada data yg qty = 0, tetapi gl_amount <> 0.
  497.      * Nilai gl_amount tsb akan dialokasikan ke data transaksi pengeluaran stok dengan id terbesar untuk product ybs.
  498.      */
  499.     INSERT INTO tt_in_summary_monthly_amount_remain
  500.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  501.     doc_type_id, product_id, base_uom_id, qty,
  502.     gl_curr_code, gl_amount, flg_amount, summary_monthly_product_id)
  503.     SELECT pSessionId, A.date_year_month, A.tenant_id, A.ou_bu_id, vEmptyId, vEmptyId,
  504.         vDocTypeAwal, A.product_id, A.base_uom_id, SUM(A.qty),
  505.         vCurrGL, SUM(A.gl_amount), 'BGN_BALANCE', vEmptyId
  506.     FROM tt_in_summary_monthly_product A
  507.     WHERE A.session_id = pSessionId
  508.     GROUP BY A.date_year_month, A.tenant_id, A.ou_bu_id, A.product_id, A.base_uom_id;
  509.    
  510.     -- Cari id data sebagai penampung alokasi nilai
  511.     UPDATE tt_in_summary_monthly_amount_remain
  512.         SET summary_monthly_product_id = (
  513.             SELECT MAX(A.summary_monthly_product_id)
  514.             FROM tt_in_summary_monthly_product A
  515.             WHERE A.session_id = pSessionId AND
  516.                 tt_in_summary_monthly_amount_remain.session_id = A.session_id AND
  517.                 tt_in_summary_monthly_amount_remain.date_year_month = A.date_year_month AND
  518.                 tt_in_summary_monthly_amount_remain.tenant_id = A.tenant_id AND
  519.                 tt_in_summary_monthly_amount_remain.ou_bu_id = A.ou_bu_id AND
  520.                 tt_in_summary_monthly_amount_remain.product_id = A.product_id AND
  521.                 A.doc_type_id IN (511,311,431,526,521,413) AND
  522.                 A.flg_amount = 'MONTHLY_AVG')
  523.     WHERE session_id = pSessionId AND qty = 0 AND gl_amount <> 0;
  524.    
  525.     /*
  526.      * NK, 16 Feb 2015
  527.      * simpan terlebih dahulu data product yang qty = 0, dan nilai <> 0
  528.      * dimana nilai dari product tersebut akan dialokasi ke trx yang menggunakan produk tersebut
  529.      */
  530.     INSERT INTO in_summary_monthly_zero_qty_amount
  531.     (date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  532.     product_id, qty_sum, base_uom_id, gl_curr_code, amount_sum,
  533.     doc_type_id, qty, gl_amount, remark)
  534.     SELECT A.date_year_month, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  535.         A.product_id, A.qty, A.base_uom_id, A.gl_curr_code, A.gl_amount,
  536.         B.doc_type_id, B.qty, B.gl_amount, vGroupProductFG
  537.     FROM tt_in_summary_monthly_amount_remain A, tt_in_summary_monthly_product B
  538.     WHERE A.session_id = pSessionId AND
  539.         A.summary_monthly_product_id <> vEmptyId AND
  540.         B.summary_monthly_product_id = A.summary_monthly_product_id;
  541.    
  542.     UPDATE tt_in_summary_monthly_product SET gl_amount = tt_in_summary_monthly_product.gl_amount - A.gl_amount
  543.     FROM tt_in_summary_monthly_amount_remain A
  544.     WHERE A.session_id = pSessionId AND
  545.         A.summary_monthly_product_id <> vEmptyId AND
  546.         tt_in_summary_monthly_product.summary_monthly_product_id = A.summary_monthly_product_id;
  547.        
  548.     INSERT INTO tt_in_summary_monthly_product
  549.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  550.     doc_type_id, product_id, base_uom_id, qty, gl_curr_code, gl_amount, flg_amount)
  551.     SELECT A.session_id, vNextYearMonth, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  552.         A.doc_type_id, A.product_id, A.base_uom_id, A.qty, A.gl_curr_code, A.gl_amount, A.flg_amount
  553.     FROM tt_in_summary_monthly_amount_remain A
  554.     WHERE A.session_id = pSessionId AND A.qty > 0;
  555.                
  556.     INSERT INTO in_summary_monthly_cogs
  557.     (date_year_month, tenant_id, ou_id, product_id,
  558.     qty_total, curr_code, amount_total, avg_price,
  559.     "version", create_datetime, create_user_id, update_datetime, update_user_id, remark)
  560.     SELECT A.date_year_month, A.tenant_id, A.ou_id, A.product_id,
  561.             A.qty_total, A.curr_code, A.amount_total, A.avg_price,
  562.             0, pDatetime, pUserId, pDatetime, pUserId, vGroupProductFG
  563.     FROM tt_in_summary_monthly_cogs A
  564.     WHERE A.session_id = pSessionId;
  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, vEmptyId, vEmptyId,
  572.         A.doc_type_id, A.product_id, A.base_uom_id, SUM(A.qty),
  573.         A.gl_curr_code, SUM(A.gl_amount), A.flg_amount,
  574.         0, pDatetime, pUserId, pDatetime, pUserId, vGroupProductFG
  575.     FROM tt_in_summary_monthly_product A
  576.     WHERE A.session_id = pSessionId AND
  577.             A.date_year_month = pYearMonth AND
  578.             A.doc_type_id NOT IN (vDocTypeAwal, 111)
  579.     GROUP BY A.date_year_month, A.tenant_id, A.ou_bu_id, A.doc_type_id, A.product_id,
  580.              A.base_uom_id, A.gl_curr_code, A.flg_amount;
  581.  
  582.     INSERT INTO in_summary_monthly_amount
  583.     (date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  584.     doc_type_id, product_id, base_uom_id, qty,
  585.     gl_curr_code, gl_amount, flg_amount,
  586.     "version", create_datetime, create_user_id, update_datetime, update_user_id, remark)
  587.     SELECT A.date_year_month, A.tenant_id, A.ou_bu_id, vEmptyId, vEmptyId,
  588.         A.doc_type_id, A.product_id, A.base_uom_id, SUM(A.qty),
  589.         A.gl_curr_code, SUM(A.gl_amount), A.flg_amount,
  590.         0, pDatetime, pUserId, pDatetime, pUserId, vGroupProductFG
  591.     FROM tt_in_summary_monthly_product A
  592.     WHERE A.session_id = pSessionId AND
  593.         A.date_year_month = vNextYearMonth
  594.     GROUP BY A.date_year_month, A.tenant_id, A.ou_bu_id, A.doc_type_id, A.product_id,
  595.              A.base_uom_id, A.gl_curr_code, A.flg_amount;
  596.        
  597. /*
  598.  * PERHITUNGAN PRODUCT ASSEMBLY
  599.  * 1. tentukan harga awal transaksi assembly : 541
  600.  * 2. tentukan harga transaksi return, adj
  601.  * 3. ambil nilai saldo awal product assembly
  602.  * 4. tentukan harga rata assembly
  603.  * 5. tentukan nilai transaksi pemakaian assembly
  604.  */            
  605.     INSERT INTO tt_in_doc_product_assembly_price
  606.     (session_id, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  607.     ref_id, doc_type_id, child_product_id, child_qty, child_amount)
  608.     SELECT pSessionId, A.tenant_id, B.ou_bu_id, B.ou_branch_id, B.ou_sub_bu_id,
  609.         A.log_product_balance_stock_id, A.doc_type_id,
  610.         E.child_product_id, E.qty_base_uom, 0
  611.     FROM in_log_product_balance_stock A, m_ou_structure B, dt_date C, vw_finish_goods_product_assembly D, m_product_assembly E
  612.     WHERE A.ou_id = B.ou_id AND
  613.         B.ou_bu_id = pOuId AND
  614.         A.doc_date = C.string_date AND
  615.         C.year_month_date = pYearMonth AND
  616.         A.product_id = D.product_id AND
  617.         D.product_id = E.parent_product_id AND
  618.         A.doc_type_id IN (541);
  619.    
  620.     /*
  621.      * memberikan nilai untuk child product, krn child product pasti bukan product assembly
  622.      */
  623.     UPDATE tt_in_doc_product_assembly_price SET child_amount = ROUND(child_qty * (A.amount_total / A.qty_total), vRoundingDigit)
  624.     FROM tt_in_summary_monthly_cogs A
  625.     WHERE A.session_id = pSessionId AND
  626.         tt_in_doc_product_assembly_price.session_id = A.session_id AND
  627.         tt_in_doc_product_assembly_price.tenant_id = A.tenant_id AND
  628.         tt_in_doc_product_assembly_price.ou_bu_id = A.ou_id AND
  629.         tt_in_doc_product_assembly_price.child_product_id = A.product_id;
  630.        
  631.     /*
  632.      * hitung nilai assembly product, sum dari amount child product
  633.      */
  634.     INSERT INTO tt_in_product_assembly_price_balance
  635.     (session_id, tenant_id, ou_id, product_id, product_balance_id,
  636.     product_buy_date, partner_id, doc_type_id, ref_id,
  637.     doc_no, doc_date, curr_code, amount, qty, uom_id)
  638.     SELECT pSessionId, B.tenant_id, pOuId, B.product_id, B.product_balance_id,
  639.         B.doc_date, B.partner_id, B.doc_type_id, B.ref_id,
  640.         B.doc_no, B.doc_date, vCurrGL, SUM(A.total_child_amount * B.qty), SUM(B.qty), B.base_uom_id
  641.     FROM (SELECT A.ref_id, SUM(A.child_amount) AS total_child_amount
  642.             FROM tt_in_doc_product_assembly_price A
  643.             WHERE A.session_id = pSessionId
  644.             GROUP BY A.ref_id) A,
  645.             in_log_product_balance_stock B
  646.     WHERE A.ref_id = B.log_product_balance_stock_id
  647.     GROUP BY B.tenant_id, B.product_id, B.product_balance_id, B.doc_date, B.partner_id, B.doc_type_id, B.ref_id, B.doc_no, B.doc_date, B.base_uom_id;
  648.    
  649.     /*
  650.      * product assembly,harus cari child product nya
  651.      * ambil data transaksi yg tambah stok, tp belum memiliki nilai
  652.      * 1.return note : 502
  653.      * 2.adj stok qty plus : 521
  654.      */                
  655.     INSERT INTO tt_in_add_product_assembly_unamount
  656.     (session_id, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  657.     ref_id, doc_type_id, flg_amount,
  658.      child_product_id, child_qty, child_amount)
  659.     SELECT pSessionId, A.tenant_id, D.ou_bu_id, D.ou_branch_id, D.ou_sub_bu_id,
  660.         A.log_product_balance_stock_id, A.doc_type_id, vEmptyValue,
  661.         F.child_product_id, F.qty_base_uom, 0
  662.     FROM in_log_product_balance_stock A, dt_date C, m_ou_structure D, vw_finish_goods_product_assembly E, m_product_assembly F
  663.     WHERE A.tenant_id = pTenantId AND
  664.         A.doc_date = C.string_date AND
  665.         C.year_month_date = pYearMonth AND
  666.         A.ou_id = D.ou_id AND
  667.         D.ou_bu_id = pOuId AND
  668.         A.doc_type_id = 502 AND
  669.         A.product_id = E.product_id AND
  670.         E.product_id = F.parent_product_id;
  671.        
  672.     INSERT INTO tt_in_add_product_assembly_unamount
  673.     (session_id, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  674.     ref_id, doc_type_id, flg_amount,
  675.      child_product_id, child_qty, child_amount)
  676.     SELECT pSessionId, A.tenant_id, D.ou_bu_id, D.ou_branch_id, D.ou_sub_bu_id,
  677.         A.log_product_balance_stock_id, A.doc_type_id, vEmptyValue,
  678.         F.child_product_id, F.qty_base_uom, 0
  679.     FROM in_log_product_balance_stock A, dt_date C, m_ou_structure D, vw_finish_goods_product_assembly E, m_product_assembly F
  680.     WHERE A.tenant_id = pTenantId AND
  681.         A.doc_date = C.string_date AND
  682.         C.year_month_date = pYearMonth AND
  683.         A.ou_id = D.ou_id AND
  684.         D.ou_bu_id = pOuId AND
  685.         A.doc_type_id = 521 AND
  686.         A.product_id = E.product_id AND
  687.         E.product_id = F.parent_product_id AND
  688.         A.qty > 0;
  689.  
  690. /*  NK, 26 Jan 2014, submit adj stok akan menghasilkan 2 jenis log data
  691.  *  qty > 0 dan qty < 0 akan dipisahkan dalam row data terpisah
  692.     INSERT INTO tt_in_add_product_assembly_unamount
  693.     (session_id, tenant_id, ou_id, sub_ou_id,
  694.     ref_id, doc_type_id, flg_amount,
  695.      child_product_id, child_qty, child_amount)
  696.     SELECT pSessionId, A.tenant_id, D.ou_bu_id, D.ou_id,
  697.         B.inventory_item_id, A.doc_type_id, vEmptyValue,
  698.         F.child_product_id, F.qty_base_uom, 0
  699.     FROM in_inventory A, in_inventory_item B, dt_date C, m_ou_structure D, vw_finish_goods_product_assembly E, m_product_assembly F
  700.     WHERE A.tenant_id = pTenantId AND
  701.         A.doc_date = C.string_date AND
  702.         C.year_month_date = pYearMonth AND
  703.         A.inventory_id = B.inventory_id AND
  704.         A.ou_from_id = D.ou_id AND
  705.         D.ou_bu_id = pOuId AND
  706.         A.doc_type_id = 521 AND
  707.         B.product_id = E.product_id AND
  708.         E.product_id = F.parent_product_id AND
  709.         B.qty_realization > 0;
  710. */             
  711.    
  712.     /*
  713.      * isi nilai data tt_in_add_product_assembly_unamount untuk nilai child_amount dengan urutan :
  714.      * 1. update dengan data flg amount STANDARD_PRICE
  715.      * 2. jika belum ada, update dengan data flg amount BGN_BALANCE
  716.      * 3. jika belum ada, update dengan data flg amount PURCH_PRICE
  717.      */
  718.    
  719.     UPDATE tt_in_add_product_assembly_unamount SET child_amount = child_qty * A.gl_amount, flg_amount = A.flg_amount
  720.     FROM tt_in_product_base_price A
  721.     WHERE A.session_id = pSessionId AND
  722.         tt_in_add_product_assembly_unamount.session_id = A.session_id AND
  723.         tt_in_add_product_assembly_unamount.tenant_id = A.tenant_id AND
  724.         tt_in_add_product_assembly_unamount.ou_bu_id = A.ou_id AND
  725.         tt_in_add_product_assembly_unamount.child_product_id = A.product_id AND
  726.         tt_in_add_product_assembly_unamount.flg_amount = vEmptyValue AND
  727.         A.flg_amount = 'STANDARD_PRICE';
  728.    
  729.     UPDATE tt_in_add_product_assembly_unamount SET child_amount = ROUND(child_qty * ( A.gl_amount / A.qty ), vRoundingDigit), flg_amount = A.flg_amount
  730.     FROM tt_in_product_base_price A
  731.     WHERE A.session_id = pSessionId AND
  732.         tt_in_add_product_assembly_unamount.session_id = A.session_id AND
  733.         tt_in_add_product_assembly_unamount.tenant_id = A.tenant_id AND
  734.         tt_in_add_product_assembly_unamount.ou_bu_id = A.ou_id AND
  735.         tt_in_add_product_assembly_unamount.child_product_id = A.product_id AND
  736.         tt_in_add_product_assembly_unamount.flg_amount = vEmptyValue AND       
  737.         A.flg_amount = 'BGN_BALANCE';
  738.        
  739.     UPDATE tt_in_add_product_assembly_unamount SET child_amount = ROUND(child_qty * ( A.gl_amount / A.qty ), vRoundingDigit), flg_amount = A.flg_amount
  740.     FROM tt_in_product_base_price A
  741.     WHERE A.session_id = pSessionId AND
  742.         tt_in_add_product_assembly_unamount.session_id = A.session_id AND
  743.         tt_in_add_product_assembly_unamount.tenant_id = A.tenant_id AND
  744.         tt_in_add_product_assembly_unamount.ou_bu_id = A.ou_id AND
  745.         tt_in_add_product_assembly_unamount.child_product_id = A.product_id AND
  746.         tt_in_add_product_assembly_unamount.flg_amount = vEmptyValue AND       
  747.         A.flg_amount = 'PURCH_PRICE';
  748.        
  749. /*
  750.  * buat data summary harga product assembly :
  751.  * 1. assembly
  752.  * 2. add product assembly without amount
  753.  *    a.return note
  754.  *    b.adj stock qty plus
  755.  */    
  756.     INSERT INTO tt_in_summary_monthly_product_assembly
  757.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  758.     doc_type_id, product_id, base_uom_id, qty,
  759.     gl_curr_code, gl_amount, flg_amount)
  760.     SELECT pSessionId, pYearMonth, pTenantId, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  761.         B.doc_type_id, B.product_id, B.base_uom_id, SUM(B.qty),
  762.         vCurrGL, SUM(A.total_child_amount * B.qty), 'ASSEMBLY'
  763.     FROM (SELECT A.ref_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id, SUM(A.child_amount) AS total_child_amount
  764.             FROM tt_in_doc_product_assembly_price A
  765.             WHERE A.session_id = pSessionId
  766.             GROUP BY A.ref_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id) A,
  767.         in_log_product_balance_stock B
  768.     WHERE A.ref_id = B.log_product_balance_stock_id
  769.     GROUP BY A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id, B.doc_type_id, B.product_id, B.base_uom_id;
  770.  
  771.     INSERT INTO tt_in_summary_monthly_product_assembly
  772.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  773.     doc_type_id, product_id, base_uom_id, qty,
  774.     gl_curr_code, gl_amount, flg_amount)
  775.     SELECT pSessionId, pYearMonth, pTenantId,  A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  776.         B.doc_type_id, B.product_id, B.base_uom_id, SUM(B.qty),
  777.         vCurrGL, SUM(A.total_child_amount * B.qty), 'ASSEMBLY'
  778.     FROM (SELECT A.ref_id,  A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id, SUM(A.child_amount) AS total_child_amount
  779.             FROM tt_in_add_product_assembly_unamount A
  780.             WHERE A.session_id = pSessionId AND
  781.                 A.doc_type_id = 502
  782.             GROUP BY A.ref_id,  A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id) A,
  783.             in_log_product_balance_stock B
  784.     WHERE A.ref_id = B.log_product_balance_stock_id
  785.     GROUP BY  A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id, B.doc_type_id, B.product_id, B.base_uom_id;
  786.    
  787.     INSERT INTO tt_in_summary_monthly_product_assembly
  788.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  789.     doc_type_id, product_id, base_uom_id, qty,
  790.     gl_curr_code, gl_amount, flg_amount)
  791.     SELECT pSessionId, pYearMonth, pTenantId,  A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  792.         A.doc_type_id, B.product_id, B.base_uom_id, SUM(B.qty_realization),
  793.         vCurrGL, SUM(A.total_child_amount * B.qty_realization), 'ASSEMBLY'
  794.     FROM (SELECT A.ref_id, A.doc_type_id,  A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id, SUM(A.child_amount) AS total_child_amount
  795.             FROM tt_in_add_product_assembly_unamount A
  796.             WHERE A.session_id = pSessionId AND
  797.                 A.doc_type_id = 521
  798.             GROUP BY A.ref_id, A.doc_type_id,  A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id) A,
  799.             in_inventory_item B
  800.     WHERE A.ref_id = B.inventory_item_id
  801.     GROUP BY  A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id, A.doc_type_id, B.product_id, B.base_uom_id;
  802.  
  803.     /*
  804.      * ambil saldo awal product assembly
  805.      */
  806.     INSERT INTO tt_in_summary_monthly_product_assembly
  807.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  808.     doc_type_id, product_id, base_uom_id, qty,
  809.     gl_curr_code, gl_amount, flg_amount)
  810.     SELECT pSessionId, pYearMonth, pTenantId, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  811.         A.doc_type_id, A.product_id, A.base_uom_id, SUM(A.qty),
  812.         A.gl_curr_code, SUM(A.gl_amount), 'BGN_BALANCE'
  813.     FROM in_summary_monthly_amount A, vw_finish_goods_product_assembly E           
  814.     WHERE A.date_year_month = pYearMonth AND
  815.         A.doc_type_id = vDocTypeAwal AND
  816.         A.ou_bu_id = pOuId AND
  817.         A.tenant_id = pTenantId AND
  818.         A.product_id = E.product_id
  819.     GROUP BY 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;
  820.    
  821.     /*
  822.      * hitung harga rata-rata sebagai dasar harga pokok product assembly
  823.      */
  824.     INSERT INTO tt_in_summary_monthly_assembly_cogs
  825.     (session_id, date_year_month, tenant_id, ou_id,
  826.     product_id, qty_total, curr_code, amount_total, avg_price)
  827.     SELECT pSessionId, pYearMonth, A.tenant_id, A.ou_bu_id,
  828.         A.product_id, SUM(A.qty), A.gl_curr_code, SUM(A.gl_amount), SUM(A.gl_amount) / SUM(A.qty)
  829.     FROM tt_in_summary_monthly_product_assembly A
  830.     WHERE A.session_id = pSessionId
  831.     GROUP BY A.tenant_id, A.ou_bu_id, A.product_id, A.gl_curr_code;
  832.    
  833.     /*
  834.      * buat data transaksi yang menggunakan product assembly
  835.      * DO (311), DO Receipt(526)  POS Shop (431), POS Shop In Shop (431)
  836.      * Adj Stok Qty (521) < 0
  837.      * NK, 16 Feb 2015 :
  838.      * DO Internal, Sales Invoice Konsinyasi,Return POS Shop,Return POS Shop In Shop tidak digunakan
  839.      */
  840.     INSERT INTO tt_in_summary_monthly_product_assembly
  841.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  842.     doc_type_id, product_id, base_uom_id, qty,
  843.     gl_curr_code, gl_amount, flg_amount)
  844.     SELECT pSessionId, pYearMonth, A.tenant_id, B.ou_bu_id, B.ou_branch_id, B.ou_sub_bu_id,
  845.         A.doc_type_id, A.product_id, A.base_uom_id, SUM(A.qty),
  846.         vCurrGL, 0, 'MONTHLY_AVG'
  847.     FROM in_log_product_balance_stock A, m_ou_structure B, dt_date C, vw_finish_goods_product_assembly E
  848.     WHERE A.ou_id = B.ou_id AND
  849.         B.ou_bu_id = pOuId AND
  850.         A.doc_date = C.string_date AND
  851.         C.year_month_date = pYearMonth AND
  852.         A.doc_type_id IN (311,431,526) AND
  853.         A.product_id = E.product_id
  854.     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;  
  855.  
  856.     INSERT INTO tt_in_summary_monthly_product_assembly
  857.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  858.     doc_type_id, product_id, base_uom_id, qty,
  859.     gl_curr_code, gl_amount, flg_amount)
  860.     SELECT pSessionId, pYearMonth, A.tenant_id, B.ou_bu_id, B.ou_branch_id, B.ou_sub_bu_id,
  861.         A.doc_type_id, A.product_id, A.base_uom_id, SUM(A.qty),
  862.         vCurrGL, 0, 'MONTHLY_AVG'
  863.     FROM in_log_product_balance_stock A, m_ou_structure B, dt_date C, vw_finish_goods_product_assembly E
  864.     WHERE A.ou_id = B.ou_id AND
  865.         B.ou_bu_id = pOuId AND
  866.         A.doc_date = C.string_date AND
  867.         C.year_month_date = pYearMonth AND
  868.         A.doc_type_id IN (521) AND
  869.         A.product_id = E.product_id AND
  870.         A.qty < 0
  871.     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;  
  872. /* NK, 26 Jan 2014 
  873.  * adj stok qty sudah dipisahkan untuk data log menjadi qty > 0 dan qty < 0
  874.     INSERT INTO tt_in_summary_monthly_product_assembly
  875.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  876.     doc_type_id, product_id, base_uom_id, qty,
  877.     gl_curr_code, gl_amount, flg_amount)
  878.     SELECT pSessionId, pYearMonth, A.tenant_id, C.ou_bu_id, C.ou_branch_id, C.ou_sub_bu_id,
  879.         A.doc_type_id, B.product_id, B.base_uom_id, SUM(B.qty_realization),
  880.         vCurrGL, 0, 'MONTHLY_AVG'
  881.     FROM in_inventory A, in_inventory_item B, m_ou_structure C, dt_date D, vw_finish_goods_product_assembly E
  882.     WHERE A.ou_from_id = C.ou_id AND
  883.         C.ou_bu_id = pOuId AND
  884.         A.inventory_id = B.inventory_id AND
  885.         A.doc_date = D.string_date AND
  886.         D.date_year_month = pYearMonth AND
  887.         A.doc_type_id IN (521) AND
  888.         B.qty_realization < 0 AND
  889.         B.product_id = E.product_id
  890.     GROUP BY A.tenant_id, C.ou_bu_id, C.ou_branch_id, C.ou_sub_bu_id, A.doc_type_id, B.product_id, B.base_uom_id;
  891. */     
  892.     UPDATE tt_in_summary_monthly_product_assembly SET gl_amount = ROUND(qty * (A.amount_total / A.qty_total), vRoundingDigit)
  893.     FROM tt_in_summary_monthly_assembly_cogs A
  894.     WHERE A.session_id = pSessionId AND
  895.         tt_in_summary_monthly_product_assembly.session_id = A.session_id AND
  896.         tt_in_summary_monthly_product_assembly.tenant_id = A.tenant_id AND
  897.         tt_in_summary_monthly_product_assembly.ou_bu_id = A.ou_id AND
  898.         tt_in_summary_monthly_product_assembly.product_id = A.product_id AND
  899.         tt_in_summary_monthly_product_assembly.doc_type_id IN (311,431,526,521) AND
  900.         tt_in_summary_monthly_product_assembly.flg_amount = 'MONTHLY_AVG' AND
  901.         A.qty_total <> 0;
  902.        
  903.     /*
  904.      * Persiapan data saldo awal untuk bulan berikutnya. Periksa terlebih dahulu apakah ada data yg qty = 0, tetapi gl_amount <> 0.
  905.      * Nilai gl_amount tsb akan dialokasikan ke data transaksi pengeluaran stok dengan id terbesar untuk product ybs.
  906.      */
  907.     INSERT INTO tt_in_summary_monthly_amount_remain_assembly
  908.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  909.     doc_type_id, product_id, base_uom_id, qty,
  910.     gl_curr_code, gl_amount, flg_amount, summary_monthly_product_assembly_id)
  911.     SELECT pSessionId, A.date_year_month, A.tenant_id, A.ou_bu_id, vEmptyId, vEmptyId,
  912.         vDocTypeAwal, A.product_id, A.base_uom_id, SUM(A.qty),
  913.         vCurrGL, SUM(A.gl_amount), 'BGN_BALANCE', vEmptyId
  914.     FROM tt_in_summary_monthly_product_assembly A
  915.     WHERE A.session_id = pSessionId
  916.     GROUP BY A.date_year_month, A.tenant_id, A.ou_bu_id, A.product_id, A.base_uom_id;
  917.    
  918.     -- Cari id data sebagai penampung alokasi nilai
  919.     UPDATE tt_in_summary_monthly_amount_remain_assembly
  920.         SET summary_monthly_product_assembly_id = (
  921.             SELECT MAX(A.summary_monthly_product_assembly_id)
  922.             FROM tt_in_summary_monthly_product_assembly A
  923.             WHERE A.session_id = pSessionId AND
  924.                 tt_in_summary_monthly_amount_remain_assembly.session_id = A.session_id AND
  925.                 tt_in_summary_monthly_amount_remain_assembly.date_year_month = A.date_year_month AND
  926.                 tt_in_summary_monthly_amount_remain_assembly.tenant_id = A.tenant_id AND
  927.                 tt_in_summary_monthly_amount_remain_assembly.ou_bu_id = A.ou_bu_id AND
  928.                 tt_in_summary_monthly_amount_remain_assembly.product_id = A.product_id AND
  929.                 A.doc_type_id IN (311,431,526,521) AND
  930.                 A.flg_amount = 'MONTHLY_AVG')
  931.     WHERE session_id = pSessionId AND qty = 0 AND gl_amount <> 0;
  932.    
  933.     /*
  934.      * NK, 16 Feb 2015
  935.      * simpan terlebih dahulu data product yang qty = 0, dan nilai <> 0
  936.      * dimana nilai dari product tersebut akan dialokasi ke trx yang menggunakan produk tersebut
  937.      */
  938.     INSERT INTO in_summary_monthly_zero_qty_amount
  939.     (date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  940.     product_id, qty_sum, base_uom_id, gl_curr_code, amount_sum,
  941.     doc_type_id, qty, gl_amount)
  942.     SELECT A.date_year_month, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  943.         A.product_id, A.qty, A.base_uom_id, A.gl_curr_code, A.gl_amount,
  944.         B.doc_type_id, B.qty, B.gl_amount
  945.     FROM tt_in_summary_monthly_amount_remain_assembly A, tt_in_summary_monthly_product_assembly B
  946.     WHERE A.session_id = pSessionId AND
  947.         A.summary_monthly_product_assembly_id <> vEmptyId AND
  948.         B.summary_monthly_product_assembly_id = A.summary_monthly_product_assembly_id;
  949.    
  950.     UPDATE tt_in_summary_monthly_product_assembly SET gl_amount = tt_in_summary_monthly_product_assembly.gl_amount - A.gl_amount
  951.     FROM tt_in_summary_monthly_amount_remain_assembly A
  952.     WHERE A.session_id = pSessionId AND
  953.         A.summary_monthly_product_assembly_id <> vEmptyId AND
  954.         tt_in_summary_monthly_product_assembly.summary_monthly_product_assembly_id = A.summary_monthly_product_assembly_id;
  955.        
  956.     /*
  957.      * untuk menghitung saldo akhir di bulan tersebut, dengan cara membuat record saldo awal untuk bulan berikutnya
  958.      */    
  959.     INSERT INTO tt_in_summary_monthly_product_assembly
  960.     (session_id, date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  961.     doc_type_id, product_id, base_uom_id, qty, gl_curr_code, gl_amount, flg_amount)
  962.     SELECT A.session_id, vNextYearMonth, A.tenant_id, A.ou_bu_id, A.ou_branch_id, A.ou_sub_bu_id,
  963.         A.doc_type_id, A.product_id, A.base_uom_id, A.qty, A.gl_curr_code, A.gl_amount, A.flg_amount
  964.     FROM tt_in_summary_monthly_amount_remain_assembly A
  965.     WHERE A.session_id = pSessionId AND A.qty > 0;
  966.            
  967.     INSERT INTO in_summary_monthly_assembly_cogs
  968.     (date_year_month, tenant_id, ou_id, product_id,
  969.     qty_total, curr_code, amount_total, avg_price,
  970.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  971.     SELECT A.date_year_month, A.tenant_id, A.ou_id, A.product_id,
  972.             A.qty_total, A.curr_code, A.amount_total, A.avg_price,
  973.             0, pDatetime, pUserId, pDatetime, pUserId
  974.     FROM tt_in_summary_monthly_assembly_cogs A
  975.     WHERE A.session_id = pSessionId;
  976.        
  977.     INSERT INTO in_summary_monthly_amount
  978.     (date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  979.     doc_type_id, product_id, base_uom_id, qty,
  980.     gl_curr_code, gl_amount, flg_amount,
  981.     "version", create_datetime, create_user_id, update_datetime, update_user_id, remark)
  982.     SELECT A.date_year_month, A.tenant_id, A.ou_bu_id, vEmptyId, vEmptyId,
  983.             A.doc_type_id, A.product_id, A.base_uom_id, SUM(A.qty),
  984.             A.gl_curr_code, SUM(A.gl_amount), A.flg_amount,
  985.             0, pDatetime, pUserId, pDatetime, pUserId, vGroupProductFG
  986.     FROM tt_in_summary_monthly_product_assembly A
  987.     WHERE A.session_id = pSessionId AND
  988.             A.date_year_month = pYearMonth AND
  989.             A.doc_type_id <> vDocTypeAwal
  990.     GROUP BY A.date_year_month, A.tenant_id, A.ou_bu_id, A.doc_type_id, A.product_id,
  991.              A.base_uom_id, A.gl_curr_code, A.flg_amount;
  992.  
  993.     INSERT INTO in_summary_monthly_amount
  994.     (date_year_month, tenant_id, ou_bu_id, ou_branch_id, ou_sub_bu_id,
  995.     doc_type_id, product_id, base_uom_id, qty,
  996.     gl_curr_code, gl_amount, flg_amount,
  997.     "version", create_datetime, create_user_id, update_datetime, update_user_id, remark)
  998.     SELECT A.date_year_month, A.tenant_id, A.ou_bu_id, vEmptyId, vEmptyId,
  999.         A.doc_type_id, A.product_id, A.base_uom_id, SUM(A.qty),
  1000.         A.gl_curr_code, SUM(A.gl_amount), A.flg_amount,
  1001.         0, pDatetime, pUserId, pDatetime, pUserId, vGroupProductFG
  1002.     FROM tt_in_summary_monthly_product_assembly A
  1003.     WHERE A.session_id = pSessionId AND
  1004.         A.date_year_month = vNextYearMonth
  1005.     GROUP BY A.date_year_month, A.tenant_id, A.ou_bu_id, A.doc_type_id, A.product_id,
  1006.              A.base_uom_id, A.gl_curr_code, A.flg_amount;
  1007.        
  1008.     DELETE FROM tt_in_doc_product_price WHERE session_id = pSessionId;
  1009.    
  1010.     DELETE FROM tt_in_add_product_unamount WHERE session_id = pSessionId;
  1011.    
  1012.     DELETE FROM tt_in_product_base_price WHERE session_id = pSessionId;
  1013.    
  1014.     DELETE FROM tt_in_summary_monthly_product WHERE session_id = pSessionId;
  1015.    
  1016.     DELETE FROM tt_in_summary_monthly_cogs WHERE session_id = pSessionId;
  1017.    
  1018.     DELETE FROM tt_in_summary_monthly_amount_remain WHERE session_id = pSessionId;
  1019.    
  1020.     DELETE FROM tt_in_summary_monthly_assembly_cogs WHERE session_id = pSessionId; 
  1021.    
  1022.     DELETE FROM tt_in_summary_monthly_product_assembly WHERE session_id = pSessionId;
  1023.    
  1024.     DELETE FROM tt_in_summary_monthly_amount_remain_assembly WHERE session_id = pSessionId;
  1025.    
  1026.  END;
  1027. $BODY$
  1028.   LANGUAGE plpgsql VOLATILE
  1029.   COST 100;
  1030.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement