3 сарын төлөвлөгөө
12 долоо хоног. Ганц хөгжүүлэгч + AI хамтрагч. Эцэст нь ажиллах SaaS — гол функцууд амьд, бодит харилцагчид өөрсдөө onboarding wizard-аар бүртгүүлж байгаа. Хуучин системийг хуулахгүй, харин хэрэглэгчдэд хэрэг болох зүйлсийг дахин бүтээнэ.
Философи
Дахин бүтээнэ — хуулахгүй.
v1-ийг хуулахгүй. Функц бүрийг дараах асуултаар дахин үзнэ: "Хэрэглэгчид өнөөдөр энэ юу хийх ёстой вэ?" Хэрэв v1-д хэн нэгэн 2019 онд асуусан болохоор байгаа, гэхдээ хэрэглэгддэггүй бол — устгана. Бид 3 жилийн дараах, юу хэрэгтэй гэдгийг илүү ойлгож байгаа компани. v1 нь дата хэлбэрийн референс, UI урсгал эсвэл бизнес логик-ийн биш.
Харилцагч өөрөө onboarding хийнэ.
Хамгийн том өөрчлөлт: шинэ харилцагч тохируулахын тулд бид өгөгдлийн санд хүрэхгүй. Тэд login хийгээд, onboarding wizard ажиллуулаад, барилга + өрөө + түрээслэгч + идэвхтэй гэрээгээ CSV эсвэл Excel-ээр upload, багана map, preview, commit. v1-д борлуулалт/дэмжлэгийн дуудлага + бид SQL бичих хэрэгтэй байсан. v2-т энэ нь template + validation-той 30 минутын өөрөө хийх урсгал болно. Энэ нь 12 долоо хоногийн хамгийн чухал UX хөрөнгө оруулалт.
"Ажиллаж байна" ≠ feature parity.
"Ажиллах систем" гэдэг нь шинэ бодит харилцагч бүртгүүлж, өгөгдлөө import, нэг сар явуулж, төлбөр авч, баримт бичиг бүрдүүлж, данс таарч байх явдал. v1-ийн бүх тайлан, popup, edge case-уудыг хамруулна гэсэн үг биш. Cut line-ууд тодорхой — энд багтаагүй бүхэн v2.1.
Долоо хоног бүр demo.
Баасан гариг бүр систем нь end-to-end бодит дата (тест харилцагч) дээр ажиллах ёстой. Хэрэв Даваа-Пүрэв даалгавар Баасан demo гаргахгүй бол — энэ нь шууд мэдээлэх scope/scheduling-ийн асуудал, шингээх юм биш. Хурд нь "done" биш, demo-той зүйлээр тогтоогдоно.
Хурдны тухай үнэн.
10 build долоо хоногийн дотор бүх scope (Core + payments + eBarimt + SMS + chatbot + files) solo хийх нь зөвхөн AI-pair хурдтай боломжтой (Claude Code editor дээр, agents-аар research + scaffolding). Хэрэв тэгэхгүй бол scope нь "Core+Comms" эсвэл "Core+ зөвхөн" хүртэл багасна — cut line-уудыг доор үзнэ үү. Төлөвлөгөө AI-velocity тохиолдлыг таамагласан; хэрэв үгүй бол cut line-ууд идэвхждэг.
Хугацааны харааны тойм
Swimlane
Onboarding wizard — гол төв
Энэ нэг л зүйлийг хагас хийж явуулж болохгүй. Бусад нь MVP хэлбэртэй байж болно; энэ нь сайхан мэдрэмжтэй байх ёстой.
Урсгал (зорилт: бүртгэлээс "дата орлоо" хүртэл 30 минут)
- Бүртгүүлэх + PropertyOwner үүсгэх. Нэр, ТТД, банкны данс, утас. Email баталгаажуулалт, утасны OTP.
- Эхлэх цэгээ сонгох. "Шинэ" (зөвхөн гараар оруулна) эсвэл "Spreadsheet байгаа" (upload).
- Template татах.
Багана + жишээ мөр + dropdown enum (дүүрэг, төрөл, валют)-той бэлэн XLSX. Entity тус бүрд нэг template:
properties.xlsx,rooms.xlsx,tenants.xlsx,active-contracts.xlsx. - Upload + auto-map. XLSX upload. Wizard нь баганын headers-ийг canonical field-тэй автоматаар (fuzzy) тааруулна. Хэрэглэгч баталгаажуулах/dropdown-аар өөрчлөх.
- Шалгах + preview.
Мөр тус бүрийн алдаа inline: "мөр 14:
areaтоо биш", "мөр 22:property'Гранд Тауэр' таны properties-д олдсонгүй (эхлээд properties import хийнэ үү)". Дүн харуулна: 3 барилга, 47 өрөө, 38 түрээслэгч, 41 гэрээ. 6 warning highlight. - Засах + дахин upload (давталт). Хэрэглэгч зөвхөн алдааны file татаж, локал засаад дахин upload. State алдагдахгүй.
- Commit. Транзакц bulk insert (entity тус бүрд нэг Postgres tx, RLS нь PropertyOwner-руу scope). Progress bar. Дууссан.
- Дараагийн алхамын card. "Эхний сарын нэхэмжлэх үүсгэх үү?" "Нягтлан урих уу?" "QPay merchant ID холбох уу?" Тус бүрд нэг click.
Яагаад хэцүү (мөн яагаад үнэ цэнтэй)
- Монгол-онцлог дата чанар: утасны формат (8 оронт, 976-тай/үгүйгээр), дүүргийн нэр (Кирилл vs Латин: "Хан-Уул" vs "Khan-Uul"), ТТД валидаци (7 оронт vs 10 оронт).
- Хамаарсан import: contracts нь properties + rooms + tenants-ийг ref хийдэг. Дарааллаар import эсвэл мөр тус бүрд deferred resolution хэрэгтэй.
- Idempotency: ижил file дахин upload хийхэд давхардахгүй байх. Natural key (room unit_number + property_id; tenant утас)-аар таарах.
- Яагаад үнэ цэнтэй: бүртгүүлсэн харилцагч бүр манай инженерийн цаг 0 зарцуулна. v1-д борлуулалтын мөчлөг долоо хоногоор хэмжигдэж байсан. v2-т өөрөө хийх урсгал минутаар хэмжигдэнэ. Энэ бол биднийг үнэхээр scale хийх боломж олгох unlock.
Долоо хоног тус бүр
Долоо хоног 1 СУУРЬ
Scaffold polish, hosting, deploy pipeline, observability skeleton. (Үндсэн төлөвлөгөөний Phase 0 хэсэгчлэн хийгдсэн — дуусгах + шийдвэр lock хийх.)
- Архитектурын шийдвэр lock: TanStack Start vs Next.js (аудит зөвлөмж), graphile-worker vs Hatchet, Playwright PDF, Hetzner Singapore.
- Hetzner Singapore CCX13 + Coolify provision;
api.spacehub.mn,app.spacehub.mn,files.spacehub.mnүүсгэх. - R2 bucket + Cloudflare DNS.
- GitHub Actions deploy: API + workers
turbo prune-аар, web сонголтоор. Drizzle migrations gated. - Pino + Sentry + OpenTelemetry → Axiom (log) + Grafana Cloud (trace).
- BetterStack health probe
/v2/healthдээр.
Долоо хоног 2 AUTH + RLS
better-auth бүрэн утсалсан, org plugin = PropertyOwner. RLS middleware. Түрээслэгчийн утасны OTP 131344-өөр.
- better-auth Drizzle adapter (Drizzle 0.x pin). Email + password + утасны OTP + JWT + bearer + organization + multi-session + admin plugin.
- RLS middleware:
SET LOCAL ROLE+set_config('app.user_id'/'app.owner_id'/'app.role')per-request tx-д. - Postgres role:
authenticated,app_admin. - SMS sender: 131344 client + Redis OTP store (SHA-256 + GETDEL).
- Web: бүртгүүлэх, login, утасны OTP, "PropertyOwner-аа үүсгэх" анхны урсгал.
- RLS smoke test (owner A vs owner B тусгаарлалт).
Долоо хоног 3 ONBOARDING WIZARD
Хамгийн хэцүү UX долоо хоног. Template + XLSX upload + баганын mapper + мөрийн валидаци + хамаарлын дараалал. Хэрэв муу бол үлдсэн системийн хагасыг блоклоно.
- Template: 4 XLSX file сервер талаас Drizzle schema-аас үүсгэгдэнэ (нэг л эх сурвалж).
- Upload UI: drag-drop, preview-д
exceljs-ээр browser-д parse, commit-д API-руу илгээх. - Баганын mapper: fuzzy auto-match (Levenshtein), баганын dropdown override.
- Валидаци:
@spacehub/contracts-ийн Zod schema дахин ашиглах; мөрийн inline алдаа. - Хамаарлын граф: properties → rooms → tenants → contracts. Бүх entity цэвэр шалгагдсаны дараа л commit.
- Idempotency: давхардсан insert-ээс зайлсхийхийн тулд natural key matching.
Долоо хоног 4 БАРИЛГА + ӨРӨӨ
Wizard-ыг гүйцээх owner-facing CRUD (гар засвар + import-ийн дараа нэмэх).
- Drizzle schema:
property_owners,properties,floors,rooms,property_photos(Files дараа — гэхдээ schema sketch одоо). - API: REST endpoint + Zod валидаци.
- Web: property list, property detail, floor list, room editor (нэгж + bulk).
- Тооцоолсон room occupancy view (Postgres view, Drizzle binding).
- Owner wizard-ээр import-сонг бүхнийг засаж чадна; систем нь гар vs import-сон flag-аар ялгана (дараа diff үзүүлэх).
Долоо хоног 5 ГЭРЭЭ
Гэрээний lifecycle. Нэг status enum, transition function. Wizard-ээс import-сон "идэвхтэй гэрээ" энд hydrate.
- Schema:
contracts,contract_rooms,contract_items,contract_audit_log. - Нэг status enum +
transitionContract(tx, id, to, actor)зөвшөөрөгдсөн шилжилтийн хүснэгттэй. - Төлбөрийн график materializer: тогтмол сарын хувьд jsonb.
- API: CRUD + үйлдэл (sign, extend, terminate, renew).
- Web: contract list/detail/create wizard/extend modal.
- Өдөр бүрийн BullMQ scheduler:
contract.expiry10:00 Asia/UB → 131344 SMS дуусахаас 5 хоногийн өмнө.
Долоо хоног 6 BILLING + PDF
Нэгдсэн invoice загвар + BigInt мөнгө + сарын тооцоо + Playwright PDF.
- Schema:
kinddiscriminator-той нэгinvoicesхүснэгт +invoice_items. BigInt мөнгө. - Invoice transition state machine + audit.
- Тооцоо үүсгэх worker (graphile-worker cron) —
(contract_id, kind, period_start)-аар idempotent. - Төлбөр apply үйлчилгээ (QPay webhook + банкны тулгалт + бэлэн орлогоос дуудагдана).
- Playwright PDF: нэхэмжлэхийн template (HTML + Noto Sans web font). N render тутамд browser recycle.
- API: invoice CRUD + үйлдэл +
/pdfendpoint on-demand render fallback-той. - Web: invoice list (filter: status/period/contract), detail, bulk үүсгэх UI, PDF preview.
Долоо хоног 7 ТӨЛБӨР + ТУЛГАЛТ
QPay client + банкны statement import (Хаан/Голомт/ХХБ) + indexed тулгалт.
- QPay client (~150 мөр: auth, нэхэмжлэх үүсгэх, төлбөр шалгах, HMAC path-token webhook).
- SocialPay client (~200 мөр, HMAC signed callback).
- Банкны statement importer: Хаан/Голомт API боломжтой бол, XLSX upload fallback (exceljs). ХХБ зөвхөн upload.
- Тулгалтын алгоритм: pre-built amount → invoice index, scored fuzzy match (огноо + memo). v1-ийн O(N·M) нэвчилтийг устгана.
- Web: invoice "Төлөх" товч QR харуулна; түрээслэгч банкны app-аар төлнө; webhook гарна; status
paidболно; outbox eBarimt push queue хийнэ. - Тулгалтын queue UI: тодорхойгүй match-ийг гараар баталгаажуулах.
Долоо хоног 8 eBARIMT 3.0
Compliance чухал. Outbox-аар явдаг, exp backoff retry-тай. Keycloak auth + receipt POST.
- eBarimt client: Keycloak token cache (Redis), receipt POST, error code боловсруулалт.
- Outbox event:
ebarimt.pushpayment apply-тай ижил tx-д insert. - graphile-worker handler: invoice load → receipt бүтээх → push → lottery/QR хадгалах.
- Idempotent:
DUPLICATE_INVOICE_ID-ыг амжилттай болгож үзнэ. - Retry хуваарь: 1м, 5м, 30м, 2ц, 12ц, 24ц; 8 оролдлогын дараа dead-letter.
- Owner тус бүрийн config UI: ТТД, branch, posNo, шифрлэгдсэн credential.
- eBarimt staging realm дээр prod-руу шилжихээс өмнө stage.
Долоо хоног 9 SMS + PUSH
Мэдэгдлийн давхарга. Billing/expiry-ийн SMS template. Mobile push-д FCM.
- SMS template: тооцоо гарсан, төлбөр баталгаажлаа, гэрээ дуусах, тооцоо хугацаа хэтэрсэн. Монгол хэл default.
- FCM:
firebase-adminv13+. ЗөвхөнsendEachForMulticast(). Device тус бүрийн token хүснэгт. - Flutter token бүртгэлд
POST /v2/devices. - Апп доторх notification feed (Postgres хүснэгт). Уншсан/уншаагүй status.
- Outbox event:
sms.send,push.send. - Чимээгүй цаг: чухал биш SMS-ийг 22:00–08:00 Asia/UB-д явуулахгүй.
Долоо хоног 10 CHATBOT + FILES
Polish давхарга. 5-6 tool-той Gemini chatbot (v1-ийн бүх 10-ыг биш; үлдсэнийг хасна). R2 presigned-ээр property зургийн upload.
- Chatbot: Vercel AI SDK v5+ +
@google/genai. Streaming SSE. Хамгийн ач холбогдолтой 5-6 tool:getActiveContracts,checkRentPayments,getOccupancy,listOverdueInvoices,getMonthlyRevenue. - Chat conversation persistence + message мөр.
- Owner allow-list feature flag (hard-coded list биш).
- Files: R2 + AWS SDK v3 +
sharpthumbnail. Presigned PUT endpoint. Upload-ийн дараа confirm endpoint. - Web: property page-д зургийн uploader, түрээслэгч талд харагдах өрөөний зургийн gallery.
- Onboarding wizard эцсийн polish — алдааны мессеж, template шинэчлэлт, "дараагийн алхам" card.
Долоо хоног 11 ТЕСТ + HARDEN
Bug bash, parity test, perf tune, observability нөхөх, аюулгүй байдлын review. Шинэ функц нэмэхгүй.
- End-to-end Playwright тест хамгийн их хэрэглэгддэг 10 урсгалд. CI-д шөнө бүр явуулна.
- Pilot owner setup: pilot хийхээр зөвшөөрсөн 1 бодит owner-ийг сонгох. Тэдний датаг onboarding wizard-аар явуулах. Тулгарсан саад бүрийг засах.
- Load test: 100 concurrent owner list endpoint руу. RLS perf шалгах.
- Аюулгүй байдлын review: SQL injection, JWT валидаци, presigned URL нэвчилт, RLS bypass оролдлого, OTP rate limit шалгалт.
- Мөнгөний тооцооны regression: 100 нэхэмжлэхийг бүрэн lifecycle-ээр (issue → хагас төлбөр → төлбөр → буцаалт); ledger тэнцэлийг assert.
- eBarimt parity: 50 бодит нэхэмжлэхийн staging push; нягтлангийн хүлээлттэй харьцуулах.
- Backup/restore drill: prod DB-г staging руу өчигдрийн pgBackRest backup-аас сэргээх.
Долоо хоног 12 PILOT НЭЭЛТ
Систем дээрх анхны бодит owner. Өдөр бүр monitor. Зөвхөн bug fix — scope нэмэлт үгүй.
- Даваа: pilot owner wizard-аар onboarding хийнэ (та харж сууна, үнэхээр блок болохгүй бол туслахгүй — feedback бол deliverable).
- Мягмар–Пүрэв: тэдний эхний сарыг явуулах — тооцоо гарах, төлбөр ирэх, eBarimt идэвхжих, SMS илгээх. Sentry + Axiom + Grafana dashboard-уудыг хяна.
- Баасан: pilot owner-тэй retro. v2.1-ийн punch-list.
- Pilot амжилтын шалгуур доор "Амжилтын шалгуур"-т.
- Sales бэлэн: doc/marketing хуудсанд "бодит owner үүн дээр байна" гэж бичнэ.
Юу багтаах vs хасах
БАГТАНА (3 сарын MVP)
- Өөрөө хийх onboarding wizard (XLSX → preview → commit)
- Owner / Property / Floor / Room удирдлага
- Түрээслэгчийн утасны OTP бүртгэл
- Гэрээний lifecycle (sign / extend / terminate / renew)
- Нэгдсэн Invoice + BigInt мөнгө + сарын тооцоо
- Нэхэмжлэхийн PDF (Playwright + Noto Sans MN)
- QPay + SocialPay төлбөрийн link + webhook
- Хаан + Голомт + ХХБ банкны statement import + тулгалт
- eBarimt 3.0 receipt outbox
- 131344-өөр SMS мэдэгдэл (4 template)
- FCM push мэдэгдэл
- Gemini chatbot (5-6 tool)
- Property зургийн upload (R2 presigned + sharp)
- Owner-ийн дата export ("миний дата авах" CSV/Excel)
- RLS-ээр enforce хийгдсэн multi-tenancy
ХАСНА (v2.1 эсвэл хожим)
- v1 харилцагчийн дата шилжүүлэх execution (tooling-г зохион байгуулна, гүйцэтгэхгүй — доороос үз)
- Нэхэмжлэх + statement PDF-ээс өөр тайлан
- Community / Post / Rating функц (бүрэн хасна)
- Interactive floor-plan editor (v1-ийн PropertyPlanV2)
- Цахим гарын үсэг
- Олон валюттай гэрээ
- Хугацаа хэтэрсэн торгуулийн auto-issue (одоохондоо гараар)
- Gateway-ээр refund automation (гараар тэмдэглэх)
- Web push (FCM web SDK) — launch-д зөвхөн native FCM
- Resend-ээр email мэдэгдэл (эхэлж SMS; email хожим)
- Owner-ийн branding (PDF дээр logo + өнгө)
- v1-ийн chatbot tool 7-10 (хамгийн үнэ цэнтэй 5-6-ыг үлдээнэ)
- Bulk room CSV onboarding wizard-аас гадуур
- Audit log UI (audit data барина; UI хожим)
v1 харилцагчийн шилжилт — 3 сард зохион байгуулж, дараа гүйцэтгэнэ
Таны шийдвэрээр: hybrid — greenfield-ийг 3 сард build хийх; шилжилтийн tooling зохион байгуулсан, execution дараа. Эдгээр 12 долоо хоногт бид доорхийг гаргана:
3 сарын дотор гарах шилжилтийн deliverable-ууд
- Schema mapping хүснэгт — v1 entity бүр → v2 field-аар, enum collapse дүрэмтэй.
- Idempotent ID mapping (
"{table}:{legacyId}"дээрх UUID v5) — дахин run-хад ижил UUID гарна. - Backfill script domain тус бүрд (TS), runnable гэхдээ prod-д execute хийгээгүй. SQL Server snapshot copy дээр test.
- Parity check script — мөрийн тоо + sample diff хүснэгт тус бүрд.
- Onboarding wizard-д "v1-ээс" зам — v1-ээс датаг нь extract хийсэн owner-уудад wizard "pre-imported" flag хүлээж аваад, дахин upload-ын оронд verify хийнэ.
Бодит дата хөдөлгөөн нь launch-ийн дараах тусдаа phase-д явагдана. Тэр үед greenfield систем pilot-аар battle-test-сэн байх тул шилжилт нь incremental + бага эрсдэлтэй.
3 сарын checkpoint-ийн амжилтын шалгуур
Hard pass/fail (бодит)
- Бодит шинэ owner бүртгүүлсэн, onboarding wizard явуулсан, тусламжгүй системийг ашиглаж байгаа.
- Тэр owner дор хаяж нэг сарын тооцоо PDF-тэйгээр гаргасан.
- Тэр owner дор хаяж нэг бодит QPay төлбөр end-to-end хүлээж авсан (нэхэмжлэх → төлөгдсөн → eBarimt баримт → SMS баталгаажуулалт).
- Pilot-д банкны statement тулгалт нь гүйлгээний дор хаяж 80%-ийг auto-match хийсэн.
- 10 priority E2E урсгал шөнийн CI-д ногоон.
- 5 өдөр дараалан P0 bug нээлттэй биш.
- Backup/restore drill амжилттай execute.
Soft pass (чанарын)
- Pilot owner "Би үүнийг санал болгож байна" гэж асуулгүй хэлэх.
- Spreadsheet-тэй шинэ owner-ийн onboarding end-to-end < 1 цаг.
- Чи (solo dev) систем эвдрэхгүйгээр нэг долоо хоног амрах боломжтой гэж мэдрэх.
Эрсдэлийн бүртгэл
| Эрсдэл | Магадлал | Mitigation / cut-line |
|---|---|---|
| Onboarding wizard 1 биш 2 долоо хоног авна | Өндөр | 3-4 долоо хоног руу хойшлуулж, Property CRUD UI-г 5-р долоо хоног руу зөөнө (дата import болсон хэвээр). Хүлээн зөвшөөрөгдөнө. |
| eBarimt staging нь prod-ээс өөр ажиллана | Дунд | 11-р долоо хоногт prod-flip-д 2 өдөр төсөвлөнө; pilot owner-ийн эхний сар fail-safe (бид receipt-ийг гараар stage хийж чадна). |
| Банкны API (Хаан/Голомт) бичиг цаасаар блоклогдсон | Өндөр | Блоклогдсон банкуудад зөвхөн XLSX upload-руу буурна. Тулгалт аль аль талаар ажиллана. |
| Gemini SDK build дунд breaking change | Дунд | v5+ pin тодорхой. Chatbot бол 10-р долоо хоног — SDK drama бол feature flag-аар off болгох. |
| Hetzner Singapore outage / latency claim vs бодит | Бага | 1-р долоо хоногт MN ISP-уудаас хэмжих; Postgres-д Neon Tokyo fallback бэлэн. |
| Solo velocity AI-pair taamaglal-аас удаан | Дунд-өндөр | Cut line-ууд чангарна: chatbot хасах (10-р долоо хоног), FCM хасах (9-р долоо хоног → зөвхөн SMS), SocialPay хасах (7-р долоо хоног → зөвхөн QPay). MVP demo боломжтой хэвээр. |
| Pilot owner буцна | Бага | 2 нөөц owner бэлэн. v2.1 launch тактик ижил. |
3 сарын дараах roadmap (preview)
3 сараас цааш юу болох:
- 4-р сар: v1 харилцагчийн шилжилтийн execution (1-2 зөвшөөрсөн owner). Email мэдэгдэл. Branded PDF.
- 5-р сар: Mobile Flutter app v2 API руу шилжих. Web push.
- 6-р сар: Үлдсэн тайлангууд. v1 decommission шалгуур.