Zatca Send Invoice

PHOTO EMBED

Sun Nov 10 2024 07:33:26 GMT+0000 (Coordinated Universal Time)

Saved by @MinaTimo

class NW_ZatcaSendInvoice
{
    public static void main(Args _args)
    {
        int ICVSequence;
        str PIH,ICV,UUID;
        NW_InvoiceICVSequence InvoiceICVSequence;
        CustInvoiceJour _CustInvoiceJour,CustInvoiceJour1;
        ProjInvoiceJour _ProjInvoiceJour,ProjInvoiceJour;
        NW_EInvoice EInvoice;
        CustTable CustTable;
        NW_ZatcaApiType ZatcaApiType;
        CustInvoiceTable CustInvoiceTable;
        NW_CertificateAPI CertificateAPI;

        NW_EInvoicesView EInvoicesView = _args.record();
        CertificateAPI = NW_CertificateAPI::Find();
        ZatcaApiType = _args.parmEnum();
      

        update_recordset EInvoice setting
            Latest = NoYes::No
            where EInvoice.InvoiceId == EInvoicesView.InvoiceId;

       

        UUID = strrem(guid2str(newguid()), '{}'); //Winapi::createGUID();
        ICVSequence = CertificateAPI.ICVSequence +1;
        ICV = int2Str(ICVSequence);

        if(!CertificateAPI.PIH)
        {
            PIH ="NWZlY2ViNjZmZmM4NmYzOGQ5NTI3ODZjNmQ2OTZjNzljMmRiYzIzOWRkNGU5MWI0NjcyOWQ3M2EyN2ZiNTdlOQ==";

        }
        else
        {
            PIH =   CertificateAPI.PIH;
        }


        update_recordset CertificateAPI setting
                PIH = PIH,
                ICVSequence = ICVSequence,
               UUID = UUID;
             
       

       


        if(EInvoicesView.Table_Id == any2Str(tableNum(ProjInvoiceJour)))
        {

            NW_EInvoice::newProjInvoice(EInvoicesView,true, NW_EInvoiceStatus::CreatedFailed,ICV,PIH,UUID);
            new MenuFunction(menuItemActionStr(NW_EInvoiceProcessorCreateXMLUpdate), MenuItemType::Action).run(_args);

            NW_ZatcaSendInvoice::ClearenceAPI(EInvoicesView.InvoiceRecId,ICV,ICVSequence,any2Int(EInvoicesView.Table_Id));

        }

        else
        {

            NW_EInvoice::newCustInvoice(EInvoicesView,true, NW_EInvoiceStatus::CreatedFailed,ICV,PIH,UUID);

            new MenuFunction(menuItemActionStr(NW_EInvoiceProcessorCreateXMLUpdate), MenuItemType::Action).run(_args);

       
        NW_ZatcaSendInvoice::ClearenceAPI(EInvoicesView.InvoiceRecId,ICV,ICVSequence,any2Int(EInvoicesView.Table_Id));
          
        

        }
       


    }

