Advertisement
aadddrr

CANCEL APPROVE VOID SO

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