Advertisement
aadddrr

in_cancel_submit_return_note

Jul 4th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  * PS, 23 April 2015
  3.  */
  4. --Modified by Adrian, Jul 4, 2017, mengubah query hapus in_log_product_balance_stock
  5.  
  6. CREATE OR REPLACE FUNCTION in_cancel_submit_return_note(bigint, character varying, bigint, character varying, bigint, character varying, character varying)
  7.   RETURNS void AS
  8. $BODY$
  9. DECLARE
  10.     pTenantId               ALIAS FOR $1;
  11.     pSessionId              ALIAS FOR $2;
  12.     pUserId                 ALIAS FOR $3; -- for update user id in transaction
  13.     pDatetime               ALIAS FOR $4;
  14.     pReturnNoteId           ALIAS FOR $5; -- Inventory id
  15.     pRemarkApproval         ALIAS FOR $6; -- Remark for appear in approval reset history
  16.     pPrevProcessNo          ALIAS FOR $7; -- Substitute for renaming prevous process no
  17.  
  18.     vReturnNoteDocTypeId    bigint;
  19.     vFlgInvoice             character varying;
  20.     vStatusDraft            character varying;
  21.     vStatusRelease          character varying;
  22.     vStatusInProgress       character varying;
  23.     vWorkflowStatusDraft    character varying;
  24.     vOuId                   bigint;
  25.     vWarehouseId            bigint;
  26.     vProductId              bigint;
  27.     vProductBalanceId       bigint;
  28.     vProductStatus          character varying;
  29.     vDocNo                  character varying;
  30.     vDocDate                character varying;
  31.     result                  RECORD;
  32.    
  33.     vJournalTrxId           bigint;
  34.     vScheme                 character varying;
  35.     vDocJournal             DOC_JOURNAL%ROWTYPE;
  36.     vOuStructure            OU_BU_STRUCTURE%ROWTYPE;
  37.     vFunctionSubmit         character varying;
  38. BEGIN
  39.     vReturnNoteDocTypeId := 502;
  40.     vStatusDraft := 'D';
  41.     vStatusRelease := 'R';
  42.     vStatusInProgress := 'I';
  43.     vWorkflowStatusDraft := 'DRAFT';
  44.     vFunctionSubmit := 'in_submit_return_note';
  45.    
  46.     /*
  47.      * 1.  Ubah status_doc D
  48.      * 2.  Create summary dari in_inventory_item untuk update yg sudah ada di in_product_balance_stock (sama)
  49.      * X 3.  Update product_balance_stock (+ jadi -) X
  50.      * 4.  Delete data from in_product_balance_stock
  51.      * 5.  Delete data from in_log_product_balance_stock
  52.      * 6.  Insert data temporer tt_in_so_balance_item
  53.      * 7.  Update qty return di data sl_so_balance_item /->*, *->/
  54.      * 8.  Hapus data sl_log_so_balance_item
  55.      * 9.  Hapus data sl_so_balance_invoice (do_receipt_item_id ?????)
  56.      * 10. Hapus data sl_so_balance_invoice_tax (do_receipt_item_id ????)
  57.      * 11. PERFORM cancel gl_cancel_admin_journal_trx
  58.      * 12. DELETE gl_journal_trx
  59.      * 13. DELETE gl_journal_trx_item
  60.      * 14. DELETE gl_journal_trx_mapping
  61.      * 15. PERFORM f_reset_approval_to_draft
  62.      * 16. UPDATE t_process_message
  63.      */
  64.    
  65.     -- get data
  66.     select f_get_ou_bu_structure(A.ou_to_id) AS ou,A.ou_to_id, A.warehouse_from_id, A.doc_no, A.doc_date, B.product_id,
  67.            B.product_balance_id, B.product_status, f_get_document_journal(A.doc_type_id) as doc, C.scheme
  68.     FROM in_inventory A, in_inventory_item B, m_document C
  69.     WHERE A.inventory_id = B.inventory_id AND
  70.         A.doc_type_id = C.doc_type_id AND
  71.         A.inventory_id = pReturnNoteId INTO result;
  72.        
  73.     vOuStructure := result.ou;
  74.     vOuId := result.ou_to_id;
  75.     vWarehouseId := result.warehouse_from_id;
  76.     vDocNo := result.doc_no;
  77.     vDocDate := result.doc_date;
  78.     vProductId := result.product_id;
  79.     vProductBalanceId := result.product_balance_id;
  80.     vProductStatus := result.product_status;
  81.     vDocJournal := result.doc;
  82.     vScheme := result.scheme;
  83.    
  84.     SELECT flg_invoice INTO vFlgInvoice
  85.     FROM sl_so_balance_invoice
  86.     WHERE ref_id = pReturnNoteId
  87.     AND ref_doc_type_id = vReturnNoteDocTypeId;
  88.    
  89.     IF FOUND AND vFlgInvoice IN ('Y','I') THEN
  90.         RAISE EXCEPTION 'Return Note document already been used by Return Sales Invoice';
  91.     END IF;
  92.    
  93.     -- 1. ubah status_doc D
  94.     UPDATE in_inventory SET status_doc = vStatusDraft, workflow_status = vWorkflowStatusDraft, version = version + 1, update_datetime = pDatetime, update_user_id = pUserId
  95.     WHERE inventory_id = pReturnNoteId
  96.         AND status_doc = vStatusRelease;
  97.    
  98.     /*
  99.      * 2. create summary dari in_inventory_item untuk update yg sudah ada di in_product_balance_stock
  100.      */
  101.     INSERT INTO tt_in_product_balance_summary_stock
  102.             (session_id, tenant_id, inventory_id, warehouse_id, product_id, product_balance_id, product_status, base_uom_id, qty)
  103.     SELECT  pSessionId, A.tenant_id, A.inventory_id, A.warehouse_from_id, B.product_id, B.product_balance_id, B.product_status,
  104.             B.base_uom_id, SUM(B.qty_realization)
  105.     FROM    in_inventory A, in_inventory_item B
  106.     WHERE   A.inventory_id = B.inventory_id
  107.     AND     A.inventory_id = pReturnNoteId
  108.     GROUP BY A.tenant_id, A.inventory_id, A.warehouse_from_id, B.product_id, B.product_balance_id, B.product_status, B.base_uom_id;
  109.    
  110.     /*
  111.      * 3. update product_balance_stock
  112.      */
  113.     UPDATE in_product_balance_stock SET qty = in_product_balance_stock.qty - A.qty, update_datetime = pDatetime, update_user_id = pUserId,
  114.         version = version + 1
  115.     FROM tt_in_product_balance_summary_stock A
  116.     WHERE A.session_id = pSessionId AND
  117.         A.inventory_id = pReturnNoteId AND
  118.         in_product_balance_stock.tenant_id = A.tenant_id AND
  119.         in_product_balance_stock.warehouse_id = A.warehouse_id AND
  120.         in_product_balance_stock.product_id = A.product_id AND
  121.         in_product_balance_stock.product_balance_id = A.product_balance_id AND
  122.         in_product_balance_stock.product_status = A.product_status;
  123.    
  124.     -- QTY tidak boleh < 0
  125.     IF EXISTS (SELECT 1
  126.             FROM in_product_balance_stock A
  127.             INNER JOIN tt_in_product_balance_summary_stock B ON B.tenant_id = A.tenant_id AND
  128.                                                                 B.warehouse_id = A.warehouse_id AND
  129.                                                                 B.product_id = A.product_id AND
  130.                                                                 B.product_balance_id = A.product_balance_id AND
  131.                                                                 B.product_status = A.product_status
  132.             WHERE B.session_id = pSessionId
  133.                 AND B.inventory_id = pReturnNoteId
  134.                 AND A.qty < 0)  
  135.     THEN
  136.         RAISE EXCEPTION 'Qty product in stock product less than zero';
  137.     END IF;
  138.        
  139.     /*
  140.      * 4. delete data from in_product_balance_stock
  141.      */
  142. --  DELETE FROM in_product_balance_stock
  143. --          WHERE tenant_id = pTenantId AND
  144. --                warehouse_id = vWarehouseId AND
  145. --                product_id = vProductId AND
  146. --                product_balance_id = vProductBalanceId AND
  147. --                product_status = vProductStatus;
  148.    
  149.     /*
  150.      * 5. delete data in_log_product_balance_stock
  151.      */
  152.     /*DELETE FROM in_log_product_balance_stock
  153.     WHERE tenant_id = pTenantId AND
  154.           ou_id = vOuId AND
  155.           doc_type_id = vReturnNoteDocTypeId AND
  156.           ref_id = pReturnNoteId AND
  157.           doc_no = vDocNo AND
  158.           doc_date = vDocDate AND
  159.           warehouse_id = vWarehouseId AND
  160.           product_id = vProductId AND
  161.           product_balance_id = vProductBalanceId AND
  162.           product_status = vProductStatus;*/
  163.     WITH grouped_in_inventory_item AS (
  164.         SELECT A.tenant_id, C.ou_id, A.doc_type_id, A.inventory_id, A.doc_no, A.doc_date, A.partner_id,
  165.             B.product_id, B.product_balance_id, A.warehouse_to_id, B.product_status, B.base_uom_id, SUM(B.qty_realization) AS qty
  166.         FROM in_inventory A, in_inventory_item B, m_warehouse_ou C
  167.         WHERE A.inventory_id = pReturnNoteId AND
  168.             A.inventory_id = B.inventory_id AND
  169.             A.warehouse_to_id = C.warehouse_id
  170.         GROUP BY A.tenant_id, C.ou_id, A.doc_type_id, A.inventory_id, A.doc_no, A.doc_date, A.partner_id,
  171.             B.product_id, B.product_balance_id, A.warehouse_to_id, B.product_status, B.base_uom_id
  172.     )
  173.     DELETE
  174.     FROM in_log_product_balance_stock Z
  175.     WHERE EXISTS (
  176.         SELECT (1)
  177.         FROM grouped_in_inventory_item A
  178.         WHERE Z.tenant_id = A.tenant_id
  179.             AND Z.ou_id = A.ou_id
  180.             AND Z.doc_type_id = A.doc_type_id
  181.             AND Z.ref_id = A.inventory_id
  182.             AND Z.doc_no = A.doc_no
  183.             AND Z.doc_date = A.doc_date
  184.             AND Z.partner_id = A.partner_id
  185.             AND Z.product_id = A.product_id
  186.             AND Z.product_balance_id = A.product_balance_id
  187.             AND Z.warehouse_id = A.warehouse_to_id
  188.             AND Z.product_status = A.product_status
  189.             AND Z.base_uom_id = A.base_uom_id
  190.             AND Z.qty = A.qty
  191.     );
  192.          
  193.     /*
  194.      * 6.insert data temporer tt_in_so_balance_item
  195.      */
  196.     INSERT INTO tt_in_so_balance_item
  197.     (session_id, tenant_id, ou_id, doc_type_id,
  198.     doc_no, doc_date, inventory_id, partner_id,
  199.     inventory_item_id, so_id, do_id, do_item_id,
  200.     qty_return, base_uom_id, remark,
  201.     so_item_id, curr_code, price,
  202.     flg_tax_amount, qty_so, qty_int_so,
  203.     so_uom_id, tax_id, tax_percentage)
  204.     SELECT pSessionId, A.tenant_id, A.ou_from_id, A.doc_type_id,
  205.             A.doc_no, A.doc_date, A.inventory_id, E.partner_bill_to_id,
  206.             B.inventory_item_id, A.ref_id, B.ref_id, B.ref_item_id,
  207.             SUM(B.qty_realization), B.base_uom_id, A.remark,
  208.             D.so_item_id, D.curr_code, (D.gross_sell_price - D.discount_amount),
  209.             D.flg_tax_amount, D.qty_so, D.qty_int,
  210.             D.so_uom_id, D.tax_id, D.tax_percentage
  211.     FROM in_inventory A, in_inventory_item B, in_balance_do_item C, sl_so_item D, sl_so E
  212.     WHERE A.inventory_id = pReturnNoteId AND
  213.           A.inventory_id = B.inventory_id AND
  214.           B.ref_item_id = C.do_item_id AND
  215.           C.so_item_id = D.so_item_id AND
  216.           D.so_id = E.so_id
  217.     GROUP BY A.tenant_id, A.ou_from_id, A.doc_type_id,
  218.             A.doc_no, A.doc_date, A.inventory_id, E.partner_bill_to_id,
  219.             B.inventory_item_id, A.ref_id, B.ref_id, B.ref_item_id,
  220.             B.base_uom_id, D.so_item_id, D.curr_code, D.nett_sell_price, D.qty_so, D.qty_int, D.so_uom_id, D.tax_id ;
  221.            
  222.     /*
  223.      * 7. update qty return di data sl_so_balance_item
  224.      */        
  225.     UPDATE sl_so_balance_item SET qty_return = sl_so_balance_item.qty_return - ((A.qty_return * A.qty_int_so) / A.qty_so), qty_return_int = sl_so_balance_item.qty_return_int - A.qty_return, update_datetime = pDatetime, update_user_id = pUserId
  226.     FROM tt_in_so_balance_item A
  227.     WHERE A.session_id = pSessionId AND
  228.         sl_so_balance_item.so_item_id = A.so_item_id;
  229.        
  230.     /*
  231.      * 8. hapus data sl_log_so_balance_item
  232.      */
  233. --  DELETE FROM sl_log_so_balance_item
  234. --  where tenant_id = pTenantId AND
  235. --        ou_id = vOuId AND
  236. --        ref_doc_type_id = vReturnNoteDocTypeId AND
  237. --        ref_id = pReturnNoteId;
  238.          
  239.     DELETE FROM sl_log_so_balance_item B
  240.         WHERE B.ref_doc_type_id = vReturnNoteDocTypeId AND
  241.             EXISTS (SELECT 1 FROM tt_in_so_balance_item A
  242.                         WHERE A.inventory_id = pReturnNoteId AND
  243.                               A.ou_id = vOuId AND
  244.                               A.doc_type_id = vReturnNoteDocTypeId AND
  245.                               A.doc_no = vDocNo AND
  246.                               A.doc_date = vDocDate AND
  247.                               B.ref_id = A.inventory_id AND
  248.                               B.ref_item_id = A.inventory_item_id AND
  249.                               B.so_id = A.so_id AND
  250.                               B.so_item_id = A.so_item_id AND
  251.                               B.ref_doc_type_id=A.doc_type_id);
  252.  
  253.     /*
  254.      * 9. hapus data sl_so_balance_invoice
  255.      */
  256.     DELETE FROM sl_so_balance_invoice B
  257.         WHERE B.ref_doc_type_id = vReturnNoteDocTypeId AND
  258.             EXISTS (SELECT 1 FROM tt_in_so_balance_item A
  259.                         WHERE A.inventory_id = pReturnNoteId AND
  260.                               A.ou_id = vOuId AND
  261.                               A.doc_type_id = vReturnNoteDocTypeId AND
  262.                               A.doc_no = vDocNo AND
  263.                               A.doc_date = vDocDate AND
  264.                               B.tenant_id = A.tenant_id AND
  265.                               B.ref_id = A.inventory_id AND
  266.                               B.ou_id = A.ou_id AND
  267.                               B.partner_id = A.partner_id AND
  268.                               B.ref_doc_type_id = A.doc_type_id AND
  269.                               B.ref_id = A.inventory_id AND
  270.                               B.ref_item_id = A.do_item_id);   
  271.     /*
  272.      * 10. hapus data sl_so_balance_invoice_tax
  273.      */
  274.     DELETE FROM sl_so_balance_invoice_tax B
  275.         WHERE B.ref_doc_type_id = vReturnNoteDocTypeId AND
  276.             EXISTS (SELECT 1 FROM tt_in_so_balance_item A, m_tax D
  277.                         WHERE A.session_id = pSessionId AND
  278.                               A.tax_id = D.tax_id AND
  279.                               A.inventory_id = pReturnNoteId AND
  280.                               A.ou_id = vOuId AND
  281.                               A.doc_type_id = vReturnNoteDocTypeId AND
  282.                               A.doc_no = vDocNo AND
  283.                               A.doc_date = vDocDate AND
  284.                               B.tenant_id=A.tenant_id AND
  285.                               B.ou_id=A.ou_id AND
  286.                               B.partner_id=A.partner_id AND
  287.                               B.ref_doc_type_id=A.doc_type_id AND
  288.                               B.ref_id=A.inventory_id AND
  289.                               B.ref_item_id=A.do_item_id AND
  290.                               B.tax_id=A.tax_id);
  291.                              
  292.     UPDATE in_balance_do_item SET status_item = vStatusInProgress
  293.     FROM tt_in_so_balance_item A
  294.     WHERE A.session_id = pSessionId AND
  295.         in_balance_do_item.do_item_id = A.do_item_id;  
  296.    
  297.        
  298.     --* 11. PERFORM cancel gl_cancel_admin_journal_trx
  299.     PERFORM gl_cancel_admin_journal_trx(pTenantId, (vOuStructure).ou_bu_id, vOuId, (vDocJournal).journal_type, f_get_year_month_date(vDocDate), 'DAILY', pDatetime, pUserId);
  300.    
  301.    
  302.     -- pre 9 Find journal trx id
  303.     SELECT journal_trx_id INTO vJournalTrxId
  304.     FROM gl_journal_trx
  305.     WHERE tenant_id = pTenantId
  306.         AND journal_type = (vDocJournal).journal_type
  307.         AND doc_type_id = vReturnNoteDocTypeId
  308.         AND doc_id = pReturnNoteId
  309.         AND doc_no = vDocNo
  310.         AND doc_date = vDocDate
  311.         AND ou_bu_id = (vOuStructure).ou_bu_id
  312.         AND ou_branch_id = (vOuStructure).ou_branch_id
  313.         AND ou_sub_bu_id = (vOuStructure).ou_sub_bu_id;
  314.    
  315.     -- * 12. DELETE gl_journal_trx
  316.     DELETE FROM gl_journal_trx
  317.     WHERE journal_trx_id = vJournalTrxId;
  318.    
  319.     -- * 13. DELETE gl_journal_trx_item
  320.     DELETE FROM gl_journal_trx_item
  321.     WHERE journal_trx_id = vJournalTrxId;
  322.  
  323.     -- * 14. DELETE gl_journal_trx_mapping
  324.                     DELETE FROM gl_journal_trx_mapping
  325.                     WHERE journal_trx_id = vJournalTrxId;
  326.  
  327.     -- * 15. PERFORM f_reset_approval_to_draft
  328.     PERFORM f_reset_approval_to_draft(pTenantId, pSessionId, vScheme, pReturnNoteId, vDocNo, pDatetime, pRemarkApproval);
  329.  
  330.     -- * 16. UPDATE t_process_message
  331.     UPDATE t_process_message
  332.     SET process_no = pPrevProcessNo,
  333.         update_datetime = pDatetime,
  334.         update_user_id = pUserId,
  335.         version = version + 1
  336.     WHERE tenant_id = pTenantId
  337.         AND process_name = vFunctionSubmit
  338.         AND process_no = pReturnNoteId || '_' || vDocNo;
  339.    
  340.     DELETE FROM tt_in_product_balance_summary_stock WHERE session_id = pSessionId;
  341.     DELETE FROM tt_in_so_balance_item WHERE session_id = pSessionId;
  342. END;
  343. $BODY$
  344.   LANGUAGE plpgsql VOLATILE
  345.   COST 100;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement