diff --git a/.changeset/spotty-moons-clean.md b/.changeset/spotty-moons-clean.md new file mode 100644 index 0000000000..d28958eb57 --- /dev/null +++ b/.changeset/spotty-moons-clean.md @@ -0,0 +1,6 @@ +--- +"@medusajs/fulfillment": patch +"@medusajs/types": patch +--- + +feat(types,fulfillment): ability to delete a canceled fulfillment diff --git a/packages/core/types/src/fulfillment/service.ts b/packages/core/types/src/fulfillment/service.ts index 76d0671a65..316e295a84 100644 --- a/packages/core/types/src/fulfillment/service.ts +++ b/packages/core/types/src/fulfillment/service.ts @@ -2459,6 +2459,18 @@ export interface IFulfillmentModuleService extends IModuleService { sharedContext?: Context ): Promise + /** + * This method deletes fulfillment by IDs after cancelation. + * + * @param {string} id - The ID of the fulfillment. + * @param {Context} sharedContext - A context used to share resources, such as transaction manager, between the application and the module. + * @returns {Promise} Resolves when the fulfillment set is deleted successfully. + * + * @example + * await fulfillmentModuleService.deleteFulfillment("ful_123") + */ + deleteFulfillment(id: string, sharedContext?: Context): Promise + /** * This method creates a fulfillment and call the provider to create a return. * diff --git a/packages/modules/fulfillment/integration-tests/__tests__/fulfillment-module-service/fulfillment.spec.ts b/packages/modules/fulfillment/integration-tests/__tests__/fulfillment-module-service/fulfillment.spec.ts index 249023e6e9..4d8b4bdc03 100644 --- a/packages/modules/fulfillment/integration-tests/__tests__/fulfillment-module-service/fulfillment.spec.ts +++ b/packages/modules/fulfillment/integration-tests/__tests__/fulfillment-module-service/fulfillment.spec.ts @@ -1,18 +1,18 @@ -import { resolve } from "path" import { IFulfillmentModuleService, UpdateFulfillmentDTO, } from "@medusajs/framework/types" +import { FulfillmentEvents, Modules } from "@medusajs/framework/utils" import { MockEventBusService, moduleIntegrationTestRunner, } from "@medusajs/test-utils" +import { resolve } from "path" import { buildExpectedEventMessageShape, generateCreateFulfillmentData, generateCreateShippingOptionsData, } from "../../__fixtures__" -import { FulfillmentEvents, Modules } from "@medusajs/framework/utils" jest.setTimeout(100000) @@ -509,6 +509,67 @@ moduleIntegrationTestRunner({ ) }) }) + + describe("on delete", () => { + let fulfillment + + beforeEach(async () => { + const shippingProfile = await service.createShippingProfiles({ + name: "test", + type: "default", + }) + + const fulfillmentSet = await service.createFulfillmentSets({ + name: "test", + type: "test-type", + }) + + const serviceZone = await service.createServiceZones({ + name: "test", + fulfillment_set_id: fulfillmentSet.id, + }) + + const shippingOption = await service.createShippingOptions( + generateCreateShippingOptionsData({ + provider_id: providerId, + service_zone_id: serviceZone.id, + shipping_profile_id: shippingProfile.id, + }) + ) + + fulfillment = await service.createFulfillment( + generateCreateFulfillmentData({ + provider_id: providerId, + shipping_option_id: shippingOption.id, + }) + ) + + jest.clearAllMocks() + }) + + it("should delete a canceled fulfillment successfully", async () => { + await service.cancelFulfillment(fulfillment.id) + await service.deleteFulfillment(fulfillment.id) + + const retrieveError = await service + .retrieveFulfillment(fulfillment.id) + .catch((e) => e) + + expect(retrieveError.message).toEqual( + `Fulfillment with id: ${fulfillment.id} was not found` + ) + }) + + it("should fail to delete an uncanceled fulfillment", async () => { + const deleteError = await service + .deleteFulfillment(fulfillment.id) + .catch((e) => e) + + expect(deleteError.message).toEqual( + `Fulfillment with id ${fulfillment.id} needs to be canceled first before deleting` + ) + }) + }) }) }) }, diff --git a/packages/modules/fulfillment/src/services/fulfillment-module-service.ts b/packages/modules/fulfillment/src/services/fulfillment-module-service.ts index 6a8aaada8f..741db5405e 100644 --- a/packages/modules/fulfillment/src/services/fulfillment-module-service.ts +++ b/packages/modules/fulfillment/src/services/fulfillment-module-service.ts @@ -653,6 +653,28 @@ export default class FulfillmentModuleService ) } + @InjectManager() + @EmitEvents() + async deleteFulfillment( + id: string, + @MedusaContext() sharedContext: Context = {} + ): Promise { + const fulfillment = await this.fulfillmentService_.retrieve( + id, + {}, + sharedContext + ) + + if (!isPresent(fulfillment.canceled_at)) { + throw new MedusaError( + MedusaError.Types.INVALID_DATA, + `Fulfillment with id ${fulfillment.id} needs to be canceled first before deleting` + ) + } + + await this.fulfillmentService_.delete(id, sharedContext) + } + @InjectManager() @EmitEvents() async createReturnFulfillment(