diff --git a/.changeset/tiny-trains-film.md b/.changeset/tiny-trains-film.md new file mode 100644 index 000000000..812ef31b0 --- /dev/null +++ b/.changeset/tiny-trains-film.md @@ -0,0 +1,5 @@ +--- +"app-avatax": patch +--- + +Added TransactionAlreadyCancelled support for AvaTax app while canceling Saleor order. diff --git a/apps/avatax/src/modules/avatax/avatax-errors-parser.ts b/apps/avatax/src/modules/avatax/avatax-errors-parser.ts index 52e7c297d..907c3651d 100644 --- a/apps/avatax/src/modules/avatax/avatax-errors-parser.ts +++ b/apps/avatax/src/modules/avatax/avatax-errors-parser.ts @@ -8,6 +8,7 @@ import { AvataxInvalidAddressError, AvataxInvalidCredentialsError, AvataxStringLengthError, + AvataxTransactionAlreadyCancelledError, } from "../taxes/tax-error"; import { assertUnreachableWithoutThrow } from "../utils/assert-unreachable"; import { normalizeAvaTaxError } from "./avatax-error-normalizer"; @@ -23,6 +24,7 @@ export class AvataxErrorsParser { "AuthenticationException", "StringLengthError", "EntityNotFoundError", + "TransactionAlreadyCancelled", ]), details: z.array( z.object({ @@ -74,6 +76,13 @@ export class AvataxErrorsParser { }, }); } + case "TransactionAlreadyCancelled": { + return new AvataxTransactionAlreadyCancelledError(parsedError.data.code, { + props: { + description: parsedError.data.details[0].description, + }, + }); + } default: { assertUnreachableWithoutThrow(parsedError.data.code); return normalizeAvaTaxError(err); diff --git a/apps/avatax/src/modules/taxes/tax-error.ts b/apps/avatax/src/modules/taxes/tax-error.ts index eb6116678..88dfbe878 100644 --- a/apps/avatax/src/modules/taxes/tax-error.ts +++ b/apps/avatax/src/modules/taxes/tax-error.ts @@ -44,3 +44,12 @@ export const AvataxEntityNotFoundError = ExpectedError.subclass("AvataxEntityNot description: "", }, }); + +export const AvataxTransactionAlreadyCancelledError = ExpectedError.subclass( + "AvataxTransactionAlreadyCancelledError", + { + props: { + description: "", + }, + }, +); diff --git a/apps/avatax/src/pages/api/webhooks/order-cancelled.ts b/apps/avatax/src/pages/api/webhooks/order-cancelled.ts index ce7f83dce..e419409f7 100644 --- a/apps/avatax/src/pages/api/webhooks/order-cancelled.ts +++ b/apps/avatax/src/pages/api/webhooks/order-cancelled.ts @@ -7,6 +7,7 @@ import { captureException } from "@sentry/nextjs"; import { AvataxOrderCancelledAdapter } from "@/modules/avatax/order-cancelled/avatax-order-cancelled-adapter"; import { ClientLogStoreRequest } from "@/modules/client-logs/client-log"; import { LogWriterFactory } from "@/modules/client-logs/log-writer-factory"; +import { AvataxTransactionAlreadyCancelledError } from "@/modules/taxes/tax-error"; import { AppConfigExtractor } from "../../../lib/app-config-extractor"; import { AppConfigurationLogger } from "../../../lib/app-configuration-logger"; @@ -228,6 +229,16 @@ export default wrapWithLoggerContext( }); } + if (e instanceof AvataxTransactionAlreadyCancelledError) { + logger.warn("Transaction was already cancelled in AvaTax. Responding 200", { + error: e, + }); + + return res.status(200).send({ + message: "Transaction was already cancelled in AvaTax", + }); + } + ClientLogStoreRequest.create({ level: "error", message: "Failed to void order. AvaTax returned error.",