@cheqi/sdk 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -0
- package/dist/cheqi-sdk.d.ts +98 -0
- package/dist/cheqi-sdk.js +134 -0
- package/dist/cheqi-sdk.js.map +1 -0
- package/dist/config.d.ts +23 -0
- package/dist/config.js +63 -0
- package/dist/config.js.map +1 -0
- package/dist/crypto.d.ts +9 -0
- package/dist/crypto.js +10 -0
- package/dist/crypto.js.map +1 -0
- package/dist/entity/index.d.ts +1 -0
- package/dist/entity/index.js +2 -0
- package/dist/entity/index.js.map +1 -0
- package/dist/errors.d.ts +40 -0
- package/dist/errors.js +48 -0
- package/dist/errors.js.map +1 -0
- package/dist/http/client.d.ts +32 -0
- package/dist/http/client.js +199 -0
- package/dist/http/client.js.map +1 -0
- package/dist/http/endpoints.d.ts +13 -0
- package/dist/http/endpoints.js +14 -0
- package/dist/http/endpoints.js.map +1 -0
- package/dist/http/retry.d.ts +30 -0
- package/dist/http/retry.js +74 -0
- package/dist/http/retry.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +31 -0
- package/dist/logger.js +31 -0
- package/dist/logger.js.map +1 -0
- package/dist/models/domain.d.ts +366 -0
- package/dist/models/domain.js +467 -0
- package/dist/models/domain.js.map +1 -0
- package/dist/models/entity.d.ts +226 -0
- package/dist/models/entity.js +334 -0
- package/dist/models/entity.js.map +1 -0
- package/dist/models/generated/AccountIdentifierType.d.ts +24 -0
- package/dist/models/generated/AccountIdentifierType.js +43 -0
- package/dist/models/generated/AccountIdentifierType.js.map +1 -0
- package/dist/models/generated/AcknowledgeRequest.d.ts +32 -0
- package/dist/models/generated/AcknowledgeRequest.js +42 -0
- package/dist/models/generated/AcknowledgeRequest.js.map +1 -0
- package/dist/models/generated/AddressDTO.d.ts +74 -0
- package/dist/models/generated/AddressDTO.js +64 -0
- package/dist/models/generated/AddressDTO.js.map +1 -0
- package/dist/models/generated/AuthorizedCardDTO.d.ts +38 -0
- package/dist/models/generated/AuthorizedCardDTO.js +44 -0
- package/dist/models/generated/AuthorizedCardDTO.js.map +1 -0
- package/dist/models/generated/AuthorizedCompanyDTO.d.ts +64 -0
- package/dist/models/generated/AuthorizedCompanyDTO.js +54 -0
- package/dist/models/generated/AuthorizedCompanyDTO.js.map +1 -0
- package/dist/models/generated/AuthorizedEmailDTO.d.ts +38 -0
- package/dist/models/generated/AuthorizedEmailDTO.js +44 -0
- package/dist/models/generated/AuthorizedEmailDTO.js.map +1 -0
- package/dist/models/generated/AuthorizedPaymentAccountDTO.d.ts +70 -0
- package/dist/models/generated/AuthorizedPaymentAccountDTO.js +63 -0
- package/dist/models/generated/AuthorizedPaymentAccountDTO.js.map +1 -0
- package/dist/models/generated/AuthorizedResourcesResponse.d.ts +53 -0
- package/dist/models/generated/AuthorizedResourcesResponse.js +51 -0
- package/dist/models/generated/AuthorizedResourcesResponse.js.map +1 -0
- package/dist/models/generated/Barcode.d.ts +44 -0
- package/dist/models/generated/Barcode.js +46 -0
- package/dist/models/generated/Barcode.js.map +1 -0
- package/dist/models/generated/BarcodeType.d.ts +29 -0
- package/dist/models/generated/BarcodeType.js +48 -0
- package/dist/models/generated/BarcodeType.js.map +1 -0
- package/dist/models/generated/BuyerType.d.ts +25 -0
- package/dist/models/generated/BuyerType.js +44 -0
- package/dist/models/generated/BuyerType.js.map +1 -0
- package/dist/models/generated/CardDetails.d.ts +54 -0
- package/dist/models/generated/CardDetails.js +57 -0
- package/dist/models/generated/CardDetails.js.map +1 -0
- package/dist/models/generated/Charge.d.ts +44 -0
- package/dist/models/generated/Charge.js +48 -0
- package/dist/models/generated/Charge.js.map +1 -0
- package/dist/models/generated/CheqiCreditNote.d.ts +148 -0
- package/dist/models/generated/CheqiCreditNote.js +86 -0
- package/dist/models/generated/CheqiCreditNote.js.map +1 -0
- package/dist/models/generated/CheqiReceipt.d.ts +143 -0
- package/dist/models/generated/CheqiReceipt.js +85 -0
- package/dist/models/generated/CheqiReceipt.js.map +1 -0
- package/dist/models/generated/CompanyCreationRequest.d.ts +114 -0
- package/dist/models/generated/CompanyCreationRequest.js +80 -0
- package/dist/models/generated/CompanyCreationRequest.js.map +1 -0
- package/dist/models/generated/CompanyIdentifierDTO.d.ts +92 -0
- package/dist/models/generated/CompanyIdentifierDTO.js +73 -0
- package/dist/models/generated/CompanyIdentifierDTO.js.map +1 -0
- package/dist/models/generated/CompanyIdentifierRequirement.d.ts +63 -0
- package/dist/models/generated/CompanyIdentifierRequirement.js +53 -0
- package/dist/models/generated/CompanyIdentifierRequirement.js.map +1 -0
- package/dist/models/generated/CompanyIdentifierType.d.ts +29 -0
- package/dist/models/generated/CompanyIdentifierType.js +48 -0
- package/dist/models/generated/CompanyIdentifierType.js.map +1 -0
- package/dist/models/generated/CompanyReceiptDeliveryDeviceDto.d.ts +65 -0
- package/dist/models/generated/CompanyReceiptDeliveryDeviceDto.js +58 -0
- package/dist/models/generated/CompanyReceiptDeliveryDeviceDto.js.map +1 -0
- package/dist/models/generated/CompanyReceiptDeliverySettingsResponse.d.ts +39 -0
- package/dist/models/generated/CompanyReceiptDeliverySettingsResponse.js +45 -0
- package/dist/models/generated/CompanyReceiptDeliverySettingsResponse.js.map +1 -0
- package/dist/models/generated/CompanyResponseBody.d.ts +151 -0
- package/dist/models/generated/CompanyResponseBody.js +85 -0
- package/dist/models/generated/CompanyResponseBody.js.map +1 -0
- package/dist/models/generated/CompanyRole.d.ts +25 -0
- package/dist/models/generated/CompanyRole.js +44 -0
- package/dist/models/generated/CompanyRole.js.map +1 -0
- package/dist/models/generated/ContactDetailDto.d.ts +50 -0
- package/dist/models/generated/ContactDetailDto.js +48 -0
- package/dist/models/generated/ContactDetailDto.js.map +1 -0
- package/dist/models/generated/CreateChildCompanyRequest.d.ts +39 -0
- package/dist/models/generated/CreateChildCompanyRequest.js +45 -0
- package/dist/models/generated/CreateChildCompanyRequest.js.map +1 -0
- package/dist/models/generated/CreateStoreRequest.d.ts +63 -0
- package/dist/models/generated/CreateStoreRequest.js +59 -0
- package/dist/models/generated/CreateStoreRequest.js.map +1 -0
- package/dist/models/generated/CreditNoteContextEnvelope.d.ts +40 -0
- package/dist/models/generated/CreditNoteContextEnvelope.js +46 -0
- package/dist/models/generated/CreditNoteContextEnvelope.js.map +1 -0
- package/dist/models/generated/CreditNoteCreatedResponse.d.ts +50 -0
- package/dist/models/generated/CreditNoteCreatedResponse.js +48 -0
- package/dist/models/generated/CreditNoteCreatedResponse.js.map +1 -0
- package/dist/models/generated/CreditNoteTemplateGenerationRequest.d.ts +59 -0
- package/dist/models/generated/CreditNoteTemplateGenerationRequest.js +63 -0
- package/dist/models/generated/CreditNoteTemplateGenerationRequest.js.map +1 -0
- package/dist/models/generated/CreditNoteTemplateRequest.d.ts +128 -0
- package/dist/models/generated/CreditNoteTemplateRequest.js +98 -0
- package/dist/models/generated/CreditNoteTemplateRequest.js.map +1 -0
- package/dist/models/generated/CreditNoteTemplateResponse.d.ts +39 -0
- package/dist/models/generated/CreditNoteTemplateResponse.js +45 -0
- package/dist/models/generated/CreditNoteTemplateResponse.js.map +1 -0
- package/dist/models/generated/Discount.d.ts +44 -0
- package/dist/models/generated/Discount.js +48 -0
- package/dist/models/generated/Discount.js.map +1 -0
- package/dist/models/generated/DocumentType.d.ts +25 -0
- package/dist/models/generated/DocumentType.js +44 -0
- package/dist/models/generated/DocumentType.js.map +1 -0
- package/dist/models/generated/EmailReceiptRequest.d.ts +39 -0
- package/dist/models/generated/EmailReceiptRequest.js +49 -0
- package/dist/models/generated/EmailReceiptRequest.js.map +1 -0
- package/dist/models/generated/EncryptedCreditNote.d.ts +86 -0
- package/dist/models/generated/EncryptedCreditNote.js +72 -0
- package/dist/models/generated/EncryptedCreditNote.js.map +1 -0
- package/dist/models/generated/EncryptedCreditNoteDto.d.ts +102 -0
- package/dist/models/generated/EncryptedCreditNoteDto.js +85 -0
- package/dist/models/generated/EncryptedCreditNoteDto.js.map +1 -0
- package/dist/models/generated/EncryptedCreditNoteInitiationRequest.d.ts +50 -0
- package/dist/models/generated/EncryptedCreditNoteInitiationRequest.js +48 -0
- package/dist/models/generated/EncryptedCreditNoteInitiationRequest.js.map +1 -0
- package/dist/models/generated/EncryptedCreditNotesRequest.d.ts +51 -0
- package/dist/models/generated/EncryptedCreditNotesRequest.js +57 -0
- package/dist/models/generated/EncryptedCreditNotesRequest.js.map +1 -0
- package/dist/models/generated/EncryptedReceiptDto.d.ts +118 -0
- package/dist/models/generated/EncryptedReceiptDto.js +77 -0
- package/dist/models/generated/EncryptedReceiptDto.js.map +1 -0
- package/dist/models/generated/EncryptedReceiptRequest.d.ts +69 -0
- package/dist/models/generated/EncryptedReceiptRequest.js +63 -0
- package/dist/models/generated/EncryptedReceiptRequest.js.map +1 -0
- package/dist/models/generated/EncryptedReceiptsRequest.d.ts +45 -0
- package/dist/models/generated/EncryptedReceiptsRequest.js +53 -0
- package/dist/models/generated/EncryptedReceiptsRequest.js.map +1 -0
- package/dist/models/generated/IdentificationDetails.d.ts +71 -0
- package/dist/models/generated/IdentificationDetails.js +57 -0
- package/dist/models/generated/IdentificationDetails.js.map +1 -0
- package/dist/models/generated/Identifier.d.ts +38 -0
- package/dist/models/generated/Identifier.js +44 -0
- package/dist/models/generated/Identifier.js.map +1 -0
- package/dist/models/generated/KeyAlgorithm.d.ts +25 -0
- package/dist/models/generated/KeyAlgorithm.js +44 -0
- package/dist/models/generated/KeyAlgorithm.js.map +1 -0
- package/dist/models/generated/MatchedRecipient.d.ts +51 -0
- package/dist/models/generated/MatchedRecipient.js +49 -0
- package/dist/models/generated/MatchedRecipient.js.map +1 -0
- package/dist/models/generated/NotificationDisplayCode.d.ts +39 -0
- package/dist/models/generated/NotificationDisplayCode.js +49 -0
- package/dist/models/generated/NotificationDisplayCode.js.map +1 -0
- package/dist/models/generated/PartyAddress.d.ts +56 -0
- package/dist/models/generated/PartyAddress.js +50 -0
- package/dist/models/generated/PartyAddress.js.map +1 -0
- package/dist/models/generated/PaymentAccountDetails.d.ts +57 -0
- package/dist/models/generated/PaymentAccountDetails.js +55 -0
- package/dist/models/generated/PaymentAccountDetails.js.map +1 -0
- package/dist/models/generated/PaymentMeansEnvelope.d.ts +68 -0
- package/dist/models/generated/PaymentMeansEnvelope.js +54 -0
- package/dist/models/generated/PaymentMeansEnvelope.js.map +1 -0
- package/dist/models/generated/PaymentType.d.ts +26 -0
- package/dist/models/generated/PaymentType.js +45 -0
- package/dist/models/generated/PaymentType.js.map +1 -0
- package/dist/models/generated/Period.d.ts +44 -0
- package/dist/models/generated/Period.js +50 -0
- package/dist/models/generated/Period.js.map +1 -0
- package/dist/models/generated/PermanentFailureAcknowledgeRequest.d.ts +38 -0
- package/dist/models/generated/PermanentFailureAcknowledgeRequest.js +44 -0
- package/dist/models/generated/PermanentFailureAcknowledgeRequest.js.map +1 -0
- package/dist/models/generated/Product.d.ts +122 -0
- package/dist/models/generated/Product.js +94 -0
- package/dist/models/generated/Product.js.map +1 -0
- package/dist/models/generated/PublicKeyResponse.d.ts +51 -0
- package/dist/models/generated/PublicKeyResponse.js +49 -0
- package/dist/models/generated/PublicKeyResponse.js.map +1 -0
- package/dist/models/generated/ReceiptContextEnvelope.d.ts +40 -0
- package/dist/models/generated/ReceiptContextEnvelope.js +46 -0
- package/dist/models/generated/ReceiptContextEnvelope.js.map +1 -0
- package/dist/models/generated/ReceiptCreatedResponse.d.ts +44 -0
- package/dist/models/generated/ReceiptCreatedResponse.js +46 -0
- package/dist/models/generated/ReceiptCreatedResponse.js.map +1 -0
- package/dist/models/generated/ReceiptEnvelope.d.ts +52 -0
- package/dist/models/generated/ReceiptEnvelope.js +50 -0
- package/dist/models/generated/ReceiptEnvelope.js.map +1 -0
- package/dist/models/generated/ReceiptFormat.d.ts +27 -0
- package/dist/models/generated/ReceiptFormat.js +46 -0
- package/dist/models/generated/ReceiptFormat.js.map +1 -0
- package/dist/models/generated/ReceiptQueueDto.d.ts +137 -0
- package/dist/models/generated/ReceiptQueueDto.js +79 -0
- package/dist/models/generated/ReceiptQueueDto.js.map +1 -0
- package/dist/models/generated/ReceiptTemplateGenerationRequest.d.ts +59 -0
- package/dist/models/generated/ReceiptTemplateGenerationRequest.js +63 -0
- package/dist/models/generated/ReceiptTemplateGenerationRequest.js.map +1 -0
- package/dist/models/generated/ReceiptTemplateRequest.d.ts +141 -0
- package/dist/models/generated/ReceiptTemplateRequest.js +99 -0
- package/dist/models/generated/ReceiptTemplateRequest.js.map +1 -0
- package/dist/models/generated/ReceiptTemplateResponse.d.ts +52 -0
- package/dist/models/generated/ReceiptTemplateResponse.js +50 -0
- package/dist/models/generated/ReceiptTemplateResponse.js.map +1 -0
- package/dist/models/generated/ReceivingParty.d.ts +76 -0
- package/dist/models/generated/ReceivingParty.js +58 -0
- package/dist/models/generated/ReceivingParty.js.map +1 -0
- package/dist/models/generated/ReceivingPartyEnvelope.d.ts +39 -0
- package/dist/models/generated/ReceivingPartyEnvelope.js +45 -0
- package/dist/models/generated/ReceivingPartyEnvelope.js.map +1 -0
- package/dist/models/generated/RecipientResolutionResponse.d.ts +76 -0
- package/dist/models/generated/RecipientResolutionResponse.js +58 -0
- package/dist/models/generated/RecipientResolutionResponse.js.map +1 -0
- package/dist/models/generated/ReturnProcessingMode.d.ts +25 -0
- package/dist/models/generated/ReturnProcessingMode.js +44 -0
- package/dist/models/generated/ReturnProcessingMode.js.map +1 -0
- package/dist/models/generated/RoutingIdentifier.d.ts +39 -0
- package/dist/models/generated/RoutingIdentifier.js +45 -0
- package/dist/models/generated/RoutingIdentifier.js.map +1 -0
- package/dist/models/generated/RoutingIdentifierType.d.ts +27 -0
- package/dist/models/generated/RoutingIdentifierType.js +46 -0
- package/dist/models/generated/RoutingIdentifierType.js.map +1 -0
- package/dist/models/generated/SellingParty.d.ts +58 -0
- package/dist/models/generated/SellingParty.js +52 -0
- package/dist/models/generated/SellingParty.js.map +1 -0
- package/dist/models/generated/StoreDTO.d.ts +99 -0
- package/dist/models/generated/StoreDTO.js +69 -0
- package/dist/models/generated/StoreDTO.js.map +1 -0
- package/dist/models/generated/Tax.d.ts +56 -0
- package/dist/models/generated/Tax.js +56 -0
- package/dist/models/generated/Tax.js.map +1 -0
- package/dist/models/generated/UnitCode.d.ts +77 -0
- package/dist/models/generated/UnitCode.js +96 -0
- package/dist/models/generated/UnitCode.js.map +1 -0
- package/dist/models/generated/UpdateCompanyReceiptDeliveryPreferenceRequest.d.ts +32 -0
- package/dist/models/generated/UpdateCompanyReceiptDeliveryPreferenceRequest.js +44 -0
- package/dist/models/generated/UpdateCompanyReceiptDeliveryPreferenceRequest.js.map +1 -0
- package/dist/models/generated/UpdateStoreRequest.d.ts +63 -0
- package/dist/models/generated/UpdateStoreRequest.js +53 -0
- package/dist/models/generated/UpdateStoreRequest.js.map +1 -0
- package/dist/models/generated/UploadPublicKeyRequest.d.ts +39 -0
- package/dist/models/generated/UploadPublicKeyRequest.js +49 -0
- package/dist/models/generated/UploadPublicKeyRequest.js.map +1 -0
- package/dist/models/generated/VatMetadata.d.ts +70 -0
- package/dist/models/generated/VatMetadata.js +56 -0
- package/dist/models/generated/VatMetadata.js.map +1 -0
- package/dist/models/generated/VatRegime.d.ts +31 -0
- package/dist/models/generated/VatRegime.js +50 -0
- package/dist/models/generated/VatRegime.js.map +1 -0
- package/dist/models/generated/WebhookDTO.d.ts +62 -0
- package/dist/models/generated/WebhookDTO.js +52 -0
- package/dist/models/generated/WebhookDTO.js.map +1 -0
- package/dist/models/generated/WebhookEventDTO.d.ts +113 -0
- package/dist/models/generated/WebhookEventDTO.js +78 -0
- package/dist/models/generated/WebhookEventDTO.js.map +1 -0
- package/dist/models/generated/WebhookRequestBody.d.ts +55 -0
- package/dist/models/generated/WebhookRequestBody.js +56 -0
- package/dist/models/generated/WebhookRequestBody.js.map +1 -0
- package/dist/models/generated/WebhookResponse.d.ts +39 -0
- package/dist/models/generated/WebhookResponse.js +45 -0
- package/dist/models/generated/WebhookResponse.js.map +1 -0
- package/dist/models/generated/WebhookSecretRotationResponse.d.ts +56 -0
- package/dist/models/generated/WebhookSecretRotationResponse.js +50 -0
- package/dist/models/generated/WebhookSecretRotationResponse.js.map +1 -0
- package/dist/models/generated/index.d.ts +82 -0
- package/dist/models/generated/index.js +83 -0
- package/dist/models/generated/index.js.map +1 -0
- package/dist/models/generated/runtime.d.ts +182 -0
- package/dist/models/generated/runtime.js +330 -0
- package/dist/models/generated/runtime.js.map +1 -0
- package/dist/models/index.d.ts +3 -0
- package/dist/models/index.js +4 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models.d.ts +51 -0
- package/dist/models.js +106 -0
- package/dist/models.js.map +1 -0
- package/dist/rfc8785.d.ts +1 -0
- package/dist/rfc8785.js +42 -0
- package/dist/rfc8785.js.map +1 -0
- package/dist/services/company.d.ts +7 -0
- package/dist/services/company.js +33 -0
- package/dist/services/company.js.map +1 -0
- package/dist/services/credit-note.d.ts +25 -0
- package/dist/services/credit-note.js +211 -0
- package/dist/services/credit-note.js.map +1 -0
- package/dist/services/decryption.d.ts +33 -0
- package/dist/services/decryption.js +145 -0
- package/dist/services/decryption.js.map +1 -0
- package/dist/services/encryption.d.ts +25 -0
- package/dist/services/encryption.js +94 -0
- package/dist/services/encryption.js.map +1 -0
- package/dist/services/matching.d.ts +7 -0
- package/dist/services/matching.js +32 -0
- package/dist/services/matching.js.map +1 -0
- package/dist/services/receipt.d.ts +17 -0
- package/dist/services/receipt.js +186 -0
- package/dist/services/receipt.js.map +1 -0
- package/dist/services/store.d.ts +16 -0
- package/dist/services/store.js +89 -0
- package/dist/services/store.js.map +1 -0
- package/dist/services/verification.d.ts +10 -0
- package/dist/services/verification.js +30 -0
- package/dist/services/verification.js.map +1 -0
- package/dist/types.d.ts +70 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +11 -0
- package/dist/utils.js +54 -0
- package/dist/utils.js.map +1 -0
- package/dist/validators.d.ts +11 -0
- package/dist/validators.js +56 -0
- package/dist/validators.js.map +1 -0
- package/dist/xml.d.ts +2 -0
- package/dist/xml.js +11 -0
- package/dist/xml.js.map +1 -0
- package/package.json +56 -0
package/dist/models.js
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
export class ReceiptResult {
|
|
2
|
+
success;
|
|
3
|
+
deliveryMethod;
|
|
4
|
+
customerFound;
|
|
5
|
+
receiptCount;
|
|
6
|
+
response;
|
|
7
|
+
templateContent;
|
|
8
|
+
message;
|
|
9
|
+
customerEmail;
|
|
10
|
+
constructor(init) {
|
|
11
|
+
this.success = init.success;
|
|
12
|
+
this.deliveryMethod = init.deliveryMethod ?? null;
|
|
13
|
+
this.customerFound = init.customerFound ?? false;
|
|
14
|
+
this.receiptCount = init.receiptCount ?? 0;
|
|
15
|
+
this.response = init.response ?? null;
|
|
16
|
+
this.templateContent = init.templateContent ?? null;
|
|
17
|
+
this.message = init.message ?? null;
|
|
18
|
+
this.customerEmail = init.customerEmail ?? null;
|
|
19
|
+
}
|
|
20
|
+
static deliveredToApp(response, templateContent) {
|
|
21
|
+
const receiptCount = (Array.isArray(response.createdReceipts) ? response.createdReceipts.length : undefined) ??
|
|
22
|
+
(typeof response.receiptCount === "number" ? response.receiptCount : 0);
|
|
23
|
+
return new ReceiptResult({
|
|
24
|
+
success: true,
|
|
25
|
+
deliveryMethod: "APP",
|
|
26
|
+
customerFound: true,
|
|
27
|
+
receiptCount,
|
|
28
|
+
response,
|
|
29
|
+
templateContent
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
static deliveredViaEmail(customerEmail) {
|
|
33
|
+
return new ReceiptResult({
|
|
34
|
+
success: true,
|
|
35
|
+
deliveryMethod: "EMAIL",
|
|
36
|
+
customerFound: false,
|
|
37
|
+
customerEmail
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
static customerNotFound() {
|
|
41
|
+
return new ReceiptResult({
|
|
42
|
+
success: false,
|
|
43
|
+
customerFound: false,
|
|
44
|
+
message: "Customer not found"
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
isSuccess() {
|
|
48
|
+
return this.success;
|
|
49
|
+
}
|
|
50
|
+
isCustomerNotFound() {
|
|
51
|
+
return !this.customerFound;
|
|
52
|
+
}
|
|
53
|
+
getReceiptCount() {
|
|
54
|
+
return this.receiptCount;
|
|
55
|
+
}
|
|
56
|
+
getMessage() {
|
|
57
|
+
return this.message;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export class CreditNoteResult {
|
|
61
|
+
success;
|
|
62
|
+
customerFound;
|
|
63
|
+
creditNoteCount;
|
|
64
|
+
response;
|
|
65
|
+
templateContent;
|
|
66
|
+
message;
|
|
67
|
+
constructor(init) {
|
|
68
|
+
this.success = init.success;
|
|
69
|
+
this.customerFound = init.customerFound ?? false;
|
|
70
|
+
this.creditNoteCount = init.creditNoteCount ?? 0;
|
|
71
|
+
this.response = init.response ?? null;
|
|
72
|
+
this.templateContent = init.templateContent ?? null;
|
|
73
|
+
this.message = init.message ?? null;
|
|
74
|
+
}
|
|
75
|
+
static deliveredToApp(response, templateContent) {
|
|
76
|
+
const creditNoteCount = (Array.isArray(response.createdCreditNotes) ? response.createdCreditNotes.length : undefined) ??
|
|
77
|
+
(typeof response.creditNoteCount === "number" ? response.creditNoteCount : 0);
|
|
78
|
+
return new CreditNoteResult({
|
|
79
|
+
success: true,
|
|
80
|
+
customerFound: true,
|
|
81
|
+
creditNoteCount,
|
|
82
|
+
response,
|
|
83
|
+
templateContent
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
static customerNotFound() {
|
|
87
|
+
return new CreditNoteResult({
|
|
88
|
+
success: false,
|
|
89
|
+
customerFound: false,
|
|
90
|
+
message: "Customer not found"
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
isSuccess() {
|
|
94
|
+
return this.success;
|
|
95
|
+
}
|
|
96
|
+
isCustomerNotFound() {
|
|
97
|
+
return !this.customerFound;
|
|
98
|
+
}
|
|
99
|
+
getCreditNoteCount() {
|
|
100
|
+
return this.creditNoteCount;
|
|
101
|
+
}
|
|
102
|
+
getMessage() {
|
|
103
|
+
return this.message;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function canonicalizeJson(value: string | object): string;
|
package/dist/rfc8785.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
function serializeString(value) {
|
|
2
|
+
return JSON.stringify(value)
|
|
3
|
+
.replace(/\u2028/g, "\\u2028")
|
|
4
|
+
.replace(/\u2029/g, "\\u2029");
|
|
5
|
+
}
|
|
6
|
+
function serializeNumber(value) {
|
|
7
|
+
if (!Number.isFinite(value)) {
|
|
8
|
+
throw new Error("NaN and Infinity are not valid JSON values");
|
|
9
|
+
}
|
|
10
|
+
if (Object.is(value, -0) || value === 0) {
|
|
11
|
+
return "0";
|
|
12
|
+
}
|
|
13
|
+
return String(value);
|
|
14
|
+
}
|
|
15
|
+
function serialize(value) {
|
|
16
|
+
if (value === null) {
|
|
17
|
+
return "null";
|
|
18
|
+
}
|
|
19
|
+
if (typeof value === "boolean") {
|
|
20
|
+
return value ? "true" : "false";
|
|
21
|
+
}
|
|
22
|
+
if (typeof value === "number") {
|
|
23
|
+
return serializeNumber(value);
|
|
24
|
+
}
|
|
25
|
+
if (typeof value === "string") {
|
|
26
|
+
return serializeString(value);
|
|
27
|
+
}
|
|
28
|
+
if (Array.isArray(value)) {
|
|
29
|
+
return `[${value.map((entry) => serialize(entry)).join(",")}]`;
|
|
30
|
+
}
|
|
31
|
+
if (typeof value === "object") {
|
|
32
|
+
const record = value;
|
|
33
|
+
const keys = Object.keys(record).sort();
|
|
34
|
+
return `{${keys.map((key) => `${serializeString(key)}:${serialize(record[key])}`).join(",")}}`;
|
|
35
|
+
}
|
|
36
|
+
throw new TypeError(`Cannot canonicalize type: ${typeof value}`);
|
|
37
|
+
}
|
|
38
|
+
export function canonicalizeJson(value) {
|
|
39
|
+
const parsed = typeof value === "string" ? JSON.parse(value) : value;
|
|
40
|
+
return serialize(parsed);
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=rfc8785.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rfc8785.js","sourceRoot":"","sources":["../src/rfc8785.ts"],"names":[],"mappings":"AAAA,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SACzB,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;SAC7B,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QACxC,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAClC,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACjE,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACjG,CAAC;IACD,MAAM,IAAI,SAAS,CAAC,6BAA6B,OAAO,KAAK,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAsB;IACrD,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACrE,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CheqiApiClient, CompanyDTO } from "../types.js";
|
|
2
|
+
import { Company } from "../models/domain.js";
|
|
3
|
+
export declare class CompanyService {
|
|
4
|
+
private readonly apiClient;
|
|
5
|
+
constructor(apiClient: Pick<CheqiApiClient, "provisionCompany">);
|
|
6
|
+
provisionCompany(company: Company | CompanyDTO, adminEmail: string): Promise<Record<string, unknown>>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { CheqiSDKError, ErrorCodes } from "../errors.js";
|
|
2
|
+
import { Company } from "../models/domain.js";
|
|
3
|
+
import { getCompanyValidationErrors } from "../validators.js";
|
|
4
|
+
export class CompanyService {
|
|
5
|
+
apiClient;
|
|
6
|
+
constructor(apiClient) {
|
|
7
|
+
this.apiClient = apiClient;
|
|
8
|
+
}
|
|
9
|
+
provisionCompany(company, adminEmail) {
|
|
10
|
+
if (!company) {
|
|
11
|
+
throw new CheqiSDKError("Company cannot be null", {
|
|
12
|
+
errorCode: ErrorCodes.VALIDATION_ERROR,
|
|
13
|
+
httpStatusCode: 400
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
const validationErrors = getCompanyValidationErrors(company);
|
|
17
|
+
if (validationErrors.length > 0) {
|
|
18
|
+
throw new CheqiSDKError(`Invalid company data: ${validationErrors.join(", ")}`, {
|
|
19
|
+
errorCode: ErrorCodes.VALIDATION_ERROR,
|
|
20
|
+
httpStatusCode: 400
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
if (!adminEmail.includes("@")) {
|
|
24
|
+
throw new CheqiSDKError("Admin email must be a valid email address", {
|
|
25
|
+
errorCode: ErrorCodes.VALIDATION_ERROR,
|
|
26
|
+
httpStatusCode: 400
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const companyDTO = company instanceof Company ? company.toCompanyDTO() : company;
|
|
30
|
+
return this.apiClient.provisionCompany({ company: companyDTO, adminEmail });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=company.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"company.js","sourceRoot":"","sources":["../../src/services/company.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAE9D,MAAM,OAAO,cAAc;IAEN;IADnB,YACmB,SAAmD;QAAnD,cAAS,GAAT,SAAS,CAA0C;IACnE,CAAC;IAEJ,gBAAgB,CAAC,OAA6B,EAAE,UAAkB;QAChE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,aAAa,CAAC,wBAAwB,EAAE;gBAChD,SAAS,EAAE,UAAU,CAAC,gBAAgB;gBACtC,cAAc,EAAE,GAAG;aACpB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,gBAAgB,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,aAAa,CAAC,yBAAyB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;gBAC9E,SAAS,EAAE,UAAU,CAAC,gBAAgB;gBACtC,cAAc,EAAE,GAAG;aACpB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,aAAa,CAAC,2CAA2C,EAAE;gBACnE,SAAS,EAAE,UAAU,CAAC,gBAAgB;gBACtC,cAAc,EAAE,GAAG;aACpB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAG,OAAO,YAAY,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACjF,OAAO,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;IAC9E,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { CreditNoteResult } from "../models.js";
|
|
2
|
+
import type { CheqiApiClient, CreditNoteTemplateGenerationRequest, CreditNoteTemplateRequest, CreditNoteTemplateResponse, DecryptedDeliveredCreditNote, EncryptedCreditNote, EncryptedCreditNoteInitiationRequest, IdentificationDetails, MatchedRecipient, RecipientResolutionResponse } from "../types.js";
|
|
3
|
+
import { DecryptionService } from "./decryption.js";
|
|
4
|
+
import { EncryptionService } from "./encryption.js";
|
|
5
|
+
import { MatchingService } from "./matching.js";
|
|
6
|
+
export declare class CreditNoteService {
|
|
7
|
+
private readonly apiClient;
|
|
8
|
+
private readonly encryptionService;
|
|
9
|
+
private readonly matchingService;
|
|
10
|
+
private readonly decryptionService;
|
|
11
|
+
constructor(apiClient: Pick<CheqiApiClient, "generateCreditNoteTemplate" | "sendEncryptedCreditNotes">, encryptionService: EncryptionService, matchingService: MatchingService, decryptionService?: DecryptionService | null);
|
|
12
|
+
processCompleteCreditNote(identificationDetails: IdentificationDetails, creditNoteTemplateRequest: CreditNoteTemplateRequest, accessToken?: string | null): Promise<CreditNoteResult>;
|
|
13
|
+
generateCreditNoteTemplate(request: CreditNoteTemplateGenerationRequest, accessToken?: string | null): Promise<CreditNoteTemplateResponse>;
|
|
14
|
+
createEncryptedCreditNote(creditNoteEnvelope: string, recipient: MatchedRecipient): EncryptedCreditNote;
|
|
15
|
+
sendEncryptedCreditNotes(parentCheqiReceiptId: string, encryptedCreditNotes: EncryptedCreditNote[], templateHash: string, matchResponse: RecipientResolutionResponse, accessToken?: string | null): Promise<Record<string, unknown>>;
|
|
16
|
+
decryptCreditNoteRequest(encryptedCreditNote: EncryptedCreditNoteInitiationRequest, privateKeyBase64: string): {
|
|
17
|
+
content: string;
|
|
18
|
+
};
|
|
19
|
+
decryptDeliveredCreditNote(encryptedCreditNote: EncryptedCreditNote, privateKeyBase64: string): DecryptedDeliveredCreditNote;
|
|
20
|
+
private buildEncryptedCreditNotes;
|
|
21
|
+
private mergeCreditNoteContext;
|
|
22
|
+
private mergeXmlParty;
|
|
23
|
+
private mergeXmlPaymentMeans;
|
|
24
|
+
private mergeReceivingParty;
|
|
25
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { CheqiSDKError, CreditNoteProcessingError, ErrorCodes } from "../errors.js";
|
|
2
|
+
import { CreditNoteResult } from "../models.js";
|
|
3
|
+
import { serializeJson, sha256Hex } from "../utils.js";
|
|
4
|
+
const CUSTOMER_PARTY_PLACEHOLDER = "<cac:AccountingCustomerParty/>";
|
|
5
|
+
const CUSTOMER_PARTY_CLOSING_TAG = "</cac:AccountingCustomerParty>";
|
|
6
|
+
function uniqueFormats(recipients = []) {
|
|
7
|
+
const seen = new Set();
|
|
8
|
+
const formats = [];
|
|
9
|
+
for (const recipient of recipients) {
|
|
10
|
+
for (const format of recipient.acceptedFormats ?? []) {
|
|
11
|
+
if (!seen.has(format)) {
|
|
12
|
+
seen.add(format);
|
|
13
|
+
formats.push(format);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return formats;
|
|
18
|
+
}
|
|
19
|
+
function routeFound(matchResponse) {
|
|
20
|
+
return Boolean(matchResponse.routeFound ?? matchResponse.customerFound);
|
|
21
|
+
}
|
|
22
|
+
function matchedRecipients(matchResponse) {
|
|
23
|
+
return matchResponse.recipients ?? matchResponse.matchedRecipients ?? [];
|
|
24
|
+
}
|
|
25
|
+
export class CreditNoteService {
|
|
26
|
+
apiClient;
|
|
27
|
+
encryptionService;
|
|
28
|
+
matchingService;
|
|
29
|
+
decryptionService;
|
|
30
|
+
constructor(apiClient, encryptionService, matchingService, decryptionService = null) {
|
|
31
|
+
this.apiClient = apiClient;
|
|
32
|
+
this.encryptionService = encryptionService;
|
|
33
|
+
this.matchingService = matchingService;
|
|
34
|
+
this.decryptionService = decryptionService;
|
|
35
|
+
}
|
|
36
|
+
async processCompleteCreditNote(identificationDetails, creditNoteTemplateRequest, accessToken = null) {
|
|
37
|
+
if (!identificationDetails) {
|
|
38
|
+
throw new CheqiSDKError("Identification details cannot be null", {
|
|
39
|
+
errorCode: ErrorCodes.VALIDATION_ERROR,
|
|
40
|
+
httpStatusCode: 400
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
if (!creditNoteTemplateRequest) {
|
|
44
|
+
throw new CheqiSDKError("Credit note template request cannot be null", {
|
|
45
|
+
errorCode: ErrorCodes.VALIDATION_ERROR,
|
|
46
|
+
httpStatusCode: 400
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
const originalReceiptId = identificationDetails.cheqiReceiptId;
|
|
50
|
+
if (!originalReceiptId) {
|
|
51
|
+
throw new CheqiSDKError("Original receipt ID (cheqiReceiptId) is required for credit note processing", {
|
|
52
|
+
errorCode: ErrorCodes.VALIDATION_ERROR,
|
|
53
|
+
httpStatusCode: 400
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const matchResponse = await this.matchingService.matchCustomer(identificationDetails, accessToken);
|
|
58
|
+
const recipientEmail = identificationDetails.recipientEmail;
|
|
59
|
+
if (!routeFound(matchResponse) && !recipientEmail) {
|
|
60
|
+
return CreditNoteResult.customerNotFound();
|
|
61
|
+
}
|
|
62
|
+
const templateResponse = await this.generateCreditNoteTemplate({
|
|
63
|
+
creditNoteTemplateRequest,
|
|
64
|
+
formats: uniqueFormats(matchedRecipients(matchResponse)),
|
|
65
|
+
buyerCountryCode: matchResponse.buyerCountryCode ?? "",
|
|
66
|
+
buyerType: matchResponse.buyerType ?? "CONSUMER",
|
|
67
|
+
taxesApplied: true
|
|
68
|
+
}, accessToken);
|
|
69
|
+
if (!routeFound(matchResponse)) {
|
|
70
|
+
return CreditNoteResult.customerNotFound();
|
|
71
|
+
}
|
|
72
|
+
const encryptedCreditNotes = this.buildEncryptedCreditNotes(matchResponse, templateResponse);
|
|
73
|
+
const templateContent = templateResponse.cheqi
|
|
74
|
+
? serializeJson(templateResponse.cheqi)
|
|
75
|
+
: (templateResponse.ublCreditNote ?? "");
|
|
76
|
+
const templateHash = sha256Hex(templateContent);
|
|
77
|
+
const createdResponse = await this.sendEncryptedCreditNotes(originalReceiptId, encryptedCreditNotes, templateHash, matchResponse, accessToken);
|
|
78
|
+
return CreditNoteResult.deliveredToApp(createdResponse, templateContent);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
if (error instanceof CheqiSDKError) {
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
throw new CreditNoteProcessingError(`Credit note processing failed: ${String(error.message)}`, {
|
|
85
|
+
cause: error
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
generateCreditNoteTemplate(request, accessToken = null) {
|
|
90
|
+
if (!request) {
|
|
91
|
+
throw new CheqiSDKError("Credit note template request cannot be null", {
|
|
92
|
+
errorCode: ErrorCodes.VALIDATION_ERROR,
|
|
93
|
+
httpStatusCode: 400
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return this.apiClient.generateCreditNoteTemplate(request, accessToken);
|
|
97
|
+
}
|
|
98
|
+
createEncryptedCreditNote(creditNoteEnvelope, recipient) {
|
|
99
|
+
if (!creditNoteEnvelope.trim()) {
|
|
100
|
+
throw new CheqiSDKError("Credit note envelope cannot be null or empty", {
|
|
101
|
+
errorCode: ErrorCodes.VALIDATION_ERROR,
|
|
102
|
+
httpStatusCode: 400
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
...this.encryptionService.encryptCreditNoteForRecipient(creditNoteEnvelope, recipient)
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
sendEncryptedCreditNotes(parentCheqiReceiptId, encryptedCreditNotes, templateHash, matchResponse, accessToken = null) {
|
|
110
|
+
if (encryptedCreditNotes.length === 0) {
|
|
111
|
+
throw new CheqiSDKError("Encrypted credit notes cannot be null or empty", {
|
|
112
|
+
errorCode: ErrorCodes.VALIDATION_ERROR,
|
|
113
|
+
httpStatusCode: 400
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
if (!templateHash.trim()) {
|
|
117
|
+
throw new CheqiSDKError("Template hash cannot be null or empty", {
|
|
118
|
+
errorCode: ErrorCodes.VALIDATION_ERROR,
|
|
119
|
+
httpStatusCode: 400
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
if (!routeFound(matchResponse) || !matchResponse.matchId) {
|
|
123
|
+
throw new CheqiSDKError("Cannot send credit notes: customer was not found during matching", {
|
|
124
|
+
errorCode: ErrorCodes.CUSTOMER_NOT_FOUND,
|
|
125
|
+
httpStatusCode: 400
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
return this.apiClient.sendEncryptedCreditNotes(matchResponse.matchId, parentCheqiReceiptId, encryptedCreditNotes, templateHash, accessToken);
|
|
129
|
+
}
|
|
130
|
+
decryptCreditNoteRequest(encryptedCreditNote, privateKeyBase64) {
|
|
131
|
+
if (!this.decryptionService) {
|
|
132
|
+
throw new CheqiSDKError("Decryption service is not configured", {
|
|
133
|
+
errorCode: ErrorCodes.DECRYPTION_ERROR
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return this.decryptionService.decryptCreditNote(encryptedCreditNote, privateKeyBase64);
|
|
137
|
+
}
|
|
138
|
+
decryptDeliveredCreditNote(encryptedCreditNote, privateKeyBase64) {
|
|
139
|
+
if (!this.decryptionService) {
|
|
140
|
+
throw new CheqiSDKError("Decryption service is not configured", {
|
|
141
|
+
errorCode: ErrorCodes.DECRYPTION_ERROR
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
const decrypted = this.decryptionService.decryptDeliveredCreditNote(encryptedCreditNote, privateKeyBase64);
|
|
145
|
+
return this.mergeCreditNoteContext(decrypted);
|
|
146
|
+
}
|
|
147
|
+
buildEncryptedCreditNotes(matchResponse, templateResponse) {
|
|
148
|
+
const encryptedCreditNotes = [];
|
|
149
|
+
for (const recipient of matchedRecipients(matchResponse)) {
|
|
150
|
+
const acceptedFormats = recipient.acceptedFormats ?? [];
|
|
151
|
+
const envelope = {};
|
|
152
|
+
if (acceptedFormats.includes("CHEQI") && templateResponse.cheqi) {
|
|
153
|
+
envelope.cheqiCreditNote = templateResponse.cheqi;
|
|
154
|
+
}
|
|
155
|
+
if (acceptedFormats.includes("UBL_CREDIT_NOTE") && templateResponse.ublCreditNote) {
|
|
156
|
+
envelope.ublCreditNote = templateResponse.ublCreditNote;
|
|
157
|
+
}
|
|
158
|
+
encryptedCreditNotes.push(this.createEncryptedCreditNote(serializeJson(envelope), recipient));
|
|
159
|
+
}
|
|
160
|
+
return encryptedCreditNotes;
|
|
161
|
+
}
|
|
162
|
+
mergeCreditNoteContext(decrypted) {
|
|
163
|
+
const context = decrypted.creditNoteContextEnvelope;
|
|
164
|
+
if (!context) {
|
|
165
|
+
return decrypted;
|
|
166
|
+
}
|
|
167
|
+
const creditNoteEnvelope = {
|
|
168
|
+
cheqiCreditNote: decrypted.creditNoteEnvelope.cheqiCreditNote,
|
|
169
|
+
ublCreditNote: decrypted.creditNoteEnvelope.ublCreditNote
|
|
170
|
+
};
|
|
171
|
+
this.mergeXmlParty(creditNoteEnvelope, context);
|
|
172
|
+
this.mergeXmlPaymentMeans(creditNoteEnvelope, context);
|
|
173
|
+
this.mergeReceivingParty(creditNoteEnvelope, context);
|
|
174
|
+
return {
|
|
175
|
+
...decrypted,
|
|
176
|
+
creditNoteEnvelope
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
mergeXmlParty(creditNoteEnvelope, context) {
|
|
180
|
+
const xmlReceivingParty = context.receivingParty?.xmlReceivingParty;
|
|
181
|
+
if (!xmlReceivingParty || !creditNoteEnvelope.ublCreditNote?.includes(CUSTOMER_PARTY_PLACEHOLDER)) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
creditNoteEnvelope.ublCreditNote = creditNoteEnvelope.ublCreditNote.replace(CUSTOMER_PARTY_PLACEHOLDER, xmlReceivingParty);
|
|
185
|
+
}
|
|
186
|
+
mergeXmlPaymentMeans(creditNoteEnvelope, context) {
|
|
187
|
+
const xmlPaymentMeans = context.paymentMeans?.xmlPaymentMeans;
|
|
188
|
+
const xml = creditNoteEnvelope.ublCreditNote;
|
|
189
|
+
if (!xmlPaymentMeans || !xml) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (xml.includes(CUSTOMER_PARTY_CLOSING_TAG)) {
|
|
193
|
+
creditNoteEnvelope.ublCreditNote = xml.replace(CUSTOMER_PARTY_CLOSING_TAG, CUSTOMER_PARTY_CLOSING_TAG + xmlPaymentMeans);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (xml.includes(CUSTOMER_PARTY_PLACEHOLDER)) {
|
|
197
|
+
creditNoteEnvelope.ublCreditNote = xml.replace(CUSTOMER_PARTY_PLACEHOLDER, CUSTOMER_PARTY_PLACEHOLDER + xmlPaymentMeans);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
mergeReceivingParty(creditNoteEnvelope, context) {
|
|
201
|
+
const receivingParty = context.receivingParty?.receivingParty;
|
|
202
|
+
if (!receivingParty || !creditNoteEnvelope.cheqiCreditNote) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
creditNoteEnvelope.cheqiCreditNote = {
|
|
206
|
+
...creditNoteEnvelope.cheqiCreditNote,
|
|
207
|
+
receivingParty
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=credit-note.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credit-note.js","sourceRoot":"","sources":["../../src/services/credit-note.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { DecryptedDeliveredCreditNote, EncryptedCreditNote, EncryptedCreditNoteInitiationRequest, EncryptedReceipt } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Decrypts encrypted receipts and credit-note initiation requests using
|
|
4
|
+
* the seller's RSA private key.
|
|
5
|
+
*/
|
|
6
|
+
export declare class DecryptionService {
|
|
7
|
+
/**
|
|
8
|
+
* Decrypt an encrypted receipt payload.
|
|
9
|
+
* @param encryptedReceipt The encrypted receipt from the Cheqi backend.
|
|
10
|
+
* @param privateKeyBase64 Base64-encoded PKCS#8 DER private key.
|
|
11
|
+
* @returns The decrypted receipt content and optional customer details.
|
|
12
|
+
*/
|
|
13
|
+
decryptReceipt(encryptedReceipt: EncryptedReceipt, privateKeyBase64: string): {
|
|
14
|
+
receiptContent: string;
|
|
15
|
+
customerDetails: string | null;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Decrypt an encrypted credit-note initiation request.
|
|
19
|
+
* @param encryptedCreditNote The encrypted credit-note from a webhook.
|
|
20
|
+
* @param privateKeyBase64 Base64-encoded PKCS#8 DER private key.
|
|
21
|
+
* @returns The decrypted credit-note content.
|
|
22
|
+
*/
|
|
23
|
+
decryptCreditNote(encryptedCreditNote: EncryptedCreditNoteInitiationRequest, privateKeyBase64: string): {
|
|
24
|
+
content: string;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Decrypt an encrypted delivered credit-note payload and optional credit-note context.
|
|
28
|
+
* @param encryptedCreditNote The encrypted delivered credit-note payload from the backend.
|
|
29
|
+
* @param privateKeyBase64 Base64-encoded PKCS#8 DER private key.
|
|
30
|
+
* @returns The decrypted credit-note envelope and optional context envelope.
|
|
31
|
+
*/
|
|
32
|
+
decryptDeliveredCreditNote(encryptedCreditNote: EncryptedCreditNote, privateKeyBase64: string): DecryptedDeliveredCreditNote;
|
|
33
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { constants, createDecipheriv, createPrivateKey, privateDecrypt } from "node:crypto";
|
|
2
|
+
import { AES_KEY_LENGTH, GCM_IV_LENGTH, GCM_TAG_LENGTH } from "../crypto.js";
|
|
3
|
+
import { DecryptionError } from "../errors.js";
|
|
4
|
+
import { CreditNoteContextEnvelopeFromJSON } from "../models/generated/CreditNoteContextEnvelope.js";
|
|
5
|
+
import { parseBase64Der } from "../utils.js";
|
|
6
|
+
function rsaDecrypt(encryptedKeyBase64, privateKeyBase64) {
|
|
7
|
+
if (!encryptedKeyBase64) {
|
|
8
|
+
throw new DecryptionError("Encrypted key cannot be empty");
|
|
9
|
+
}
|
|
10
|
+
if (!privateKeyBase64) {
|
|
11
|
+
throw new DecryptionError("Private key is required for decryption");
|
|
12
|
+
}
|
|
13
|
+
const privateKey = createPrivateKey({
|
|
14
|
+
key: parseBase64Der(privateKeyBase64),
|
|
15
|
+
format: "der",
|
|
16
|
+
type: "pkcs8"
|
|
17
|
+
});
|
|
18
|
+
const decryptedKey = privateDecrypt({
|
|
19
|
+
key: privateKey,
|
|
20
|
+
oaepHash: "sha256",
|
|
21
|
+
padding: constants.RSA_PKCS1_OAEP_PADDING
|
|
22
|
+
}, Buffer.from(encryptedKeyBase64, "base64"));
|
|
23
|
+
if (decryptedKey.length !== AES_KEY_LENGTH) {
|
|
24
|
+
throw new DecryptionError(`Decrypted AES key has invalid length: expected ${AES_KEY_LENGTH} bytes, got ${decryptedKey.length}`);
|
|
25
|
+
}
|
|
26
|
+
return decryptedKey;
|
|
27
|
+
}
|
|
28
|
+
function aesDecrypt(encryptedDataBase64, aesKey) {
|
|
29
|
+
if (!encryptedDataBase64) {
|
|
30
|
+
throw new DecryptionError("Encrypted data cannot be empty");
|
|
31
|
+
}
|
|
32
|
+
const combined = Buffer.from(encryptedDataBase64, "base64");
|
|
33
|
+
const minLength = GCM_IV_LENGTH + GCM_TAG_LENGTH;
|
|
34
|
+
if (combined.length < minLength) {
|
|
35
|
+
throw new DecryptionError(`Encrypted data too short: expected at least ${minLength} bytes, got ${combined.length}`);
|
|
36
|
+
}
|
|
37
|
+
const iv = combined.subarray(0, GCM_IV_LENGTH);
|
|
38
|
+
const ciphertext = combined.subarray(GCM_IV_LENGTH, combined.length - GCM_TAG_LENGTH);
|
|
39
|
+
const tag = combined.subarray(combined.length - GCM_TAG_LENGTH);
|
|
40
|
+
const decipher = createDecipheriv("aes-256-gcm", aesKey, iv);
|
|
41
|
+
decipher.setAuthTag(tag);
|
|
42
|
+
return Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString("utf8");
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Decrypts encrypted receipts and credit-note initiation requests using
|
|
46
|
+
* the seller's RSA private key.
|
|
47
|
+
*/
|
|
48
|
+
export class DecryptionService {
|
|
49
|
+
/**
|
|
50
|
+
* Decrypt an encrypted receipt payload.
|
|
51
|
+
* @param encryptedReceipt The encrypted receipt from the Cheqi backend.
|
|
52
|
+
* @param privateKeyBase64 Base64-encoded PKCS#8 DER private key.
|
|
53
|
+
* @returns The decrypted receipt content and optional customer details.
|
|
54
|
+
*/
|
|
55
|
+
decryptReceipt(encryptedReceipt, privateKeyBase64) {
|
|
56
|
+
if (!encryptedReceipt) {
|
|
57
|
+
throw new DecryptionError("Encrypted receipt cannot be null");
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const encryptedKey = encryptedReceipt.encryptedSymmetricKey ?? "";
|
|
61
|
+
const encryptedPayload = encryptedReceipt.encryptedReceipt ?? "";
|
|
62
|
+
const receiptKey = rsaDecrypt(encryptedKey, privateKeyBase64);
|
|
63
|
+
const receiptContent = aesDecrypt(encryptedPayload, receiptKey);
|
|
64
|
+
let customerDetails = null;
|
|
65
|
+
if (encryptedReceipt.encryptedCustomerDetails && encryptedReceipt.encryptedCustomerAesKey) {
|
|
66
|
+
const customerKey = rsaDecrypt(encryptedReceipt.encryptedCustomerAesKey, privateKeyBase64);
|
|
67
|
+
customerDetails = aesDecrypt(encryptedReceipt.encryptedCustomerDetails, customerKey);
|
|
68
|
+
}
|
|
69
|
+
return { receiptContent, customerDetails };
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (error instanceof DecryptionError) {
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
throw new DecryptionError(`Failed to decrypt receipt: ${String(error.message)}`, {
|
|
76
|
+
cause: error
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Decrypt an encrypted credit-note initiation request.
|
|
82
|
+
* @param encryptedCreditNote The encrypted credit-note from a webhook.
|
|
83
|
+
* @param privateKeyBase64 Base64-encoded PKCS#8 DER private key.
|
|
84
|
+
* @returns The decrypted credit-note content.
|
|
85
|
+
*/
|
|
86
|
+
decryptCreditNote(encryptedCreditNote, privateKeyBase64) {
|
|
87
|
+
if (!encryptedCreditNote) {
|
|
88
|
+
throw new DecryptionError("Encrypted credit note cannot be null");
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const encryptedKey = encryptedCreditNote.encryptedSymmetricKey ?? "";
|
|
92
|
+
const encryptedPayload = encryptedCreditNote.encryptedCreditNoteInitiationRequest ?? "";
|
|
93
|
+
const aesKey = rsaDecrypt(encryptedKey, privateKeyBase64);
|
|
94
|
+
return {
|
|
95
|
+
content: aesDecrypt(encryptedPayload, aesKey)
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (error instanceof DecryptionError) {
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
throw new DecryptionError(`Failed to decrypt credit note: ${String(error.message)}`, {
|
|
103
|
+
cause: error
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Decrypt an encrypted delivered credit-note payload and optional credit-note context.
|
|
109
|
+
* @param encryptedCreditNote The encrypted delivered credit-note payload from the backend.
|
|
110
|
+
* @param privateKeyBase64 Base64-encoded PKCS#8 DER private key.
|
|
111
|
+
* @returns The decrypted credit-note envelope and optional context envelope.
|
|
112
|
+
*/
|
|
113
|
+
decryptDeliveredCreditNote(encryptedCreditNote, privateKeyBase64) {
|
|
114
|
+
if (!encryptedCreditNote) {
|
|
115
|
+
throw new DecryptionError("Encrypted credit note cannot be null");
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
const payloadKey = rsaDecrypt(encryptedCreditNote.encryptedSymmetricKey ?? "", privateKeyBase64);
|
|
119
|
+
const rawJson = aesDecrypt(encryptedCreditNote.encryptedCreditNote ?? "", payloadKey);
|
|
120
|
+
const creditNoteEnvelope = JSON.parse(rawJson);
|
|
121
|
+
let creditNoteContextEnvelope = null;
|
|
122
|
+
let rawCreditNoteContextJson = null;
|
|
123
|
+
if (encryptedCreditNote.encryptedCustomerDetails && encryptedCreditNote.encryptedCustomerAesKey) {
|
|
124
|
+
const contextKey = rsaDecrypt(encryptedCreditNote.encryptedCustomerAesKey, privateKeyBase64);
|
|
125
|
+
rawCreditNoteContextJson = aesDecrypt(encryptedCreditNote.encryptedCustomerDetails, contextKey);
|
|
126
|
+
creditNoteContextEnvelope = CreditNoteContextEnvelopeFromJSON(JSON.parse(rawCreditNoteContextJson));
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
creditNoteEnvelope,
|
|
130
|
+
creditNoteContextEnvelope,
|
|
131
|
+
rawJson,
|
|
132
|
+
rawCreditNoteContextJson
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
if (error instanceof DecryptionError) {
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
throw new DecryptionError(`Failed to decrypt delivered credit note: ${String(error.message)}`, {
|
|
140
|
+
cause: error
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=decryption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decryption.js","sourceRoot":"","sources":["../../src/services/decryption.ts"],"names":[],"mappings":"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"}
|