Advertisement
aadddrr

r_print_purchase_order

Jul 5th, 2017
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION r_print_purchase_order(character varying, bigint, bigint, bigint, character varying, bigint, character varying, character varying, character varying)
  2.   RETURNS SETOF refcursor AS
  3. $BODY$
  4. DECLARE
  5.         pRefHeader                              REFCURSOR := 'refHeader';
  6.         pRefDetail                              REFCURSOR := 'refDetail';
  7.         pSessionId                              ALIAS FOR $1;
  8.         pTenantId                               ALIAS FOR $2;
  9.         pUserId                                 ALIAS FOR $3;
  10.         pRoleId                                 ALIAS FOR $4;
  11.         pDatetime                               ALIAS FOR $5;
  12.         pPoId                                   ALIAS FOR $6;
  13.         pApprovalName                   ALIAS FOR $7;
  14.         pPreparedBy                             ALIAS FOR $8;
  15.         pSupplierCp                             ALIAS FOR $9;
  16.        
  17.         vReportName                             character varying;
  18.         vSubTotal                               numeric;
  19.         vPpn                                    numeric;
  20.         vTotal                                  numeric;
  21.         vTotalQty                               numeric;
  22.         vEmptyId                                bigint;
  23.         vKeySignApprovalName    character varying;
  24.         vKeySignPreparedBy              character varying;
  25.        
  26.         vOuBuInfoReport                 OU_INFO_REPORT%ROWTYPE;
  27.         result                                  record;
  28.        
  29.         vTermOfPaymentCode              character varying := ' ';
  30.         vTermOfPayment                  character varying := '-';
  31.        
  32.         vTotalHargaBeli             numeric;
  33.     vTotalPotongan              numeric;
  34.     vTotalSetelahPotongan           numeric;
  35.     vTotalDPP               numeric;
  36.     vTotalPPN               numeric;
  37.     vTotalDPPdanPPN             numeric;
  38.     vIncludeTax         character varying;
  39.  
  40.     vOuBuId             bigint;
  41.        
  42. BEGIN
  43.         vReportName := 'FormPurchaseOrder';
  44.         vEmptyId := -99;
  45.        
  46.         SELECT f_get_ou_bu_info_report(pTenantId, A.ou_id) AS info
  47.         FROM pu_po A
  48.         WHERE A.po_id = pPoId INTO result ;
  49.  
  50.         vOuBuInfoReport := result.info;
  51.  
  52.         vOuBuId := vOuBuInfoReport.ou_id;
  53.        
  54.         vKeySignApprovalName := 'path.sign.'||lower(replace(trim(pApprovalName), ' ', '_'));
  55.         vKeySignPreparedBy := 'path.sign.'||lower(replace(trim(pPreparedBy), ' ', '_'));
  56.  
  57.         -- Untuk PO Item sudah dijaga include tax atau tidak semuanya sama
  58.         SELECT flg_tax_amount INTO vIncludeTax FROM pu_po_item WHERE po_id = pPoId LIMIT 1;
  59.        
  60.         -- Tambahan data summary
  61.         SELECT COALESCE(SUM(A.gross_item_amount),0) INTO vTotalHargaBeli
  62.         FROM pu_po_item A
  63.     WHERE A.po_id = pPoId;
  64.  
  65.     SELECT SUM(discount_amount * qty_int) INTO vTotalPotongan
  66.         FROM pu_po_item A
  67.     WHERE A.po_id = pPoId;
  68.  
  69.     SELECT vTotalHargaBeli - vTotalPotongan INTO vTotalSetelahPotongan;
  70.    
  71.     IF vIncludeTax = 'Y' THEN
  72.         SELECT COALESCE(SUM(A.nett_item_amount),0) INTO vTotalDPP
  73.             FROM pu_po_item A
  74.         WHERE A.po_id = pPoId;
  75.        
  76.         SELECT COALESCE(SUM(A.tax_amount),0) INTO vTotalPPN
  77.             FROM pu_po_item A
  78.         WHERE A.po_id = pPoId;     
  79.     ELSE
  80.         vTotalDPP := vTotalSetelahPotongan;
  81.         SELECT COALESCE(SUM(A.tax_amount),0) INTO vTotalPPN
  82.             FROM pu_po_item A
  83.         WHERE A.po_id = pPoId;     
  84.     END IF;
  85.  
  86.     SELECT vTotalDPP + vTotalPPN INTO vTotalDPPdanPPN;
  87.        
  88.         /* get sub total */
  89.         SELECT COALESCE(SUM(a.nett_item_amount), 0) INTO vSubTotal
  90.         FROM pu_po_item A
  91.         LEFT OUTER JOIN pu_po_balance_item E ON A.po_item_id=E.po_item_id
  92.         WHERE A.po_id = pPoId
  93.                 AND COALESCE(E.qty_int_po+E.qty_int_add-E.qty_int_cancel,A.qty_int) > 0;
  94.  
  95.         -- Get total Item
  96.         SELECT SUM( COALESCE(E.qty_int_po+E.qty_int_add-E.qty_int_cancel,A.qty_int) ) INTO vTotalQty
  97.         FROM pu_po_item A
  98.         LEFT OUTER JOIN pu_po_balance_item E ON A.po_item_id=E.po_item_id
  99.         WHERE A.po_id = pPoId
  100.         AND COALESCE(E.qty_int_po+E.qty_int_add-E.qty_int_cancel,A.qty_int) > 0;
  101.                
  102.         /* get ppn */
  103.         /* David, 4 Februari 2015 : tidak boleh gunakan cara ini, bisa selisih karena ada pembulatan
  104.          * SELECT COALESCE(SUM(A.tax_amount),0) INTO vPpn
  105.         FROM pu_po_item A
  106.         WHERE A.po_id = pPoId;
  107.         */
  108.        
  109.         IF EXISTS(SELECT 1 FROM pu_po_item WHERE po_id = pPoId AND tax_percentage <> 0) THEN
  110.                 SELECT COALESCE(f_tax_rounding(pTenantId, vSubTotal, a.tax_percentage), 0) INTO vPpn
  111.                 FROM pu_po_item A WHERE A.po_id = pPoId
  112.                 AND A.tax_percentage <> 0
  113.                 GROUP BY A.tax_percentage;
  114.         ELSE
  115.                 vPpn = 0;
  116.         END IF;
  117.        
  118.         /* get total */
  119.         SELECT (vSubTotal + vPpn) INTO vTotal;
  120.        
  121.         /* get term of payment code */
  122.         SELECT A.top_code INTO vTermOfPaymentCode
  123.         FROM pu_po A
  124.         INNER JOIN t_combo_value B ON B.combo_id = 'TERMOFPAYMENT' AND A.top_code = B.code
  125.         WHERE A.po_id = pPoId;
  126.        
  127.         /* get term of payment */
  128.         IF (vTermOfPaymentCode = 'COD') THEN
  129.                 vTermOfPayment := 'COD';
  130.         ELSEIF (vTermOfPaymentCode = 'T7D') THEN
  131.                 vTermOfPayment := '7 Days';
  132.         ELSEIF (vTermOfPaymentCode = 'T14D') THEN
  133.                 vTermOfPayment := '14 Days';
  134.         ELSEIF (vTermOfPaymentCode = 'T15D') THEN
  135.                 vTermOfPayment := '15 Days';
  136.         ELSEIF (vTermOfPaymentCode = 'T21D') THEN
  137.                 vTermOfPayment := '21 Days';
  138.         ELSEIF (vTermOfPaymentCode = 'T30D') THEN
  139.                 vTermOfPayment := '30 Days';
  140.         ELSEIF (vTermOfPaymentCode = 'T45D') THEN
  141.                 vTermOfPayment := '45 Days';
  142.         ELSEIF (vTermOfPaymentCode = 'T60D') THEN
  143.                 vTermOfPayment := '60 Days';
  144.         ELSE
  145.                 vTermOfPayment := '-';
  146.         END IF;
  147.        
  148.         Open pRefHeader FOR
  149.         SELECT A.po_id, A.doc_no, A.doc_date, A.ou_id, COALESCE(B.npwp_name, f_get_ou_name(vOuBuInfoReport.ou_id)) AS ou_name,
  150.                    (f_get_report_parameter_config_value(pTenantId, vReportName, vOuBuId, 'address1') || ' ' || f_get_report_parameter_config_value(pTenantId, vReportName, vOuBuId, 'address2') || ' ' || f_get_report_parameter_config_value(pTenantId, vReportName, vOuBuId, 'address3')) AS ou_addr_1,
  151.                    (f_get_report_parameter_config_value(pTenantId, vReportName, vOuBuId, 'city') || ', ' || f_get_report_parameter_config_value(pTenantId, vReportName, vOuBuId, 'state_or_province') || ', ' || f_get_report_parameter_config_value(pTenantId, vReportName, vOuBuId, 'zip_code')) AS ou_addr_2, COALESCE(B.npwp_no, ' ') AS ou_npwp,
  152.                    (vOuBuInfoReport.phone1) AS ou_phone, (vOuBuInfoReport.fax1) AS ou_fax, COALESCE(B.flg_pkp, 'N') AS flg_ppn, A.partner_id,
  153.                    CONCAT(f_get_partner_code(A.partner_id), ' - ', f_get_partner_name(A.partner_id)) AS supplier_name,
  154.                    COALESCE(C.partner_address_id, vEmptyId) AS partner_address_id,
  155.                    COALESCE(C.address1, ' ') AS supplier_addr_1, COALESCE(C.address2, ' ') || COALESCE(C.address3, ' ') AS supplier_addr_2, pSupplierCp AS supplier_cp,
  156.                    COALESCE(C.phone1, ' ') AS supplier_phone, COALESCE(C.fax1, ' ') AS supplier_fax, vEmptyId AS partner_cp_id,
  157.                    A.remark, A.flg_delivery, A.curr_code, A.top_code, vTermOfPayment AS term_of_payment, A.purchaser_id, pPreparedBy AS prepared_by,
  158.                    pApprovalName AS approval_name, vSubTotal AS sub_total, vPpn AS ppn, vTotal AS total, COALESCE(vTotalQty, 0) AS total_qty,
  159.                    lower(terbilang(vTotal)) AS total_name,      (CASE WHEN A.curr_code = 'IDR' THEN 'rupiah' ELSE A.curr_code END) AS curr_name,
  160.                    f_get_report_parameter_config_value(pTenantId, vReportName, A.ou_id, vKeySignApprovalName) AS path_sign_approval,
  161.                    f_get_report_parameter_config_value(pTenantId, vReportName, A.ou_id, vKeySignPreparedBy) AS path_sign_prepared_by,
  162.                    vOuBuInfoReport.image_url AS path_logo_ou,
  163.                    pDatetime AS datetime,
  164.            vTotalHargaBeli as total_harga_beli,
  165.            vTotalPotongan as total_potongan,
  166.            vTotalSetelahPotongan as total_setelah_potongan,
  167.            vTotalDPP as dpp,
  168.            vTotalPPN as ppn,
  169.            vTotalDPPdanPPN as total_bayar,
  170.            D.warehouse_name as nama_gudang,
  171.                    D.address1 as alamat_gudang_1,
  172.                    D.address2 as alamat_gudang_2,
  173.                    D.city as kota_gudang,
  174.                    D.zip_code as kode_pos_gudang,
  175.                    D.phone1 as telepon_gudang,
  176.                    D.fax1 as fax_gudang
  177.        
  178.         FROM pu_po A
  179.         LEFT OUTER JOIN t_ou_legal B ON A.ou_id = B.ou_id
  180.         LEFT OUTER JOIN m_partner_address C ON A.partner_id = C.partner_id AND C.flg_official = 'Y'
  181.                 INNER JOIN m_warehouse D ON A.warehouse_id = D.warehouse_id
  182.         WHERE A.po_id = pPoId;
  183.        
  184.         RETURN NEXT pRefHeader;
  185.        
  186.         Open pRefDetail FOR    
  187.         SELECT '1' AS grouping, A.po_item_id, A.po_id, A.product_id, C.product_code, C.product_name, A.curr_code,
  188.         A.gross_price_po AS price,
  189.         COALESCE(E.qty_int_po+E.qty_int_add-E.qty_int_cancel,A.qty_int) AS qty,
  190.         COALESCE(E.qty_int_po+E.qty_int_add-E.qty_int_cancel,A.qty_int) * A.gross_price_po AS amount, A.base_uom_id, D.uom_name,
  191.         (f_get_product_warranty_service(A.product_id) :: integer) AS warranty,
  192.         f_get_product_specs(A.product_id) AS product_specs, A.discount_percentage, A.nett_item_amount,
  193.         COALESCE(E.qty_int_po+E.qty_int_add-E.qty_int_cancel,A.qty_int) * A.discount_amount AS total_discount_amount
  194.         FROM pu_po_item A
  195.                 INNER JOIN pu_po B ON A.tenant_id = B.tenant_id AND A.po_id = B.po_id
  196.                 LEFT OUTER JOIN pu_po_balance_item E ON A.po_item_id=E.po_item_id
  197.                 INNER JOIN m_product C ON A.tenant_id = C.tenant_id AND A.product_id = C.product_id
  198.                 INNER JOIN m_uom D ON A.tenant_id = D.tenant_id AND A.base_uom_id = D.uom_id
  199.         WHERE A.po_id = pPoId AND
  200.                 COALESCE(E.qty_int_po+E.qty_int_add-E.qty_int_cancel,A.qty_int) > 0
  201.         ORDER BY A.line_no;
  202.                
  203.         RETURN NEXT pRefDetail;
  204.        
  205. END;
  206. $BODY$
  207.   LANGUAGE plpgsql VOLATILE
  208.   COST 100
  209.   ROWS 1000;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement