Advertisement
Guest User

submit do

a guest
Jan 13th, 2020
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --Modified by Adrian, May 31, 2018
  2. --Menambahkan insert default flg_calculate_margin pada pu_po_balance_item_consignment_sold_manual
  3.  
  4. CREATE OR REPLACE FUNCTION sl_submit_do(bigint, character varying, character varying)
  5.   RETURNS void AS
  6. $BODY$
  7. DECLARE
  8.     pTenantId           ALIAS FOR $1;
  9.     pSessionId          ALIAS FOR $2;
  10.     pProcessNo          ALIAS FOR $3;
  11.  
  12.     vProcessId                  bigint;
  13.     vDoId                       bigint;
  14.     vUserId                     bigint;
  15.     vDatetime                   character varying(14);
  16.     vFlagInvoice                character varying(1);
  17.     vEmptyId                    bigint;
  18.     vStatusRelease              character varying(1);
  19.     vStatusDraft                character varying(1);  
  20.     vStatusFinal                character varying(1);
  21.     vEmptyValue                 character varying(1);
  22.     vProductStatus              character varying(5);
  23.     vSignDebit                  character varying(1);
  24.     vSignCredit                 character varying(1);
  25.     vTypeRate                   character varying(3);
  26.     vProductCOA                 character varying(10);
  27.     vSystemCOA                  character varying(10);
  28.     vPartnerIdKonsinyasiManual  bigint;
  29.     vSoId                       bigint;
  30.     vUnfinishedItem             bigint;
  31.     vParentOuId                 bigint;
  32.     vJournalTrxId               bigint;    
  33.     vJournalType                character varying(20)
  34.    
  35.     vDocJournal                 DOC_JOURNAL%ROWTYPE;
  36.     vOuStructure                OU_BU_STRUCTURE%ROWTYPE;
  37.     result                      RECORD;
  38.    
  39.     vDeliveryOrderDocTypeId     bigint;
  40.     vSalesOrderDocTypeId        bigint;
  41.     vRoundingModeNonTax         character varying(5);
  42.    
  43.     vFlgCalculateMargin         character varying(2);
  44.    
  45. BEGIN
  46.    
  47.     vFlagInvoice := 'N';
  48.     vEmptyId := -99;
  49.     vStatusRelease := 'R';
  50.     vStatusDraft := 'D';   
  51.     vStatusFinal := 'F';
  52.     vEmptyValue := ' ';
  53.     vProductStatus := 'GOOD';
  54.     vSignDebit := 'D';
  55.     vSignCredit := 'C';
  56.     vTypeRate := 'COM';
  57.     vProductCOA := 'PRODUCT';
  58.     vSystemCOA := 'SYSTEM';
  59.     vUnfinishedItem := 0;
  60.    
  61.     vDeliveryOrderDocTypeId = 311;
  62.     vSalesOrderDocTypeId = 301;
  63.  
  64.     vFlgCalculateMargin := 'SP';
  65.    
  66.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'rounding.mode.non.tax') INTO vRoundingModeNonTax;
  67.    
  68.    
  69.     SELECT A.process_message_id INTO vProcessId
  70.     FROM t_process_message A
  71.     WHERE A.tenant_id = pTenantId AND
  72.         A.process_name = 'sl_submit_do' AND
  73.         A.process_no = pProcessNo;
  74.        
  75.     SELECT CAST(A.process_parameter_value AS bigint) INTO vDoId
  76.     FROM t_process_parameter A
  77.     WHERE A.process_message_id = vProcessId AND
  78.         A.process_parameter_key = 'doId';
  79.    
  80.     SELECT CAST(A.process_parameter_value AS bigint) INTO vUserId
  81.     FROM t_process_parameter A
  82.     WHERE A.process_message_id = vProcessId AND
  83.         A.process_parameter_key = 'userId';
  84.  
  85.     SELECT CAST(A.process_parameter_value AS character varying(14)) INTO vDatetime
  86.     FROM t_process_parameter A
  87.     WHERE A.process_message_id = vProcessId AND
  88.         A.process_parameter_key = 'datetime';
  89.  
  90.     DELETE FROM tt_journal_trx_item WHERE session_id = pSessionId; 
  91. /*
  92.  * 1. update status doc sl_do
  93.  * 2. add sl_log_so_balance_item
  94.  * 3. add sl_so_balance_invoice
  95.  * 4. add sl_so_balance_invoice_tax
  96.  * 5. add in_log_product_balance_stock
  97.  * 6. add in_balance_do_item
  98.  * 7. update status sl_so_balance_item
  99.  * 8. update status sl_so. Jika seluruh balance item sudah final/cancel, maka status menjadi Final.
  100.  * 9. add gl_journal_trx
  101.  * 10. add gl_journal_trx_item
  102.  * 11. add gl_journal_trx_mapping
  103.  *
  104.  */
  105.  
  106.     SELECT A.ref_id, f_get_ou_bu_structure(A.ou_id) AS ou, f_get_document_journal(A.doc_type_id) as doc
  107.     FROM sl_do A
  108.     WHERE A.do_id = vDoId INTO result;
  109.    
  110.     vSoId := result.ref_id;
  111.     vOuStructure := result.ou;
  112.     vDocJournal := result.doc;
  113.    
  114.     UPDATE sl_do SET status_doc = vStatusRelease, version = version + 1, update_datetime = vDatetime, update_user_id = vUserId
  115.     WHERE do_id = vDoId;
  116.    
  117.     INSERT INTO sl_log_so_balance_item
  118.     (tenant_id, so_id, so_item_id, ref_doc_type_id, ref_id, ref_item_id,
  119.      qty_trx, trx_uom_id, qty_int, base_uom_id, remark,
  120.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  121.     SELECT A.tenant_id, C.so_id, C.so_item_id, A.doc_type_id, A.do_id, B.do_item_id,
  122.         B.qty_dlv_so * -1, B.so_uom_id, B.qty_dlv_int  *-1, B.base_uom_id, B.remark,
  123.         0, vDatetime, vUserId, vDatetime, vUserId
  124.     FROM sl_do A, sl_do_item B, sl_so_item C
  125.     WHERE A.do_id = vDoId AND
  126.           A.do_id = B.do_id AND
  127.           B.ref_id = C.so_item_id;
  128.          
  129.     INSERT INTO sl_so_balance_invoice
  130.     (tenant_id, ou_id, partner_id, so_id,
  131.     ref_doc_type_id, ref_id, ref_doc_no, ref_doc_date, ref_item_id, qty_dlv_so, so_uom_id,
  132.     curr_code, price_so, item_amount, flg_invoice, invoice_id,
  133.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  134.     SELECT A.tenant_id, A.ou_id, D.partner_bill_to_id, A.ref_id,
  135.         A.doc_type_id, A.do_id, A.doc_no, A.doc_date, B.do_item_id, B.qty_dlv_so, B.so_uom_id,
  136.         C.curr_code, C.nett_sell_price,
  137.         f_get_amount_before_tax(B.qty_dlv_so * (C.gross_sell_price - C.discount_amount), C.flg_tax_amount, C.tax_percentage, f_get_digit_decimal_doc_curr(vDeliveryOrderDocTypeId, C.curr_code), vRoundingModeNonTax),
  138.         vFlagInvoice, vEmptyId,
  139.         0, vDatetime, vUserId, vDatetime, vUserId
  140.     FROM sl_do A, sl_do_item B, sl_so_item C, sl_so D
  141.     WHERE A.do_id = vDoId AND
  142.           A.do_id = B.do_id AND
  143.           B.ref_id = C.so_item_id AND
  144.           C.so_id = D.so_id;
  145.        
  146.     INSERT INTO sl_so_balance_invoice_tax
  147.     (tenant_id, ou_id, partner_id, so_id,
  148.     ref_doc_type_id, ref_id, ref_item_id, tax_id, flg_amount,
  149.     tax_percentage, curr_code, base_amount, tax_amount, flg_invoice, invoice_id,
  150.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  151.     SELECT A.tenant_id, A.ou_id, E.partner_bill_to_id, A.ref_id,
  152.         A.doc_type_id, A.do_id, B.do_item_id, C.tax_id, D.flg_amount,
  153.         C.tax_percentage, C.curr_code,
  154.         f_get_amount_before_tax(B.qty_dlv_so * (C.gross_sell_price - C.discount_amount), C.flg_tax_amount, C.tax_percentage, f_get_digit_decimal_doc_curr(vDeliveryOrderDocTypeId, C.curr_code), vRoundingModeNonTax),
  155.         f_tax_rounding(A.tenant_id, f_get_amount_before_tax(B.qty_dlv_so * (C.gross_sell_price - C.discount_amount), C.flg_tax_amount, C.tax_percentage, f_get_digit_decimal_doc_curr(vDeliveryOrderDocTypeId, C.curr_code), vRoundingModeNonTax), C.tax_percentage), vFlagInvoice, vEmptyId,
  156.         0, vDatetime, vUserId, vDatetime, vUserId
  157.     FROM sl_do A, sl_do_item B, sl_so_item C, m_tax D, sl_so E
  158.     WHERE A.do_id = vDoId AND
  159.           A.do_id = B.do_id AND
  160.           B.ref_id = C.so_item_id AND
  161.           C.tax_id = D.tax_id AND
  162.           C.so_id = E.so_id;
  163.          
  164.     /*
  165.      * buat data log product balance stock
  166.      * ref item id = do_product_id
  167.      * NK, 14 Feb 2015
  168.      * untuk product yang tidak beli dengan cara konsinyasi
  169.      */      
  170.     INSERT INTO in_log_product_balance_stock
  171.     (tenant_id, ou_id, doc_type_id, ref_id, doc_no, doc_date, partner_id,
  172.      product_id, product_balance_id, warehouse_id, product_status, base_uom_id, qty,
  173.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  174.     SELECT A.tenant_id, A.ou_id, A.doc_type_id, A.do_id, A.doc_no, A.doc_date, A.partner_ship_to_id,
  175.         C.product_id, C.product_balance_id, A.warehouse_id, C.product_status, C.base_uom_id, SUM(C.qty_dlv_int) * -1,
  176.         0, vDatetime, vUserId, vDatetime, vUserId      
  177.     FROM sl_do A, sl_do_item B, sl_do_product C, m_product D, m_product_custom E
  178.     WHERE A.do_id = vDoId AND
  179.         A.do_id = B.do_id AND
  180.         B.do_item_id = C.do_item_id AND
  181.         C.product_id = D.product_id AND
  182.         D.product_id = E.product_id AND
  183.         E.flg_buy_konsinyasi='N'
  184.     GROUP BY A.tenant_id, A.ou_id, A.doc_type_id, A.do_id, A.doc_no, A.doc_date, A.partner_ship_to_id,
  185.             C.product_id, C.product_balance_id, A.warehouse_id, C.product_status, C.base_uom_id;
  186.  
  187.     /*
  188.      * buat data log product consignment balance stock
  189.      * ref item id = do_product_id
  190.      * NK, 14 Feb 2015
  191.      * untuk product yang beli dengan cara konsinyasi
  192.      */      
  193.     INSERT INTO in_log_product_consignment_balance_stock
  194.     (tenant_id, ou_id, doc_type_id, ref_id, doc_no, doc_date, partner_id,
  195.      product_id, product_balance_id, warehouse_id, product_status, base_uom_id, qty,
  196.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  197.     SELECT A.tenant_id, A.ou_id, A.doc_type_id, A.do_id, A.doc_no, A.doc_date, A.partner_ship_to_id,
  198.         C.product_id, C.product_balance_id, A.warehouse_id, C.product_status, C.base_uom_id, SUM(C.qty_dlv_int) * -1,
  199.         0, vDatetime, vUserId, vDatetime, vUserId      
  200.     FROM sl_do A, sl_do_item B, sl_do_product C, m_product D, m_product_custom E
  201.     WHERE A.do_id = vDoId AND
  202.         A.do_id = B.do_id AND
  203.         B.do_item_id = C.do_item_id AND
  204.         C.product_id = D.product_id AND
  205.         D.product_id = E.product_id AND
  206.         E.flg_buy_konsinyasi = 'Y'
  207.     GROUP BY A.tenant_id, A.ou_id, A.doc_type_id, A.do_id, A.doc_no, A.doc_date, A.partner_ship_to_id,
  208.             C.product_id, C.product_balance_id, A.warehouse_id, C.product_status, C.base_uom_id;
  209.  
  210.     /*
  211.      * add data balance do item yang akan digunakan di inventory untuk pembuatan return note,
  212.      * saat akan membuat return note
  213.      */
  214.     INSERT INTO in_balance_do_item
  215.     (do_item_id, tenant_id, ou_id, do_id, doc_no, doc_date, partner_id,
  216.       so_id, so_no, so_date, so_item_id,
  217.       qty_dlv, qty_return, so_uom_id, qty_dlv_int, 
  218.       qty_return_int, base_uom_id, status_item,
  219.       "version", create_datetime, create_user_id, update_datetime, update_user_id)
  220.     SELECT B.do_item_id, A.tenant_id, A.ou_id, A.do_id, A.doc_no, A.doc_date, A.partner_ship_to_id,
  221.             A.ref_id, C.doc_no, C.doc_date, B.ref_id,
  222.             SUM(B.qty_dlv_so), 0, B.so_uom_id, SUM(B.qty_dlv_int),
  223.             0, B.base_uom_id, vStatusRelease,
  224.         0, vDatetime, vUserId, vDatetime, vUserId      
  225.     FROM sl_do A, sl_do_item B, sl_so C
  226.     WHERE A.do_id = vDoId AND
  227.         A.do_id = B.do_id AND
  228.         A.ref_id = C.so_id
  229.     GROUP BY B.do_item_id, A.tenant_id, A.ou_id, A.do_id, A.doc_no, A.doc_date, A.partner_ship_to_id,
  230.         A.ref_id, C.doc_no, C.doc_date, B.ref_id, B.so_uom_id, B.base_uom_id;
  231.    
  232.     UPDATE sl_so_balance_item SET status_item = vStatusRelease, update_datetime = vDatetime, update_user_id = vUserId
  233.     FROM sl_do_item A
  234.     WHERE sl_so_balance_item.so_item_id = A.ref_id AND
  235.         sl_so_balance_item.tenant_id = A.tenant_id AND
  236.         A.do_id = vDoId AND
  237.         sl_so_balance_item.qty_so - sl_so_balance_item.qty_cancel + sl_so_balance_item.qty_add - sl_so_balance_item.qty_dlv > 0;
  238.  
  239.     UPDATE sl_so_balance_item SET status_item = vStatusFinal, update_datetime = vDatetime, update_user_id = vUserId
  240.     FROM sl_do_item A
  241.     WHERE sl_so_balance_item.so_item_id = A.ref_id AND
  242.         sl_so_balance_item.tenant_id = A.tenant_id AND
  243.         A.do_id = vDoId AND
  244.         sl_so_balance_item.qty_so - sl_so_balance_item.qty_cancel + sl_so_balance_item.qty_add - sl_so_balance_item.qty_dlv <= 0;
  245.        
  246.     /*
  247.      * Lakukan update qty product balance stock reserved.
  248.      */
  249.     UPDATE in_product_balance_stock_reserved Z
  250.         SET qty = Z.qty - B.qty_dlv_int, qty_original = Z.qty_original-B.qty_dlv_int, version = Z.version+1, update_datetime = vDatetime, update_user_id = vUserId
  251.     FROM sl_do A
  252.     INNER JOIN sl_do_item B ON A.do_id = B.do_id
  253.     INNER JOIN sl_so C ON A.ref_id = C.so_id
  254.         AND A.ref_doc_type_id = C.doc_type_id
  255.     INNER JOIN sl_so_item E ON B.ref_id = E.so_item_id
  256.             AND C.so_id = E.so_id
  257.             AND B.product_id = E.product_id
  258.     WHERE A.do_id = vDoId
  259.             AND Z.ref_doc_id = C.so_id
  260.             AND Z.ref_doc_type_id = C.doc_type_id
  261.             AND Z.ref_doc_item_id = E.so_item_id;      
  262.     /*
  263.      * Delete jika qty product balance stock reserved sudah full dibuatkan DO.
  264.      */
  265.     DELETE
  266.     FROM in_product_balance_stock_reserved Z
  267.     WHERE EXISTS (
  268.         SELECT 1
  269.         FROM sl_do A
  270.         INNER JOIN sl_do_item B ON A.do_id = B.do_id
  271.         INNER JOIN sl_so C ON A.ref_id = C.so_id
  272.             AND A.ref_doc_type_id = C.doc_type_id
  273.         INNER JOIN sl_so_item E ON B.ref_id = E.so_item_id
  274.             AND C.so_id = E.so_id
  275.             AND B.product_id = E.product_id
  276.         WHERE A.do_id = vDoId
  277.             AND Z.ref_doc_id = C.so_id
  278.             AND Z.ref_doc_type_id = C.doc_type_id
  279.             AND Z.ref_doc_item_id = E.so_item_id
  280.             AND Z.qty <= 0);   
  281.    
  282.     SELECT COUNT(1) INTO vUnfinishedItem
  283.     FROM sl_so_balance_item A, sl_so_item B
  284.     WHERE A.so_item_id = B.so_item_id AND
  285.         B.so_id = vSoId AND
  286.         A.status_item = vStatusRelease;
  287.        
  288.     IF vUnfinishedItem = 0 THEN
  289.         UPDATE sl_so SET status_doc = vStatusFinal
  290.         WHERE so_id = vSoId;
  291.     END IF;
  292.        
  293.     /*
  294.      * NK, 15 Feb 2015
  295.      * mencari data po yang masih release, untuk sebagai catatan ke supplier berapa jumlah barang yang dijual
  296.      */
  297.     /*
  298.      * NK, 16 Feb 2015
  299.      * diubah cara ambil data, karena saat submit so sudah membuat data pu_po_balance_item_consignment_sold
  300.     INSERT INTO tt_do_po_item_consignment
  301.     (session_id, doc_type_id, do_id, do_item_id,
  302.     po_id, po_item_id, remark,
  303.      qty_po, qty_sell, po_uom_id,  
  304.      qty_int_po, qty_int_sell, base_uom_id)
  305.     SELECT pSessionId, A.doc_type_id, A.do_id, B.do_item_id,
  306.         E.po_id, F.po_item_id, B.remark,
  307.         F.qty_po, B.qty_dlv_int * F.qty_po / F.qty_int_po, F.po_uom_id,
  308.         F.qty_int_po, B.qty_dlv_int, F.base_uom_id 
  309.     FROM sl_do A, sl_do_item B, m_product C, m_product_custom D, pu_po_item E, pu_po_balance_item_consignment F
  310.     WHERE A.do_id = vDoId AND
  311.         A.do_id = B.do_id AND
  312.         B.product_id = C.product_id AND
  313.         C.product_id = D.product_id AND
  314.         D.flg_buy_konsinyasi = 'Y' AND
  315.         B.product_id = E.product_id AND
  316.         E.po_item_id = F.po_item_id AND
  317.         F.status_item = vStatusRelease;
  318.      */
  319.    
  320.     INSERT INTO tt_do_po_item_consignment
  321.     (session_id, doc_type_id, do_id, do_item_id,
  322.      po_id, po_item_id, remark,
  323.      qty_po, qty_sell, po_uom_id,  
  324.      qty_int_po, qty_int_sell, base_uom_id)
  325.     SELECT pSessionId, A.doc_type_id, A.do_id, B.do_item_id,
  326.         C.po_id, C.po_item_id, B.remark,
  327.         D.qty_po, B.qty_dlv_int * D.qty_po / D.qty_int_po, D.po_uom_id,
  328.         D.qty_int_po, B.qty_dlv_int, D.base_uom_id         
  329.     FROM sl_do A, sl_do_item B, pu_po_balance_item_consignment_sold C, pu_po_balance_item_consignment D
  330.     WHERE A.do_id = vDoId AND
  331.         A.do_id = B.do_id AND
  332.         A.ref_id = C.so_id AND
  333.         B.ref_id = C.so_item_id AND
  334.         C.po_item_id = D.po_item_id;
  335.                
  336.     UPDATE pu_po_balance_item_consignment B SET  
  337.            qty_int_sell = B.qty_int_sell + A.qty_int_sell, qty_sell = B.qty_sell + A.qty_sell,
  338.            version = B.version + 1, update_datetime = vDatetime, update_user_id = vUserId
  339.     FROM tt_do_po_item_consignment A
  340.     WHERE A.session_id = pSessionId AND
  341.         B.po_item_id = A.po_item_id;
  342.        
  343. --  UPDATE pu_po_balance_item_consignment B SET  
  344. --         update_datetime = vDatetime, update_user_id = vUserId
  345. --  FROM tt_do_po_item_consignment A
  346. --  WHERE A.session_id = pSessionId AND
  347. --      B.po_item_id = A.po_item_id AND
  348. --      B.qty_rcv - B.qty_sell <= 0;
  349.        
  350.     INSERT INTO pu_log_po_balance_item_consignment
  351.     (tenant_id, po_id, po_item_id, ref_doc_type_id, ref_id, ref_item_id,
  352.      qty_trx, trx_uom_id, qty_int, base_uom_id, remark,
  353.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  354.     SELECT pTenantId, A.po_id, A.po_item_id, A.doc_type_id, A.do_id, A.do_item_id,
  355.         A.qty_sell, A.po_uom_id, A.qty_int_sell, A.base_uom_id, A.remark,
  356.         0, vDatetime, vUserId, vDatetime, vUserId
  357.     FROM tt_do_po_item_consignment A
  358.     WHERE A.session_id = pSessionId;
  359.    
  360.     /*
  361.      * membuat data transaksi jurnal :
  362.      * 1. buat admin
  363.      * 2. buat temlate jurnal
  364.      */
  365.  
  366.     PERFORM gl_manage_admin_journal_trx(A.tenant_id, (vOuStructure).ou_bu_id, A.ou_id, (vDocJournal).journal_type, (vDocJournal).ledger_code, f_get_year_month_date(A.doc_date), 'MONTHLY', vDatetime, vUserId)
  367.     FROM sl_do A
  368.     WHERE A.do_id = vDoId;
  369.    
  370.     SELECT NEXTVAL('gl_journal_trx_seq') INTO vJournalTrxId;
  371.    
  372.     INSERT INTO gl_journal_trx
  373.     (journal_trx_id, tenant_id, journal_type, doc_type_id, doc_id, doc_no, doc_date,
  374.     ou_bu_id, ou_branch_id, ou_sub_bu_id, partner_id, cashbank_id, warehouse_id, ext_doc_no, ext_doc_date,  
  375.     ref_doc_type_id, ref_id, due_date, curr_code, remark, status_doc, workflow_status,
  376.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  377.     SELECT vJournalTrxId, A.tenant_id, (vDocJournal).journal_type, A.doc_type_id, A.do_id, A.doc_no, A.doc_date,
  378.         (vOuStructure).ou_bu_id, (vOuStructure).ou_branch_id, (vOuStructure).ou_sub_bu_id, A.partner_ship_to_id, vEmptyId, A.warehouse_id, A.ext_doc_no, A.ext_doc_date,
  379.         A.ref_doc_type_id, A.ref_id, A.doc_date, B.curr_code, A.remark, vStatusDraft, 'DRAFT',
  380.         0, vDatetime, vUserId, vDatetime, vUserId
  381.     FROM sl_do A, sl_so B
  382.     WHERE A.do_id = vDoId AND
  383.         A.ref_doc_type_id = B.doc_type_id AND
  384.         A.ref_id = B.so_id;
  385.    
  386.     INSERT INTO tt_journal_trx_item
  387.     (session_id, tenant_id, journal_trx_id, line_no,
  388.     ref_doc_type_id, ref_id,
  389.     partner_id, product_id, cashbank_id, ou_rc_id,
  390.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  391.     coa_id, curr_code, qty, uom_id,
  392.     amount, journal_date, type_rate,
  393.     numerator_rate, denominator_rate, journal_desc, remark)
  394.     SELECT pSessionId, A.tenant_id, vJournalTrxId, 1,
  395.         A.doc_type_id, B.do_item_id,
  396.         A.partner_ship_to_id, B.product_id, vEmptyId, vEmptyId,
  397.         vEmptyId, vSignCredit, vProductCOA, vEmptyId,
  398.         f_get_product_coa_group_product(A.tenant_id, B.product_id), f_get_value_system_config_by_param_code(pTenantId, 'ValutaBuku'), B.qty_dlv_int, B.base_uom_id,
  399.         0, A.doc_date, vTypeRate,
  400.         1, 1, 'PRODUCT_STOCK', B.remark
  401.     FROM sl_do A, sl_do_item B, sl_so_item C
  402.     WHERE A.do_id = vDoId AND
  403.         A.do_id = B.do_id AND
  404.         B.ref_id = C.so_item_id;
  405.        
  406.     INSERT INTO gl_journal_trx_item
  407.     (tenant_id, journal_trx_id, line_no,
  408.     ref_doc_type_id, ref_id,
  409.     partner_id, product_id, cashbank_id, ou_rc_id,
  410.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  411.     coa_id, curr_code, qty, uom_id,
  412.     amount, journal_date, type_rate,
  413.     numerator_rate, denominator_rate, journal_desc, remark,
  414.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  415.     SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id),
  416.         A.ref_doc_type_id, A.ref_id,
  417.         A.partner_id, A.product_id, A.cashbank_id, A.ou_rc_id,
  418.         A.segmen_id, A.sign_journal, A.flg_source_coa, A.activity_gl_id,
  419.         A.coa_id, A.curr_code, A.qty, A.uom_id,
  420.         A.amount, A.journal_date, A.type_rate,
  421.         A.numerator_rate, A.denominator_rate, A.journal_desc, A.remark,
  422.         0, vDatetime, vUserId, vDatetime, vUserId
  423.     FROM tt_journal_trx_item A
  424.     WHERE A.session_id = pSessionId;
  425.    
  426.     INSERT INTO gl_journal_trx_mapping
  427.     (tenant_id, journal_trx_id, line_no,
  428.     ref_doc_type_id, ref_id,
  429.     partner_id, product_id, cashbank_id, ou_rc_id,
  430.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  431.     coa_id, curr_code, qty, uom_id,
  432.     amount, journal_date, type_rate,
  433.     numerator_rate, denominator_rate, journal_desc, remark,
  434.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  435.     SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id ),
  436.         vEmptyId, vEmptyId,
  437.         vEmptyId, vEmptyId, vEmptyId, vEmptyId,
  438.         vEmptyId, vSignDebit, vSystemCOA, vEmptyId,
  439.         f_get_system_coa_by_group_coa(A.tenant_id, 'HargaPokokPenjualan'), f_get_value_system_config_by_param_code(pTenantId, 'ValutaBuku'), 0, vEmptyId,
  440.         0, A.journal_date, A.type_rate,
  441.         1, 1, 'COGS', vEmptyValue,
  442.         0, vDatetime, vUserId, vDatetime, vUserId
  443.     FROM tt_journal_trx_item A
  444.     WHERE A.session_id = pSessionId
  445.     GROUP BY A.tenant_id, A.journal_trx_id, A.journal_date, A.type_rate;
  446.    
  447.    
  448.     -- insert ke pu_po_balance_item_consignment_sold
  449.     INSERT INTO tt_pu_po_balance_item_consignment_sold(
  450.             session_id, tenant_id, po_id, po_item_id, so_id, so_item_id,
  451.             normal_price, sold_price, discount, margin_internal, margin_supp,
  452.             sold_price_after_margin, qty_so, qty_return)
  453.     SELECT pSessionId, pTenantId, B.po_id, B.po_item_id, C.so_id, C.so_item_id,
  454.       B.gross_price_po, C.gross_sell_price,
  455.       0 as discount,
  456.       0 as margin_internal,
  457.       0 as margin_supp,
  458.       0 as sold_price_after_margin,
  459.       C.qty_so,
  460.       0 as qty_return
  461.       FROM pu_po_balance_item_consignment A
  462.       JOIN pu_po_item B ON  A.po_item_id = B.po_item_id AND A.status_item IN ('R', 'I')
  463.       JOIN pu_po G ON G.po_id = B.po_id
  464.       RIGHT JOIN sl_so_item C ON C.product_id = B.product_id
  465.       JOIN m_product_custom E ON C.product_id = E.product_id
  466.       JOIN m_product F ON F.product_id=C.product_id
  467.       RIGHT JOIN sl_so D ON C.so_id=D.so_id
  468.       WHERE
  469.       C.so_id = vSoId AND
  470.       E.flg_buy_konsinyasi = 'Y' AND
  471.       B.gross_price_po IS NULL;
  472.    
  473.     IF EXISTS ( SELECT 1 FROM tt_pu_po_balance_item_consignment_sold WHERE session_id = pSessionId AND tenant_id = pTenantId AND so_id = vSoId ) THEN
  474.                 DELETE FROM tt_pu_po_balance_item_consignment_sold  WHERE session_id = pSessionId AND tenant_id = pTenantId AND so_id = vSoId;
  475.  
  476.         RAISE EXCEPTION 'Order Magento % cannot be processed ', vSoNo
  477.         USING HINT = 'There is sold product with no purchase data';
  478.     ELSE
  479.                 DELETE FROM tt_pu_po_balance_item_consignment_sold  WHERE session_id = pSessionId AND tenant_id = pTenantId AND so_id = vSoId;
  480.        
  481.     END IF;
  482.    
  483.         INSERT INTO tt_pu_po_balance_item_consignment_sold(
  484.             session_id, tenant_id, supplier_id, po_id, po_item_id, so_id, so_item_id,
  485.             normal_price, sold_price, discount, margin_internal, margin_supp,
  486.             sold_price_after_margin, qty_so, qty_return, remark, do_id, do_item_id)
  487.     SELECT pSessionId, pTenantId, G.partner_id, B.po_id, B.po_item_id, C.so_id, C.so_item_id,
  488.       B.gross_price_po, C.gross_sell_price,
  489.       0 as discount,
  490.       0 as margin_internal,
  491.       0 as margin_supp,
  492.       0 as sold_price_after_margin,
  493.       C.qty_so,
  494.       0 as qty_return,
  495.       '' as remark,
  496.       H.do_id,
  497.       H.do_item_id
  498.       FROM pu_po_balance_item_consignment A
  499.       JOIN pu_po_item B ON  A.po_item_id = B.po_item_id AND A.status_item IN ('R', 'I')
  500.       JOIN pu_po G ON G.po_id = B.po_id
  501.       JOIN sl_so_item C ON C.product_id = B.product_id
  502.       JOIN m_product_custom E ON C.product_id = E.product_id
  503.       JOIN m_product F ON F.product_id=C.product_id
  504.       JOIN sl_so D ON C.so_id=D.so_id
  505.       JOIN sl_do_item H ON H.ref_id = C.so_item_id AND H.do_id = vDoId
  506.       WHERE
  507.       C.so_id = vSoId AND
  508.       E.flg_buy_konsinyasi = 'Y' AND B.gross_price_po IS NOT NULL;
  509.    
  510.  
  511.         UPDATE tt_pu_po_balance_item_consignment_sold
  512.     SET discount = ((normal_price-sold_price)/normal_price)*100
  513.     WHERE session_id = pSessionId AND tenant_id = pTenantId AND so_id = vSoId;
  514.  
  515.         UPDATE tt_pu_po_balance_item_consignment_sold W SET
  516.       margin_internal = Z.internal_percentage,
  517.       margin_supp = Z.supplier_percentage
  518.     FROM
  519.     (select B.session_id, B.tenant_id, B.po_id, B.po_item_id, B.so_item_id, A.internal_percentage, A.supplier_percentage
  520.     from pr_m_margin_sell_price A JOIN tt_pu_po_balance_item_consignment_sold B ON A.partner_id = B.supplier_id
  521.     WHERE discount BETWEEN disc_from AND disc_to ) Z
  522.     WHERE
  523.     W.session_id = Z.session_id
  524.     AND W.tenant_id = Z.tenant_id
  525.     AND W.po_id = Z.po_id
  526.     AND W.po_item_id = Z.po_item_id
  527.     AND W.so_item_id = Z.so_item_id;
  528.  
  529.     UPDATE tt_pu_po_balance_item_consignment_sold SET
  530.       remark = 'MARGIN NOT SET UP'
  531.     WHERE session_id = pSessionId
  532.     AND tenant_id = pTenantId
  533.     AND margin_internal=0
  534.     AND margin_supp=0;
  535.      
  536.  
  537.         UPDATE tt_pu_po_balance_item_consignment_sold SET sold_price_after_margin = margin_supp * 0.01 * sold_price
  538.     WHERE session_id = pSessionId AND tenant_id = pTenantId;
  539.    
  540.     --Cek Partner Id ke Master Partner Konsinyasi Manual
  541.    
  542.     SELECT partner_id INTO vPartnerIdKonsinyasiManual
  543.     FROM sl_so A
  544.     INNER JOIN sl_do b ON a.so_id = b.ref_id
  545.     WHERE b.ref_doc_type_id = vSalesOrderDocTypeId AND b.ref_id = vSoId;
  546.    
  547.     IF EXISTS ( SELECT 1 FROM m_partner_konsinyasi_manual WHERE partner_id = vPartnerIdKonsinyasiManual AND active <> 'N') AND
  548.         EXISTS (SELECT 1 FROM sl_so_ext WHERE so_id = vSoId AND flg_manual_consignment = 'Y') THEN
  549.        
  550.         INSERT INTO pu_po_balance_item_consignment_sold_manual(
  551.             tenant_id, supplier_id, po_id, po_item_id, so_id, so_item_id,
  552.             normal_price, normal_price_correction, sold_price, sold_price_used, discount, margin_internal, margin_supp, margin_supp_correction,
  553.             sold_price_after_margin, qty_so, qty_return, version, create_datetime, create_user_id, update_datetime, update_user_id, remark,
  554.             do_id, do_item_id,
  555.             flg_calculate_margin)
  556.         SELECT tenant_id, supplier_id, po_id, po_item_id, so_id, so_item_id,
  557.         normal_price, normal_price, sold_price, sold_price, discount, margin_internal, margin_supp, margin_supp,
  558.         sold_price_after_margin, qty_so, qty_return, 0, vDatetime, vUserId, vDatetime, vUserId, remark, do_id, do_item_id,
  559.         vFlgCalculateMargin
  560.         FROM tt_pu_po_balance_item_consignment_sold
  561.         WHERE session_id = pSessionId AND tenant_id = pTenantId;
  562.        
  563.     ELSE
  564.           INSERT INTO pu_po_balance_item_consignment_sold(
  565.             tenant_id, supplier_id, po_id, po_item_id, so_id, so_item_id,
  566.             normal_price, normal_price_correction, sold_price, sold_price_used, discount, margin_internal, margin_supp, margin_supp_correction,
  567.             sold_price_after_margin, qty_so, qty_return, version, create_datetime, create_user_id, update_datetime, update_user_id, remark)
  568.         SELECT tenant_id, supplier_id, po_id, po_item_id, so_id, so_item_id,
  569.         normal_price, normal_price, sold_price, sold_price, discount, margin_internal, margin_supp, margin_supp,
  570.         sold_price_after_margin, qty_so, qty_return, 0, vDatetime, vUserId, vDatetime, vUserId, remark
  571.         FROM tt_pu_po_balance_item_consignment_sold
  572.         WHERE session_id = pSessionId AND tenant_id = pTenantId;
  573.  
  574.     END IF;
  575.    
  576.    
  577.      
  578.     DELETE FROM tt_pu_po_balance_item_consignment_sold WHERE session_id = pSessionId AND tenant_id = pTenantId;
  579.        
  580.     DELETE FROM tt_journal_trx_item WHERE session_id = pSessionId; 
  581. END;   
  582. $BODY$
  583.   LANGUAGE plpgsql VOLATILE
  584.   COST 100;
  585.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement