Skip to content

Commit e758906

Browse files
committed
Fix eInvoice signer code
1 parent f3ec677 commit e758906

30 files changed

+1769
-763
lines changed

Certificates/PrivateKey.pem

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
MHQCAQEEIPi7yWosBf7cNCTetGt7SkR6V3CCkjZS5fHfAVnRaO2BoAcGBSuBBAAKoUQDQgAEtltXb3iQh3NuhQhpxBOyVdmpcuLFUW9kvyy4j+mOkgOVVu5OtGXFRC4KZOPVudLvyO+/ExL1/YqFmz18Ja5Dtg==
1+
MHQCAQEEIEPoOx8ZrKZSdNk4l9E+jxPyeEXWcBUi4S1XGu7qui7ooAcGBSuBBAAKoUQDQgAECUAIXZEmNQyLo2Sh/kCis18pwaOyZFWOFFu5cDtK6XIhQZ2yLWrBespUciiAzPKvQxjkcC/U3YR7gDNYffqSzg==

Certificates/PublicKey.pem

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
-----BEGIN PUBLIC KEY-----
2-
MDYwEAYHKoZIzj0CAQYFK4EEAAoDIgACtltXb3iQh3NuhQhpxBOyVdmpcuLFUW9k
3-
vyy4j+mOkgM=
2+
MDYwEAYHKoZIzj0CAQYFK4EEAAoDIgACCUAIXZEmNQyLo2Sh/kCis18pwaOyZFWO
3+
FFu5cDtK6XI=
44
-----END PUBLIC KEY-----

