Skip to content

Commit 8d5d1f1

Browse files
committedNov 7, 2024
Generate replacement invoices
- Add statuses for replacement invoices: `REPLACEMENT_DRAFT`, `REPLACED` - Remove the `CANCELED` invoice status that's never used - Add `revision_number` and `replaced_invoice_id` columns - Add a scheduled job to generate all replacement invoices for the past 12 months
1 parent 64fd81e commit 8d5d1f1

File tree

21 files changed

+512
-76
lines changed

21 files changed

+512
-76
lines changed
 

‎frontend/src/e2e-test/dev-api/fixtures.ts

+2
Original file line numberDiff line numberDiff line change
@@ -3045,6 +3045,8 @@ export const invoiceFixture = (
30453045
sentAt: null,
30463046
sentBy: null,
30473047
createdAt: null,
3048+
replacedInvoiceId: null,
3049+
revisionNumber: 0,
30483050
rows: [
30493051
{
30503052
id: uuidv4(),

‎frontend/src/e2e-test/generated/api-types.ts

+2
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,8 @@ export interface DevInvoice {
648648
number: number | null
649649
periodEnd: LocalDate
650650
periodStart: LocalDate
651+
replacedInvoiceId: UUID | null
652+
revisionNumber: number
651653
rows: DevInvoiceRow[]
652654
sentAt: HelsinkiDateTime | null
653655
sentBy: UUID | null

‎frontend/src/lib-common/generated/api-types/invoicing.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,8 @@ export interface InvoiceDetailed {
569569
periodEnd: LocalDate
570570
periodStart: LocalDate
571571
relatedFeeDecisions: RelatedFeeDecision[]
572+
replacedInvoiceId: UUID | null
573+
revisionNumber: number
572574
rows: InvoiceRowDetailed[]
573575
sentAt: HelsinkiDateTime | null
574576
sentBy: UUID | null
@@ -644,7 +646,8 @@ export type InvoiceStatus =
644646
| 'DRAFT'
645647
| 'WAITING_FOR_SENDING'
646648
| 'SENT'
647-
| 'CANCELED'
649+
| 'REPLACEMENT_DRAFT'
650+
| 'REPLACED'
648651

649652
/**
650653
* Generated from fi.espoo.evaka.invoicing.domain.InvoiceSummary
@@ -656,6 +659,7 @@ export interface InvoiceSummary {
656659
id: UUID
657660
periodEnd: LocalDate
658661
periodStart: LocalDate
662+
revisionNumber: number
659663
sentAt: HelsinkiDateTime | null
660664
sentBy: UUID | null
661665
status: InvoiceStatus

‎frontend/src/lib-customizations/defaults/employee/i18n/fi.tsx

+4-2
Original file line numberDiff line numberDiff line change
@@ -2718,13 +2718,15 @@ export const fi = {
27182718
DRAFT: 'Luonnos',
27192719
WAITING_FOR_SENDING: 'Siirretään manuaalisesti',
27202720
SENT: 'Siirretty',
2721-
CANCELED: 'Peruutettu'
2721+
REPLACEMENT_DRAFT: 'Oikaisuluonnos',
2722+
REPLACED: 'Oikaistu'
27222723
},
27232724
title: {
27242725
DRAFT: 'Laskuluonnos',
27252726
WAITING_FOR_SENDING: 'Siirtoa odottava lasku',
27262727
SENT: 'Siirretty lasku',
2727-
CANCELED: 'Peruutettu lasku'
2728+
REPLACEMENT_DRAFT: 'Oikaisulaskuluonnos',
2729+
REPLACED: 'Oikaistu lasku'
27282730
},
27292731
form: {
27302732
nav: {

‎service/src/integrationTest/kotlin/fi/espoo/evaka/invoicing/InvoiceIntegrationTest.kt

+7-31
Original file line numberDiff line numberDiff line change
@@ -218,49 +218,22 @@ class InvoiceIntegrationTest : FullApplicationTest(resetDbBeforeEach = true) {
218218
assertEqualEnough(sent.map(::toSummary), result)
219219
}
220220

221-
@Test
222-
fun `search works with canceled status parameter`() {
223-
db.transaction { tx -> tx.insert(testInvoices) }
224-
val canceled = testInvoices.filter { it.status == InvoiceStatus.CANCELED }
225-
226-
val result =
227-
searchInvoices(SearchInvoicesRequest(page = 1, status = listOf(InvoiceStatus.CANCELED)))
228-
229-
assertEqualEnough(canceled.map(::toSummary), result)
230-
}
231-
232221
@Test
233222
fun `search works with multiple status parameters`() {
234223
db.transaction { tx -> tx.insert(testInvoices) }
235-
val sentAndCanceled =
224+
val sentAndDraft =
236225
testInvoices.filter {
237-
it.status == InvoiceStatus.SENT || it.status == InvoiceStatus.CANCELED
226+
it.status == InvoiceStatus.SENT || it.status == InvoiceStatus.DRAFT
238227
}
239228

240229
val result =
241230
searchInvoices(
242231
SearchInvoicesRequest(
243232
page = 1,
244-
status = listOf(InvoiceStatus.SENT, InvoiceStatus.CANCELED),
245-
)
246-
)
247-
assertEqualEnough(sentAndCanceled.map(::toSummary), result)
248-
}
249-
250-
@Test
251-
fun `search works with all status parameters`() {
252-
val testInvoiceSubset = testInvoices.take(2)
253-
db.transaction { tx -> tx.insert(testInvoiceSubset) }
254-
val invoices = testInvoiceSubset.sortedBy { it.status }.reversed()
255-
256-
val result =
257-
searchInvoices(
258-
SearchInvoicesRequest(
259-
page = 1,
260-
status = listOf(InvoiceStatus.DRAFT, InvoiceStatus.SENT, InvoiceStatus.CANCELED),
233+
status = listOf(InvoiceStatus.SENT, InvoiceStatus.DRAFT),
261234
)
262235
)
263-
assertEqualEnough(invoices.map(::toSummary), result)
236+
assertEqualEnough(sentAndDraft.map(::toSummary), result)
264237
}
265238

266239
@Test
@@ -803,6 +776,8 @@ class InvoiceIntegrationTest : FullApplicationTest(resetDbBeforeEach = true) {
803776
InvoiceDetailed(
804777
id = invoice.id,
805778
status = invoice.status,
779+
revisionNumber = invoice.revisionNumber,
780+
replacedInvoiceId = invoice.replacedInvoiceId,
806781
periodStart = invoice.periodStart,
807782
periodEnd = invoice.periodEnd,
808783
dueDate = invoice.dueDate,
@@ -850,6 +825,7 @@ class InvoiceIntegrationTest : FullApplicationTest(resetDbBeforeEach = true) {
850825
InvoiceSummary(
851826
id = invoice.id,
852827
status = invoice.status,
828+
revisionNumber = invoice.revisionNumber,
853829
periodStart = invoice.periodStart,
854830
periodEnd = invoice.periodEnd,
855831
headOfFamily = allAdults.find { it.id == invoice.headOfFamilyId }!!.toPersonDetailed(),

‎service/src/integrationTest/kotlin/fi/espoo/evaka/invoicing/data/InvoiceQueriesTest.kt

-11
Original file line numberDiff line numberDiff line change
@@ -80,17 +80,6 @@ class InvoiceQueriesTest : PureJdbiTest(resetDbBeforeEach = true) {
8080
}
8181
}
8282

83-
@Test
84-
fun `search canceled`() {
85-
db.transaction { tx ->
86-
tx.insert(testInvoices)
87-
88-
val result = tx.searchInvoices(InvoiceStatus.CANCELED)
89-
assertEquals(0, result.size)
90-
}
91-
}
92-
93-
@Test
9483
fun `search sent`() {
9584
db.transaction { tx ->
9685
tx.insert(testInvoices)

‎service/src/integrationTest/kotlin/fi/espoo/evaka/invoicing/service/InvoiceCorrectionsIntegrationTest.kt

+5-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import fi.espoo.evaka.TestInvoiceProductProvider
99
import fi.espoo.evaka.invoicing.data.insertDraftInvoices
1010
import fi.espoo.evaka.invoicing.domain.DraftInvoice
1111
import fi.espoo.evaka.invoicing.domain.DraftInvoiceRow
12+
import fi.espoo.evaka.invoicing.domain.InvoiceStatus
1213
import fi.espoo.evaka.invoicing.integration.InvoiceIntegrationClient
1314
import fi.espoo.evaka.placement.PlacementType
1415
import fi.espoo.evaka.shared.FeatureConfig
@@ -415,7 +416,9 @@ class InvoiceCorrectionsIntegrationTest : PureJdbiTest(resetDbBeforeEach = true)
415416
month: YearMonth,
416417
): List<DraftInvoice> =
417418
db.read { tx ->
418-
generator.applyCorrections(tx, invoices, month, mapOf(daycare.id to area.id)).shuffled()
419+
generator
420+
.applyUnappliedCorrections(tx, month, invoices, mapOf(daycare.id to area.id))
421+
.shuffled()
419422
}
420423

421424
private fun createTestInvoice(total: Int, month: YearMonth): DraftInvoice =
@@ -441,7 +444,7 @@ class InvoiceCorrectionsIntegrationTest : PureJdbiTest(resetDbBeforeEach = true)
441444

442445
private fun insertAndSendInvoice(invoice: DraftInvoice) {
443446
db.transaction { tx ->
444-
val invoiceId = tx.insertDraftInvoices(listOf(invoice)).single()
447+
val invoiceId = tx.insertDraftInvoices(listOf(invoice), InvoiceStatus.DRAFT).single()
445448
invoiceService.sendInvoices(
446449
tx,
447450
employee.evakaUserId,

0 commit comments

Comments
 (0)