Advertisement
aadddrr

CANCEL SUBMIT CANCEL SO

Mar 3rd, 2017
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --Adrian, Mar 3, 2017
  2.  
  3. CREATE OR REPLACE FUNCTION sl_cancel_submit_cancel_so(bigint, character varying, bigint, character varying, bigint, character varying, character varying)
  4.   RETURNS void AS
  5. $BODY$
  6. DECLARE
  7.     pTenantId                           ALIAS FOR $1;
  8.     pSessionId                          ALIAS FOR $2;
  9.     pUserId                             ALIAS FOR $3;
  10.     pDatetime                           ALIAS FOR $4;
  11.     pCancelSoId                         ALIAS FOR $5;
  12.     pRemarkApproval                     ALIAS FOR $6;
  13.     pPrevProcessNo                      ALIAS FOR $7;
  14.    
  15.     vEmptyId                            bigint;
  16.     vCancelSoDocTypeId                  bigint;
  17.     vFlagNo                             character varying(1);
  18.     vRoundingModeNonTax                 character varying(5);
  19.     vStatusRelease                      character varying(1);
  20.     vOuStructure                        OU_BU_STRUCTURE%ROWTYPE;
  21.     RESULT                              RECORD;
  22.    
  23.     vFunctionSubmit                     character varying;
  24.     vStatusDraft                        character varying;
  25.     vStatusInProgress                   character varying;
  26.     vStatusCancel                       character varying(1);
  27.     vWorkflowStatusDraft                character varying;
  28.     vSoId                               bigint;
  29.     vZero                               bigint;
  30.     vTypeDataHeader                     character varying;
  31.     vTypeDataFinance                    character varying;
  32.    
  33.     vDoDocDate                          character varying;
  34.     vDoReceiptDocDate                   character varying;
  35.     vOuId                               bigint;
  36.     vLedgerCode                         character varying;
  37.     vStatusLedgerNotDone                character varying;
  38.     vScheme                             character varying;
  39.     vDocNo                              character varying;
  40.    
  41.     vEmpty                              character varying;
  42.    
  43. BEGIN
  44.    
  45.     vEmptyId := -99;
  46.     vStatusRelease := 'R';
  47.     vFlagNo := 'N';
  48.     vCancelSoDocTypeId := 302;
  49.    
  50.     vFunctionSubmit := 'sl_submit_cancel_so';  
  51.     vStatusDraft := 'D';
  52.     vStatusInProgress = 'I';
  53.     vStatusCancel := 'C';
  54.     vWorkflowStatusDraft := 'DRAFT';
  55.     vZero := 0;
  56.    
  57.     vLedgerCode := 'INV';
  58.     vStatusLedgerNotDone := '0';
  59.    
  60.     vEmpty := '';
  61.    
  62.     select f_get_ou_bu_structure(A.ou_id) AS ou,
  63.         A.ou_id, A.doc_date,
  64.         COALESCE(C.doc_date, '') AS do_doc_date, COALESCE(D.doc_date, '') AS do_receipt_doc_date,
  65.         A.doc_no, E.scheme
  66.     FROM sl_manage_so A
  67.     LEFT JOIN sl_do C ON C.ref_id = A.so_id
  68.     LEFT JOIN in_do_receipt D ON D.ref_id = C.do_id
  69.     INNER JOIN m_document E ON E.doc_type_id = A.doc_type_id
  70.     WHERE A.manage_so_id = pCancelSoId
  71.         AND A.doc_type_id = vCancelSoDocTypeId
  72.         AND A.status_doc = vStatusRelease INTO RESULT;
  73.  
  74.     --RAISE EXCEPTION 'Function Submit For Document Cancel SO is not yet created';
  75.        
  76.     IF FOUND THEN
  77.         vOuStructure := RESULT.ou;
  78.         vOuId := RESULT.ou_id;
  79.         vDoDocDate := RESULT.do_doc_date;
  80.         vDoReceiptDocDate := RESULT.do_receipt_doc_date;
  81.         vScheme := RESULT.scheme;
  82.         vDocNo := RESULT.doc_no;
  83.        
  84.         -- Cek status ledger not yet closed for DO
  85.         IF ((vDoDocDate = vEmpty) OR EXISTS (
  86.             SELECT 1
  87.             FROM m_admin_process_ledger e, m_ou_structure f, t_ou g
  88.             WHERE e.tenant_id = pTenantId
  89.                 AND e.ou_id = f.ou_bu_id
  90.                 AND f.ou_id = vOuId
  91.                 AND e.date_year_month = SUBSTR(vDoDocDate, 1, 6)
  92.                 AND e.ledger_code = vLedgerCode AND
  93.                 f.ou_id = g.ou_id AND e.status_ledger = vStatusLedgerNotDone
  94.             )) THEN
  95.            
  96.             -- Cek status ledger not yet closed for DO Receipt
  97.             IF ((vDoReceiptDocDate = vEmpty) OR EXISTS (
  98.                 SELECT 1
  99.                 FROM m_admin_process_ledger e, m_ou_structure f, t_ou g
  100.                 WHERE e.tenant_id = pTenantId
  101.                     AND e.ou_id = f.ou_bu_id
  102.                     AND f.ou_id = vOuId
  103.                     AND e.date_year_month = SUBSTR(vDoReceiptDocDate, 1, 6)
  104.                     AND e.ledger_code = vLedgerCode AND
  105.                     f.ou_id = g.ou_id AND e.status_ledger = vStatusLedgerNotDone
  106.                 )) THEN
  107.                
  108.                 SELECT A.so_id INTO vSoId FROM sl_manage_so A WHERE A.manage_so_id = pCancelSoId;
  109.        
  110.                 /*
  111.                  * validasi so tidak sedang digunakan
  112.                  */
  113.                 IF NOT EXISTS (
  114.                     SELECT (1)
  115.                     FROM sl_so A, sl_manage_so_header B, sl_manage_so C
  116.                     WHERE B.manage_so_id = pCancelSoId
  117.                         AND B.manage_so_id = C.manage_so_id
  118.                         AND A.so_id = C.so_id
  119.                         AND A.status_doc <> vStatusRelease
  120.                     ) THEN
  121.                    
  122.                     /**
  123.                      * validasi SO PO harus cancel
  124.                      */
  125.                     IF NOT EXISTS (
  126.                         SELECT (1)
  127.                         FROM sl_so_po_balance_item A, sl_manage_so_item B, sl_manage_so C, sl_so_balance_item D
  128.                         WHERE A.so_item_id = B.so_item_id
  129.                             AND B.manage_so_id = C.manage_so_id
  130.                             AND A.so_item_id = D.so_item_id
  131.                             AND B.manage_so_id = pCancelSoId
  132.                             AND A.status_item <> vStatusCancel
  133.                     ) THEN
  134.                    
  135.                         /**
  136.                          * validasi SO Balance harus cancel
  137.                          */
  138.                         IF NOT EXISTS (
  139.                             SELECT (1)                             
  140.                             FROM sl_so_balance_item A, sl_manage_so_item B
  141.                             WHERE A.so_item_id = B.so_item_id
  142.                                 AND B.manage_so_id = pCancelSoId
  143.                                 AND A.status_item <> vStatusCancel
  144.                         ) THEN
  145.                        
  146.                             /*
  147.                              * 1.update status item balance SO
  148.                              * 2.update status doc sl so
  149.                              * 3.delete sl log balance item SO
  150.                              * 4.update workflow status manage SO
  151.                              * 5.update qty cancel dan status item balance PO terhadap SO
  152.                              */
  153.                            
  154.                             UPDATE sl_so_balance_item A
  155.                             SET status_item = vStatusInProgress,
  156.                                qty_cancel = B.qty_so,
  157.                                qty_cancel_int = B.qty_int,
  158.                                update_datetime = pDatetime,
  159.                                update_user_id = pUserId
  160.                             FROM sl_manage_so_item B
  161.                             WHERE A.so_item_id = B.so_item_id
  162.                                 AND B.manage_so_id = pCancelSoId
  163.                                 AND A.status_item = vStatusCancel;
  164.                                
  165.                             UPDATE sl_so SET status_doc = vStatusInProgress, update_datetime = pDatetime, update_user_id = pUserId
  166.                             WHERE so_id = vSoId;
  167.                            
  168.                             DELETE FROM sl_log_so_balance_item Z
  169.                             WHERE EXISTS (
  170.                                 SELECT (1)
  171.                                 FROM sl_manage_so A, sl_manage_so_item B
  172.                                 WHERE A.manage_so_id = pCancelSoId
  173.                                     AND A.manage_so_id = B.manage_so_id
  174.                                     AND A.so_id = vSoId
  175.                                     AND Z.tenant_id = A.tenant_id
  176.                                     AND Z.so_id = A.so_id
  177.                                     AND Z.so_item_id = B.so_item_id
  178.                                     AND Z.ref_doc_type_id = A.doc_type_id
  179.                                     AND Z.ref_id = A.manage_so_id
  180.                                     AND Z.ref_item_id = B.manage_so_item_id
  181.                                     AND Z.qty_trx = -1 * B.qty_so
  182.                                     AND Z.trx_uom_id = B.so_uom_id
  183.                                     AND Z.qty_int = -1 * B.qty_int
  184.                                     AND Z.base_uom_id = B.base_uom_id
  185.                                     AND Z.remark = A.remark
  186.                             );
  187.                            
  188.                             UPDATE sl_manage_so SET status_doc = vStatusDraft, workflow_status = vWorkflowStatusDraft, update_datetime = pDatetime, update_user_id = pUserId, version = version + 1
  189.                             WHERE manage_so_id = pCancelSoId
  190.                                 AND status_doc = vStatusRelease;
  191.                                
  192.                             -- Update status so po balance item
  193.                             UPDATE sl_so_po_balance_item A
  194.                             SET update_datetime = pDatetime, update_user_id = pUserId, version = A.version + 1, status_item = vStatusRelease
  195.                             FROM sl_manage_so_item B
  196.                             WHERE A.so_item_id = B.so_item_id
  197.                                 AND B.manage_so_id = pCancelSoId
  198.                                 AND A.status_item = vStatusCancel;
  199.                                    
  200.                             -- Update status menjadi 'I' jika terdapat PO yang menggunakan dan masih draft
  201.                             UPDATE sl_so_po_balance_item A
  202.                             SET update_datetime = pDatetime, update_user_id = pUserId, version = A.version + 1, status_item = vStatusInProgress
  203.                             FROM sl_manage_so_item B, sl_manage_so C, sl_so_balance_item D, pu_po_item E, pu_po F
  204.                             WHERE A.so_item_id = B.so_item_id
  205.                                 AND B.manage_so_id = C.manage_so_id
  206.                                 AND A.so_item_id = D.so_item_id
  207.                                 AND B.manage_so_id = pCancelSoId
  208.                                 AND A.status_item = vStatusRelease
  209.                                 AND E.ref_id = D.so_item_id
  210.                                 AND F.po_id = E.po_id
  211.                                 AND F.status_doc = vStatusDraft;
  212.                            
  213.                             -- PERFORM f_reset_approval_to_draft
  214.                             PERFORM f_reset_approval_to_draft(pTenantId, pSessionId, vScheme, pCancelSoId, vDocNo, pDatetime, pRemarkApproval);
  215.                                
  216.                             -- UPDATE t_process_message
  217.                             UPDATE t_process_message
  218.                             SET process_no = pPrevProcessNo,
  219.                                 update_datetime = pDatetime,
  220.                                 update_user_id = pUserId,
  221.                                 version = version + 1
  222.                             WHERE tenant_id = pTenantId
  223.                                 AND process_name = vFunctionSubmit
  224.                                 AND process_no = pCancelSoId || '_' || vDocNo;     
  225.                    
  226.                         ELSE
  227.                             RAISE EXCEPTION 'Status of SO Balance with id % is not cancel', vSoId;
  228.                         END IF;
  229.                
  230.                     ELSE
  231.                         RAISE EXCEPTION 'Status of SO PO with id % is not cancel', vSoId;
  232.                     END IF;
  233.            
  234.                 ELSE
  235.                     RAISE EXCEPTION 'Sales Order with id % is in use by other documnet', vSoId;
  236.                 END IF;
  237.                
  238.             ELSE
  239.                 RAISE EXCEPTION 'Admin Process Ledger for Inventory in year month % is already closed', SUBSTR(vDoReceiptDocDate, 1, 6);
  240.             END IF;
  241.            
  242.         ELSE
  243.             RAISE EXCEPTION 'Admin Process Ledger for Inventory in year month % is already closed', SUBSTR(vDoDocDate, 1, 6);
  244.         END IF;
  245.        
  246.     ELSE
  247.         RAISE EXCEPTION 'Document with id % is not found or document is on approval progress', pCancelSoId;
  248.     END IF;
  249.        
  250. END;
  251. $BODY$
  252.   LANGUAGE plpgsql VOLATILE
  253.   COST 100;
  254.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement