I get this error in Compliance invoice API:
{
"validationResults": {
"infoMessages": [
{
"type": "INFO",
"code": "XSD_ZATCA_VALID",
"category": "XSD validation",
"message": "Complied with UBL 2.1 standards in line with ZATCA specifications",
"status": "PASS"
}
],
"warningMessages": [],
"errorMessages": [
{
"type": "ERROR",
"code": "invalid-invoice-hash",
"category": "INVOICE_HASHING_ERRORS",
"message": "The invoice hash API body does not match the (calculated) Hash of the XML",
"status": "ERROR"
},
{
"type": "ERROR",
"code": "BR-CL-KSA-14",
"category": "KSA",
"message": "[KSA-14]Field character limit for QR Code field has been exceeded. The maximum character limit for this field is 1000 characters.",
"status": "ERROR"
},
{
"type": "ERROR",
"code": "QRCODE_INVALID",
"category": "QRCODE_VALIDATION",
"message": "Invalid QR code format, Please follow the ZATCA QR code specifications",
"status": "ERROR"
}
],
"status": "ERROR"
},
"reportingStatus": "NOT_REPORTED",
"clearanceStatus": null,
"qrSellertStatus": null,
"qrBuyertStatus": null
}
response with this used:
{"invoiceHash":"eyIhLLJdlUEDd3pgXhOofcVeYpXqBKDiRVMTxAaz5K8=","uuid":"8e6000cf-1a98-4174-b3e7-b5d5954bc10d","invoice":"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEludm9pY2UgeG1sbnM9InVybjpvYXNpczpuYW1lczpzcGVjaWZpY2F0aW9uOnVibDpzY2hlbWE6eHNkOkludm9pY2UtMiIgeG1sbnM6Y2FjPSJ1cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6c2NoZW1hOnhzZDpDb21tb25BZ2dyZWdhdGVDb21wb25lbnRzLTIiIHhtbG5zOmNiYz0idXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOnNjaGVtYTp4c2Q6Q29tbW9uQmFzaWNDb21wb25lbnRzLTIiIHhtbG5zOmV4dD0idXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOnNjaGVtYTp4c2Q6Q29tbW9uRXh0ZW5zaW9uQ29tcG9uZW50cy0yIj48ZXh0OlVCTEV4dGVuc2lvbnM+CiAgICA8ZXh0OlVCTEV4dGVuc2lvbj4KICAgICAgICA8ZXh0OkV4dGVuc2lvblVSST51cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6ZHNpZzplbnZlbG9wZWQ6eGFkZXM8L2V4dDpFeHRlbnNpb25VUkk+CiAgICAgICAgPGV4dDpFeHRlbnNpb25Db250ZW50PgogICAgICAgICAgICA8c2lnOlVCTERvY3VtZW50U2lnbmF0dXJlcyB4bWxuczpzaWc9InVybjpvYXNpczpuYW1lczpzcGVjaWZpY2F0aW9uOnVibDpzY2hlbWE6eHNkOkNvbW1vblNpZ25hdHVyZUNvbXBvbmVudHMtMiIgeG1sbnM6c2FjPSJ1cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6c2NoZW1hOnhzZDpTaWduYXR1cmVBZ2dyZWdhdGVDb21wb25lbnRzLTIiIHhtbG5zOnNiYz0idXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOnNjaGVtYTp4c2Q6U2lnbmF0dXJlQmFzaWNDb21wb25lbnRzLTIiPgogICAgICAgICAgICAgICAgPHNhYzpTaWduYXR1cmVJbmZvcm1hdGlvbj4gCiAgICAgICAgICAgICAgICAgICAgPGNiYzpJRD51cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6c2lnbmF0dXJlOjE8L2NiYzpJRD4KICAgICAgICAgICAgICAgICAgICA8c2JjOlJlZmVyZW5jZWRTaWduYXR1cmVJRD51cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6c2lnbmF0dXJlOkludm9pY2U8L3NiYzpSZWZlcmVuY2VkU2lnbmF0dXJlSUQ+CiAgICAgICAgICAgICAgICAgICAgPGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIgSWQ9InNpZ25hdHVyZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkczpTaWduZWRJbmZvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzEyL3htbC1jMTRuMTEiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNlY2RzYS1zaGEyNTYiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkczpSZWZlcmVuY2UgSWQ9Imludm9pY2VTaWduZWREYXRhIiBVUkk9IiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRzOlRyYW5zZm9ybXM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy14cGF0aC0xOTk5MTExNiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHM6WFBhdGg+bm90KC8vYW5jZXN0b3Itb3Itc2VsZjo6ZXh0OlVCTEV4dGVuc2lvbnMpPC9kczpYUGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kczpUcmFuc2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy14cGF0aC0xOTk5MTExNiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHM6WFBhdGg+bm90KC8vYW5jZXN0b3Itb3Itc2VsZjo6Y2FjOlNpZ25hdHVyZSk8L2RzOlhQYXRoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RzOlRyYW5zZm9ybT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLXhwYXRoLTE5OTkxMTE2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkczpYUGF0aD5ub3QoLy9hbmNlc3Rvci1vci1zZWxmOjpjYWM6QWRkaXRpb25hbERvY3VtZW50UmVmZXJlbmNlW2NiYzpJRD0iUVIiXSk8L2RzOlhQYXRoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RzOlRyYW5zZm9ybT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMTIveG1sLWMxNG4xMSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHM6VHJhbnNmb3Jtcz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjc2hhMjU2Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRzOkRpZ2VzdFZhbHVlPmV5SWhMTEpkbFVFRGQzcGdYaE9vZmNWZVlwWHFCS0RpUlZNVHhBYXo1Szg9PC9kczpEaWdlc3RWYWx1ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHM6UmVmZXJlbmNlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRzOlJlZmVyZW5jZSBUeXBlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjU2lnbmF0dXJlUHJvcGVydGllcyIgVVJJPSIjeGFkZXNTaWduZWRQcm9wZXJ0aWVzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjc2hhMjU2Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRzOkRpZ2VzdFZhbHVlPk9HWmhNemRrWW1RNE5EWmtPVFV6TTJFNE5HUmtOR1JpTURWaE5qazJZV015WlRVNVpqWTFOek14WmpReFpUVXpORFk1TXpWaE5USXhOMkkyTmpObE5RPT08L2RzOkRpZ2VzdFZhbHVlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kczpSZWZlcmVuY2U+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZHM6U2lnbmVkSW5mbz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRzOlNpZ25hdHVyZVZhbHVlPk1FUUNJRkhmcE50Tnpsa216bDNtcElWallZeTBvbzFFSVRBZ3hmUjZSSzRvSlQ0UUFpQWxVQXRnb1ZIQy82S3BnQ0h5cHVaWXZvdTBTRGU3TGN2UlJoN3dzeVByUXc9PTwvZHM6U2lnbmF0dXJlVmFsdWU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkczpLZXlJbmZvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRzOlg1MDlEYXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkczpYNTA5Q2VydGlmaWNhdGU+TUlJQ1BEQ0NBZU9nQXdJQkFnSUdBWk5zZlBwK01Bb0dDQ3FHU000OUJBTUNNQlV4RXpBUkJnTlZCQU1NQ21WSmJuWnZhV05wYm1jd0hoY05NalF4TVRJM01EY3hPVEExV2hjTk1qa3hNVEkyTWpFd01EQXdXakIxTVFzd0NRWURWUVFHRXdKVFFURVdNQlFHQTFVRUN3d05VbWw1WVdSb0lFSnlZVzVqYURFbU1DUUdBMVVFQ2d3ZFRXRjRhVzExYlNCVGNHVmxaQ0JVWldOb0lGTjFjSEJzZVNCTVZFUXhKakFrQmdOVkJBTU1IVlJUVkMwNE9EWTBNekV4TkRVdE16azVPVGs1T1RrNU9UQXdNREF6TUZZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUFvRFFnQUVrSWthc0o0eERwQ3JvZlhPbDJ5WktMUjV0ZGFGd3FZVS9EMG55QTlpeFM2b0gyaHExb3BjRlpIQXNDTWVObkZlandkVVJzamU1NlUvWWwzSjlveE9jS09Cd1RDQnZqQU1CZ05WSFJNQkFmOEVBakFBTUlHdEJnTlZIUkVFZ2FVd2dhS2tnWjh3Z1p3eE96QTVCZ05WQkFRTU1qRXRWRk5VZkRJdFZGTlVmRE10WldReU1tWXhaRGd0WlRaaE1pMHhNVEU0TFRsaU5UZ3RaRGxoT0dZeE1XVTBORFZtTVI4d0hRWUtDWkltaVpQeUxHUUJBUXdQTXprNU9UazVPVGs1T1RBd01EQXpNUTB3Q3dZRFZRUU1EQVF4TVRBd01SRXdEd1lEVlFRYURBaFNVbEpFTWpreU9URWFNQmdHQTFVRUR3d1JVM1Z3Y0d4NUlHRmpkR2wyYVhScFpYTXdDZ1lJS29aSXpqMEVBd0lEUndBd1JBSWdIQTZldVZzVC9zbzFpbXRGT3QwWHlvUnZIWkpETHBXdHNnamt1cEpLbytVQ0lHaWlLVVBpQnozMitjZEtXY0NtWnBGVkswY2lZVVVvSFUrSHU0KzgyK2REPC9kczpYNTA5Q2VydGlmaWNhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RzOlg1MDlEYXRhPgogICAgICAgICAgICAgICAgICAgICAgICA8L2RzOktleUluZm8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkczpPYmplY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eGFkZXM6UXVhbGlmeWluZ1Byb3BlcnRpZXMgeG1sbnM6eGFkZXM9Imh0dHA6Ly91cmkuZXRzaS5vcmcvMDE5MDMvdjEuMy4yIyIgVGFyZ2V0PSJzaWduYXR1cmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4YWRlczpTaWduZWRQcm9wZXJ0aWVzIElkPSJ4YWRlc1NpZ25lZFByb3BlcnRpZXMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eGFkZXM6U2lnbmVkU2lnbmF0dXJlUHJvcGVydGllcz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4YWRlczpTaWduaW5nVGltZT4yMDI0LTExLTI3VDEwOjE5OjEwPC94YWRlczpTaWduaW5nVGltZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4YWRlczpTaWduaW5nQ2VydGlmaWNhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhhZGVzOkNlcnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4YWRlczpDZXJ0RGlnZXN0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRzOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jI3NoYTI1NiIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRzOkRpZ2VzdFZhbHVlPk1EVmpaVEF3WW1JeE1XVXpOakJrTTJJd1lqQmhaalkwTldWak5qTXlaall5WVdaak1UWXpZbVkzT1RBMlpESmtZemxtTTJVM09EQTFOR013WldVd1pRPT08L2RzOkRpZ2VzdFZhbHVlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hhZGVzOkNlcnREaWdlc3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4YWRlczpJc3N1ZXJTZXJpYWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHM6WDUwOUlzc3Vlck5hbWU+Q049ZUludm9pY2luZzwvZHM6WDUwOUlzc3Vlck5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHM6WDUwOVNlcmlhbE51bWJlcj4xNzMyNjkxOTUwMjA2PC9kczpYNTA5U2VyaWFsTnVtYmVyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hhZGVzOklzc3VlclNlcmlhbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hhZGVzOkNlcnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hhZGVzOlNpZ25pbmdDZXJ0aWZpY2F0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94YWRlczpTaWduZWRTaWduYXR1cmVQcm9wZXJ0aWVzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveGFkZXM6U2lnbmVkUHJvcGVydGllcz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveGFkZXM6UXVhbGlmeWluZ1Byb3BlcnRpZXM+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZHM6T2JqZWN0PgogICAgICAgICAgICAgICAgICAgIDwvZHM6U2lnbmF0dXJlPgogICAgICAgICAgICAgICAgPC9zYWM6U2lnbmF0dXJlSW5mb3JtYXRpb24+CiAgICAgICAgICAgIDwvc2lnOlVCTERvY3VtZW50U2lnbmF0dXJlcz4KICAgICAgICA8L2V4dDpFeHRlbnNpb25Db250ZW50PgogICAgPC9leHQ6VUJMRXh0ZW5zaW9uPgo8L2V4dDpVQkxFeHRlbnNpb25zPgoKICAgIDxjYmM6UHJvZmlsZUlEPnJlcG9ydGluZzoxLjA8L2NiYzpQcm9maWxlSUQ+CiAgICA8Y2JjOklEPlNNRTAwMDEwPC9jYmM6SUQ+CiAgICA8Y2JjOlVVSUQ+OGU2MDAwY2YtMWE5OC00MTc0LWIzZTctYjVkNTk1NGJjMTBkPC9jYmM6VVVJRD4KICAgIDxjYmM6SXNzdWVEYXRlPjIwMjItMDgtMTc8L2NiYzpJc3N1ZURhdGU+CiAgICA8Y2JjOklzc3VlVGltZT4xNzo0MTowODwvY2JjOklzc3VlVGltZT4KICAgIDxjYmM6SW52b2ljZVR5cGVDb2RlIG5hbWU9IjAyMDAwMDAiPjM4ODwvY2JjOkludm9pY2VUeXBlQ29kZT4KICAgIDxjYmM6Tm90ZSBsYW5ndWFnZUlEPSJhciI+QUJDPC9jYmM6Tm90ZT4KICAgIDxjYmM6RG9jdW1lbnRDdXJyZW5jeUNvZGU+U0FSPC9jYmM6RG9jdW1lbnRDdXJyZW5jeUNvZGU+CiAgICA8Y2JjOlRheEN1cnJlbmN5Q29kZT5TQVI8L2NiYzpUYXhDdXJyZW5jeUNvZGU+CiAgICA8Y2FjOkFkZGl0aW9uYWxEb2N1bWVudFJlZmVyZW5jZT4KICAgICAgICA8Y2JjOklEPklDVjwvY2JjOklEPgogICAgICAgIDxjYmM6VVVJRD4xMDwvY2JjOlVVSUQ+CiAgICA8L2NhYzpBZGRpdGlvbmFsRG9jdW1lbnRSZWZlcmVuY2U+CiAgICA8Y2FjOkFkZGl0aW9uYWxEb2N1bWVudFJlZmVyZW5jZT4KICAgICAgICA8Y2JjOklEPlBJSDwvY2JjOklEPgogICAgICAgIDxjYWM6QXR0YWNobWVudD4KICAgICAgICAgICAgPGNiYzpFbWJlZGRlZERvY3VtZW50QmluYXJ5T2JqZWN0IG1pbWVDb2RlPSJ0ZXh0L3BsYWluIj5OV1psWTJWaU5qWm1abU00Tm1Zek9HUTVOVEkzT0Raak5tUTJPVFpqTnpsak1tUmlZekl6T1dSa05HVTVNV0kwTmpjeU9XUTNNMkV5TjJaaU5UZGxPUT09PC9jYmM6RW1iZWRkZWREb2N1bWVudEJpbmFyeU9iamVjdD4KICAgICAgICA8L2NhYzpBdHRhY2htZW50PgogICAgPC9jYWM6QWRkaXRpb25hbERvY3VtZW50UmVmZXJlbmNlPgogICAgCiAgICAKICAgIDxjYWM6QWRkaXRpb25hbERvY3VtZW50UmVmZXJlbmNlPgogICAgICAgIDxjYmM6SUQ+UVI8L2NiYzpJRD4KICAgICAgICA8Y2FjOkF0dGFjaG1lbnQ+CiAgICAgICAgICAgIDxjYmM6RW1iZWRkZWREb2N1bWVudEJpbmFyeU9iamVjdCBtaW1lQ29kZT0idGV4dC9wbGFpbiI+TURFMFlXUTRZalJrT0dJeFpEazRNMlE0WVRreU1HUTRZV0ZrT1RnNFpEaGlNV1E1T0dGa09HRm1NakJrT0dFM1pEazROR1E0WVdGa09UZ3paRGs0Tm1RNU9EaGtPVGcwWkRrNE9HUTRZV05rT1RoaFpEaGhOekl3WkRoaE9HUTRZVE5rT1RneVpEaGlOV1E1T0RreU1HUTRZak5rT0dJeFpEaGlPV1E0WVRreU1HUTRZVGRrT1RnMFpEazROV1E0WVdSa09HRm1aRGs0T0dRNFlXWmtPR0U1TWpBM1l6SXdOR1EyTVRjNE5qazJaRGMxTm1ReU1EVXpOekEyTlRZMU5qUXlNRFUwTmpVMk16WTRNakExTXpjMU56QTNNRFpqTnpreU1EUmpOVFEwTkRBeU1HWXpNek01TXprek9UTTVNemt6T1RNNU16a3pPVE13TXpBek1ETXdNek13TXpFME16SXpNRE15TXpJeVpETXdNemd5WkRNeE16YzFORE14TXpjellUTTBNekV6WVRNd016ZzFZVEEwTURZek1qTXpNekV5WlRNeE16VXdOVEExTXpNek1ESmxNekV6TlRBMk1tTTJOVGM1TkRrMk9EUmpOR00wWVRZME5tTTFOVFExTkRRMk5ETXpOekEyTnpVNE5qZzBaalptTmpZMk16VTJOalUxT1Rjd05UZzNNVFF5TkdJME5EWTVOVEkxTmpSa05UUTNPRFF4TmpFM1lUTTFOR0l6T0ROa01EYzJNRFJrTkRVMU1UUXpORGswTmpRNE5qWTNNRFJsTnpRMFpUZGhObU0yWWpaa04yRTJZek16Tm1RM01EUTVOVFkyWVRVNU5UazNPVE13Tm1ZMlpqTXhORFUwT1RVME5ERTJOemM0TmpZMU1qTTJOVEkwWWpNME5tWTBZVFUwTXpRMU1UUXhOamswTVRaak5UVTBNVGMwTmpjMlpqVTJORGcwTXpKbU16WTBZamN3TmpjME16UTROemszTURjMU5XRTFPVGMyTm1ZM05UTXdOVE0wTkRZMU16YzBZell6TnpZMU1qVXlOamd6TnpjM056TTNPVFV3TnpJMU1UYzNNMlF6WkRBNE1ETXdNRFJrTkRrME9UUXpOVEEwTkRRek5ETTBNVFkxTkdZMk56UXhOemMwT1RReU5ERTJOelE1TkRjME1UVmhOR1UzTXpZMk5UQTNNREppTkdRME1UWm1ORGMwTXpRek56RTBOelV6TkdRek5ETTVOREkwTVRSa05ETTBaRFF5TlRVM09EUTFOMkUwTVRVeU5ESTJOelJsTlRZME1qUXhOR1EwWkRRek5tUTFOalJoTmpJMlpUVmhOelkyTVRVM05HVTNNRFl5Tm1RMk16YzNORGcyT0RZek5HVTBaRFpoTlRFM09EUmtOVFEwT1RNek5HUTBORFl6TnpnMFpqVTBOREV6TVRVM05qZzJNelJsTkdRMllUWmlOemcwWkRVME5Ea3pNalJrTm1FME5UYzNOR1EwTkRReE56YzFOelpoTkRJek1UUmtOVEUzTXpjM05ETTFNVFU1TkRRMU5qVXhOVEUwTnpRMU56YzBZVFUwTlRFMU5EUTFOVGMwWkRReU5URTBOelF4TXpFMU5UUTFORE0zTnpjM05HVTFOVFprTm1Nek5UVTVOVGMxTWpabU5EazBOVFJoTnprMU9UVTNNelUyWVRZeE5EUTBOVFprTkdRME16VXhORGMwTVRNeE5UVTBOVFF6TmpjM056WTBOVFExTnpRMk16UTJNVFUzTXpFek1UWXlOVE0wTWpVME5qTTBOelUyTm1NMVlUUXpOREkxTlRWaE5UYzBaVFptTkRrME5qUmxNekUyTXpRNE5ESTNNelkxTlRNME1qUmtOVFkwTlRVeE56ZzBZVFpoTkRFMllqUXlOamMwWlRVMk5ESTBNVFJrTkdRME9EVTJOVEkxTkRVMk5ETXpNRE0wTkdZME5EVTVNekEwWkRkaE5EVTNPRFJsTkRRMU5UYzBOR1EzWVRaaU16VTBaalUwTm1Jek5UUm1OVFEyWWpNMU5HWTFORFF4TnpjMFpEUTBOREUzWVRSa05EWTFPVGMzTkRVME1UVTVORGcwWWpabU5XRTBPVGRoTm1Fek1EUXpOREUxTVRVNU5EWTBZak0wTkRVME5UUXhOREUyWmpRME5URTJOelF4TkRVMllqUTVObUkyTVRjek5HRXpORGM0TkRRM01EUXpOekkyWmpZMk5UZzBaalpqTXpJM09UVmhOR0kwWXpVeU16VTNORFkwTmpFME5qYzNOekUxT1RVMU1tWTBORE13Tm1VM09UUXhNemsyT1RjNE5UTXpOalptTkRnek1qWTROekV6TVRabU56QTJNelEyTldFME9EUXhOek0wTXpSa05qVTBaVFpsTkRZMk5UWmhOemMyTkRVMU5USTNNelpoTmpVek5UTTJOVFV5WmpVNU5tTXpNelJoTXprMlpqYzROR1kyTXpSaU5HWTBNamMzTlRRME16UXlOelkyWVRReE5HUTBNalkzTkdVMU5qUTROVEkwWkRReU5ERTJOak00TkRVME1UWmhOREUwTVRSa05EazBOemMwTkRJMk56UmxOVFkwT0RVeU5EVTBOVFkzTmpFMU5UYzNOamMyTVRSaU5tSTJOelZoTXpnM056WTNOV0UzTnpjNE5HWTNZVFF4TXpVME1qWTNOR1UxTmpReU5ERTFNVFJrTkdRMllUUTFOelExTmpRMk5HVTFOVFkyTkRRME9UYzBOVFkwTmpSbE5UVTJOalEwTkdRM05EVmhOVGMxTVRjNU5HUTJaRFU1TnpnMVlUUTBOamMzTkRWaE5UUTFZVFk0TkdRMk9UTXdOemcwWkRVME5EVXpORFJqTlRRMll6WTVOR1UxTkRZM056UTFZVFEwTm1NMk9EUm1ORGMxT1RjNE5HUTFOelUxTXpBMFpUUTBOVFkyWkRSa05USXpPRGMzTkRnMU1UVTVOR0kwTXpWaE5EazJaRFk1TldFMU1EYzVOR00wTnpVeE5ESTBNVFV4TnpjMU1EUmtOMkUyWWpNMU5HWTFORFppTXpVMFpqVTBObUl6TlRSbU5UUTBNVGMzTkdRME5EUXhOMkUwWkRVeE16QTNOelF6TnpjMU9UUTBOVFkxTVRVeE5HUTBORFF4TlRFM09EUmtOVFEwTVRjM05HUTFNalExTnpjME5EYzNOVGswTkRVMk5URTFNVFl4TkRRME1UWTROVE0xTlRaak5HRTBOVFJrTm1FMllqYzVOR1kxTkRRMU5qRTBaRFF5TmpjME56UXhNekUxTlRRMU5EUTNOemMzTlRJMU5UTXpOVFkzTnpZek5EYzNPRE0xTkRrME56UTJObUUyTkRRM05tTXpNall4TlRnMU1qY3dOV0UxT0RSa056YzBNelkzTlRrME9UUmlObVkxWVRRNU4yRTJZVE13TkRVME1UYzNORGswTkRVeU56YzBNVGMzTlRJME1UUTVOamMwT0RReE16WTJOVGMxTlRZM016VTBNbVkzTXpabU16RTJPVFprTnpRME5qUm1OelF6TURVNE56azJaalV5TnpZME9EVmhOR0UwTkRSak56QTFOemMwTnpNMk56WmhObUkzTlRjd05HRTBZalptTW1JMU5UUXpORGswTnpZNU5qazBZalUxTlRBMk9UUXlOMkV6TXpNeU1tSTJNelkwTkdJMU56WXpORE0yWkRWaE56QTBOalUyTkdJek1EWXpOamsxT1RVMU5UVTJaalE0TlRVeVlqUTROelV6TkRKaU16Z3pNakppTmpRME5EQTVPR1V6TURRMU1ESXlNRFF3TVRVd09XVmxaVEV6WkRWaE1EWTFaV1F6WlRrNE1HTmlObU0zT0dJMU1HWmxPV0V6T1RFeVkySmtZelU0TnpVMVpHWmpaV0ppWW1VMk9UQTNNV0l3TWpJeE1EQmlPRFEyTnpjMllqSXlNak13TXpZeU5HVTVaRFZqTkRWbFlqTTFNVGN3WkdZNFpEazVOekExTnpGa1l6SXlPRFpsTmpSaE1XVmtPVEV5WmpkbE16VXk8L2NiYzpFbWJlZGRlZERvY3VtZW50QmluYXJ5T2JqZWN0PgogICAgICAgIDwvY2FjOkF0dGFjaG1lbnQ+CjwvY2FjOkFkZGl0aW9uYWxEb2N1bWVudFJlZmVyZW5jZT48Y2FjOlNpZ25hdHVyZT4KICAgICAgPGNiYzpJRD51cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6c2lnbmF0dXJlOkludm9pY2U8L2NiYzpJRD4KICAgICAgPGNiYzpTaWduYXR1cmVNZXRob2Q+dXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOmRzaWc6ZW52ZWxvcGVkOnhhZGVzPC9jYmM6U2lnbmF0dXJlTWV0aG9kPgo8L2NhYzpTaWduYXR1cmU+PGNhYzpBY2NvdW50aW5nU3VwcGxpZXJQYXJ0eT4KICAgICAgICA8Y2FjOlBhcnR5PgogICAgICAgICAgICA8Y2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgICAgICAgICA8Y2JjOklEIHNjaGVtZUlEPSJDUk4iPjEwMTAwMTAwMDA8L2NiYzpJRD4KICAgICAgICAgICAgPC9jYWM6UGFydHlJZGVudGlmaWNhdGlvbj4KICAgICAgICAgICAgPGNhYzpQb3N0YWxBZGRyZXNzPgogICAgICAgICAgICAgICAgPGNiYzpTdHJlZXROYW1lPtin2YTYp9mF2YrYsSDYs9mE2LfYp9mGIHwgUHJpbmNlIFN1bHRhbjwvY2JjOlN0cmVldE5hbWU+CiAgICAgICAgICAgICAgICA8Y2JjOkJ1aWxkaW5nTnVtYmVyPjIzMjI8L2NiYzpCdWlsZGluZ051bWJlcj4KICAgICAgICAgICAgICAgIDxjYmM6Q2l0eVN1YmRpdmlzaW9uTmFtZT7Yp9mE2YXYsdio2LkgfCBBbC1NdXJhYmJhPC9jYmM6Q2l0eVN1YmRpdmlzaW9uTmFtZT4KICAgICAgICAgICAgICAgIDxjYmM6Q2l0eU5hbWU+2KfZhNix2YrYp9i2IHwgUml5YWRoPC9jYmM6Q2l0eU5hbWU+CiAgICAgICAgICAgICAgICA8Y2JjOlBvc3RhbFpvbmU+MjMzMzM8L2NiYzpQb3N0YWxab25lPgogICAgICAgICAgICAgICAgPGNhYzpDb3VudHJ5PgogICAgICAgICAgICAgICAgICAgIDxjYmM6SWRlbnRpZmljYXRpb25Db2RlPlNBPC9jYmM6SWRlbnRpZmljYXRpb25Db2RlPgogICAgICAgICAgICAgICAgPC9jYWM6Q291bnRyeT4KICAgICAgICAgICAgPC9jYWM6UG9zdGFsQWRkcmVzcz4KICAgICAgICAgICAgPGNhYzpQYXJ0eVRheFNjaGVtZT4KICAgICAgICAgICAgICAgIDxjYmM6Q29tcGFueUlEPjM5OTk5OTk5OTkwMDAwMzwvY2JjOkNvbXBhbnlJRD4KICAgICAgICAgICAgICAgIDxjYWM6VGF4U2NoZW1lPgogICAgICAgICAgICAgICAgICAgIDxjYmM6SUQ+VkFUPC9jYmM6SUQ+CiAgICAgICAgICAgICAgICA8L2NhYzpUYXhTY2hlbWU+CiAgICAgICAgICAgIDwvY2FjOlBhcnR5VGF4U2NoZW1lPgogICAgICAgICAgICA8Y2FjOlBhcnR5TGVnYWxFbnRpdHk+CiAgICAgICAgICAgICAgICA8Y2JjOlJlZ2lzdHJhdGlvbk5hbWU+2LTYsdmD2Kkg2KrZiNix2YrYryDYp9mE2KrZg9mG2YjZhNmI2KzZitinINio2KPZgti12Ykg2LPYsdi52Kkg2KfZhNmF2K3Yr9mI2K/YqSB8IE1heGltdW0gU3BlZWQgVGVjaCBTdXBwbHkgTFREPC9jYmM6UmVnaXN0cmF0aW9uTmFtZT4KICAgICAgICAgICAgPC9jYWM6UGFydHlMZWdhbEVudGl0eT4KICAgICAgICA8L2NhYzpQYXJ0eT4KICAgIDwvY2FjOkFjY291bnRpbmdTdXBwbGllclBhcnR5PgogICAgIDxjYWM6QWNjb3VudGluZ0N1c3RvbWVyUGFydHk+CiAgICAgICAgPGNhYzpQYXJ0eT4KICAgICAgICAgICAgPGNhYzpQb3N0YWxBZGRyZXNzPgogICAgICAgICAgICAgICAgPGNiYzpTdHJlZXROYW1lPti12YTYp9itINin2YTYr9mK2YYgfCBTYWxhaCBBbC1EaW48L2NiYzpTdHJlZXROYW1lPgogICAgICAgICAgICAgICAgPGNiYzpCdWlsZGluZ051bWJlcj4xMTExPC9jYmM6QnVpbGRpbmdOdW1iZXI+CiAgICAgICAgICAgICAgICA8Y2JjOkNpdHlTdWJkaXZpc2lvbk5hbWU+2KfZhNmF2LHZiNisIHwgQWwtTXVyb29qPC9jYmM6Q2l0eVN1YmRpdmlzaW9uTmFtZT4KICAgICAgICAgICAgICAgIDxjYmM6Q2l0eU5hbWU+2KfZhNix2YrYp9i2IHwgUml5YWRoPC9jYmM6Q2l0eU5hbWU+CiAgICAgICAgICAgICAgICA8Y2JjOlBvc3RhbFpvbmU+MTIyMjI8L2NiYzpQb3N0YWxab25lPgogICAgICAgICAgICAgICAgPGNhYzpDb3VudHJ5PgogICAgICAgICAgICAgICAgICAgIDxjYmM6SWRlbnRpZmljYXRpb25Db2RlPlNBPC9jYmM6SWRlbnRpZmljYXRpb25Db2RlPgogICAgICAgICAgICAgICAgPC9jYWM6Q291bnRyeT4KICAgICAgICAgICAgPC9jYWM6UG9zdGFsQWRkcmVzcz4KICAgICAgICAgICAgPGNhYzpQYXJ0eVRheFNjaGVtZT4KICAgICAgICAgICAgICAgIDxjYmM6Q29tcGFueUlEPjM5OTk5OTk5OTgwMDAwMzwvY2JjOkNvbXBhbnlJRD4KICAgICAgICAgICAgICAgIDxjYWM6VGF4U2NoZW1lPgogICAgICAgICAgICAgICAgICAgIDxjYmM6SUQ+VkFUPC9jYmM6SUQ+CiAgICAgICAgICAgICAgICA8L2NhYzpUYXhTY2hlbWU+CiAgICAgICAgICAgIDwvY2FjOlBhcnR5VGF4U2NoZW1lPgogICAgICAgICAgICA8Y2FjOlBhcnR5TGVnYWxFbnRpdHk+CiAgICAgICAgICAgICAgICA8Y2JjOlJlZ2lzdHJhdGlvbk5hbWU+2LTYsdmD2Kkg2YbZhdin2LDYrCDZgdin2KrZiNix2Kkg2KfZhNmF2K3Yr9mI2K/YqSB8IEZhdG9vcmEgU2FtcGxlcyBMVEQ8L2NiYzpSZWdpc3RyYXRpb25OYW1lPgogICAgICAgICAgICA8L2NhYzpQYXJ0eUxlZ2FsRW50aXR5PgogICAgICAgIDwvY2FjOlBhcnR5PgogICAgPC9jYWM6QWNjb3VudGluZ0N1c3RvbWVyUGFydHk+CiAgICA8Y2FjOlBheW1lbnRNZWFucz4KICAgICAgICA8Y2JjOlBheW1lbnRNZWFuc0NvZGU+MTA8L2NiYzpQYXltZW50TWVhbnNDb2RlPgogICAgPC9jYWM6UGF5bWVudE1lYW5zPgogICAgPGNhYzpBbGxvd2FuY2VDaGFyZ2U+CiAgICAgICAgPGNiYzpDaGFyZ2VJbmRpY2F0b3I+ZmFsc2U8L2NiYzpDaGFyZ2VJbmRpY2F0b3I+CiAgICAgICAgPGNiYzpBbGxvd2FuY2VDaGFyZ2VSZWFzb24+ZGlzY291bnQ8L2NiYzpBbGxvd2FuY2VDaGFyZ2VSZWFzb24+CiAgICAgICAgPGNiYzpBbW91bnQgY3VycmVuY3lJRD0iU0FSIj4wLjAwPC9jYmM6QW1vdW50PgogICAgICAgIDxjYWM6VGF4Q2F0ZWdvcnk+CiAgICAgICAgICAgIDxjYmM6SUQgc2NoZW1lSUQ9IlVOL0VDRSA1MzA1IiBzY2hlbWVBZ2VuY3lJRD0iNiI+UzwvY2JjOklEPgogICAgICAgICAgICA8Y2JjOlBlcmNlbnQ+MTU8L2NiYzpQZXJjZW50PgogICAgICAgICAgICA8Y2FjOlRheFNjaGVtZT4KICAgICAgICAgICAgICAgIDxjYmM6SUQgc2NoZW1lSUQ9IlVOL0VDRSA1MTUzIiBzY2hlbWVBZ2VuY3lJRD0iNiI+VkFUPC9jYmM6SUQ+CiAgICAgICAgICAgIDwvY2FjOlRheFNjaGVtZT4KICAgICAgICA8L2NhYzpUYXhDYXRlZ29yeT4KICAgICAgICA8Y2FjOlRheENhdGVnb3J5PgogICAgICAgICAgICA8Y2JjOklEIHNjaGVtZUlEPSJVTi9FQ0UgNTMwNSIgc2NoZW1lQWdlbmN5SUQ9IjYiPlM8L2NiYzpJRD4KICAgICAgICAgICAgPGNiYzpQZXJjZW50PjE1PC9jYmM6UGVyY2VudD4KICAgICAgICAgICAgPGNhYzpUYXhTY2hlbWU+CiAgICAgICAgICAgICAgICA8Y2JjOklEIHNjaGVtZUlEPSJVTi9FQ0UgNTE1MyIgc2NoZW1lQWdlbmN5SUQ9IjYiPlZBVDwvY2JjOklEPgogICAgICAgICAgICA8L2NhYzpUYXhTY2hlbWU+CiAgICAgICAgPC9jYWM6VGF4Q2F0ZWdvcnk+CiAgICA8L2NhYzpBbGxvd2FuY2VDaGFyZ2U+CiAgICA8Y2FjOlRheFRvdGFsPgogICAgICAgIDxjYmM6VGF4QW1vdW50IGN1cnJlbmN5SUQ9IlNBUiI+MzAuMTU8L2NiYzpUYXhBbW91bnQ+CiAgICA8L2NhYzpUYXhUb3RhbD4KICAgIDxjYWM6VGF4VG90YWw+CiAgICAgICAgPGNiYzpUYXhBbW91bnQgY3VycmVuY3lJRD0iU0FSIj4zMC4xNTwvY2JjOlRheEFtb3VudD4KICAgICAgICA8Y2FjOlRheFN1YnRvdGFsPgogICAgICAgICAgICA8Y2JjOlRheGFibGVBbW91bnQgY3VycmVuY3lJRD0iU0FSIj4yMDEuMDA8L2NiYzpUYXhhYmxlQW1vdW50PgogICAgICAgICAgICA8Y2JjOlRheEFtb3VudCBjdXJyZW5jeUlEPSJTQVIiPjMwLjE1PC9jYmM6VGF4QW1vdW50PgogICAgICAgICAgICAgPGNhYzpUYXhDYXRlZ29yeT4KICAgICAgICAgICAgICAgICA8Y2JjOklEIHNjaGVtZUlEPSJVTi9FQ0UgNTMwNSIgc2NoZW1lQWdlbmN5SUQ9IjYiPlM8L2NiYzpJRD4KICAgICAgICAgICAgICAgICA8Y2JjOlBlcmNlbnQ+MTUuMDA8L2NiYzpQZXJjZW50PgogICAgICAgICAgICAgICAgPGNhYzpUYXhTY2hlbWU+CiAgICAgICAgICAgICAgICAgICA8Y2JjOklEIHNjaGVtZUlEPSJVTi9FQ0UgNTE1MyIgc2NoZW1lQWdlbmN5SUQ9IjYiPlZBVDwvY2JjOklEPgogICAgICAgICAgICAgICAgPC9jYWM6VGF4U2NoZW1lPgogICAgICAgICAgICAgPC9jYWM6VGF4Q2F0ZWdvcnk+CiAgICAgICAgPC9jYWM6VGF4U3VidG90YWw+CiAgICA8L2NhYzpUYXhUb3RhbD4KICAgIDxjYWM6TGVnYWxNb25ldGFyeVRvdGFsPgogICAgICAgIDxjYmM6TGluZUV4dGVuc2lvbkFtb3VudCBjdXJyZW5jeUlEPSJTQVIiPjIwMS4wMDwvY2JjOkxpbmVFeHRlbnNpb25BbW91bnQ+CiAgICAgICAgPGNiYzpUYXhFeGNsdXNpdmVBbW91bnQgY3VycmVuY3lJRD0iU0FSIj4yMDEuMDA8L2NiYzpUYXhFeGNsdXNpdmVBbW91bnQ+CiAgICAgICAgPGNiYzpUYXhJbmNsdXNpdmVBbW91bnQgY3VycmVuY3lJRD0iU0FSIj4yMzEuMTU8L2NiYzpUYXhJbmNsdXNpdmVBbW91bnQ+CiAgICAgICAgPGNiYzpBbGxvd2FuY2VUb3RhbEFtb3VudCBjdXJyZW5jeUlEPSJTQVIiPjAuMDA8L2NiYzpBbGxvd2FuY2VUb3RhbEFtb3VudD4KICAgICAgICA8Y2JjOlByZXBhaWRBbW91bnQgY3VycmVuY3lJRD0iU0FSIj4wLjAwPC9jYmM6UHJlcGFpZEFtb3VudD4KICAgICAgICA8Y2JjOlBheWFibGVBbW91bnQgY3VycmVuY3lJRD0iU0FSIj4yMzEuMTU8L2NiYzpQYXlhYmxlQW1vdW50PgogICAgPC9jYWM6TGVnYWxNb25ldGFyeVRvdGFsPgogICAgPGNhYzpJbnZvaWNlTGluZT4KICAgICAgICA8Y2JjOklEPjE8L2NiYzpJRD4KICAgICAgICA8Y2JjOkludm9pY2VkUXVhbnRpdHkgdW5pdENvZGU9IlBDRSI+MzMuMDAwMDAwPC9jYmM6SW52b2ljZWRRdWFudGl0eT4KICAgICAgICA8Y2JjOkxpbmVFeHRlbnNpb25BbW91bnQgY3VycmVuY3lJRD0iU0FSIj45OS4wMDwvY2JjOkxpbmVFeHRlbnNpb25BbW91bnQ+CiAgICAgICAgPGNhYzpUYXhUb3RhbD4KICAgICAgICAgICAgIDxjYmM6VGF4QW1vdW50IGN1cnJlbmN5SUQ9IlNBUiI+MTQuODU8L2NiYzpUYXhBbW91bnQ+CiAgICAgICAgICAgICA8Y2JjOlJvdW5kaW5nQW1vdW50IGN1cnJlbmN5SUQ9IlNBUiI+MTEzLjg1PC9jYmM6Um91bmRpbmdBbW91bnQ+CiAgICAgICAgPC9jYWM6VGF4VG90YWw+CiAgICAgICAgPGNhYzpJdGVtPgogICAgICAgICAgICA8Y2JjOk5hbWU+2YPYqtin2Kg8L2NiYzpOYW1lPgogICAgICAgICAgICA8Y2FjOkNsYXNzaWZpZWRUYXhDYXRlZ29yeT4KICAgICAgICAgICAgICAgIDxjYmM6SUQ+UzwvY2JjOklEPgogICAgICAgICAgICAgICAgPGNiYzpQZXJjZW50PjE1LjAwPC9jYmM6UGVyY2VudD4KICAgICAgICAgICAgICAgIDxjYWM6VGF4U2NoZW1lPgogICAgICAgICAgICAgICAgICAgIDxjYmM6SUQ+VkFUPC9jYmM6SUQ+CiAgICAgICAgICAgICAgICA8L2NhYzpUYXhTY2hlbWU+CiAgICAgICAgICAgIDwvY2FjOkNsYXNzaWZpZWRUYXhDYXRlZ29yeT4KICAgICAgICA8L2NhYzpJdGVtPgogICAgICAgIDxjYWM6UHJpY2U+CiAgICAgICAgICAgIDxjYmM6UHJpY2VBbW91bnQgY3VycmVuY3lJRD0iU0FSIj4zLjAwPC9jYmM6UHJpY2VBbW91bnQ+CiAgICAgICAgICAgIDxjYWM6QWxsb3dhbmNlQ2hhcmdlPgogICAgICAgICAgICAgICA8Y2JjOkNoYXJnZUluZGljYXRvcj50cnVlPC9jYmM6Q2hhcmdlSW5kaWNhdG9yPgogICAgICAgICAgICAgICA8Y2JjOkFsbG93YW5jZUNoYXJnZVJlYXNvbj5kaXNjb3VudDwvY2JjOkFsbG93YW5jZUNoYXJnZVJlYXNvbj4KICAgICAgICAgICAgICAgPGNiYzpBbW91bnQgY3VycmVuY3lJRD0iU0FSIj4wLjAwPC9jYmM6QW1vdW50PgogICAgICAgICAgICA8L2NhYzpBbGxvd2FuY2VDaGFyZ2U+CiAgICAgICAgPC9jYWM6UHJpY2U+CiAgICA8L2NhYzpJbnZvaWNlTGluZT4KICAgIDxjYWM6SW52b2ljZUxpbmU+CiAgICAgICAgPGNiYzpJRD4yPC9jYmM6SUQ+CiAgICAgICAgPGNiYzpJbnZvaWNlZFF1YW50aXR5IHVuaXRDb2RlPSJQQ0UiPjMuMDAwMDAwPC9jYmM6SW52b2ljZWRRdWFudGl0eT4KICAgICAgICA8Y2JjOkxpbmVFeHRlbnNpb25BbW91bnQgY3VycmVuY3lJRD0iU0FSIj4xMDIuMDA8L2NiYzpMaW5lRXh0ZW5zaW9uQW1vdW50PgogICAgICAgIDxjYWM6VGF4VG90YWw+CiAgICAgICAgICAgICA8Y2JjOlRheEFtb3VudCBjdXJyZW5jeUlEPSJTQVIiPjE1LjMwPC9jYmM6VGF4QW1vdW50PgogICAgICAgICAgICAgPGNiYzpSb3VuZGluZ0Ftb3VudCBjdXJyZW5jeUlEPSJTQVIiPjExNy4zMDwvY2JjOlJvdW5kaW5nQW1vdW50PgogICAgICAgIDwvY2FjOlRheFRvdGFsPgogICAgICAgIDxjYWM6SXRlbT4KICAgICAgICAgICAgPGNiYzpOYW1lPtmC2YTZhTwvY2JjOk5hbWU+CiAgICAgICAgICAgIDxjYWM6Q2xhc3NpZmllZFRheENhdGVnb3J5PgogICAgICAgICAgICAgICAgPGNiYzpJRD5TPC9jYmM6SUQ+CiAgICAgICAgICAgICAgICA8Y2JjOlBlcmNlbnQ+MTUuMDA8L2NiYzpQZXJjZW50PgogICAgICAgICAgICAgICAgPGNhYzpUYXhTY2hlbWU+CiAgICAgICAgICAgICAgICAgICAgPGNiYzpJRD5WQVQ8L2NiYzpJRD4KICAgICAgICAgICAgICAgIDwvY2FjOlRheFNjaGVtZT4KICAgICAgICAgICAgPC9jYWM6Q2xhc3NpZmllZFRheENhdGVnb3J5PgogICAgICAgIDwvY2FjOkl0ZW0+CiAgICAgICAgPGNhYzpQcmljZT4KICAgICAgICAgICAgPGNiYzpQcmljZUFtb3VudCBjdXJyZW5jeUlEPSJTQVIiPjM0LjAwPC9jYmM6UHJpY2VBbW91bnQ+CiAgICAgICAgICAgIDxjYWM6QWxsb3dhbmNlQ2hhcmdlPgogICAgICAgICAgICAgICA8Y2JjOkNoYXJnZUluZGljYXRvcj50cnVlPC9jYmM6Q2hhcmdlSW5kaWNhdG9yPgogICAgICAgICAgICAgICA8Y2JjOkFsbG93YW5jZUNoYXJnZVJlYXNvbj5kaXNjb3VudDwvY2JjOkFsbG93YW5jZUNoYXJnZVJlYXNvbj4KICAgICAgICAgICAgICAgPGNiYzpBbW91bnQgY3VycmVuY3lJRD0iU0FSIj4wLjAwPC9jYmM6QW1vdW50PgogICAgICAgICAgICA8L2NhYzpBbGxvd2FuY2VDaGFyZ2U+CiAgICAgICAgPC9jYWM6UHJpY2U+CiAgICA8L2NhYzpJbnZvaWNlTGluZT4KPC9JbnZvaWNlPg=="}
Before signing the invoice is this:
<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"><ext:UBLExtensions>
<ext:UBLExtension>
<ext:ExtensionURI>urn:oasis:names:specification:ubl:dsig:enveloped:xades</ext:ExtensionURI>
<ext:ExtensionContent>
<sig:UBLDocumentSignatures xmlns:sig="urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2" xmlns:sac="urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2" xmlns:sbc="urn:oasis:names:specification:ubl:schema:xsd:SignatureBasicComponents-2">
<sac:SignatureInformation>
<cbc:ID>urn:oasis:names:specification:ubl:signature:1</cbc:ID>
<sbc:ReferencedSignatureID>urn:oasis:names:specification:ubl:signature:Invoice</sbc:ReferencedSignatureID>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="signature">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2006/12/xml-c14n11"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256"/>
<ds:Reference Id="invoiceSignedData" URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
<ds:XPath>not(//ancestor-or-self::ext:UBLExtensions)</ds:XPath>
</ds:Transform>
<ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
<ds:XPath>not(//ancestor-or-self::cac:Signature)</ds:XPath>
</ds:Transform>
<ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
<ds:XPath>not(//ancestor-or-self::cac:AdditionalDocumentReference[cbc:ID="QR"])</ds:XPath>
</ds:Transform>
<ds:Transform Algorithm="http://www.w3.org/2006/12/xml-c14n11"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>Hss2gNFjBY5OJn/5CEVZSSNUMrSf4QlCMxwsioPN6fA=</ds:DigestValue>
</ds:Reference>
<ds:Reference Type="http://www.w3.org/2000/09/xmldsig#SignatureProperties" URI="#xadesSignedProperties">
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>NTUzMzVmMjExNWRjYzZkYzRlNjI1Y2Q1NDM1NWMwYjMzZjQ4MTZiYjlhOTZlMmY5ZDkzM2Q3ZDM1ODliNjE0ZA==</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>MEUCIQCs+DNQ1vlz7JoovA7JRjakn4tUs0JlCcAoJNh/J65FHwIgKppt2+DfcLXtKQ6yR49tcVydgs/MSY2yV9vATzcpUq4=</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIID3jCCA4SgAwIBAgITEQAAOAPF90Ajs/xcXwABAAA4AzAKBggqhkjOPQQDAjBiMRUwEwYKCZImiZPyLGQBGRYFbG9jYWwxEzARBgoJkiaJk/IsZAEZFgNnb3YxFzAVBgoJkiaJk/IsZAEZFgdleHRnYXp0MRswGQYDVQQDExJQUlpFSU5WT0lDRVNDQTQtQ0EwHhcNMjQwMTExMDkxOTMwWhcNMjkwMTA5MDkxOTMwWjB1MQswCQYDVQQGEwJTQTEmMCQGA1UEChMdTWF4aW11bSBTcGVlZCBUZWNoIFN1cHBseSBMVEQxFjAUBgNVBAsTDVJpeWFkaCBCcmFuY2gxJjAkBgNVBAMTHVRTVC04ODY0MzExNDUtMzk5OTk5OTk5OTAwMDAzMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEoWCKa0Sa9FIErTOv0uAkC1VIKXxU9nPpx2vlf4yhMejy8c02XJblDq7tPydo8mq0ahOMmNo8gwni7Xt1KT9UeKOCAgcwggIDMIGtBgNVHREEgaUwgaKkgZ8wgZwxOzA5BgNVBAQMMjEtVFNUfDItVFNUfDMtZWQyMmYxZDgtZTZhMi0xMTE4LTliNTgtZDlhOGYxMWU0NDVmMR8wHQYKCZImiZPyLGQBAQwPMzk5OTk5OTk5OTAwMDAzMQ0wCwYDVQQMDAQxMTAwMREwDwYDVQQaDAhSUlJEMjkyOTEaMBgGA1UEDwwRU3VwcGx5IGFjdGl2aXRpZXMwHQYDVR0OBBYEFEX+YvmmtnYoDf9BGbKo7ocTKYK1MB8GA1UdIwQYMBaAFJvKqqLtmqwskIFzVvpP2PxT+9NnMHsGCCsGAQUFBwEBBG8wbTBrBggrBgEFBQcwAoZfaHR0cDovL2FpYTQuemF0Y2EuZ292LnNhL0NlcnRFbnJvbGwvUFJaRUludm9pY2VTQ0E0LmV4dGdhenQuZ292LmxvY2FsX1BSWkVJTlZPSUNFU0NBNC1DQSgxKS5jcnQwDgYDVR0PAQH/BAQDAgeAMDwGCSsGAQQBgjcVBwQvMC0GJSsGAQQBgjcVCIGGqB2E0PsShu2dJIfO+xnTwFVmh/qlZYXZhD4CAWQCARIwHQYDVR0lBBYwFAYIKwYBBQUHAwMGCCsGAQUFBwMCMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwMwCgYIKwYBBQUHAwIwCgYIKoZIzj0EAwIDSAAwRQIhALE/ichmnWXCUKUbca3yci8oqwaLvFdHVjQrveI9uqAbAiA9hC4M8jgMBADPSzmd2uiPJA6gKR3LE03U75eqbC/rXA==</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
<ds:Object>
<xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="signature">
<xades:SignedProperties Id="xadesSignedProperties">
<xades:SignedSignatureProperties>
<xades:SigningTime>2024-01-14T10:26:49</xades:SigningTime>
<xades:SigningCertificate>
<xades:Cert>
<xades:CertDigest>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>ZDMwMmI0MTE1NzVjOTU2NTk4YzVlODhhYmI0ODU2NDUyNTU2YTVhYjhhMDFmN2FjYjk1YTA2OWQ0NjY2MjQ4NQ==</ds:DigestValue>
</xades:CertDigest>
<xades:IssuerSerial>
<ds:X509IssuerName>CN=PRZEINVOICESCA4-CA, DC=extgazt, DC=gov, DC=local</ds:X509IssuerName>
<ds:X509SerialNumber>379112742831380471835263969587287663520528387</ds:X509SerialNumber>
</xades:IssuerSerial>
</xades:Cert>
</xades:SigningCertificate>
</xades:SignedSignatureProperties>
</xades:SignedProperties>
</xades:QualifyingProperties>
</ds:Object>
</ds:Signature>
</sac:SignatureInformation>
</sig:UBLDocumentSignatures>
</ext:ExtensionContent>
</ext:UBLExtension>
</ext:UBLExtensions>
<cbc:ProfileID>reporting:1.0</cbc:ProfileID>
<cbc:ID>SME00010</cbc:ID>
<cbc:UUID>8e6000cf-1a98-4174-b3e7-b5d5954bc10d</cbc:UUID>
<cbc:IssueDate>2022-08-17</cbc:IssueDate>
<cbc:IssueTime>17:41:08</cbc:IssueTime>
<cbc:InvoiceTypeCode name="0200000">388</cbc:InvoiceTypeCode>
<cbc:Note languageID="ar">ABC</cbc:Note>
<cbc:DocumentCurrencyCode>SAR</cbc:DocumentCurrencyCode>
<cbc:TaxCurrencyCode>SAR</cbc:TaxCurrencyCode>
<cac:AdditionalDocumentReference>
<cbc:ID>ICV</cbc:ID>
<cbc:UUID>10</cbc:UUID>
</cac:AdditionalDocumentReference>
<cac:AdditionalDocumentReference>
<cbc:ID>PIH</cbc:ID>
<cac:Attachment>
<cbc:EmbeddedDocumentBinaryObject mimeCode="text/plain">NWZlY2ViNjZmZmM4NmYzOGQ5NTI3ODZjNmQ2OTZjNzljMmRiYzIzOWRkNGU5MWI0NjcyOWQ3M2EyN2ZiNTdlOQ==</cbc:EmbeddedDocumentBinaryObject>
</cac:Attachment>
</cac:AdditionalDocumentReference>
<cac:AdditionalDocumentReference>
<cbc:ID>QR</cbc:ID>
<cac:Attachment>
<cbc:EmbeddedDocumentBinaryObject mimeCode="text/plain">AW/YtNix2YPYqSDYqtmI2LHZitivINin2YTYqtmD2YbZiNmE2YjYrNmK2Kcg2KjYo9mC2LXZiSDYs9ix2LnYqSDYp9mE2YXYrdiv2YjYr9ipIHwgTWF4aW11bSBTcGVlZCBUZWNoIFN1cHBseSBMVEQCDzM5OTk5OTk5OTkwMDAwMwMTMjAyMi0wOC0xN1QxNzo0MTowOAQGMjMxLjE1BQUzMC4xNQYsSHNzMmdORmpCWTVPSm4vNUNFVlpTU05VTXJTZjRRbENNeHdzaW9QTjZmQT0HYE1FVUNJUUNzK0ROUTF2bHo3Sm9vdkE3SlJqYWtuNHRVczBKbENjQW9KTmgvSjY1Rkh3SWdLcHB0MitEZmNMWHRLUTZ5UjQ5dGNWeWRncy9NU1kyeVY5dkFUemNwVXE0PQhYMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEoWCKa0Sa9FIErTOv0uAkC1VIKXxU9nPpx2vlf4yhMejy8c02XJblDq7tPydo8mq0ahOMmNo8gwni7Xt1KT9UeAlHMEUCIQCxP4nIZp1lwlClG3Gt8nIvKKsGi7xXR1Y0K73iPbqgGwIgPYQuDPI4DAQAz0s5ndrojyQOoCkdyxNN1O+Xqmwv61w=</cbc:EmbeddedDocumentBinaryObject>
</cac:Attachment>
</cac:AdditionalDocumentReference><cac:Signature>
<cbc:ID>urn:oasis:names:specification:ubl:signature:Invoice</cbc:ID>
<cbc:SignatureMethod>urn:oasis:names:specification:ubl:dsig:enveloped:xades</cbc:SignatureMethod>
</cac:Signature><cac:AccountingSupplierParty>
<cac:Party>
<cac:PartyIdentification>
<cbc:ID schemeID="CRN">1010010000</cbc:ID>
</cac:PartyIdentification>
<cac:PostalAddress>
<cbc:StreetName>الامير سلطان | Prince Sultan</cbc:StreetName>
<cbc:BuildingNumber>2322</cbc:BuildingNumber>
<cbc:CitySubdivisionName>المربع | Al-Murabba</cbc:CitySubdivisionName>
<cbc:CityName>الرياض | Riyadh</cbc:CityName>
<cbc:PostalZone>23333</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>SA</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>399999999900003</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>شركة توريد التكنولوجيا بأقصى سرعة المحدودة | Maximum Speed Tech Supply LTD</cbc:RegistrationName>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingSupplierParty>
<cac:AccountingCustomerParty>
<cac:Party>
<cac:PostalAddress>
<cbc:StreetName>صلاح الدين | Salah Al-Din</cbc:StreetName>
<cbc:BuildingNumber>1111</cbc:BuildingNumber>
<cbc:CitySubdivisionName>المروج | Al-Murooj</cbc:CitySubdivisionName>
<cbc:CityName>الرياض | Riyadh</cbc:CityName>
<cbc:PostalZone>12222</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>SA</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>399999999800003</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>شركة نماذج فاتورة المحدودة | Fatoora Samples LTD</cbc:RegistrationName>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingCustomerParty>
<cac:PaymentMeans>
<cbc:PaymentMeansCode>10</cbc:PaymentMeansCode>
</cac:PaymentMeans>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReason>discount</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="SAR">0.00</cbc:Amount>
<cac:TaxCategory>
<cbc:ID schemeID="UN/ECE 5305" schemeAgencyID="6">S</cbc:ID>
<cbc:Percent>15</cbc:Percent>
<cac:TaxScheme>
<cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
<cac:TaxCategory>
<cbc:ID schemeID="UN/ECE 5305" schemeAgencyID="6">S</cbc:ID>
<cbc:Percent>15</cbc:Percent>
<cac:TaxScheme>
<cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:AllowanceCharge>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="SAR">30.15</cbc:TaxAmount>
</cac:TaxTotal>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="SAR">30.15</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="SAR">201.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="SAR">30.15</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID schemeID="UN/ECE 5305" schemeAgencyID="6">S</cbc:ID>
<cbc:Percent>15.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="SAR">201.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="SAR">201.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="SAR">231.15</cbc:TaxInclusiveAmount>
<cbc:AllowanceTotalAmount currencyID="SAR">0.00</cbc:AllowanceTotalAmount>
<cbc:PrepaidAmount currencyID="SAR">0.00</cbc:PrepaidAmount>
<cbc:PayableAmount currencyID="SAR">231.15</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="PCE">33.000000</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="SAR">99.00</cbc:LineExtensionAmount>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="SAR">14.85</cbc:TaxAmount>
<cbc:RoundingAmount currencyID="SAR">113.85</cbc:RoundingAmount>
</cac:TaxTotal>
<cac:Item>
<cbc:Name>كتاب</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>15.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="SAR">3.00</cbc:PriceAmount>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
<cbc:AllowanceChargeReason>discount</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="SAR">0.00</cbc:Amount>
</cac:AllowanceCharge>
</cac:Price>
</cac:InvoiceLine>
<cac:InvoiceLine>
<cbc:ID>2</cbc:ID>
<cbc:InvoicedQuantity unitCode="PCE">3.000000</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="SAR">102.00</cbc:LineExtensionAmount>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="SAR">15.30</cbc:TaxAmount>
<cbc:RoundingAmount currencyID="SAR">117.30</cbc:RoundingAmount>
</cac:TaxTotal>
<cac:Item>
<cbc:Name>قلم</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>15.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="SAR">34.00</cbc:PriceAmount>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
<cbc:AllowanceChargeReason>discount</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="SAR">0.00</cbc:Amount>
</cac:AllowanceCharge>
</cac:Price>
</cac:InvoiceLine>
</Invoice>
This is my simplified signed invoice xml:
<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"><ext:UBLExtensions>
<ext:UBLExtension>
<ext:ExtensionURI>urn:oasis:names:specification:ubl:dsig:enveloped:xades</ext:ExtensionURI>
<ext:ExtensionContent>
<sig:UBLDocumentSignatures xmlns:sig="urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2" xmlns:sac="urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2" xmlns:sbc="urn:oasis:names:specification:ubl:schema:xsd:SignatureBasicComponents-2">
<sac:SignatureInformation>
<cbc:ID>urn:oasis:names:specification:ubl:signature:1</cbc:ID>
<sbc:ReferencedSignatureID>urn:oasis:names:specification:ubl:signature:Invoice</sbc:ReferencedSignatureID>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="signature">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2006/12/xml-c14n11"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256"/>
<ds:Reference Id="invoiceSignedData" URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
<ds:XPath>not(//ancestor-or-self::ext:UBLExtensions)</ds:XPath>
</ds:Transform>
<ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
<ds:XPath>not(//ancestor-or-self::cac:Signature)</ds:XPath>
</ds:Transform>
<ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
<ds:XPath>not(//ancestor-or-self::cac:AdditionalDocumentReference[cbc:ID="QR"])</ds:XPath>
</ds:Transform>
<ds:Transform Algorithm="http://www.w3.org/2006/12/xml-c14n11"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>eyIhLLJdlUEDd3pgXhOofcVeYpXqBKDiRVMTxAaz5K8=</ds:DigestValue>
</ds:Reference>
<ds:Reference Type="http://www.w3.org/2000/09/xmldsig#SignatureProperties" URI="#xadesSignedProperties">
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>OGZhMzdkYmQ4NDZkOTUzM2E4NGRkNGRiMDVhNjk2YWMyZTU5ZjY1NzMxZjQxZTUzNDY5MzVhNTIxN2I2NjNlNQ==</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>MEQCIFHfpNtNzlkmzl3mpIVjYYy0oo1EITAgxfR6RK4oJT4QAiAlUAtgoVHC/6KpgCHypuZYvou0SDe7LcvRRh7wsyPrQw==</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIICPDCCAeOgAwIBAgIGAZNsfPp+MAoGCCqGSM49BAMCMBUxEzARBgNVBAMMCmVJbnZvaWNpbmcwHhcNMjQxMTI3MDcxOTA1WhcNMjkxMTI2MjEwMDAwWjB1MQswCQYDVQQGEwJTQTEWMBQGA1UECwwNUml5YWRoIEJyYW5jaDEmMCQGA1UECgwdTWF4aW11bSBTcGVlZCBUZWNoIFN1cHBseSBMVEQxJjAkBgNVBAMMHVRTVC04ODY0MzExNDUtMzk5OTk5OTk5OTAwMDAzMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEkIkasJ4xDpCrofXOl2yZKLR5tdaFwqYU/D0nyA9ixS6oH2hq1opcFZHAsCMeNnFejwdURsje56U/Yl3J9oxOcKOBwTCBvjAMBgNVHRMBAf8EAjAAMIGtBgNVHREEgaUwgaKkgZ8wgZwxOzA5BgNVBAQMMjEtVFNUfDItVFNUfDMtZWQyMmYxZDgtZTZhMi0xMTE4LTliNTgtZDlhOGYxMWU0NDVmMR8wHQYKCZImiZPyLGQBAQwPMzk5OTk5OTk5OTAwMDAzMQ0wCwYDVQQMDAQxMTAwMREwDwYDVQQaDAhSUlJEMjkyOTEaMBgGA1UEDwwRU3VwcGx5IGFjdGl2aXRpZXMwCgYIKoZIzj0EAwIDRwAwRAIgHA6euVsT/so1imtFOt0XyoRvHZJDLpWtsgjkupJKo+UCIGiiKUPiBz32+cdKWcCmZpFVK0ciYUUoHU+Hu4+82+dD</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
<ds:Object>
<xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="signature">
<xades:SignedProperties Id="xadesSignedProperties">
<xades:SignedSignatureProperties>
<xades:SigningTime>2024-11-27T10:19:10</xades:SigningTime>
<xades:SigningCertificate>
<xades:Cert>
<xades:CertDigest>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>MDVjZTAwYmIxMWUzNjBkM2IwYjBhZjY0NWVjNjMyZjYyYWZjMTYzYmY3OTA2ZDJkYzlmM2U3ODA1NGMwZWUwZQ==</ds:DigestValue>
</xades:CertDigest>
<xades:IssuerSerial>
<ds:X509IssuerName>CN=eInvoicing</ds:X509IssuerName>
<ds:X509SerialNumber>1732691950206</ds:X509SerialNumber>
</xades:IssuerSerial>
</xades:Cert>
</xades:SigningCertificate>
</xades:SignedSignatureProperties>
</xades:SignedProperties>
</xades:QualifyingProperties>
</ds:Object>
</ds:Signature>
</sac:SignatureInformation>
</sig:UBLDocumentSignatures>
</ext:ExtensionContent>
</ext:UBLExtension>
</ext:UBLExtensions>
<cbc:ProfileID>reporting:1.0</cbc:ProfileID>
<cbc:ID>SME00010</cbc:ID>
<cbc:UUID>8e6000cf-1a98-4174-b3e7-b5d5954bc10d</cbc:UUID>
<cbc:IssueDate>2022-08-17</cbc:IssueDate>
<cbc:IssueTime>17:41:08</cbc:IssueTime>
<cbc:InvoiceTypeCode name="0200000">388</cbc:InvoiceTypeCode>
<cbc:Note languageID="ar">ABC</cbc:Note>
<cbc:DocumentCurrencyCode>SAR</cbc:DocumentCurrencyCode>
<cbc:TaxCurrencyCode>SAR</cbc:TaxCurrencyCode>
<cac:AdditionalDocumentReference>
<cbc:ID>ICV</cbc:ID>
<cbc:UUID>10</cbc:UUID>
</cac:AdditionalDocumentReference>
<cac:AdditionalDocumentReference>
<cbc:ID>PIH</cbc:ID>
<cac:Attachment>
<cbc:EmbeddedDocumentBinaryObject mimeCode="text/plain">NWZlY2ViNjZmZmM4NmYzOGQ5NTI3ODZjNmQ2OTZjNzljMmRiYzIzOWRkNGU5MWI0NjcyOWQ3M2EyN2ZiNTdlOQ==</cbc:EmbeddedDocumentBinaryObject>
</cac:Attachment>
</cac:AdditionalDocumentReference>
<cac:AdditionalDocumentReference>
<cbc:ID>QR</cbc:ID>
<cac:Attachment>
<cbc:EmbeddedDocumentBinaryObject mimeCode="text/plain">MDE0YWQ4YjRkOGIxZDk4M2Q4YTkyMGQ4YWFkOTg4ZDhiMWQ5OGFkOGFmMjBkOGE3ZDk4NGQ4YWFkOTgzZDk4NmQ5ODhkOTg0ZDk4OGQ4YWNkOThhZDhhNzIwZDhhOGQ4YTNkOTgyZDhiNWQ5ODkyMGQ4YjNkOGIxZDhiOWQ4YTkyMGQ4YTdkOTg0ZDk4NWQ4YWRkOGFmZDk4OGQ4YWZkOGE5MjA3YzIwNGQ2MTc4Njk2ZDc1NmQyMDUzNzA2NTY1NjQyMDU0NjU2MzY4MjA1Mzc1NzA3MDZjNzkyMDRjNTQ0NDAyMGYzMzM5MzkzOTM5MzkzOTM5MzkzOTMwMzAzMDMwMzMwMzE0MzIzMDMyMzIyZDMwMzgyZDMxMzc1NDMxMzczYTM0MzEzYTMwMzg1YTA0MDYzMjMzMzEyZTMxMzUwNTA1MzMzMDJlMzEzNTA2MmM2NTc5NDk2ODRjNGM0YTY0NmM1NTQ1NDQ2NDMzNzA2NzU4Njg0ZjZmNjY2MzU2NjU1OTcwNTg3MTQyNGI0NDY5NTI1NjRkNTQ3ODQxNjE3YTM1NGIzODNkMDc2MDRkNDU1MTQzNDk0NjQ4NjY3MDRlNzQ0ZTdhNmM2YjZkN2E2YzMzNmQ3MDQ5NTY2YTU5NTk3OTMwNmY2ZjMxNDU0OTU0NDE2Nzc4NjY1MjM2NTI0YjM0NmY0YTU0MzQ1MTQxNjk0MTZjNTU0MTc0Njc2ZjU2NDg0MzJmMzY0YjcwNjc0MzQ4Nzk3MDc1NWE1OTc2NmY3NTMwNTM0NDY1Mzc0YzYzNzY1MjUyNjgzNzc3NzM3OTUwNzI1MTc3M2QzZDA4MDMwMDRkNDk0OTQzNTA0NDQzNDM0MTY1NGY2NzQxNzc0OTQyNDE2NzQ5NDc0MTVhNGU3MzY2NTA3MDJiNGQ0MTZmNDc0MzQzNzE0NzUzNGQzNDM5NDI0MTRkNDM0ZDQyNTU3ODQ1N2E0MTUyNDI2NzRlNTY0MjQxNGQ0ZDQzNmQ1NjRhNjI2ZTVhNzY2MTU3NGU3MDYyNmQ2Mzc3NDg2ODYzNGU0ZDZhNTE3ODRkNTQ0OTMzNGQ0NDYzNzg0ZjU0NDEzMTU3Njg2MzRlNGQ2YTZiNzg0ZDU0NDkzMjRkNmE0NTc3NGQ0NDQxNzc1NzZhNDIzMTRkNTE3Mzc3NDM1MTU5NDQ1NjUxNTE0NzQ1Nzc0YTU0NTE1NDQ1NTc0ZDQyNTE0NzQxMzE1NTQ1NDM3Nzc3NGU1NTZkNmMzNTU5NTc1MjZmNDk0NTRhNzk1OTU3MzU2YTYxNDQ0NTZkNGQ0MzUxNDc0MTMxNTU0NTQzNjc3NzY0NTQ1NzQ2MzQ2MTU3MzEzMTYyNTM0MjU0NjM0NzU2NmM1YTQzNDI1NTVhNTc0ZTZmNDk0NjRlMzE2MzQ4NDI3MzY1NTM0MjRkNTY0NTUxNzg0YTZhNDE2YjQyNjc0ZTU2NDI0MTRkNGQ0ODU2NTI1NDU2NDMzMDM0NGY0NDU5MzA0ZDdhNDU3ODRlNDQ1NTc0NGQ3YTZiMzU0ZjU0NmIzNTRmNTQ2YjM1NGY1NDQxNzc0ZDQ0NDE3YTRkNDY1OTc3NDU0MTU5NDg0YjZmNWE0OTdhNmEzMDQzNDE1MTU5NDY0YjM0NDU0NTQxNDE2ZjQ0NTE2NzQxNDU2YjQ5NmI2MTczNGEzNDc4NDQ3MDQzNzI2ZjY2NTg0ZjZjMzI3OTVhNGI0YzUyMzU3NDY0NjE0Njc3NzE1OTU1MmY0NDMwNmU3OTQxMzk2OTc4NTMzNjZmNDgzMjY4NzEzMTZmNzA2MzQ2NWE0ODQxNzM0MzRkNjU0ZTZlNDY2NTZhNzc2NDU1NTI3MzZhNjUzNTM2NTUyZjU5NmMzMzRhMzk2Zjc4NGY2MzRiNGY0Mjc3NTQ0MzQyNzY2YTQxNGQ0MjY3NGU1NjQ4NTI0ZDQyNDE2NjM4NDU0MTZhNDE0MTRkNDk0Nzc0NDI2NzRlNTY0ODUyNDU0NTY3NjE1NTc3Njc2MTRiNmI2NzVhMzg3NzY3NWE3Nzc4NGY3YTQxMzU0MjY3NGU1NjQyNDE1MTRkNGQ2YTQ1NzQ1NjQ2NGU1NTY2NDQ0OTc0NTY0NjRlNTU2NjQ0NGQ3NDVhNTc1MTc5NGQ2ZDU5Nzg1YTQ0Njc3NDVhNTQ1YTY4NGQ2OTMwNzg0ZDU0NDUzNDRjNTQ2YzY5NGU1NDY3NzQ1YTQ0NmM2ODRmNDc1OTc4NGQ1NzU1MzA0ZTQ0NTY2ZDRkNTIzODc3NDg1MTU5NGI0MzVhNDk2ZDY5NWE1MDc5NGM0NzUxNDI0MTUxNzc1MDRkN2E2YjM1NGY1NDZiMzU0ZjU0NmIzNTRmNTQ0MTc3NGQ0NDQxN2E0ZDUxMzA3NzQzNzc1OTQ0NTY1MTUxNGQ0NDQxNTE3ODRkNTQ0MTc3NGQ1MjQ1Nzc0NDc3NTk0NDU2NTE1MTYxNDQ0MTY4NTM1NTZjNGE0NTRkNmE2Yjc5NGY1NDQ1NjE0ZDQyNjc0NzQxMzE1NTQ1NDQ3Nzc3NTI1NTMzNTY3NzYzNDc3ODM1NDk0NzQ2NmE2NDQ3NmMzMjYxNTg1MjcwNWE1ODRkNzc0MzY3NTk0OTRiNmY1YTQ5N2E2YTMwNDU0MTc3NDk0NDUyNzc0MTc3NTI0MTQ5Njc0ODQxMzY2NTc1NTY3MzU0MmY3MzZmMzE2OTZkNzQ0NjRmNzQzMDU4Nzk2ZjUyNzY0ODVhNGE0NDRjNzA1Nzc0NzM2NzZhNmI3NTcwNGE0YjZmMmI1NTQzNDk0NzY5Njk0YjU1NTA2OTQyN2EzMzMyMmI2MzY0NGI1NzYzNDM2ZDVhNzA0NjU2NGIzMDYzNjk1OTU1NTU2ZjQ4NTUyYjQ4NzUzNDJiMzgzMjJiNjQ0NDA5OGUzMDQ1MDIyMDQwMTUwOWVlZTEzZDVhMDY1ZWQzZTk4MGNiNmM3OGI1MGZlOWEzOTEyY2JkYzU4NzU1ZGZjZWJiYmU2OTA3MWIwMjIxMDBiODQ2Nzc2YjIyMjMwMzYyNGU5ZDVjNDVlYjM1MTcwZGY4ZDk5NzA1NzFkYzIyODZlNjRhMWVkOTEyZjdlMzUy</cbc:EmbeddedDocumentBinaryObject>
</cac:Attachment>
</cac:AdditionalDocumentReference><cac:Signature>
<cbc:ID>urn:oasis:names:specification:ubl:signature:Invoice</cbc:ID>
<cbc:SignatureMethod>urn:oasis:names:specification:ubl:dsig:enveloped:xades</cbc:SignatureMethod>
</cac:Signature><cac:AccountingSupplierParty>
<cac:Party>
<cac:PartyIdentification>
<cbc:ID schemeID="CRN">1010010000</cbc:ID>
</cac:PartyIdentification>
<cac:PostalAddress>
<cbc:StreetName>الامير سلطان | Prince Sultan</cbc:StreetName>
<cbc:BuildingNumber>2322</cbc:BuildingNumber>
<cbc:CitySubdivisionName>المربع | Al-Murabba</cbc:CitySubdivisionName>
<cbc:CityName>الرياض | Riyadh</cbc:CityName>
<cbc:PostalZone>23333</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>SA</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>399999999900003</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>شركة توريد التكنولوجيا بأقصى سرعة المحدودة | Maximum Speed Tech Supply LTD</cbc:RegistrationName>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingSupplierParty>
<cac:AccountingCustomerParty>
<cac:Party>
<cac:PostalAddress>
<cbc:StreetName>صلاح الدين | Salah Al-Din</cbc:StreetName>
<cbc:BuildingNumber>1111</cbc:BuildingNumber>
<cbc:CitySubdivisionName>المروج | Al-Murooj</cbc:CitySubdivisionName>
<cbc:CityName>الرياض | Riyadh</cbc:CityName>
<cbc:PostalZone>12222</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>SA</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>399999999800003</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>شركة نماذج فاتورة المحدودة | Fatoora Samples LTD</cbc:RegistrationName>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingCustomerParty>
<cac:PaymentMeans>
<cbc:PaymentMeansCode>10</cbc:PaymentMeansCode>
</cac:PaymentMeans>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReason>discount</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="SAR">0.00</cbc:Amount>
<cac:TaxCategory>
<cbc:ID schemeID="UN/ECE 5305" schemeAgencyID="6">S</cbc:ID>
<cbc:Percent>15</cbc:Percent>
<cac:TaxScheme>
<cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
<cac:TaxCategory>
<cbc:ID schemeID="UN/ECE 5305" schemeAgencyID="6">S</cbc:ID>
<cbc:Percent>15</cbc:Percent>
<cac:TaxScheme>
<cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:AllowanceCharge>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="SAR">30.15</cbc:TaxAmount>
</cac:TaxTotal>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="SAR">30.15</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="SAR">201.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="SAR">30.15</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID schemeID="UN/ECE 5305" schemeAgencyID="6">S</cbc:ID>
<cbc:Percent>15.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="SAR">201.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="SAR">201.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="SAR">231.15</cbc:TaxInclusiveAmount>
<cbc:AllowanceTotalAmount currencyID="SAR">0.00</cbc:AllowanceTotalAmount>
<cbc:PrepaidAmount currencyID="SAR">0.00</cbc:PrepaidAmount>
<cbc:PayableAmount currencyID="SAR">231.15</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="PCE">33.000000</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="SAR">99.00</cbc:LineExtensionAmount>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="SAR">14.85</cbc:TaxAmount>
<cbc:RoundingAmount currencyID="SAR">113.85</cbc:RoundingAmount>
</cac:TaxTotal>
<cac:Item>
<cbc:Name>كتاب</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>15.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="SAR">3.00</cbc:PriceAmount>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
<cbc:AllowanceChargeReason>discount</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="SAR">0.00</cbc:Amount>
</cac:AllowanceCharge>
</cac:Price>
</cac:InvoiceLine>
<cac:InvoiceLine>
<cbc:ID>2</cbc:ID>
<cbc:InvoicedQuantity unitCode="PCE">3.000000</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="SAR">102.00</cbc:LineExtensionAmount>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="SAR">15.30</cbc:TaxAmount>
<cbc:RoundingAmount currencyID="SAR">117.30</cbc:RoundingAmount>
</cac:TaxTotal>
<cac:Item>
<cbc:Name>قلم</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>15.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="SAR">34.00</cbc:PriceAmount>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
<cbc:AllowanceChargeReason>discount</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="SAR">0.00</cbc:Amount>
</cac:AllowanceCharge>
</cac:Price>
</cac:InvoiceLine>
</Invoice>
I am implementing zatca in PHP here it is:
public function complianceInvoiceAPI()
{
// ========================== START: PRIVATE KEY + CSR + CSID INFO =================================
$returnData = $this->csidGen();
// // CSID + CSR DATA
// dd(json_encode($returnData));
/*
{
"csr":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ0dUQ0NBYjhDQVFBd2RURUxNQWtHQTFVRUJoTUNVMEV4RmpBVUJnTlZCQXNNRFZKcGVXRmthQ0JDY21GdQpZMmd4SmpBa0JnTlZCQW9NSFUxaGVHbHRkVzBnVTNCbFpXUWdWR1ZqYUNCVGRYQndiSGtnVEZSRU1TWXdKQVlEClZRUUREQjFVVTFRdE9EZzJORE14TVRRMUxUTTVPVGs1T1RrNU9Ua3dNREF3TXpCV01CQUdCeXFHU000OUFnRUcKQlN1QkJBQUtBMElBQkhSVExvNnRuWFdqajhjUlcwbldSdjkzOGJRWnJNL2FoazJRZUtIYThsaGlMZlM5eG9FQgp4bSs2UVhBenBrbjA3U2ZSMTlCTCtyb1dzYkpHRUpTdnNiQ2dnZW93Z2VjR0NTcUdTSWIzRFFFSkRqR0IyVENCCjFqQWtCZ2tyQmdFRUFZb2ZGQUlFRnhNVlZGTlVXa0ZVUTBFdFEyOWtaUzFUYVdkdWFXNW5NSUd0QmdOVkhSRUUKZ2FVd2dhS2tnWjh3Z1p3eE96QTVCZ05WQkFRTU1qRXRWRk5VZkRJdFZGTlVmRE10WldReU1tWXhaRGd0WlRaaApNaTB4TVRFNExUbGlOVGd0WkRsaE9HWXhNV1UwTkRWbU1SOHdIUVlLQ1pJbWlaUHlMR1FCQVF3UE16azVPVGs1Ck9UazVPVEF3TURBek1RMHdDd1lEVlFRTURBUXhNVEF3TVJFd0R3WURWUVFhREFoU1VsSkVNamt5T1RFYU1CZ0cKQTFVRUR3d1JVM1Z3Y0d4NUlHRmpkR2wyYVhScFpYTXdDZ1lJS29aSXpqMEVBd0lEU0FBd1JRSWdVWXA4V01JTQo4RVNBUlF2WTNQNE0zSWo3czc5bHBRUXRQKzlIM0JNK0F5Y0NJUUNXcnQ5VGE5Sk0yZWR6TXRWNXFWNE9seVBoCm1OaFpTUFBUTlY2TWxyUlJxQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=",
"binarySecurityToken":"TUlJQ1BUQ0NBZU9nQXdJQkFnSUdBWk5KYWphZk1Bb0dDQ3FHU000OUJBTUNNQlV4RXpBUkJnTlZCQU1NQ21WSmJuWnZhV05wYm1jd0hoY05NalF4TVRJd01URTFNVFV5V2hjTk1qa3hNVEU1TWpFd01EQXdXakIxTVFzd0NRWURWUVFHRXdKVFFURVdNQlFHQTFVRUN3d05VbWw1WVdSb0lFSnlZVzVqYURFbU1DUUdBMVVFQ2d3ZFRXRjRhVzExYlNCVGNHVmxaQ0JVWldOb0lGTjFjSEJzZVNCTVZFUXhKakFrQmdOVkJBTU1IVlJUVkMwNE9EWTBNekV4TkRVdE16azVPVGs1T1RrNU9UQXdNREF6TUZZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUFvRFFnQUVkRk11anEyZGRhT1B4eEZiU2RaRy8zZnh0Qm1zejlxR1RaQjRvZHJ5V0dJdDlMM0dnUUhHYjdwQmNET21TZlR0SjlIWDBFdjZ1aGF4c2tZUWxLK3hzS09Cd1RDQnZqQU1CZ05WSFJNQkFmOEVBakFBTUlHdEJnTlZIUkVFZ2FVd2dhS2tnWjh3Z1p3eE96QTVCZ05WQkFRTU1qRXRWRk5VZkRJdFZGTlVmRE10WldReU1tWXhaRGd0WlRaaE1pMHhNVEU0TFRsaU5UZ3RaRGxoT0dZeE1XVTBORFZtTVI4d0hRWUtDWkltaVpQeUxHUUJBUXdQTXprNU9UazVPVGs1T1RBd01EQXpNUTB3Q3dZRFZRUU1EQVF4TVRBd01SRXdEd1lEVlFRYURBaFNVbEpFTWpreU9URWFNQmdHQTFVRUR3d1JVM1Z3Y0d4NUlHRmpkR2wyYVhScFpYTXdDZ1lJS29aSXpqMEVBd0lEU0FBd1JRSWdGQUxkWWJkWlQ5aWJDQ3B3MUlON1JRQWJRVHN2N3pzbTErcG4xZDhOOHMwQ0lRQzVRa0J3OUt1Z3QrU0kyZUl6UnNMZHU1OTU0SUhOL1Q0cnNWaGZqNzNlY0E9PQ==",
"dispositionMessage":"ISSUED",
"requestID":1234567890123,
"secret":"5Ti4+lQjS2U2acqTmuL+a5kkUswWVWv3HIqddUPVAC0=",
"errors":null,
"privateKeyContent":"MHQCAQEEINXO5e3fEwl\/bUXVUXUzX66de3GW77UyBlRrt0MK\/4EfoAcGBSuBBAAKoUQDQgAEdFMujq2ddaOPxxFbSdZG\/3fxtBmsz9qGTZB4odryWGIt9L3GgQHGb7pBcDOmSfTtJ9HX0Ev6uhaxskYQlK+xsA=="
}
*/
//X509 certificate
$csid_base64_decoded_binarySecurityToken = base64_decode($returnData['binarySecurityToken']);
$csid_privateKey = $returnData['privateKeyContent'];
// ========================== END: PRIVATE KEY + CSR + CSID INFO =================================
$einvoicexml = '<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"><ext:UBLExtensions>
<ext:UBLExtension>
<ext:ExtensionURI>urn:oasis:names:specification:ubl:dsig:enveloped:xades</ext:ExtensionURI>
<ext:ExtensionContent>
<sig:UBLDocumentSignatures xmlns:sig="urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2" xmlns:sac="urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2" xmlns:sbc="urn:oasis:names:specification:ubl:schema:xsd:SignatureBasicComponents-2">
<sac:SignatureInformation>
<cbc:ID>urn:oasis:names:specification:ubl:signature:1</cbc:ID>
<sbc:ReferencedSignatureID>urn:oasis:names:specification:ubl:signature:Invoice</sbc:ReferencedSignatureID>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="signature">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2006/12/xml-c14n11"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256"/>
<ds:Reference Id="invoiceSignedData" URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
<ds:XPath>not(//ancestor-or-self::ext:UBLExtensions)</ds:XPath>
</ds:Transform>
<ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
<ds:XPath>not(//ancestor-or-self::cac:Signature)</ds:XPath>
</ds:Transform>
<ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
<ds:XPath>not(//ancestor-or-self::cac:AdditionalDocumentReference[cbc:ID="QR"])</ds:XPath>
</ds:Transform>
<ds:Transform Algorithm="http://www.w3.org/2006/12/xml-c14n11"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>Hss2gNFjBY5OJn/5CEVZSSNUMrSf4QlCMxwsioPN6fA=</ds:DigestValue>
</ds:Reference>
<ds:Reference Type="http://www.w3.org/2000/09/xmldsig#SignatureProperties" URI="#xadesSignedProperties">
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>NTUzMzVmMjExNWRjYzZkYzRlNjI1Y2Q1NDM1NWMwYjMzZjQ4MTZiYjlhOTZlMmY5ZDkzM2Q3ZDM1ODliNjE0ZA==</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>MEUCIQCs+DNQ1vlz7JoovA7JRjakn4tUs0JlCcAoJNh/J65FHwIgKppt2+DfcLXtKQ6yR49tcVydgs/MSY2yV9vATzcpUq4=</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIID3jCCA4SgAwIBAgITEQAAOAPF90Ajs/xcXwABAAA4AzAKBggqhkjOPQQDAjBiMRUwEwYKCZImiZPyLGQBGRYFbG9jYWwxEzARBgoJkiaJk/IsZAEZFgNnb3YxFzAVBgoJkiaJk/IsZAEZFgdleHRnYXp0MRswGQYDVQQDExJQUlpFSU5WT0lDRVNDQTQtQ0EwHhcNMjQwMTExMDkxOTMwWhcNMjkwMTA5MDkxOTMwWjB1MQswCQYDVQQGEwJTQTEmMCQGA1UEChMdTWF4aW11bSBTcGVlZCBUZWNoIFN1cHBseSBMVEQxFjAUBgNVBAsTDVJpeWFkaCBCcmFuY2gxJjAkBgNVBAMTHVRTVC04ODY0MzExNDUtMzk5OTk5OTk5OTAwMDAzMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEoWCKa0Sa9FIErTOv0uAkC1VIKXxU9nPpx2vlf4yhMejy8c02XJblDq7tPydo8mq0ahOMmNo8gwni7Xt1KT9UeKOCAgcwggIDMIGtBgNVHREEgaUwgaKkgZ8wgZwxOzA5BgNVBAQMMjEtVFNUfDItVFNUfDMtZWQyMmYxZDgtZTZhMi0xMTE4LTliNTgtZDlhOGYxMWU0NDVmMR8wHQYKCZImiZPyLGQBAQwPMzk5OTk5OTk5OTAwMDAzMQ0wCwYDVQQMDAQxMTAwMREwDwYDVQQaDAhSUlJEMjkyOTEaMBgGA1UEDwwRU3VwcGx5IGFjdGl2aXRpZXMwHQYDVR0OBBYEFEX+YvmmtnYoDf9BGbKo7ocTKYK1MB8GA1UdIwQYMBaAFJvKqqLtmqwskIFzVvpP2PxT+9NnMHsGCCsGAQUFBwEBBG8wbTBrBggrBgEFBQcwAoZfaHR0cDovL2FpYTQuemF0Y2EuZ292LnNhL0NlcnRFbnJvbGwvUFJaRUludm9pY2VTQ0E0LmV4dGdhenQuZ292LmxvY2FsX1BSWkVJTlZPSUNFU0NBNC1DQSgxKS5jcnQwDgYDVR0PAQH/BAQDAgeAMDwGCSsGAQQBgjcVBwQvMC0GJSsGAQQBgjcVCIGGqB2E0PsShu2dJIfO+xnTwFVmh/qlZYXZhD4CAWQCARIwHQYDVR0lBBYwFAYIKwYBBQUHAwMGCCsGAQUFBwMCMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwMwCgYIKwYBBQUHAwIwCgYIKoZIzj0EAwIDSAAwRQIhALE/ichmnWXCUKUbca3yci8oqwaLvFdHVjQrveI9uqAbAiA9hC4M8jgMBADPSzmd2uiPJA6gKR3LE03U75eqbC/rXA==</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
<ds:Object>
<xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="signature">
<xades:SignedProperties Id="xadesSignedProperties">
<xades:SignedSignatureProperties>
<xades:SigningTime>2024-01-14T10:26:49</xades:SigningTime>
<xades:SigningCertificate>
<xades:Cert>
<xades:CertDigest>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>ZDMwMmI0MTE1NzVjOTU2NTk4YzVlODhhYmI0ODU2NDUyNTU2YTVhYjhhMDFmN2FjYjk1YTA2OWQ0NjY2MjQ4NQ==</ds:DigestValue>
</xades:CertDigest>
<xades:IssuerSerial>
<ds:X509IssuerName>CN=PRZEINVOICESCA4-CA, DC=extgazt, DC=gov, DC=local</ds:X509IssuerName>
<ds:X509SerialNumber>379112742831380471835263969587287663520528387</ds:X509SerialNumber>
</xades:IssuerSerial>
</xades:Cert>
</xades:SigningCertificate>
</xades:SignedSignatureProperties>
</xades:SignedProperties>
</xades:QualifyingProperties>
</ds:Object>
</ds:Signature>
</sac:SignatureInformation>
</sig:UBLDocumentSignatures>
</ext:ExtensionContent>
</ext:UBLExtension>
</ext:UBLExtensions>
<cbc:ProfileID>reporting:1.0</cbc:ProfileID>
<cbc:ID>SME00010</cbc:ID>
<cbc:UUID>8e6000cf-1a98-4174-b3e7-b5d5954bc10d</cbc:UUID>
<cbc:IssueDate>2022-08-17</cbc:IssueDate>
<cbc:IssueTime>17:41:08</cbc:IssueTime>
<cbc:InvoiceTypeCode name="0200000">388</cbc:InvoiceTypeCode>
<cbc:Note languageID="ar">ABC</cbc:Note>
<cbc:DocumentCurrencyCode>SAR</cbc:DocumentCurrencyCode>
<cbc:TaxCurrencyCode>SAR</cbc:TaxCurrencyCode>
<cac:AdditionalDocumentReference>
<cbc:ID>ICV</cbc:ID>
<cbc:UUID>10</cbc:UUID>
</cac:AdditionalDocumentReference>
<cac:AdditionalDocumentReference>
<cbc:ID>PIH</cbc:ID>
<cac:Attachment>
<cbc:EmbeddedDocumentBinaryObject mimeCode="text/plain">NWZlY2ViNjZmZmM4NmYzOGQ5NTI3ODZjNmQ2OTZjNzljMmRiYzIzOWRkNGU5MWI0NjcyOWQ3M2EyN2ZiNTdlOQ==</cbc:EmbeddedDocumentBinaryObject>
</cac:Attachment>
</cac:AdditionalDocumentReference>
<cac:AdditionalDocumentReference>
<cbc:ID>QR</cbc:ID>
<cac:Attachment>
<cbc:EmbeddedDocumentBinaryObject mimeCode="text/plain">AW/YtNix2YPYqSDYqtmI2LHZitivINin2YTYqtmD2YbZiNmE2YjYrNmK2Kcg2KjYo9mC2LXZiSDYs9ix2LnYqSDYp9mE2YXYrdiv2YjYr9ipIHwgTWF4aW11bSBTcGVlZCBUZWNoIFN1cHBseSBMVEQCDzM5OTk5OTk5OTkwMDAwMwMTMjAyMi0wOC0xN1QxNzo0MTowOAQGMjMxLjE1BQUzMC4xNQYsSHNzMmdORmpCWTVPSm4vNUNFVlpTU05VTXJTZjRRbENNeHdzaW9QTjZmQT0HYE1FVUNJUUNzK0ROUTF2bHo3Sm9vdkE3SlJqYWtuNHRVczBKbENjQW9KTmgvSjY1Rkh3SWdLcHB0MitEZmNMWHRLUTZ5UjQ5dGNWeWRncy9NU1kyeVY5dkFUemNwVXE0PQhYMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEoWCKa0Sa9FIErTOv0uAkC1VIKXxU9nPpx2vlf4yhMejy8c02XJblDq7tPydo8mq0ahOMmNo8gwni7Xt1KT9UeAlHMEUCIQCxP4nIZp1lwlClG3Gt8nIvKKsGi7xXR1Y0K73iPbqgGwIgPYQuDPI4DAQAz0s5ndrojyQOoCkdyxNN1O+Xqmwv61w=</cbc:EmbeddedDocumentBinaryObject>
</cac:Attachment>
</cac:AdditionalDocumentReference><cac:Signature>
<cbc:ID>urn:oasis:names:specification:ubl:signature:Invoice</cbc:ID>
<cbc:SignatureMethod>urn:oasis:names:specification:ubl:dsig:enveloped:xades</cbc:SignatureMethod>
</cac:Signature><cac:AccountingSupplierParty>
<cac:Party>
<cac:PartyIdentification>
<cbc:ID schemeID="CRN">1010010000</cbc:ID>
</cac:PartyIdentification>
<cac:PostalAddress>
<cbc:StreetName>الامير سلطان | Prince Sultan</cbc:StreetName>
<cbc:BuildingNumber>2322</cbc:BuildingNumber>
<cbc:CitySubdivisionName>المربع | Al-Murabba</cbc:CitySubdivisionName>
<cbc:CityName>الرياض | Riyadh</cbc:CityName>
<cbc:PostalZone>23333</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>SA</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>399999999900003</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>شركة توريد التكنولوجيا بأقصى سرعة المحدودة | Maximum Speed Tech Supply LTD</cbc:RegistrationName>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingSupplierParty>
<cac:AccountingCustomerParty>
<cac:Party>
<cac:PostalAddress>
<cbc:StreetName>صلاح الدين | Salah Al-Din</cbc:StreetName>
<cbc:BuildingNumber>1111</cbc:BuildingNumber>
<cbc:CitySubdivisionName>المروج | Al-Murooj</cbc:CitySubdivisionName>
<cbc:CityName>الرياض | Riyadh</cbc:CityName>
<cbc:PostalZone>12222</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>SA</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>399999999800003</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>شركة نماذج فاتورة المحدودة | Fatoora Samples LTD</cbc:RegistrationName>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingCustomerParty>
<cac:PaymentMeans>
<cbc:PaymentMeansCode>10</cbc:PaymentMeansCode>
</cac:PaymentMeans>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReason>discount</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="SAR">0.00</cbc:Amount>
<cac:TaxCategory>
<cbc:ID schemeID="UN/ECE 5305" schemeAgencyID="6">S</cbc:ID>
<cbc:Percent>15</cbc:Percent>
<cac:TaxScheme>
<cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
<cac:TaxCategory>
<cbc:ID schemeID="UN/ECE 5305" schemeAgencyID="6">S</cbc:ID>
<cbc:Percent>15</cbc:Percent>
<cac:TaxScheme>
<cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:AllowanceCharge>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="SAR">30.15</cbc:TaxAmount>
</cac:TaxTotal>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="SAR">30.15</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="SAR">201.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="SAR">30.15</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID schemeID="UN/ECE 5305" schemeAgencyID="6">S</cbc:ID>
<cbc:Percent>15.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="SAR">201.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="SAR">201.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="SAR">231.15</cbc:TaxInclusiveAmount>
<cbc:AllowanceTotalAmount currencyID="SAR">0.00</cbc:AllowanceTotalAmount>
<cbc:PrepaidAmount currencyID="SAR">0.00</cbc:PrepaidAmount>
<cbc:PayableAmount currencyID="SAR">231.15</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="PCE">33.000000</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="SAR">99.00</cbc:LineExtensionAmount>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="SAR">14.85</cbc:TaxAmount>
<cbc:RoundingAmount currencyID="SAR">113.85</cbc:RoundingAmount>
</cac:TaxTotal>
<cac:Item>
<cbc:Name>كتاب</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>15.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="SAR">3.00</cbc:PriceAmount>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
<cbc:AllowanceChargeReason>discount</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="SAR">0.00</cbc:Amount>
</cac:AllowanceCharge>
</cac:Price>
</cac:InvoiceLine>
<cac:InvoiceLine>
<cbc:ID>2</cbc:ID>
<cbc:InvoicedQuantity unitCode="PCE">3.000000</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="SAR">102.00</cbc:LineExtensionAmount>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="SAR">15.30</cbc:TaxAmount>
<cbc:RoundingAmount currencyID="SAR">117.30</cbc:RoundingAmount>
</cac:TaxTotal>
<cac:Item>
<cbc:Name>قلم</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>15.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="SAR">34.00</cbc:PriceAmount>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
<cbc:AllowanceChargeReason>discount</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="SAR">0.00</cbc:Amount>
</cac:AllowanceCharge>
</cac:Price>
</cac:InvoiceLine>
</Invoice>';
// ========================== START: 5.2 - STEP 1 INVOICE HASH GENERATION =================================
$doc = new DOMDocument();
$doc->preserveWhiteSpace = true;
$doc->loadXML($einvoicexml);
$xpath = new DOMXPath($doc);
// Register namespaces (optional if using local-name())
$xpath->registerNamespace('ext', 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2');
// Query using XPath
$elements = $xpath->query("//*[local-name()='Invoice']//*[local-name()='UBLExtensions']");
// Print results
foreach ($elements as $element) {
// dd($dom->saveXML($element));
$element->parentNode->removeChild($element);
}
$UBLExtensions_tag_removed = $doc->saveXML();
//================================================
$doc = new DOMDocument();
$doc->preserveWhiteSpace = true;
$doc->loadXML($UBLExtensions_tag_removed);
// Create an XPath object
$xpath = new DOMXPath($doc);
// Register the namespace for cbc
$xpath->registerNamespace('cbc', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
// Find the nodes matching the XPath
$query = "//*[local-name()='AdditionalDocumentReference'][cbc:ID[normalize-space(text()) = 'QR']]";
$nodes = $xpath->query($query);
// Remove the matching nodes
foreach ($nodes as $node) {
$node->parentNode->removeChild($node);
}
// Save the modified XML
$QR_tag_removed_xml = $doc->saveXML();
//================================================
// Load the XML into DOMDocument
$doc = new DOMDocument();
$doc->preserveWhiteSpace = true;
$doc->loadXML($QR_tag_removed_xml);
// Create an XPath object
$xpath = new DOMXPath($doc);
// Register namespaces for XPath
$xpath->registerNamespace('ns', 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2');
$xpath->registerNamespace('cac', 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2');
// Find the <cac:Signature> tag
$signatureNodes = $xpath->query('//cac:Signature');
// Remove the node if it exists
foreach ($signatureNodes as $node) {
$node->parentNode->removeChild($node);
}
// Save the modified XML
$signature_tag_removed_xml = $doc->saveXML();
// dd($signature_tag_removed_xml);
//================================================
// Remove the XML declaration using preg_replace
$xml_version_tag_removed_xml = preg_replace('/<\?xml.*?\?>/', '', $signature_tag_removed_xml);
//================================================
$dom = new \DOMDocument();
$dom->preserveWhiteSpace = false; // Remove redundant whitespaces
$dom->formatOutput = false; // Ensure the output is compact
$dom->loadXML($xml_version_tag_removed_xml);
// Canonicalize using C14N11
$canonicalXml = $dom->C14N(true, false);
//================================================
// Hash using SHA-256
$xml_sha256_hash = hash('sha256', $canonicalXml);
//================================================
$xml_binaryData = hex2bin($xml_sha256_hash);
$xml_base64Encoded = base64_encode($xml_binaryData);
// ========================== END: 5.2 - STEP 1 INVOICE HASH GENERATION =================================
// ========================== START: 5.2 - STEP 2 GENERATE DIGITAL SIGNATURE =================================
// Decode the private key from Base64
$privateKey = base64_decode($csid_privateKey);
// Wrap the decoded key in PEM format
$privateKeyPem = "-----BEGIN EC PRIVATE KEY-----\n" . chunk_split(base64_encode($privateKey), 64, "\n") . "-----END EC PRIVATE KEY-----";
// Convert the private key to an OpenSSL resource
$privateKeyResource = openssl_pkey_get_private($privateKeyPem);
if ($privateKeyResource === false) {
die('Unable to load private key');
}
// The data to sign is the SHA-256 hash
$data = hex2bin($xml_sha256_hash);
// Sign the data using ECDSA
$signature = '';
$success = openssl_sign($data, $signature, $privateKeyResource, OPENSSL_ALGO_SHA256);
if (!$success) {
die('Error signing data');
}
// The signature is in binary, so encode it in Base64 for easier transmission
$signature_base64 = base64_encode($signature);
// ========================== END: 5.2 - STEP 2 GENERATE DIGITAL SIGNATURE =================================
// ========================== START: 5.2 - STEP 3 GENERATE (X509) CERTIFICATE HASH =================================
$sha256_hashed_binarySecurityToken = hash('sha256', $csid_base64_decoded_binarySecurityToken);
// $binary_data = hex2bin($sha256_hashedData);
$x509_certificate_hash = base64_encode($sha256_hashed_binarySecurityToken);
// dd($x509_certificate_hash);
// ========================== END: 5.2 - STEP 3 GENERATE (X509) CERTIFICATE HASH =================================
// ========================== START: 5.2 - STEP 4 POPULATE SIGNED PROPERTIES OUTPUT =================================
// dd($einvoicexml);
//YOU NEED TO JUST FILL THE VALUES THE TAGS ARE ALREADY THERE!!!!!!!!!!!!!!
// Load the XML into a DOMDocument
$dom = new DOMDocument();
$dom->preserveWhiteSpace = true; // Preserve whitespace
$dom->loadXML($einvoicexml); // The XML string or file
// Create an XPath object
$xpath = new DOMXPath($dom);
// Register the namespaces
$xpath->registerNamespace('ext', 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2');
$xpath->registerNamespace('sig', 'http://www.w3.org/2000/09/xmldsig#');
$xpath->registerNamespace('sac', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
$xpath->registerNamespace('ds', 'http://www.w3.org/2000/09/xmldsig#');
$xpath->registerNamespace('xades', 'http://uri.etsi.org/01903/v1.3.2#');
$query = "//ds:Signature//ds:Object//xades:QualifyingProperties//xades:SignedProperties//xades:SignedSignatureProperties//xades:SigningCertificate//xades:Cert//xades:CertDigest//ds:DigestValue";
$nodes = $xpath->query($query);
if ($nodes->length > 0) {
$nodes->item(0)->nodeValue = $x509_certificate_hash;
// Save the modified XML into a string
$digestValue_updated_xml = $dom->saveXML();
}
//==========
// Load the XML into a DOMDocument
$dom = new DOMDocument();
$dom->preserveWhiteSpace = true; // Preserve whitespace
$dom->loadXML($digestValue_updated_xml); // The XML string or file
// Create an XPath object
$xpath = new DOMXPath($dom);
// Register the namespaces
$xpath->registerNamespace('ext', 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2');
$xpath->registerNamespace('sig', 'http://www.w3.org/2000/09/xmldsig#');
$xpath->registerNamespace('sac', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
$xpath->registerNamespace('ds', 'http://www.w3.org/2000/09/xmldsig#');
$xpath->registerNamespace('xades', 'http://uri.etsi.org/01903/v1.3.2#');
// The XPath query to find the SigningTime element
$query = "//ds:Signature//ds:Object//xades:QualifyingProperties//xades:SignedProperties//xades:SignedSignatureProperties//xades:SigningTime";
// Get the nodes that match the query
$nodes = $xpath->query($query);
// Check if the node exists and replace its value
if ($nodes->length > 0) {
// Get the current timestamp in the required format
$currentTimestamp = date('Y-m-d\TH:i:s'); // e.g., 2024-01-14T10:26:49
// Replace the value of the SigningTime node
$nodes->item(0)->nodeValue = $currentTimestamp;
// Save the modified XML into a string
$signingTime_updated_xml = $dom->saveXML();
// Debug: output the modified XML
// dd($signingTime_updated_xml);
}
//===========
// dd($csid_base64_decoded_binarySecurityToken);
// Decode the base64 string into binary data
$decoded_certificate = base64_decode($csid_base64_decoded_binarySecurityToken);
// Add the X.509 certificate delimiters
$certificate_with_delimiters = "-----BEGIN CERTIFICATE-----\n" . chunk_split(base64_encode($decoded_certificate), 64, "\n") . "-----END CERTIFICATE-----";
// Read the X.509 certificate
$cert_resource = openssl_x509_read($certificate_with_delimiters);
// Parse the certificate into an array
$parsed_certificate = openssl_x509_parse($cert_resource);
// dd($parsed_certificate);
// Check if the certificate is parsed successfully
if ($parsed_certificate !== false) {
// Extract the CN value from the issuer
$issuer_cn = $parsed_certificate['issuer']['CN'];
// Create the string in the desired format
$issuer_string = "CN=" . $issuer_cn;
// Output the result
// dd($issuer_string); // Outputs: CN=eInvoicing
} else {
echo "Failed to parse the certificate.";
}
// Load the XML into a DOMDocument
$dom = new DOMDocument();
$dom->preserveWhiteSpace = true; // Preserve whitespace
$dom->loadXML($signingTime_updated_xml); // The XML string or file
// Create an XPath object
$xpath = new DOMXPath($dom);
// Register the namespaces
$xpath->registerNamespace('ext', 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2');
$xpath->registerNamespace('sig', 'http://www.w3.org/2000/09/xmldsig#');
$xpath->registerNamespace('sac', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
$xpath->registerNamespace('ds', 'http://www.w3.org/2000/09/xmldsig#');
$xpath->registerNamespace('xades', 'http://uri.etsi.org/01903/v1.3.2#');
// The XPath query to find the X509IssuerName element
$query = "//ds:Signature//ds:Object//xades:QualifyingProperties//xades:SignedProperties//xades:SignedSignatureProperties//xades:SigningCertificate//xades:Cert//xades:IssuerSerial//ds:X509IssuerName";
// Get the nodes that match the query
$nodes = $xpath->query($query);
// Check if the node exists and replace its value
if ($nodes->length > 0) {
// The value to replace with
$value = $issuer_string;
// Replace the value of the X509IssuerName node
$nodes->item(0)->nodeValue = $value;
// Save the modified XML into a string
$x509IssuerName_updated_xml = $dom->saveXML();
// Debug: output the modified XML
// dd($x509IssuerName_updated_xml);
}
//===========
// Extract the serial number value
$serial_number = $parsed_certificate['serialNumber'];
// Load the XML into a DOMDocument
$dom = new DOMDocument();
$dom->preserveWhiteSpace = true; // Preserve whitespace
$dom->loadXML($x509IssuerName_updated_xml); // The XML string or file
// Create an XPath object
$xpath = new DOMXPath($dom);
// Register the namespaces
$xpath->registerNamespace('ext', 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2');
$xpath->registerNamespace('sig', 'http://www.w3.org/2000/09/xmldsig#');
$xpath->registerNamespace('sac', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
$xpath->registerNamespace('ds', 'http://www.w3.org/2000/09/xmldsig#');
$xpath->registerNamespace('xades', 'http://uri.etsi.org/01903/v1.3.2#');
// The XPath query to find the X509SerialNumber element
$query = "//ds:Signature//ds:Object//xades:QualifyingProperties//xades:SignedProperties//xades:SignedSignatureProperties//xades:SigningCertificate//xades:Cert//xades:IssuerSerial//ds:X509SerialNumber";
// Get the nodes that match the query
$nodes = $xpath->query($query);
// Check if the node exists and replace its value
if ($nodes->length > 0) {
// The value to replace with
$value = $serial_number;
// Replace the value of the X509SerialNumber node
$nodes->item(0)->nodeValue = $value;
// Save the modified XML into a string
$x509SerialNumber_updated_xml = $dom->saveXML();
// Debug: output the modified XML
// dd($x509SerialNumber_updated_xml);
}
// ========================== END: 5.2 - STEP 4 POPULATE SIGNED PROPERTIES OUTPUT =================================
// ========================== START: 5.2 - STEP 5 GENERATE SIGNED PROPERTIES HASH =================================
// Convert the XML string to a SimpleXML object
$xml = simplexml_load_string($x509SerialNumber_updated_xml);
// Register namespaces to handle prefixed elements
$xml->registerXPathNamespace('xades', 'http://uri.etsi.org/01903/v1.3.2#');
$xml->registerXPathNamespace('ds', 'http://www.w3.org/2000/09/xmldsig#');
// XPath query to get the SignedProperties element
$results = $xml->xpath('//xades:QualifyingProperties/xades:SignedProperties[@Id="xadesSignedProperties"]');
// Output the result
if ($results) {
$signedProperties = $results[0];
$signedProperties_separated_xml = $signedProperties->asXML(); // This will print the SignedProperties XML element
$signedProperties_separated_xml = '<xades:SignedProperties Id="xadesSignedProperties">
<xades:SignedSignatureProperties>
<xades:SigningTime>2024-11-24T10:19:16</xades:SigningTime>
<xades:SigningCertificate>
<xades:Cert>
<xades:CertDigest>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>ZWI3NjM3MzE0NTM2NGU5MTAwYjA4OGFiZTAwYTMyOTVkMGQ2NWYzYTg5NzcxY2M1MzkyOWJlYWMzYzZhZGZlMQ</ds:DigestValue>
</xades:CertDigest>
<xades:IssuerSerial>
<ds:X509IssuerName>CN=eInvoicing</ds:X509IssuerName>
<ds:X509SerialNumber>1732192127711</ds:X509SerialNumber>
</xades:IssuerSerial>
</xades:Cert>
</xades:SigningCertificate>
</xades:SignedSignatureProperties>
</xades:SignedProperties>';
// Hashing the XML string using SHA-256
$signedProperties_sha256_hashed_xml = hash('sha256', $signedProperties_separated_xml);
// Base64 encode the variable
$signedProperties_base64_encoded_xml = base64_encode($signedProperties_sha256_hashed_xml);
// dd($signedProperties_base64_encoded_xml);
} else {
echo "SignedProperties not found.";
}
// ========================== END: 5.2 - STEP 5 GENERATE SIGNED PROPERTIES HASH =================================
// ========================== START: 5.2 - STEP 6 POPULATE THE UBL EXTENSIONS OUTPUT =================================
// echo $signature_base64 . "/n";
// dd($x509SerialNumber_updated_xml);
$dom = new DOMDocument();
$dom->preserveWhiteSpace = true; // Preserve whitespace
$dom->loadXML($x509SerialNumber_updated_xml); // The XML string or file
// Create an XPath object
$xpath = new DOMXPath($dom);
// Register the namespaces
$xpath->registerNamespace('ext', 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2');
$xpath->registerNamespace('sig', 'http://www.w3.org/2000/09/xmldsig#');
$xpath->registerNamespace('sac', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
$xpath->registerNamespace('ds', 'http://www.w3.org/2000/09/xmldsig#');
// Define your XPath query
$query = "//ds:Signature//ds:SignatureValue";
// Execute the query
$nodes = $xpath->query($query);
// Check if the node is found and retrieve its value
if ($nodes->length > 0) {
// Replace the value of the X509SerialNumber node
$nodes->item(0)->nodeValue = $signature_base64;
// Save the modified XML into a string
$signatureValue_step6_updated_xml = $dom->saveXML();
// dd($signatureValue_step6_updated_xml);
} else {
echo "Signature Value not found.";
}
//================
// Load the XML into a DOMDocument
$dom = new DOMDocument();
$dom->preserveWhiteSpace = true; // Preserve whitespace
$dom->loadXML($signatureValue_step6_updated_xml); // The XML string or file
// Create an XPath object
$xpath = new DOMXPath($dom);
// Register the namespaces
$xpath->registerNamespace('ext', 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2');
$xpath->registerNamespace('sig', 'http://www.w3.org/2000/09/xmldsig#');
$xpath->registerNamespace('sac', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
$xpath->registerNamespace('ds', 'http://www.w3.org/2000/09/xmldsig#');
// Define the XPath query
$query = "//ds:Signature//ds:KeyInfo//ds:X509Data//ds:X509Certificate";
// Execute the query
$nodes = $xpath->query($query);
// Check if the node is found and replace its value
if ($nodes->length > 0) {
// Replace the value of the ds:X509Certificate node
$nodes->item(0)->nodeValue = $csid_base64_decoded_binarySecurityToken;
// Save the modified XML into a string
$x509Certificate_step6_updated_xml = $dom->saveXML();
// dd($x509Certificate_step6_updated_xml); // You can replace dd() with var_dump or echo to output the updated XML
} else {
echo "X509Certificate node not found.";
}
// ===================
// Load the XML into a DOMDocument
$dom = new DOMDocument();
$dom->preserveWhiteSpace = true; // Preserve whitespace
$dom->loadXML($x509Certificate_step6_updated_xml); // The XML string or file
// Create an XPath object
$xpath = new DOMXPath($dom);
// Register the namespaces
$xpath->registerNamespace('ext', 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2');
$xpath->registerNamespace('sig', 'http://www.w3.org/2000/09/xmldsig#');
$xpath->registerNamespace('sac', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
$xpath->registerNamespace('ds', 'http://www.w3.org/2000/09/xmldsig#');
// Define the XPath query to find the ds:DigestValue node inside the ds:Reference with URI='#xadesSignedProperties'
$query = "//ds:Signature//ds:SignedInfo//ds:Reference[@URI='#xadesSignedProperties']//ds:DigestValue";
// Execute the query
$nodes = $xpath->query($query);
// Check if the node is found and retrieve its value
if ($nodes->length > 0) {
// Replace the value of the ds:DigestValue node with the base64 encoded signed properties XML
$nodes->item(0)->nodeValue = $signedProperties_base64_encoded_xml;
// Save the modified XML into a string
$digestValue1_step6_updated_xml = $dom->saveXML();
// dd($digestValue1_step6_updated_xml);
} else {
echo "DigestValue for xadesSignedProperties not found.";
}
// =============
// Load the XML into a DOMDocument
$dom = new DOMDocument();
$dom->preserveWhiteSpace = true; // Preserve whitespace
$dom->loadXML($digestValue1_step6_updated_xml); // The XML string or file
// Create an XPath object
$xpath = new DOMXPath($dom);
// Register the namespaces
$xpath->registerNamespace('ext', 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2');
$xpath->registerNamespace('sig', 'http://www.w3.org/2000/09/xmldsig#');
$xpath->registerNamespace('sac', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
$xpath->registerNamespace('ds', 'http://www.w3.org/2000/09/xmldsig#');
// Define the XPath query to find the ds:DigestValue node inside the ds:Reference with Id='invoiceSignedData'
$query = "//ds:Signature//ds:SignedInfo//ds:Reference[@Id='invoiceSignedData']//ds:DigestValue";
// Execute the query
$nodes = $xpath->query($query);
// Check if the node is found and retrieve its value
if ($nodes->length > 0) {
// Replace the value of the ds:DigestValue node with the base64 encoded XML
$nodes->item(0)->nodeValue = $xml_base64Encoded;
// Save the modified XML into a string
$digestValue2_step6_updated_xml = $dom->saveXML();
// dd($digestValue2_step6_updated_xml);
} else {
echo "DigestValue for invoiceSignedData not found.";
}
// ========================== END: 5.2 - STEP 6 POPULATE THE UBL EXTENSIONS OUTPUT =================================
// ========================================== START: 6 - QR ==========================================================
// ============================== START: QR TAG 1 ================================
// Load the XML into a DOMDocument
$dom = new DOMDocument();
$dom->preserveWhiteSpace = true; // Preserve whitespace
$dom->loadXML($digestValue2_step6_updated_xml); // The XML string or file
// Create an XPath object
$xpath = new DOMXPath($dom);
// Register the namespaces
$xpath->registerNamespace('cac', 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2');
$xpath->registerNamespace('cbc', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
// Define the XPath query to find the cbc:RegistrationName node
$query = "//cac:AccountingSupplierParty//cac:Party//cac:PartyLegalEntity//cbc:RegistrationName";
// Execute the query
$nodes = $xpath->query($query);
// Check if the node is found and retrieve its value
if ($nodes->length > 0) {
// Get the value of the node
$registrationName = $nodes->item(0)->nodeValue;
// Output or save the value to a variable
$qr_tag1_num = "01";
$qr_tag1_val = $registrationName;
$qr_tag1_val_utf8String = mb_convert_encoding($qr_tag1_val, 'UTF-8');
$qr_tag1_val_hex = bin2hex($qr_tag1_val_utf8String);
$qr_tag1_len = mb_strlen($qr_tag1_val_utf8String, 'UTF-8');
$qr_tag1_len_hex = $this->decimalToHex_length($qr_tag1_len);
// dd($qr_tag1_len_hex);
} else {
echo "Registration Name not found.";
}
// ============================== END: QR TAG 1 ================================
// ============================== START: QR TAG 2 ================================
// Load the XML into a DOMDocument
$dom = new DOMDocument();
$dom->preserveWhiteSpace = true; // Preserve whitespace
$dom->loadXML($digestValue2_step6_updated_xml); // The XML string or file
// Create an XPath object
$xpath = new DOMXPath($dom);
// Register the namespaces
$xpath->registerNamespace('cac', 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2');
$xpath->registerNamespace('cbc', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
// Define the XPath query
$query = "//cac:AccountingSupplierParty//cac:Party//cac:PartyTaxScheme//cbc:CompanyID";
// Execute the query
$nodes = $xpath->query($query);
// Check if the node is found and retrieve its value
if ($nodes->length > 0) {
// Get the value of the node
$companyID = $nodes->item(0)->nodeValue;
// Output or save the value to a variable
$qr_tag2_num = "02";
$qr_tag2_val = $companyID;
$qr_tag2_val_utf8String = mb_convert_encoding($qr_tag2_val, 'UTF-8');
$qr_tag2_val_hex = bin2hex($qr_tag2_val_utf8String);
$qr_tag2_len = mb_strlen($qr_tag2_val_utf8String, 'UTF-8');
$qr_tag2_len_hex = $this->decimalToHex_length($qr_tag2_len);
// dd($qr_tag2_len_hex);
} else {
echo "Company ID not found.";
}
// ============================== END: QR TAG 2 ================================
// ============================== START: QR TAG 3 ================================
// Load the XML into a DOMDocument
$dom = new DOMDocument();
$dom->preserveWhiteSpace = true; // Preserve whitespace
$dom->loadXML($digestValue2_step6_updated_xml); // The XML string or file
// Create an XPath object
$xpath = new DOMXPath($dom);
// Register the namespace for 'cbc'
$xpath->registerNamespace('cbc', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
// Define the XPath query
$query = "//cbc:IssueDate";
// Execute the query
$nodes = $xpath->query($query);
// Check if the node is found and retrieve its value
if ($nodes->length > 0) {
// Get the value of the node
$issueDate = $nodes->item(0)->nodeValue;
} else {
echo "Issue Date not found.";
}
// Load the XML into a DOMDocument
$dom = new DOMDocument();
$dom->preserveWhiteSpace = true; // Preserve whitespace
$dom->loadXML($digestValue2_step6_updated_xml); // The XML string or file
// Create an XPath object
$xpath = new DOMXPath($dom);
// Register the namespace for 'cbc'
$xpath->registerNamespace('cbc', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
// Define the XPath query
$query = "//cbc:IssueTime";
// Execute the query
$nodes = $xpath->query($query);
// Check if the node is found and retrieve its value
if ($nodes->length > 0) {
// Get the value of the node
$issueTime = $nodes->item(0)->nodeValue;
} else {
echo "Issue Time not found.";
}
$qr_tag3_num = "03";
$qr_tag3_val = $issueDate . 'T' . $issueTime . 'Z';
$qr_tag3_val_utf8String = mb_convert_encoding($qr_tag3_val, 'UTF-8');
$qr_tag3_val_hex = bin2hex($qr_tag3_val_utf8String);
$qr_tag3_len = mb_strlen($qr_tag3_val_utf8String, 'UTF-8');
$qr_tag3_len_hex = $this->decimalToHex_length($qr_tag3_len);
// dd($qr_tag3_len_hex);
// ============================== END: QR TAG 3 ================================
// ============================== START: QR TAG 4 ================================
// Load the XML into a DOMDocument
$dom = new DOMDocument();
$dom->preserveWhiteSpace = true; // Preserve whitespace
$dom->loadXML($digestValue2_step6_updated_xml); // The XML string or file
// Create an XPath object
$xpath = new DOMXPath($dom);
// Register the namespaces
$xpath->registerNamespace('cac', 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2');
$xpath->registerNamespace('cbc', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
// Define the XPath query
$query = "//cac:LegalMonetaryTotal/cbc:TaxInclusiveAmount";
// Execute the query
$nodes = $xpath->query($query);
// Check if the node is found and retrieve its value
if ($nodes->length > 0) {
// Get the value of the node
$taxInclusiveAmount = $nodes->item(0)->nodeValue;
// Output or save the value to a variable
$qr_tag4_num = "04";
$qr_tag4_val = $taxInclusiveAmount;
$qr_tag4_val_utf8String = mb_convert_encoding($qr_tag4_val, 'UTF-8');
$qr_tag4_val_hex = $this->ASCIItoHex(strval($qr_tag4_val_utf8String));
$qr_tag4_len = mb_strlen($qr_tag4_val_utf8String, 'UTF-8');
$qr_tag4_len_hex = $this->decimalToHex_length($qr_tag4_len);
// dd($qr_tag4_len_hex);
} else {
echo "Tax Inclusive Amount not found.";
}
// ============================== END: QR TAG 4 ================================
// ============================== START: QR TAG 5 ================================
// Load the XML into a DOMDocument
$dom = new DOMDocument();
$dom->preserveWhiteSpace = true; // Preserve whitespace
$dom->loadXML($digestValue2_step6_updated_xml); // The XML string or file
// Create an XPath object
$xpath = new DOMXPath($dom);
// Register the namespaces
$xpath->registerNamespace('cac', 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2');
$xpath->registerNamespace('cbc', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
// Define the XPath query
$query = "//cac:TaxTotal/cbc:TaxAmount";
// Execute the query
$nodes = $xpath->query($query);
// Check if the node is found and retrieve its value
if ($nodes->length > 0) {
// Get the value of the node
$taxAmount = $nodes->item(0)->nodeValue;
// Output or save the value to a variable
$qr_tag5_num = "05";
$qr_tag5_val = $taxAmount;
$qr_tag5_val_utf8String = mb_convert_encoding($qr_tag5_val, 'UTF-8');
$qr_tag5_val_hex = $this->ASCIItoHex(strval($qr_tag5_val_utf8String));
$qr_tag5_len = mb_strlen($qr_tag5_val_utf8String, 'UTF-8');
$qr_tag5_len_hex = $this->decimalToHex_length($qr_tag5_len);
// dd($qr_tag5_len_hex);
} else {
echo "Tax Amount not found.";
}
// ============================== END: QR TAG 5 ================================
// ============================== START: QR TAG 6 ================================
// dd($digestValue2_step6_updated_xml);
// Load the XML into a DOMDocument
$dom = new DOMDocument();
$dom->preserveWhiteSpace = true; // Preserve whitespace
$dom->loadXML($digestValue2_step6_updated_xml); // The XML string or file
// Create an XPath object
$xpath = new DOMXPath($dom);
// Register the namespaces
$xpath->registerNamespace('ext', 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2');
$xpath->registerNamespace('sig', 'urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2');
$xpath->registerNamespace('sac', 'urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2');
$xpath->registerNamespace('ds', 'http://www.w3.org/2000/09/xmldsig#');
// Define the XPath query to match the DigestValue
$query = "//ds:Signature//ds:SignedInfo//ds:Reference//ds:DigestValue";
// // OR
// $query = "//ds:Signature//ds:SignedInfo//ds:Reference[@URI='#xadesSignedProperties']//ds:DigestValue";
// Execute the query
$nodes = $xpath->query($query);
// Check if the node is found and retrieve its value
if ($nodes->length > 0) {
// Get the value of the node (base64-encoded)
$base64Value = $nodes->item(0)->nodeValue;
// Output or save the value to a variable
$qr_tag6_num = "06";
$qr_tag6_val = $base64Value;
$qr_tag6_val_utf8String = mb_convert_encoding($qr_tag6_val, 'UTF-8');
$qr_tag6_val_hex = bin2hex($qr_tag6_val_utf8String);
$qr_tag6_len = mb_strlen($qr_tag6_val_utf8String, 'UTF-8');
$qr_tag6_len_hex = $this->decimalToHex_length($qr_tag6_len);
// dd($qr_tag6_len_hex);
} else {
echo "Digest Value not found.";
}
// ============================== END: QR TAG 6 ================================
// ============================== START: QR TAG 7 ================================
// Load the XML into a DOMDocument
$dom = new DOMDocument();
$dom->preserveWhiteSpace = true; // Preserve whitespace
$dom->loadXML($digestValue2_step6_updated_xml); // The XML string or file
// Create an XPath object
$xpath = new DOMXPath($dom);
// Register the namespaces
$xpath->registerNamespace('ext', 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2');
$xpath->registerNamespace('sig', 'urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2');
$xpath->registerNamespace('sac', 'urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2');
$xpath->registerNamespace('ds', 'http://www.w3.org/2000/09/xmldsig#');
// Define the XPath query to match the ds:SignatureValue
$query = "//ds:Signature//ds:SignatureValue";
// Execute the query
$nodes = $xpath->query($query);
// Check if the node is found and retrieve its value
if ($nodes->length > 0) {
// Get the value of the ds:SignatureValue node
$signatureValue = $nodes->item(0)->nodeValue;
// Output or save the value to a variable
$qr_tag7_num = "07";
$qr_tag7_val = $signatureValue;
$qr_tag7_val_utf8String = mb_convert_encoding($qr_tag7_val, 'UTF-8');
$qr_tag7_val_hex = bin2hex($qr_tag7_val_utf8String);
$qr_tag7_len = mb_strlen($qr_tag7_val_utf8String, 'UTF-8');
$qr_tag7_len_hex = $this->decimalToHex_length($qr_tag7_len);
} else {
echo "Signature Value not found.";
}
// ============================== END: QR TAG 7 ================================
// ============================== START: QR TAG 8 ================================
// Load the XML into a DOMDocument
$dom = new DOMDocument();
$dom->preserveWhiteSpace = true; // Preserve whitespace
$dom->loadXML($digestValue2_step6_updated_xml); // The XML string or file
// Create an XPath object
$xpath = new DOMXPath($dom);
// Register the namespaces
$xpath->registerNamespace('ext', 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2');
$xpath->registerNamespace('sig', 'urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2');
$xpath->registerNamespace('sac', 'urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2');
$xpath->registerNamespace('ds', 'http://www.w3.org/2000/09/xmldsig#');
// Define the XPath query to match the ds:X509Certificate
$query = "//ds:Signature//ds:KeyInfo//ds:X509Data//ds:X509Certificate";
// Execute the query
$nodes = $xpath->query($query);
// Check if the node is found and retrieve its value
if ($nodes->length > 0) {
// Get the value of the ds:X509Certificate node
$x509Certificate = $nodes->item(0)->nodeValue;
// Output or save the value to a variable
$qr_tag8_num = "08";
$qr_tag8_val = $x509Certificate;
$qr_tag8_val_utf8String = mb_convert_encoding($qr_tag8_val, 'UTF-8');
$qr_tag8_val_hex = bin2hex($qr_tag8_val_utf8String);
$qr_tag8_len = mb_strlen($qr_tag8_val_utf8String, 'UTF-8');
$qr_tag8_len_hex = $this->decimalToHex_length($qr_tag8_len);
} else {
echo "X509 Certificate not found.";
}
// ============================== END: QR TAG 8 ================================
// ============================== START: QR TAG 9 ================================
$csrContent = base64_decode($returnData['csr']);
$opensslPath = '"C:\\Program Files\\OpenSSL-Win64\\bin\\openssl.exe"'; // Full path to openssl
// Save CSR to a temporary file
$tempcsrsave_filepath = WRITEPATH . '/invoices/tempcsrsave.xml';
file_put_contents($tempcsrsave_filepath, $csrContent);
// Use OpenSSL command-line to extract signature algorithm and signature
$command = "$opensslPath req -in $tempcsrsave_filepath -noout -text 2>&1";
$output = shell_exec($command);
// Check if output is empty or if there were errors
if (empty($output)) {
echo "No output or error occurred. Check the CSR and OpenSSL installation.";
} else {
// Use a regular expression to extract the "Signature Value" part
if (preg_match('/Signature Value:\s*([0-9a-fA-F:\s]+)/', $output, $matches)) {
// Remove extra spaces and line breaks
$signatureValue = trim($matches[1]);
// Optionally, remove newlines or additional spaces
$signatureValue = str_replace(["\n", "\r", " ", ":"], "", $signatureValue);
$qr_tag9_num = "09";
$qr_tag9_val_hex = $signatureValue;
$qr_tag9_val_utf8String = mb_convert_encoding($qr_tag9_val_hex, 'UTF-8');
$qr_tag9_len = mb_strlen($qr_tag9_val_utf8String, 'UTF-8');
$qr_tag9_len_hex = $this->decimalToHex_length($qr_tag9_len);
// dd($qr_tag9_len_hex);
} else {
echo "Signature Value not found.";
}
}
// Delete the temporary file
unlink($tempcsrsave_filepath);
// ============================== END: QR TAG 9 ================================
// ========================================== END: 6 - QR ============================================================
// ========================================== START: 6 - QR TVL HEX TO BASE64 ============================================================
//Concat TLV Hex
$supplierTLVHex = $qr_tag1_num . $qr_tag1_len_hex . $qr_tag1_val_hex;
$vatRegistrationNumberTLVHex = $qr_tag2_num . $qr_tag2_len_hex . $qr_tag2_val_hex;
$timeStampTLVHex = $qr_tag3_num . $qr_tag3_len_hex . $qr_tag3_val_hex;
$invoiceTotalWithVatTLVHex = $qr_tag4_num . $qr_tag4_len_hex . $qr_tag4_val_hex;
$vatTotalTLVHex = $qr_tag5_num . $qr_tag5_len_hex . $qr_tag5_val_hex;
$hashOfXMLInvoiceTLVHex = $qr_tag6_num . $qr_tag6_len_hex . $qr_tag6_val_hex;
$ecdsaSignatureTLVHex = $qr_tag7_num . $qr_tag7_len_hex . $qr_tag7_val_hex;
$ecdsaPublicKeyTLVHex = $qr_tag8_num . $qr_tag8_len_hex . $qr_tag8_val_hex;
$taxStampPublicKeySignatureTLVHex = $qr_tag9_num . $qr_tag9_len_hex . $qr_tag9_val_hex;
$concatinatedTLVHex = $supplierTLVHex . $vatRegistrationNumberTLVHex . $timeStampTLVHex . $invoiceTotalWithVatTLVHex . $vatTotalTLVHex . $hashOfXMLInvoiceTLVHex . $ecdsaSignatureTLVHex . $ecdsaPublicKeyTLVHex . $taxStampPublicKeySignatureTLVHex;
$convertTLVBase64 = $this->stringToBase64($concatinatedTLVHex);
// preprint($convertTLVBase64);
// ========================================== START: 6 - QR TVL HEX TO BASE64 ============================================================
$dom = new DOMDocument();
$dom->preserveWhiteSpace = true; // Preserve whitespace
$dom->loadXML($digestValue2_step6_updated_xml);
$xpath = new DOMXPath($dom);
// Register namespaces (adjust URNs as needed)
$xpath->registerNamespace('cbc', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
$xpath->registerNamespace('cac', 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2');
// XPath to locate the EmbeddedDocumentBinaryObject associated with ID = QR
$query = '//cbc:ID[text()="QR"]/following-sibling::cac:Attachment/cbc:EmbeddedDocumentBinaryObject';
$node = $xpath->query($query)->item(0);
if ($node) {
// Update its value
$node->nodeValue = $convertTLVBase64;
}
// Save and print the updated XML
$qr_step6_updated_xml = $dom->saveXML();
dd($qr_step6_updated_xml);
// ========================================== START: 7 - GENERATE JSON API REQUEST FOR COMPLIANCE INVOICE API =============================
// $invoiceHashValue;
// $uuidValue;
// $invoiceValue;
// Create a new DOMDocument and load the XML
$dom = new DOMDocument();
$dom->preserveWhiteSpace = true; // Preserve whitespace
$dom->loadXML($qr_step6_updated_xml);
// Create an XPath object
$xpath = new DOMXPath($dom);
// Register namespaces
$xpath->registerNamespace('ext', 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2');
$xpath->registerNamespace('sig', 'urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2');
$xpath->registerNamespace('ds', 'http://www.w3.org/2000/09/xmldsig#');
// XPath query to get the DigestValue
$query = '//ds:Reference[@Id="invoiceSignedData"]/ds:DigestValue';
$result = $xpath->query($query);
// Check if a result is found
if ($result->length > 0) {
$digestValue = $result->item(0)->nodeValue;
$invoiceHashValue = $digestValue;
} else {
dd("DigestValue not found.");
}
//=====================
$doc = new DOMDocument();
$doc->loadXML($qr_step6_updated_xml);
// Create an XPath object
$xpath = new DOMXPath($doc);
// Register namespaces to resolve prefixes
$xpath->registerNamespace('cbc', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
// Query for the cbc:UUID node
$uuidNode = $xpath->query('//cbc:UUID');
// Extract the value if the node exists
if ($uuidNode->length > 0) {
$uuid = $uuidNode->item(0)->nodeValue;
$uuidValue = $uuid;
} else {
dd("UUID not found.\n");
}
//=====================
$invoiceValue = $convertTLVBase64;
//==============================================================================
$username = $csid_base64_decoded_binarySecurityToken;
$password = $returnData['secret'];
$basicToken = base64_encode("$username:$password");
//======================================================
// Testing Values:
$json_request_invoice_compliance_api = "{\n \"invoiceHash\": \"$invoiceHashValue\",\n \"uuid\": \"$uuidValue\",\n \"invoice\": \"$invoiceValue\"\n}";
dd($json_request_invoice_compliance_api);
echo $invoiceHashValue . "<br>" . $uuidValue . "<br>" . $invoiceValue . "<br>" . $username . "<br>" . $password;
exit();
//======================================================
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://gw-fatoora.zatca.gov.sa/e-invoicing/developer-portal/compliance/invoices');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'accept: application/json',
'Accept-Language: en',
'Accept-Version: V2',
'Authorization: Basic ' . $basicToken,
'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, "{\n \"invoiceHash\": \"$invoiceHashValue\",\n \"uuid\": \"$uuidValue\",\n \"invoice\": \"$invoiceValue\"\n}");
$response = curl_exec($ch);
curl_close($ch);
dd($response);
return json_decode($response, true);
// ========================================== END: 7 - GENERATE JSON API REQUEST FOR COMPLIANCE INVOICE API =============================
}
I can provide additional data when asked. I would really like some help with this compliance