Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { describe, expect, it } from 'vitest'
import { CSA_STATUS } from 'src/common/state-machine/constants/csa-status.constants'
import { ContactProfile } from '../../eligibility.types'
import { makeContact as makeBaseContact } from '../../test-helpers'
import { makeContact as makeBaseContact, makeOrder } from '../../test-helpers'
import { EligibilityContext } from '../rule.interface'
import { step2_LegalStatusCheck } from './step2-legal-status-check'

Expand Down Expand Up @@ -90,4 +91,42 @@ describe('step2_LegalStatusCheck', () => {
expect(result!.step).toBe(9)
})
})

describe('careEndDate computation', () => {
it('should compute careEndDate from orders/placements for IN_PAY contact routed to step 9', () => {
const ctx = makeCtx({
csaStatus: CSA_STATUS.IN_PAY,
enrollForCsa: 'No',
legalExpiryDate: null,
orders: [
makeOrder({
source: 'ICM',
orderStatus: 'Closed',
effectiveEndDate: new Date('2025-09-15'),
}),
],
})
const result = step2_LegalStatusCheck.evaluate(ctx)
expect(result!.step).toBe(9)
expect(result!.careEndDate).toEqual(new Date('2025-09-15'))
})

it('should compute careEndDate when legal authority is expired for IN_PAY contact', () => {
const ctx = makeCtx({
csaStatus: CSA_STATUS.IN_PAY,
enrollForCsa: 'Yes',
legalExpiryDate: new Date('2025-12-31'),
orders: [
makeOrder({
source: 'MIS',
orderStatus: 'Processed',
effectiveEndDate: new Date('2025-11-01'),
}),
],
})
const result = step2_LegalStatusCheck.evaluate(ctx)
expect(result!.step).toBe(9)
expect(result!.careEndDate).toEqual(new Date('2025-11-01'))
})
})
})
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { normalize } from 'src/common/utils'
import { determineCareEndDate } from '../../cancellation/determine-care-end-date'
import { ELIGIBILITY_CONFIG } from '../../eligibility.config'
import { EligibilityResult } from '../../eligibility.types'
import { EligibilityContext, EligibilityRule } from '../rule.interface'
Expand Down Expand Up @@ -33,10 +34,13 @@ export const step2_LegalStatusCheck: EligibilityRule = {
const normalizedEnroll = normalize(enrollForCsa)
if (normalizedEnroll === 'YES') return null
if (normalizedEnroll === 'TBD') return step8_UpdateEligibleTbd(csaStatus)
if (normalizedEnroll === 'NO')
return step9_UpdateNotEligible(csaStatus, null, null, ctx.referenceDate)
if (normalizedEnroll === 'NO') {
const careEndDate = determineCareEndDate(ctx.contact.orders, ctx.contact.placements)
return step9_UpdateNotEligible(csaStatus, null, careEndDate, ctx.referenceDate)
}
}

return step9_UpdateNotEligible(csaStatus, null, null, ctx.referenceDate)
const careEndDate = determineCareEndDate(ctx.contact.orders, ctx.contact.placements)
return step9_UpdateNotEligible(csaStatus, null, careEndDate, ctx.referenceDate)
},
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { describe, expect, it } from 'vitest'
import { CSA_STATUS } from 'src/common/state-machine/constants/csa-status.constants'
import { ContactProfile, OrderRecord } from '../../eligibility.types'
import { makeOrder as makeBaseOrder, makeContact } from '../../test-helpers'
import { EligibilityContext } from '../rule.interface'
Expand Down Expand Up @@ -230,4 +231,47 @@ describe('step6_OrderPaymentCheck', () => {
expect(result!.step).toBe(9)
})
})

describe('careEndDate computation', () => {
it('should compute careEndDate for IN_PAY contact when no previous-month orders', () => {
const ctx = makeCtx(
{
csaStatus: CSA_STATUS.IN_PAY,
orders: [
makeOrder({
effectiveStartDate: new Date('2025-12-15'),
effectiveEndDate: new Date('2025-12-31'),
orderStatus: 'Closed',
source: 'ICM',
}),
],
},
{ hasNonPlacement: false },
)
const result = step6_OrderPaymentCheck.evaluate(ctx)
expect(result!.step).toBe(9)
expect(result!.careEndDate).toEqual(new Date('2025-12-31'))
})

it('should compute careEndDate for IN_PAY contact when multiple criteria fail', () => {
const ctx = makeCtx(
{
csaStatus: CSA_STATUS.IN_PAY,
orders: [
makeOrder({
orderType: 'Invalid Type',
amount: 1000.0,
effectiveEndDate: new Date('2026-01-20'),
orderStatus: 'Closed',
source: 'ICM',
}),
],
},
{ hasNonPlacement: false },
)
const result = step6_OrderPaymentCheck.evaluate(ctx)
expect(result!.step).toBe(9)
expect(result!.careEndDate).toEqual(new Date('2026-01-20'))
})
})
})
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { normalize } from 'src/common/utils'
import { determineCareEndDate } from '../../cancellation/determine-care-end-date'
import { ELIGIBILITY_CONFIG } from '../../eligibility.config'
import { EligibilityResult } from '../../eligibility.types'
import { EligibilityContext, EligibilityRule } from '../rule.interface'
Expand Down Expand Up @@ -54,9 +55,11 @@ export const step6_OrderPaymentCheck: EligibilityRule = {
.filter((order) => isInMonth(order.effectiveStartDate, prevMonth))

if (previousMonthOrders.length === 0) {
return hasNonPlacement
? step8_UpdateEligibleTbd(csaStatus)
: step9_UpdateNotEligible(csaStatus, null, null, ctx.referenceDate)
if (hasNonPlacement) {
return step8_UpdateEligibleTbd(csaStatus)
}
const careEndDate = determineCareEndDate(ctx.contact.orders, ctx.contact.placements)
return step9_UpdateNotEligible(csaStatus, null, careEndDate, ctx.referenceDate)
}

let hasTypeStatusMatch = false
Expand All @@ -80,9 +83,11 @@ export const step6_OrderPaymentCheck: EligibilityRule = {
return step8_UpdateEligibleTbd(csaStatus)
}

return hasNonPlacement
? step8_UpdateEligibleTbd(csaStatus)
: step9_UpdateNotEligible(csaStatus, null, null, ctx.referenceDate)
if (hasNonPlacement) {
return step8_UpdateEligibleTbd(csaStatus)
}
const careEndDate = determineCareEndDate(ctx.contact.orders, ctx.contact.placements)
return step9_UpdateNotEligible(csaStatus, null, careEndDate, ctx.referenceDate)
},
}

Expand Down
Loading