fix(finance): retain trip receipts after partial and full payment

This commit is contained in:
2026-10-05 12:22:18 +08:00
parent 8ac2400043
commit f13d340620
3 changed files with 32 additions and 3 deletions
@@ -35,17 +35,46 @@ class TripFinanceQueryServiceTest {
assertThat(result.totals().get(0).receivableAmount()).isEqualByComparingTo("20");
assertThat(result.documents().get(0).allocationStatus()).isEqualTo("ATTRIBUTED");
}
@Test void issuedPartialAndPaidBillsKeepTheirConfirmedAllocation() {
for(String status:List.of("ISSUED","PARTIALLY_PAID","PAID")) {
setup();fee(1,1,"DL-A",1,"CNY","20","AVAILABLE");bill(1,1);
String amount="PAID".equals(status)?"20":"3.5";receipt(amount);
jdbc.update("UPDATE fin_bill SET status=?",status);
var result=service.query(request(true));
assertThat(result.documents()).as(status).hasSize(1);
assertThat(result.documents().get(0).allocationStatus()).isEqualTo("ATTRIBUTED");
assertThat(result.totals().get(0).receivedAmount()).as(status).isEqualByComparingTo(amount);
}
}
@Test void draftPendingApprovedAndVoidedBillsNeverContributeReceipts() {
for(String status:List.of("DRAFT","PENDING_REVIEW","APPROVED","VOIDED")) {
setup();fee(1,1,"DL-A",1,"CNY","20","AVAILABLE");bill(1,1);receipt("3.5");
jdbc.update("UPDATE fin_bill SET status=?",status);
var result=service.query(request(true));assertThat(result.documents()).as(status).isEmpty();
assertThat(result.totals().get(0).receivedAmount()).isNull();
}
}
@Test void paidBillStillEnforcesCustomerVersionAndCurrencyAttribution() {
for(String change:List.of("source_version=2","tenant_id=2","currency_code='USD'")) {
setup();fee(1,1,"DL-A",1,"CNY","20","AVAILABLE");bill(1,1);receipt("20");
jdbc.update("UPDATE fin_bill SET status='PAID'");jdbc.update("UPDATE fin_bill_line SET "+change);
assertThat(service.query(request(true)).totals().get(0).receivedAmount()).as(change).isNull();
}
}
@Test void mixedBillNeverProratesReceipt() {
fee(1,1,"DL-A",1,"CNY","20","AVAILABLE");bill(1,1);receipt("30");
jdbc.update("INSERT INTO fin_bill_line VALUES(1,1,999,1,'CNY')");
jdbc.update("UPDATE fin_bill SET status='PAID'");
var result=service.query(request(true));assertThat(result.totals().get(0).receivedAmount()).isNull();
assertThat(result.documents()).hasSize(1);
assertThat(result.documents().get(0).billNo()).isEqualTo("BILL-A");
assertThat(result.documents().get(0).allocationStatus()).isEqualTo("PENDING_ALLOCATION");
}
@Test void unbilledOrNoConfirmedReceiptIsUnknownNotZero() {
fee(1,1,"DL-A",1,"CNY","0","AVAILABLE");
assertThat(service.query(request(true)).totals().get(0).receivedAmount()).isNull();
bill(1,1);assertThat(service.query(request(true)).totals().get(0).receivedAmount()).isNull();
bill(1,1);var unpaid=service.query(request(true));assertThat(unpaid.totals().get(0).receivedAmount()).isNull();
assertThat(unpaid.documents()).hasSize(1);assertThat(unpaid.documents().get(0).allocationStatus()).isEqualTo("PENDING_ALLOCATION");
assertThat(service.query(request(true)).totals().get(0).receivableAmount()).isEqualByComparingTo("0");
}
@Test void latestVoidedDoesNotFallBackAndOtherCustomerExcluded() {