Cinema Platform · build status

Component Readiness

Phase: Platform Core · modular monolith · .NET 8
67%
Platform readiness
35 components tracked · 992 tests green
9
Shipped
4
Partial
1
Up next
19
Planned

Where the work is

Just shipped — модальное окно оплаты со сдачей, отмена заказа с подтверждением
Оплата открывается модальным окном во всех трёх каналах: способ оплаты, бонусы и сертификат, поле «Получено» — сдача считается на лету (D-152) · Кассир отменяет неоплаченный заказ сам — с подтверждением «точно выйти, не сохраняя заказ?», места мгновенно в продаже (D-153) · Сплит нал+карта пришёл в кафе и доп-продажи: одна семантика во всех трёх каналах — отчёты и чек ПРРО (CASH+CASHLESS) считают деньги одинаково, over-pay отбивается до денег (D-149) · Возврат по номеру билета: кассир сканирует билет гостя и попадает прямо в заказ (D-150) · Кассир больше не видит мёртвую вкладку «Возврат» — она есть только у ролей с правом возврата (D-151) · Билет оплачивается частью картой, частью наличными — Z-отчёт и ДПС видят оба платежа как они были (D-145) · Обрыв связи с кассой гасится сам: чеки-должники дорегистрируются при восстановлении связи, вплоть до усыновления чеков, которые касса уже приняла (D-147) · «Без фискализации» стало честнее: карточные деньги регистрируются всегда, наличные — по выбору владельца (D-148) · Расписание на экране покупателя — карточки фильмов со временами-чипами, весь день без скролла (D-146) · Невыкупленная бронь сама возвращает места в продажу за 30 минут до сеанса (D-144) · Кассир бронирует места без оплаты — гость выкупает позже любым способом, список броней сеанса с выкупом и снятием прямо над схемой (D-143) · Касса по LAN-адресу больше не падает на оформлении заказа — фоллбек crypto.randomUUID для не-HTTPS (D-143.1) · Продажа без фискального чека — отдельное право fiscal.skip: у менеджеров есть, у кассира нет (но выдаётся персонально), сервер отвечает 403 (D-141) · У каждой кассы свои принтеры билетов и чеков — назначаются в Back Office, печать через device-слой без диалогов ОС (D-142) · Служебные вносы/выносы кассира входят в ожидаемую наличность Z-отчёта — инкассация посреди смены больше не выглядит недостачей (D-139) · Owner-панель показывает фискальные тревоги ЛЮБОЙ локации сети с её именем, не только выбранной (D-140) · Залы с числовыми рядами «Ряд 1, 2, 3…» — как в кинотеатре: двузначный ряд не путается на билете («3-7»), существующие буквенные залы живут как раньше (D-138) · Киоск: тач-чипы «Сегодня/Завтра/…» и «Все залы / зал» над сеткой сеансов — залы только выбранного дня, сброс для следующего гостя (D-137) · Касса: выбор даты ‹ › и зала («все / конкретный») в списке сеансов + тот же фильтр в BO-«Репертуаре» — фильтры никогда не трогают начатую продажу (D-136) · Импорт репертуара от дистрибьютора: любой фид по mapping-правилам, ключи в шифротексте, SSRF-гард (D-135) · Дистрибьюторы (D-134) · ML-советник авторасписания (D-133) · Auto-schedule: the kinoplan optimizer ported 1:1 (D-132) · Paid-module licensing: the vendor switches Кіноплан per tenant, the gate answers 403 and the client menu hides it (D-131, first Licensing slice) · Amending a published day: cancel a show (sales close, history stays) or add an extra one that sells immediately (D-130) · Rotation list: the day plan offers only the films the cinema actually runs (D-129, Кіноплан slice 3) · Platform.Repertoire — the day plan that publishes straight into open screenings (D-128, Кіноплан slice 2) · Кіноплан becomes a platform MODULE (ADR + film metadata ported, D-127) · Film card import from the user’s own Кіноплан service — search, one click, poster included (D-126, simulator-first) · Film cards managed in the Back Office — the schedule is built by picking a card (D-125) · Film posters and ticket prices on the guest screens — schedule, live sale view and the kiosk (D-124) · Customer display governed by workstation settings in the Back Office, deployed via OS autostart (D-123) · Customer-facing display: the guest watches their seats being picked on a second monitor (D-122) · the float and the till collection file themselves on the ПРРО when the shift opens and closes (D-121) · Cash in and out of the drawer (D-120) · per-sale fiscalization choice, and an audit trail that finally records failures (D-119) · fiscal alerts on the owner phone (D-118) · a watchdog for shifts nobody closed (D-117) · ПРРО credentials configured per location in the Back Office (D-116) · live status in the till header (D-115) · cashier-driven shift lifecycle — X-reports and Z-reports (D-114) · Checkbox certified across all three channels (D-111…D-112) · configurable location currency (D-113) · per-seat partial ticket refunds (D-109) · loyalty at ALL FOUR points of sale, kiosk included (D-108) · fiscal RETURN receipts across ALL channels (D-099…D-101) — tickets, cafe and retail, including partial refunds · manual discounts (D-096) · free escort seats (D-097) · certificate = advance (D-098)
D-122 adds the guest-side screen: the cashier opens a second browser window (🖥 in the till header), drags it onto the customer monitor, and it mirrors the sale over a BroadcastChannel — hall scheme with the picked seats pulsing ✓, the cart with prices, the payable total and a green «Оплачено — приятного просмотра» after payment; the window holds no token and talks to no API. It places itself on the guest monitor (Window Management API), reopens itself if the cashier closes it, and falls back to today’s schedule after five idle minutes. D-121 closes the D-120 gap: the counted float now files itself as a ПРРО service deposit when the till opens, and the declared cash leaves as a service withdrawal on close — before the Z-report, replay-safe, best-effort with a loud discrepancy when the register is down. D-096 adds audited manual discounts: a manager-only permission, a closed reason set and a configurable percent cap; the guest pays the payable, every report and the fiscal receipt (with an explicit negative «Знижка» line) agree with the drawer. D-097 closes group screenings: any cart seat can become a FREE escort (👥) — a real ticket at price 0, policy-capped per order, with at least one paid seat required. D-098 fixes the certificate tax semantics: the certificate SALE is the fiscal moment (advance), so spending it later is excluded from the ticket receipt. D-099…D-101 close the refund side across every channel: each refund registers a fiscal RETURN receipt mirroring what the sale registered — linked to the original and idempotent. Cafe and retail refund line by line, so the rule is one return receipt per refund EVENT: a partial return gets its own receipt, and a later full refund only reports the remainder. The tax record now reconciles with the ledger transaction for transaction. D-111 takes fiscalization from hypothesis to fact: the adapter written from documentation alone was wrong in four ways against the live ПРРО — most seriously, a refund without the is_return flag registers a SECOND SALE, and receipts carrying a discount were rejected outright. Sales and refunds now come back with real fiscal codes across tickets, cafe and retail — the cafe/retail refunds needed their own fix, because a real ПРРО reconciles every returned line against the original sale. D-114 closes a production blocker certification exposed: the fiscal shift was opened lazily and never closed, and an unclosed shift stops the register the next day — the cashier now ticks the ПРРО shift open, chooses whether closing the till takes the Z-report, and can pull an X-report any time. D-113 makes the trading currency a location setting instead of a constant in the clients, without ever reinterpreting money already booked. D-109 closes the last big gap at the till: a guest can hand back ONE ticket of three — that seat goes straight back on sale, its ticket is voided, and the order stays open for the seats they kept; a scanned ticket now blocks only its own seat, and discounts, bonuses and certificates come back in exactly the proportions they were paid. D-108 finishes the loyalty series at the self-service kiosk: the guest scans the same card, sees the balance and spends bonuses without a cashier — the machine may only LOOK a card up (customers.read), never register a guest or move a balance.
Up next — Next horizon, together
customer list paging · offsite backups & AccessControl (blocked on owner/hardware)
The whole candidate queue is delivered: kiosk snacks, partial refunds, reprints, retail receipts, CI (now including UI scenarios), backups, and the AccessControl ADR (extraction deferred until real turnstiles/offline cache). The requested loyalty series is delivered end to end: cards, earn/spend bonuses, certificates, discounts, group escorts. The loyalty series is closed end to end (D-093…D-108), and with per-seat ticket refunds (D-109) and customer list paging (D-110) the unblocked queue is empty. Checkbox is now certified against a live test cash register — real fiscal codes for both the sale and the return. Still blocked on the owner/hardware: offsite backups and AccessControl.
FoundationBuilding Blocks · shared kernel
Domain
100
Done
Application
100
Done
Infrastructure
100
Done
Platform Coreshared capabilities · one owner each
Identity & Access
100
Done · roles · password lifecycle · instant revocation
Cash Shifts
100
Done · POS flow + sale gate + Z-report + drawer in/out in expected cash
Organization Structure
85
Done · core
Audit & Journal
85
Shipped · federated read + UI
Observability
35
Partial
Device Registry + Cmd
85
Done · registry + print job
Catalog
85
Done · single source for all channels
Customers
90
Done · cards + bonuses at all 4 POS + BO UI + audited adjustments
Payments & Ledger
78
Done · capture · refund · tenders · reconcile
Pricing & Discount
60
Shipped · server price snapshots + audited manual discounts (cap policy)
Licensing & Flags
70
Shipped · paid modules · vendor switch · 403 gate (D-131)
Notifications
0
Planned
Offline Sync
0
Planned
Business Modules18 licensable modules · MVP = first commercial slice
Ticketing & Box OfficeMVP
Access ControlMVP
Reporting & BIMVP
Add-on Retail
Self-Service Kiosk
Cinema Cafe POS
Procurement
Warehouse & Inventory
Loyalty & Promotions
Gift Certificates
Group Bookings
Content Management
Schedule Planning
Show Control
Kids Room
Attractions
Cashless Wallet
Mobile Control Center
Done — shipped & tested
Partial — foundation in place
Up next — active target
Planned — not started

Readiness is indicative, derived from docs/02_PROJECT_SNAPSHOT.md and the decision log (D-001…D-078). One thin vertical slice at a time, DoD-gated.  ·  Last updated 2026-07-26 · verified: build 0 warnings / 0 errors, 1142 tests + 31 UI scenarios + live Back Office / owner / customer-display / hall-editor smokes green · live runs against the real ПРРО caught four adapter defects, and live smokes caught two more (a partial refund that would have reversed the whole order, and an already-returned seat still offered for refund).