diff --git a/.env.example b/.env.example index 621df0c..4ae67dc 100644 --- a/.env.example +++ b/.env.example @@ -80,3 +80,7 @@ PASSWORDLESS_FIXED_PINCODE=123456 #------------------------------------------------------------ # Automatically set advert to picked when collected #PICK_ON_COLLECT=0 + +#------------------------------------------------------------ +# Automatically set advert to un-picked when returned +#UNPICK_ON_RETURN=0 diff --git a/src/adverts/advert-mutations/claims/cancel-advert-claim.ts b/src/adverts/advert-mutations/claims/cancel-advert-claim.ts index 950a165..75978ed 100644 --- a/src/adverts/advert-mutations/claims/cancel-advert-claim.ts +++ b/src/adverts/advert-mutations/claims/cancel-advert-claim.ts @@ -16,9 +16,10 @@ export const createCancelAdvertClaim = getAdvertMeta, adverts, notifications, + workflow: { unpickOnReturn }, }: Pick< Services, - 'getAdvertMeta' | 'adverts' | 'notifications' + 'getAdvertMeta' | 'adverts' | 'notifications' | 'workflow' >): AdvertMutations['cancelAdvertClaim'] => (user, id, by, type, impersonate) => txBuilder() @@ -45,9 +46,11 @@ export const createCancelAdvertClaim = impersonate || null ) ) + const pickedAt = unpickOnReturn ? '' : advert.pickedAt return { ...advert, + pickedAt, claims: normalizeAdvertClaims( advert.claims .filter(c => !matchClaim(c)) diff --git a/src/adverts/advert-mutations/claims/convert-advert-claim.spec.ts b/src/adverts/advert-mutations/claims/convert-advert-claim.spec.ts index 0999912..d1ef784 100644 --- a/src/adverts/advert-mutations/claims/convert-advert-claim.spec.ts +++ b/src/adverts/advert-mutations/claims/convert-advert-claim.spec.ts @@ -148,6 +148,9 @@ describe('convertAdvertClaim - picking', () => { get pickOnCollect() { return true }, + get unpickOnReturn() { + return false + }, } const spy = jest.spyOn(workflow, 'pickOnCollect', 'get') diff --git a/src/adverts/advert-mutations/collecting/collect-advert.spec.ts b/src/adverts/advert-mutations/collecting/collect-advert.spec.ts index a6f7694..6912ccd 100644 --- a/src/adverts/advert-mutations/collecting/collect-advert.spec.ts +++ b/src/adverts/advert-mutations/collecting/collect-advert.spec.ts @@ -148,6 +148,9 @@ describe('collectAdvert', () => { get pickOnCollect() { return true }, + get unpickOnReturn() { + return false + }, } const spy = jest.spyOn(workflow, 'pickOnCollect', 'get') diff --git a/src/adverts/advert-mutations/collecting/return-advert.spec.ts b/src/adverts/advert-mutations/collecting/return-advert.spec.ts index 710d6f2..471357e 100644 --- a/src/adverts/advert-mutations/collecting/return-advert.spec.ts +++ b/src/adverts/advert-mutations/collecting/return-advert.spec.ts @@ -165,4 +165,69 @@ describe('returnAdvert', () => { expect(result.status).toMatchObject(TxErrors.Unauthorized) } )) + it('should set unpicked on return', () => { + const advertWasReturned = jest.fn(async () => undefined) + const advertWasReturnedOwner = jest.fn(async () => undefined) + const notifications = createTestNotificationServices({ + advertWasReturned, + advertWasReturnedOwner, + }) + const workflow = { + get pickOnCollect() { + return true + }, + get unpickOnReturn() { + return true + }, + } + const spy = jest.spyOn(workflow, 'unpickOnReturn', 'get') + + return end2endTest( + { services: { notifications, workflow } }, + async ({ mappedGqlRequest, adverts, user, loginPolicies }) => { + // give us rights to collect + await loginPolicies.updateLoginPolicies([ + { + emailPattern: user.id, + roles: ['canManageReturns'], + }, + ]) + + // eslint-disable-next-line no-param-reassign + adverts['advert-123'] = { + ...createEmptyAdvert(), + id: 'advert-123', + createdBy: 'owner@test.com', + pickedAt: '2025-01-01T00:00:00:000Z', + quantity: 5, + claims: [ + { + type: AdvertClaimType.collected, + by: 'collector@test.com', + quantity: 1, + at: new Date().toISOString(), + events: [], + }, + ], + } + + const result = await mappedGqlRequest( + 'returnAdvert', + returnAdvertMutation, + { + id: 'advert-123', + } + ) + expect(result.status).toBeNull() + + T('should be updated in database', () => + expect(adverts['advert-123'].pickedAt).toBe('') + ) + + T('should have checked configuration', () => + expect(spy).toHaveBeenCalled() + ) + } + ) + }) }) diff --git a/src/adverts/advert-mutations/collecting/return-advert.ts b/src/adverts/advert-mutations/collecting/return-advert.ts index 5cef6b0..89223a4 100644 --- a/src/adverts/advert-mutations/collecting/return-advert.ts +++ b/src/adverts/advert-mutations/collecting/return-advert.ts @@ -15,9 +15,10 @@ export const createReturnAdvert = getAdvertMeta, adverts, notifications, + workflow: { unpickOnReturn }, }: Pick< Services, - 'getAdvertMeta' | 'adverts' | 'notifications' + 'getAdvertMeta' | 'adverts' | 'notifications' | 'workflow' >): AdvertMutations['returnAdvert'] => (user, id) => txBuilder() @@ -44,8 +45,11 @@ export const createReturnAdvert = ), ]) ) + const pickedAt = unpickOnReturn ? '' : advert.pickedAt + return { ...advert, + pickedAt, claims: normalizeAdvertClaims( advert.claims.filter( ({ type }) => type !== AdvertClaimType.collected diff --git a/src/adverts/adverts.gql.schema.ts b/src/adverts/adverts.gql.schema.ts index 00bf91a..db5799d 100644 --- a/src/adverts/adverts.gql.schema.ts +++ b/src/adverts/adverts.gql.schema.ts @@ -99,6 +99,7 @@ export const advertsGqlSchema = /* GraphQL */ ` externalId tags size + place } input AdvertFieldsFilterInput { diff --git a/src/test-utils/test-app.ts b/src/test-utils/test-app.ts index 5c690a6..f93d88e 100644 --- a/src/test-utils/test-app.ts +++ b/src/test-utils/test-app.ts @@ -129,6 +129,9 @@ export const createTestServices = (services: Partial): Services => { get pickOnCollect() { return false }, + get unpickOnReturn() { + return false + }, } const getAdvertMeta = services.getAdvertMeta || createGetAdvertMeta() const settings = services.settings || createInMemorySettingsService() diff --git a/src/workflow/index.ts b/src/workflow/index.ts index 884a770..6318d61 100644 --- a/src/workflow/index.ts +++ b/src/workflow/index.ts @@ -5,4 +5,7 @@ export const createWorkflowServiceFromEnv = (): WorkflowService => ({ get pickOnCollect() { return Number(getEnv('PICK_ON_COLLECT', { fallback: '0' })) === 1 }, + get unpickOnReturn() { + return Number(getEnv('UNPICK_ON_RETURN', { fallback: '0' })) === 1 + }, }) diff --git a/src/workflow/types.ts b/src/workflow/types.ts index 6d36698..00c8015 100644 --- a/src/workflow/types.ts +++ b/src/workflow/types.ts @@ -1,3 +1,4 @@ export interface WorkflowService { pickOnCollect: boolean + unpickOnReturn: boolean }