Skip to content

Commit b6c1d9f

Browse files
authored
Merge pull request #6475 from espoon-voltti/income-notifications-invoiced-by-municipality
Lähetetään tulotietomuistutukset vain laskutetaan eVakasta -yksiköiden asiakkaille
2 parents e0f7736 + baa01a3 commit b6c1d9f

File tree

2 files changed

+57
-38
lines changed

2 files changed

+57
-38
lines changed

service/src/integrationTest/kotlin/fi/espoo/evaka/invoicing/service/OutdatedIncomeNotificationsIntegrationTest.kt

+55-38
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,12 @@ import fi.espoo.evaka.serviceneed.ShiftCareType
2121
import fi.espoo.evaka.serviceneed.insertServiceNeed
2222
import fi.espoo.evaka.shared.ChildId
2323
import fi.espoo.evaka.shared.DaycareId
24-
import fi.espoo.evaka.shared.EmployeeId
25-
import fi.espoo.evaka.shared.EvakaUserId
2624
import fi.espoo.evaka.shared.IncomeStatementId
2725
import fi.espoo.evaka.shared.PartnershipId
2826
import fi.espoo.evaka.shared.PersonId
2927
import fi.espoo.evaka.shared.async.AsyncJob
3028
import fi.espoo.evaka.shared.async.AsyncJobRunner
31-
import fi.espoo.evaka.shared.auth.UserRole
29+
import fi.espoo.evaka.shared.auth.AuthenticatedUser
3230
import fi.espoo.evaka.shared.dev.DevCareArea
3331
import fi.espoo.evaka.shared.dev.DevDaycare
3432
import fi.espoo.evaka.shared.dev.DevEmployee
@@ -45,7 +43,6 @@ import fi.espoo.evaka.shared.domain.DateRange
4543
import fi.espoo.evaka.shared.domain.HelsinkiDateTime
4644
import fi.espoo.evaka.shared.domain.MockEvakaClock
4745
import fi.espoo.evaka.shared.job.ScheduledJobs
48-
import fi.espoo.evaka.shared.security.upsertEmployeeUser
4946
import fi.espoo.evaka.snDaycareContractDays15
5047
import java.math.BigDecimal
5148
import java.time.LocalDate
@@ -82,8 +79,6 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
8279
private val fridgeHeadOfChildEmail = "fridge_hoc@example.com"
8380
private lateinit var fridgeHeadOfChildId: PersonId
8481
private lateinit var childId: ChildId
85-
private lateinit var employeeId: EmployeeId
86-
private lateinit var employeeEvakaUserId: EvakaUserId
8782
private lateinit var daycareId: DaycareId
8883

8984
@BeforeEach
@@ -126,9 +121,6 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
126121
confirmedBy = null,
127122
confirmedAt = null,
128123
)
129-
employeeId = tx.insert(DevEmployee(roles = setOf(UserRole.SERVICE_WORKER)))
130-
tx.upsertEmployeeUser(employeeId)
131-
employeeEvakaUserId = EvakaUserId(employeeId.raw)
132124
}
133125
}
134126

@@ -140,7 +132,7 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
140132
it.insert(
141133
DevIncome(
142134
personId = fridgeHeadOfChildId,
143-
modifiedBy = employeeEvakaUserId,
135+
modifiedBy = AuthenticatedUser.SystemInternalUser.evakaUserId,
144136
validFrom = clock.today().minusMonths(1),
145137
validTo = clock.today(),
146138
)
@@ -149,7 +141,7 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
149141
it.insert(
150142
DevIncome(
151143
personId = fridgeHeadOfChildId,
152-
modifiedBy = employeeEvakaUserId,
144+
modifiedBy = AuthenticatedUser.SystemInternalUser.evakaUserId,
153145
validFrom = clock.today().plusDays(1),
154146
validTo = clock.today().plusMonths(6),
155147
)
@@ -165,7 +157,7 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
165157
it.insert(
166158
DevIncome(
167159
personId = fridgeHeadOfChildId,
168-
modifiedBy = employeeEvakaUserId,
160+
modifiedBy = AuthenticatedUser.SystemInternalUser.evakaUserId,
169161
validFrom = clock.today().minusMonths(1),
170162
validTo = clock.today().plusWeeks(4),
171163
)
@@ -180,18 +172,40 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
180172
)
181173
}
182174

183-
private lateinit var fridgePartnerId: PersonId
175+
@Test
176+
fun `notification is not sent if placement unit is not invoiced by municipality`() {
177+
db.transaction {
178+
it.execute {
179+
sql(
180+
"UPDATE daycare SET invoiced_by_municipality = false WHERE id = ${bind(daycareId)}"
181+
)
182+
}
183+
184+
it.insert(
185+
DevIncome(
186+
personId = fridgeHeadOfChildId,
187+
modifiedBy = AuthenticatedUser.SystemInternalUser.evakaUserId,
188+
validFrom = clock.today().minusMonths(1),
189+
validTo = clock.today().plusWeeks(4),
190+
)
191+
)
192+
}
193+
194+
assertEquals(0, getEmails().size)
195+
assertEquals(0, getIncomeNotifications(fridgeHeadOfChildId).size)
196+
}
184197

185198
@Test
186199
fun `fridge partner expiring income is notified 4 weeks beforehand`() {
200+
val fridgePartner = DevPerson(email = "partner@example.com")
201+
187202
db.transaction {
188-
fridgePartnerId =
189-
it.insert(DevPerson(email = "partner@example.com"), DevPersonType.ADULT)
203+
it.insert(fridgePartner, DevPersonType.ADULT)
190204

191205
it.insert(
192206
DevIncome(
193-
personId = fridgePartnerId,
194-
modifiedBy = employeeEvakaUserId,
207+
personId = fridgePartner.id,
208+
modifiedBy = AuthenticatedUser.SystemInternalUser.evakaUserId,
195209
validFrom = clock.today().minusMonths(1),
196210
validTo = clock.today().plusWeeks(4),
197211
)
@@ -214,7 +228,7 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
214228
partnershipId,
215229
2,
216230
1,
217-
fridgePartnerId,
231+
fridgePartner.id,
218232
clock.today(),
219233
clock.today(),
220234
clock.now(),
@@ -224,23 +238,23 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
224238

225239
assertEquals(1, getEmails().size)
226240
assertEquals(0, getIncomeNotifications(fridgeHeadOfChildId).size)
227-
assertEquals(1, getIncomeNotifications(fridgePartnerId).size)
241+
assertEquals(1, getIncomeNotifications(fridgePartner.id).size)
228242
assertEquals(
229243
IncomeNotificationType.INITIAL_EMAIL,
230-
getIncomeNotifications(fridgePartnerId)[0].notificationType,
244+
getIncomeNotifications(fridgePartner.id)[0].notificationType,
231245
)
232246
}
233247

234248
@Test
235249
fun `fridge partner with partnership end date as null and expiring income is notified 4 weeks beforehand`() {
250+
val fridgePartner = DevPerson(email = "partner@example.com")
236251
db.transaction {
237-
fridgePartnerId =
238-
it.insert(DevPerson(email = "partner@example.com"), DevPersonType.ADULT)
252+
it.insert(fridgePartner, DevPersonType.ADULT)
239253

240254
it.insert(
241255
DevIncome(
242-
personId = fridgePartnerId,
243-
modifiedBy = employeeEvakaUserId,
256+
personId = fridgePartner.id,
257+
modifiedBy = AuthenticatedUser.SystemInternalUser.evakaUserId,
244258
validFrom = clock.today().minusMonths(1),
245259
validTo = clock.today().plusWeeks(4),
246260
)
@@ -263,7 +277,7 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
263277
partnershipId,
264278
2,
265279
1,
266-
fridgePartnerId,
280+
fridgePartner.id,
267281
clock.today(),
268282
null,
269283
clock.now(),
@@ -273,10 +287,10 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
273287

274288
assertEquals(1, getEmails().size)
275289
assertEquals(0, getIncomeNotifications(fridgeHeadOfChildId).size)
276-
assertEquals(1, getIncomeNotifications(fridgePartnerId).size)
290+
assertEquals(1, getIncomeNotifications(fridgePartner.id).size)
277291
assertEquals(
278292
IncomeNotificationType.INITIAL_EMAIL,
279-
getIncomeNotifications(fridgePartnerId)[0].notificationType,
293+
getIncomeNotifications(fridgePartner.id)[0].notificationType,
280294
)
281295
}
282296

@@ -286,7 +300,7 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
286300
it.insert(
287301
DevIncome(
288302
personId = fridgeHeadOfChildId,
289-
modifiedBy = employeeEvakaUserId,
303+
modifiedBy = AuthenticatedUser.SystemInternalUser.evakaUserId,
290304
validFrom = clock.today().minusMonths(1),
291305
validTo = clock.today().minusDays(2),
292306
)
@@ -304,7 +318,7 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
304318
it.insert(
305319
DevIncome(
306320
personId = fridgeHeadOfChildId,
307-
modifiedBy = employeeEvakaUserId,
321+
modifiedBy = AuthenticatedUser.SystemInternalUser.evakaUserId,
308322
validFrom = incomeExpirationDate.minusMonths(1),
309323
validTo = incomeExpirationDate,
310324
)
@@ -326,12 +340,15 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
326340
@Test
327341
fun `expiring income is notified if there is a handled income statement reaching after expiration`() {
328342
val incomeExpirationDate = clock.today().plusWeeks(4)
343+
val employee = DevEmployee()
329344

330345
db.transaction {
346+
it.insert(employee)
347+
331348
it.insert(
332349
DevIncome(
333350
personId = fridgeHeadOfChildId,
334-
modifiedBy = employeeEvakaUserId,
351+
modifiedBy = AuthenticatedUser.SystemInternalUser.evakaUserId,
335352
validFrom = incomeExpirationDate.minusMonths(1),
336353
validTo = incomeExpirationDate,
337354
)
@@ -343,7 +360,7 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
343360
personId = fridgeHeadOfChildId,
344361
data = createGrossIncome(incomeExpirationDate.plusDays(1)),
345362
status = IncomeStatementStatus.HANDLED,
346-
handlerId = employeeId,
363+
handlerId = employee.id,
347364
handledAt = clock.now(),
348365
)
349366
)
@@ -360,7 +377,7 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
360377
it.insert(
361378
DevIncome(
362379
personId = fridgeHeadOfChildId,
363-
modifiedBy = employeeEvakaUserId,
380+
modifiedBy = AuthenticatedUser.SystemInternalUser.evakaUserId,
364381
validFrom = incomeExpirationDate.minusMonths(1),
365382
validTo = incomeExpirationDate,
366383
)
@@ -386,7 +403,7 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
386403
it.insert(
387404
DevIncome(
388405
personId = fridgeHeadOfChildId,
389-
modifiedBy = employeeEvakaUserId,
406+
modifiedBy = AuthenticatedUser.SystemInternalUser.evakaUserId,
390407
validFrom = clock.today().minusMonths(1),
391408
validTo = expirationDate,
392409
)
@@ -423,7 +440,7 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
423440
it.insert(
424441
DevIncome(
425442
personId = fridgeHeadOfChildId,
426-
modifiedBy = employeeEvakaUserId,
443+
modifiedBy = AuthenticatedUser.SystemInternalUser.evakaUserId,
427444
validFrom = clock.today().minusMonths(1),
428445
validTo = clock.today().plusDays(13),
429446
)
@@ -445,7 +462,7 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
445462
it.insert(
446463
DevIncome(
447464
personId = fridgeHeadOfChildId,
448-
modifiedBy = employeeEvakaUserId,
465+
modifiedBy = AuthenticatedUser.SystemInternalUser.evakaUserId,
449466
validFrom = clock.today().minusMonths(1),
450467
validTo = clock.today().plusWeeks(4),
451468
)
@@ -486,7 +503,7 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
486503
it.insert(
487504
DevIncome(
488505
personId = fridgeHeadOfChildId,
489-
modifiedBy = employeeEvakaUserId,
506+
modifiedBy = AuthenticatedUser.SystemInternalUser.evakaUserId,
490507
validFrom = clock.today().minusMonths(1),
491508
validTo = clock.today().plusDays(6),
492509
)
@@ -537,7 +554,7 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
537554
it.insert(
538555
DevIncome(
539556
personId = fridgeHeadOfChildId,
540-
modifiedBy = employeeEvakaUserId,
557+
modifiedBy = AuthenticatedUser.SystemInternalUser.evakaUserId,
541558
validFrom = expirationDay.minusMonths(1),
542559
validTo = expirationDay,
543560
effect = IncomeEffect.INCOME,
@@ -666,7 +683,7 @@ class OutdatedIncomeNotificationsIntegrationTest : FullApplicationTest(resetDbBe
666683
tx.insert(
667684
DevIncome(
668685
personId = fridgeHeadOfChildId,
669-
modifiedBy = employeeEvakaUserId,
686+
modifiedBy = AuthenticatedUser.SystemInternalUser.evakaUserId,
670687
validFrom = clock.today().minusMonths(1),
671688
validTo = clock.today().plusWeeks(4),
672689
)

service/src/main/kotlin/fi/espoo/evaka/invoicing/service/IncomeQueries.kt

+2
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ WITH latest_income AS (
5858
FROM placement pl
5959
JOIN service_need sn ON pl.id = sn.placement_id AND daterange(sn.start_date, sn.end_date, '[]') @> ${bind(dayAfterExpiration)}
6060
JOIN service_need_option sno ON sn.option_id = sno.id AND sno.fee_coefficient > 0
61+
JOIN daycare u ON u.id = pl.unit_id
6162
6263
-- head of child
6364
JOIN fridge_child fc_head ON (
@@ -75,6 +76,7 @@ WITH latest_income AS (
7576
JOIN latest_income i ON i.person_id = fc_head.head_of_child OR i.person_id = fp_spouse.person_id
7677
WHERE between_start_and_end(${bind(checkForExpirationRange.asDateRange())}, i.valid_to)
7778
AND (i.valid_to + INTERVAL '1 day')::date BETWEEN pl.start_date AND pl.end_date
79+
AND u.invoiced_by_municipality
7880
)
7981
SELECT person_id, valid_to AS expiration_date
8082
FROM expiring_income_with_billable_placement_day_after_expiration expiring_income

0 commit comments

Comments
 (0)