Advertisement
aadddrr

Cancel Submit DO

Feb 19th, 2017
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION sl_cancel_submit_do(bigint, character varying, bigint, character varying, bigint, character varying, character varying)
  2.   RETURNS void AS
  3. $BODY$
  4. DECLARE
  5.     pTenantId                           ALIAS FOR $1;
  6.     pSessionId                          ALIAS FOR $2;
  7.     pUserId                             ALIAS FOR $3;
  8.     pDatetime                           ALIAS FOR $4;
  9.     pDeliveryOrderId                    ALIAS FOR $5;
  10.     pRemarkApproval                     ALIAS FOR $6;
  11.     pPrevProcessNo                      ALIAS FOR $7;
  12.    
  13.     vDeliveryOrderDocTypeId             bigint;
  14.     vEmptyId                            bigint;
  15.     vFunctionSubmit                     character varying;
  16.     vStatusDocReleased                  character varying;
  17.     vStatusDocDraft                     character varying;
  18.     vStatusDocInProgress                character varying;
  19.     vWorkflowStatusDraft                character varying;
  20.     vYes                                character varying;
  21.     vNo                                 character varying;
  22.     vZero                               bigint;
  23.    
  24.     vOuId                               bigint;
  25.     vJournalTrxId                       bigint;
  26.     vDocNo                              character varying;
  27.     vDocDate                            character varying;
  28.     vScheme                             character varying;
  29.     vSalesOrderId                       bigint;
  30.     VWarehouseOuId                      bigint;
  31.    
  32.     vDocJournal                         DOC_JOURNAL%ROWTYPE;
  33.     vOuStructure                        OU_BU_STRUCTURE%ROWTYPE;
  34.     result                              RECORD;
  35.    
  36.     vSalesLedgerCode                    character varying;
  37.     vStatusLedgerNotDone                character varying;
  38.    
  39.     vOuStructureJournalItem             OU_BU_STRUCTURE%ROWTYPE;
  40.    
  41. BEGIN
  42.    
  43.     vDeliveryOrderDocTypeId := 311;
  44.     vEmptyId := -99;
  45.     vFunctionSubmit := 'sl_submit_do';     
  46.     vStatusDocReleased := 'R'
  47.     vStatusDocDraft := 'D';
  48.     vStatusDocInProgress := 'I';
  49.     vWorkflowStatusDraft := 'DRAFT';
  50.     vYes := 'Y';
  51.     vNo := 'N';
  52.     vZero := 0;
  53.    
  54.     vSalesLedgerCode := 'SALES';
  55.     vStatusLedgerNotDone := '0';
  56.  
  57.     --RAISE EXCEPTION 'Function Submit For Document Delivery Order is not yet Created';
  58.    
  59.     -- get data
  60.     select f_get_ou_bu_structure(A.ou_id) AS ou, A.ou_id, A.doc_no, A.doc_date,
  61.             f_get_document_journal(A.doc_type_id) as doc, C.scheme,
  62.             A.ref_id AS so_id,
  63.             D.ou_id AS warehouse_ou_id
  64.     FROM sl_do A, sl_do_item B, m_document C, m_warehouse_ou D
  65.     WHERE A.do_id = B.do_id AND
  66.         A.doc_type_id = C.doc_type_id AND
  67.         A.warehouse_id = D.warehouse_id AND
  68.         A.do_id = pDeliveryOrderId AND
  69.         A.doc_type_id = vDeliveryOrderDocTypeId
  70.         AND A.status_doc = vStatusDocReleased INTO result;
  71.    
  72.     IF FOUND THEN
  73.         vOuStructure := result.ou;
  74.         vOuId := result.ou_id;
  75.         vDocNo := result.doc_no;
  76.         vDocDate := result.doc_date;
  77.         vDocJournal := result.doc;
  78.         vScheme := result.scheme;
  79.         vSalesOrderId := result.so_id;
  80.         VWarehouseOuId := result.warehouse_ou_id;
  81.        
  82.         -- Cek status ledger not yet closed
  83.         IF EXISTS (
  84.             SELECT 1
  85.             FROM m_admin_process_ledger e, m_ou_structure f, t_ou g
  86.             WHERE e.tenant_id = pTenantId
  87.                 AND e.ou_id = f.ou_bu_id
  88.                 AND f.ou_id = vOuId
  89.                 AND e.date_year_month = SUBSTR(vDocDate, 1, 6)
  90.                 AND e.ledger_code = vSalesLedgerCode AND
  91.                 f.ou_id = g.ou_id AND e.status_ledger = vStatusLedgerNotDone) THEN
  92.        
  93.             /*
  94.              * validasi belum digunakan untuk invoice
  95.              */
  96.             IF NOT EXISTS (
  97.                 SELECT (1)
  98.                 FROM sl_so_balance_invoice A, sl_do_item B, sl_do C, sl_so D
  99.                 WHERE C.do_id = pDeliveryOrderId
  100.                     AND B.do_id = C.do_id
  101.                     AND C.ref_id = D.so_id
  102.                     AND A.tenant_id = C.tenant_id
  103.                     AND A.ou_id = C.ou_id
  104.                     AND A.partner_id = D.partner_bill_to_id
  105.                     AND A.ref_doc_type_id = C.doc_type_id
  106.                     AND A.ref_id = C.do_id
  107.                     AND A.ref_item_id = B.do_item_id
  108.                     AND A.flg_invoice <> vNo
  109.                     AND A.invoice_id <> vEmptyId
  110.                 ) THEN
  111.        
  112.                 /*
  113.                  * validasi tax belum digunakan untuk invoice
  114.                  */
  115.                 IF NOT EXISTS (
  116.                     SELECT (1)
  117.                     FROM sl_so_balance_invoice_tax A, sl_do_item B, sl_do C, sl_so D, sl_so_item E
  118.                     WHERE C.do_id = pDeliveryOrderId
  119.                         AND B.do_id = C.do_id
  120.                         AND C.ref_id = D.so_id
  121.                         AND E.so_id = D.so_id
  122.                         AND A.tenant_id = C.tenant_id
  123.                         AND A.ou_id = C.ou_id
  124.                         AND A.partner_id = D.partner_bill_to_id
  125.                         AND A.ref_doc_type_id = C.doc_type_id
  126.                         AND A.ref_id = C.do_id
  127.                         AND A.ref_item_id = B.do_item_id
  128.                         AND A.tax_id = E.tax_id
  129.                         AND A.flg_invoice <> vNo
  130.                         AND A.invoice_id <> vEmptyId
  131.                     ) THEN
  132.        
  133.                     /*
  134.                      * validasi item belum digunakan
  135.                      */
  136.                     IF NOT EXISTS (
  137.                         SELECT (1)
  138.                         FROM in_balance_do_item A, sl_do_item B
  139.                         WHERE B.do_id = pDeliveryOrderId
  140.                             AND A.do_item_id = B.do_item_id
  141.                             AND (
  142.                                 (A.qty_return + A.qty_return_int) > vZero
  143.                                 OR A.status_item <> vStatusDocReleased
  144.                             )
  145.                         ) THEN
  146.                    
  147.                         /*
  148.                          * 1. update status doc sl_do
  149.                          * 2. remove sl_log_so_balance_item
  150.                          * 3. remove sl_so_balance_invoice
  151.                          * 4. remove sl_so_balance_invoice_tax
  152.                          * 5. remove in_log_product_balance_stock
  153.                          * 6. remove in_balance_do_item
  154.                          * 7. update status sl_so_balance_item
  155.                          * 8. update status sl_so.
  156.                          * 9. remove gl_journal_trx
  157.                          * 10. remove gl_journal_trx_item
  158.                          * 11. remove gl_journal_trx_mapping
  159.                          *
  160.                          */
  161.                    
  162.                         UPDATE sl_do SET status_doc = vStatusDocDraft, version = version + 1, update_datetime = pDatetime, update_user_id = pUserId
  163.                         WHERE do_id = pDeliveryOrderId
  164.                             AND status_doc = vStatusDocReleased;
  165.                        
  166.                         DELETE
  167.                         FROM sl_log_so_balance_item Z  
  168.                         WHERE EXISTS (
  169.                             SELECT (1)
  170.                             FROM sl_do_item A
  171.                             INNER JOIN sl_do B ON B.do_id = A.do_id
  172.                             WHERE A.do_id = pDeliveryOrderId
  173.                                 AND Z.ref_id = A.do_id
  174.                                 AND Z.ref_doc_type_id = B.doc_type_id
  175.                                 AND Z.ref_item_id = A.do_item_id
  176.                         );
  177.                        
  178.                         DELETE
  179.                         FROM sl_so_balance_invoice Z   
  180.                         WHERE EXISTS (
  181.                             SELECT (1)
  182.                             FROM sl_do A
  183.                             INNER JOIN sl_do_item B ON B.do_id = A.do_id
  184.                             INNER JOIN sl_so C ON C.so_id = A.ref_id
  185.                             WHERE A.do_id = pDeliveryOrderId
  186.                                 AND Z.tenant_id = A.tenant_id
  187.                                 AND Z.ou_id = A.ou_id
  188.                                 AND Z.partner_id = C.partner_bill_to_id
  189.                                 AND Z.ref_doc_type_id = A.doc_type_id
  190.                                 AND Z.ref_id = A.do_id
  191.                                 AND Z.ref_item_id = B.do_item_id
  192.                                 AND Z.flg_invoice = vNo
  193.                                 AND Z.invoice_id = vEmptyId
  194.                         );
  195.                        
  196.                         DELETE
  197.                         FROM sl_so_balance_invoice_tax Z   
  198.                         WHERE EXISTS (
  199.                             SELECT (1)
  200.                             FROM sl_do A
  201.                             INNER JOIN sl_do_item B ON B.do_id = A.do_id
  202.                             INNER JOIN sl_so C ON C.so_id = A.ref_id
  203.                             INNER JOIN sl_so_item D ON D.so_id = C.so_id
  204.                             WHERE A.do_id = pDeliveryOrderId
  205.                                 AND Z.tenant_id = A.tenant_id
  206.                                 AND Z.ou_id = A.ou_id
  207.                                 AND Z.partner_id = C.partner_bill_to_id
  208.                                 AND Z.ref_doc_type_id = A.doc_type_id
  209.                                 AND Z.ref_id = A.do_id
  210.                                 AND Z.ref_item_id = B.do_item_id
  211.                                 AND Z.tax_id = D.tax_id
  212.                                 AND Z.flg_invoice = vNo
  213.                                 AND Z.invoice_id = vEmptyId
  214.                         );
  215.                        
  216.                         DELETE
  217.                         FROM in_log_product_balance_stock Z
  218.                         WHERE EXISTS (
  219.                             SELECT (1)
  220.                             FROM sl_do A
  221.                             INNER JOIN sl_do_item B ON B.do_id = A.do_id
  222.                             INNER JOIN sl_do_product C ON C.do_item_id = B.do_item_id
  223.                             WHERE A.do_id = pDeliveryOrderId
  224.                                 AND Z.tenant_id = A.tenant_id
  225.                                 AND Z.ou_id = A.ou_id
  226.                                 AND Z.doc_type_id = A.doc_type_id
  227.                                 AND Z.ref_id = A.do_id
  228.                                 AND Z.doc_date = A.doc_date
  229.                                 AND Z.warehouse_id = A.warehouse_id
  230.                                 AND Z.product_id = C.product_id
  231.                                 AND Z.product_balance_id = C.product_balance_id
  232.                                 AND Z.product_status = C.product_status
  233.                         );
  234.                        
  235.                         DELETE
  236.                         FROM in_balance_do_item Z  
  237.                         WHERE EXISTS (
  238.                             SELECT (1)
  239.                             FROM sl_do_item A
  240.                             WHERE A.do_id = pDeliveryOrderId
  241.                                 AND Z.do_item_id = A.do_item_id
  242.                         )
  243.                         AND Z.qty_return = vZero
  244.                         AND Z.qty_return_int = vZero
  245.                         AND Z.status_item = vStatusDocReleased;
  246.                        
  247.                         UPDATE sl_so_balance_item SET status_item = vStatusDocInProgress, update_datetime = pDatetime, update_user_id = pUserId
  248.                         FROM sl_do_item A
  249.                         WHERE sl_so_balance_item.so_item_id = A.ref_id AND
  250.                             sl_so_balance_item.tenant_id = A.tenant_id AND
  251.                             A.do_id = pDeliveryOrderId;
  252.                        
  253.                         UPDATE sl_so SET status_doc = vStatusDocReleased
  254.                         WHERE so_id = vSalesOrderId;
  255.            
  256.                         IF (vOuId <> vWarehouseOuId) THEN
  257.                             SELECT f_get_ou_bu_structure(vWarehouseOuId) as ou_structure INTO result;
  258.                             vOuStructureJournalItem := result.ou_structure;
  259.                         ELSE
  260.                             vOuStructureJournalItem := ROW(-99, -99, -99);
  261.                         END IF;
  262.                        
  263.                         -- PERFORM cancel gl_cancel_admin_journal_trx
  264.                         PERFORM gl_cancel_admin_journal_trx(pTenantId, (vOuStructure).ou_bu_id, vOuId, (vDocJournal).journal_type, f_get_year_month_date(vDocDate), 'MONTHLY', pDatetime, pUserId);
  265.                        
  266.                         -- Find journal trx id
  267.                         SELECT journal_trx_id INTO vJournalTrxId
  268.                         FROM gl_journal_trx
  269.                         WHERE tenant_id = pTenantId
  270.                             AND journal_type = (vDocJournal).journal_type
  271.                             AND doc_type_id = vDeliveryOrderDocTypeId
  272.                             AND doc_id = pDeliveryOrderId
  273.                             AND doc_no = vDocNo
  274.                             AND doc_date = vDocDate
  275.                             AND ou_bu_id = (vOuStructure).ou_bu_id
  276.                             AND ou_branch_id = (vOuStructure).ou_branch_id
  277.                             AND ou_sub_bu_id = (vOuStructure).ou_sub_bu_id;
  278.                        
  279.                         -- DELETE gl_journal_trx
  280.                         DELETE FROM gl_journal_trx
  281.                         WHERE journal_trx_id = vJournalTrxId;
  282.                        
  283.                         -- DELETE gl_journal_trx_item
  284.                         DELETE FROM gl_journal_trx_item
  285.                         WHERE journal_trx_id = vJournalTrxId;
  286.                
  287.                         -- DELETE gl_journal_trx_mapping
  288.                         DELETE FROM gl_journal_trx_mapping
  289.                         WHERE journal_trx_id = vJournalTrxId;
  290.                        
  291.                         -- PERFORM f_reset_approval_to_draft
  292.                         PERFORM f_reset_approval_to_draft(pTenantId, pSessionId, vScheme, pDeliveryOrderId, vDocNo, pDatetime, pRemarkApproval);
  293.                            
  294.                         -- UPDATE t_process_message
  295.                         UPDATE t_process_message
  296.                         SET process_no = pPrevProcessNo,
  297.                             update_datetime = pDatetime,
  298.                             update_user_id = pUserId,
  299.                             version = version + 1
  300.                         WHERE tenant_id = pTenantId
  301.                             AND process_name = vFunctionSubmit
  302.                             AND process_no = pDeliveryOrderId || '_' || vDocNo;
  303.                        
  304.                     ELSE
  305.                         RAISE EXCEPTION 'Document with id % is aready used in another document', pDeliveryOrderId;
  306.                     END IF;
  307.                
  308.                 ELSE
  309.                     RAISE EXCEPTION 'Document with id % is aready used for invoice', pDeliveryOrderId;
  310.                 END IF;
  311.                
  312.             ELSE
  313.                 RAISE EXCEPTION 'Document with id % is aready used for invoice', pDeliveryOrderId;
  314.             END IF;
  315.        
  316.         ELSE
  317.             RAISE EXCEPTION 'Admin Process Ledger for Sales in year month % is already closed', SUBSTR(vDocDate, 1, 6);
  318.         END IF;
  319.            
  320.     ELSE
  321.         RAISE EXCEPTION 'Document with id % is not found or document is on approval progress', pDeliveryOrderId;
  322.     END IF;
  323.        
  324. END;
  325. $BODY$
  326.   LANGUAGE plpgsql VOLATILE
  327.   COST 100;
  328.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement