import 'package:drift/drift.dart'; // ────────────────────────────────────────────── // 1. MonthPlans // ────────────────────────────────────────────── class MonthPlans extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get year => integer()(); IntColumn get month => integer()(); IntColumn get openingBalanceCents => integer().withDefault(const Constant(0))(); IntColumn get bufferAmountCents => integer().withDefault(const Constant(30000))(); IntColumn get eatingOutBudgetCents => integer().withDefault(const Constant(0))(); DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)(); IntColumn get clonedFromId => integer().nullable()(); @override List> get uniqueKeys => [ {year, month}, ]; } // ────────────────────────────────────────────── // 2. PaycheckDefinitions // ────────────────────────────────────────────── class PaycheckDefinitions extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get monthPlanId => integer()(); IntColumn get sequence => integer()(); DateTimeColumn get date => dateTime()(); IntColumn get amountCents => integer()(); IntColumn get sortOrder => integer()(); } // ────────────────────────────────────────────── // 3. PayPeriodItems // ────────────────────────────────────────────── class PayPeriodItems extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get paycheckId => integer()(); TextColumn get description => text()(); TextColumn get comment => text().nullable()(); IntColumn get amountCents => integer()(); DateTimeColumn get date => dateTime()(); BoolColumn get isPaid => boolean().withDefault(const Constant(false))(); IntColumn get sortOrder => integer()(); } // ────────────────────────────────────────────── // 4. BillDefinitions // ────────────────────────────────────────────── class BillDefinitions extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get monthPlanId => integer()(); TextColumn get name => text()(); TextColumn get subtitle => text().nullable()(); IntColumn get dueDay => integer()(); IntColumn get defaultAmountCents => integer()(); IntColumn get amountOverrideCents => integer().nullable()(); // priority: 0=green (normal), 1=yellow (late/pending), 2=red (urgent) IntColumn get priority => integer().withDefault(const Constant(0))(); BoolColumn get isAutoPay => boolean().withDefault(const Constant(false))(); BoolColumn get isFreeform => boolean().withDefault(const Constant(false))(); IntColumn get outstandingBalanceCents => integer().nullable()(); BoolColumn get isPaid => boolean().withDefault(const Constant(false))(); // Per-month overrides (editable in ledger, clear to revert to config values) TextColumn get nameOverride => text().nullable()(); TextColumn get subtitleOverride => text().nullable()(); IntColumn get dueDayOverride => integer().nullable()(); // Outside bills: tracked but excluded from ledger and balance BoolColumn get isOutside => boolean().withDefault(const Constant(false))(); // balanceType: null=unset, 0=Credit, 1=Loan, 2=Mortgage, 3=Personal IntColumn get balanceType => integer().nullable()(); // paymentMode: 0=full (all rules), 1=minimumOnly IntColumn get paymentMode => integer().withDefault(const Constant(0))(); IntColumn get sortOrder => integer()(); } // ────────────────────────────────────────────── // 5. PaymentRules (per-month, references bill by ID) // ────────────────────────────────────────────── // mathSource: 0=totalIncome, 1=ledgerRemaining, 2=netBalance, 3=netMinusBuffer // ruleType: 0=minimum, 1=math, 2=remainingBalance class PaymentRules extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get monthPlanId => integer()(); IntColumn get billDefinitionId => integer()(); IntColumn get mathSource => integer()(); IntColumn get ruleType => integer()(); IntColumn get minimumAmountCents => integer().nullable()(); RealColumn get multiplier => real().nullable()(); IntColumn get additionCents => integer().nullable()(); IntColumn get sortOrder => integer()(); } // ────────────────────────────────────────────── // 6. Payouts (ephemeral per-month) // ────────────────────────────────────────────── class Payouts extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get monthPlanId => integer()(); // position: 0=priority (before bills), 1=notable (after bills) IntColumn get position => integer()(); TextColumn get description => text()(); TextColumn get comment => text().nullable()(); IntColumn get amountCents => integer()(); DateTimeColumn get date => dateTime()(); BoolColumn get isPaid => boolean().withDefault(const Constant(false))(); IntColumn get sortOrder => integer()(); } // ────────────────────────────────────────────── // 7. MiscItems // ────────────────────────────────────────────── class MiscItems extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get monthPlanId => integer()(); TextColumn get description => text()(); TextColumn get comment => text().nullable()(); IntColumn get amountCents => integer()(); DateTimeColumn get date => dateTime().nullable()(); BoolColumn get isRecurring => boolean().withDefault(const Constant(false))(); BoolColumn get isEnabled => boolean().withDefault(const Constant(true))(); IntColumn get sortOrder => integer()(); } // ────────────────────────────────────────────── // 8. AppSettings (singleton, id always = 1) // ────────────────────────────────────────────── class AppSettings extends Table { IntColumn get id => integer().withDefault(const Constant(1))(); IntColumn get defaultBufferCents => integer().withDefault(const Constant(30000))(); IntColumn get defaultPaycheckCount => integer().withDefault(const Constant(1))(); @override Set get primaryKey => {id}; }