Advertisement
tercnem

r_summary_mutation_stock

Apr 29th, 2019
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION r_summary_mutation_stock(character varying, bigint, bigint, character varying, bigint, character varying, bigint, bigint, bigint, character varying, character varying, character varying)
  2.   RETURNS SETOF refcursor AS
  3. $BODY$
  4. DECLARE
  5.     pRefHeader                  REFCURSOR := 'refHeader';
  6.     pRefDetail                  REFCURSOR := 'refDetail';
  7.     pSessionId                  ALIAS FOR $1;
  8.     pTenantId                   ALIAS FOR $2;
  9.     pUserId                     ALIAS FOR $3;
  10.     pDatetime                   ALIAS FOR $4;
  11.     pOuId                       ALIAS FOR $5;
  12.     pProductCodeName            ALIAS FOR $6;
  13.     pCtgrProductId              ALIAS FOR $7;
  14.     pSubCtgrProductId           ALIAS FOR $8;
  15.     pBrandId                    ALIAS FOR $9;
  16.     pStartDate                  ALIAS FOR $10;
  17.     pEndDate                    ALIAS FOR $11;
  18.     pFlgConsignment             ALIAS FOR $12;
  19.    
  20.     vLastClosingGeneralLedger   character varying := '';
  21.     vStartDateLog               character varying := '';
  22.     vEndDateLog                 character varying := '';
  23.     vEmptyId                    bigint := -99;
  24.     vEmptyValue                 character varying := '';
  25.     vFilterOuId                 character varying := '';
  26.     vFilterProduct              character varying := '';
  27.     vFilterCtgrProductId        character varying := '';
  28.     vFilterSubCtgrProductId     character varying := '';
  29.     vFilterBrandId              character varying := '';
  30.     vStartMonthlyQtyDate        character varying := '';
  31.     vEndMonthlyQtyDate          character varying := '';
  32.     vNo                         character varying := 'N';
  33.     vYes                        character varying := 'Y';
  34.    
  35. BEGIN
  36.    
  37.     DELETE FROM tr_summary_mutation_stock WHERE session_id = pSessionId;
  38.    
  39.     -- last closing ledger sebelum pStartDate
  40.     SELECT COALESCE(MAX(date_year_month), '') AS last_closing_gl INTO vLastClosingGeneralLedger
  41.     FROM m_admin_process_ledger
  42.     WHERE tenant_id = pTenantId AND
  43.         ou_id = pOuId AND
  44.         ledger_code = 'GL' AND
  45.         status_ledger = '1' AND
  46.         date_year_month <= SUBSTRING(pStartDate, 1, 6);
  47.    
  48.     -- tanggal awal untuk transaksi diantara tgl saldo awal sampai sebelum pStartDate
  49.     vStartDateLog = vLastClosingGeneralLedger || '01';
  50.     SELECT TO_CHAR(TO_DATE(pStartDate,'YYYYMMDD') + interval '-1 Day','YYYYMMDD') INTO vEndDateLog;
  51.    
  52.     IF pOuId <> vEmptyId THEN
  53.         vFilterOuId := ' AND A.ou_id = ' || pOuId;
  54.     END IF;
  55.    
  56.     IF pProductCodeName <> vEmptyValue THEN
  57.         vFilterProduct := ' AND (UPPER(B.product_code) LIKE UPPER(''%' || pProductCodeName || '%'') OR UPPER(B.product_name) LIKE UPPER(''%' || pProductCodeName || '%'')) ';
  58.     END IF;
  59.    
  60.     IF pCtgrProductId <> vEmptyId THEN
  61.         vFilterCtgrProductId := ' AND B.ctgr_product_id = ' || pCtgrProductId;
  62.     END IF;
  63.    
  64.     IF pSubCtgrProductId <> vEmptyId THEN
  65.         vFilterSubCtgrProductId := ' AND B.sub_ctgr_product_id = ' || pSubCtgrProductId;
  66.     END IF;
  67.    
  68.     IF pBrandId <> vEmptyId THEN
  69.         vFilterBrandId := ' AND B.brand_id = ' || pBrandId;
  70.     END IF;
  71.    
  72.     -- insert from log product
  73.     IF pFlgConsignment = 'N' THEN
  74.         EXECUTE '
  75.         INSERT INTO tr_summary_mutation_stock(
  76.             session_id, tenant_id, ou_id, product_id, product_code, product_name,
  77.             product_balance_id, total_amount, last_balance_qty, mutasi_minus, mutasi_positif, expectation
  78.         )
  79.         SELECT $1, $2, $3, A.product_id, A.product_code, A.product_name,
  80.                 A.product_balance_id, 0, 0, SUM(A.mutasi_minus), SUM(A.mutasi_positif), 0
  81.         FROM (
  82.             SELECT A.product_id, B.product_code, B.product_name,
  83.                     A.product_balance_id, ABS(CASE WHEN qty < 0 THEN qty ELSE 0 END) AS mutasi_minus,
  84.                     CASE WHEN qty >= 0 THEN qty ELSE 0 END AS mutasi_positif
  85.             FROM in_log_product_balance_stock A
  86.             INNER JOIN m_product B ON A.product_id = B.product_id
  87.             INNER JOIN m_product_custom C ON B.product_id = C.product_id
  88.             WHERE A.doc_date BETWEEN $4 AND $5
  89.                 AND A.ou_id = $3
  90.                 AND C.flg_buy_konsinyasi = $6 ' ||
  91.                 vFilterProduct ||
  92.                 vFilterCtgrProductId ||
  93.                 vFilterSubCtgrProductId ||
  94.                 vFilterBrandId ||
  95.             ' UNION ALL
  96.             SELECT A.product_id, B.product_code, B.product_name,
  97.                     A.product_balance_id, 0, 0, ABS(CASE WHEN qty < 0 THEN qty ELSE 0 END) AS mutasi_minus,
  98.                     CASE WHEN qty >= 0 THEN qty ELSE 0 END AS mutasi_positif  
  99.             FROM in_log_product_consignment_balance_stock A
  100.             INNER JOIN m_product B ON A.product_id = B.product_id
  101.             INNER JOIN m_product_custom C ON B.product_id = C.product_id
  102.             WHERE A.doc_date BETWEEN $4 AND $5
  103.                 AND A.ou_id = $3
  104.                 AND C.flg_buy_konsinyasi = $6 ' ||
  105.                 vFilterProduct ||
  106.                 vFilterCtgrProductId ||
  107.                 vFilterSubCtgrProductId ||
  108.                 vFilterBrandId ||
  109.             ' ) A
  110.             GROUP BY A.product_id, A.product_code, A.product_name, A.product_balance_id '
  111.         USING pSessionId, pTenantId, pOuId, pStartDate, pEndDate, vNo;
  112.        
  113.     ELSE
  114.         EXECUTE '
  115.         INSERT INTO tr_summary_mutation_stock(
  116.             session_id, tenant_id, ou_id, product_id, product_code, product_name,
  117.             product_balance_id, total_amount, last_balance_qty, mutasi_minus, mutasi_positif, expectation
  118.         )
  119.         SELECT $1, $2, $3, A.product_id, A.product_code, A.product_name,
  120.                 A.product_balance_id, 0, 0, SUM(A.mutasi_minus), SUM(A.mutasi_positif), 0
  121.         FROM (
  122.             SELECT A.product_id, B.product_code, B.product_name,
  123.                     A.product_balance_id, ABS(CASE WHEN qty < 0 THEN qty ELSE 0 END) AS mutasi_minus,
  124.                     CASE WHEN qty >= 0 THEN qty ELSE 0 END AS mutasi_positif  
  125.             FROM in_log_product_balance_stock A
  126.             INNER JOIN m_product B ON A.product_id = B.product_id
  127.             INNER JOIN m_product_custom C ON B.product_id = C.product_id
  128.             WHERE A.doc_date BETWEEN $4 AND $5
  129.                 AND A.ou_id = $3
  130.                 AND C.flg_buy_konsinyasi = $6
  131.                 AND A.doc_type_id <> 111 ' ||
  132.                 vFilterProduct ||
  133.                 vFilterCtgrProductId ||
  134.                 vFilterSubCtgrProductId ||
  135.                 vFilterBrandId ||
  136.             ' UNION ALL
  137.             SELECT A.product_id, B.product_code, B.product_name,
  138.                     A.product_balance_id, ABS(CASE WHEN qty < 0 THEN qty ELSE 0 END) AS mutasi_minus,
  139.                     CASE WHEN qty >= 0 THEN qty ELSE 0 END AS mutasi_positif  
  140.             FROM in_log_product_consignment_balance_stock A
  141.             INNER JOIN m_product B ON A.product_id = B.product_id
  142.             INNER JOIN m_product_custom C ON B.product_id = C.product_id
  143.             WHERE A.doc_date BETWEEN $4 AND $5
  144.                 AND A.ou_id = $3
  145.                 AND C.flg_buy_konsinyasi = $6 ' ||
  146.                 vFilterProduct ||
  147.                 vFilterCtgrProductId ||
  148.                 vFilterSubCtgrProductId ||
  149.                 vFilterBrandId ||
  150.             ' ) A
  151.             GROUP BY A.product_id, A.product_code, A.product_name, A.product_balance_id '
  152.         USING pSessionId, pTenantId, pOuId, pStartDate, pEndDate, vYes;
  153.        
  154.     END IF;
  155.    
  156.     -- update nilai saldo awal qty
  157.     IF pFlgConsignment = 'N' THEN
  158.         WITH tt_in_summary_monthly_qty AS (
  159.             SELECT tenant_id, product_id, product_balance_id, SUM(qty) AS qty
  160.             FROM in_summary_monthly_qty
  161.             WHERE tenant_id = pTenantId
  162.                 AND doc_type_id = vEmptyId
  163.                 AND date_year_month = vLastClosingGeneralLedger
  164.                 AND ou_id = pOuId
  165.             GROUP BY tenant_id, product_id, product_balance_id
  166.         )
  167.         UPDATE tr_summary_mutation_stock A
  168.         SET last_balance_qty = B.qty,
  169.             expectation = B.qty
  170.         FROM tt_in_summary_monthly_qty B
  171.         WHERE A.tenant_id = B.tenant_id
  172.             AND A.product_id = B.product_id
  173.             AND A.product_balance_id = B.product_balance_id;
  174.     ELSE
  175.         WITH tt_in_summary_monthly_qty AS (
  176.             SELECT tenant_id, product_id, product_balance_id, SUM(qty) AS qty
  177.             FROM in_summary_monthly_qty_consignment
  178.             WHERE tenant_id = pTenantId
  179.                 AND doc_type_id = vEmptyId
  180.                 AND date_year_month = vLastClosingGeneralLedger
  181.                 AND ou_id = pOuId
  182.             GROUP BY tenant_id, product_id, product_balance_id
  183.         )
  184.         UPDATE tr_summary_mutation_stock A
  185.         SET last_balance_qty = B.qty,
  186.             expectation = B.qty
  187.         FROM tt_in_summary_monthly_qty B
  188.         WHERE A.tenant_id = B.tenant_id
  189.             AND A.product_id = B.product_id
  190.             AND A.product_balance_id = B.product_balance_id;
  191.     END IF;
  192.    
  193.     -- insert product yang hanya punya saldo awal qty dan tidak pernah punya log transaksi
  194.     IF pFlgConsignment = 'N' THEN
  195.         EXECUTE '
  196.         INSERT INTO tr_summary_mutation_stock(
  197.             session_id, tenant_id, ou_id, product_id, product_code, product_name,
  198.             product_balance_id, total_amount, last_balance_qty, mutasi_minus, mutasi_positif, expectation
  199.         )
  200.         SELECT $1, $2, $3, A.product_id, B.product_code, B.product_name,
  201.                 A.product_balance_id, 0, SUM(A.qty), 0, 0, SUM(A.qty)
  202.         FROM in_summary_monthly_qty A
  203.         INNER JOIN m_product B ON A.product_id = B.product_id
  204.         INNER JOIN m_product_custom C ON B.product_id = C.product_id
  205.         WHERE A.doc_type_id = $4
  206.                 AND A.date_year_month = $5
  207.                 AND A.ou_id = $3
  208.                 AND C.flg_buy_konsinyasi = $6 ' ||
  209.                 vFilterProduct ||
  210.                 vFilterCtgrProductId ||
  211.                 vFilterSubCtgrProductId ||
  212.                 vFilterBrandId ||
  213.         ' AND NOT EXISTS(
  214.             SELECT 1 FROM tr_summary_mutation_stock D
  215.             WHERE A.tenant_id = D.tenant_id
  216.                 AND A.product_id = D.product_id
  217.                 AND A.product_balance_id = D.product_balance_id
  218.         ) GROUP BY A.product_id, B.product_code, B.product_name, A.product_balance_id '
  219.         USING pSessionId, pTenantId, pOuId, vEmptyId, vLastClosingGeneralLedger, vNo;
  220.     ELSE
  221.        
  222.         EXECUTE '
  223.         INSERT INTO tr_summary_mutation_stock(
  224.             session_id, tenant_id, ou_id, product_id, product_code, product_name,
  225.             product_balance_id, total_amount, last_balance_qty, mutasi_minus, mutasi_positif, expectation
  226.         )
  227.         SELECT $1, $2, $3, A.product_id, B.product_code, B.product_name,
  228.                 A.product_balance_id, 0, SUM(A.qty), 0, 0, SUM(A.qty)
  229.         FROM in_summary_monthly_qty_consignment A
  230.         INNER JOIN m_product B ON A.product_id = B.product_id
  231.         INNER JOIN m_product_custom C ON B.product_id = C.product_id
  232.         WHERE A.doc_type_id = $4
  233.                 AND A.date_year_month = $5
  234.                 AND A.ou_id = $3
  235.                 AND C.flg_buy_konsinyasi = $6 ' ||
  236.                 vFilterProduct ||
  237.                 vFilterCtgrProductId ||
  238.                 vFilterSubCtgrProductId ||
  239.                 vFilterBrandId ||
  240.         ' AND NOT EXISTS(
  241.             SELECT 1 FROM tr_summary_mutation_stock D
  242.             WHERE A.tenant_id = D.tenant_id
  243.                 AND A.product_id = D.product_id
  244.                 AND A.product_balance_id = D.product_balance_id
  245.         ) GROUP BY A.product_id, B.product_code, B.product_name, A.product_balance_id '
  246.         USING pSessionId, pTenantId, pOuId, vEmptyId, vLastClosingGeneralLedger, vYes;
  247.     END IF;
  248.    
  249.     -- update nilai saldo awal amount
  250.     WITH tt_in_summary_monthly_amount AS (
  251.         SELECT tenant_id, product_id, gl_curr_code, SUM(gl_amount) AS gl_amount
  252.         FROM in_summary_monthly_amount
  253.         WHERE tenant_id = pTenantId
  254.             AND doc_type_id = vEmptyId
  255.             AND date_year_month = vLastClosingGeneralLedger
  256.             AND ou_bu_id = (f_get_ou_bu_structure(pOuId)).ou_bu_id
  257.             AND ou_branch_id = (f_get_ou_bu_structure(pOuId)).ou_branch_id
  258.             AND ou_sub_bu_id = (f_get_ou_bu_structure(pOuId)).ou_sub_bu_id
  259.         GROUP BY tenant_id, product_id, gl_curr_code
  260.     )
  261.     UPDATE tr_summary_mutation_stock A
  262.     SET total_amount = B.gl_amount
  263.     FROM tt_in_summary_monthly_amount B
  264.     WHERE A.tenant_id = B.tenant_id
  265.         AND A.product_id = B.product_id;
  266.    
  267.     IF pStartDate <> vStartDateLog THEN
  268.         -- update nilai saldo awal qty + log product
  269.         IF pFlgConsignment = 'N' THEN
  270.             -- product non consignment
  271.             EXECUTE '
  272.             WITH tt_in_log_product_balance_stock AS (
  273.                 SELECT A.tenant_id, A.product_id, A.product_balance_id, SUM(qty) AS qty
  274.                 FROM in_log_product_balance_stock A
  275.                 INNER JOIN m_product B ON A.product_id = B.product_id
  276.                 INNER JOIN m_product_custom C ON B.product_id = C.product_id
  277.                 WHERE A.doc_date BETWEEN $1 AND $2
  278.                     AND A.ou_id = $3
  279.                     AND C.flg_buy_konsinyasi = $4 ' ||
  280.                     vFilterProduct ||
  281.                     vFilterCtgrProductId ||
  282.                     vFilterSubCtgrProductId ||
  283.                     vFilterBrandId ||
  284.                 ' GROUP BY A.tenant_id, A.product_id, A.product_balance_id  
  285.             )
  286.             UPDATE tr_summary_mutation_stock A
  287.             SET last_balance_qty = A.last_balance_qty + B.qty,
  288.                 expectation = A.expectation + B.qty
  289.             FROM tt_in_log_product_balance_stock B
  290.             WHERE A.tenant_id = B.tenant_id
  291.                 AND A.product_id = B.product_id
  292.                 AND A.product_balance_id = B.product_balance_id
  293.             ' USING vStartDateLog, vEndDateLog, pOuId, vNo;
  294.            
  295.             EXECUTE '
  296.             WITH tt_in_log_product_consignment_balance_stock AS (
  297.                 SELECT A.tenant_id, A.product_id, A.product_balance_id, SUM(qty) AS qty
  298.                 FROM in_log_product_consignment_balance_stock A
  299.                 INNER JOIN m_product B ON A.product_id = B.product_id
  300.                 INNER JOIN m_product_custom C ON B.product_id = C.product_id
  301.                 WHERE A.doc_date BETWEEN $1 AND $2
  302.                     AND A.ou_id = $3
  303.                     AND C.flg_buy_konsinyasi = $4 ' ||
  304.                     vFilterProduct ||
  305.                     vFilterCtgrProductId ||
  306.                     vFilterSubCtgrProductId ||
  307.                     vFilterBrandId ||
  308.                 ' GROUP BY A.tenant_id, A.product_id, A.product_balance_id
  309.             )
  310.             UPDATE tr_summary_mutation_stock A
  311.             SET last_balance_qty = A.last_balance_qty + B.qty,
  312.                 expectation = A.expectation + B.qty
  313.             FROM tt_in_log_product_consignment_balance_stock B
  314.             WHERE A.tenant_id = B.tenant_id
  315.                 AND A.product_id = B.product_id
  316.                 AND A.product_balance_id = B.product_balance_id
  317.             ' USING vStartDateLog, vEndDateLog, pOuId, vNo;
  318.         ELSE
  319.             -- product non consignment
  320.             EXECUTE '
  321.             WITH tt_in_log_product_balance_stock AS (
  322.                 SELECT A.tenant_id, A.product_id, A.product_balance_id, SUM(qty) AS qty
  323.                 FROM in_log_product_balance_stock A
  324.                 INNER JOIN m_product B ON A.product_id = B.product_id
  325.                 INNER JOIN m_product_custom C ON B.product_id = C.product_id
  326.                 WHERE A.doc_date BETWEEN $1 AND $2
  327.                     AND A.ou_id = $3
  328.                     AND C.flg_buy_konsinyasi = $4
  329.                     AND A.doc_type_id <> 111 ' ||
  330.                     vFilterProduct ||
  331.                     vFilterCtgrProductId ||
  332.                     vFilterSubCtgrProductId ||
  333.                     vFilterBrandId ||
  334.                 ' GROUP BY A.tenant_id, A.product_id, A.product_balance_id  
  335.             )
  336.             UPDATE tr_summary_mutation_stock A
  337.             SET last_balance_qty = A.last_balance_qty + B.qty,
  338.                 expectation = A.expectation + B.qty
  339.             FROM tt_in_log_product_balance_stock B
  340.             WHERE A.tenant_id = B.tenant_id
  341.                 AND A.product_id = B.product_id
  342.                 AND A.product_balance_id = B.product_balance_id
  343.             ' USING vStartDateLog, vEndDateLog, pOuId, vYes;
  344.            
  345.             EXECUTE '
  346.             WITH tt_in_log_product_consignment_balance_stock AS (
  347.                 SELECT A.tenant_id, A.product_id, A.product_balance_id, SUM(qty) AS qty
  348.                 FROM in_log_product_consignment_balance_stock A
  349.                 INNER JOIN m_product B ON A.product_id = B.product_id
  350.                 INNER JOIN m_product_custom C ON B.product_id = C.product_id
  351.                 WHERE A.doc_date BETWEEN $1 AND $2
  352.                     AND A.ou_id = $3
  353.                     AND C.flg_buy_konsinyasi = $4 ' ||
  354.                     vFilterProduct ||
  355.                     vFilterCtgrProductId ||
  356.                     vFilterSubCtgrProductId ||
  357.                     vFilterBrandId ||
  358.                 ' GROUP BY A.tenant_id, A.product_id, A.product_balance_id
  359.             )
  360.             UPDATE tr_summary_mutation_stock A
  361.             SET last_balance_qty = A.last_balance_qty + B.qty,
  362.                 expectation = A.expectation + B.qty
  363.             FROM tt_in_log_product_consignment_balance_stock B
  364.             WHERE A.tenant_id = B.tenant_id
  365.                 AND A.product_id = B.product_id
  366.                 AND A.product_balance_id = B.product_balance_id
  367.             ' USING vStartDateLog, vEndDateLog, pOuId, vYes;
  368.         END IF;
  369.     END IF;
  370.    
  371.     Open pRefHeader FOR
  372.     SELECT pOuId AS ou_id, f_get_ou_code(pOuId) AS ou_code, f_get_ou_name(pOuId) AS ou_name,   
  373.             pStartDate AS start_date, pEndDate AS end_date, pDatetime AS print_datetime;
  374.     RETURN NEXT pRefHeader;
  375.    
  376.     Open pRefDetail FOR
  377.         SELECT product_id, product_code, product_name, total_amount, last_balance_qty, mutasi_minus, mutasi_positif, expectation
  378.         FROM tr_summary_mutation_stock
  379.         WHERE session_id = pSessionId
  380.             AND tenant_id = pTenantId
  381.         ORDER BY product_code;
  382.     RETURN NEXT pRefDetail ;
  383.    
  384.     DELETE FROM tr_summary_mutation_stock WHERE session_id = pSessionId;
  385. END;
  386. $BODY$
  387.   LANGUAGE plpgsql VOLATILE
  388.   COST 100
  389.   ROWS 1000;
  390. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement