Advertisement
aadddrr

Untitled

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