feat: add linear booking workflow — Новая → Связались → Подтверждено/Отказ

- Add status + confirmed_date columns to group_bookings (migration #10)
- Linear flow: Новая shows "Связались →", Связались shows date picker + "Отказ"
- Date picker for confirmation allows only today and future dates
- Confirmed bookings show the scheduled date
- Filter chips: Все / Новая / Связались / Подтверждено / Отказ with counts
- Declined bookings sorted to bottom of list
- "Сбросить" button on confirmed/declined to restart flow

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-19 17:14:51 +03:00
parent e4a9b71bfe
commit 0ec2361a16
3 changed files with 190 additions and 30 deletions

View File

@@ -200,6 +200,19 @@ const migrations: Migration[] = [
`);
},
},
{
version: 10,
name: "add_group_booking_status",
up: (db) => {
const cols = db.prepare("PRAGMA table_info(group_bookings)").all() as { name: string }[];
if (!cols.some((c) => c.name === "status")) {
db.exec("ALTER TABLE group_bookings ADD COLUMN status TEXT NOT NULL DEFAULT 'new'");
}
if (!cols.some((c) => c.name === "confirmed_date")) {
db.exec("ALTER TABLE group_bookings ADD COLUMN confirmed_date TEXT");
}
},
},
];
function runMigrations(db: Database.Database) {
@@ -581,9 +594,13 @@ interface GroupBookingRow {
notified_confirm: number;
notified_reminder: number;
reminder_status: string | null;
status: string;
confirmed_date: string | null;
created_at: string;
}
export type BookingStatus = "new" | "contacted" | "confirmed" | "declined";
export interface GroupBooking {
id: number;
name: string;
@@ -594,6 +611,8 @@ export interface GroupBooking {
notifiedConfirm: boolean;
notifiedReminder: boolean;
reminderStatus?: string;
status: BookingStatus;
confirmedDate?: string;
createdAt: string;
}
@@ -628,10 +647,21 @@ export function getGroupBookings(): GroupBooking[] {
notifiedConfirm: !!r.notified_confirm,
notifiedReminder: !!r.notified_reminder,
reminderStatus: r.reminder_status ?? undefined,
status: (r.status || "new") as BookingStatus,
confirmedDate: r.confirmed_date ?? undefined,
createdAt: r.created_at,
}));
}
export function setGroupBookingStatus(id: number, status: BookingStatus, confirmedDate?: string): void {
const db = getDb();
if (status === "confirmed" && confirmedDate) {
db.prepare("UPDATE group_bookings SET status = ?, confirmed_date = ? WHERE id = ?").run(status, confirmedDate, id);
} else {
db.prepare("UPDATE group_bookings SET status = ?, confirmed_date = NULL WHERE id = ?").run(status, id);
}
}
export function updateGroupBooking(
id: number,
name: string,