Advertisement
samuel025

Function Manage SO Item

Mar 30th, 2022
961
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION sl_submit_modify_item_so(bigint, character varying, character varying)
  2.   RETURNS void AS
  3. $BODY$
  4. DECLARE
  5.     pTenantId           ALIAS FOR $1;
  6.     pSessionId          ALIAS FOR $2;
  7.     pProcessNo          ALIAS FOR $3;
  8.  
  9.     vProcessId              bigint;
  10.     vSoId                   bigint;
  11.     vManageSoId             bigint;
  12.     vUserId                 bigint;
  13.     vEmptyId                bigint;
  14.     vUnfinishedItem         bigint;
  15.     vManageSoItemDocTypeId  bigint;
  16.     vDeliveryOrderDocTypeId bigint;
  17.     vDoReceiptDocTypeId     bigint;
  18.     vNol                    bigint;
  19.     vSoStatusDoc            character varying(5);
  20.     vRoundingModeNonTax     character varying(5);
  21.     vDatetime               character varying(14);
  22.     vStatusRelease          character varying(1);
  23.     vStatusCancel           character varying(1);
  24.     vStatusFinal            character varying(1);
  25.     vStatusDraft            character varying(1);
  26.     vFlagNo                 character varying(1);
  27.     vFlagYes                character varying(1);
  28.     vFlagInvoice            character varying(1);
  29. BEGIN
  30.    
  31.     vStatusRelease  := 'R';
  32.     vStatusCancel   := 'C';
  33.     vFlagNo         := 'N';
  34.     vFlagYes        := 'Y';
  35.     vEmptyId        := -99;
  36.     vManageSoItemDocTypeId := 305;
  37.     vUnfinishedItem := 0;
  38.     vNol            := 0;
  39.     vStatusDraft    := 'D';
  40.     vStatusFinal    := 'F';
  41.     vDeliveryOrderDocTypeId := 311;
  42.     vDoReceiptDocTypeId := 525;
  43.     vFlagInvoice := 'N';
  44.    
  45.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'rounding.mode.non.tax') INTO vRoundingModeNonTax;
  46.    
  47.     SELECT A.process_message_id INTO vProcessId
  48.     FROM t_process_message A
  49.     WHERE A.tenant_id = pTenantId AND
  50.         A.process_name = 'sl_submit_modify_item_so' AND
  51.         A.process_no = pProcessNo;
  52.        
  53.     SELECT CAST(A.process_parameter_value AS bigint) INTO vManageSoId
  54.     FROM t_process_parameter A
  55.     WHERE A.process_message_id = vProcessId AND
  56.         A.process_parameter_key = 'modItemSoId';
  57.    
  58.     SELECT CAST(A.process_parameter_value AS bigint) INTO vUserId
  59.     FROM t_process_parameter A
  60.     WHERE A.process_message_id = vProcessId AND
  61.         A.process_parameter_key = 'userId';
  62.  
  63.     SELECT CAST(A.process_parameter_value AS character varying(14)) INTO vDatetime
  64.     FROM t_process_parameter A
  65.     WHERE A.process_message_id = vProcessId AND
  66.         A.process_parameter_key = 'datetime';
  67.        
  68.     DELETE FROM tt_sl_so_tax_for_modify_so WHERE session_id = pSessionId;
  69.        
  70.     SELECT A.so_id INTO vSoId FROM sl_manage_so A WHERE A.manage_so_id = vManageSoId;
  71.     SELECT A.so_status_doc INTO vSoStatusDoc FROM sl_manage_so A WHERE A.manage_so_id = vManageSoId;
  72.  
  73.     UPDATE sl_so SET update_datetime = vDatetime, update_user_id = vUserId, version = sl_so.version + 1, status_doc = vSoStatusDoc
  74.     WHERE sl_so.so_id = vSoId;
  75.    
  76.     -- update so item untuk item lama
  77.     UPDATE sl_so_item
  78.     SET update_datetime = vDatetime,
  79.         update_user_id = vUserId,
  80.         version = sl_so_item.version + 1,
  81.         gross_sell_price = A.gross_sell_price,
  82.         flg_tax_amount = A.flg_tax_amount,
  83.         tax_id = A.tax_id,
  84.         tax_percentage = A.tax_percentage,
  85.         tax_price = A.tax_price,
  86.         nett_sell_price = A.nett_sell_price,
  87.         qty_so = sl_so_item.qty_so + A.qty_so,
  88.         qty_int = sl_so_item.qty_int + A.qty_int,
  89.         nett_item_amount = A.nett_item_amount,
  90.         tax_amount = A.tax_amount,
  91.         flg_disc = A.flg_disc,
  92.         discount_amount = A.discount_amount,
  93.         discount_percentage = A.discount_percentage
  94.     FROM sl_manage_so_item A, sl_manage_so B
  95.     WHERE A.manage_so_id = vManageSoId
  96.     AND A.manage_so_id = B.manage_so_id
  97.     AND sl_so_item.so_item_id = A.so_item_id
  98.     AND A.flg_new_item = vFlagNo;
  99.    
  100.     -- insert so item untuk item baru (ref_doc_type_id dan ref_id diisi referensi dulu supaya bisa untuk join waktu insert sl_so_balance_item)
  101.     INSERT INTO sl_so_item(
  102.             tenant_id, so_id, line_no, ref_doc_type_id, ref_id,
  103.             partner_ship_to_id, partner_ship_address_id, product_id, curr_code, gross_sell_price,
  104.             flg_tax_amount, tax_id, tax_percentage, tax_price, promo_code, nett_sell_price,
  105.             qty_so, so_uom_id, qty_int, base_uom_id, discount_percentage,
  106.             discount_amount, nett_item_amount, tax_amount,
  107.             eta, tolerance_dlv_qty, flg_disc,
  108.             remark, version, create_datetime, create_user_id, update_datetime,
  109.             update_user_id, eta_day)
  110.     SELECT pTenantId, B.so_id, A.line_no, vManageSoItemDocTypeId, A.manage_so_item_id,
  111.            C.partner_ship_to_id, C.partner_ship_address_id, A.product_id, A.curr_code, A.gross_sell_price,
  112.            A.flg_tax_amount, A.tax_id, A.tax_percentage, A.tax_price, A.promo_code, A.nett_sell_price,
  113.            A.qty_so, A.so_uom_id, A.qty_int, A.base_uom_id, A.discount_percentage,
  114.            A.discount_amount, A.nett_item_amount, A.tax_amount,
  115.            A.eta, A.tolerance_dlv_qty, A.flg_disc,
  116.            A.remark, 0, vDatetime, vUserId, vDatetime,
  117.            vUserId, A.eta_day
  118.     FROM sl_manage_so_item A, sl_manage_so B, sl_so C
  119.     WHERE A.manage_so_id = vManageSoId AND
  120.         A.manage_so_id = B.manage_so_id AND
  121.         B.so_id = C.so_id AND
  122.         A.flg_new_item = vFlagYes;
  123.        
  124.     INSERT INTO sl_so_item_purchasing(
  125.         so_item_id, partner_id, tenant_id, curr_code,
  126.         flg_tax_amount, price, flg_ready_stock, indent_days, remark,
  127.         version, create_datetime, create_user_id, update_datetime, update_user_id)
  128.     SELECT C.so_item_id, A.partner_id, pTenantId, A.curr_code,
  129.            A.flg_tax_amount, A.price, A.flg_ready_stock, A.indent_days, A.remark,
  130.            0, vDatetime, vUserId, vDatetime, vUserId
  131.     FROM sl_manage_so_item_purchasing A
  132.     INNER JOIN sl_manage_so B ON B.manage_so_id = A.manage_so_id
  133.     INNER JOIN sl_so_item C ON A.manage_so_item_id = C.ref_id AND C.ref_doc_type_id = vManageSoItemDocTypeId
  134.     INNER JOIN sl_manage_so_item D ON A.manage_so_item_id = D.manage_so_item_id
  135.     WHERE B.manage_so_id = vManageSoId AND
  136.           D.flg_new_item = vFlagYes;
  137.    
  138.    
  139.          
  140.     INSERT INTO sl_so_activity_wo(
  141.         so_item_id, line_no, partner_ship_cp_id,
  142.         flg_activity, group_activity, remark, tenant_id,
  143.         version, create_datetime, create_user_id,
  144.         update_datetime, update_user_id)
  145.     SELECT C.so_item_id, A.line_no, A.partner_ship_cp_id,
  146.            A.flg_activity, A.group_activity, A.remark, pTenantId,
  147.            0, vDatetime, vUserId,
  148.            vDatetime, vUserId
  149.     FROM sl_manage_so_item_activity_wo A
  150.     INNER JOIN sl_manage_so B ON B.manage_so_id = A.manage_so_id
  151.     INNER JOIN sl_so_item C ON A.manage_so_item_id = C.ref_id AND C.ref_doc_type_id = vManageSoItemDocTypeId
  152.     INNER JOIN sl_manage_so_item D ON A.manage_so_item_id = D.manage_so_item_id
  153.     WHERE B.manage_so_id = vManageSoId AND
  154.           D.flg_new_item = vFlagYes;
  155.        
  156.     -- update so balance item untuk item lama
  157.     UPDATE sl_so_balance_item
  158.     SET update_datetime = vDatetime,
  159.         update_user_id = vUserId,
  160.         version = sl_so_balance_item.version + 1,
  161.         status_item = vStatusRelease,
  162.         qty_add = sl_so_balance_item.qty_add + A.qty_so,
  163.         qty_add_int = sl_so_balance_item.qty_add_int + A.qty_int
  164.     FROM sl_manage_so_item A, sl_manage_so B
  165.     WHERE A.manage_so_id = vManageSoId
  166.     AND A.manage_so_id = B.manage_so_id
  167.     AND sl_so_balance_item.so_item_id = A.so_item_id
  168.     AND A.flg_new_item = vFlagNo;
  169.    
  170.    
  171.     -- Update status_item pada sl_so_balance_item menjadi F, apabila tidak ada lagi o/s qty
  172.     UPDATE sl_so_balance_item
  173.     SET status_item = vStatusFinal
  174.     FROM sl_manage_so_item A, sl_manage_so B
  175.     WHERE A.manage_so_id = vManageSoId
  176.     AND A.manage_so_id = B.manage_so_id
  177.     AND sl_so_balance_item.so_item_id = A.so_item_id
  178.     AND A.flg_new_item = vFlagNo
  179.     AND 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;
  180.    
  181.     -- insert so balance item untuk item baru
  182.     INSERT INTO sl_so_balance_item
  183.     (so_item_id, tenant_id, ou_id, qty_so, qty_dlv, qty_return, qty_cancel, qty_add, so_uom_id,
  184.      qty_so_int, qty_dlv_int, qty_return_int, qty_cancel_int, qty_add_int, base_uom_id,
  185.      tolerance_dlv_qty, status_item, version, create_datetime, create_user_id, update_datetime, update_user_id)
  186.     SELECT A.so_item_id, A.tenant_id, B.ou_id, A.qty_so, 0, 0, 0, 0, A.so_uom_id,
  187.             A.qty_int, 0, 0, 0, 0, A.base_uom_id,
  188.             A.tolerance_dlv_qty, vStatusRelease, 0, vDatetime, vUserId, vDatetime, vUserId
  189.     FROM sl_so_item A, sl_so B, sl_manage_so_item C
  190.     WHERE A.so_id = vSoId AND
  191.         A.so_id = B.so_id AND
  192.         C.manage_so_item_id = A.ref_id AND
  193.         A.ref_doc_type_id = vManageSoItemDocTypeId AND
  194.         C.flg_new_item = vFlagYes;
  195.        
  196.        
  197.     -- WTC, 20141227, insert dan update juga ke table saldo qty SO terhadap PO, yang akan digunakan/diupdate saat input PO dari SO
  198.     -- TODO: insert to sl_log_so_po_balance_item
  199.     -- Update status menjadi sama dengan status sl_so_balance_item, untuk item-item lama
  200.     UPDATE sl_so_po_balance_item A
  201.     SET update_datetime = vDatetime, update_user_id = vUserId, version = A.version + 1, status_item = D.status_item
  202.     FROM sl_manage_so_item B, sl_manage_so C, sl_so_balance_item D
  203.     WHERE A.so_item_id = B.so_item_id
  204.         AND B.manage_so_id = C.manage_so_id
  205.         AND A.so_item_id = D.so_item_id
  206.         AND B.manage_so_id = vManageSoId
  207.         AND B.flg_new_item = vFlagNo;
  208.  
  209.     -- Update status menjadi F, untuk item-item lama yang tidak memiliki o/s qty PO terhadap SO
  210.     UPDATE sl_so_po_balance_item A
  211.     SET status_item = vStatusFinal
  212.     FROM sl_manage_so_item B, sl_manage_so C, sl_so_balance_item D
  213.     WHERE A.so_item_id = B.so_item_id
  214.         AND B.manage_so_id = C.manage_so_id
  215.         AND A.so_item_id = D.so_item_id
  216.         AND B.manage_so_id = vManageSoId
  217.         AND B.flg_new_item = vFlagNo
  218.         AND A.status_item <> vStatusFinal
  219.         AND (D.qty_so_int - D.qty_cancel_int + D.qty_add_int) <= (A.qty_po_int - A.qty_po_int_cancel + A.qty_po_int_add);
  220.    
  221.     -- insert so sl_so_po_balance_item untuk item baru
  222.     INSERT INTO sl_so_po_balance_item
  223.     (so_item_id, tenant_id, ou_id, so_id, qty_po_int, qty_po_int_return, qty_po_int_cancel, qty_po_int_add, base_uom_id,   
  224.      status_item, version, create_datetime, create_user_id, update_datetime, update_user_id)
  225.     SELECT A.so_item_id, A.tenant_id, B.ou_id, B.so_id, 0, 0, 0, 0, A.base_uom_id,
  226.             vStatusRelease, 0, vDatetime, vUserId, vDatetime, vUserId
  227.     FROM sl_so_item A, sl_so B, sl_manage_so_item C
  228.     WHERE A.so_id = vSoId AND
  229.         A.so_id = B.so_id AND
  230.         C.manage_so_item_id = A.ref_id AND
  231.         A.ref_doc_type_id = vManageSoItemDocTypeId AND
  232.         C.flg_new_item = vFlagYes;
  233.        
  234.     -- update nilai sl_manage_so_item untuk so_item_id (untuk item baru)
  235.     UPDATE sl_manage_so_item
  236.     SET so_item_id = A.so_item_id
  237.     FROM sl_so_item A
  238.     INNER JOIN sl_so B ON A.so_id = B.so_id
  239.     WHERE sl_manage_so_item.manage_so_item_id = A.ref_id AND
  240.           A.ref_doc_type_id = vManageSoItemDocTypeId AND
  241.           A.so_id = vSoId AND
  242.           sl_manage_so_item.flg_new_item = vFlagYes;
  243.        
  244.     -- kembalikan nilai ref_doc_type_id dan ref_id sesuai dengan aslinya dari sl_manage_so_item
  245.     UPDATE sl_so_item Z SET ref_doc_type_id = A.ref_doc_type_id, ref_id = A.ref_item_id
  246.     FROM sl_manage_so_item A, sl_manage_so B
  247.     WHERE A.manage_so_id = vManageSoId AND
  248.         A.manage_so_id = B.manage_so_id AND
  249.         A.flg_new_item = vFlagYes AND
  250.         Z.ref_id = A.manage_so_item_id AND
  251.         Z.ref_doc_type_id = B.doc_type_id;
  252.        
  253.     SELECT COUNT(1) INTO vUnfinishedItem
  254.     FROM sl_so_balance_item A, sl_so_item B
  255.     WHERE A.so_item_id = B.so_item_id AND
  256.         B.so_id = vSoId AND
  257.         A.status_item = vStatusRelease;
  258.        
  259.     IF vUnfinishedItem = 0 THEN
  260.         UPDATE sl_so SET status_doc = vStatusFinal, update_datetime = vDatetime, update_user_id = vUserId
  261.         WHERE so_id = vSoId;
  262.     END IF;
  263.        
  264.     INSERT INTO sl_log_so_balance_item
  265.     (tenant_id, so_id, so_item_id, ref_doc_type_id, ref_id, ref_item_id,
  266.      qty_trx, trx_uom_id, qty_int, base_uom_id, remark,
  267.     version, create_datetime, create_user_id, update_datetime, update_user_id)
  268.     SELECT A.tenant_id, A.so_id, B.so_item_id, A.doc_type_id, A.manage_so_id, B.manage_so_item_id,
  269.         B.qty_so, B.so_uom_id, B.qty_int, B.base_uom_id, A.remark,
  270.         0, vDatetime, vUserId, vDatetime, vUserId
  271.     FROM sl_manage_so A, sl_manage_so_item B
  272.     WHERE A.manage_so_id = vManageSoId AND
  273.         A.manage_so_id = B.manage_so_id;
  274.    
  275.     -- update tax di so_item
  276.     INSERT INTO tt_sl_so_tax_for_modify_so
  277.     (session_id, tenant_id, so_id, tax_id, flg_amount,
  278.     tax_percentage, base_amount, tax_amount, remark)
  279.     SELECT pSessionId, A.tenant_id, A.so_id, A.tax_id, B.flg_amount,
  280.         A.tax_percentage, SUM(f_get_amount_before_tax((A.gross_sell_price - A.discount_amount) * A.qty_so, A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vManageSoItemDocTypeId, A.curr_code), vRoundingModeNonTax)),
  281.         f_tax_rounding(A.tenant_id, SUM(f_get_amount_before_tax((A.gross_sell_price - A.discount_amount) * A.qty_so, A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vManageSoItemDocTypeId, A.curr_code), vRoundingModeNonTax)), A.tax_percentage), B.tax_name
  282.     FROM sl_so_item A, m_tax B
  283.     WHERE A.tax_id = B.tax_id AND
  284.           A.so_id = vSoId AND
  285.           A.tax_id <> vEmptyId
  286.     GROUP BY A.tenant_id, A.so_id, A.tax_id, B.flg_amount,
  287.             A.tax_percentage, B.tax_name;
  288.            
  289.     UPDATE sl_so_tax SET base_amount = A.base_amount, tax_amount = A.tax_amount, update_datetime = vDatetime, update_user_id = vUserId, version = sl_so_tax.version + 1
  290.     FROM tt_sl_so_tax_for_modify_so A
  291.     WHERE sl_so_tax.tenant_id = A.tenant_id
  292.     AND A.session_id = pSessionId
  293.     AND sl_so_tax.so_id = A.so_id
  294.     AND sl_so_tax.tax_id = A.tax_id;
  295.    
  296.     /*
  297.      * jika flg os change do=y, maka update:
  298.      * 1. sl_so_balance_invoice
  299.      * 2. sl_so_balance_invoice_tax (bisa insert / update)
  300.      */
  301.     INSERT INTO tt_os_delivery_order_item_manage_item_so(
  302.             session_id, tenant_id,
  303.             ou_id, delivery_order_doc_type_id, delivery_order_item_id, delivery_order_id,
  304.             so_id, so_item_id, delivery_order_no, delivery_order_date, curr_code,
  305.             partner_id, gross_sell_price, discount_amount, nett_sell_price, flg_tax_amount,
  306.             tax_id, tax_percentage, qty_dlv_so, so_balance_invoice_id,
  307.            
  308.             flg_change_do, discount_percentage)
  309.            
  310.     SELECT pSessionId, pTenantId,
  311.            F.ou_id, C.doc_type_id, D.do_item_id, C.do_id,
  312.            B.so_id, A.so_item_id, C.doc_no, C.doc_date, A.curr_code,
  313.            F.partner_bill_to_id, A.gross_sell_price, A.discount_amount, A.nett_sell_price, A.flg_tax_amount,
  314.            A.tax_id, A.tax_percentage, D.qty_dlv_so, E.so_balance_invoice_id,
  315.            
  316.            A.flg_change_do, A.discount_percentage
  317.            
  318.     FROM sl_manage_so_item A
  319.     INNER JOIN sl_manage_so B ON A.manage_so_id = B.manage_so_id
  320.     INNER JOIN sl_do C ON C.ref_id = B.so_id
  321.     INNER JOIN sl_do_item D ON C.do_id = D.do_id AND A.so_item_id = D.ref_id
  322.     INNER JOIN sl_so F ON F.so_id = B.so_id
  323.     INNER JOIN sl_so_balance_invoice E
  324.         ON E.ref_doc_type_id = C.doc_type_id
  325.         AND E.ref_id = C.do_id
  326.         AND E.ref_item_id = D.do_item_id
  327.         AND E.so_id = B.so_id
  328.         AND E.tenant_id = pTenantId
  329.         AND E.ou_id = B.ou_id
  330.         AND E.partner_id = F.partner_bill_to_id
  331.         AND E.do_receipt_item_id = vEmptyId
  332.     WHERE E.flg_invoice = vFlagNo
  333.         AND E.invoice_id = vEmptyId
  334.         AND A.manage_so_id = vManageSoId
  335.         AND A.flg_change_do = vFlagYes
  336.         AND A.nett_sell_price > 0;
  337.        
  338.     UPDATE sl_so_balance_invoice A
  339.     SET price_so = B.nett_sell_price,
  340.         item_amount = f_get_amount_before_tax_and_disc(B.qty_dlv_so * B.gross_sell_price, B.qty_dlv_so * B.discount_amount, B.flg_tax_amount, B.tax_percentage, f_get_digit_decimal_doc_curr(vDeliveryOrderDocTypeId, B.curr_code), vRoundingModeNonTax),
  341.        
  342.         regular_disc_amount = B.discount_amount * B.qty_dlv_so,
  343.        
  344.         gross_sell_price_so = B.gross_sell_price,
  345.         tax_percentage = B.tax_percentage,
  346.         flg_tax_amount = B.flg_tax_amount,
  347.         discount_percentage = B.discount_percentage,
  348.         discount_amount = B.discount_amount,
  349.        
  350.         version = A.version + 1,
  351.         update_datetime = vDatetime,
  352.         update_user_id = vUserId
  353.     FROM tt_os_delivery_order_item_manage_item_so B
  354.     WHERE B.session_id = pSessionId
  355.     AND B.so_balance_invoice_id = A.so_balance_invoice_id;
  356.    
  357.     DELETE FROM sl_so_balance_invoice_tax A
  358.     WHERE A.tenant_id = pTenantId
  359.     AND EXISTS (
  360.         SELECT 1 FROM tt_os_delivery_order_item_manage_item_so B
  361.         WHERE A.tenant_id = B.tenant_id
  362.         AND A.ou_id = B.ou_id
  363.         AND A.partner_id = B.partner_id
  364.         AND A.so_id = B.so_id
  365.         AND A.ref_doc_type_id = B.delivery_order_doc_type_id
  366.         AND A.ref_id = B.delivery_order_id
  367.         AND A.ref_item_id = B.delivery_order_item_id
  368.         AND A.do_receipt_item_id = vEmptyId
  369.         AND B.session_id = pSessionId
  370.     );
  371.    
  372.     INSERT INTO sl_so_balance_invoice_tax
  373.     (tenant_id, ou_id, partner_id, so_id,
  374.     ref_doc_type_id, ref_id, ref_item_id, tax_id, flg_amount,
  375.     tax_percentage, curr_code, base_amount, tax_amount, flg_invoice, invoice_id,
  376.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  377.     SELECT A.tenant_id, A.ou_id, A.partner_id, A.so_id,
  378.         A.delivery_order_doc_type_id, A.delivery_order_id, A.delivery_order_item_id, A.tax_id, B.flg_amount,
  379.         A.tax_percentage, A.curr_code,
  380.         f_get_amount_before_tax_and_disc(A.qty_dlv_so * A.gross_sell_price, A.qty_dlv_so * A.discount_amount, A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vDeliveryOrderDocTypeId, A.curr_code), vRoundingModeNonTax),
  381.         f_tax_rounding(A.tenant_id, f_get_amount_before_tax(A.qty_dlv_so * (A.gross_sell_price - A.discount_amount), A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vDeliveryOrderDocTypeId, A.curr_code), vRoundingModeNonTax), A.tax_percentage), vFlagInvoice, vEmptyId,
  382.         0, vDatetime, vUserId, vDatetime, vUserId
  383.  
  384.     FROM tt_os_delivery_order_item_manage_item_so A
  385.     INNER JOIN m_tax B ON A.tax_id = B.tax_id
  386.     WHERE A.session_id = pSessionId;
  387.    
  388.     /**
  389.      * Update balance DO Receipt
  390.      */
  391.     INSERT INTO tt_os_delivery_order_receipt_item_manage_item_so(
  392.             session_id, tenant_id,
  393.             ou_id, delivery_order_doc_type_id, delivery_order_item_id, delivery_order_id,
  394.             so_id, so_item_id, delivery_order_receipt_no, delivery_order_receipt_date, curr_code,
  395.             partner_id, gross_sell_price, discount_amount, nett_sell_price,
  396.             regular_disc_amount, promo_disc_amount, flg_tax_amount,
  397.             tax_id, tax_percentage, qty_return, qty_so, qty_int, qty_dlv_so,
  398.             so_balance_invoice_id, do_receipt_item_id,
  399.             flg_change_do, discount_percentage)
  400.     SELECT pSessionId, pTenantId,
  401.            F.ou_id, C.doc_type_id, E.ref_id, C.do_id,
  402.            F.so_id, G.so_item_id, D.doc_no, D.doc_date, A.curr_code,
  403.            F.partner_bill_to_id, A.gross_sell_price, A.discount_amount, A.nett_sell_price,
  404.            I.regular_disc_amount, I.promo_disc_amount, A.flg_tax_amount,
  405.            A.tax_id, A.tax_percentage, E.qty_return, G.qty_so, G.qty_int, I.qty_dlv_so,
  406.            H.so_balance_invoice_id, E.do_receipt_item_id,
  407.            A.flg_change_do, A.discount_percentage
  408.     FROM sl_manage_so_item A
  409.     INNER JOIN sl_manage_so B ON A.manage_so_id = B.manage_so_id
  410.     INNER JOIN sl_do C ON C.ref_id = B.so_id
  411.     INNER JOIN sl_do_item J ON C.do_id = J.do_id AND A.so_item_id = J.ref_id
  412.     INNER JOIN in_do_receipt D ON D.ref_id = C.do_id
  413.     INNER JOIN in_do_receipt_item E ON E.do_receipt_id = D.do_receipt_id AND E.ref_id = J.do_item_id
  414.     INNER JOIN sl_so F ON B.so_id = F.so_id
  415.     INNER JOIN sl_so_item G ON F.so_id = G.so_id AND G.so_item_id = J.ref_id
  416.     INNER JOIN sl_so_balance_invoice H
  417.         ON H.ref_doc_type_id = C.doc_type_id
  418.         AND H.ref_id = C.do_id
  419.         AND H.ref_item_id = E.ref_id
  420.         AND H.tenant_id = pTenantId
  421.         AND H.ou_id = D.ou_id
  422.         AND H.partner_id = F.partner_bill_to_id
  423.         AND H.do_receipt_item_id = E.do_receipt_item_id
  424.     INNER JOIN sl_so_balance_invoice I
  425.         ON I.ref_doc_type_id = C.doc_type_id
  426.         AND I.ref_id = C.do_id
  427.         AND I.ref_item_id = E.ref_id
  428.         AND I.tenant_id = pTenantId
  429.         AND I.ou_id = D.ou_id
  430.         AND I.partner_id = F.partner_bill_to_id
  431.         AND I.do_receipt_item_id = vEmptyId
  432.     WHERE H.flg_invoice = vFlagNo
  433.         AND H.invoice_id = vEmptyId
  434.         AND A.manage_so_id = vManageSoId
  435.         AND A.flg_change_do = vFlagYes
  436.         AND G.qty_int > 0;
  437.    
  438.     UPDATE sl_so_balance_invoice A
  439.     SET price_so = B.nett_sell_price,
  440.         item_amount = -1 * f_get_amount_before_tax_and_disc((B.qty_return * B.qty_so / B.qty_int) * B.gross_sell_price, (B.regular_disc_amount + B.promo_disc_amount) * (B.qty_return * B.qty_so / B.qty_int) / B.qty_dlv_so, B.flg_tax_amount, B.tax_percentage, f_get_digit_decimal_doc_curr(vDoReceiptDocTypeId, B.curr_code), vRoundingModeNonTax),
  441.        
  442.         regular_disc_amount = -1 * (B.discount_amount * B.qty_return),
  443.        
  444.         gross_sell_price_so = B.gross_sell_price,
  445.         tax_percentage = B.tax_percentage,
  446.         flg_tax_amount = B.flg_tax_amount,
  447.         discount_percentage = B.discount_percentage,
  448.         discount_amount = B.discount_amount,
  449.        
  450.         -- flg_change_do = B.flg_change_do,
  451.        
  452.         version = A.version + 1,
  453.         update_datetime = vDatetime,
  454.         update_user_id = vUserId
  455.     FROM tt_os_delivery_order_receipt_item_manage_item_so B
  456.     WHERE B.session_id = pSessionId
  457.     AND B.so_balance_invoice_id = A.so_balance_invoice_id;
  458.    
  459.     DELETE FROM sl_so_balance_invoice_tax A
  460.     WHERE A.tenant_id = pTenantId
  461.     AND EXISTS (
  462.         SELECT 1 FROM tt_os_delivery_order_receipt_item_manage_item_so B
  463.         WHERE A.tenant_id = B.tenant_id
  464.         AND A.ou_id = B.ou_id
  465.         AND A.partner_id = B.partner_id
  466.         AND A.so_id = B.so_id
  467.         AND A.ref_doc_type_id = B.delivery_order_doc_type_id
  468.         AND A.ref_id = B.delivery_order_id
  469.         AND A.ref_item_id = B.delivery_order_item_id
  470.         AND A.do_receipt_item_id = B.do_receipt_item_id
  471.         AND B.session_id = pSessionId
  472.     );
  473.    
  474.     INSERT INTO sl_so_balance_invoice_tax
  475.     (tenant_id, ou_id, partner_id, so_id,
  476.     ref_doc_type_id, ref_id, ref_item_id, tax_id, flg_amount,
  477.     tax_percentage, curr_code, base_amount, tax_amount, flg_invoice, invoice_id,
  478.     "version", create_datetime, create_user_id, update_datetime, update_user_id,
  479.     do_receipt_item_id)
  480.     SELECT A.tenant_id, A.ou_id, A.partner_id, A.so_id,
  481.         A.delivery_order_doc_type_id, A.delivery_order_id, A.delivery_order_item_id, A.tax_id, B.flg_amount,
  482.         A.tax_percentage, A.curr_code,
  483.         -1 * f_get_amount_before_tax_and_disc((A.qty_return * A.qty_so / A.qty_int) * A.gross_sell_price, (A.qty_return * A.qty_so / A.qty_int) * A.discount_amount, A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vDoReceiptDocTypeId, A.curr_code), vRoundingModeNonTax),
  484.         -1 * f_tax_rounding(A.tenant_id, f_get_amount_before_tax((A.qty_return * A.qty_so / A.qty_int) * (A.gross_sell_price - A.discount_amount), A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vDoReceiptDocTypeId, A.curr_code), vRoundingModeNonTax), A.tax_percentage), vFlagInvoice, vEmptyId,
  485.         0, vDatetime, vUserId, vDatetime, vUserId,
  486.         A.do_receipt_item_id
  487.     FROM tt_os_delivery_order_receipt_item_manage_item_so A
  488.     INNER JOIN m_tax B ON A.tax_id = B.tax_id
  489.     WHERE A.session_id = pSessionId;
  490.    
  491.     UPDATE sl_manage_so SET status_doc = vStatusRelease, update_datetime = vDatetime, update_user_id = vUserId
  492.     WHERE manage_so_id = vManageSoId;
  493.    
  494.     DELETE FROM tt_sl_so_tax_for_modify_so WHERE session_id = pSessionId;
  495.     DELETE FROM tt_os_delivery_order_item_manage_item_so WHERE session_id = pSessionId;
  496.     DELETE FROM tt_os_delivery_order_receipt_item_manage_item_so WHERE session_id = pSessionId;
  497. END;   
  498. $BODY$
  499.   LANGUAGE plpgsql VOLATILE
  500.   COST 100;
  501.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement