using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using foodmarket.Infrastructure.Persistence; #nullable disable namespace foodmarket.Infrastructure.Persistence.Migrations { /// Phase34 — движения кассовой смены попадают в деньги. /// /// Добавляет: /// /// money_transactions.Category (integer, DEFAULT 0 = Manual) — /// тип движения: розничные продажи/возвраты нал/карта, внесения/выплаты, /// излишек/недостача смены. /// money_transactions.CashShiftId (uuid, nullable) — /// смена, породившая движение (материализуется при закрытии). /// organizations.AllowNegativeBalance (boolean, DEFAULT false) — /// разрешить ли уход счетов в минус. /// /// /// Идемпотентно (IF NOT EXISTS). Данные не пересчитываем: остаток счёта /// вычисляемый (Opening + Σ Posted money_transactions); движения прошлых /// закрытых смен материализуются ретроспективно отдельным backfill-методом /// в DevDataSeeder (idempotent, по CashShiftId). [DbContext(typeof(AppDbContext))] [Migration("20261008030000_Phase34_ShiftMoneyMovements")] public partial class Phase34_ShiftMoneyMovements : Migration { protected override void Up(MigrationBuilder b) { b.Sql(@" ALTER TABLE public.money_transactions ADD COLUMN IF NOT EXISTS ""Category"" integer NOT NULL DEFAULT 0; ALTER TABLE public.money_transactions ADD COLUMN IF NOT EXISTS ""CashShiftId"" uuid; CREATE INDEX IF NOT EXISTS ""IX_money_transactions_CashShiftId"" ON public.money_transactions (""CashShiftId"") WHERE ""CashShiftId"" IS NOT NULL; ALTER TABLE public.organizations ADD COLUMN IF NOT EXISTS ""AllowNegativeBalance"" boolean NOT NULL DEFAULT false; "); } protected override void Down(MigrationBuilder b) { b.Sql(@" DROP INDEX IF EXISTS public.""IX_money_transactions_CashShiftId""; ALTER TABLE public.money_transactions DROP COLUMN IF EXISTS ""CashShiftId""; ALTER TABLE public.money_transactions DROP COLUMN IF EXISTS ""Category""; ALTER TABLE public.organizations DROP COLUMN IF EXISTS ""AllowNegativeBalance""; "); } } }