    public static void ClearenceAPI(RecId InvoiceRecId,str ICV,int ICVSequence,tableid _TableId)
    {
        RetailWebRequest    webRequest;
        RetailWebResponse   response;
        str                 rawResponse, ref;
        Map                 responseData;
        RetailCommonWebAPI webApi;
        str UUID,xmlInvoice;
        System.IO.Stream streamstr,responsestr;
        System.IO.StreamReader reader;
        NW_EInvoice EInvoice,_EInvoice;
        CustInvoiceJour CustInvoiceJour;
        ProjInvoiceJour ProjInvoiceJour;
        Map responseMap;
        MapEnumerator       mapEnumerator;
        str HashInvoice,clearedInvoice;
        NW_CertificateAPI CertificateAPI;
        XmlDocument doc = new XmlDocument();
        XmlNodeList nodeList;
       


        ;

        select * from EInvoice where EInvoice.CustInvoiceJourRecId == InvoiceRecId && EInvoice.ICV == ICV
            && EInvoice.Latest == NoYes::Yes;

       
        select * from CertificateAPI;

        UUID = EInvoice.UUID;
        xmlInvoice = System.Convert::ToBase64String(System.Text.Encoding::UTF8.GetBytes(EInvoice.XMLOutgoing));

        str json = "{\"uuid\": \"" + UUID + "\" , \"xmlInvoice\": \"" + xmlInvoice + "\"}";


        webApi = RetailCommonWebAPI::construct();

        // str authHeader = @'SecretToken: '+"h!YZWFP!b2L6YyjZjjUhEK=A5WnqJ_9E";
        str authHeader = @'SecretToken: '+CertificateAPI.SecretToken;


        // response =  webApi.makePostRequest("https://zatca.netways1.com/api/Zatca/InvoiceClearance",json,authHeader,"application/json");
        response =  webApi.makePostRequest(CertificateAPI.ClearenceAPIURL,json,authHeader,"application/json");

        update_recordset _EInvoice setting
            ResponseAPI = response.parmData(),
            InvoiceBase64 = xmlInvoice
            where _EInvoice.RecId == EInvoice.RecId;


       // info(response.parmData());

        if(response.parmHttpStatus() == 200)
        {
           
            responseMap = RetailCommonWebAPI::getMapFromJsonString(response.parmData());
            mapEnumerator = responseMap.getEnumerator();

            while (mapEnumerator.moveNext())
            {
                if(mapEnumerator.currentKey() == "invoiceHash")
                {
                    HashInvoice = strRem(mapEnumerator.currentValue(),"]");
                    HashInvoice = strRem(mapEnumerator.currentValue(),"[");
                }

                if(mapEnumerator.currentKey() == "clearedInvoice")
                {
                    clearedInvoice = strRem(mapEnumerator.currentValue(),"]");
                    clearedInvoice = strRem(mapEnumerator.currentValue(),"[");



                    doc.loadXml(System.Text.Encoding::UTF8.GetString(System.Convert::FromBase64String(clearedInvoice)));

                    nodeList = doc.getElementsByTagName('cac:AdditionalDocumentReference');
                }

            }

           
            if(_TableId == (tableNum(ProjInvoiceJour)))
            {
                update_recordset ProjInvoiceJour setting
                NW_ZatcaStatus = NW_ZatcaStatus::Cleared,
                QRCode_SA = nodeList.item(2).childNodes().item(1).innerText(),
                ZatcaClearedInvoice = clearedInvoice,
                ZatcaClearedInvoiceDate = systemDateGet()
            where ProjInvoiceJour.RecId == EInvoice.CustInvoiceJourRecId;
            }
            else

            {

            update_recordset CustInvoiceJour setting
                NW_ZatcaStatus = NW_ZatcaStatus::Cleared,
                QRCode_SA = nodeList.item(2).childNodes().item(1).innerText()
            where CustInvoiceJour.RecId == EInvoice.CustInvoiceJourRecId;
            }



           
            CertificateAPI.clear();
            update_recordset CertificateAPI setting
                PIH = HashInvoice,
                ICVSequence = ICVSequence;
            

            
           
            
        }


        

        else
        {
            NW_EInvoiceResponse EInvoiceResponse;
            NW_ValidationResultsResponse  ValidationResultsResponse;
            NW_ErrorMessagesResponse      ErrorMessagesResponse ;
            NW_WarningMessagesResponse    WarningMessagesResponse;
            List ErrorMessagesList,WarningMessagesList = new List(Types::Class);
            ListEnumerator ErrorMessagesListEnumerator,WarningMessagesListEnumerator;


            ValidationResultsResponse= FormJsonSerializer::deserializeObject(classNum(NW_ValidationResultsResponse),response.parmData());

            ErrorMessagesList= ValidationResultsResponse.parmerrorMessages();
            ErrorMessagesListEnumerator = ErrorMessagesList.getEnumerator();

            while (ErrorMessagesListEnumerator.moveNext())
            {
                ErrorMessagesResponse= ErrorMessagesListEnumerator.current();
                // Info(ErrorMessagesResponse.parmmessage());

                EInvoiceResponse.EInvoiceRecId = EInvoice.RecId;
                EInvoiceResponse.Massage = ErrorMessagesResponse.parmmessage();
                EInvoiceResponse.Type = "Error";
                EInvoiceResponse.insert();

            }

            WarningMessagesList = ValidationResultsResponse.parmwarningMessages();
            WarningMessagesListEnumerator = WarningMessagesList.getEnumerator();

            while (WarningMessagesListEnumerator.moveNext())
            {
                WarningMessagesResponse= WarningMessagesListEnumerator.current();
                // Info(WarningMessagesResponse.parmmessage());EInvoiceResponse.EInvoiceRecId = EInvoice.RecId;

                EInvoiceResponse.Massage = WarningMessagesResponse.parmmessage();
                EInvoiceResponse.Type = "Warning";
                EInvoiceResponse.insert();

            }



        }

      




    }

