Advertisement
aadddrr

sl_cancel_submit_sales_invoice

Oct 17th, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION sl_cancel_submit_sales_invoice(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.     pSalesInvoiceId     ALIAS FOR $5;
  10.     pRemarkApproval     ALIAS FOR $6;
  11.     pPrevProcessNo      ALIAS FOR $7;
  12.  
  13.     vStatusDoc          character varying;
  14.     vWorkflowStatus     character varying;
  15.     vDocNo              character varying;
  16.     vDocDate            character varying;
  17.     vSalesLedgerCode    character varying := 'SALES';
  18.     vStatusLedgerNotDone    character varying := '0';
  19.     vOuId               bigint;
  20.     vJournalTrxId       bigint;
  21.    
  22.     vDocJournal         DOC_JOURNAL%ROWTYPE;
  23.     vOuStructure        OU_BU_STRUCTURE%ROWTYPE;
  24.     result              RECORD;
  25.    
  26.     vInvoiceArBalanceId     bigint;
  27.     vInvoiceTaxArBalanceId  bigint;
  28.     vSalesInvoiceTempId     bigint;
  29.     vInvoiceArBalanceIdForTemp  bigint;
  30.     vRegularDiscount        bigint;
  31.     vPromoDiscount          bigint;
  32.     vFakturPajakKeluaran    bigint;
  33.     vDocTypeId              bigint;
  34.     vPaymentAmount          numeric;
  35.     vPaymentAmountTax       numeric;
  36.     vDiffAdjRegularDiscAmount       numeric;
  37.     vDiffAdjPromoDiscAmount         numeric;
  38.     vMaxItemAmount          numeric;
  39.     vRoundingModeNonTax     character varying(5);
  40.     vSalesInvDate           character varying;
  41.     vFlgPayment             character varying;
  42.     vFlgPaymentTax          character varying;
  43.     vScheme                 character varying;
  44.     vDoDocTypeId            bigint;
  45.     vFlagPayment    character varying(1);
  46.     vYes                    character varying(1);
  47.     vInProgress             character varying(1);
  48. BEGIN
  49.    
  50.     vFakturPajakKeluaran := 281;
  51.     vDoDocTypeId := 311;
  52.     vFlagPayment := 'N';
  53.     vYes := 'Y';
  54.     vInProgress := 'I';
  55.     /*
  56.      * 1. cek data admin process ledger untuk ledger SALES di tahun bulan dan ou sesuai dokumen Sales Invoice terkait.
  57.      *      Apabila tidak ada atau sudah tutup bulan, maka muncul exception dan berhenti prosesnya.
  58.      * 2. cek saldo dokumen Sales Invoice-nya apakah payment_amountnya tidak 0 atau flg_payment tidak sama dengan 'N' di fi_invoice_ar_balance berdasarkan dokumen Sales Invoice terkait.
  59.      *      Apabila tidak ada, maka muncul exception dan berhenti prosesnya.
  60.      * 3. cek saldo tax dokumen Sales Invoice-nya apakah payment_amountnya tidak 0 atau flg_payment tidak sama dengan 'N' di fi_invoice_tax_ar_balance berdasarkan dokumen Sales Invoice terkait.
  61.      *      Apabila tidak ada, maka muncul exception dan berhenti prosesnya.
  62.      * 4. menjalankan function gl_cancel_admin_journal_trx
  63.      * 5. Menghapus data gl_journal_trx_mapping, gl_journal_trx_item berdasarkan gl_journal_trx-nya
  64.      * 6. menghapus gl_journal_trx berdasarkan journal_type, doc_type_id, doc_id, doc_no, doc_date, dan ou_id-nya.
  65.      * 7. menjalankan function f_reset_approval_to_draft
  66.      * 8. update t_process_message berdasarkan process_name, invoice_id, dan doc_no-nya
  67.      * 9. update flg_invoice, invoice_id, update_datetime, update_user_id, version di sl_so_balance_advance_invoice berdasarkan invoice_id dan ref_idnya
  68.      * 10. update flg_payment di fi_invoice_ar_balance berdasarkan invoice_ar_balance_id-nya
  69.      * 11. update sales_invoice_id, sales_invoice_date, update_datetime, update_user_id, version di fi_invoice_tax_advance_ar_balance berdasarkan salesInvoiceId
  70.      * 12. update sales_invoice_id, sales_invoice_date, update_datetime, update_user_id, version di fi_invoice_advance_ar_balance berdasarkan salesInvoiceId
  71.      * 13. Menghapus data fi_vat_out_for_efaktur berdasarkan invoice_ar_balance_id-nya
  72.      * 14. Menghapus fi_vat_out_for_reporting berdasarkan invoice_tax_ar_balance_id-nya
  73.      * 15. Cek apakah temp sales invoicenya ada atau tidak.
  74.      *      Apabila ada, insert ulang fi_invoice_ar_balance dan fi_invoice_tax_ar_balance
  75.      *      dengan query di function insert temp sales invoice-nya dan update flg_invoice,
  76.      *      update_datetime, update_user_id, dan version di sl_do_inv berdasarkan do_id dan invoice_id-nya
  77.      * 16. Menghapus fi_invoice_ar_balance_due_date berdasarkan invoice_ar_balance_id-nya
  78.      * 17. Menghapus fi_invoice_tax_ar_balance_due_date berdasarkan invoice_ar_balance_id-nya
  79.      * 18. Menghapus data fi_invoice_tax_ar_balance berdasarkan invoice_id-nya
  80.      * 19. Menghapus data fi_invoice_ar_balance berdasarkan invoice_id-nya
  81.      * 20. Update flg_invoice, update_datetime, dan update_user_id di sl_so_balance_invoice_tax
  82.      * 21. Update adj_regular_disc_amount, adj_promo_disc_amount, update_datetime, update_user_id, dan version di sl_so_balance_invoice
  83.      * 22. update adj_regular_disc_amount, update_datetime, update_user_id dan version di sl_so_balance_invoice;
  84.      *      update adj_promo_disc_amount, update_datetime, update_user_id dan version di sl_so_balance_invoice
  85.      *      berdasarkan rounding mode non tax-nya
  86.      * 23. Update flg_invoice, update_datetime dan update_user_id sl_so_balance_invoice berdasarkan invoice_id-nya
  87.      * 24. Update status_doc, update_datetime, update_user_id di sl_invoice berdasarkan sales invoice id-nya
  88.      *
  89.      */
  90.        
  91.     WITH activity_gl_regular_disc AS (
  92.         SELECT A.activity_gl_code
  93.         FROM m_activity_gl A
  94.         WHERE A.activity_gl_code = 'REGULAR_DISC'
  95.     )
  96.     SELECT CAST(f_get_value_system_config_by_param_code(pTenantId, A.activity_gl_code) AS bigint) INTO vRegularDiscount
  97.     FROM activity_gl_regular_disc A;
  98.    
  99.     WITH activity_gl_promo_disc AS (
  100.         SELECT A.activity_gl_code
  101.         FROM m_activity_gl A
  102.         WHERE A.activity_gl_code = 'PROMO_DISC'
  103.     )
  104.     SELECT CAST(f_get_value_system_config_by_param_code(pTenantId, A.activity_gl_code) AS bigint) INTO vPromoDiscount
  105.     FROM activity_gl_promo_disc A;
  106.    
  107.     SELECT f_get_ou_bu_structure(A.ou_id) AS ou, f_get_document_journal(A.doc_type_id) as doc, ref_inv_temp_id as salesInvTempId, A.doc_date
  108.     FROM sl_invoice A
  109.     WHERE A.invoice_id = pSalesInvoiceId INTO result;
  110.    
  111.     vOuStructure := result.ou;
  112.     vDocJournal := result.doc;
  113.     vSalesInvoiceTempId := result.salesInvTempId;
  114.     vSalesInvDate := result.doc_date;
  115.    
  116.     -- 1. cek data admin process ledger untuk ledger SALES di tahun bulan dan ou sesuai dokumen Sales Invoice terkait.
  117.     --      Apabila tidak ada atau sudah tutup bulan, maka muncul exception dan berhenti prosesnya.
  118.     SELECT A.ou_id, A.doc_type_id, A.doc_no, A.doc_date, A.status_doc, A.workflow_status, B.scheme
  119.     INTO vOuId, vDocTypeId, vDocNo, vDocDate, vStatusDoc, vWorkflowStatus, vScheme  
  120.     FROM sl_invoice A, m_document B
  121.     WHERE A.invoice_id = pSalesInvoiceId
  122.     AND A.doc_type_id = B.doc_type_id;
  123.    
  124.     IF EXISTS (SELECT 1 FROM m_admin_process_ledger e, m_ou_structure f, t_ou g
  125.         WHERE e.tenant_id = pTenantId AND e.ou_id = f.ou_bu_id AND f.ou_id = vOuId AND
  126.             e.date_year_month = SUBSTR(vDocDate, 1, 6) AND e.ledger_code = vSalesLedgerCode AND
  127.             f.ou_id = g.ou_id AND e.status_ledger = vStatusLedgerNotDone) THEN
  128.    
  129.         IF vStatusDoc = 'R' AND vWorkflowStatus = 'APPROVED' THEN
  130.        
  131.             -- 2. Sales Invoice yang hendak dibatalkan harus belum pernah dialokasi sama sekali
  132.             SELECT A.invoice_ar_balance_id, A.payment_amount, A.flg_payment
  133.             INTO vInvoiceArBalanceId, vPaymentAmount, vFlgPayment
  134.             FROM fi_invoice_ar_balance A
  135.             WHERE A.tenant_id = pTenantId
  136.                 AND A.doc_no = vDocNo
  137.                 AND A.doc_date = vDocDate
  138.                 AND A.ou_id = vOuId
  139.                 AND A.doc_type_id = vDocTypeId
  140.                 AND A.invoice_ar_id = pSalesInvoiceId;
  141.            
  142.             SELECT A.invoice_tax_ar_balance_id, A.payment_amount, A.flg_payment INTO vInvoiceTaxArBalanceId, vPaymentAmountTax, vFlgPaymentTax
  143.             FROM fi_invoice_tax_ar_balance A
  144.             WHERE A.invoice_ar_balance_id = vInvoiceArBalanceId;
  145.            
  146.            
  147. --          2. cek saldo dokumen Sales Invoice-nya apakah payment_amountnya tidak 0 atau flg_payment tidak sama dengan 'N' di fi_invoice_ar_balance berdasarkan dokumen Sales Invoice terkait.
  148. --              Apabila tidak sesuai dengan kondisi tersebut, maka muncul exception dan berhenti prosesnya.
  149. --          3. cek saldo tax dokumen Sales Invoice-nya apakah payment_amountnya tidak 0 atau flg_payment tidak sama dengan 'N' di fi_invoice_tax_ar_balance berdasarkan dokumen Sales Invoice terkait.
  150. --              Apabila tidak sesuai dengan kondisi tersebut, maka muncul exception dan berhenti prosesnya.
  151.             IF EXISTS (
  152.                     SELECT 1
  153.                     FROM fi_invoice_ar_balance A
  154.                     WHERE A.invoice_ar_balance_id = vInvoiceArBalanceId
  155.                         AND (A.flg_payment IN ( vYes, vInProgress ) OR A.payment_amount <> 0) )
  156.                 OR
  157.                
  158.                 EXISTS (
  159.                     SELECT 1
  160.                     FROM fi_invoice_tax_ar_balance A
  161.                     INNER JOIN fi_invoice_ar_balance B ON A.invoice_ar_balance_id = B.invoice_ar_balance_id
  162.                     WHERE B.invoice_ar_balance_id = vInvoiceArBalanceId
  163.                         AND (A.flg_payment IN ( vYes, vInProgress ) OR A.payment_amount <> 0) )
  164.             THEN
  165.                 RAISE EXCEPTION 'Document is already used in allocation process, process aborted';
  166.             ELSE
  167.            
  168. --              4. menjalankan function gl_cancel_admin_journal_trx
  169.                 PERFORM gl_cancel_admin_journal_trx(pTenantId, (vOuStructure).ou_bu_id, vOuId, (vDocJournal).journal_type, f_get_year_month_date(vDocDate), 'DAILY', pDatetime, pUserId);
  170.                
  171. --              5. Menghapus data gl_journal_trx_mapping, gl_journal_trx_item berdasarkan gl_journal_trx-nya
  172.  
  173.                 SELECT journal_trx_id INTO vJournalTrxId
  174.                 FROM gl_journal_trx
  175.                 WHERE tenant_id = pTenantId
  176.                     AND journal_type = (vDocJournal).journal_type
  177.                     AND doc_type_id = vDocTypeId
  178.                     AND doc_id = pSalesInvoiceId
  179.                     AND doc_no = vDocNo
  180.                     AND doc_date = vDocDate
  181.                     AND ou_bu_id = (vOuStructure).ou_bu_id
  182.                     AND ou_branch_id = (vOuStructure).ou_branch_id
  183.                     AND ou_sub_bu_id = (vOuStructure).ou_sub_bu_id;
  184.                
  185.                 DELETE FROM gl_journal_trx_item
  186.                 WHERE journal_trx_id = vJournalTrxId;
  187.            
  188.                 DELETE FROM gl_journal_trx_mapping
  189.                 WHERE journal_trx_id = vJournalTrxId;
  190.                
  191. --              6. menghapus gl_journal_trx berdasarkan journal_type, doc_type_id, doc_id, doc_no, doc_date, dan ou_id-nya.
  192.  
  193.                 DELETE FROM gl_journal_trx
  194.                 WHERE journal_trx_id = vJournalTrxId;
  195.                
  196. --              7. menjalankan function f_reset_approval_to_draft
  197.                
  198.                 PERFORM f_reset_approval_to_draft(pTenantId, pSessionId, vScheme, pSalesInvoiceId, vDocNo, pDatetime, pRemarkApproval);
  199.                
  200. --              8. update t_process_message berdasarkan process_name, invoice_id, dan doc_no-nya
  201.                
  202.                 UPDATE t_process_message
  203.                 SET process_no = pPrevProcessNo,
  204.                     update_datetime = pDatetime,
  205.                     update_user_id = pUserId,
  206.                     version = version - 1
  207.                 WHERE tenant_id = pTenantId
  208.                     AND process_name = 'sl_submit_sales_invoice'
  209.                     AND process_no = pSalesInvoiceId || '_' || vDocNo;
  210.                
  211. --              9. update flg_invoice, invoice_id, update_datetime, update_user_id, version di sl_so_balance_advance_invoice berdasarkan invoice_id dan ref_idnya  
  212.                
  213.                 UPDATE sl_so_balance_advance_invoice SET flg_invoice = 'I', invoice_id = -99,
  214.                     update_datetime = pDatetime, update_user_id = pUserId,
  215.                     version = sl_so_balance_advance_invoice.version - 1
  216.                 FROM sl_invoice_advance A
  217.                 WHERE A.invoice_id = pSalesInvoiceId AND
  218.                     A.invoice_id = sl_so_balance_advance_invoice.invoice_id AND
  219.                     A.ref_id = sl_so_balance_advance_invoice.ref_id;
  220.                
  221. --              10. update flg_payment di fi_invoice_ar_balance berdasarkan invoice_ar_balance_id-nya
  222.                
  223.                 UPDATE fi_invoice_ar_balance A
  224.                 SET flg_payment = 'N'
  225.                 WHERE A.invoice_ar_balance_id = vInvoiceArBalanceId;
  226.                    
  227. --              11. update sales_invoice_id, sales_invoice_date, update_datetime, update_user_id, version di fi_invoice_tax_advance_ar_balance berdasarkan salesInvoiceId
  228. --              12. update sales_invoice_id, sales_invoice_date, update_datetime, update_user_id, version di fi_invoice_advance_ar_balance berdasarkan salesInvoiceId
  229. --              Nomor 11 dan 12 diabaikan dulu karena berhubungan dengan down payment              
  230.                
  231. --              13. Menghapus data fi_vat_out_for_efaktur berdasarkan invoice_ar_balance_id-nya
  232.  
  233.                 DELETE FROM fi_vat_out_for_efaktur
  234.                 WHERE doc_id = pSalesInvoiceId
  235.                 AND doc_type_id = vDocTypeId
  236.                 AND ou_id = vOuId
  237.                 AND tenant_id = pTenantId;
  238.                
  239. --              14. Menghapus fi_vat_out_for_reporting berdasarkan invoice_tax_ar_balance_id-nya
  240.  
  241.                 DELETE FROM fi_vat_out_for_reporting
  242.                 WHERE ref_id = vInvoiceTaxArBalanceId;
  243.                
  244. --              15. Cek apakah temp sales invoicenya ada atau tidak.
  245. --                  Apabila ada, insert ulang fi_invoice_ar_balance dan fi_invoice_tax_ar_balance
  246. --                  dengan query di function insert temp sales invoice-nya dan update flg_invoice,
  247. --                  update_datetime, update_user_id, dan version di sl_do_inv berdasarkan do_id dan invoice_id-nya
  248.                
  249.                 IF vSalesInvoiceTempId <> -99 THEN
  250.  
  251.                     SELECT nextval('fi_invoice_ar_balance_seq') INTO vInvoiceArBalanceIdForTemp;
  252.                    
  253.                     INSERT INTO fi_invoice_ar_balance
  254.                     ( invoice_ar_balance_id, tenant_id, ou_id, doc_type_id, invoice_ar_id,
  255.                     doc_no, doc_date, ext_doc_no, ext_doc_date,
  256.                     ref_doc_type_id, ref_id,  partner_id, due_date,  
  257.                     curr_code, amount, remark, payment_amount, flg_payment,
  258.                     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  259.                     SELECT vInvoiceArBalanceIdForTemp, A.tenant_id, A.ou_id, A.doc_type_id, A.invoice_temp_id,
  260.                             A.doc_no, A.doc_date, A.ext_doc_no, A.ext_doc_date,
  261.                             A.ref_doc_type_id, A.ref_id, A.partner_id, A.due_date,
  262.                             A.curr_code, A.total_amount, A.remark, 0, vFlagPayment,
  263.                             0, pDatetime, pUserId, pDatetime, pUserId
  264.                     FROM sl_invoice_temp A
  265.                     WHERE A.invoice_temp_id = vSalesInvoiceTempId;
  266.                    
  267.                     INSERT INTO fi_invoice_tax_ar_balance
  268.                     (tenant_id, ou_id, doc_type_id, invoice_ar_balance_id,
  269.                     partner_id, tax_id, tax_no, tax_date,
  270.                     curr_code, tax_amount, tax_curr_code, gov_tax_amount,
  271.                     due_date, remark, payment_amount, flg_payment,
  272.                     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  273.                     SELECT A.tenant_id, A.ou_id, vFakturPajakKeluaran, C.invoice_ar_balance_id,    
  274.                         A.partner_id, B.tax_id, B.tax_no, B.tax_date,
  275.                         A.curr_code, B.tax_amount, B.tax_curr_code, B.gov_tax_amount,
  276.                         A.due_date, B.remark, 0, vFlagPayment,
  277.                         0, pDatetime, pUserId, pDatetime, pUserId
  278.                     FROM sl_invoice_temp A, sl_invoice_temp_tax B, fi_invoice_ar_balance C
  279.                     WHERE A.invoice_temp_id = vSalesInvoiceTempId AND
  280.                         A.invoice_temp_id = B.invoice_temp_id AND
  281.                         A.tenant_id = C.tenant_id AND
  282.                         A.doc_type_id = C.doc_type_id AND
  283.                         A.invoice_temp_id = C.invoice_ar_id;   
  284.                    
  285.                     PERFORM fi_insert_invoice_ar_balance_due_date(pTenantId, pSessionId, vInvoiceArBalanceIdForTemp, pUserId, pDatetime);
  286.                    
  287.                     UPDATE sl_do_inv SET flg_invoice = 'N',
  288.                         update_datetime = pDatetime, update_user_id = pUserId, version = sl_do_inv.version - 1
  289.                     FROM sl_invoice_item A
  290.                     WHERE A.invoice_id = pSalesInvoiceId AND
  291.                         A.ref_id = sl_do_inv.do_id;
  292.                    
  293.                 END IF;
  294.                
  295. --              16. Menghapus fi_invoice_ar_balance_due_date berdasarkan invoice_ar_balance_id-nya
  296.                
  297.                 DELETE FROM fi_invoice_ar_balance_due_date WHERE invoice_ar_balance_id = vInvoiceArBalanceId;
  298.                
  299. --              17. Menghapus fi_invoice_tax_ar_balance_due_date berdasarkan invoice_ar_balance_id-nya
  300.                
  301.                 DELETE FROM fi_invoice_tax_ar_balance_due_date WHERE invoice_tax_ar_balance_id = vInvoiceTaxArBalanceId;
  302.        
  303. --              18. Menghapus data fi_invoice_tax_ar_balance berdasarkan invoice_id-nya
  304.                 DELETE FROM fi_invoice_ar_balance WHERE invoice_ar_balance_id = vInvoiceArBalanceId;
  305.        
  306. --              19. Menghapus data fi_invoice_ar_balance berdasarkan invoice_id-nya
  307.                 DELETE FROM fi_invoice_tax_ar_balance WHERE invoice_ar_balance_id = vInvoiceArBalanceId;
  308.                
  309. --              20. Update flg_invoice, update_datetime, dan update_user_id di sl_so_balance_invoice_tax
  310.                 UPDATE sl_so_balance_invoice_tax A SET flg_invoice = 'I', update_datetime = pDatetime, update_user_id = pUserId
  311.                 FROM sl_invoice B, sl_invoice_item C
  312.                 WHERE B.invoice_id = pSalesInvoiceId AND
  313.                     B.invoice_id = C.invoice_id AND
  314.                     A.ou_id = B.ou_id AND
  315.                     A.so_id = B.ref_id AND
  316.                     A.ref_doc_type_id = vDoDocTypeId AND
  317.                     A.ref_id = C.ref_id AND
  318.                     A.ref_item_id = C.ref_item_id AND
  319.                     A.do_receipt_item_id = C.do_receipt_item_id;
  320.                
  321. --              21. Update adj_regular_disc_amount, adj_promo_disc_amount, update_datetime, update_user_id, dan version di sl_so_balance_invoice
  322. --              22. update adj_regular_disc_amount, update_datetime, update_user_id dan version di sl_so_balance_invoice;
  323. --                      update adj_promo_disc_amount, update_datetime, update_user_id dan version di sl_so_balance_invoice
  324. --                      berdasarkan rounding mode non tax-nya
  325.                 SELECT f_get_value_system_config_by_param_code(pTenantId, 'rounding.mode.non.tax') INTO vRoundingModeNonTax;
  326.                
  327.                 IF vRoundingModeNonTax = 'RD' THEN
  328.    
  329.                     -- Update adj_regular_disc_amount
  330.                     WITH total_regular_disc_amount AS (
  331.                         SELECT D.add_amount, SUM(A.regular_disc_amount) AS sum_regular_disc_amount
  332.                         FROM sl_so_balance_invoice A, sl_invoice B, sl_invoice_item C, sl_invoice_cost D
  333.                         WHERE B.invoice_id = pSalesInvoiceId AND
  334.                             B.invoice_id = C.invoice_id AND
  335.                             A.ou_id = B.ou_id AND
  336.                             A.so_id = B.ref_id AND
  337.                             A.ref_doc_type_id = vDoDocTypeId AND
  338.                             A.ref_id = C.ref_id AND
  339.                             A.ref_item_id = C.ref_item_id AND
  340.                             A.do_receipt_item_id = C.do_receipt_item_id AND
  341.                             D.invoice_id = B.invoice_id AND
  342.                             D.activity_gl_id = vRegularDiscount
  343.                         GROUP BY D.add_amount
  344.                     )
  345.                     UPDATE sl_so_balance_invoice A SET adj_regular_disc_amount = 0,
  346.                         update_datetime = pDatetime, update_user_id = pUserId, version = A.version - 1
  347.                     FROM total_regular_disc_amount B
  348.                     WHERE A.invoice_id = pSalesInvoiceId AND B.sum_regular_disc_amount > 0;
  349.                    
  350.                     -- Update adj_promo_disc_amount
  351.                     WITH total_promo_disc_amount AS (
  352.                         SELECT D.add_amount, SUM(A.promo_disc_amount) AS sum_promo_disc_amount
  353.                         FROM sl_so_balance_invoice A, sl_invoice B, sl_invoice_item C, sl_invoice_cost D
  354.                         WHERE B.invoice_id = pSalesInvoiceId AND
  355.                             B.invoice_id = C.invoice_id AND
  356.                             A.ou_id = B.ou_id AND
  357.                             A.so_id = B.ref_id AND
  358.                             A.ref_doc_type_id = vDoDocTypeId AND
  359.                             A.ref_id = C.ref_id AND
  360.                             A.ref_item_id = C.ref_item_id AND
  361.                             A.do_receipt_item_id = C.do_receipt_item_id AND
  362.                             D.invoice_id = B.invoice_id AND
  363.                             D.activity_gl_id = vPromoDiscount
  364.                         GROUP BY D.add_amount
  365.                     )
  366.                     UPDATE sl_so_balance_invoice A SET adj_promo_disc_amount = 0,
  367.                         update_datetime = pDatetime, update_user_id = pUserId, version = A.version - 1
  368.                     FROM total_promo_disc_amount B
  369.                     WHERE A.invoice_id = pSalesInvoiceId AND B.sum_promo_disc_amount > 0;
  370.                
  371.                 ELSE
  372.            
  373.                     -- Update adj_regular_disc_amount
  374.                     WITH total_regular_disc_amount AS (
  375.                         SELECT D.add_amount, SUM(A.regular_disc_amount) AS sum_regular_disc_amount
  376.                         FROM sl_so_balance_invoice A, sl_invoice B, sl_invoice_item C, sl_invoice_cost D
  377.                         WHERE B.invoice_id = pSalesInvoiceId AND
  378.                             B.invoice_id = C.invoice_id AND
  379.                             A.ou_id = B.ou_id AND
  380.                             A.so_id = B.ref_id AND
  381.                             A.ref_doc_type_id = vDoDocTypeId AND
  382.                             A.ref_id = C.ref_id AND
  383.                             A.ref_item_id = C.ref_item_id AND
  384.                             A.do_receipt_item_id = C.do_receipt_item_id AND
  385.                             D.invoice_id = B.invoice_id AND
  386.                             D.activity_gl_id = vRegularDiscount
  387.                         GROUP BY D.add_amount
  388.                     )
  389.                     UPDATE sl_so_balance_invoice A SET adj_regular_disc_amount = 0,
  390.                         update_datetime = pDatetime, update_user_id = pUserId, version = A.version - 1
  391.                     FROM total_regular_disc_amount B
  392.                     WHERE A.invoice_id = pSalesInvoiceId AND B.sum_regular_disc_amount > 0;
  393.                    
  394.                     -- Update adj_promo_disc_amount
  395.                     WITH total_promo_disc_amount AS (
  396.                         SELECT D.add_amount, SUM(A.promo_disc_amount) AS sum_promo_disc_amount
  397.                         FROM sl_so_balance_invoice A, sl_invoice B, sl_invoice_item C, sl_invoice_cost D
  398.                         WHERE B.invoice_id = pSalesInvoiceId AND
  399.                             B.invoice_id = C.invoice_id AND
  400.                             A.ou_id = B.ou_id AND
  401.                             A.so_id = B.ref_id AND
  402.                             A.ref_doc_type_id = vDoDocTypeId AND
  403.                             A.ref_id = C.ref_id AND
  404.                             A.ref_item_id = C.ref_item_id AND
  405.                             A.do_receipt_item_id = C.do_receipt_item_id AND
  406.                             D.invoice_id = B.invoice_id AND
  407.                             D.activity_gl_id = vPromoDiscount
  408.                         GROUP BY D.add_amount
  409.                     )
  410.                     UPDATE sl_so_balance_invoice A SET adj_promo_disc_amount = 0,
  411.                         update_datetime = pDatetime, update_user_id = pUserId, version = A.version - 1
  412.                     FROM total_promo_disc_amount B
  413.                     WHERE A.invoice_id = pSalesInvoiceId AND B.sum_promo_disc_amount > 0;
  414.                
  415.                 END IF;
  416.                
  417.                 -- cari sisa dari hasil pembulatan adj_regular_disc_amount
  418.                 SELECT (D.add_amount * -1) - SUM(A.regular_disc_amount) - SUM(A.adj_regular_disc_amount) AS diff_adj_regular_disc_amount,
  419.                         MAX(A.item_amount) AS max_item_amount INTO vDiffAdjRegularDiscAmount, vMaxItemAmount
  420.                 FROM sl_so_balance_invoice A, sl_invoice B, sl_invoice_item C, sl_invoice_cost D
  421.                 WHERE B.invoice_id = pSalesInvoiceId AND
  422.                     B.invoice_id = C.invoice_id AND
  423.                     A.ou_id = B.ou_id AND
  424.                     A.so_id = B.ref_id AND
  425.                     A.ref_doc_type_id = vDoDocTypeId AND
  426.                     A.ref_id = C.ref_id AND
  427.                     A.ref_item_id = C.ref_item_id AND
  428.                     A.do_receipt_item_id = C.do_receipt_item_id AND
  429.                     D.invoice_id = B.invoice_id AND
  430.                     D.activity_gl_id = vRegularDiscount
  431.                 GROUP BY D.add_amount;
  432.                
  433.                 -- cari sisa dari hasil pembulatan adj_promo_disc_amount
  434.                 SELECT (D.add_amount * -1) - SUM(A.promo_disc_amount) - SUM(A.adj_promo_disc_amount) AS diff_adj_promo_disc_amount INTO vDiffAdjPromoDiscAmount
  435.                 FROM sl_so_balance_invoice A, sl_invoice B, sl_invoice_item C, sl_invoice_cost D
  436.                 WHERE B.invoice_id = pSalesInvoiceId AND
  437.                     B.invoice_id = C.invoice_id AND
  438.                     A.ou_id = B.ou_id AND
  439.                     A.so_id = B.ref_id AND
  440.                     A.ref_doc_type_id = vDoDocTypeId AND
  441.                     A.ref_id = C.ref_id AND
  442.                     A.ref_item_id = C.ref_item_id AND
  443.                     A.do_receipt_item_id = C.do_receipt_item_id AND
  444.                     D.invoice_id = B.invoice_id AND
  445.                     D.activity_gl_id = vPromoDiscount
  446.                 GROUP BY D.add_amount;
  447.                
  448.                 UPDATE sl_so_balance_invoice A SET update_datetime = pDatetime, update_user_id = pUserId, version = A.version - 1
  449.                 FROM (SELECT so_balance_invoice_id FROM sl_so_balance_invoice WHERE invoice_id = pSalesInvoiceId AND item_amount = vMaxItemAmount LIMIT 1) B
  450.                 WHERE A.so_balance_invoice_id = B.so_balance_invoice_id;
  451.                    
  452.                 UPDATE sl_so_balance_invoice_tax A SET flg_invoice = 'I', update_datetime = pDatetime, update_user_id = pUserId
  453.                 FROM sl_invoice B, sl_invoice_item C
  454.                 WHERE B.invoice_id = pSalesInvoiceId AND
  455.                     B.invoice_id = C.invoice_id AND
  456.                     A.ou_id = B.ou_id AND
  457.                     A.so_id = B.ref_id AND
  458.                     A.ref_doc_type_id = vDoDocTypeId AND
  459.                     A.ref_id = C.ref_id AND
  460.                     A.ref_item_id = C.ref_item_id AND
  461.                     A.do_receipt_item_id = C.do_receipt_item_id;
  462.                
  463. --              23. Update flg_invoice, update_datetime dan update_user_id sl_so_balance_invoice berdasarkan invoice_id-nya
  464.                 UPDATE sl_so_balance_invoice A SET flg_invoice = 'I', update_datetime = pDatetime, update_user_id = pUserId
  465.                 FROM sl_invoice B, sl_invoice_item C
  466.                 WHERE B.invoice_id = pSalesInvoiceId AND
  467.                     B.invoice_id = C.invoice_id AND
  468.                     A.ou_id = B.ou_id AND
  469.                     A.so_id = B.ref_id AND
  470.                     A.ref_doc_type_id = vDoDocTypeId AND
  471.                     A.ref_id = C.ref_id AND
  472.                     A.ref_item_id = C.ref_item_id AND
  473.                     A.do_receipt_item_id = C.do_receipt_item_id;
  474.                
  475. --              24. Update status_doc, update_datetime, update_user_id di sl_invoice berdasarkan sales invoice id-nya
  476.                 UPDATE sl_invoice SET workflow_status = 'DRAFT', status_doc = 'D', update_datetime = pDatetime, update_user_id = pUserId
  477.                 WHERE invoice_id = pSalesInvoiceId;
  478.             END IF;
  479.         ELSE
  480.             RAISE EXCEPTION 'Document is not approved yet, process aborted';
  481.         END IF;
  482.            
  483.     ELSE
  484.             RAISE EXCEPTION 'Admin Process Ledger for Sales in year month % is already closed', SUBSTR(vDocDate, 1, 6);
  485.     END IF;
  486.    
  487.    
  488.    
  489. END;   
  490. $BODY$
  491.   LANGUAGE plpgsql VOLATILE
  492.   COST 100;
  493.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement