aadddrr

in_process_costing_finish_goods

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