Advertisement
Guest User

Untitled

a guest
Mar 14th, 2017
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Progress 31.93 KB | None | 0 0
  1. -- FUNCTION: sl_submit_so_from_magento_with_complete_date_and_shipping_cost(bigint, CHARACTER varying, bigint, bigint, bigint, CHARACTER varying, CHARACTER varying, numeric)
  2.  
  3. -- DROP FUNCTION sl_submit_so_from_magento_with_complete_date_and_shipping_cost(bigint, CHARACTER varying, bigint, bigint, bigint, CHARACTER varying, CHARACTER varying, numeric);
  4.  
  5. CREATE OR REPLACE FUNCTION sl_submit_so_from_magento_with_complete_date_and_shipping_cost(
  6.     bigint,
  7.     CHARACTER varying,
  8.     bigint,
  9.     bigint,
  10.     bigint,
  11.     CHARACTER varying,
  12.     CHARACTER varying,
  13.     numeric)
  14.   RETURNS void AS
  15. $BODY$
  16. DECLARE
  17.     pTenantId        ALIAS FOR $1;
  18.     pSessionId        ALIAS FOR $2;
  19.     pSoId            ALIAS FOR $3;
  20.     pWarehouseId    ALIAS FOR $4;
  21.     vUserId            ALIAS FOR $5;
  22.     vDatetime        ALIAS FOR $6;
  23.     vCompleteDate    ALIAS FOR $7;
  24.     vShippingAmount    ALIAS FOR $8;
  25.  
  26.     vProcessId                bigint;
  27.     vDoId                    bigint;
  28.     vFlagInvoice             CHARACTER varying(1);
  29.     vEmptyId                bigint;
  30.     vStatusRelease          CHARACTER varying(1);
  31.     vStatusDraft              CHARACTER varying(1);  
  32.     vStatusFinal              CHARACTER varying(1);
  33.     vEmptyValue                CHARACTER varying(1);
  34.     vProductStatus          CHARACTER varying(5);
  35.     vDaftarProdukTidakCukup TEXT;
  36.     vProductStatusReturn    CHARACTER varying(50);
  37.     vSignDebit                CHARACTER varying(1);
  38.     vSignCredit                CHARACTER varying(1);
  39.     vTypeRate                CHARACTER varying(3);
  40.     vProductCOA                CHARACTER varying(10);
  41.     vSystemCOA                CHARACTER varying(10);
  42.     vSoId                    bigint;
  43.     vUnfinishedItem            bigint;
  44.     vParentOuId                bigint;  
  45.     vJournalTrxId            bigint;      
  46.     vJournalType            CHARACTER varying(20);  
  47.    
  48.     vDocJournal                DOC_JOURNAL%ROWTYPE;
  49.     vOuStructure            OU_BU_STRUCTURE%ROWTYPE;
  50.     result                    RECORD;  
  51.    
  52.     vSalesOrderDocTypeId     bigint;
  53.     vDeliveryOrderDocTypeId bigint;
  54.     vActivityOngkir            bigint;
  55.     vOuRcOngkir                bigint;
  56.     vZero                    numeric;
  57.  
  58.     vErrorMessage            CHARACTER varying(1000);  
  59.     vSoNo                     CHARACTER varying(100);
  60.     vRoundingModeNonTax     CHARACTER varying(5);
  61.  
  62.     vWarehouseECommerceId       bigint;
  63.     vMaxLineNo                  bigint;
  64.    
  65. BEGIN
  66.     vFlagInvoice := 'N';
  67.     vEmptyId := -99;
  68.     vStatusRelease := 'R';
  69.     vStatusDraft := 'D';  
  70.     vStatusFinal := 'F';
  71.     vEmptyValue := ' ';
  72.     vProductStatus := 'GOOD';
  73.     vSignDebit := 'D';
  74.     vSignCredit := 'C';
  75.     vTypeRate := 'COM';
  76.     vProductCOA := 'PRODUCT';
  77.     vSystemCOA := 'SYSTEM';
  78.     vUnfinishedItem := 0;
  79.     vZero := 0;
  80.    
  81.     vSalesOrderDocTypeId = 301;
  82.     vDeliveryOrderDocTypeId = 311;
  83.    
  84.     SELECT activity_gl_id INTO vActivityOngkir FROM m_activity_gl WHERE activity_gl_code = 'Ongkir';
  85.    
  86.     SELECT ou_id INTO vOuRcOngkir FROM t_ou WHERE ou_code = 'LOG';
  87.    
  88.     SELECT product_status_code INTO vProductStatusReturn FROM m_product_status WHERE flg_return = 'Y';
  89.    
  90.     SELECT NEXTVAL('sl_do_seq') INTO vDoId;  
  91.    
  92.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'rounding.mode.non.tax') INTO vRoundingModeNonTax;
  93.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'id.warehouse.ecommerce') INTO vWarehouseECommerceId;
  94.    
  95.    
  96.    
  97.     DELETE FROM tt_journal_trx_item WHERE session_id = pSessionId;
  98.        
  99.     SELECT doc_no INTO vSoNo FROM sl_so WHERE so_id = pSoId LIMIT 1;
  100.    
  101.     UPDATE sl_so SET doc_type_id = vSalesOrderDocTypeId, status_doc = vStatusRelease, update_datetime = vDatetime, update_user_id = vUserId
  102.     WHERE so_id = pSoId;
  103.        
  104.       INSERT INTO sl_so_tax
  105.       (tenant_id, so_id, tax_id, flg_amount,
  106.       tax_percentage, base_amount, tax_amount, remark,
  107.       version, create_datetime, create_user_id, update_datetime, update_user_id)
  108.       SELECT A.tenant_id, A.so_id, A.tax_id, B.flg_amount,
  109.           A.tax_percentage, SUM(f_get_amount_before_tax((A.qty_so * ( A.gross_sell_price - A.discount_amount) ) , A.flg_tax_amount, A.tax_percentage,f_get_digit_decimal_doc_curr(vSalesOrderDocTypeId, A.curr_code), vRoundingModeNonTax)),
  110.           f_tax_rounding(A.tenant_id, SUM(f_get_amount_before_tax((A.qty_so * ( A.gross_sell_price - A.discount_amount) ) , A.flg_tax_amount, A.tax_percentage,f_get_digit_decimal_doc_curr(vSalesOrderDocTypeId, A.curr_code), vRoundingModeNonTax)), A.tax_percentage), B.tax_name,
  111.           0, vDatetime, vUserId, vDatetime, vUserId
  112.       FROM sl_so_item A, m_tax B
  113.       WHERE A.tax_id = B.tax_id AND
  114.             A.so_id = pSoId AND
  115.             A.tax_id <> vEmptyId
  116.       GROUP BY A.tenant_id, A.so_id, A.tax_id, B.flg_amount,
  117.               A.tax_percentage, B.tax_name, A.curr_code;
  118.              
  119.       INSERT INTO sl_so_cost
  120.       (tenant_id, so_id, line_no,
  121.        ref_doc_type_id, ref_id, activity_gl_id, curr_code,
  122.        percentage, base_amount, tax_id, tax_percentage,
  123.        add_amount, tax_amount, remark, version,
  124.        create_datetime, create_user_id, update_datetime, update_user_id,
  125.        segment_id, ou_rc_id)
  126.       SELECT A.tenant_id, A.so_id, 1, vEmptyId, vEmptyId, vActivityOngkir, A.curr_code,
  127.              vZero, vZero, vEmptyId, vZero,
  128.              vShippingAmount, vZero, A.remark, A.version,
  129.              create_datetime, create_user_id, update_datetime, update_user_id,
  130.              vEmptyId, vOuRcOngkir
  131.       FROM sl_so A
  132.       WHERE A.so_id = pSoId;
  133.      
  134.              
  135.       RAISE NOTICE 'INSERT INTO sl_so_tax';      
  136.    
  137.     INSERT INTO sl_so_balance_item
  138.     (so_item_id, tenant_id, ou_id, qty_so, qty_dlv, qty_return, qty_cancel, qty_add, so_uom_id,  
  139.      qty_so_int, qty_dlv_int, qty_return_int, qty_cancel_int, qty_add_int, base_uom_id,  
  140.        tolerance_dlv_qty, status_item, version, create_datetime, create_user_id, update_datetime, update_user_id)
  141.     SELECT A.so_item_id, A.tenant_id, B.ou_id, A.qty_so, A.qty_so, 0, 0, 0, A.so_uom_id,
  142.             A.qty_int, A.qty_int, 0, 0, 0, A.base_uom_id,
  143.             A.tolerance_dlv_qty, vStatusFinal, 0, vDatetime, vUserId, vDatetime, vUserId
  144.     FROM sl_so_item A, sl_so B
  145.     WHERE A.so_id = pSoId AND
  146.         A.so_id = B.so_id;
  147.    
  148.     RAISE NOTICE 'INSERT INTO sl_so_balance_item';
  149.    
  150.       INSERT INTO sl_log_so_balance_item
  151.       (tenant_id, so_id, so_item_id, ref_doc_type_id, ref_id, ref_item_id,
  152.        qty_trx, trx_uom_id, qty_int, base_uom_id, remark,
  153.     version, create_datetime, create_user_id, update_datetime, update_user_id)
  154.     SELECT A.tenant_id, A.so_id, A.so_item_id, vEmptyId, vEmptyId, vEmptyId,
  155.         A.qty_so, A.so_uom_id, A.qty_int, A.base_uom_id, A.remark,
  156.         0, vDatetime, vUserId, vDatetime, vUserId
  157.     FROM sl_so_item A
  158.     WHERE A.so_id = pSoId;
  159.    
  160.     RAISE NOTICE 'INSERT INTO sl_log_so_balance_item';
  161.    
  162.    /*
  163.     * Update By Sarah
  164.     * 7 Maret 2017
  165.     * doc_date di ubah menyesuaikan tanggal process, tidak menggunakan complite date lagi.
  166.     */
  167.     INSERT INTO sl_do(
  168.             do_id, tenant_id, doc_type_id, doc_no, doc_date, ou_id, ext_doc_no,
  169.             ext_doc_date, ref_doc_type_id, ref_id, remark, partner_ship_to_id,
  170.             partner_ship_address_id, warehouse_id, no_vehicle, flg_delivery,
  171.             delivery_code, status_doc, workflow_status, version, create_datetime,
  172.             create_user_id, update_datetime, update_user_id, eta, eta_day)
  173.     SELECT vDoId, A.tenant_id, vDeliveryOrderDocTypeId, A.doc_no, to_char(NOW(), 'yyyyMMdd'), A.ou_id, '',
  174.             '', vSalesOrderDocTypeId, A.so_id, A.remark, A.partner_ship_to_id,
  175.             A.partner_ship_address_id, pWarehouseId, '', 'Y',
  176.             '','R','APPROVED', 0, vDatetime,
  177.             vUserId, vDatetime, vUserId, '', ''
  178.     FROM sl_so A
  179.     JOIN sl_so_item B
  180.     ON A.so_id = B.so_id
  181.     WHERE A.so_id = pSoId
  182.     GROUP BY A.so_id;
  183.    
  184.     RAISE NOTICE 'INSERT INTO sl_do';
  185.    
  186.        
  187.         INSERT INTO sl_do_item
  188.       (tenant_id, do_id, line_no, ref_doc_type_id, ref_id,
  189.       product_id, qty_dlv_so, so_uom_id, qty_dlv_int, base_uom_id,
  190.       remark, "version", create_datetime, create_user_id, update_datetime, update_user_id, product_status)
  191.     SELECT A.tenant_id, vDoId, A.line_no, vSalesOrderDocTypeId, A.so_item_id,
  192.         A.product_id, A.qty_so, A.so_uom_id, A.qty_int, A.base_uom_id,
  193.         A.remark, 0, vDatetime, vUserId, vDatetime, vUserId, vProductStatus
  194.     FROM sl_so_item A
  195.       WHERE A.so_id = pSoId;
  196.      
  197.       RAISE NOTICE 'INSERT INTO sl_do_item';
  198.      
  199.  
  200.                    
  201.     IF EXISTS (
  202.               SELECT A.do_item_id, A.product_id, B.product_balance_id, C.product_code
  203.         FROM sl_do_item A
  204.         JOIN m_product C ON A.product_id = C.product_id
  205.         LEFT JOIN in_product_balance B ON A.product_id = B.product_id
  206.         WHERE A.tenant_id = pTenantId
  207.         AND A.do_id = vDoId
  208.         AND product_balance_id IS NULL
  209.        ) THEN
  210.  
  211.         SELECT 'The products: '||string_agg(product_code, ',')||' has no stock in inventory' INTO vErrorMessage
  212.         FROM (
  213.             SELECT A.do_item_id, A.product_id, B.product_balance_id, C.product_code
  214.             FROM sl_do_item A
  215.             JOIN m_product C ON A.product_id = C.product_id
  216.             LEFT JOIN in_product_balance B ON A.product_id = B.product_id
  217.             WHERE A.tenant_id = pTenantId
  218.             AND A.do_id = vDoId
  219.             AND product_balance_id IS NULL ) Z;
  220.        
  221.         RAISE EXCEPTION 'Order Magento % cannot be processed ', vSoNo
  222.         USING HINT = vErrorMessage;
  223.     END IF;
  224.                
  225.     INSERT INTO sl_do_product
  226.         (tenant_id, do_item_id, line_no, product_id, product_balance_id,
  227.         product_status, qty_dlv_int, base_uom_id, remark,
  228.         "version", create_datetime, create_user_id, update_datetime, update_user_id)
  229.     SELECT C.tenant_id, C.do_item_id, ROW_NUMBER() OVER (), B.product_id, A.product_balance_id,
  230.            A.product_status, CASE WHEN C.qty_dlv_int < A.qty THEN C.qty_dlv_int ELSE A.qty END, B.base_uom_id,B.remark,
  231.            0, B.create_datetime, B.create_user_id, B.update_datetime, B.update_user_id
  232.     FROM in_product_balance_stock A, sl_so_item B, sl_do_item C
  233.     WHERE A.product_id = B.product_id AND A.product_id=C.product_id
  234.     AND B.so_item_id = C.ref_id
  235.     AND B.so_id = pSoId
  236.     AND A.product_status = vProductStatusReturn;
  237.  
  238.     SELECT COALESCE(MAX(A.line_no), 0) INTO vMaxLineNo
  239.     FROM sl_do_product A
  240.     INNER JOIN sl_do_item B ON A.do_item_id = B.do_item_id
  241.     INNER JOIN sl_so_item C ON C.so_item_id = B.ref_id
  242.     WHERE C.so_id = pSoId;
  243.                    
  244.     INSERT INTO sl_do_product
  245.         (tenant_id, do_item_id, line_no, product_id, product_balance_id,
  246.         product_status, qty_dlv_int, base_uom_id, remark,
  247.         "version", create_datetime, create_user_id, update_datetime, update_user_id)
  248.     SELECT C.tenant_id, C.do_item_id, vMaxLineNo + ROW_NUMBER() OVER (), B.product_id, A.product_balance_id,
  249.            A.product_status, C.qty_dlv_int - COALESCE(D.qty_dlv_int,0), B.base_uom_id,B.remark,
  250.            0, B.create_datetime, B.create_user_id, B.update_datetime, B.update_user_id
  251.     FROM in_product_balance_stock A, sl_so_item B, sl_do_item C
  252.     LEFT JOIN sl_do_product D ON C.do_item_id = D.do_item_id
  253.     WHERE A.product_id = B.product_id
  254.     AND A.product_id = C.product_id
  255.     AND B.so_item_id = C.ref_id
  256.     AND B.so_id = pSoId
  257.     AND A.product_status = vProductStatus;
  258.      
  259.       RAISE NOTICE 'INSERT INTO sl_do_product';
  260.      
  261.     RAISE NOTICE 'UPDATE sl_so_balance_item';
  262.    
  263.       UPDATE sl_do SET status_doc = vStatusRelease, version = version + 1, update_datetime = vDatetime, update_user_id = vUserId
  264.     WHERE do_id = vDoId;
  265.          
  266.      
  267.     INSERT INTO sl_log_so_balance_item
  268.       (tenant_id, so_id, so_item_id, ref_doc_type_id, ref_id, ref_item_id,
  269.        qty_trx, trx_uom_id, qty_int, base_uom_id, remark,
  270.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  271.     SELECT A.tenant_id, C.so_id, C.so_item_id, A.doc_type_id, A.do_id, B.do_item_id,
  272.         B.qty_dlv_so * -1, B.so_uom_id, B.qty_dlv_int  *-1, B.base_uom_id, B.remark,
  273.         0, vDatetime, vUserId, vDatetime, vUserId
  274.     FROM sl_do A, sl_do_item B, sl_so_item C
  275.     WHERE A.do_id = vDoId AND
  276.           A.do_id = B.do_id AND
  277.           B.ref_id = C.so_item_id;
  278.    
  279.     INSERT INTO sl_so_balance_invoice
  280.     (tenant_id, ou_id, partner_id, so_id,
  281.     ref_doc_type_id, ref_id, ref_doc_no, ref_doc_date, ref_item_id, qty_dlv_so, so_uom_id,
  282.     curr_code, price_so, item_amount, flg_invoice, invoice_id,
  283.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  284.     SELECT A.tenant_id, A.ou_id, D.partner_bill_to_id, A.ref_id,
  285.         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,
  286.         C.curr_code, C.nett_sell_price,
  287.         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),
  288.         vFlagInvoice, vEmptyId,
  289.         0, vDatetime, vUserId, vDatetime, vUserId
  290.     FROM sl_do A, sl_do_item B, sl_so_item C, sl_so D
  291.     WHERE A.do_id = vDoId AND
  292.           A.do_id = B.do_id AND
  293.           B.ref_id = C.so_item_id AND
  294.           C.so_id = D.so_id;
  295.  
  296.     INSERT INTO sl_so_balance_invoice_tax
  297.     (tenant_id, ou_id, partner_id, so_id,
  298.       ref_doc_type_id, ref_id, ref_item_id, tax_id, flg_amount,
  299.       tax_percentage, curr_code, base_amount, tax_amount, flg_invoice, invoice_id,
  300.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  301.     SELECT A.tenant_id, A.ou_id, E.partner_bill_to_id, A.ref_id,
  302.         A.doc_type_id, A.do_id, B.do_item_id, C.tax_id, D.flg_amount,
  303.         C.tax_percentage, C.curr_code,
  304.         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),
  305.         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,
  306.         0, vDatetime, vUserId, vDatetime, vUserId
  307.     FROM sl_do A, sl_do_item B, sl_so_item C, m_tax D, sl_so E
  308.     WHERE A.do_id = vDoId AND
  309.           A.do_id = B.do_id AND
  310.           B.ref_id = C.so_item_id AND
  311.           C.tax_id = D.tax_id AND
  312.           C.so_id = E.so_id;
  313.  
  314.     INSERT INTO tt_check_stock_available
  315.         (session_id, do_id, do_item_id, product_id, qty_do, available_qty)
  316.     WITH summary_available AS (
  317.          SELECT A.product_id, COALESCE(SUM(A.qty),0) AS available_qty FROM in_product_balance_stock A, sl_do_item B
  318.          WHERE A.product_id = B.product_id
  319.          AND A.warehouse_id = vWarehouseECommerceId
  320.          AND B.do_id = vDoId
  321.         GROUP BY A.product_id
  322.     )
  323.     SELECT pSessionId, B.do_id, B.do_item_id, B.product_id, B.qty_dlv_int AS qty_do, A.available_qty
  324.     FROM summary_available A,  sl_do_item B
  325.     WHERE B.do_id = vDoId
  326.     AND A.product_id = B.product_id;
  327.    
  328.  
  329.     IF EXISTS ( SELECT 1 FROM tt_check_stock_available WHERE session_id = pSessionId
  330.                AND available_qty - qty_do < 0 )
  331.         THEN
  332.            SELECT string_agg(B.product_code,', ') INTO vDaftarProdukTidakCukup
  333.            FROM tt_check_stock_available A, m_product B
  334.            WHERE session_id = pSessionId
  335.            AND available_qty - qty_do < 0
  336.            AND A.product_id = B.product_id;
  337.    
  338.             RAISE EXCEPTION 'DO tidak bisa diproses karena stok tidak cukup: %', vDaftarProdukTidakCukup;
  339.    
  340.         END IF;
  341.  
  342.  
  343.    
  344.     UPDATE in_product_balance_stock  Y SET qty = D.qty - Z.qty_dlv_int
  345.     FROM
  346.     in_product_balance_stock D,
  347.     (SELECT A.do_item_id, A.product_id, B.product_balance_id, C.product_balance_stock_id, C.qty, B.qty_dlv_int
  348.     FROM sl_do_item A
  349.     INNER JOIN sl_do_product B ON A.tenant_id = B.tenant_id AND A.do_item_id = B.do_item_id
  350.     INNER JOIN in_product_balance_stock C ON B.tenant_id = C.tenant_id AND B.product_id = C.product_id AND C.product_balance_id = B.product_balance_id AND C.product_status = B.product_status
  351.     WHERE A.tenant_id = pTenantId
  352.     AND A.do_id = vDoId) Z
  353.     WHERE D.product_balance_stock_id = Z.product_balance_stock_id
  354.     AND Y.product_balance_stock_id = Z.product_balance_stock_id;
  355.    
  356.    
  357.          
  358.              
  359.     INSERT INTO in_log_product_balance_stock
  360.     (tenant_id, ou_id, doc_type_id, ref_id, doc_no, doc_date, partner_id,
  361.      product_id, product_balance_id, warehouse_id, product_status, base_uom_id, qty,
  362.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  363.     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,
  364.         C.product_id, C.product_balance_id, A.warehouse_id, C.product_status, C.base_uom_id, SUM(C.qty_dlv_int) * -1,
  365.         0, vDatetime, vUserId, vDatetime, vUserId      
  366.     FROM sl_do A, sl_do_item B, sl_do_product C, m_product D, m_product_custom E
  367.     WHERE A.do_id = vDoId AND
  368.         A.do_id = B.do_id AND
  369.         B.do_item_id = C.do_item_id AND
  370.         C.product_id = D.product_id AND
  371.         D.product_id = E.product_id AND
  372.         E.flg_buy_konsinyasi='N'
  373.     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,
  374.             C.product_id, C.product_balance_id, A.warehouse_id, C.product_status, C.base_uom_id;
  375.  
  376.              
  377.     INSERT INTO in_log_product_consignment_balance_stock
  378.     (tenant_id, ou_id, doc_type_id, ref_id, doc_no, doc_date, partner_id,
  379.      product_id, product_balance_id, warehouse_id, product_status, base_uom_id, qty,
  380.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  381.     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,
  382.         C.product_id, C.product_balance_id, A.warehouse_id, C.product_status, C.base_uom_id, SUM(C.qty_dlv_int) * -1,
  383.         0, vDatetime, vUserId, vDatetime, vUserId      
  384.     FROM sl_do A, sl_do_item B, sl_do_product C, m_product D, m_product_custom E
  385.     WHERE A.do_id = vDoId AND
  386.         A.do_id = B.do_id AND
  387.         B.do_item_id = C.do_item_id AND
  388.         C.product_id = D.product_id AND
  389.         D.product_id = E.product_id AND
  390.         E.flg_buy_konsinyasi = 'Y'
  391.     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,
  392.             C.product_id, C.product_balance_id, A.warehouse_id, C.product_status, C.base_uom_id;
  393.            
  394.    
  395.     INSERT INTO in_balance_do_item
  396.     (do_item_id, tenant_id, ou_id, do_id, doc_no, doc_date, partner_id,
  397.       so_id, so_no, so_date, so_item_id,
  398.       qty_dlv, qty_return, so_uom_id, qty_dlv_int,  
  399.       qty_return_int, base_uom_id, status_item,
  400.       "version", create_datetime, create_user_id, update_datetime, update_user_id)
  401.     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,
  402.             A.ref_id, C.doc_no, C.doc_date, B.ref_id,
  403.             SUM(B.qty_dlv_so), 0, B.so_uom_id, SUM(B.qty_dlv_int),
  404.             0, B.base_uom_id, vStatusRelease,
  405.         0, vDatetime, vUserId, vDatetime, vUserId      
  406.     FROM sl_do A, sl_do_item B, sl_so C
  407.     WHERE A.do_id = vDoId AND
  408.         A.do_id = B.do_id AND
  409.         A.ref_id = C.so_id
  410.     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,
  411.         A.ref_id, C.doc_no, C.doc_date, B.ref_id, B.so_uom_id, B.base_uom_id;
  412.    
  413.     UPDATE sl_so_balance_item SET status_item = vStatusRelease, update_datetime = vDatetime, update_user_id = vUserId
  414.     FROM sl_do_item A
  415.     WHERE sl_so_balance_item.so_item_id = A.ref_id AND
  416.         sl_so_balance_item.tenant_id = A.tenant_id AND
  417.         A.do_id = vDoId AND
  418.         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;
  419.  
  420.     UPDATE sl_so_balance_item SET status_item = vStatusFinal, update_datetime = vDatetime, update_user_id = vUserId
  421.     FROM sl_do_item A
  422.     WHERE sl_so_balance_item.so_item_id = A.ref_id AND
  423.         sl_so_balance_item.tenant_id = A.tenant_id AND
  424.         A.do_id = vDoId AND
  425.         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;
  426.        
  427.     SELECT COUNT(1) INTO vUnfinishedItem
  428.     FROM sl_so_balance_item A, sl_so_item B
  429.     WHERE A.so_item_id = B.so_item_id AND
  430.         B.so_id = vSoId AND
  431.         A.status_item = vStatusRelease;
  432.        
  433.     IF vUnfinishedItem = 0 THEN
  434.         UPDATE sl_so SET status_doc = vStatusFinal
  435.         WHERE so_id = vSoId;
  436.     END IF;
  437.    
  438.    
  439.          
  440.    
  441.     INSERT INTO tt_pu_po_balance_item_consignment_sold(
  442.             session_id, tenant_id, po_id, po_item_id, so_id, so_item_id,
  443.             normal_price, sold_price, discount, margin_internal, margin_supp,
  444.             sold_price_after_margin, qty_so, qty_return)
  445.     SELECT pSessionId, pTenantId, B.po_id, B.po_item_id, C.so_id, C.so_item_id,
  446.       B.gross_price_po, C.gross_sell_price,
  447.       0 AS discount,
  448.       0 AS margin_internal,
  449.       0 AS margin_supp,
  450.       0 AS sold_price_after_margin,
  451.       qty_so,
  452.       0 AS qty_return
  453.       FROM pu_po_balance_item_consignment A
  454.       JOIN pu_po_item B ON  A.po_item_id = B.po_item_id AND A.status_item IN ('R', 'I')
  455.       JOIN pu_po G ON G.po_id = B.po_id
  456.       RIGHT JOIN sl_so_item C ON C.product_id = B.product_id
  457.       JOIN m_product_custom E ON C.product_id = E.product_id
  458.       JOIN m_product F ON F.product_id=C.product_id
  459.       RIGHT JOIN sl_so D ON C.so_id=D.so_id
  460.       WHERE
  461.       C.so_id = pSoId AND
  462.       flg_buy_konsinyasi = 'Y' AND
  463.       gross_price_po IS NULL;
  464.    
  465.     IF EXISTS ( SELECT 1 FROM tt_pu_po_balance_item_consignment_sold WHERE session_id = pSessionId AND tenant_id = pTenantId AND so_id = pSoId ) THEN
  466.                 DELETE FROM tt_pu_po_balance_item_consignment_sold  WHERE session_id = pSessionId AND tenant_id = pTenantId AND so_id = pSoId;
  467.  
  468.         RAISE EXCEPTION 'Order Magento % cannot be processed ', vSoNo
  469.         USING HINT = 'There is sold product with no purchase data';
  470.     ELSE
  471.                 DELETE FROM tt_pu_po_balance_item_consignment_sold  WHERE session_id = pSessionId AND tenant_id = pTenantId AND so_id = pSoId;
  472.        
  473.     END IF;
  474.    
  475.         INSERT INTO tt_pu_po_balance_item_consignment_sold(
  476.             session_id, tenant_id, supplier_id, po_id, po_item_id, so_id, so_item_id,
  477.             normal_price, sold_price, discount, margin_internal, margin_supp,
  478.             sold_price_after_margin, qty_so, qty_return, remark)
  479.     SELECT pSessionId, pTenantId, G.partner_id, B.po_id, B.po_item_id, C.so_id, C.so_item_id,
  480.       B.gross_price_po, C.gross_sell_price,
  481.       0 AS discount,
  482.       0 AS margin_internal,
  483.       0 AS margin_supp,
  484.       0 AS sold_price_after_margin,
  485.       qty_so,
  486.       0 AS qty_return,
  487.       '' AS remark
  488.       FROM pu_po_balance_item_consignment A
  489.       JOIN pu_po_item B ON  A.po_item_id = B.po_item_id AND A.status_item IN ('R', 'I')
  490.       JOIN pu_po G ON G.po_id = B.po_id
  491.       JOIN sl_so_item C ON C.product_id = B.product_id
  492.       JOIN m_product_custom E ON C.product_id = E.product_id
  493.       JOIN m_product F ON F.product_id=C.product_id
  494.       JOIN sl_so D ON C.so_id=D.so_id
  495.       WHERE
  496.       C.so_id = pSoId AND
  497.       flg_buy_konsinyasi = 'Y' AND gross_price_po IS NOT NULL;
  498.    
  499.  
  500.         UPDATE tt_pu_po_balance_item_consignment_sold
  501.     SET discount = ((normal_price-sold_price)/normal_price)*100
  502.     WHERE session_id = pSessionId AND tenant_id = pTenantId AND so_id = pSoId;
  503.  
  504.         UPDATE tt_pu_po_balance_item_consignment_sold W SET
  505.       margin_internal = Z.internal_percentage,
  506.       margin_supp = Z.supplier_percentage
  507.     FROM
  508.     (select B.session_id, B.tenant_id, B.po_id, B.po_item_id, B.so_item_id, A.internal_percentage, A.supplier_percentage
  509.     from pr_m_margin_sell_price A JOIN tt_pu_po_balance_item_consignment_sold B ON A.partner_id = B.supplier_id
  510.     WHERE discount BETWEEN disc_from AND disc_to ) Z
  511.     WHERE
  512.     W.session_id = Z.session_id
  513.     AND W.tenant_id = Z.tenant_id
  514.     AND W.po_id = Z.po_id
  515.     AND W.po_item_id = Z.po_item_id
  516.     AND W.so_item_id = Z.so_item_id;
  517.  
  518.     UPDATE tt_pu_po_balance_item_consignment_sold SET
  519.       remark = 'MARGIN NOT SET UP'
  520.     WHERE session_id = pSessionId
  521.     AND tenant_id = pTenantId
  522.     AND margin_internal=0
  523.     AND margin_supp=0;
  524.      
  525.  
  526.         UPDATE tt_pu_po_balance_item_consignment_sold SET sold_price_after_margin = margin_supp * 0.01 * sold_price
  527.     WHERE session_id = pSessionId AND tenant_id = pTenantId;
  528.    
  529.         INSERT INTO pu_po_balance_item_consignment_sold(
  530.             tenant_id, supplier_id, po_id, po_item_id, so_id, so_item_id,
  531.             normal_price, normal_price_correction, sold_price, sold_price_used, discount, margin_internal, margin_supp, margin_supp_correction,
  532.             sold_price_after_margin, qty_so, qty_return, version, create_datetime, create_user_id, update_datetime, update_user_id, remark)
  533.     SELECT tenant_id, supplier_id, po_id, po_item_id, so_id, so_item_id,
  534.         normal_price, normal_price, sold_price, sold_price, discount, margin_internal, margin_supp, margin_supp,
  535.         sold_price_after_margin, qty_so, qty_return, 0, vDatetime, vUserId, vDatetime, vUserId, remark
  536.     FROM tt_pu_po_balance_item_consignment_sold
  537.     WHERE session_id = pSessionId AND tenant_id = pTenantId;
  538.  
  539.     DELETE FROM tt_pu_po_balance_item_consignment_sold WHERE session_id = pSessionId AND tenant_id = pTenantId;
  540.    
  541.    
  542.    
  543.     INSERT INTO tt_do_po_item_consignment
  544.     (session_id, doc_type_id, do_id, do_item_id,
  545.      po_id, po_item_id, remark,
  546.      qty_po, qty_sell, po_uom_id,  
  547.        qty_int_po, qty_int_sell, base_uom_id)
  548.       SELECT pSessionId, A.doc_type_id, A.do_id, B.do_item_id,
  549.           C.po_id, C.po_item_id, B.remark,
  550.         D.qty_po, B.qty_dlv_int * D.qty_po / D.qty_int_po, D.po_uom_id,
  551.         D.qty_int_po, B.qty_dlv_int, D.base_uom_id        
  552.       FROM sl_do A, sl_do_item B, pu_po_balance_item_consignment_sold C, pu_po_balance_item_consignment D
  553.       WHERE A.do_id = vDoId AND
  554.           A.do_id = B.do_id AND
  555.           A.ref_id = C.so_id AND
  556.           B.ref_id = C.so_item_id AND
  557.           C.po_item_id = D.po_item_id;
  558.                  
  559.     UPDATE pu_po_balance_item_consignment B SET
  560.            qty_int_sell = B.qty_int_sell + A.qty_int_sell, qty_sell = B.qty_sell + A.qty_sell,
  561.            version = B.version + 1, update_datetime = vDatetime, update_user_id = vUserId
  562.     FROM tt_do_po_item_consignment A
  563.     WHERE A.session_id = pSessionId AND
  564.         B.po_item_id = A.po_item_id;
  565.        
  566.        
  567.       INSERT INTO pu_log_po_balance_item_consignment
  568.       (tenant_id, po_id, po_item_id, ref_doc_type_id, ref_id, ref_item_id,
  569.        qty_trx, trx_uom_id, qty_int, base_uom_id, remark,
  570.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  571.     SELECT pTenantId, A.po_id, A.po_item_id, A.doc_type_id, A.do_id, A.do_item_id,
  572.         A.qty_sell, A.po_uom_id, A.qty_int_sell, A.base_uom_id, A.remark,
  573.         0, vDatetime, vUserId, vDatetime, vUserId
  574.     FROM tt_do_po_item_consignment A
  575.     WHERE A.session_id = pSessionId;
  576.    
  577.    
  578.     SELECT A.ref_id, f_get_ou_bu_structure(A.ou_id) AS ou, f_get_document_journal(A.doc_type_id) AS doc
  579.     FROM sl_do A
  580.     WHERE A.do_id = vDoId INTO result;
  581.    
  582.     vSoId := result.ref_id;
  583.     vOuStructure := result.ou;
  584.     vDocJournal := result.doc;      
  585.  
  586.     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)
  587.     FROM sl_do A
  588.     WHERE A.do_id = vDoId;
  589.    
  590.     SELECT NEXTVAL('gl_journal_trx_seq') INTO vJournalTrxId;
  591.    
  592.     INSERT INTO gl_journal_trx
  593.     (journal_trx_id, tenant_id, journal_type, doc_type_id, doc_id, doc_no, doc_date,
  594.       ou_bu_id, ou_branch_id, ou_sub_bu_id, partner_id, cashbank_id, warehouse_id, ext_doc_no, ext_doc_date,
  595.       ref_doc_type_id, ref_id, due_date, curr_code, remark, status_doc, workflow_status,
  596.       "version", create_datetime, create_user_id, update_datetime, update_user_id)
  597.       SELECT vJournalTrxId, A.tenant_id, (vDocJournal).journal_type, A.doc_type_id, A.do_id, A.doc_no, A.doc_date,
  598.           (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,
  599.           A.ref_doc_type_id, A.ref_id, A.doc_date, B.curr_code, A.remark, vStatusDraft, 'DRAFT',
  600.           0, vDatetime, vUserId, vDatetime, vUserId
  601.       FROM sl_do A, sl_so B
  602.       WHERE A.do_id = vDoId AND
  603.           A.ref_doc_type_id = B.doc_type_id AND
  604.           A.ref_id = B.so_id;
  605.      
  606.     INSERT INTO tt_journal_trx_item
  607.     (session_id, tenant_id, journal_trx_id, line_no,
  608.     ref_doc_type_id, ref_id,
  609.     partner_id, product_id, cashbank_id, ou_rc_id,
  610.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  611.     coa_id, curr_code, qty, uom_id,
  612.     amount, journal_date, type_rate,
  613.     numerator_rate, denominator_rate, journal_desc, remark)
  614.     SELECT pSessionId, A.tenant_id, vJournalTrxId, 1,
  615.         A.doc_type_id, B.do_item_id,
  616.         A.partner_ship_to_id, B.product_id, vEmptyId, vEmptyId,
  617.         vEmptyId, vSignCredit, vProductCOA, vEmptyId,
  618.         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,
  619.         0, A.doc_date, vTypeRate,
  620.         1, 1, 'PRODUCT_STOCK', B.remark
  621.     FROM sl_do A, sl_do_item B, sl_so_item C
  622.     WHERE A.do_id = vDoId AND
  623.         A.do_id = B.do_id AND
  624.         B.ref_id = C.so_item_id;
  625.        
  626.     INSERT INTO gl_journal_trx_item
  627.     (tenant_id, journal_trx_id, line_no,
  628.     ref_doc_type_id, ref_id,
  629.     partner_id, product_id, cashbank_id, ou_rc_id,
  630.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  631.     coa_id, curr_code, qty, uom_id,
  632.     amount, journal_date, type_rate,
  633.     numerator_rate, denominator_rate, journal_desc, remark,
  634.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  635.     SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id),
  636.         A.ref_doc_type_id, A.ref_id,
  637.         A.partner_id, A.product_id, A.cashbank_id, A.ou_rc_id,
  638.         A.segmen_id, A.sign_journal, A.flg_source_coa, A.activity_gl_id,
  639.         A.coa_id, A.curr_code, A.qty, A.uom_id,
  640.         A.amount, A.journal_date, A.type_rate,
  641.         A.numerator_rate, A.denominator_rate, A.journal_desc, A.remark,
  642.         0, vDatetime, vUserId, vDatetime, vUserId
  643.     FROM tt_journal_trx_item A
  644.     WHERE A.session_id = pSessionId;
  645.    
  646.     INSERT INTO gl_journal_trx_mapping
  647.     (tenant_id, journal_trx_id, line_no,
  648.     ref_doc_type_id, ref_id,
  649.     partner_id, product_id, cashbank_id, ou_rc_id,
  650.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  651.     coa_id, curr_code, qty, uom_id,
  652.     amount, journal_date, type_rate,
  653.     numerator_rate, denominator_rate, journal_desc, remark,
  654.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  655.     SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id ),
  656.         vEmptyId, vEmptyId,  
  657.         vEmptyId, vEmptyId, vEmptyId, vEmptyId,
  658.         vEmptyId, vSignDebit, vSystemCOA, vEmptyId,
  659.         f_get_system_coa_by_group_coa(A.tenant_id, 'HargaPokokPenjualan'), f_get_value_system_config_by_param_code(pTenantId, 'ValutaBuku'), 0, vEmptyId,
  660.         0, A.journal_date, A.type_rate,
  661.         1, 1, 'COGS', vEmptyValue,
  662.         0, vDatetime, vUserId, vDatetime, vUserId
  663.     FROM tt_journal_trx_item A
  664.     WHERE A.session_id = pSessionId
  665.     GROUP BY A.tenant_id, A.journal_trx_id, A.journal_date, A.type_rate;
  666.          
  667.     DELETE FROM tt_journal_trx_item WHERE session_id = pSessionId;  
  668.  
  669. END;
  670. $BODY$
  671.   LANGUAGE plpgsql VOLATILE
  672.   COST 100;
  673.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement