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