Certificates/certificateInfo.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
{
22
"environmentType": "NonProduction",
3-
"csr": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0NCk1JSUNHVENDQWI4Q0FRQXdkVEVtTUNRR0ExVUVBd3dkVkZOVUxUZzROalF6TVRFME5TMHpPVGs1T1RrNU9UazUNCk1EQXdNRE14RmpBVUJnTlZCQXNNRFZKcGVXRmthQ0JDY21GdVkyZ3hKakFrQmdOVkJBb01IVTFoZUdsdGRXMGcNClUzQmxaV1FnVkdWamFDQlRkWEJ3YkhrZ1RGUkVNUXN3Q1FZRFZRUUdFd0pUUVRCV01CQUdCeXFHU000OUFnRUcNCkJTdUJCQUFLQTBJQUJMWmJWMjk0a0lkemJvVUlhY1FUc2xYWnFYTGl4VkZ2Wkw4c3VJL3BqcElEbFZidVRyUmwNCnhVUXVDbVRqMWJuUzc4anZ2eE1TOWYyS2haczlmQ1d1UTdhZ2dlb3dnZWNHQ1NxR1NJYjNEUUVKRGpHQjJUQ0INCjFqQWtCZ2tyQmdFRUFZb2ZGQUlFRnhNVlZGTlVXa0ZVUTBFdFEyOWtaUzFUYVdkdWFXNW5NSUd0QmdOVkhSRUUNCmdhVXdnYUtrZ1o4d2dad3hPekE1QmdOVkJBUU1NakV0VkZOVWZESXRWRk5VZkRNdFpXUXlNbVl4WkRndFpUWmgNCk1pMHhNVEU0TFRsaU5UZ3RaRGxoT0dZeE1XVTBORFZtTVI4d0hRWUtDWkltaVpQeUxHUUJBUXdQTXprNU9UazUNCk9UazVPVEF3TURBek1RMHdDd1lEVlFRTURBUXhNVEF3TVJFd0R3WURWUVFhREFoU1VsSkVNamt5T1RFYU1CZ0cNCkExVUVEd3dSVTNWd2NHeDVJR0ZqZEdsMmFYUnBaWE13Q2dZSUtvWkl6ajBFQXdJRFNBQXdSUUlnVUVkSk1BUUoNCnQ0M1A0eWZ3djk0M0RUZWZTV3hyV0s2VW0zOGJTdDRMbjVFQ0lRRFEyUkIwUjdWMTJlRitCa1MvV3hXNWpxVlgNClJNRE5mRGlDY0Q0TmI3MkZBQT09DQotLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0NCg==",
4-
"privateKey": "MHQCAQEEIPi7yWosBf7cNCTetGt7SkR6V3CCkjZS5fHfAVnRaO2BoAcGBSuBBAAKoUQDQgAEtltXb3iQh3NuhQhpxBOyVdmpcuLFUW9kvyy4j+mOkgOVVu5OtGXFRC4KZOPVudLvyO+/ExL1/YqFmz18Ja5Dtg==",
3+
"csr": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ0ZqQ0NBYjBDQVFBd2RURUxNQWtHQTFVRUJoTUNVMEV4RmpBVUJnTlZCQXNNRFZKcGVXRmthQ0JDY21GdQpZMmd4SmpBa0JnTlZCQW9NSFUxaGVHbHRkVzBnVTNCbFpXUWdWR1ZqYUNCVGRYQndiSGtnVEZSRU1TWXdKQVlEClZRUUREQjFVVTFRdE9EZzJORE14TVRRMUxUTTVPVGs1T1RrNU9Ua3dNREF3TXpCV01CQUdCeXFHU000OUFnRUcKQlN1QkJBQUtBMElBQlB1NDF4UVVQQlJkNm4xdXpibmlFZzYyd2ttTTk2Tlp1RWFoZWZvek1MYVdORFR0MnZrRQp4cjFWWDVLOXo4V09RMkdIQ1o4YTBVRStnU1M5a0p6ZUpvYWdnZWd3Z2VVR0NTcUdTSWIzRFFFSkRqR0IxekNCCjFEQWlCZ2tyQmdFRUFZSTNGQUlFRlZSVFZGcEJWRU5CTFVOdlpHVXRVMmxuYm1sdVp6Q0JyUVlEVlIwUkJJR2wKTUlHaXBJR2ZNSUdjTVRzd09RWURWUVFFRERJeExWUlRWSHd5TFZSVFZId3pMV1ZrTWpKbU1XUTRMV1UyWVRJdApNVEV4T0MwNVlqVTRMV1E1WVRobU1URmxORFExWmpFZk1CMEdDZ21TSm9tVDhpeGtBUUVNRHpNNU9UazVPVGs1Ck9Ua3dNREF3TXpFTk1Bc0dBMVVFREF3RU1URXdNREVSTUE4R0ExVUVHZ3dJVWxKU1JESTVNamt4R2pBWUJnTlYKQkE4TUVWTjFjSEJzZVNCaFkzUnBkbWwwYVdWek1Bb0dDQ3FHU000OUJBTUNBMGNBTUVRQ0lEU0ZpS3ZrbEJBeQppRmNBeWtyOU9BdlRXMStLOUYzblhsd2JyTE1PK0dTQ0FpQXJicDZRcURpTjF5dld5VTFwUHpZQzRNbHBDR0NwCkFJYTgybXV1MjhDY1BRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0tCg==",
4+
"privateKey": "MHQCAQEEIEFYBmc46NEaSB977Zybsp/ppM6miR2LbDWw8DzZjEofoAcGBSuBBAAKoUQDQgAE+7jXFBQ8FF3qfW7NueISDrbCSYz3o1m4RqF5+jMwtpY0NO3a+QTGvVVfkr3PxY5DYYcJnxrRQT6BJL2QnN4mhg==",
55
"OTP": "123456",
66
"ccsid_requestID": 1234567890123,
7-
"ccsid_binarySecurityToken": "TUlJQ1BUQ0NBZU9nQXdJQkFnSUdBWkxnbkFESU1Bb0dDQ3FHU000OUJBTUNNQlV4RXpBUkJnTlZCQU1NQ21WSmJuWnZhV05wYm1jd0hoY05NalF4TURNeE1ETXlOakE0V2hjTk1qa3hNRE13TWpFd01EQXdXakIxTVNZd0pBWURWUVFEREIxVVUxUXRPRGcyTkRNeE1UUTFMVE01T1RrNU9UazVPVGt3TURBd016RVdNQlFHQTFVRUN3d05VbWw1WVdSb0lFSnlZVzVqYURFbU1DUUdBMVVFQ2d3ZFRXRjRhVzExYlNCVGNHVmxaQ0JVWldOb0lGTjFjSEJzZVNCTVZFUXhDekFKQmdOVkJBWVRBbE5CTUZZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUFvRFFnQUV0bHRYYjNpUWgzTnVoUWhweEJPeVZkbXBjdUxGVVc5a3Z5eTRqK21Pa2dPVlZ1NU90R1hGUkM0S1pPUFZ1ZEx2eU8rL0V4TDEvWXFGbXoxOEphNUR0cU9Cd1RDQnZqQU1CZ05WSFJNQkFmOEVBakFBTUlHdEJnTlZIUkVFZ2FVd2dhS2tnWjh3Z1p3eE96QTVCZ05WQkFRTU1qRXRWRk5VZkRJdFZGTlVmRE10WldReU1tWXhaRGd0WlRaaE1pMHhNVEU0TFRsaU5UZ3RaRGxoT0dZeE1XVTBORFZtTVI4d0hRWUtDWkltaVpQeUxHUUJBUXdQTXprNU9UazVPVGs1T1RBd01EQXpNUTB3Q3dZRFZRUU1EQVF4TVRBd01SRXdEd1lEVlFRYURBaFNVbEpFTWpreU9URWFNQmdHQTFVRUR3d1JVM1Z3Y0d4NUlHRmpkR2wyYVhScFpYTXdDZ1lJS29aSXpqMEVBd0lEU0FBd1JRSWdWV29FUTFoUWFPVTVISXAydXlYV2lWOS9WRmRsRHBQOGxlYkprQjdLa044Q0lRQ0tHZzFqMWNTcUVodVVuenB4RnVHWHpXeVJ0eDFLSDZLYUxnK1NRSnpZVFE9PQ==",
8-
"ccsid_secret": "ZN/+4cmummahzSn69X4A8mhegSd+ImFBZpW2Vh4SGvk=",
7+
"ccsid_binarySecurityToken": "TUlJQ1BUQ0NBZU9nQXdJQkFnSUdBWk10N3lsc01Bb0dDQ3FHU000OUJBTUNNQlV4RXpBUkJnTlZCQU1NQ21WSmJuWnZhV05wYm1jd0hoY05NalF4TVRFMU1ETTBOelF6V2hjTk1qa3hNVEUwTWpFd01EQXdXakIxTVFzd0NRWURWUVFHRXdKVFFURVdNQlFHQTFVRUN3d05VbWw1WVdSb0lFSnlZVzVqYURFbU1DUUdBMVVFQ2d3ZFRXRjRhVzExYlNCVGNHVmxaQ0JVWldOb0lGTjFjSEJzZVNCTVZFUXhKakFrQmdOVkJBTU1IVlJUVkMwNE9EWTBNekV4TkRVdE16azVPVGs1T1RrNU9UQXdNREF6TUZZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUFvRFFnQUUrN2pYRkJROEZGM3FmVzdOdWVJU0RyYkNTWXozbzFtNFJxRjUrak13dHBZME5PM2ErUVRHdlZWZmtyM1B4WTVEWVljSm54clJRVDZCSkwyUW5ONG1ocU9Cd1RDQnZqQU1CZ05WSFJNQkFmOEVBakFBTUlHdEJnTlZIUkVFZ2FVd2dhS2tnWjh3Z1p3eE96QTVCZ05WQkFRTU1qRXRWRk5VZkRJdFZGTlVmRE10WldReU1tWXhaRGd0WlRaaE1pMHhNVEU0TFRsaU5UZ3RaRGxoT0dZeE1XVTBORFZtTVI4d0hRWUtDWkltaVpQeUxHUUJBUXdQTXprNU9UazVPVGs1T1RBd01EQXpNUTB3Q3dZRFZRUU1EQVF4TVRBd01SRXdEd1lEVlFRYURBaFNVbEpFTWpreU9URWFNQmdHQTFVRUR3d1JVM1Z3Y0d4NUlHRmpkR2wyYVhScFpYTXdDZ1lJS29aSXpqMEVBd0lEU0FBd1JRSWhBSWFyNnhDd1dRaXVCLzlRMmxiYXdMZU00WE5nKzRGY3BremRrZzMwSXk4N0FpQmVuTjROcFFlVEFPdHRFS0tibWR4Vi9UYW1qemlMZEV4OTRBWWJLN3U1TkE9PQ==",
8+
"ccsid_secret": "ykYE1tiZG7YUhzqjkCanSby3lQZRd1lPNzcVtmdUJiM=",
99
"pcsid_requestID": 30368,
1010
"pcsid_binarySecurityToken": "TUlJRDNqQ0NBNFNnQXdJQkFnSVRFUUFBT0FQRjkwQWpzL3hjWHdBQkFBQTRBekFLQmdncWhrak9QUVFEQWpCaU1SVXdFd1lLQ1pJbWlaUHlMR1FCR1JZRmJHOWpZV3d4RXpBUkJnb0praWFKay9Jc1pBRVpGZ05uYjNZeEZ6QVZCZ29Ka2lhSmsvSXNaQUVaRmdkbGVIUm5ZWHAwTVJzd0dRWURWUVFERXhKUVVscEZTVTVXVDBsRFJWTkRRVFF0UTBFd0hoY05NalF3TVRFeE1Ea3hPVE13V2hjTk1qa3dNVEE1TURreE9UTXdXakIxTVFzd0NRWURWUVFHRXdKVFFURW1NQ1FHQTFVRUNoTWRUV0Y0YVcxMWJTQlRjR1ZsWkNCVVpXTm9JRk4xY0hCc2VTQk1WRVF4RmpBVUJnTlZCQXNURFZKcGVXRmthQ0JDY21GdVkyZ3hKakFrQmdOVkJBTVRIVlJUVkMwNE9EWTBNekV4TkRVdE16azVPVGs1T1RrNU9UQXdNREF6TUZZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUFvRFFnQUVvV0NLYTBTYTlGSUVyVE92MHVBa0MxVklLWHhVOW5QcHgydmxmNHloTWVqeThjMDJYSmJsRHE3dFB5ZG84bXEwYWhPTW1Obzhnd25pN1h0MUtUOVVlS09DQWdjd2dnSURNSUd0QmdOVkhSRUVnYVV3Z2FLa2daOHdnWnd4T3pBNUJnTlZCQVFNTWpFdFZGTlVmREl0VkZOVWZETXRaV1F5TW1ZeFpEZ3RaVFpoTWkweE1URTRMVGxpTlRndFpEbGhPR1l4TVdVME5EVm1NUjh3SFFZS0NaSW1pWlB5TEdRQkFRd1BNems1T1RrNU9UazVPVEF3TURBek1RMHdDd1lEVlFRTURBUXhNVEF3TVJFd0R3WURWUVFhREFoU1VsSkVNamt5T1RFYU1CZ0dBMVVFRHd3UlUzVndjR3g1SUdGamRHbDJhWFJwWlhNd0hRWURWUjBPQkJZRUZFWCtZdm1tdG5Zb0RmOUJHYktvN29jVEtZSzFNQjhHQTFVZEl3UVlNQmFBRkp2S3FxTHRtcXdza0lGelZ2cFAyUHhUKzlObk1Ic0dDQ3NHQVFVRkJ3RUJCRzh3YlRCckJnZ3JCZ0VGQlFjd0FvWmZhSFIwY0RvdkwyRnBZVFF1ZW1GMFkyRXVaMjkyTG5OaEwwTmxjblJGYm5KdmJHd3ZVRkphUlVsdWRtOXBZMlZUUTBFMExtVjRkR2RoZW5RdVoyOTJMbXh2WTJGc1gxQlNXa1ZKVGxaUFNVTkZVME5CTkMxRFFTZ3hLUzVqY25Rd0RnWURWUjBQQVFIL0JBUURBZ2VBTUR3R0NTc0dBUVFCZ2pjVkJ3UXZNQzBHSlNzR0FRUUJnamNWQ0lHR3FCMkUwUHNTaHUyZEpJZk8reG5Ud0ZWbWgvcWxaWVhaaEQ0Q0FXUUNBUkl3SFFZRFZSMGxCQll3RkFZSUt3WUJCUVVIQXdNR0NDc0dBUVVGQndNQ01DY0dDU3NHQVFRQmdqY1ZDZ1FhTUJnd0NnWUlLd1lCQlFVSEF3TXdDZ1lJS3dZQkJRVUhBd0l3Q2dZSUtvWkl6ajBFQXdJRFNBQXdSUUloQUxFL2ljaG1uV1hDVUtVYmNhM3ljaThvcXdhTHZGZEhWalFydmVJOXVxQWJBaUE5aEM0TThqZ01CQURQU3ptZDJ1aVBKQTZnS1IzTEUwM1U3NWVxYkMvclhBPT0=",
1111
"pcsid_secret": "CkYsEXfV8c1gFHAtFWoZv73pGMvh/Qyo4LzKM2h/8Hg=",

Certificates/taxpayer.csr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0NCk1JSUNHVENDQWI4Q0FRQXdkVEVtTUNRR0ExVUVBd3dkVkZOVUxUZzROalF6TVRFME5TMHpPVGs1T1RrNU9UazUNCk1EQXdNRE14RmpBVUJnTlZCQXNNRFZKcGVXRmthQ0JDY21GdVkyZ3hKakFrQmdOVkJBb01IVTFoZUdsdGRXMGcNClUzQmxaV1FnVkdWamFDQlRkWEJ3YkhrZ1RGUkVNUXN3Q1FZRFZRUUdFd0pUUVRCV01CQUdCeXFHU000OUFnRUcNCkJTdUJCQUFLQTBJQUJMWmJWMjk0a0lkemJvVUlhY1FUc2xYWnFYTGl4VkZ2Wkw4c3VJL3BqcElEbFZidVRyUmwNCnhVUXVDbVRqMWJuUzc4anZ2eE1TOWYyS2haczlmQ1d1UTdhZ2dlb3dnZWNHQ1NxR1NJYjNEUUVKRGpHQjJUQ0INCjFqQWtCZ2tyQmdFRUFZb2ZGQUlFRnhNVlZGTlVXa0ZVUTBFdFEyOWtaUzFUYVdkdWFXNW5NSUd0QmdOVkhSRUUNCmdhVXdnYUtrZ1o4d2dad3hPekE1QmdOVkJBUU1NakV0VkZOVWZESXRWRk5VZkRNdFpXUXlNbVl4WkRndFpUWmgNCk1pMHhNVEU0TFRsaU5UZ3RaRGxoT0dZeE1XVTBORFZtTVI4d0hRWUtDWkltaVpQeUxHUUJBUXdQTXprNU9UazUNCk9UazVPVEF3TURBek1RMHdDd1lEVlFRTURBUXhNVEF3TVJFd0R3WURWUVFhREFoU1VsSkVNamt5T1RFYU1CZ0cNCkExVUVEd3dSVTNWd2NHeDVJR0ZqZEdsMmFYUnBaWE13Q2dZSUtvWkl6ajBFQXdJRFNBQXdSUUlnVUVkSk1BUUoNCnQ0M1A0eWZ3djk0M0RUZWZTV3hyV0s2VW0zOGJTdDRMbjVFQ0lRRFEyUkIwUjdWMTJlRitCa1MvV3hXNWpxVlgNClJNRE5mRGlDY0Q0TmI3MkZBQT09DQotLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0NCg==
1+
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0NCk1JSUNHRENDQWI4Q0FRQXdkVEVtTUNRR0ExVUVBd3dkVkZOVUxUZzROalF6TVRFME5TMHpPVGs1T1RrNU9UazUNCk1EQXdNRE14RmpBVUJnTlZCQXNNRFZKcGVXRmthQ0JDY21GdVkyZ3hKakFrQmdOVkJBb01IVTFoZUdsdGRXMGcNClUzQmxaV1FnVkdWamFDQlRkWEJ3YkhrZ1RGUkVNUXN3Q1FZRFZRUUdFd0pUUVRCV01CQUdCeXFHU000OUFnRUcNCkJTdUJCQUFLQTBJQUJBbEFDRjJSSmpVTWk2TmtvZjVBb3JOZktjR2pzbVJWamhSYnVYQTdTdWx5SVVHZHNpMXENCndYcktWSElvZ016eXIwTVk1SEF2MU4yRWU0QXpXSDM2a3M2Z2dlb3dnZWNHQ1NxR1NJYjNEUUVKRGpHQjJUQ0INCjFqQWtCZ2tyQmdFRUFZb2ZGQUlFRnhNVlZGTlVXa0ZVUTBFdFEyOWtaUzFUYVdkdWFXNW5NSUd0QmdOVkhSRUUNCmdhVXdnYUtrZ1o4d2dad3hPekE1QmdOVkJBUU1NakV0VkZOVWZESXRWRk5VZkRNdFpXUXlNbVl4WkRndFpUWmgNCk1pMHhNVEU0TFRsaU5UZ3RaRGxoT0dZeE1XVTBORFZtTVI4d0hRWUtDWkltaVpQeUxHUUJBUXdQTXprNU9UazUNCk9UazVPVEF3TURBek1RMHdDd1lEVlFRTURBUXhNVEF3TVJFd0R3WURWUVFhREFoU1VsSkVNamt5T1RFYU1CZ0cNCkExVUVEd3dSVTNWd2NHeDVJR0ZqZEdsMmFYUnBaWE13Q2dZSUtvWkl6ajBFQXdJRFJ3QXdSQUlnTWV5emMyMUENClFPeW8vMkFkOVhVR2Q4b1JoRHlqQlFwQVp5aWlOSVIrRkxjQ0lDa1VsTHhoODdXc01PUDdyRG1KQlNCY1pIcVoNCnB1ODA1aDYyTVRrb1IxeFQNCi0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQ0K

approval_test

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import json
2+
import base64
3+
import time
4+
from utilities.api_helper import api_helper
5+
from utilities.invoice_helper import invoice_helper
6+
from utilities.einvoice_signer import einvoice_signer
7+
from lxml import etree
8+
9+
def main():
10+
print("\n3: Sending Sample Documents\n")
11+
12+
cert_info = api_helper.load_json_from_file("certificates/certificateInfo.json")
13+
xml_template_path = "templates\invoice.xml"
14+
15+
private_key = cert_info["privateKey"]
16+
x509_certificate_content = base64.b64decode(cert_info["pcsid_binarySecurityToken"]).decode('utf-8')
17+
18+
parser = etree.XMLParser(remove_blank_text=False)
19+
base_document = etree.parse(xml_template_path, parser)
20+
document_types = [
21+
["STDSI", "388", "Standard Invoice", ""],
22+
["STDCN", "383", "Standard CreditNote", "InstructionNotes for Standard CreditNote"],
23+
["STDDN", "381", "Standard DebitNote", "InstructionNotes for Standard DebitNote"],
24+
["SIMSI", "388", "Simplified Invoice", ""],
25+
["SIMCN", "383", "Simplified CreditNote", "InstructionNotes for Simplified CreditNote"],
26+
["SIMDN", "381", "Simplified DebitNote", "InstructionNotes for Simplified DebitNote"]
27+
]
28+
29+
icv = 0
30+
pih = "NWZlY2ViNjZmZmM4NmYzOGQ5NTI3ODZjNmQ2OTZjNzljMmRiYzIzOWRkNGU5MWI0NjcyOWQ3M2EyN2ZiNTdlOQ=="
31+
32+
for doc_type in document_types:
33+
prefix, type_code, description, instruction_note = doc_type
34+
icv += 1
35+
is_simplified = prefix.startswith("SIM")
36+
37+
print(f"Processing {description}...\n")
38+
39+
new_doc = invoice_helper.modify_xml(
40+
base_document,
41+
f"{prefix}-0001",
42+
"0200000" if is_simplified else "0100000",
43+
type_code,
44+
icv,
45+
pih,
46+
instruction_note
47+
)
48+
49+
json_payload = einvoice_signer.get_request_api(new_doc, x509_certificate_content, private_key)
50+
51+
#print(json_payload)
52+
53+
54+
if einvoice_signer.is_simplified_invoice(new_doc):
55+
response = api_helper.invoice_reporting(cert_info, json_payload)
56+
request_type = "Reporting Api"
57+
api_url = cert_info["reportingUrl"]
58+
else:
59+
response = api_helper.invoice_clearance(cert_info, json_payload)
60+
request_type = "Clearance Api"
61+
api_url = cert_info["clearanceUrl"]
62+
63+
clean_response = api_helper.clean_up_json(response, request_type, api_url)
64+
65+
json_decoded_response = json.loads(response)
66+
67+
if json_decoded_response:
68+
print(f"Reporting api Server Response: \n{clean_response}")
69+
else:
70+
print(f"Invalid JSON Response: \n{response}")
71+
exit(1)
72+
73+
if response is None:
74+
print(f"Failed to process {description}: serverResult is null.\n")
75+
exit(1)
76+
77+
status = json_decoded_response["reportingStatus"] if is_simplified else json_decoded_response["clearanceStatus"]
78+
79+
if "REPORTED" in status or "CLEARED" in status:
80+
json_payload = json.loads(json_payload)
81+
pih = json_payload["invoiceHash"]
82+
print(f"\n{description} processed successfully\n\n")
83+
else:
84+
print(f"Failed to process {description}: status is {status}\n")
85+
exit(1)
86+
87+
time.sleep(1)
88+
89+
if __name__ == "__main__":
90+
main()

csrgenerator_test.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# main.py
2+
import base64
3+
import json
4+
import requests
5+
from utilities.csr_generator import CsrGenerator
6+
7+
environment_type = "NonProduction"
8+
9+
config = {
10+
"csr.common.name": "TST-886431145-399999999900003",
11+
"csr.serial.number": "1-TST|2-TST|3-ed22f1d8-e6a2-1118-9b58-d9a8f11e445f",
12+
"csr.organization.identifier": "399999999900003",
13+
"csr.organization.unit.name": "Riyadh Branch",
14+
"csr.organization.name": "Maximum Speed Tech Supply LTD",
15+
"csr.country.name": "SA",
16+
"csr.invoice.type": "1100",
17+
"csr.location.address": "RRRD2929",
18+
"csr.industry.business.category": "Supply activities"
19+
}
20+
21+
csr_gen = CsrGenerator(config, environment_type)
22+
private_key_content, csr_base64 = csr_gen.generate_csr()
23+
24+
print("\nPrivate Key (without header and footer):")
25+
print(private_key_content)
26+
print("\nBase64 Encoded CSR:")
27+
print(csr_base64)
28+
29+
# Test ZATCA Compliance for Generated CSR
30+
print("\n2. Get Compliance CSID")
31+
32+
csr = csr_base64
33+
OTP = '123456'
34+
url = "https://gw-fatoora.zatca.gov.sa/e-invoicing/developer-portal/compliance"
35+
36+
json_payload = json.dumps({
37+
'csr': csr
38+
})
39+
40+
headers = {
41+
'accept': 'application/json',
42+
'accept-language': 'en',
43+
'OTP': OTP,
44+
'Accept-Version': 'V2',
45+
'Content-Type': 'application/json',
46+
}
47+
48+
try:
49+
response = requests.post(url, headers=headers, data=json_payload)
50+
51+
# Output server response
52+
if response.status_code == 200:
53+
print("\n\nServer Response: \n")
54+
print(json.dumps(response.json(), indent=4))
55+
else:
56+
print("\n\nServer Response: \n" + response.text)
57+
58+
except Exception as e:
59+
print('Error: ' + str(e))

main.py

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,34 @@
22
import base64
33
import time
44
from utilities.api_helper import api_helper
5-
from utilities.csr_generator import generate_csr_and_privatekey
5+
from utilities.csr_generator_cli import generate_csr_and_privatekey
6+
from utilities.csr_generator import CsrGenerator
67
from utilities.invoice_helper import invoice_helper
78
from utilities.einvoice_signer import einvoice_signer
89
from lxml import etree
910

1011
def main():
12+
13+
print("\nPYTHON CODE ONBOARDING\n")
1114

1215
# Define Variable
1316
environment_type = 'NonProduction'
1417
OTP = '123456' # For Simulation and Production Get OTP from fatooraPortal
1518

16-
config_file_path = 'certificates/csr-config-example-EN.properties'
19+
csr_config = {
20+
"csr.common.name": "TST-886431145-399999999900003",
21+
"csr.serial.number": "1-TST|2-TST|3-ed22f1d8-e6a2-1118-9b58-d9a8f11e445f",
22+
"csr.organization.identifier": "399999999900003",
23+
"csr.organization.unit.name": "Riyadh Branch",
24+
"csr.organization.name": "Maximum Speed Tech Supply LTD",
25+
"csr.country.name": "SA",
26+
"csr.invoice.type": "1100",
27+
"csr.location.address": "RRRD2929",
28+
"csr.industry.business.category": "Supply activities"
29+
}
30+
31+
#config_file_path = 'certificates/csr-config-example-EN.properties'
32+
1733
api_path = 'developer-portal' # Default value
1834

1935
# Determine API path based on environment type
@@ -49,7 +65,19 @@ def main():
4965
print("\n1. Generate CSR and PrivateKey\n")
5066

5167
#Generate CSR & Private Key
52-
cert_info = generate_csr_and_privatekey(cert_info, config_file_path)
68+
cert_info = generate_csr_and_privatekey(cert_info, "certificates\csr-config-example-EN.properties")
69+
exit
70+
csr_gen = CsrGenerator(csr_config, environment_type)
71+
private_key_content, csr_base64 = csr_gen.generate_csr()
72+
73+
print("\nPrivate Key (without header and footer):")
74+
print(private_key_content)
75+
print("\nBase64 Encoded CSR:")
76+
print(csr_base64)
77+
78+
cert_info["csr"] = csr_base64
79+
cert_info["privateKey"] = private_key_content
80+
5381
api_helper.save_json_to_file("certificates/certificateInfo.json", cert_info)
5482

5583
# 2. Get Compliance CSID
@@ -78,7 +106,7 @@ def main():
78106
print("\n3: Sending Sample Documents\n")
79107

80108
cert_info = api_helper.load_json_from_file("certificates/certificateInfo.json")
81-
xml_template_path = "Resources/Invoice.xml"
109+
xml_template_path = "templates\invoice.xml"
82110

83111
private_key = cert_info["privateKey"]
84112
x509_certificate_content = base64.b64decode(cert_info["ccsid_binarySecurityToken"]).decode('utf-8')
@@ -113,7 +141,7 @@ def main():
113141
pih,
114142
instruction_note
115143
)
116-
144+
117145
json_payload = einvoice_signer.get_request_api(new_doc, x509_certificate_content, private_key)
118146

119147
#print(json_payload)
@@ -146,7 +174,7 @@ def main():
146174
print(f"Failed to process {description}: status is {status}\n")
147175
exit(1)
148176

149-
time.sleep(0.2) # 200 ms delay
177+
#time.sleep(1)
150178

151179
# 4. Get Production CSID
152180

@@ -167,10 +195,10 @@ def main():
167195

168196
api_helper.save_json_to_file("certificates/certificateInfo.json", cert_info)
169197

170-
print(f"complianceCSID Server Response: \n{clean_response}")
198+
print(f"Production CSID Server Response: \n{clean_response}")
171199

172200
except json.JSONDecodeError:
173-
print(f"complianceCSID Server Response: \n{clean_response}")
201+
print(f"Production CSID Server Response: \n{clean_response}")
174202

175203

176204
if __name__ == "__main__":

0 commit comments

Comments
 (0)