Advertisement
dchrissandy

Untitled

Nov 20th, 2020
1,363
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Function: public.f_update_mstr_min_sell_price_from_hpp_avg(character varying, bigint, bigint, bigint, character varying)
  2.  
  3. -- DROP FUNCTION public.f_update_mstr_min_sell_price_from_hpp_avg(character varying, bigint, bigint, bigint, character varying);
  4.  
  5. CREATE OR REPLACE FUNCTION f_update_mstr_min_sell_price_from_hpp_avg(
  6.     character varying,
  7.     bigint,
  8.     bigint,
  9.     bigint,
  10.     character varying)
  11.   RETURNS void AS
  12. $BODY$
  13. DECLARE
  14.     pSessionId                      alias for $1;
  15.     pTenantId                       alias for $2;
  16.     pOuId                           alias for $3;
  17.     pUserId                         alias for $4;
  18.     pDatetime                       alias for $5;
  19.  
  20.     vLedgerCodeCostFg               character varying(7) := 'COST.FG';
  21.     vLastProcessedYearMonth         character varying(6);
  22.     vNextYearMonthFromLastProcessed character varying(6);
  23.     vCurrentDatetime                character varying(14);
  24.     vCurrentYearMonth               character varying(6);
  25.     vDocTypeIdRG                    bigint := 111;
  26.     vDocTypeIdAdjStockAmount        bigint := 522;
  27.     vDocTypeIdSaldoAwal             bigint := -99;
  28.     vOuBuId                         bigint ;
  29.     vDataTypeBeg                    character varying(8) := 'BEG';
  30.     vDataTypeTrx                    character varying(8) := 'TRX';
  31.     vDataTypeHppAvg                 character varying(12) := 'HPP-AVG';
  32.     vEmptyAmount                    numeric := 0;
  33.  
  34.     vOuExceptionSellPrice           character varying := '';
  35.     vLevelPriceSpecial              character varying := '';
  36.     vTimeMillisecond                character varying := '';
  37.     vDigitRounding                  integer := 0;
  38.  
  39. BEGIN
  40.    
  41.     -- hapus data pada table temporary
  42.     DELETE FROM tt_calculate_hpp_avg WHERE session_id = pSessionId;
  43.  
  44.     -- prosesnya akan dijalankan jika di table tt_item_for_calc_hpp_average ada datanya (list product yg akan diproses)
  45.     IF EXISTS (SELECT 1 FROM tt_item_for_calc_hpp_average WHERE session_id = pSessionId) THEN
  46.  
  47.         RAISE NOTICE '-- proses hitung harga pokok penjualan (HPP) -- ';  
  48.  
  49.         -- get digit rounding untuk perhitungan harga rata-rata
  50.         SELECT CAST(f_get_value_system_config_by_param_code(pTenantId, 'rounding.hpp.average') AS integer) INTO vDigitRounding;
  51.  
  52.         -- get daftar ou exception sell price & level price special
  53.         SELECT f_get_value_system_config_by_param_code(pTenantId, 'SELL.PRICE.SO.OU.EXCEPTION') INTO vOuExceptionSellPrice;
  54.         SELECT f_get_value_system_config_by_param_code(pTenantId, 'SELL.PRICE.SO.LEVELPRICE.SPECIAL') INTO vLevelPriceSpecial;
  55.        
  56.         -- get nilai current datetime, current year month, & time millisecond
  57.         SELECT TO_CHAR(CURRENT_TIMESTAMP, 'YYYYMMDDHH24MISS') INTO vCurrentDatetime;
  58.         SELECT LEFT(vCurrentDatetime,6) INTO vCurrentYearMonth;
  59.         SELECT CAST(extract(epoch from now()) AS character varying) INTO vTimeMillisecond;
  60.        
  61.         -- get nilai ou bu id
  62.         SELECT ou_bu_id INTO vOuBuId
  63.         FROM m_ou_structure B
  64.         WHERE ou_id = pOuId;
  65.  
  66.         -- ambil bulan terakhir closing ledger COST.FG
  67.         SELECT COALESCE(MAX(A.date_year_month),' ') INTO vLastProcessedYearMonth   
  68.         FROM m_admin_process_ledger A
  69.         WHERE A.tenant_id = pTenantId AND
  70.             A.ou_id = vOuBuId AND
  71.             A.status_ledger = '1' AND
  72.             A.ledger_code = vLedgerCodeCostFg AND
  73.             A.date_year_month < vCurrentYearMonth;
  74.  
  75.         SELECT TO_CHAR(TO_DATE(vLastProcessedYearMonth,'YYYYMM') + interval '1 Month','YYYYMM') INTO vNextYearMonthFromLastProcessed;
  76.        
  77.         /* ambil data saldo awal hasil proses costing terakhir
  78.         (in_summary_monthly_amount yg date_year_month = thn bln terakhir closing + 1, doc type id = -99,
  79.         produk sesuai yg dimasukan ke table tt_item_for_calc_hpp_average >> yg diinsert di func submit RG & Adj Stock Amount) */
  80.         INSERT INTO tt_calculate_hpp_avg(
  81.                 session_id, data_type, product_id, qty, amount, hpp_avg )
  82.         SELECT  pSessionId, vDataTypeBeg, A.product_id, A.qty, A.gl_amount, vEmptyAmount
  83.         FROM in_summary_monthly_amount A
  84.         INNER JOIN tt_item_for_calc_hpp_average B ON B.session_id = pSessionId AND A.product_id = B.product_id
  85.         WHERE A.tenant_id = pTenantId
  86.             AND A.ou_bu_id = vOuBuId
  87.             AND A.date_year_month = vNextYearMonthFromLastProcessed
  88.             AND A.doc_type_id = vDocTypeIdSaldoAwal;
  89.  
  90.         /* ambil semua nilai pembelian (doc type id RG = 111) dan adj stock amount(522)
  91.         dari table in_product_price_balance, yg product_buy_date nya >= tgl 1 dari (thn bln closing+1),
  92.         produk sesuai yg dimasukan ke table tt_item_for_calc_hpp_average >> yg diinsert di func submit RG & Adj Stock Amount)  */
  93.         INSERT INTO tt_calculate_hpp_avg(
  94.                 session_id, data_type, product_id, qty, amount, hpp_avg )
  95.         SELECT  pSessionId, vDataTypeTrx, A.product_id, A.qty, A.amount, vEmptyAmount
  96.         FROM in_product_price_balance A
  97.         INNER JOIN tt_item_for_calc_hpp_average B ON B.session_id = pSessionId AND A.product_id = B.product_id
  98.         INNER JOIN m_ou_structure C ON A.ou_id = C.ou_id
  99.         WHERE A.tenant_id = pTenantId
  100.             AND C.ou_bu_id = vOuBuId
  101.             AND A.doc_type_id IN (vDocTypeIdRG, vDocTypeIdAdjStockAmount)
  102.             AND LEFT(A.product_buy_date,6) >= vNextYearMonthFromLastProcessed
  103.             AND A.qty > 0;
  104.  
  105.         /* Tulis log data perhitungan harga jual sementara:
  106.             a. Saldo awal dari hasil proses costing (date year month = last closing, data type = ‘BEG’)
  107.             b. Summary trx dari product price balance (date year month = current year month, data type = ‘TRX’) */
  108.         INSERT INTO in_log_calculate_hpp_avg(
  109.                 tenant_id, product_id, qty, amount,
  110.                 date_year_month, data_type, time_millisecond, create_datetime,
  111.                 create_user_id, update_datetime, update_user_id, version)
  112.         SELECT  pTenantId, product_id, SUM(qty) AS qty, SUM(amount) AS amount,
  113.                 CASE WHEN data_type = vDataTypeBeg THEN vLastProcessedYearMonth
  114.                      ELSE vCurrentYearMonth END AS date_year_month,
  115.                 data_type, vTimeMillisecond, vCurrentDatetime,
  116.                 pUserId, vCurrentDatetime, pUserId, 0
  117.         FROM tt_calculate_hpp_avg
  118.         WHERE session_id = pSessionId
  119.         GROUP BY product_id, data_type
  120.         ORDER BY data_type;
  121.  
  122.         -- hitung harga pokok penjualan (hpp) rata-rata berdasarkan data saldo awal & nilai pembelian trx
  123.         INSERT INTO tt_calculate_hpp_avg(
  124.                 session_id, data_type, product_id,
  125.                 qty, amount, hpp_avg )  
  126.         SELECT  pSessionId, vDataTypeHppAvg, product_id,
  127.                 SUM(qty) AS qty, SUM(amount) AS amount, (SUM(amount)/SUM(qty)) AS hpp_avg
  128.         FROM tt_calculate_hpp_avg
  129.         WHERE session_id = pSessionId
  130.         GROUP BY product_id;
  131.  
  132.  
  133.         RAISE NOTICE '-- proses insert log & update master harga jual -- ';
  134.        
  135.         /* Tulis log master harga jual sblm diupdate, khusus untuk harga jual yg akan diupdate saja
  136.             Data master harga jual yg diupdate:
  137.             - sesuai dengan product RG/Adjustment stock yg dikirim
  138.             - yg berlaku saat ini
  139.             - untuk ou & level price tertentu
  140.                 -> berdasarkan value dari sysconfig `SELL.PRICE.SO.OU.EXCEPTION` & `SELL.PRICE.SO.LEVELPRICE.SPECIAL` */
  141.         INSERT INTO m_log_sell_price_product_for_so(
  142.                 sell_price_product_for_so_id, tenant_id, ou_id, product_id, date_from, date_to,
  143.                 curr_code, gross_sell_price, flg_tax_amount, tax_id, tax_amount, sell_price,
  144.                 min_sell_price, price_level, create_datetime, create_user_id,
  145.                 update_datetime, update_user_id, version, time_millisecond)
  146.         SELECT  B.sell_price_product_for_so_id, B.tenant_id, B.ou_id, B.product_id, B.date_from, B.date_to,
  147.                 B.curr_code, B.gross_sell_price, B.flg_tax_amount, B.tax_id, B.tax_amount, B.sell_price,
  148.                 B.min_sell_price, B.price_level, vCurrentDatetime, pUserId,
  149.                 vCurrentDatetime, pUserId, 0, vTimeMillisecond
  150.         FROM tt_calculate_hpp_avg A
  151.         INNER JOIN m_sell_price_product_for_so B ON A.product_id = B.product_id
  152.         INNER JOIN t_ou C ON B.ou_id = C.ou_id
  153.         WHERE A.session_id = pSessionId
  154.             AND A.data_type = vDataTypeHppAvg
  155.             AND B.tenant_id = pTenantId
  156.             AND C.ou_code = ANY(string_to_array(vOuExceptionSellPrice, ','))
  157.             AND LEFT(vCurrentDatetime, 8) BETWEEN B.date_from AND B.date_to
  158.             AND B.price_level = vLevelPriceSpecial;    
  159.  
  160.  
  161.         /* Update master min sell price so = hasil hitung harga pokok penjualan (hpp) rata-rata
  162.             Data master harga jual yg diupdate:
  163.             - sesuai dengan product RG/Adjustment stock yg dikirim
  164.             - yg berlaku saat ini
  165.             - untuk ou & level price tertentu
  166.                 -> berdasarkan value dari sysconfig `SELL.PRICE.SO.OU.EXCEPTION` & `SELL.PRICE.SO.LEVELPRICE.SPECIAL` */
  167.         UPDATE m_sell_price_product_for_so A
  168.         SET min_sell_price = ROUND(B.hpp_avg, vDigitRounding),
  169.             version = A.version + 1,
  170.             update_user_id = pUserId,
  171.             update_datetime = vCurrentDatetime
  172.         FROM tt_calculate_hpp_avg B, t_ou C
  173.         WHERE B.session_id = pSessionId
  174.             AND B.data_type = vDataTypeHppAvg
  175.             AND B.product_id = A.product_id
  176.             AND A.tenant_id = pTenantId
  177.             AND A.ou_id = C.ou_id
  178.             AND C.ou_code = ANY(string_to_array(vOuExceptionSellPrice, ','))
  179.             AND LEFT(vCurrentDatetime, 8) BETWEEN A.date_from AND A.date_to
  180.             AND A.price_level = vLevelPriceSpecial;
  181.  
  182.     END IF;
  183.  
  184.     -- hapus data pada table temporary
  185.     DELETE FROM tt_calculate_hpp_avg WHERE session_id = pSessionId;
  186.     DELETE FROM tt_item_for_calc_hpp_average WHERE session_id = pSessionId;
  187.    
  188.  
  189. END
  190. $BODY$
  191.   LANGUAGE plpgsql VOLATILE
  192.   COST 100;
  193. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement