feat: T4 wave 10 – bottling quality, phenology and honey chain UI, Telegram link/receive and ops
- Bottling quality: water content above the legal limit (strict >) answers 409 CONFIRMATION_REQUIRED bound to the measured value; prefill for jar size, best-before (shelfLifeMonths, month-end clamping) and water content; impossible dates give 400; water-content checks in src/common/quality. - Frontend phenology: "Entwicklung melden" sheet, IndexedDB v4 queue, season header on the apiary page, confirmed revoke for all apiaries. - Frontend honey chain: "Vorschlag aus …" hints with explicit take-over, prefill status note, movement ledger with withdraw/correct dialogs. - Telegram: link tokens (hashed, single use), private-chat receiver with lease and offset CAS, bounded poison-update skip, Retry-After, pending deliveries skipped on disconnect; system API for deliveries and retry; worker-only secret wiring and manifest policy tests. - ARCHITECTURE.md §7, §9, §10, §11.11–11.13, Annahmen 51–55. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
1 parent
16cc557462
commit
fab7f7e12f
91 files changed
+8463
-104
No files matched your search
@@ -55,6 +55,27 @@ export function addDays(day: string, days: number): string {
|
||||
return result.toISOString().slice(0, 10);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calendar months on a YYYY-MM-DD string. A day the target month does not
|
||||
* have is cut to its last day: 2027-01-31 + 1 month is 2027-02-28.
|
||||
*/
|
||||
export function addMonthsClamped(day: string, months: number): string {
|
||||
const start = dayToDate(day);
|
||||
const monthIndex = start.getUTCMonth() + months;
|
||||
const lastDay = new Date(
|
||||
Date.UTC(start.getUTCFullYear(), monthIndex + 1, 0),
|
||||
).getUTCDate();
|
||||
return new Date(
|
||||
Date.UTC(
|
||||
start.getUTCFullYear(),
|
||||
monthIndex,
|
||||
Math.min(start.getUTCDate(), lastDay),
|
||||
),
|
||||
)
|
||||
.toISOString()
|
||||
.slice(0, 10);
|
||||
}
|
||||
|
||||
/** Whole calendar days from `from` to `to` (negative when `to` is earlier). */
|
||||
export function daysBetween(from: string, to: string): number {
|
||||
return dayNumber(to) - dayNumber(from);
|
||||
|
||||
Reference in new issue
Block a user