    public static void ReportingAPI(RecId InvoiceRecId,str ICV,int ICVSequence,TableId _TableId )
    {
        RetailWebRequest    webRequest;
        RetailWebResponse   response;
        str                 rawResponse, ref;
        Map                 responseData;
        RetailCommonWebAPI webApi;
        str UUID,xmlInvoice;
        System.IO.Stream streamstr,responsestr;
        System.IO.StreamReader reader;
        NW_EInvoice EInvoice,_EInvoice;
        CustInvoiceJour CustInvoiceJour;
        ProjInvoiceJour ProjInvoiceJour;
        Map responseMap;
        MapEnumerator       mapEnumerator;
        str HashInvoice,SignedInvoice;
        NW_CertificateAPI CertificateAPI;
        XmlDocument doc = new XmlDocument();
        XmlNodeList nodeList;


        ;

        select * from EInvoice where EInvoice.CustInvoiceJourRecId == InvoiceRecId && EInvoice.ICV == ICV
            && EInvoice.Latest == NoYes::Yes;

        select * from CertificateAPI;

        UUID = EInvoice.UUID;
        xmlInvoice = System.Convert::ToBase64String(System.Text.Encoding::UTF8.GetBytes(EInvoice.XMLOutgoing));

        str json = "{\"uuid\": \"" + UUID + "\" , \"xmlInvoice\": \"" + xmlInvoice + "\"}";


        webApi = RetailCommonWebAPI::construct();

        str authHeader = @'SecretToken: '+CertificateAPI.SecretToken;

        

        //  response =  webApi.makePostRequest("https://zatca.netways1.com/api/Zatca/InvoiceReporting",json,authHeader,"application/json");
        response =  webApi.makePostRequest(CertificateAPI.ReportingAPIURL,json,authHeader,"application/json");

       
        update_recordset _EInvoice setting
            ResponseAPI = response.parmData(),
            InvoiceBase64 = xmlInvoice
            where _EInvoice.RecId == EInvoice.RecId;

        if(response.parmHttpStatus() == 200)
        {
           
            
            responseMap = RetailCommonWebAPI::getMapFromJsonString(response.parmData());

            mapEnumerator = responseMap.getEnumerator();

            while (mapEnumerator.moveNext())
            {
                if(mapEnumerator.currentKey() == "invoiceHash")
                {
                    HashInvoice = strRem(mapEnumerator.currentValue(),"]");
                    HashInvoice = strRem(mapEnumerator.currentValue(),"[");
                }

                if(mapEnumerator.currentKey() == "SignedInvoice")
                {
                    SignedInvoice = strRem(mapEnumerator.currentValue(),"]");
                    SignedInvoice = strRem(mapEnumerator.currentValue(),"[");

                    doc.loadXml(System.Text.Encoding::UTF8.GetString(System.Convert::FromBase64String(SignedInvoice)));

                    nodeList = doc.getElementsByTagName('cac:AdditionalDocumentReference');
                }

            }
            CertificateAPI.clear();

            update_recordset CertificateAPI setting
            PIH = HashInvoice,
            ICVSequence = ICVSequence;

            //if(ProjInvoiceJour::findRecId(InvoiceRecId))
            if(_TableId == (tableNum(ProjInvoiceJour)))
            {

                update_recordset ProjInvoiceJour setting
                NW_ZatcaStatus = NW_ZatcaStatus::Reported,
                QRCode_SA = nodeList.item(2).childNodes().item(1).innerText(),
                ZatcaSignedInvoice = SignedInvoice,
                ZatcaSignedInvoiceDate = systemDateGet()
            where ProjInvoiceJour.RecId == EInvoice.CustInvoiceJourRecId;
            }

            else
            {
                update_recordset CustInvoiceJour setting
                NW_ZatcaStatus = NW_ZatcaStatus::Reported,
                 QRCode_SA = nodeList.item(2).childNodes().item(1).innerText()
            where CustInvoiceJour.RecId == EInvoice.CustInvoiceJourRecId;
            }

           

           
        }

       
        else
        {
            NW_EInvoiceResponse EInvoiceResponse;
            NW_ValidationResultsResponse  ValidationResultsResponse;
            NW_ErrorMessagesResponse      ErrorMessagesResponse ;
            NW_WarningMessagesResponse    WarningMessagesResponse;
            List ErrorMessagesList,WarningMessagesList = new List(Types::Class);
            ListEnumerator ErrorMessagesListEnumerator,WarningMessagesListEnumerator;


            ValidationResultsResponse= FormJsonSerializer::deserializeObject(classNum(NW_ValidationResultsResponse),response.parmData());

            ErrorMessagesList= ValidationResultsResponse.parmerrorMessages();
            ErrorMessagesListEnumerator = ErrorMessagesList.getEnumerator();

            while (ErrorMessagesListEnumerator.moveNext())
            {
                ErrorMessagesResponse= ErrorMessagesListEnumerator.current();
                // Info(ErrorMessagesResponse.parmmessage());

                EInvoiceResponse.EInvoiceRecId = EInvoice.RecId;
                EInvoiceResponse.Massage = ErrorMessagesResponse.parmmessage();
                EInvoiceResponse.Type = "Error";
                EInvoiceResponse.insert();

            }

            WarningMessagesList = ValidationResultsResponse.parmwarningMessages();
            WarningMessagesListEnumerator = WarningMessagesList.getEnumerator();

            while (WarningMessagesListEnumerator.moveNext())
            {
                WarningMessagesResponse= WarningMessagesListEnumerator.current();
                // Info(WarningMessagesResponse.parmmessage());EInvoiceResponse.EInvoiceRecId = EInvoice.RecId;

                EInvoiceResponse.Massage = WarningMessagesResponse.parmmessage();
                EInvoiceResponse.Type = "Warning";
                EInvoiceResponse.insert();

            }



        }


        


    }

    public static void ValidateAPI(RecId CustInvoiceJourRecId,str ICV)
    {
        RetailWebRequest    webRequest;
        RetailWebResponse   response;
        str                 rawResponse, ref;
        Map                 responseData;
        RetailCommonWebAPI webApi;
        str UUID,xmlInvoice;
        System.IO.Stream streamstr,responsestr;
        System.IO.StreamReader reader;
        NW_EInvoice EInvoice,_EInvoice;
        CustInvoiceJour CustInvoiceJour;


        ;

        select * from EInvoice where EInvoice.CustInvoiceJourRecId == CustInvoiceJourRecId && EInvoice.ICV == ICV
            && EInvoice.Latest == NoYes::Yes;

           

        UUID = EInvoice.UUID;
        xmlInvoice = System.Convert::ToBase64String(System.Text.Encoding::UTF8.GetBytes(EInvoice.XMLOutgoing));

        str json = "{\"uuid\": \"" + UUID + "\" , \"xmlInvoice\": \"" + xmlInvoice + "\"}";


        webApi = RetailCommonWebAPI::construct();

        str authHeader = @'SecretToken: '+"h!YZWFP!b2L6YyjZjjUhEK=A5WnqJ_9E";

        response =  webApi.makePostRequest("https://zatca.netways1.com/api/Zatca/InvoiceCompliance",json,authHeader,"application/json");

            update_recordset _EInvoice setting
            ResponseAPI = response.parmData()
            where _EInvoice.RecId == EInvoice.RecId;

       


    }

}
content_copyCOPY