diff --git a/apps/taxes/graphql/subscriptions/OrderConfirmed.graphql b/apps/taxes/graphql/subscriptions/OrderConfirmed.graphql index c0d7eb6..d94a458 100644 --- a/apps/taxes/graphql/subscriptions/OrderConfirmed.graphql +++ b/apps/taxes/graphql/subscriptions/OrderConfirmed.graphql @@ -66,6 +66,7 @@ fragment OrderConfirmedSubscription on Order { } avataxEntityCode: metafield(key: "avataxEntityCode") avataxTaxCalculationDate: metafield(key: "avataxTaxCalculationDate") + avataxDocumentCode: metafield(key: "avataxDocumentCode") } fragment OrderConfirmedEventSubscription on Event { __typename diff --git a/apps/taxes/src/modules/avatax/order-confirmed/avatax-order-confirmed-document-code-resolver.test.ts b/apps/taxes/src/modules/avatax/order-confirmed/avatax-order-confirmed-document-code-resolver.test.ts new file mode 100644 index 0000000..6fa1db7 --- /dev/null +++ b/apps/taxes/src/modules/avatax/order-confirmed/avatax-order-confirmed-document-code-resolver.test.ts @@ -0,0 +1,23 @@ +import { OrderConfirmedSubscriptionFragment } from "../../../../generated/graphql"; +import { AvataxOrderConfirmedDocumentCodeResolver } from "./avatax-order-confirmed-document-code-resolver"; +import { expect, describe, it } from "vitest"; + +const resolver = new AvataxOrderConfirmedDocumentCodeResolver(); + +describe("AvataxOrderConfirmedDocumentCodeResolver", () => { + it("returns document code when provided in metadata", () => { + expect( + resolver.resolve({ + id: "id", + avataxDocumentCode: "123", + } as unknown as OrderConfirmedSubscriptionFragment) + ).toBe("123"); + }); + it("returns order id when document code is not provided in metadata", () => { + expect( + resolver.resolve({ + id: "id", + } as unknown as OrderConfirmedSubscriptionFragment) + ).toBe("id"); + }); +}); diff --git a/apps/taxes/src/modules/avatax/order-confirmed/avatax-order-confirmed-document-code-resolver.ts b/apps/taxes/src/modules/avatax/order-confirmed/avatax-order-confirmed-document-code-resolver.ts new file mode 100644 index 0000000..5da5b4c --- /dev/null +++ b/apps/taxes/src/modules/avatax/order-confirmed/avatax-order-confirmed-document-code-resolver.ts @@ -0,0 +1,11 @@ +import { OrderConfirmedSubscriptionFragment } from "../../../../generated/graphql"; + +export class AvataxOrderConfirmedDocumentCodeResolver { + resolve(order: OrderConfirmedSubscriptionFragment): string { + /* + * The value for "code" can be provided in the metadata. + * Read more: https://developer.avalara.com/erp-integration-guide/sales-tax-badge/transactions/cert-document-codes/ + */ + return order.avataxDocumentCode ?? order.id; + } +} diff --git a/apps/taxes/src/modules/avatax/order-confirmed/avatax-order-confirmed-payload-transformer.ts b/apps/taxes/src/modules/avatax/order-confirmed/avatax-order-confirmed-payload-transformer.ts index fac7f82..9229414 100644 --- a/apps/taxes/src/modules/avatax/order-confirmed/avatax-order-confirmed-payload-transformer.ts +++ b/apps/taxes/src/modules/avatax/order-confirmed/avatax-order-confirmed-payload-transformer.ts @@ -8,6 +8,7 @@ import { AvataxTaxCodeMatches } from "../tax-code/avatax-tax-code-match-reposito import { AvataxOrderConfirmedPayloadLinesTransformer } from "./avatax-order-confirmed-payload-lines-transformer"; import { AvataxEntityTypeMatcher } from "../avatax-entity-type-matcher"; import { AvataxOrderConfirmedCalculationDateResolver } from "./avatax-order-confirmed-calculation-date-resolver"; +import { AvataxOrderConfirmedDocumentCodeResolver } from "./avatax-order-confirmed-document-code-resolver"; export const SHIPPING_ITEM_CODE = "Shipping"; @@ -31,12 +32,15 @@ export class AvataxOrderConfirmedPayloadTransformer { const linesTransformer = new AvataxOrderConfirmedPayloadLinesTransformer(); const dateResolver = new AvataxOrderConfirmedCalculationDateResolver(); const entityTypeMatcher = new AvataxEntityTypeMatcher({ client: avataxClient }); + const documentCodeResolver = new AvataxOrderConfirmedDocumentCodeResolver(); const entityUseCode = await entityTypeMatcher.match(order.avataxEntityCode); const date = dateResolver.resolve(order); + const code = documentCodeResolver.resolve(order); return { model: { + code, type: this.matchDocumentType(avataxConfig), entityUseCode, customerCode: