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; } }