Advertisement
Guest User

Untitled

a guest
Mar 1st, 2017
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Progress 25.54 KB | None | 0 0
  1. /*
  2.  * Fitra 23 Feb 2017
  3.  * */
  4.  
  5. CREATE OR REPLACE FUNCTION upload_adjustment_stock_qty(bigint)
  6.   RETURNS INTEGER AS
  7. $BODY$
  8.  
  9. DECLARE
  10.     pUlHeaderId             ALIAS FOR $1;
  11.    
  12.     vTenantId                       bigint;
  13.     vCount                          bigint;
  14.     vCountNoSerial                  bigint;
  15.     vCountSerial                    bigint;
  16.     vCountItem                      bigint;
  17.     vStatusOk                       CHARACTER varying;
  18.     vStatusFail                     CHARACTER varying;
  19.     vStatusSkip                     CHARACTER varying;
  20.     vStatusX                        CHARACTER varying;
  21.     vEmpty                          CHARACTER varying;
  22.     vEmptySerialNumber              CHARACTER varying;
  23.     vValidate                       bigint;
  24.     vCurrentDateTime                CHARACTER varying;
  25.     vYes                            CHARACTER varying;
  26.     vNullInt                        bigint;
  27.     vAutonumGeneratedId             bigint;
  28.     vAdjustmentStockQtyDocTypeId    bigint;
  29.     vAdjustmentStockQtyId           bigint;
  30.     vSchemeAdjustmentStockQty       CHARACTER varying;
  31.     vUserId                         bigint;
  32.    
  33.     vDocNo                  CHARACTER varying;
  34.     vDocDate                CHARACTER varying;
  35.     vWarehouseId            bigint;
  36.     vActivityGlId           bigint;
  37.     vOuRcId                 bigint;
  38.     vSeqmentId              bigint;
  39.     vGroupProductId         bigInt;
  40.    
  41. BEGIN
  42.     vStatusOk := 'OK';
  43.     vStatusFail := 'FAIL';
  44.     vStatusSkip := 'SKIP';
  45.     vStatusX := 'X'; -- untuk yang fail karena validasi difungsi ini, akan ditandai X dulu untuk membedakan dengan yang validasi dari Spring batch untuk domain data
  46.     vEmpty := '';
  47.     vEmptySerialNumber := ' ';
  48.     vNullInt=-99;
  49.     vYes :='Y';
  50.     vAdjustmentStockQtyDocTypeId := 521;
  51.     vSchemeAdjustmentStockQty='EA20';
  52.    
  53.     SELECT tenant_id INTO vTenantId
  54.     from ul_header
  55.     WHERE ul_header_id=pUlHeaderId;
  56.    
  57.     SELECT user_id INTO vUserId
  58.     from ul_header
  59.     WHERE ul_header_id=pUlHeaderId;
  60.    
  61.    SELECT f_datetime((extract(epoch from NOW())*1000)::bigint) INTO vCurrentDateTime;
  62.    
  63.    IF isnumeric(f_get_ul_header_value(pUlHeaderId,'adjustmentStockQtyId')) THEN
  64.         vAdjustmentStockQtyId:=f_get_ul_header_value(pUlHeaderId,'adjustmentStockQtyId')::bigint;
  65.    END IF;
  66.    
  67.    SELECT doc_date INTO vDocDate
  68.    FROM in_inventory
  69.    WHERE inventory_id=vAdjustmentStockQtyId;
  70.    
  71.    SELECT doc_no INTO vDocNo
  72.    FROM in_inventory
  73.    WHERE inventory_id=vAdjustmentStockQtyId;
  74.    
  75.    SELECT warehouse_from_id INTO vWarehouseId
  76.    FROM in_inventory
  77.    WHERE inventory_id=vAdjustmentStockQtyId;
  78.    
  79.    SELECT activity_gl_id INTO vActivityGlId
  80.    FROM in_inventory
  81.    WHERE inventory_id=vAdjustmentStockQtyId;
  82.    
  83.    SELECT ou_rc_id INTO vOuRcId
  84.    FROM in_inventory
  85.    WHERE inventory_id=vAdjustmentStockQtyId;
  86.    
  87.    SELECT segment_id INTO vSeqmentId
  88.    FROM in_inventory
  89.    WHERE inventory_id=vAdjustmentStockQtyId;
  90.    
  91.    SELECT group_product_id INTO vGroupProductId
  92.    FROM in_inventory
  93.    WHERE inventory_id=vAdjustmentStockQtyId;
  94.    
  95.    IF isnumeric(f_get_ul_header_value(pUlHeaderId,'groupProductId')) THEN
  96.         vGroupProductId:=f_get_ul_header_value(pUlHeaderId,'groupProductId')::bigint;
  97.    END IF;
  98.    
  99.    --hapus dokumen jika terjadi kesalahan csv
  100.    IF EXISTS(SELECT 1 FROM ul_skip_detail WHERE ul_header_id = pUlHeaderId) THEN
  101.         --update STATUS autonum menjadi unused
  102.         UPDATE autonum_generated SET flg_unused=vYes, update_datetime = vCurrentDateTime, update_user_id = vUserId
  103.         WHERE tenant_id = vTenantId AND
  104.               year_month_date = vDocDate AND
  105.               value_auto_num = vDocNo AND
  106.               scheme = vSchemeAdjustmentStockQty;
  107.        
  108.         SELECT autonum_generated_id INTO vAutonumGeneratedId
  109.         FROM autonum_generated A
  110.         WHERE tenant_id = vTenantId AND
  111.               year_month_date = vDocDate AND
  112.               value_auto_num = vDocNo AND
  113.               scheme = vSchemeAdjustmentStockQty;
  114.        
  115.         --delete autonum_ref_mapping
  116.         DELETE FROM autonum_ref_mapping
  117.         WHERE autonum_generated_id =vAutonumGeneratedId;
  118.        
  119.        
  120.         --delete approval
  121.         DELETE FROM awe_worklist
  122.         WHERE scheme = vSchemeAdjustmentStockQty AND
  123.         tenant_id = vTenantId AND
  124.         doc_id = vAdjustmentStockQtyId AND
  125.         doc_no = vDocNo;
  126.        
  127.         DELETE FROM awe_currdoc_status
  128.         WHERE scheme = vSchemeAdjustmentStockQty AND
  129.         tenant_id = vTenantId AND
  130.         doc_id = vAdjustmentStockQtyId AND
  131.         doc_no = vDocNo;
  132.        
  133.         DELETE FROM in_inventory
  134.         WHERE inventory_id=vAdjustmentStockQtyId;
  135.        
  136.         RETURN vNullInt;
  137.         --RAISE EXCEPTION 'ADA ITEM YANG DI SKIP';
  138.     END IF;
  139.    --update ul_adjustment_stock_qty product serial number yg EMPTY menjadi spasi
  140.    --UPDATE ul_adjustment_stock_qty Z SET serial_number=vEmptySerialNumber
  141.    --WHERE Z.ul_header_id = pUlHeaderId AND serial_number=vEmpty;
  142.    
  143.    --validasi group product
  144.    UPDATE ul_adjustment_stock_qty Z SET STATUS= vStatusSkip , MESSAGE = Z.message||'product skipped due not match group product,'
  145.    FROM ul_header C
  146.    WHERE Z.ul_header_id = pUlHeaderId
  147.    AND Z.status <> vStatusFail
  148.    AND C.ul_header_id=Z.ul_header_id
  149.    AND NOT EXISTS (SELECT (1) FROM m_product B
  150.                               INNER JOIN m_ctgr_product D ON D.ctgr_product_id = B.ctgr_product_id
  151.                               INNER JOIN m_group_product E ON E.group_product_id = D.group_product_id
  152.    WHERE Z.product_code=B.product_code AND C.tenant_id=B.tenant_id AND E.group_product_id=vGroupProductId);
  153.    
  154.    --validasi adjustment qty = 0
  155.    UPDATE ul_adjustment_stock_qty Z SET STATUS= vStatusSkip , MESSAGE = Z.message||'product skipped due adjustment qty = 0 ,'
  156.    FROM ul_header C
  157.    WHERE Z.ul_header_id = pUlHeaderId
  158.    AND Z.status <> vStatusFail
  159.    AND Z.status <> vStatusSkip
  160.    AND C.ul_header_id=Z.ul_header_id
  161.    AND (Z.balance_qty_system::numeric-Z.balance_qty_current::numeric)=0;
  162.    
  163.    --validasi product CODE harus ada
  164.    UPDATE ul_adjustment_stock_qty Z SET STATUS= vStatusX , MESSAGE = Z.message||'product code not exists,'
  165.    FROM ul_header C
  166.    WHERE Z.ul_header_id = pUlHeaderId
  167.    AND Z.status <> vStatusFail
  168.    AND Z.status <> vStatusSkip
  169.    AND C.ul_header_id=Z.ul_header_id
  170.    AND NOT EXISTS (SELECT (1) FROM m_product B
  171.    WHERE Z.product_code=B.product_code AND C.tenant_id=B.tenant_id);
  172.    
  173.    --validasi jika ada serial number
  174.    UPDATE ul_adjustment_stock_qty Z SET STATUS= vStatusX , MESSAGE = Z.message||'product should not have serial number,'
  175.    FROM ul_header C
  176.    WHERE Z.ul_header_id = pUlHeaderId
  177.    AND Z.status <> vStatusFail
  178.    AND Z.status <> vStatusSkip
  179.    AND C.ul_header_id=Z.ul_header_id
  180.    AND Z.serial_number<>vEmpty
  181.    AND Z.serial_number<>vEmptySerialNumber
  182.    AND NOT EXISTS (SELECT (1) FROM m_product B
  183.                    JOIN m_sub_ctgr_product C ON C.sub_ctgr_product_id=B.sub_ctgr_product_id AND C.flg_serial_number=vYes
  184.                    WHERE Z.product_code=B.product_code AND C.tenant_id=B.tenant_id);
  185.  
  186.    --validasi YEAR made
  187.    UPDATE ul_adjustment_stock_qty Z  SET STATUS= vStatusX , MESSAGE = Z.message||'year made not valid format (must numeric),'
  188.    WHERE Z.ul_header_id = pUlHeaderId
  189.    AND Z.status <> vStatusFail
  190.    AND Z.status <> vStatusSkip
  191.    AND Z.serial_number<>vEmpty
  192.    AND Z.serial_number<>vEmptySerialNumber
  193.    AND NOT isnumeric(Z.product_year_made);
  194.    
  195.     --validasi expired DATE
  196.    UPDATE ul_adjustment_stock_qty Z  SET STATUS= vStatusX , MESSAGE = Z.message||'expired date not valid format or not numeric,'
  197.    WHERE Z.ul_header_id = pUlHeaderId
  198.    AND Z.status <> vStatusFail
  199.    AND Z.status <> vStatusSkip
  200.    AND Z.serial_number<>vEmpty
  201.    AND Z.serial_number<>vEmptySerialNumber
  202.    AND NOT(is_date(Z.product_expired_date) AND isnumeric(Z.product_expired_date));
  203.  
  204.    --validasi product STATUS
  205.    UPDATE ul_adjustment_stock_qty Z SET STATUS= vStatusX , MESSAGE = Z.message||'product status not exists,'
  206.    FROM ul_header C
  207.    WHERE Z.ul_header_id = pUlHeaderId
  208.    AND Z.status <> vStatusFail
  209.    AND Z.status <> vStatusSkip
  210.    AND C.ul_header_id=Z.ul_header_id
  211.    AND NOT EXISTS (SELECT (1) FROM m_product_status B
  212.    WHERE Z.product_status=B.product_status_code AND C.tenant_id=B.tenant_id);
  213.    
  214.    --validasi balance qty system harus numeric
  215.    UPDATE ul_adjustment_stock_qty Z  SET STATUS= vStatusX , MESSAGE = Z.message||'balance qty system must numeric,'
  216.    FROM    
  217.    ul_adjustment_stock_qty A
  218.    WHERE A.ul_header_id = pUlHeaderId
  219.    AND A.status <> vStatusFail
  220.    AND A.status <> vStatusSkip
  221.    AND NOT isnumeric(A.balance_qty_system)
  222.    AND Z.ul_adjustment_stock_qty_id = A.ul_adjustment_stock_qty_id;
  223.    
  224.    --validasi balance qty system harus >=0
  225.    UPDATE ul_adjustment_stock_qty Z  SET STATUS= vStatusX , MESSAGE = Z.message||'balance qty system must equal or greater than 0,'
  226.    FROM    
  227.    ul_adjustment_stock_qty A
  228.    WHERE A.ul_header_id = pUlHeaderId
  229.    AND A.status <> vStatusFail
  230.    AND A.status <> vStatusSkip
  231.    AND NOT is_greater_equal_with(A.balance_qty_system,0)
  232.    AND Z.ul_adjustment_stock_qty_id = A.ul_adjustment_stock_qty_id;
  233.    
  234.    --validasi balance qty current harus numeric
  235.    UPDATE ul_adjustment_stock_qty Z  SET STATUS= vStatusX , MESSAGE = Z.message||'balance qty current must numeric,'
  236.    FROM    
  237.    ul_adjustment_stock_qty A
  238.    WHERE A.ul_header_id = pUlHeaderId
  239.    AND A.status <> vStatusFail
  240.    AND A.status <> vStatusSkip
  241.    AND NOT isnumeric(A.balance_qty_current)
  242.    AND Z.ul_adjustment_stock_qty_id = A.ul_adjustment_stock_qty_id;
  243.    
  244.    --validasi balance qty current harus >=0
  245.    UPDATE ul_adjustment_stock_qty Z  SET STATUS= vStatusX , MESSAGE = Z.message||'balance qty current must equal or greater than 0,'
  246.    FROM    
  247.    ul_adjustment_stock_qty A
  248.    WHERE A.ul_header_id = pUlHeaderId
  249.    AND A.status <> vStatusFail
  250.    AND A.status <> vStatusSkip
  251.    AND NOT is_greater_equal_with(A.balance_qty_current,0)
  252.    AND Z.ul_adjustment_stock_qty_id = A.ul_adjustment_stock_qty_id;
  253.    
  254.    --validasi jika adj qty < 0 dan stock baru , tidak serial number
  255.    UPDATE ul_adjustment_stock_qty Z SET STATUS= vStatusX , MESSAGE = Z.message||'new stock can not less then 0,'
  256.    FROM ul_header C
  257.    WHERE Z.ul_header_id = pUlHeaderId
  258.    AND Z.status <> vStatusFail
  259.    AND Z.status <> vStatusSkip
  260.    AND C.ul_header_id=Z.ul_header_id
  261.    AND Z.balance_qty_current::numeric-Z.balance_qty_system::numeric < 0
  262.    AND (Z.serial_number=vEmpty OR Z.serial_number=vEmptySerialNumber)
  263.    AND NOT EXISTS (SELECT (1)
  264.                    FROM m_product D
  265.                    INNER JOIN in_product_balance E ON E.product_id = D.product_id AND E.serial_number = vEmptySerialNumber
  266.                    INNER JOIN in_product_balance_stock F ON F.product_balance_id=E.product_balance_id AND F.product_status=Z.product_status AND F.warehouse_id=vWarehouseId
  267.                    WHERE D.product_code=Z.product_code AND
  268.                          D.tenant_id=C.tenant_id);
  269.    
  270.    --validasi jika adj qty < 0 dan stock baru, serial number
  271.    UPDATE ul_adjustment_stock_qty Z SET STATUS= vStatusX , MESSAGE = Z.message||'new stock can not less then 0,'
  272.    FROM ul_header C
  273.    WHERE Z.ul_header_id = pUlHeaderId
  274.    AND Z.status <> vStatusFail
  275.    AND Z.status <> vStatusSkip
  276.    AND C.ul_header_id=Z.ul_header_id
  277.    AND Z.balance_qty_current::numeric-Z.balance_qty_system::numeric < 0
  278.    AND Z.serial_number<>vEmpty
  279.    AND Z.serial_number<>vEmptySerialNumber
  280.    AND NOT EXISTS (SELECT (1)
  281.                    FROM m_product D
  282.                    INNER JOIN in_product_balance E ON E.product_id = D.product_id AND E.serial_number = Z.serial_number
  283.                    INNER JOIN in_product_balance_stock F ON F.product_balance_id=E.product_balance_id AND F.product_status=Z.product_status AND F.warehouse_id=vWarehouseId
  284.                    WHERE D.product_code=Z.product_code AND
  285.                          D.tenant_id=C.tenant_id);
  286.    
  287.    --validasi jika adj qty < 0 maka qty stock >= adj qty, tidak serial number
  288.    UPDATE ul_adjustment_stock_qty Z SET STATUS= vStatusX , MESSAGE = Z.message||'insufficient product balance stock,'
  289.    FROM ul_header C
  290.    WHERE Z.ul_header_id = pUlHeaderId
  291.    AND Z.status <> vStatusFail
  292.    AND Z.status <> vStatusSkip
  293.    AND C.ul_header_id=Z.ul_header_id
  294.    AND (Z.serial_number=vEmpty OR Z.serial_number=vEmptySerialNumber)
  295.    AND EXISTS (SELECT (1)
  296.                    FROM m_product D
  297.                    INNER JOIN in_product_balance E ON E.product_id = D.product_id AND E.serial_number = vEmptySerialNumber
  298.                    INNER JOIN in_product_balance_stock F ON F.product_balance_id=E.product_balance_id AND F.product_status=Z.product_status AND F.warehouse_id=vWarehouseId
  299.                    WHERE D.product_code=Z.product_code AND
  300.                          D.tenant_id=C.tenant_id AND
  301.                          F.qty+(Z.balance_qty_current::numeric-Z.balance_qty_system::numeric)<0);
  302.                          
  303.    --validasi jika adj qty < 0 maka qty stock >= adj qty, serial number
  304.    UPDATE ul_adjustment_stock_qty Z SET STATUS= vStatusX , MESSAGE = Z.message||'insufficient product balance stock,'
  305.    FROM ul_header C
  306.    WHERE Z.ul_header_id = pUlHeaderId
  307.    AND Z.status <> vStatusFail
  308.    AND Z.status <> vStatusSkip
  309.    AND C.ul_header_id=Z.ul_header_id
  310.    AND Z.serial_number<>vEmpty
  311.    AND Z.serial_number<>vEmptySerialNumber
  312.    AND EXISTS (SELECT (1)
  313.                    FROM m_product D
  314.                    INNER JOIN in_product_balance E ON E.product_id = D.product_id AND E.serial_number = Z.serial_number
  315.                    INNER JOIN in_product_balance_stock F ON F.product_balance_id=E.product_balance_id AND F.product_status=Z.product_status AND F.warehouse_id=vWarehouseId
  316.                    WHERE D.product_code=Z.product_code AND
  317.                          D.tenant_id=C.tenant_id AND
  318.                          F.qty+(Z.balance_qty_current::numeric-Z.balance_qty_system::numeric)<0);
  319.    
  320.    --validasi item yang sama
  321.    SELECT SUM(f_validate_duplicate_item_adjustment_stock_qty(A.ul_adjustment_stock_qty_id)) INTO vValidate
  322.    FROM (SELECT * from ul_adjustment_stock_qty B
  323.    WHERE B.ul_header_id=pUlHeaderId AND
  324.          b.status <> vStatusSkip AND
  325.          B.status <> vStatusFail
  326.          ORDER BY B.ul_adjustment_stock_qty_id ASC) A;
  327.  
  328.    -- UPDATE semua yang vStatusX jadi xStatusFail
  329.    UPDATE ul_adjustment_stock_qty SET STATUS = vStatusFail
  330.    WHERE STATUS = vStatusX
  331.    AND ul_header_id = pUlHeaderId;
  332.  
  333.    -- UPDATE semua yang vEmpty jadi vStatusOk
  334.    UPDATE ul_adjustment_stock_qty SET STATUS = vStatusOk
  335.    WHERE STATUS = vEmpty
  336.    AND ul_header_id = pUlHeaderId;
  337.    
  338.    SELECT COUNT(ul_adjustment_stock_qty_id) INTO vCount
  339.    FROM ul_adjustment_stock_qty
  340.    WHERE
  341.      ul_header_id = pUlHeaderId
  342.      AND STATUS = vStatusFail;
  343.    
  344.    IF (vCount=0) THEN
  345.        SELECT COUNT(ul_adjustment_stock_qty_id) INTO vCountNoSerial
  346.        FROM ul_adjustment_stock_qty
  347.        WHERE
  348.          ul_header_id = pUlHeaderId
  349.          AND STATUS = vStatusOk
  350.          AND serial_number=vEmpty;
  351.        
  352.        --insert item yg tdk ada serialnya
  353.        INSERT INTO in_inventory_item(
  354.                 tenant_id, inventory_id, line_no, product_id,
  355.                 product_balance_id, product_status, serial_number, product_expired_date,
  356.                 product_year_made, lot_number, ref_doc_type_id, ref_id, ref_item_id,
  357.                 curr_code, amount, base_uom_id, qty_request, qty_realization,
  358.                 remark, version, create_datetime, create_user_id, update_datetime,
  359.                 update_user_id)
  360.         SELECT B.tenant_id, vAdjustmentStockQtyId, row_number() OVER() AS row_number, C.product_id,
  361.                D.product_balance_id, A.product_status, vEmptySerialNumber, D.product_expired_date,
  362.                D.product_year_made, D.lot_number,vNullInt,vNullInt,vNullInt,
  363.                vNullInt,0,C.base_uom_id,(A.balance_qty_current::numeric-A.balance_qty_system::numeric),(A.balance_qty_current::numeric-A.balance_qty_system::numeric),
  364.                vEmpty,0,vCurrentDateTime,B.user_id,vCurrentDateTime,
  365.                B.user_id
  366.         FROM ul_adjustment_stock_qty A
  367.         INNER JOIN ul_header B ON A.ul_header_id=B.ul_header_id
  368.         INNER JOIN m_product C ON C.product_code=A.product_code AND C.tenant_id=B.tenant_id
  369.         INNER JOIN in_product_balance D ON D.tenant_id=B.tenant_id AND D.product_id=C.product_id AND D.serial_number=vEmptySerialNumber
  370.         --INNER JOIN in_product_balance_stock E ON E.product_balance_id=D.product_balance_id AND E.product_status=A.product_status AND E.warehouse_id=vWarehouseId
  371.         WHERE A.ul_header_id=pUlHeaderId AND
  372.               A.status=vStatusOk AND
  373.               (A.serial_number=vEmpty OR A.serial_number=vEmptySerialNumber);
  374.        
  375.        --insert item yg ada serial numbernya
  376.        SELECT COUNT(inventory_item_id) INTO vCountItem
  377.        FROM in_inventory_item
  378.        WHERE inventory_id=vAdjustmentStockQtyId;
  379.        
  380.        INSERT INTO in_inventory_item(
  381.                 tenant_id, inventory_id, line_no, product_id,
  382.                 product_balance_id, product_status, serial_number, product_expired_date,
  383.                 product_year_made, lot_number, ref_doc_type_id, ref_id, ref_item_id,
  384.                 curr_code, amount, base_uom_id, qty_request, qty_realization,
  385.                 remark, version, create_datetime, create_user_id, update_datetime,
  386.                 update_user_id)
  387.         SELECT B.tenant_id, vAdjustmentStockQtyId, vCountItem+row_number() OVER() AS row_number, C.product_id,
  388.                D.product_balance_id, A.product_status, A.serial_number, D.product_expired_date,
  389.                D.product_year_made, D.lot_number,vNullInt,vNullInt,vNullInt,
  390.                vNullInt,0,C.base_uom_id, (A.balance_qty_current::numeric-A.balance_qty_system::numeric), (A.balance_qty_current::numeric-A.balance_qty_system::numeric),
  391.                vEmpty,0,vCurrentDateTime,B.user_id,vCurrentDateTime,
  392.                B.user_id
  393.         FROM ul_adjustment_stock_qty A
  394.         INNER JOIN ul_header B ON A.ul_header_id=B.ul_header_id
  395.         INNER JOIN m_product C ON C.product_code=A.product_code AND C.tenant_id=B.tenant_id
  396.         INNER JOIN in_product_balance D ON D.tenant_id=B.tenant_id AND D.product_id=C.product_id AND D.serial_number=A.serial_number
  397.         --INNER JOIN in_product_balance_stock E ON E.product_balance_id=D.product_balance_id AND E.product_status=A.product_status AND E.warehouse_id=vWarehouseId
  398.         WHERE A.ul_header_id=pUlHeaderId AND
  399.               A.status=vStatusOk AND
  400.               A.serial_number<>vEmpty AND
  401.               A.serial_number<>vEmptySerialNumber;
  402.        
  403.        --insert item yg tdk ada serialnya dan belum ada balancenya       
  404.        SELECT COUNT(inventory_item_id) INTO vCountItem
  405.        FROM in_inventory_item
  406.        WHERE inventory_id=vAdjustmentStockQtyId;
  407.  
  408.        INSERT INTO in_inventory_item(
  409.                 tenant_id, inventory_id, line_no, product_id,
  410.                 product_balance_id, product_status, serial_number, product_expired_date,
  411.                 product_year_made, lot_number, ref_doc_type_id, ref_id, ref_item_id,
  412.                 curr_code, amount, base_uom_id, qty_request, qty_realization,
  413.                 remark, version, create_datetime, create_user_id, update_datetime,
  414.                 update_user_id)
  415.         SELECT B.tenant_id, vAdjustmentStockQtyId, vCountItem+row_number() OVER() AS row_number, C.product_id,
  416.                vNullInt, A.product_status, vEmptySerialNumber, vEmptySerialNumber,
  417.                vEmptySerialNumber, vEmptySerialNumber,vNullInt,vNullInt,vNullInt,
  418.                vNullInt,0,C.base_uom_id,(A.balance_qty_current::numeric-A.balance_qty_system::numeric),(A.balance_qty_current::numeric-A.balance_qty_system::numeric),
  419.                vEmpty,0,vCurrentDateTime,B.user_id,vCurrentDateTime,
  420.                B.user_id
  421.         FROM ul_adjustment_stock_qty A
  422.         INNER JOIN ul_header B ON A.ul_header_id=B.ul_header_id
  423.         INNER JOIN m_product C ON C.product_code=A.product_code AND C.tenant_id=B.tenant_id
  424.         WHERE A.ul_header_id=pUlHeaderId AND
  425.               A.status=vStatusOk AND
  426.               (A.serial_number=vEmpty OR A.serial_number=vEmptySerialNumber) AND
  427.               NOT EXISTS (SELECT 1 FROM in_product_balance D
  428.                     WHERE B.tenant_id = D.tenant_id AND
  429.                           C.product_id = D.product_id AND
  430.                           vEmptySerialNumber = D.serial_number);
  431.        
  432.        --insert item yg ada serial numbernya dan belum ada balancenya                
  433.        SELECT COUNT(inventory_item_id) INTO vCountItem
  434.        FROM in_inventory_item
  435.        WHERE inventory_id=vAdjustmentStockQtyId;
  436.        
  437.        INSERT INTO in_inventory_item(
  438.                 tenant_id, inventory_id, line_no, product_id,
  439.                 product_balance_id, product_status, serial_number, product_expired_date,
  440.                 product_year_made, lot_number, ref_doc_type_id, ref_id, ref_item_id,
  441.                 curr_code, amount, base_uom_id, qty_request, qty_realization,
  442.                 remark, version, create_datetime, create_user_id, update_datetime,
  443.                 update_user_id)
  444.         SELECT B.tenant_id, vAdjustmentStockQtyId, vCountItem+row_number() OVER() AS row_number, C.product_id,
  445.                vNullInt, A.product_status, A.serial_number, A.product_expired_date,
  446.                A.product_year_made, vEmptySerialNumber,vNullInt,vNullInt,vNullInt,
  447.                vNullInt,0,C.base_uom_id, (A.balance_qty_current::numeric-A.balance_qty_system::numeric), (A.balance_qty_current::numeric-A.balance_qty_system::numeric),
  448.                vEmpty,0,vCurrentDateTime,B.user_id,vCurrentDateTime,
  449.                B.user_id
  450.         FROM ul_adjustment_stock_qty A
  451.         INNER JOIN ul_header B ON A.ul_header_id=B.ul_header_id
  452.         INNER JOIN m_product C ON C.product_code=A.product_code AND C.tenant_id=B.tenant_id
  453.         WHERE A.ul_header_id=pUlHeaderId AND
  454.               A.status=vStatusOk AND
  455.               (A.balance_qty_current::numeric-A.balance_qty_system::numeric) <> 0 AND
  456.               A.serial_number <> vEmpty AND A.serial_number <> vEmptySerialNumber AND
  457.               NOT EXISTS (SELECT 1 FROM in_product_balance D
  458.                     WHERE B.tenant_id = D.tenant_id AND
  459.                           C.product_id = D.product_id AND
  460.                           A.serial_number = D.serial_number);        
  461.        
  462.        --update product balance stock yg tidak ada serial numbernya jika adj qty < 0  
  463.        UPDATE in_product_balance_stock
  464.        SET qty = qty+(F.balance_qty_current::numeric-F.balance_qty_system::numeric),
  465.            version = version+1,
  466.            update_datetime = vCurrentDateTime,
  467.            update_user_id = F.user_id
  468.        FROM (SELECT B.tenant_id, C.product_id,A.product_status, A.balance_qty_current,A.balance_qty_system,D.product_balance_id, B.user_id
  469.              FROM ul_adjustment_stock_qty A
  470.              INNER JOIN ul_header B ON A.ul_header_id=B.ul_header_id
  471.              INNER JOIN m_product C ON C.product_code=A.product_code AND C.tenant_id=B.tenant_id
  472.              INNER JOIN in_product_balance D ON D.tenant_id=B.tenant_id AND D.product_id=C.product_id AND D.serial_number=vEmptySerialNumber
  473.              WHERE A.ul_header_id=pUlHeaderId AND
  474.                    A.status = vStatusOk AND
  475.                    (A.serial_number = vEmpty OR A.serial_number = vEmptySerialNumber) AND
  476.                    (A.balance_qty_current::numeric-A.balance_qty_system::numeric) < 0 AND
  477.                    EXISTS (SELECT (1)
  478.                            FROM in_product_balance_stock E
  479.                            WHERE E.tenant_id=B.tenant_id AND
  480.                                  E.warehouse_id=vWarehouseId AND
  481.                                  E.product_id=C.product_id AND
  482.                                  E.product_balance_id=D.product_balance_id AND
  483.                                  E.product_status=A.product_status)) F
  484.        WHERE in_product_balance_stock.tenant_id=F.tenant_id AND
  485.              in_product_balance_stock.warehouse_id=vWarehouseId AND
  486.              in_product_balance_stock.product_id=F.product_id AND
  487.              in_product_balance_stock.product_balance_id=F.product_balance_id AND
  488.              in_product_balance_stock.product_status=F.product_status;
  489.      
  490.     --update product balance stock yg ada serial numbernya jika adj qty < 0        
  491.        UPDATE in_product_balance_stock
  492.        SET qty = qty+(F.balance_qty_current::numeric-F.balance_qty_system::numeric),
  493.            version = version+1,
  494.            update_datetime = vCurrentDateTime,
  495.            update_user_id = F.user_id
  496.        FROM (SELECT B.tenant_id, C.product_id,A.product_status, A.balance_qty_current,A.balance_qty_system,D.product_balance_id, B.user_id
  497.              FROM ul_adjustment_stock_qty A
  498.              INNER JOIN ul_header B ON A.ul_header_id=B.ul_header_id
  499.              INNER JOIN m_product C ON C.product_code=A.product_code AND C.tenant_id=B.tenant_id
  500.              INNER JOIN in_product_balance D ON D.tenant_id=B.tenant_id AND D.product_id=C.product_id AND D.serial_number=A.serial_number
  501.              WHERE A.ul_header_id=pUlHeaderId AND
  502.                    A.status = vStatusOk AND
  503.                    A.serial_number <> vEmpty AND
  504.                    A.serial_number <> vEmptySerialNumber AND
  505.                    (A.balance_qty_current::numeric-A.balance_qty_system::numeric) < 0 AND
  506.                    EXISTS (SELECT (1)
  507.                            FROM in_product_balance_stock E
  508.                            WHERE E.tenant_id=B.tenant_id AND
  509.                                  E.warehouse_id=vWarehouseId AND
  510.                                  E.product_id=C.product_id AND
  511.                                  E.product_balance_id=d.product_balance_id AND
  512.                                  E.product_status=A.product_status)) F
  513.        WHERE in_product_balance_stock.tenant_id=F.tenant_id AND
  514.              in_product_balance_stock.warehouse_id=vWarehouseId AND
  515.              in_product_balance_stock.product_id=F.product_id AND
  516.              in_product_balance_stock.product_balance_id=F.product_balance_id AND
  517.              in_product_balance_stock.product_status=F.product_status;
  518.     ELSE
  519.         --update STATUS autonum menjadi unused
  520.         UPDATE autonum_generated SET flg_unused=vYes, update_datetime = vCurrentDateTime, update_user_id = vUserId
  521.         WHERE tenant_id = vTenantId AND
  522.               year_month_date = vDocDate AND
  523.               value_auto_num = vDocNo AND
  524.               scheme = vSchemeAdjustmentStockQty;
  525.        
  526.         SELECT autonum_generated_id INTO vAutonumGeneratedId
  527.         FROM autonum_generated A
  528.         WHERE tenant_id = vTenantId AND
  529.               year_month_date = vDocDate AND
  530.               value_auto_num = vDocNo AND
  531.               scheme = vSchemeAdjustmentStockQty;
  532.        
  533.         --delete autonum_ref_mapping
  534.         DELETE FROM autonum_ref_mapping
  535.         WHERE autonum_generated_id =vAutonumGeneratedId;
  536.        
  537.        
  538.         --delete approval
  539.         DELETE FROM awe_worklist
  540.         WHERE scheme = vSchemeAdjustmentStockQty AND
  541.         tenant_id = vTenantId AND
  542.         doc_id = vAdjustmentStockQtyId AND
  543.         doc_no = vDocNo;
  544.        
  545.         DELETE FROM awe_currdoc_status
  546.         WHERE scheme = vSchemeAdjustmentStockQty AND
  547.         tenant_id = vTenantId AND
  548.         doc_id = vAdjustmentStockQtyId AND
  549.         doc_no = vDocNo;
  550.        
  551.         DELETE FROM in_inventory
  552.         WHERE inventory_id=vAdjustmentStockQtyId;
  553.          
  554.     END IF;
  555.  
  556.    RETURN vCount;  
  557.  
  558. END;
  559. $BODY$
  560.   LANGUAGE plpgsql VOLATILE
  561.   COST 100;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement