fix: include Wirkstoff, Charge, and Wartezeit in the annual treatment report
The colony annual PDF report's treatment section only ever printed date/product/amount - activeIngredient, batchNumber, and withdrawalPeriodDays (added earlier this session specifically for Wartezeit compliance) existed on the Treatment record but never made it into the one document a beekeeper would actually hand to a Veterinäramt inspector or keep as their Bestandsbuch-style compliance record. Silently missing the withdrawal period from the printed record undermines the whole point of tracking it. Also adds the first tests for annual-reports.ts (previously untested). Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
1 parent
fb4713e320
commit
2e6846285d
2 files changed
+93
-2
No files matched your search
@@ -0,0 +1,74 @@
|
||||
import { NotFoundException } from '@nestjs/common';
|
||||
import { buildColonyAnnualReport } from './annual-reports';
|
||||
import { PrismaService } from '../prisma/prisma.service';
|
||||
|
||||
describe('buildColonyAnnualReport', () => {
|
||||
let prisma: {
|
||||
colony: { findUnique: jest.Mock };
|
||||
inspection: { findMany: jest.Mock };
|
||||
treatment: { findMany: jest.Mock };
|
||||
varroaMeasurement: { findMany: jest.Mock };
|
||||
swarmControlCheck: { findMany: jest.Mock };
|
||||
harvestColony: { findMany: jest.Mock };
|
||||
};
|
||||
|
||||
const colony = {
|
||||
id: 'colony-1',
|
||||
code: 'V-001',
|
||||
colonyType: 'PRODUCTION_COLONY',
|
||||
status: 'ACTIVE',
|
||||
apiary: { id: 'apiary-1', name: 'Heimstand' },
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
prisma = {
|
||||
colony: { findUnique: jest.fn().mockResolvedValue(colony) },
|
||||
inspection: { findMany: jest.fn().mockResolvedValue([]) },
|
||||
treatment: { findMany: jest.fn().mockResolvedValue([]) },
|
||||
varroaMeasurement: { findMany: jest.fn().mockResolvedValue([]) },
|
||||
swarmControlCheck: { findMany: jest.fn().mockResolvedValue([]) },
|
||||
harvestColony: { findMany: jest.fn().mockResolvedValue([]) },
|
||||
};
|
||||
});
|
||||
|
||||
it('throws NotFoundException for an unknown colony', async () => {
|
||||
prisma.colony.findUnique.mockResolvedValue(null);
|
||||
await expect(
|
||||
buildColonyAnnualReport(
|
||||
prisma as unknown as PrismaService,
|
||||
'missing',
|
||||
2026,
|
||||
),
|
||||
).rejects.toBeInstanceOf(NotFoundException);
|
||||
});
|
||||
|
||||
it('carries activeIngredient, batchNumber and withdrawalPeriodDays through for each treatment', async () => {
|
||||
prisma.treatment.findMany.mockResolvedValue([
|
||||
{
|
||||
date: new Date('2026-05-01'),
|
||||
product: 'Ameisensäure 60%',
|
||||
amount: '15 ml',
|
||||
activeIngredient: 'Ameisensäure',
|
||||
batchNumber: 'CH-2026-01',
|
||||
withdrawalPeriodDays: 0,
|
||||
},
|
||||
]);
|
||||
|
||||
const report = await buildColonyAnnualReport(
|
||||
prisma as unknown as PrismaService,
|
||||
'colony-1',
|
||||
2026,
|
||||
);
|
||||
|
||||
expect(report.treatments).toEqual([
|
||||
{
|
||||
date: new Date('2026-05-01'),
|
||||
product: 'Ameisensäure 60%',
|
||||
amount: '15 ml',
|
||||
activeIngredient: 'Ameisensäure',
|
||||
batchNumber: 'CH-2026-01',
|
||||
withdrawalPeriodDays: 0,
|
||||
},
|
||||
]);
|
||||
});
|
||||
});
|
||||
@@ -37,7 +37,14 @@ export interface ColonyAnnualReport {
|
||||
queenSeen: boolean | null;
|
||||
broodAmount: string | null;
|
||||
}[];
|
||||
treatments: { date: Date; product: string; amount: string | null }[];
|
||||
treatments: {
|
||||
date: Date;
|
||||
product: string;
|
||||
amount: string | null;
|
||||
activeIngredient: string | null;
|
||||
batchNumber: string | null;
|
||||
withdrawalPeriodDays: number | null;
|
||||
}[];
|
||||
varroaMeasurements: {
|
||||
date: Date;
|
||||
method: string;
|
||||
@@ -141,6 +148,9 @@ export async function buildColonyAnnualReport(
|
||||
date: entry.date,
|
||||
product: entry.product,
|
||||
amount: entry.amount,
|
||||
activeIngredient: entry.activeIngredient,
|
||||
batchNumber: entry.batchNumber,
|
||||
withdrawalPeriodDays: entry.withdrawalPeriodDays,
|
||||
})),
|
||||
varroaMeasurements: varroaMeasurements.map((entry) => ({
|
||||
date: entry.date,
|
||||
@@ -262,7 +272,14 @@ export function renderColonyAnnualReportPdf(
|
||||
}
|
||||
for (const entry of report.treatments) {
|
||||
doc.text(
|
||||
`- ${formatDate(entry.date)}: ${entry.product} (${entry.amount ?? '-'})`,
|
||||
`- ${formatDate(entry.date)}: ${entry.product} (${entry.amount ?? '-'})` +
|
||||
(entry.activeIngredient
|
||||
? `, Wirkstoff: ${entry.activeIngredient}`
|
||||
: '') +
|
||||
(entry.batchNumber ? `, Charge: ${entry.batchNumber}` : '') +
|
||||
(entry.withdrawalPeriodDays !== null
|
||||
? `, Wartezeit: ${entry.withdrawalPeriodDays} Tage`
|
||||
: ''),
|
||||
);
|
||||
}
|
||||
doc.moveDown();
|
||||
|
||||
Reference in new issue
Block a user