this is done
SET SERVEROUTPUT ON set serveroutput on size 1000000; DECLARE P_SI_RECID SALE_INVOICE.SI_RECID%TYPE := 20000005797050 ; SALE_INVOICE_ROW VW_GST_SALE_INVOICES%ROWTYPE; CUSTOMER_ROW CUSTOMERS%ROWTYPE; CUST_STATE_ROW STATES%ROWTYPE; CO_STATE_ROW STATES%ROWTYPE; BEGIN APEX_JSON.initialize_clob_output; APEX_JSON.open_object; --{ main SELECT S.* INTO SALE_INVOICE_ROW FROM VW_GST_SALE_INVOICES S WHERE S.DOCUMENT_RECID = P_SI_RECID; SELECT C.* INTO CUSTOMER_ROW FROM CUSTOMERS C WHERE COMPANY = SALE_INVOICE_ROW.COMPANY_CODE AND CUSTOMER_CODE = SALE_INVOICE_ROW.PARTY_CODE; SELECT S.* INTO CUST_STATE_ROW FROM STATES S WHERE STATE_CODE = CUSTOMER_ROW.STATE_CODE AND COUNTRY_CODE = CUSTOMER_ROW.COUNTRY_CODE; SELECT S.* INTO CO_STATE_ROW FROM STATES S WHERE STATE_CODE = PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'STATE_CODE') AND COUNTRY_CODE = PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'COUNTRY_CODE'); APEX_JSON.write('$schema', 'http://json-schema.org/draft-07/schema#'); APEX_JSON.write('Title', 'GST-India Invoice Document '); APEX_JSON.write('Description', 'GST Invoice format for IRN Generation in INDIA'); APEX_JSON.write('TaxSch', 'GST'); APEX_JSON.write('Version', '1.01'); APEX_JSON.write('Irn', 'XXX-64-XXX'); APEX_JSON.open_object('TranDtls'); --{ APEX_JSON.write('TaxSch', 'GST'); APEX_JSON.write('RegRev', 'Y'); APEX_JSON.write('SupTyp', CASE WHEN SALE_INVOICE_ROW.CUSTOMER_TYPE='E' THEN 'DEXP' ELSE 'B2B' END); APEX_JSON.close_object; -- } TransDtls APEX_JSON.open_object('DocDtls'); --{ APEX_JSON.write('Typ', 'INV'); APEX_JSON.write('No',SALE_INVOICE_ROW.DOCUMENT_TYPE||'/'||SALE_INVOICE_ROW.DOCUMENT_SERIES||'/'||SALE_INVOICE_ROW.DOCUMENT_NUMBER); APEX_JSON.write('Dt', TO_CHAR(SALE_INVOICE_ROW.DOCUMENT_DATE,'DD/MM/YYYY')); APEX_JSON.close_object; --} DocDtls APEX_JSON.open_object('SellerDtls'); --{ APEX_JSON.write('Gstin', PKG_CONTROLS.GET_REGN_NUMBER(SALE_INVOICE_ROW.COMPANY_CODE,'GST')); APEX_JSON.write('LglNm', PKG_REPORTS.GET_COMPANY_NAME(SALE_INVOICE_ROW.COMPANY_CODE,',')); APEX_JSON.write('Addr1', PKG_REPORTS.GET_COMPANY_ADDRESS(SALE_INVOICE_ROW.COMPANY_CODE)); APEX_JSON.write('Loc', PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'LOCATION_NAME')); APEX_JSON.write('Dst', PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'DISTRICT_CODE')); APEX_JSON.write('Pin', to_number(PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'POSTAL_CODE'))); APEX_JSON.write('State', PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'STATE_NAME')); APEX_JSON.close_object; --} SellerDtls APEX_JSON.open_object('BuyerDtls');--{ APEX_JSON.write('Gstin', PKG_AR.GET_REGN_NUMBER(SALE_INVOICE_ROW.COMPANY_CODE,SALE_INVOICE_ROW.PARTY_CODE,'GST')); APEX_JSON.write('LglNm', PKG_AR.GET_CUSTOMER_NAME(SALE_INVOICE_ROW.PARTY_CODE)); APEX_JSON.write('Addr1', PKG_AR.GET_CUSTOMER_ADDRESS(SALE_INVOICE_ROW.PARTY_CODE,SALE_INVOICE_ROW.ADDRESS_CODE)); APEX_JSON.write('Loc', PKG_AR.GET_STATION_NAME(SALE_INVOICE_ROW.PARTY_CODE)); APEX_JSON.write('Pin', to_number(CUSTOMER_ROW.POSTAL_CODE)); APEX_JSON.write('State', PKG_AR.GET_STATE_NAME(SALE_INVOICE_ROW.PARTY_CODE)); APEX_JSON.close_object; --} BuyerDtls APEX_JSON.open_object('ItemList'); --{ APEX_JSON.open_array('ITEM'); --[ FOR cur_rec IN (SELECT * FROM VW_GST_INVOICE_ITEMS I WHERE I.PARENT_RECID = P_SI_RECID ) LOOP APEX_JSON.open_object; --{ APEX_JSON.write('SlNo', cur_rec.SEQ_NUMBER); APEX_JSON.write('PrdDesc', cur_rec.STOCK_NAME); APEX_JSON.write('HsnCd', cur_rec.EXCISE_TARIFF); APEX_JSON.write('Qty', cur_rec.NO_OF_PACKS); APEX_JSON.write('FreeQty', 0); APEX_JSON.write('Unit', /*cur_rec.IUOM_CODE*/ 'NOS'); APEX_JSON.write('UnitPrice', cur_rec.NET_PRICE); APEX_JSON.write('TotAmt', cur_rec.ITEM_VALUE); APEX_JSON.write('Discount', NVL(cur_rec.NDIS_AMOUNT,0)+NVL(cur_rec.TDIS_AMOUNT,0)+NVL(cur_rec.SDIS_AMOUNT,0)); APEX_JSON.write('OthChrg', 0); APEX_JSON.write('AssAmt', cur_rec.COST_AMOUNT); APEX_JSON.write('CgstRt', cur_rec.CGST_RATE); APEX_JSON.write('SgstRt', cur_rec.SGST_RATE); APEX_JSON.write('IgstRt', cur_rec.IGST_RATE); APEX_JSON.write('CesRt', cur_rec.CESS_RATE); APEX_JSON.write('CesNonAdval', cur_rec.CESS_ON_QTY); APEX_JSON.write('StateCes', 0); APEX_JSON.write('TotItemVal', cur_rec.ITEM_VALUE); APEX_JSON.close_object; --} ITEM END LOOP; APEX_JSON.close_array; --] APEX_JSON.close_object; --} ItemList APEX_JSON.open_object('ValDtls'); --{ APEX_JSON.write('AssVal', SALE_INVOICE_ROW.COST_OF_GOODS); APEX_JSON.write('CgstVal', SALE_INVOICE_ROW.CGST_AMOUNT); APEX_JSON.write('SgstVal', SALE_INVOICE_ROW.SGST_AMOUNT); APEX_JSON.write('IgstVal', SALE_INVOICE_ROW.IGST_AMOUNT); APEX_JSON.write('CesVal', SALE_INVOICE_ROW.CESS_AMOUNT); APEX_JSON.write('StCesVal', 0); APEX_JSON.write('CesNonAdVal',SALE_INVOICE_ROW.CESS_ON_QTY); APEX_JSON.write('TotInvVal', SALE_INVOICE_ROW.VALUE_OF_INVOICE); APEX_JSON.close_object; --} ValDtls DELETE JSON_INVOICE_DOCUMENT; INSERT INTO JSON_INVOICE_DOCUMENT (INV_DOC) VALUES(APEX_JSON.get_clob_output); DBMS_OUTPUT.put_line(APEX_JSON.get_clob_output); APEX_JSON.close_object; --} main APEX_JSON.free_output; END;
SET SERVEROUTPUT ON set serveroutput on size 1000000; DECLARE P_SI_RECID SALE_INVOICE.SI_RECID%TYPE := 20000005797050 ; SALE_INVOICE_ROW VW_GST_SALE_INVOICES%ROWTYPE; CUSTOMER_ROW CUSTOMERS%ROWTYPE; CUST_STATE_ROW STATES%ROWTYPE; CO_STATE_ROW STATES%ROWTYPE; BEGIN APEX_JSON.initialize_clob_output; APEX_JSON.open_object; --{ main SELECT S.* INTO SALE_INVOICE_ROW FROM VW_GST_SALE_INVOICES S WHERE S.DOCUMENT_RECID = P_SI_RECID; SELECT C.* INTO CUSTOMER_ROW FROM CUSTOMERS C WHERE COMPANY = SALE_INVOICE_ROW.COMPANY_CODE AND CUSTOMER_CODE = SALE_INVOICE_ROW.PARTY_CODE; SELECT S.* INTO CUST_STATE_ROW FROM STATES S WHERE STATE_CODE = CUSTOMER_ROW.STATE_CODE AND COUNTRY_CODE = CUSTOMER_ROW.COUNTRY_CODE; SELECT S.* INTO CO_STATE_ROW FROM STATES S WHERE STATE_CODE = PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'STATE_CODE') AND COUNTRY_CODE = PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'COUNTRY_CODE'); APEX_JSON.write('$schema', 'http://json-schema.org/draft-07/schema#'); APEX_JSON.write('Title', 'GST-India Invoice Document '); APEX_JSON.write('Description', 'GST Invoice format for IRN Generation in INDIA'); APEX_JSON.write('TaxSch', 'GST'); APEX_JSON.write('Version', '1.01'); APEX_JSON.write('Irn', 'XXX-64-XXX'); APEX_JSON.open_object('TranDtls'); --{ APEX_JSON.write('TaxSch', 'GST'); APEX_JSON.write('RegRev', 'Y'); APEX_JSON.write('SupTyp', CASE WHEN SALE_INVOICE_ROW.CUSTOMER_TYPE='E' THEN 'DEXP' ELSE 'B2B' END); APEX_JSON.close_object; -- } TransDtls APEX_JSON.open_object('DocDtls'); --{ APEX_JSON.write('Typ', 'INV'); APEX_JSON.write('No',SALE_INVOICE_ROW.DOCUMENT_TYPE||'/'||SALE_INVOICE_ROW.DOCUMENT_SERIES||'/'||SALE_INVOICE_ROW.DOCUMENT_NUMBER); APEX_JSON.write('Dt', TO_CHAR(SALE_INVOICE_ROW.DOCUMENT_DATE,'DD/MM/YYYY')); APEX_JSON.close_object; --} DocDtls APEX_JSON.open_object('SellerDtls'); --{ APEX_JSON.write('Gstin', PKG_CONTROLS.GET_REGN_NUMBER(SALE_INVOICE_ROW.COMPANY_CODE,'GST')); APEX_JSON.write('LglNm', PKG_REPORTS.GET_COMPANY_NAME(SALE_INVOICE_ROW.COMPANY_CODE,',')); APEX_JSON.write('Addr1', PKG_REPORTS.GET_COMPANY_ADDRESS(SALE_INVOICE_ROW.COMPANY_CODE)); APEX_JSON.write('Loc', PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'LOCATION_NAME')); APEX_JSON.write('Dst', PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'DISTRICT_CODE')); APEX_JSON.write('Pin', to_number(PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'POSTAL_CODE'))); APEX_JSON.write('Stcd', PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'STATE_NAME')); APEX_JSON.close_object; --} SellerDtls APEX_JSON.open_object('BuyerDtls');--{ APEX_JSON.write('Gstin', PKG_AR.GET_REGN_NUMBER(SALE_INVOICE_ROW.COMPANY_CODE,SALE_INVOICE_ROW.PARTY_CODE,'GST')); APEX_JSON.write('LglNm', PKG_AR.GET_CUSTOMER_NAME(SALE_INVOICE_ROW.PARTY_CODE)); APEX_JSON.write('Addr1', PKG_AR.GET_CUSTOMER_ADDRESS(SALE_INVOICE_ROW.PARTY_CODE,SALE_INVOICE_ROW.ADDRESS_CODE)); APEX_JSON.write('Loc', PKG_AR.GET_STATION_NAME(SALE_INVOICE_ROW.PARTY_CODE)); APEX_JSON.write('Pin', to_number(CUSTOMER_ROW.POSTAL_CODE)); APEX_JSON.write('Stcd', PKG_AR.GET_STATE_NAME(SALE_INVOICE_ROW.PARTY_CODE)); APEX_JSON.close_object; --} BuyerDtls APEX_JSON.open_object('ItemList'); --{ APEX_JSON.open_array('ITEM'); --[ FOR cur_rec IN (SELECT * FROM VW_GST_INVOICE_ITEMS I WHERE I.PARENT_RECID = P_SI_RECID ) LOOP APEX_JSON.open_object; --{ APEX_JSON.write('SlNo', cur_rec.SEQ_NUMBER); APEX_JSON.write('PrdDesc', cur_rec.STOCK_NAME); APEX_JSON.write('HsnCd', cur_rec.EXCISE_TARIFF); APEX_JSON.write('Qty', cur_rec.NO_OF_PACKS); APEX_JSON.write('FreeQty', 0); APEX_JSON.write('Unit', /*cur_rec.IUOM_CODE*/ 'NOS'); APEX_JSON.write('UnitPrice', cur_rec.NET_PRICE); APEX_JSON.write('TotAmt', cur_rec.ITEM_VALUE); APEX_JSON.write('Discount', NVL(cur_rec.NDIS_AMOUNT,0)+NVL(cur_rec.TDIS_AMOUNT,0)+NVL(cur_rec.SDIS_AMOUNT,0)); APEX_JSON.write('OthChrg', 0); APEX_JSON.write('AssAmt', cur_rec.COST_AMOUNT); APEX_JSON.write('CgstRt', cur_rec.CGST_RATE); APEX_JSON.write('SgstRt', cur_rec.SGST_RATE); APEX_JSON.write('IgstRt', cur_rec.IGST_RATE); APEX_JSON.write('CesRt', cur_rec.CESS_RATE); APEX_JSON.write('CesNonAdval', cur_rec.CESS_ON_QTY); APEX_JSON.write('StateCes', 0); APEX_JSON.write('TotItemVal', cur_rec.ITEM_VALUE); APEX_JSON.close_object; --} ITEM END LOOP; APEX_JSON.close_array; --] APEX_JSON.close_object; --} ItemList APEX_JSON.open_object('ValDtls'); --{ APEX_JSON.write('AssVal', SALE_INVOICE_ROW.COST_OF_GOODS); APEX_JSON.write('CgstVal', SALE_INVOICE_ROW.CGST_AMOUNT); APEX_JSON.write('SgstVal', SALE_INVOICE_ROW.SGST_AMOUNT); APEX_JSON.write('IgstVal', SALE_INVOICE_ROW.IGST_AMOUNT); APEX_JSON.write('CesVal', SALE_INVOICE_ROW.CESS_AMOUNT); APEX_JSON.write('StCesVal', 0); APEX_JSON.write('CesNonAdVal',SALE_INVOICE_ROW.CESS_ON_QTY); APEX_JSON.write('TotInvVal', SALE_INVOICE_ROW.VALUE_OF_INVOICE); APEX_JSON.close_object; --} ValDtls DELETE JSON_INVOICE_DOCUMENT; INSERT INTO JSON_INVOICE_DOCUMENT (INV_DOC) VALUES(APEX_JSON.get_clob_output); DBMS_OUTPUT.put_line(APEX_JSON.get_clob_output); APEX_JSON.close_object; --} main APEX_JSON.free_output; END;
Validations on Items: Sl.no of the item is verified for duplicate values. Each item needs to have valid HSN code with at least 4 digits. That is, items of goods type should be 4 or 6 or 8 digits and items of service type should be 4 or 5 or 6 digits. HSN Code should be valid as per the GST master. If Is_Service is selected, then the HSN codes must belong to services. Each item should have valid Unit Quantity Code (UQC) as per the master codes, in case of goods. Quantity and Unit Quantity Code are mandatory for Goods and optional for Services. Tax rates are being validated. Only the allowed tax rates will be accepted. In case of intra-state transaction, the sum of SGST and CGST tax rates should be entered as GST Rate. In case of inter-state transaction, the IGST tax rate and value has to be passed. In case of export transaction, IGST tax rate and value has to be passed. In case the buyer is SEZ unit, then IGST tax rate and value has to be passed irrespective of state of the buyer. Maximum number of items in each invoice should not exceed more than 1000 items. Calculation of Values: The following summation validations are to be done for items Gross Amount of Item = Quantity X Selling Unit Price Taxable Value of Item = Gross Amount of Item ¿ Discount SGST Value of Item = Taxable Value of Item X GST Rate / 2, if intra-state CGST Value of Item = Taxable Value of Item X GST Rate / 2, if intra-state IGST Value of Item = Taxable Value of Item X GST Rate, if inter-state Cess Value of Item = Taxable Value of Item X Cess Rate State Cess Value of Item = Taxable Value of Item X State Cess Rate Total Value of Item = Taxable Value of Item + SGST Value of Item + CGST Value of Item + IGST Value of Item + Cess Value of Item + State Cess Value of Item + Non-Advol Cess Value of Item + State Cess Non-advol value of Item + Other charges. The following summation validations are to be done on Invoice total Total Taxable Value = Taxable Value of all Items Total SGST Value = SGST Value of all Items Total CGST Value = CGST Value of all Items Total IGST Value = IGST Value of all Items Total Cess Value = Cess Value of all Items + Non-Advol Cess Value of all Items Total State Cess Value = State Cess Value of all Items + State Cess Nonadvol Value of all Items Total Invoice Value = Total Taxable Value + Total SGST Value + Total CGST Value + Total IGST Value + Total Cess Value + Total State Cess Value + Total Non-Advol Cess Value The round-off value can be + or - Validations on e-waybill: E-waybill can be generated only if E-way Bill related details are passed. E-way Bill is not generated for document types of Debit Note and Credit Note and Services. E-way Bill cannot be generated for cancelled IRN. E Way Bill can be generated provided at least HSN of one item belongs to goods. If only Transporter ¿Id is provided, then only Part-A is generated. If mode of transportation in `Road¿, then the Vehicle number and vehicle type should be passed. If mode of transportation in Ship. Air, Rail, then the transport document number and date should be passed. The Vehicle no. should match with specified format and exist in Vahan database. E-Waybill will not be generated if the seller or buyer GSTIN is blocked due to non-filing of Returns. PIN-PIN distance is validated.
Created attachment 836 [details] imis einvoice schema v2 imis einvoice schema as per einvoice JSON schema V7
Created attachment 835 [details] einvoice JSON schema V7 New version of einvoice schema released by GST deptt
SET SERVEROUTPUT ON set serveroutput on size 1000000; DECLARE P_SI_RECID SALE_INVOICE.SI_RECID%TYPE := 20000005797050 ; SALE_INVOICE_ROW VW_GST_SALE_INVOICES%ROWTYPE; CUSTOMER_ROW CUSTOMERS%ROWTYPE; CUST_STATE_ROW STATES%ROWTYPE; CO_STATE_ROW STATES%ROWTYPE; BEGIN APEX_JSON.initialize_clob_output; APEX_JSON.open_object; --{ main SELECT S.* INTO SALE_INVOICE_ROW FROM VW_GST_SALE_INVOICES S WHERE S.DOCUMENT_RECID = P_SI_RECID; SELECT C.* INTO CUSTOMER_ROW FROM CUSTOMERS C WHERE COMPANY = SALE_INVOICE_ROW.COMPANY_CODE AND CUSTOMER_CODE = SALE_INVOICE_ROW.PARTY_CODE; SELECT S.* INTO CUST_STATE_ROW FROM STATES S WHERE STATE_CODE = CUSTOMER_ROW.STATE_CODE AND COUNTRY_CODE = CUSTOMER_ROW.COUNTRY_CODE; SELECT S.* INTO CO_STATE_ROW FROM STATES S WHERE STATE_CODE = PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'STATE_CODE') AND COUNTRY_CODE = PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'COUNTRY_CODE'); APEX_JSON.write('$schema', 'http://json-schema.org/draft-04/schema#'); APEX_JSON.write('Title', 'GST-India Invoice Document'); APEX_JSON.write('Description', 'GST Invoice format for IRN Generation in INDIA'); APEX_JSON.write('TaxSch', 'GST'); APEX_JSON.write('Version', '1.00'); APEX_JSON.write('Irn', 'XXX-64-XXX'); APEX_JSON.open_object('TranDtls'); --{ APEX_JSON.write('Catg', CASE WHEN SALE_INVOICE_ROW.CUSTOMER_TYPE='E' THEN 'EXP' ELSE 'B2B' END); APEX_JSON.write('RegRev', 'RG'); APEX_JSON.write('Typ', 'CMB'); APEX_JSON.close_object; -- } TransDtls APEX_JSON.open_object('DocDtls'); --{ APEX_JSON.write('type', 'INV'); APEX_JSON.write('No',SALE_INVOICE_ROW.DOCUMENT_STRING); APEX_JSON.write('Dt', TO_CHAR(SALE_INVOICE_ROW.DOCUMENT_DATE,'YYYY-MM-DD')); APEX_JSON.close_object; --} DocDtls APEX_JSON.open_object('SellerDtls'); --{ APEX_JSON.write('Gstin', PKG_CONTROLS.GET_REGN_NUMBER(SALE_INVOICE_ROW.COMPANY_CODE,'GST')); APEX_JSON.write('TrdNm', PKG_REPORTS.GET_COMPANY_NAME(SALE_INVOICE_ROW.COMPANY_CODE,',')); APEX_JSON.write('Loc', PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'LOCATION_NAME')); APEX_JSON.write('Dst', PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'DISTRICT_CODE')); APEX_JSON.write('Pin', to_number(PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'POSTAL_CODE'))); APEX_JSON.write('Stcd', CO_STATE_ROW.STATE_ID); APEX_JSON.close_object; --} SellerDtls APEX_JSON.open_object('BuyerDtls');--{ APEX_JSON.write('Gstin', PKG_AR.GET_REGN_NUMBER(SALE_INVOICE_ROW.COMPANY_CODE,SALE_INVOICE_ROW.PARTY_CODE,'GST')); APEX_JSON.write('TrdNm', PKG_AR.GET_CUSTOMER_NAME(SALE_INVOICE_ROW.PARTY_CODE)); APEX_JSON.write('Loc', PKG_AR.GET_STATION_NAME(SALE_INVOICE_ROW.PARTY_CODE)); APEX_JSON.write('Pin', to_number(CUSTOMER_ROW.POSTAL_CODE)); APEX_JSON.write('Stcd', CUST_STATE_ROW.STATE_ID); APEX_JSON.close_object; --} BuyerDtls APEX_JSON.open_object('ItemList'); --{ APEX_JSON.open_array('ITEM'); --[ FOR cur_rec IN (SELECT * FROM VW_GST_INVOICE_ITEMS I WHERE I.PARENT_RECID = P_SI_RECID ) LOOP APEX_JSON.open_object; --{ APEX_JSON.write('PrdNm', cur_rec.ITEM_CODE||'/'||cur_rec.STOCK_TYPE); APEX_JSON.write('PrdDesc', cur_rec.STOCK_NAME); APEX_JSON.write('HsnCd', cur_rec.EXCISE_TARIFF); APEX_JSON.write('Qty', cur_rec.NO_OF_PACKS); APEX_JSON.write('FreeQty', 0); APEX_JSON.write('Unit', cur_rec.IUOM_CODE); APEX_JSON.write('UnitPrice', cur_rec.NET_PRICE); APEX_JSON.write('TotAmt', cur_rec.ITEM_VALUE); APEX_JSON.write('Discount', NVL(cur_rec.NDIS_AMOUNT,0)+NVL(cur_rec.TDIS_AMOUNT,0)+NVL(cur_rec.SDIS_AMOUNT,0)); APEX_JSON.write('OthChrg', 0); APEX_JSON.write('AssAmt', cur_rec.COST_AMOUNT); APEX_JSON.write('CgstRt', cur_rec.CGST_RATE); APEX_JSON.write('SgstRt', cur_rec.SGST_RATE); APEX_JSON.write('IgstRt', cur_rec.IGST_RATE); APEX_JSON.write('CesRt', cur_rec.CESS_RATE); APEX_JSON.write('CesNonAdval', cur_rec.CESS_ON_QTY); APEX_JSON.write('StateCes', 0); APEX_JSON.write('TotItemVal', cur_rec.ITEM_VALUE); APEX_JSON.close_object; --} ITEM END LOOP; APEX_JSON.close_array; --] APEX_JSON.close_object; --} ItemList APEX_JSON.open_object('ValDtls'); --{ APEX_JSON.write('AssVal', SALE_INVOICE_ROW.COST_OF_GOODS); APEX_JSON.write('CgstVal', SALE_INVOICE_ROW.CGST_AMOUNT); APEX_JSON.write('SgstVal', SALE_INVOICE_ROW.SGST_AMOUNT); APEX_JSON.write('IgstVal', SALE_INVOICE_ROW.IGST_AMOUNT); APEX_JSON.write('CesVal', SALE_INVOICE_ROW.CESS_AMOUNT); APEX_JSON.write('StCesVal', 0); APEX_JSON.write('CesNonAdVal',SALE_INVOICE_ROW.CESS_ON_QTY); APEX_JSON.write('TotInvVal', SALE_INVOICE_ROW.VALUE_OF_INVOICE); APEX_JSON.close_object; --} ValDtls INSERT INTO JSON_INVOICE_DOCUMENT (INV_DOC) VALUES(APEX_JSON.get_clob_output); DBMS_OUTPUT.put_line(APEX_JSON.get_clob_output); APEX_JSON.close_object; --} main APEX_JSON.free_output; END;
*** Bug 2870 has been marked as a duplicate of this bug. ***
- working code for invoice output in json SET SERVEROUTPUT ON set serveroutput on size 1000000; DECLARE P_SI_RECID SALE_INVOICE.SI_RECID%TYPE := 20000005797050 ; SALE_INVOICE_ROW VW_GST_SALE_INVOICES%ROWTYPE; CUSTOMER_ROW CUSTOMERS%ROWTYPE; BEGIN APEX_JSON.initialize_clob_output; APEX_JSON.open_object; --{ main SELECT S.* INTO SALE_INVOICE_ROW FROM VW_GST_SALE_INVOICES S WHERE S.DOCUMENT_RECID = P_SI_RECID; SELECT C.* INTO CUSTOMER_ROW FROM CUSTOMERS C WHERE COMPANY = SALE_INVOICE_ROW.COMPANY_CODE AND CUSTOMER_CODE = SALE_INVOICE_ROW.PARTY_CODE; APEX_JSON.write('$schema', 'http://json-schema.org/draft-04/schema#'); APEX_JSON.write('Title', 'GST-India Invoice Document'); APEX_JSON.write('Description', 'GST Invoice format for IRN Generation in INDIA'); APEX_JSON.write('TaxSch', 'GST'); APEX_JSON.write('Version', '1.00'); APEX_JSON.write('Irn', 'XXX-64-XXX'); APEX_JSON.open_object('TranDtls'); --{ APEX_JSON.write('Catg', CASE WHEN SALE_INVOICE_ROW.CUSTOMER_TYPE='E' THEN 'EXP' ELSE 'B2B' END); APEX_JSON.write('RegRev', 'RG'); APEX_JSON.write('Typ', 'CMB'); APEX_JSON.close_object; -- } TransDtls APEX_JSON.open_object('DocDtls'); --{ APEX_JSON.write('type', 'INV'); APEX_JSON.write('No',SALE_INVOICE_ROW.DOCUMENT_STRING); APEX_JSON.write('Dt', TO_CHAR(SALE_INVOICE_ROW.DOCUMENT_DATE,'YYYY-MM-DD')); APEX_JSON.close_object; --} DocDtls APEX_JSON.open_object('SellerDtls'); --{ APEX_JSON.write('Gstin', PKG_CONTROLS.GET_REGN_NUMBER(SALE_INVOICE_ROW.COMPANY_CODE,'GST')); APEX_JSON.write('TrdNm', PKG_REPORTS.GET_COMPANY_NAME(SALE_INVOICE_ROW.COMPANY_CODE,',')); APEX_JSON.write('Loc', PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'LOCATION_NAME')); APEX_JSON.write('Dst', PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'DISTRICT_CODE')); APEX_JSON.write('Pin', to_number(PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'POSTAL_CODE'))); -- APEX_JSON.write('Stcd', PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'STATE_NAME')); APEX_JSON.write('Stcd', 07); APEX_JSON.close_object; --} SellerDtls APEX_JSON.open_object('BuyerDtls');--{ APEX_JSON.write('Gstin', PKG_AR.GET_REGN_NUMBER(SALE_INVOICE_ROW.COMPANY_CODE,SALE_INVOICE_ROW.PARTY_CODE,'GST')); APEX_JSON.write('TrdNm', PKG_AR.GET_CUSTOMER_NAME(SALE_INVOICE_ROW.PARTY_CODE)); APEX_JSON.write('Loc', PKG_AR.GET_STATION_NAME(SALE_INVOICE_ROW.PARTY_CODE)); APEX_JSON.write('Pin', to_number(CUSTOMER_ROW.POSTAL_CODE)); -- APEX_JSON.write('Stcd', PKG_AR.GET_STATE_NAME(SALE_INVOICE_ROW.PARTY_CODE)); APEX_JSON.write('Stcd', 09); APEX_JSON.close_object; --} BuyerDtls APEX_JSON.open_object('ItemList'); --{ APEX_JSON.open_array('ITEM'); --[ FOR cur_rec IN (SELECT * FROM VW_GST_INVOICE_ITEMS I WHERE I.PARENT_RECID = P_SI_RECID ) LOOP APEX_JSON.open_object; --{ APEX_JSON.write('PrdNm', cur_rec.ITEM_CODE||'/'||cur_rec.STOCK_TYPE); APEX_JSON.write('PrdDesc', cur_rec.STOCK_NAME); APEX_JSON.write('HsnCd', cur_rec.EXCISE_TARIFF); APEX_JSON.write('Qty', cur_rec.NO_OF_PACKS); APEX_JSON.write('FreeQty', 0); APEX_JSON.write('Unit', cur_rec.IUOM_CODE); APEX_JSON.write('UnitPrice', cur_rec.NET_PRICE); APEX_JSON.write('TotAmt', cur_rec.ITEM_VALUE); APEX_JSON.write('Discount', NVL(cur_rec.NDIS_AMOUNT,0)+NVL(cur_rec.TDIS_AMOUNT,0)+NVL(cur_rec.SDIS_AMOUNT,0)); APEX_JSON.write('OthChrg', 0); APEX_JSON.write('AssAmt', cur_rec.COST_AMOUNT); APEX_JSON.write('CgstRt', cur_rec.CGST_RATE); APEX_JSON.write('SgstRt', cur_rec.SGST_RATE); APEX_JSON.write('IgstRt', cur_rec.IGST_RATE); APEX_JSON.write('CesRt', cur_rec.CESS_RATE); APEX_JSON.write('CesNonAdval', cur_rec.CESS_ON_QTY); APEX_JSON.write('StateCes', 0); APEX_JSON.write('TotItemVal', cur_rec.ITEM_VALUE); APEX_JSON.close_object; --} ITEM END LOOP; APEX_JSON.close_array; --] APEX_JSON.close_object; --} ItemList APEX_JSON.open_object('ValDtls'); --{ APEX_JSON.write('AssVal', SALE_INVOICE_ROW.COST_OF_GOODS); APEX_JSON.write('CgstVal', SALE_INVOICE_ROW.CGST_AMOUNT); APEX_JSON.write('SgstVal', SALE_INVOICE_ROW.SGST_AMOUNT); APEX_JSON.write('IgstVal', SALE_INVOICE_ROW.IGST_AMOUNT); APEX_JSON.write('CesVal', SALE_INVOICE_ROW.CESS_AMOUNT); APEX_JSON.write('StCesVal', 0); APEX_JSON.write('CesNonAdVal',SALE_INVOICE_ROW.CESS_ON_QTY); APEX_JSON.write('TotInvVal', SALE_INVOICE_ROW.VALUE_OF_INVOICE); APEX_JSON.close_object; --} ValDtls /* INSERT INTO JSON_INVOICE_DOCUMENT (INV_DOC) VALUES(APEX_JSON.get_clob_output); */ DBMS_OUTPUT.put_line(APEX_JSON.get_clob_output); APEX_JSON.close_object; --} main APEX_JSON.free_output; END;
the output is still not correct. open_object should be used only at the beginning. I think you should use open_array for itemlist instead of open_object . see this example which is very similar to our requirement: https://oracle-base.com/articles/misc/apex_json-package-generate-and-parse-json-documents-in-oracle
SET SERVEROUTPUT ON set serveroutput on size 10000000; DECLARE P_SI_RECID SALE_INVOICE.SI_RECID%TYPE := 20000005797050 ; SALE_INVOICE_ROW VW_GST_SALE_INVOICES%ROWTYPE; CUSTOMER_ROW CUSTOMERS%ROWTYPE; BEGIN APEX_JSON.initialize_clob_output; APEX_JSON.open_object; SELECT S.* INTO SALE_INVOICE_ROW FROM VW_GST_SALE_INVOICES S WHERE S.DOCUMENT_RECID = P_SI_RECID; SELECT C.* INTO CUSTOMER_ROW FROM CUSTOMERS C WHERE COMPANY = SALE_INVOICE_ROW.COMPANY_CODE AND CUSTOMER_CODE = SALE_INVOICE_ROW.PARTY_CODE; APEX_JSON.write('$schema', 'http://json-schema.org/draft-04/schema#'); APEX_JSON.write('Title', 'GST-India Invoice Document'); APEX_JSON.write('Description', 'GST Invoice format for IRN Generation in INDIA'); APEX_JSON.write('TaxSch', 'GST'); APEX_JSON.write('Version', '1.00'); APEX_JSON.write('Irn', 'XXX-64-XXX'); APEX_JSON.open_object('TranDtls'); APEX_JSON.write('Catg', CASE WHEN SALE_INVOICE_ROW.CUSTOMER_TYPE='E' THEN 'EXP' ELSE 'B2B' END); APEX_JSON.write('RegRev', 'RG'); APEX_JSON.write('Typ', 'CMB'); APEX_JSON.open_object('DocDtls'); APEX_JSON.write('type', 'INV'); APEX_JSON.write('No',SALE_INVOICE_ROW.DOCUMENT_STRING); APEX_JSON.write('Dt', TO_CHAR(SALE_INVOICE_ROW.DOCUMENT_DATE,'YYYY-MM-DD')); APEX_JSON.open_object('SellerDtls'); APEX_JSON.write('Gstin', PKG_CONTROLS.GET_REGN_NUMBER(SALE_INVOICE_ROW.COMPANY_CODE,'GST')); APEX_JSON.write('TrdNm', PKG_REPORTS.GET_COMPANY_NAME(SALE_INVOICE_ROW.COMPANY_CODE,',')); APEX_JSON.write('Loc', PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'LOCATION_NAME')); APEX_JSON.write('Dst', PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'DISTRICT_CODE')); APEX_JSON.write('Pin', PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'POSTAL_CODE')); APEX_JSON.write('Stcd', PKG_CONTROLS.GET_COMPANY_INFO(SALE_INVOICE_ROW.COMPANY_CODE,'STATE_NAME')); APEX_JSON.open_object('BuyerDtls'); APEX_JSON.write('Gstin', PKG_AR.GET_REGN_NUMBER(SALE_INVOICE_ROW.COMPANY_CODE,SALE_INVOICE_ROW.PARTY_CODE,'GST')); APEX_JSON.write('TrdNm', PKG_AR.GET_CUSTOMER_NAME(SALE_INVOICE_ROW.PARTY_CODE)); APEX_JSON.write('Loc', PKG_AR.GET_STATION_NAME(SALE_INVOICE_ROW.PARTY_CODE)); APEX_JSON.write('Pin', CUSTOMER_ROW.POSTAL_CODE); APEX_JSON.write('Stcd', PKG_AR.GET_STATE_NAME(SALE_INVOICE_ROW.PARTY_CODE)); APEX_JSON.open_object('ItemList'); FOR cur_rec IN (SELECT * FROM VW_GST_INVOICE_ITEMS I WHERE I.PARENT_RECID = P_SI_RECID /*AND ROWNUM<5*/) LOOP APEX_JSON.open_array('Item'); APEX_JSON.write('PrdNm', cur_rec.ITEM_CODE||'/'||cur_rec.STOCK_TYPE); APEX_JSON.write('PrdDesc', cur_rec.STOCK_NAME); APEX_JSON.write('HsnCd', cur_rec.EXCISE_TARIFF); APEX_JSON.write('Qty', cur_rec.NO_OF_PACKS); APEX_JSON.write('FreeQty', ''); APEX_JSON.write('Unit', cur_rec.IUOM_CODE); APEX_JSON.write('UnitPrice', cur_rec.NET_PRICE); APEX_JSON.write('TotAmt', cur_rec.ITEM_VALUE); APEX_JSON.write('Discount', NVL(cur_rec.NDIS_AMOUNT,0)+NVL(cur_rec.TDIS_AMOUNT,0)+NVL(cur_rec.SDIS_AMOUNT,0)); APEX_JSON.write('OthChrg', ''); APEX_JSON.write('AssAmt', cur_rec.COST_AMOUNT); APEX_JSON.write('CgstRt', cur_rec.CGST_RATE); APEX_JSON.write('SgstRt', cur_rec.SGST_RATE); APEX_JSON.write('IgstRt', cur_rec.IGST_RATE); APEX_JSON.write('CesRt', cur_rec.CESS_RATE); APEX_JSON.write('CesNonAdval', cur_rec.CESS_ON_QTY); APEX_JSON.write('StateCes', ''); APEX_JSON.write('TotItemVal', cur_rec.ITEM_VALUE); APEX_JSON.close_array; END LOOP; APEX_JSON.open_object('ValDtls'); APEX_JSON.write('AssVal', SALE_INVOICE_ROW.COST_OF_GOODS); APEX_JSON.write('CgstVal', SALE_INVOICE_ROW.CGST_AMOUNT); APEX_JSON.write('SgstVal', SALE_INVOICE_ROW.SGST_AMOUNT); APEX_JSON.write('IgstVal', SALE_INVOICE_ROW.IGST_AMOUNT); APEX_JSON.write('CesVal', SALE_INVOICE_ROW.CESS_AMOUNT); APEX_JSON.write('CesNonAdVal',SALE_INVOICE_ROW.CESS_ON_QTY); APEX_JSON.write('TotInvVal', SALE_INVOICE_ROW.VALUE_OF_INVOICE); APEX_JSON.close_object; INSERT INTO JSON_INVOICE_DOCUMENT (INV_DOC) VALUES(APEX_JSON.get_clob_output); DBMS_OUTPUT.put_line(APEX_JSON.get_clob_output); APEX_JSON.free_output; END;
Created attachment 825 [details] json schema for einvoice Many of the mandatory field values are missing. e.g. in SellerDtls TrdNm, Loc, Dst, etc. Please see the notes at the end of the schema file. Also see the full schema detail in the attached file json-schema.json.
Created attachment 823 [details] imis json schema for e-invoice V2 correction of some errors in the schema
Created attachment 822 [details] imis einv json schema Dear MS, pls make a procedure to generate a json file as per the attached details. the procedure should accept a RECID and create a json file for the corresponding invoice.