Skip to content

FUNCTIONAL REQUIREMENTS DOCUMENT

(FRD)

VietGara — Multi-Tenant SaaS Platform for Auto Garage Management & Maintenance

Version 1.9 — October 12, 2026

1. Introduction

1.1. Purpose

This document specifies the detailed functional requirements of the VietGara platform, serving as the basis for the development team’s API, database, and UI design, and for the QA team’s test case design. It elaborates on the features described at a high level in the Vision & Scope Document and maps each requirement to the corresponding service in the Software Architecture Document (SAD).

1.2. Scope

This document covers all 24 functional groups of the system, from user administration to reporting and analytics, across all three access channels: the garage web console, the customer app, and the technician app. Non-functional requirements (performance, security, scalability) are not repeated here in detail — see the Non-Functional Requirements Document (NFRD), the Software Architecture Document (SAD) and ADR-001 through ADR-011.

1.3. Reference Documents

  • Vision & Scope Document — VietGara, Version 1.4
  • Software Architecture Document (SAD) — VietGara, Version 1.3

1.4. Document Conventions

NotationMeaning
FR IDFormat: FR-[Module Code]-[Sequence], e.g. FR-QUO-01 is functional requirement #01 in the Quote (QUO) module
Priority — Must haveRequired for the system to operate (MoSCoW framework)
Priority — Should haveImportant but can be deferred if a schedule trade-off is needed
Priority — Could haveAdds incremental value; its absence does not affect core operations
PhasePhase 1 (MVP) through Phase 17, corresponding to the delivery roadmap in Section 3 of the Vision & Scope Document

1.5. Terminology

TermMeaning
UserA person who signs in to any VietGara app: owner, staff, customer with an app, platform admin or admin staff (formerly called an “account”)
OwnerA user who owns garages; the subscription belongs to the owner user
StaffA user’s membership of one garage, through staff groups and roles
CustomerA garage-owned profile of a vehicle owner. It needs no user; it can be linked to a user with the user’s consent (FR-CUS-06)
SupplierA garage-owned record of a business that sells parts to the garage (FR-SUP-01). It is not a customer; a user link and portal come in Phase 17 (FR-SUP-02/03)
InsurerA garage-owned record of an insurance company, in the Insurance module (FR-INS-07). It is neither a customer nor a supplier
Platform Admin, Admin StaffUsers holding platform permissions (FR-IAM-10)
Owner Web, Admin WebThe two web consoles. Owner Web (vietgara-owner-web) is for garage owners and staff; Admin Web (vietgara-admin-web) is only for platform admins and admin staff. A garage user never uses the Admin Web
Owner App, Admin App, Customer App, Technician AppThe four mobile apps; the Owner App and Admin App are the mobile companions of the Owner Web and the Admin Web

“Account” is used only in ordinary English phrases: My account (a user’s own settings page), bank account, Google account.

2. Users & Roles (Actors)

ActorDescription
Garage Owner / ManagerThe owner owns the user, its garages and the subscription, holds every permission in the garages they own and defines the roles their staff receive. A Manager is a staff member with the default Manager role (FR-IAM-03): every catalogue permission, but not the owner-only actions (garage status, staff groups)
Garage AccountantManages settlements, receivables, and e-invoicing; limited rights on system configuration
TechnicianReceives and updates assigned repair orders; no access to financial data
Service AdvisorCreates quotes, greets customers, tracks repair progress
Inventory StaffManages parts stock in/out/on-hand
End CustomerThe vehicle owner. Needs no user to be a garage’s customer; with a VietGara user (Customer App) they approve quotes, track progress, book appointments and pay
Platform AdminOperates the VietGara platform with every platform permission, including viewing any garage’s data (logged); not tied to any single garage. Uses the dedicated vietgara-admin-web web app and vietgara-admin-app, not the owner web
Admin StaffA user with limited platform permissions through platform staff groups and roles (FR-IAM-10); may read one garage’s data only through an approved, time-boxed, read-only support grant (FR-IAM-11)
SupplierA business that sells parts to the garage. Today it is a record the garage keeps (FR-SUP-01) and the garage sends it purchase orders by print or e-mail. From Phase 17 a supplier that has a VietGara user (the supplier user) works in the Supplier Portal (FR-SUP-02/03): it sees the purchase orders addressed to it, confirms lines and attaches delivery notes. Not an End Customer and not a garage user
VisitorA person who has no VietGara user and reads the public sites: a garage owner who is considering VietGara, a customer, a partner. Reads viettechno.com and vietgara-help.viettechno.com and may send a contact request (FR-WEB-02). Not an End Customer and not a garage user
External SystemE-invoice provider, payment gateway, insurance company — a system actor communicating via API/webhook

The staff actors above are the default roles created for every owner (FR-IAM-03). What a staff member may do is decided by the permissions of the roles assigned to their staff groups, not by the actor name, so an owner can adapt or add roles.

3. Detailed Functional Requirements

3.1. Identity & Access Management

IDRequirement NameDescriptionActorPriorityPhase
FR-IAM-01Garage user registrationA garage owner self-registers with e-mail, password and full name (phone optional), or signs up instantly with a Google (Gmail) user (OAuth 2.0). E-mail users start unverified: a 6-digit OTP is e-mailed, valid for 2 minutes (resend after 30 seconds, 5 attempts). Until the e-mail is verified the user may only edit its profile and verify; garage, staff and business pages are blocked. Verification creates the user’s trial subscription (FR-LIC-01) and its default roles (FR-IAM-03). Google accounts are verified on sign-upGarage OwnerMust havePhase 1
FR-IAM-02Login / logoutLogin with e-mail/password or Google; short-lived access token plus a rotating refresh token; logout revokes the refresh tokenAllMust havePhase 1
FR-IAM-03Role-based access control (RBAC)The owner defines roles (a name and a set of permissions from a fixed catalogue, e.g. customer.write, staff.write) shared by all their garages. The catalogue is grouped by module (garage, staff, customer, …), each offering a read and/or write permission (<module>.read / <module>.write); a write permission includes its module’s read permission. The owner edits a role on one page: a module × read/write checkbox grid, saved as the role’s whole permission set in one update; a default role can be reset to its default permissions. In each garage, a staff group assigns one role to its members; a staff member holds the union of their groups’ permissions in that garage. Default roles (Manager, Service Advisor, Technician, Accountant, Inventory Staff) and matching groups are generated when the owner verifies their e-mail and for every new garage. Access is checked from the database on every request, so changes apply immediatelyGarage OwnerMust havePhase 1
FR-IAM-04Forgot / reset passwordThe user enters their e-mail and receives a 6-digit OTP by e-mail, valid for 2 minutes; after entering the OTP they set a new password (a short-lived reset token links the two steps). The answer does not reveal whether the e-mail has a user. All sessions are revoked on reset. Not applicable to Google-only usersAllMust havePhase 1
FR-IAM-05Integration API key managementGarage Owner/Platform Admin creates and revokes API keys for third-party integrations (if a garage connects its own external systems)Garage Owner, Platform AdminCould havePhase 16
FR-IAM-06Link / unlink Google accountAllow a user to link a Google account to an existing e-mail user, or unlink itAllShould havePhase 13
FR-IAM-07Interface languageThe web console is available in Vietnamese (default) and English; the choice is saved on the user and also selects the language of e-mailsAllMust havePhase 1
FR-IAM-08Platform administratorsPlatform Admin rights are granted to the users listed in the deployment configuration (PLATFORM_ADMIN_EMAILS); they hold every platform permission, including viewing any garage’s data without an owner’s approval (every access is logged), and manage plans and subscriptions (FR-LIC-05)Platform AdminMust havePhase 1 (extended in Phase 8)
FR-IAM-09Multi-factor authenticationUsers that sign in with e-mail and password can turn on MFA with a TOTP authenticator app and recovery codes. MFA is optional for every user (platform admins, owners, staff and customers alike) and is never enforced; the sign-in asks for a code only from a user who turned it on. Google sign-in relies on the Google account’s own 2-step verification and never asks for a code. Applies to the web consoles and to the owner, admin and technician apps; the customer app signs in with Google only, so it does not offer itAllShould havePhase 6
FR-IAM-10Platform roles, groups and admin staffThe Platform Admin creates platform roles (sets of platform permissions: plan, subscription, stats, garage directory, user lookup, platform staff, support, audit), platform staff groups, and invites users into a group; the group’s roles apply per request. Admin staff see only what their roles allow in the admin web and admin app. Platform users can protect their sign-in with the optional MFA (FR-IAM-09)Platform AdminMust havePhase 8
FR-IAM-11Read-only support access to a garageAdmin staff request a time-boxed, read-only support grant for one garage with a reason; the garage owner approves it. A Platform Admin needs no approval but gives a reason, and the owner is notified. A support session cannot change data or act as a user, shows a banner, and every read is audited. The owner sees a Support access log and can revoke a grant at once. Masking of sensitive fields and write access are not offered yetAdmin staff, Platform Admin, Garage OwnerMust havePhase 8
FR-IAM-12User profile nameA user can edit their full name. The name is a display name, taken from Google at first sign-in; Google sign-in never overwrites a name the user has edited (full_name_source). Names printed on invoices, vouchers and payments come from business records (the garage’s legal name, the customer’s tax profile, the payer on a voucher), never from the user’s display nameAllMust havePhase 1 (source tracking in Phase 5)

3.2. Tenant / Garage Management

Terminology note: in this document, “branch” and “garage” are used interchangeably. The user model is one owner – many garages: an owner (chain owner) registers a single user, then creates and manages multiple independent garages under that same user — each garage acts as one branch within the chain, with its own operational data, staff, and configuration, but sharing a single login and a single license subscription (see Section 3.3).

IDRequirement NameDescriptionActorPriorityPhase
FR-TEN-01Create garage profileEnter information for one garage: name, address, phone, e-mail and a logo (PNG/JPEG/WebP up to 1 MB). The legal identity used on documents and invoices is FR-TEN-06Garage OwnerMust havePhase 1
FR-TEN-02Create multiple garages under one userOwner creates additional garages under the same registered user (one owner – many garages model); each garage created is an independent operating unit, equivalent to one branch in a chain model. The owner can edit each garage and set its status to Active or Inactive (staff cannot use an inactive garage). The number of active garages is limited by the owner’s plan (FR-LIC-02)Garage OwnerMust havePhase 1
FR-TEN-03Switch active garageAllow a user to switch between the garages it owns or works in within the same session, without signing in againGarage Owner, StaffShould havePhase 1
FR-TEN-04Staff managementOnly existing VietGara users can become staff. A user with staff.write looks a user up by e-mail or phone and sends an invitation for the garage with the staff groups to join; the invitee receives an e-mail and accepts or declines in the web console (invitations expire after 7 days and can be revoked). Staff members are then assigned to groups, set Active/Inactive, or removed. The number of staff across the owner’s garages (members plus pending invitations) is limited by the planGarage Owner, ManagerMust havePhase 1
FR-TEN-05Garage configurationConfigure time zone (default Asia/Ho_Chi_Minh), displayed currency (default VND), weekly operating hours, quote/repair order/settlement numbering templates (e.g. BG-{YYYY}{MM}-{SEQ:4}), and the garage’s default quote approval mode (public link or manual, FR-QUO-02) per garage. Stored in Release 1.1; the numbering templates and default approval mode are applied when quotes, repair orders and settlements arrive in Releases 1.2–1.4. From Release 7.0 also the goods receipt and stock issue numbering templates and the stock issue mode (post when the order closes, or when work starts, FR-INV-20)Garage OwnerShould havePhase 1
FR-TEN-06Garage legal profileStore the garage’s legal company name, tax ID (mã số thuế), legal address, representative, bank account and logo. They print in the header of every document (quotes, repair orders, settlements, payment vouchers) and are the seller data of e-invoices (FR-EIN-02). Changing them never rewrites documents already issued: each document keeps a snapshotGarage OwnerMust havePhase 5

3.3. License Management

IDRequirement NameDescriptionActorPriorityPhase
FR-LIC-01Trial plan sign-upAutomatically create a 14-day trial subscription for the owner when its e-mail is verifiedSystemMust havePhase 1
FR-LIC-02Plan upgrade / downgradeThe subscription belongs to the owner and covers all its garages. Each plan sets limits on garages, staff and business transactions per day (quotes, repair orders and settlements created), e.g. Pro = 2 garages, 20 staff, 100 transactions/day, plus included features. The owner chooses another plan in the web console or the owner app and pays for it by bank transfer (FR-LIC-07); the new plan takes effect at once when the platform admin approves the payment (FR-LIC-08), so an upgrade, a downgrade and a billing-cycle change follow the same rule. Usage is validated against the new plan’s limits (garages, staff) when the request is submitted and again at approval; a plan the usage exceeds is refused with PLAN_LIMIT_REACHED, and the limits are listed so the owner knows what to reduce. The trial plan is given once, by the system, at sign-up (FR-LIC-01) and is never offered again. The unused part of the current period is credited against the new price (FR-LIC-09). Until the payment is approved the current plan stays in forceGarage OwnerMust havePhase 1 / Phase 5 (manual payment) / Phase 16 (online payment)
FR-LIC-03Automatic subscription renewalAutomatically renew on the subscribed cycle, charging the saved payment method at the price of the plan then in effect; it replaces the manual renewal request of FR-LIC-07SystemMust havePhase 16
FR-LIC-04Expiry alerts & read-only modeNotify the owner 7 days before the period ends, with the platform’s payment instructions and the amount to renew (FR-LIC-07); switch to read-only mode during the grace period if not renewed, then suspend. The owner is e-mailed when the subscription becomes past due (read-only until the end of the grace period) and again when it is suspended, each time with the amount and the platform’s payment instructions. A payment approved at any time reactivates the subscriptionSystemMust havePhase 1 / Phase 5 (payment instructions)
FR-LIC-05Plan management (platform side)Platform Admin creates and edits plans with price, billing cycle, limits, included features, visibility and availability; looks up subscriptions and extends them manually (a correction or goodwill, FR-LIC-08 is the normal way to renew). Provided in the vietgara-admin-web appPlatform AdminMust havePhase 1
FR-LIC-06Add garages beyond plan limitCharge an additional fee when an owner adds garages beyond the plan’s limit (BranchLicense)Garage OwnerShould havePhase 16
FR-LIC-07Plan payment requestTo change plan or renew, the owner starts a request and is shown the amount due (new price minus the credit of FR-LIC-09), the platform’s bank details with a QR code (FR-LIC-10) and a unique transfer reference such as VG-7K2M9Q to write in the transfer note; the request waits for the payment. After transferring, the owner submits the payer’s name, bank and account, the amount transferred, the bank’s transaction reference, the date and a screenshot of the evidence. The request is validated against the plan’s limits (FR-LIC-02). An owner has one open request at a time (one that is still waiting for payment is replaced by a new one), can cancel it before it is reviewed, and a submitted request never expires, because the money has already moved. When the credit covers the whole price the amount due is 0: no transfer and no evidence are needed, and the platform admin still approves. The amount quoted at submission is the amount honoured at approval. The owner sees the request’s status and, when rejected, the reason, and may submit againGarage OwnerMust havePhase 5
FR-LIC-08Payment review and approvalPlatform Admin works a review queue of submitted requests with the owner, plan, quoted and declared amounts and the evidence. Approve applies the plan at once in one transaction: the plan and its limits take effect, a new period of the plan’s billing cycle starts at approval (the unused days of a trial are lost; a renewal of the current plan before its end extends from the old end date, one after expiry restarts from approval and reactivates the subscription), the amount paid is recorded on the period, a surplus is added to the account credit (FR-LIC-09) and the entitlements are refreshed. The limits are validated again; an approval that would exceed them is refused with the reason. When the amount transferred differs from the quote the admin sees a warning, resolves it with the owner and may still approve with a note. Reject needs a reason, which the owner sees. The admin is e-mailed when a request arrives and reminded every day while requests wait; the owner is e-mailed on approval and rejection. Every decision is auditedPlatform AdminMust havePhase 5
FR-LIC-09Proration and account creditChanging plan before the period ends credits the owner for the unused part of the current period: credit = whole unused days ÷ days of the period × the price of that period (what was paid, credit included), rounded down to whole dong; a trial period was paid 0. The amount due is the new plan’s full price minus the available credit, never below 0. When the credit exceeds the new price (a downgrade) the surplus becomes account credit, applied automatically to the next payment; refunds are paid manually by the platform outside the system. Every credit movement is kept in a ledger the owner can seeGarage OwnerMust havePhase 5
FR-LIC-10Platform payment detailsPlatform Admin edits the bank, account number, account holder, branch, transfer instructions and an uploaded QR code image that owners are shown with every request, in the vietgara-admin-web and vietgara-admin-app apps. Every change is audited with who and when, and a request keeps the instructions that were shown when it startedPlatform AdminMust havePhase 5
stateDiagram-v2
  [*] --> Trial: e-mail verified
  Trial --> Active: payment approved
  Trial --> PastDue: trial ends
  Active --> Active: plan change or renewal approved
  Active --> PastDue: period ends
  PastDue --> Active: payment approved / extended
  PastDue --> Suspended: grace period ends
  Suspended --> Active: payment approved / extended
  note right of PastDue: read-only
  note right of Suspended: locked

3.4. Customer & Vehicle Management

IDRequirement NameDescriptionActorPriorityPhase
FR-CUS-01Create/edit customer profileStore customer information: name, phone, email, address. A customer is a garage-owned profile and needs no VietGara user: staff create a customer (a “walk-in customer”) when the person does not want a user. When the person has a user, the profile is linked to it (FR-CUS-06)Service AdvisorMust havePhase 1 (profile) / Phase 5 (user optional, FR-CUS-06)
FR-CUS-02Register vehicle profileStore license plate, make/model, chassis number, engine number, year, linked to one customer. Identity fields (plate, chassis, engine number, make, model, year) can be edited only while no live document refers to the vehicle (quote, repair order, settlement, booking or claim; a deleted quote does not count; all six fields lock together). Other fields (colour, notes, odometer) are always editable. A locked field is changed by a correction (FR-CUS-09)Service AdvisorMust havePhase 1 (edit lock in Phase 5)
FR-CUS-03Look up repair history by vehicleView the complete history of quotes/repair orders/settlements for a specific vehicleService Advisor, Garage OwnerMust havePhase 1
FR-CUS-04(moved)Moved to FR-SUP-01 (Section 3.23): a supplier is not a customer. The directory of suppliers is no longer part of the Customer & Vehicle group——Phase 5
FR-CUS-05Personal data subject requestsAllow customers to request to view/edit/delete their personal data in accordance with Decree 13/2023/ND-CPEnd CustomerMust havePhase 13
FR-CUS-06Find and link a customer with a userWhile preparing a quote, staff search the garage’s customers (name, phone, e-mail or plate). When the profile has an e-mail that is the verified e-mail of a VietGara user, staff can send a link request; the garage learns only that a request was sent, never who the user is, and a request for an e-mail nobody owns is refused. The user confirms with the one-time code sent to their e-mail (which staff enter), or accepts or declines in the Customer App; either side can end the link and the profile stays. A customer has at most one current link; declined and ended links stay as history. A user’s verified e-mail still links matching profiles automatically at sign-in, but only when the profile has never had a link with that user (a refusal or an unlink is respected, and a request still waiting is answered in the app) and no other user is linked to it. If the person has no user or declines, staff keep or create a walk-in customer without one. Phone matching needs a verified, normalized (E.164) phone and waits for phone sign-in (Release 2.4); until then a link is matched by e-mail only. Link changes are audited without naming the userService Advisor, End CustomerMust havePhase 5
FR-CUS-07Customer tax profilesA customer has tax profiles of two kinds in one list: at most one personal and any number of company profiles (legal name, tax ID, address, e-mail for invoices; one marked default, which a deactivated profile loses). The tax ID is optional but format-checked (10 digits, or 13 with the branch suffix; spaces, dots and dashes typed are dropped). A quote picks the billing party, and the choice is kept as a snapshot on the quote, carried to its repair order and starting the settlement, which can change it later; PDFs and payment vouchers print it, and the voucher’s payer defaults to it. When no party is chosen the customer’s default profile is used (retail if there is none); choosing retail on purpose bills the customer under their own name. A settlement can be marked invoice requested only when its billing party is complete (legal name, tax ID and address, for a personal or a company profile); otherwise the request is refused (INVOICE_DATA_INCOMPLETE) and the document stays a retail receipt. A profile a quote or settlement was billed to is deactivated instead of deleted (FR-CAT-07). Used by documents (FR-DOC-01) and e-invoices (FR-EIN-02). Which identity an individual buyer must show is to be confirmed with the garage’s accountantService Advisor, Garage AccountantMust havePhase 5
FR-CUS-09Correct a locked vehicle fieldA garage staff member who holds the permission customer.correct (the Manager role and the owner have it; it includes customer.read) can correct one identity field of a vehicle that live documents use, with a mandatory reason. The correction is audited with the values before and after; documents keep the value they snapshotted. If the vehicle really changed, the garage deactivates it and creates a new one; if it was sold, an owner-change action (reason optional, audited) moves it to another customer of the garage and keeps its history. An ordinary edit never changes the owner. The API tells the screens which fields are locked (editable, lockedFields) and refuses a locked edit with VEHICLE_FIELD_LOCKEDGarage staff with customer.correctMust havePhase 5

3.5. Quote & Pricing

IDRequirement NameDescriptionActorPriorityPhase
FR-QUO-01Create a quoteSelect customer (found by phone or e-mail, FR-CUS-06), vehicle and vehicle owner, add labor/part line items, system automatically calculates each line total and the quote total. From Phase 7 a line can come from the job catalogue (FR-CAT-06). Numbered from the garage’s quote numbering template (FR-TEN-05); counts against the plan’s daily transaction limit (FR-LIC-02)Service AdvisorMust havePhase 1
FR-QUO-02Send quote for customer approvalThe gara owner chooses, per quote (default from the garage’s own setting, FR-TEN-05), how the customer approves: Link — a public, no-login viewing/approval link is generated and e-mailed to the customer automatically when they have an e-mail on file (at minimum notifying them of the proposed work), or shared by the advisor by any other channel; or Manual — no link or e-mail is produced, for garages that only ask the customer face to faceSystemMust havePhase 1 (web link) / Phase 11 (in the Customer App, FR-CAPP-03)
FR-QUO-03Approve/reject quoteThe customer’s acceptance or rejection of each individual line item is recorded either by the customer themself through the public link (Link mode) or by a staff member on the customer’s behalf (Manual mode, or as an override of Link mode, e.g. the customer decided by phone). The quote as a whole is Approved once at least one line is approved, otherwise RejectedEnd Customer, Service AdvisorMust havePhase 1
FR-QUO-04Convert quote to repair orderAfter the quote is approved, create a draft repair order preserving only the approved line items; counts separately against the plan’s daily transaction limit. Full repair-order management (technician assignment, Kanban board, progress) arrives with the Repair Order module in Release 1.3Service AdvisorMust havePhase 1
FR-QUO-05Print / export quote as PDFExport the quote as a PDF using the garage’s templateService AdvisorMust havePhase 1

3.6. Repair Order

IDRequirement NameDescriptionActorPriorityPhase
FR-REP-01Create repair orderGenerate a repair order from an approved quote, or create one directly for ad-hoc workService AdvisorMust havePhase 1
FR-REP-02Assign techniciansAssign one or more technicians to each line item within the repair orderService AdvisorMust havePhase 1
FR-REP-03Update progressTechnician updates the status of each line item: not started / in progress / completed. The repair order’s own status is derived from its lines: open, in progress, completed or closed, plus waiting_on_parts for an order blocked on a part that is not in stock (the Kanban board’s fifth column)TechnicianMust havePhase 1 (web) / Phase 11 (app)
FR-REP-04Before/after repair photosAttach photos documenting vehicle condition before and after repair to the repair orderTechnicianShould havePhase 11
FR-REP-05Real-time progress trackingCustomer views their vehicle’s repair progress in real time via the Customer AppEnd CustomerShould havePhase 11
FR-REP-06Close repair orderMark all line items as complete, lock further edits, move to the settlement stepService AdvisorMust havePhase 1
FR-REP-07Change the lines of an open repair orderAdd, edit (description, part, quantity, unit, price) and remove lines of a repair order that is not closed or cancelled; the total and status follow, and the draft stock issue follows the part lines. After the stock issue is posted the parts are fixed, but labor lines and prices stay editableService AdvisorShould havePhase 7 (Release 7.3)
FR-REP-08Cancel a repair orderCancel an order that is open or waiting on parts and has no started work: its draft stock issue is cancelled and the reservation released. The quote it came from stays converted. Refused once work has started or the stock issue is postedService AdvisorShould havePhase 7 (Release 7.3)

3.7. Inventory Management

Quantities are always kept in the part’s base unit (FR-CAT-02); how stock is received, issued, counted and corrected is described step by step in Business Procedures P11 to P13.

IDRequirement NameDescriptionActorPriorityPhase
FR-INV-01Stock receiptRecord a goods receipt from a supplier, updating on-hand quantity and average cost. From Release 7.0 a receipt is a goods receipt document (FR-INV-06); the single-part receipt of Release 1.3 is replacedInventory StaffMust havePhase 1 (document in Phase 7)
FR-INV-02Stock issueParts consumed by a repair order are issued through the stock issue document of FR-INV-20 and automatically decrement stockSystem (triggered from Repair Order)Must havePhase 1 (document in Phase 7)
FR-INV-03Stock lookupView current on-hand quantity per part code, per branchInventory Staff, Garage OwnerMust havePhase 1
FR-INV-04Low-stock alertsSend a notification when a part’s stock falls below a configured thresholdSystemShould havePhase 10
FR-INV-05Periodic in/out/on-hand reportExport a stock movement report by month/quarter/yearGarage Owner, Inventory StaffMust havePhase 1
FR-INV-06Goods receipt documentA multi-line goods receipt with number from the garage’s template, date, delivery note number and notes; status draft, completed, cancelled. Every line records its supplier (a garage supplier, FR-SUP-01); the header supplier is only a default that lines inherit and may override, and a receipt cannot be completed while a line has no supplier. Lines are added by search; barcode scanning and Excel import come with Release 7.2. Completing updates stock and cost; cancelling a completed receipt reverses it, and is refused when part of that stock has already been usedInventory StaffMust havePhase 7 (done in Release 7.0)
FR-INV-07Weighted-average cost and valuationEach completed receipt updates the part’s weighted-average cost; every stock issue keeps a cost snapshot. A valuation report shows quantity and value per part and category at a date, as Excel tooInventory Staff, Garage AccountantMust havePhase 7 (done in Release 7.0)
FR-INV-08Cost visibility permissionCost, average cost and valuation are visible only with inventory.cost.read. By default managers and accountants have it; advisors and technicians see quantities onlyGarage OwnerMust havePhase 7 (done in Release 7.0)
FR-INV-09Stock write-offReduce stock with a reason (damaged, lost, expired, internal use, warranty replacement) at average cost, as a numbered document. The document is posted when created and is refused beyond the quantity on hand; cancelling it puts the parts back at their costInventory StaffMust havePhase 7 (done in Release 7.1)
FR-INV-10Return to supplierA numbered document that reduces stock and records the supplier credit, linked to the supplier and, where known, to a completed goods receipt of that supplier. A line without a typed cost takes the cost of that receipt, else the average cost; the credit is the sum of the lines’ amounts. Cancelling it puts the parts backInventory StaffShould havePhase 7 (done in Release 7.1)
FR-INV-11Return of unused parts from a repair orderReturn a part line of a repair order to stock, reversing its cost, with a reason (required). Possible only once the order’s stock issue is posted, up to the quantity issued on that line. The record is immutable and does not change the order’s lines or the billingService Advisor, Inventory StaffShould havePhase 7 (done in Release 7.1)
FR-INV-12Stock countA stock-count document: counted quantity per line against the system quantity, shown as matched, over, short or uncounted; draft save and merge of drafts; completing posts adjustments so stock equals the count and records the value of the difference at average cost, and the count is then read-only; cancelling a completed count posts its reversal; Excel exportInventory StaffMust havePhase 7 (done in Release 7.1)
FR-INV-13BarcodesUp to 20 barcodes per part, unique in the garage without regard to case; each is for the base unit or a packaging unit (a case barcode stands for a case). Scanning with the phone camera (or a USB scanner, which types into the field) adds a line to a receipt or a count, or opens the part; a code no part has is told on the spot. Label printing arrives with thermal printingInventory StaffShould havePhase 7 (scan, done in Release 7.2) / Phase 14 (labels)
FR-INV-14Excel importImport parts (with units, categories, brand, barcodes, opening quantity, cost and a supplier per row), goods receipts and stock counts from a downloadable template: upload, a preview that lists every problem with its row and column, then confirm. A file is imported as a whole or not at all; the same file cannot be imported twice. Opening stock is posted as one completed goods receipt; receipt and count files make a draft. Up to 5,000 rows and 5 MBInventory Staff, Garage OwnerShould havePhase 7 (done in Release 7.2, web console)
FR-INV-15Stock reservationThe draft stock issue of a repair order (FR-INV-20) is the reservation: a part shows on hand, reserved (in draft issues) and available. The reservation is consumed when the issue is posted and released when the repair order is cancelled (FR-REP-08). Reservations are served first come, first served per part; a repair order whose draft issue the stock on hand cannot cover is waiting on parts, and comes back by itself when stock arrives or another order frees it. It never blocks the workSystemShould havePhase 7 (reserve in 7.0; waiting on parts and release in 7.3)
FR-INV-16Purchase ordersCreate purchase orders per supplier from the low-stock list; printable and e-mailed; shown to the supplier in the supplier portal from Phase 17; receiving pre-fills a goods receiptInventory StaffShould havePhase 13
FR-INV-17Supplier payablesEach completed goods receipt creates payables per supplier of its lines; payment-out vouchers allocate against it; payables list by supplier and age, and Excel exportGarage AccountantShould havePhase 13
FR-INV-18Transfer between garagesAn owner moves parts between their garages with a two-step document (ship, receive), each step scoped to one garageGarage Owner, Inventory StaffCould havePhase 15
FR-INV-19Part suppliersA part lists its usual suppliers with the supplier’s own code and the last cost paid, and one default supplier. The default pre-fills the supplier of a receipt line; purchases by supplier and period are reported from completed receipts. Purchase orders (FR-INV-16) will group by supplier tooInventory StaffShould havePhase 7 (done in Release 7.0)
FR-INV-20Stock issue document (phiếu xuất kho)Creating a repair order automatically creates a numbered draft stock issue listing every part line of the order, printable; lines added, removed or changed on the order update the draft until it is posted. Posting writes the stock movements. By default it posts when the order is closed; inventory staff can post earlier (“issue now”) when parts leave the shelf, and a garage setting can post when the order starts. After posting, corrections are returns or adjustments (FR-INV-09..11). Stock is not deducted at creation, because orders are cancelled and parts are not yet takenSystem, Inventory StaffMust havePhase 7 (done in Release 7.0)

3.8. Billing & Settlement

IDRequirement NameDescriptionActorPriorityPhase
FR-BIL-01Create settlementAggregate costs from a closed repair order and calculate the final totalGarage AccountantMust havePhase 1
FR-BIL-02Allocate customer-paid / insurance-paid amountsWithdrawn in Release 5.0. A settlement has a single payer, the customer. Splitting a settlement with an insurer returns, designed around insurance claims, as FR-INS-05Garage AccountantMust havePhase 1 (withdrawn in Phase 5, returns in Phase 17)
FR-BIL-03Record paymentRecord the amount actually collected and the payment method (cash/bank transfer/online payment). Each recorded payment produces a payment voucher (FR-BIL-05)Garage AccountantMust havePhase 1
FR-BIL-04Issue e-invoice from settlementAutomatically trigger an e-invoice issuance request as soon as a settlement is confirmedSystemMust havePhase 16
FR-BIL-05Payment voucher (phiếu thu)Every recorded payment gets its own voucher numbered from the garage’s voucher numbering template, with the payer’s name and address (or the billing company of FR-CUS-07), the reason for payment, amount in figures and words, method, the collector and signature blocks. It can be printed as a PDF (FR-DOC-01) in the 01-TT layoutGarage AccountantMust havePhase 5
FR-BIL-06Void a payment voucherA wrong payment can be voided with a reason. The voucher stays on file marked void and the settlement totals are recalculated; the audit log records who voided itGarage AccountantMust havePhase 5
FR-BIL-07Payment-out voucher (phiếu chi)Record money paid out, for example to a supplier after a stock receipt, with its own numbered voucherGarage AccountantShould havePhase 13

3.9. Receivables

IDRequirement NameDescriptionActorPriorityPhase
FR-REC-01Track customer receivablesList of settlements not yet fully collected, per customer: the settlement list filtered to pending and partially paid (outstandingOnly), each row carrying its customer; a receivables model with reminder state arrives in Phase 13Garage AccountantMust havePhase 1
FR-REC-02Track insurance receivablesList of amounts pending payment from insurers, per claimGarage AccountantMust havePhase 17
FR-REC-03Automated payment remindersSend payment reminder notifications to customers on a configured schedule (e.g. 3 days, 7 days overdue)SystemShould havePhase 13
FR-REC-04Receivables reconciliationExport a periodic receivables reconciliation report for accounting purposesGarage AccountantMust havePhase 13

3.10. Insurance Integration

IDRequirement NameDescriptionActorPriorityPhase
FR-INS-01Create an insurance claimFrom a repair order of a vehicle with a claim, staff create a claim record: insurer (from the garage’s insurers, FR-INS-07), policy number, incident date, place and a short description. The claim is a tracking workflow around the repair; the vehicle owner files the claim with the insurerService AdvisorMust havePhase 17
FR-INS-02Notification and assessment deadlinesThe claim shows its deadlines and reminds staff and the owner: the insurer must be told in writing or through its app or e-mail within 5 working days of the incident (Decree 67/2023/ND-CP), and the insurer’s assessor inspects the vehicle within 24 hours. Staff attach the assessment report (biên bản giám định)Service Advisor, End CustomerMust havePhase 17
FR-INS-03Insurer-agreed quote and document checklistThe garage’s quote is versioned as the insurer-agreed quote once cost and repair method are agreed. A checklist tracks the claim file: vehicle registration, driver’s licence, ID card of the owner or driver, insurance certificate or e-policy, accident report (police, if any), damage and assessment reports, repair invoice and vouchers. The vehicle owner can upload documents in the Customer AppService Advisor, End CustomerMust havePhase 17
FR-INS-04Track claim statusClaim status: reported / assessed / quote agreed / file submitted / under review / approved / rejected / paid, with the expected review time (3-5 days for small losses, 7-15 days for complex ones)Garage Accountant, Service AdvisorMust havePhase 17
FR-INS-05Split settlement with the insurerWhen a claim is approved, the settlement splits into the owner’s deductible or out-of-cover part and the insurer’s payable part. Payments from the insurer are recorded against the claim, and receivables (FR-REC-02) followGarage AccountantMust havePhase 17
FR-INS-06Submit the claim filePackage the file according to the insurer’s template for manual e-mail or portal submission, or submit by API where the insurer supports it (PVI, PTI, Bao Viet first)Service Advisor, SystemShould havePhase 17
FR-INS-07Manage insurersThe garage keeps its own directory of insurers (name, hotline, claim e-mail or portal, claim file template). An insurer is a record of the Insurance module: it is never a customer (the policy holder is the vehicle’s customer) and never a supplierGarage Owner, Service AdvisorMust havePhase 17

3.11. Payment Gateway Adapter

IDRequirement NameDescriptionActorPriorityPhase
FR-PAY-01Online payment for customersCustomer pays a settlement via VNPay/Momo/ZaloPay directly in the Customer App or via a payment linkEnd CustomerMust havePhase 16
FR-PAY-02Payment confirmation via webhookReceive a webhook confirming a successful transaction from the payment gateway and automatically update receivables statusSystemMust havePhase 16
FR-PAY-03Platform subscription paymentGarage owner pays the recurring License fee via a saved payment method; it replaces the manual transfer and review of FR-LIC-07 and FR-LIC-08Garage OwnerMust havePhase 16

3.12. E-Invoice Service

IDRequirement NameDescriptionActorPriorityPhase
FR-EIN-01Connect e-invoice provider accountGarage owner enters their VNPT or Viettel user/contract details to activate the integrationGarage OwnerMust havePhase 16
FR-EIN-02Issue e-invoiceSend an invoice issuance request to the connected provider and receive the invoice number and digital signature statusSystemMust havePhase 16
FR-EIN-03Look up invoice statusView invoice status: issued / submitted to tax authority / cancelledGarage AccountantMust havePhase 16
FR-EIN-04Cancel/adjust invoiceSubmit a cancellation or issue an adjustment invoice in accordance with current regulationsGarage AccountantShould havePhase 16

3.13. Document/Print Service

IDRequirement NameDescriptionActorPriorityPhase
FR-DOC-01Export quote/repair order/receipt as PDFGenerate a PDF using the garage’s standard template for each document type. From Release 7.0 also the goods receipt (FR-INV-06) and the stock issue (FR-INV-20)All (per permission)Must havePhase 1 (goods receipt and stock issue: Release 7.0)
FR-DOC-02Export reports as ExcelExport reports to Excel: inventory movement (Phase 1; from Phase 6 in the part’s units, FR-CAT-02), purchases by supplier and stock valuation (Release 7.0, FR-INV-07 and FR-INV-19), stock count (Release 7.1, FR-INV-12), revenue (Phase 6) and receivables (Phase 13)Garage Owner, Garage AccountantMust havePhase 1 / 6 / 13
FR-DOC-03Customize document templatesAllow a garage to design its own templates for printed documents. Provided as the constrained template designer of FR-DOC-09Garage OwnerCould havePhase 14
FR-DOC-04Print templates and paper sizesEach printable document (quote, repair order, settlement, payment voucher, stock receipt and issue voucher) has built-in templates per paper size. A4 (210 x 297 mm) is the default, used for detailed quotes, part lists and warranty terms; A5 (148 x 210 mm) serves payment slips and short quotes. A garage picks its default template and paper size per document type. Every template renders one stable print model per document typeGarage Owner, All (per permission)Must havePhase 10
FR-DOC-05Print from web and mobilePrint through the system print dialog on the web, and through the OS print and share sheet (AirPrint, Android print) in the mobile apps. Any printer the device already knows, including network printers, worksAll (per permission)Must havePhase 10
FR-DOC-06Thermal receipt printingRoll-paper templates (K80 and K57) for payment vouchers and quick quotes, rendered as ESC/POS for thermal printersAll (per permission)Should havePhase 14
FR-DOC-07LAN printer discovery and direct printing (mobile)The mobile apps find network printers by mDNS (and manual IP entry), store the garage’s printers and print directly (ESC/POS over TCP 9100 for thermal, IPP for A4). Web browsers cannot discover printers, so the web uses FR-DOC-05 or FR-DOC-08Garage Owner, Service AdvisorShould havePhase 14
FR-DOC-08Print agentAn optional local agent on a garage PC lists the PC’s printers and prints jobs from the web silently, over an outbound secure connection to VietGaraGarage OwnerCould havePhase 14
FR-DOC-09Template designerA garage designs its own templates with blocks (header with logo, parties, items table with chosen columns, totals, footer, notes) over a whitelist of print-model fields, with a live preview. Templates are versioned and a printed document keeps the version it used. No free-form HTMLGarage OwnerCould havePhase 14
FR-DOC-10E-invoice printoutAn e-invoice is printed from the PDF the invoice provider returns, not from a VietGara template. Until e-invoicing ships (Phase 16) VietGara prints a payment slip or voucher, never a tax invoiceAll (per permission)Must havePhase 16

3.14. Notification Service

IDRequirement NameDescriptionActorPriorityPhase
FR-NOT-01SMS notificationsSend SMS to customers on important updates (new quote, vehicle ready)SystemMust havePhase 16
FR-NOT-02Zalo ZNS notificationsSend official notifications via the Zalo channel to customers with a verified phone numberSystemShould havePhase 16
FR-NOT-03In-app push notificationsSend push notifications to the Owner, Admin, Customer and Technician AppsSystemMust havePhase 11
FR-NOT-04Email notificationsSend e-mails for key events in the recipient’s language: verification and password-reset OTPs, staff invitations, registration confirmation, license renewal reminders and past-due and suspension notices with the payment instructions, plan payment decisions and the admin’s review reminders (FR-LIC-07, FR-LIC-08) (Mailjet in staging/production). Invoices are sent with FR-EIN-02SystemMust havePhase 1 / Phase 5
FR-NOT-05Expanded e-mail notificationsE-mail customers and garage staff at each hand-off, in the recipient’s language: quote ready, quote approved/rejected, vehicle ready, settlement receipt (PDF attached), payment received. Each garage chooses which are sent; customers can opt out of non-essential e-mails; every send is logged and retriedSystemShould havePhase 10

3.15. Reporting & Analytics

IDRequirement NameDescriptionActorPriorityPhase
FR-RPT-01Periodic revenue reportRevenue statistics by day/month/quarter/year for a single garageGarage OwnerMust havePhase 1
FR-RPT-02Technician performance reportStatistics on completed repair orders and average turnaround time per technicianGarage OwnerShould havePhase 13
FR-RPT-03Multi-branch consolidated dashboardConsolidated revenue, inventory, and receivables figures across all branches of a garage chainGarage OwnerShould havePhase 15
FR-RPT-04Custom report exportFilter and export reports by custom date range, branch, and service typeGarage Owner, Garage AccountantCould havePhase 15
FR-RPT-05Profit per repair order and jobRevenue less the cost snapshots of consumed parts, per repair order and in a report by period, job and technician; visible only with inventory.cost.readGarage Owner, Garage AccountantShould havePhase 13

3.16. Customer App

IDRequirement NameDescriptionActorPriorityPhase
FR-CAPP-01Login/registerAuthenticate the customer with Google or by OTP sent to the phone number (open within Release 2.4). A user is optional for being a garage’s customer (FR-CUS-01)End CustomerMust havePhase 2
FR-CAPP-02View vehicle list & historyView registered vehicles and each vehicle’s repair historyEnd CustomerMust havePhase 2
FR-CAPP-03Approve quotes & track progressView and approve/reject quotes; track repair progress in real timeEnd CustomerMust havePhase 11
FR-CAPP-04Pay & receive e-invoiceMake an online payment and receive the e-invoice directly in the appEnd CustomerMust havePhase 16
FR-CAPP-05Accept a garage link requestSee the garages that hold a customer profile for the user: link requests waiting for an answer and the garages already linked. Accept or decline a request, or end a link. Records linked by the verified e-mail appear without a request (FR-CUS-06). Suppliers never appear hereEnd CustomerMust havePhase 5
FR-CAPP-06Book an appointmentPick a garage, a vehicle, jobs and a slot, and see, change or cancel bookings (FR-BKG-03)End CustomerMust havePhase 12

3.17. Technician App

IDRequirement NameDescriptionActorPriorityPhase
FR-TAPP-01Receive assigned repair order listView the list of work assigned for the day, sorted by priorityTechnicianMust havePhase 2
FR-TAPP-02Offline-first progress updatesUpdate work status even while offline, automatically syncing once connectivity is restoredTechnicianMust havePhase 11
FR-TAPP-03Capture & upload before/after photosTake photos directly within the app and attach them to the corresponding repair orderTechnicianMust havePhase 11

3.18. Owner App

IDRequirement NameDescriptionActorPriorityPhase
FR-OAPP-01Sign in & garage switcherSign in with e-mail and password, verify the e-mail, reset the password, accept invitations and switch between the owner’s garagesGarage OwnerMust havePhase 2
FR-OAPP-02Follow up quotes & repair ordersSend quotes, record the customer’s decision, convert to a repair order; update line progress and technicians, close ordersGarage OwnerMust havePhase 2
FR-OAPP-03Receivables & documentsSee outstanding settlements, record payments with their vouchers, share quote/repair order/receipt PDFsGarage OwnerMust havePhase 2
FR-OAPP-04Dashboard & subscriptionRevenue, orders in progress, low stock and receivables at a glance; plan, usage, plan change and renewal with the payment request of FR-LIC-07 and its statusGarage OwnerMust havePhase 2 / Phase 5

3.19. Admin App

IDRequirement NameDescriptionActorPriorityPhase
FR-AAPP-01Platform admin sign-inSign in for users listed as platform admins only (MFA per NFR-SE-04); other users are refusedPlatform AdminMust havePhase 2
FR-AAPP-02Plans & subscriptions on mobileList and edit plans (FR-LIC-05); search subscriptions and extend one manually; work the payment review queue (FR-LIC-08) and edit the platform payment details with the QR code (FR-LIC-10)Platform AdminMust havePhase 2 / Phase 5
FR-AAPP-03Platform dashboards on mobileThe Platform Analytics figures of Section 3.20Platform AdminShould havePhase 12

3.20. Platform Analytics

Aggregate figures for VietGara’s own operators, in the admin web and the Admin App. Counts only, never a garage’s business data. Each figure can be bucketed by day, month or year over a chosen date range, and exported as CSV.

IDRequirement NameDescriptionActorPriorityPhase
FR-ADM-01New joinersNew users, verified users and new garages per day / month / yearPlatform AdminMust havePhase 12
FR-ADM-02LicensesNew trials, trial-to-paid conversions, plan upgrades/downgrades, subscriptions that became past due, suspended or cancelled, and active subscriptions by plan, per day / month / yearPlatform AdminMust havePhase 12
FR-ADM-03Platform activityActive garages (a quote, repair order or settlement in the last 30 days) and platform-wide transactions per dayPlatform AdminShould havePhase 12

3.21. Catalogue & Reference Data

Implemented by the Catalogue module (HLD #18): the part itself (including its selling price, brand and category), units, conversion, images and, from Phase 7, jobs. The quantities of a part belong to the Inventory module (HLD Section 3.1). Catalogue is guarded by its own permissions, catalogue.read and catalogue.write (Release 6.0, FR-IAM-03).

Shared reference data a garage manages itself: units of measure, parts, part categories and jobs. FR-CAT-07 applies to every object in this document that a user can delete.

IDRequirement NameDescriptionActorPriorityPhase
FR-CAT-01Units of measureAdd, edit and delete the garage’s units of measure (piece, litre, can, case, hour, …). Every part has one base unitGarage Owner, Inventory StaffMust havePhase 6
FR-CAT-02Unit conversionPer part, define packaging units with a factor to the base unit (for example 1 case = 24 cans, a different factor per part). Stock is kept in the base unit. Stock receipts, stock issues and quote lines accept any unit of the part and are converted when saved; reports show bothInventory StaffMust havePhase 6
FR-CAT-03Part categories and brandsParts belong to a category tree of up to three levels (for example Engine oil > Synthetic) and have a brand. Lists and pickers search and filter by SKU, name, category and brandInventory Staff, Service AdvisorMust havePhase 6
FR-CAT-04Part imagesUpload one to three images per part (PNG/JPEG/WebP) for easier recognition in lists and pickersInventory StaffShould havePhase 6
FR-CAT-05Job catalogueAdd, edit and delete jobs (types of work): name (unique in the garage), a category label, standard labor price and duration, and up to 30 suggested parts with a default quantity and unit. Follows the delete-or-deactivate rule (FR-CAT-07); a job is quoting data, so it needs the quote permissionsGarage Owner, Service AdvisorMust havePhase 7 (Release 7.3)
FR-CAT-06Pick jobs when quotingWhile creating a quote, staff pick a job; the system adds the labor line at the job’s labor price and one line per suggested part at the part’s current price, in the suggested unit, which stay editable. A deactivated job is not offered; a quote that already used it keeps its linesService AdvisorMust havePhase 7 (Release 7.3)
FR-CAT-07Delete or deactivateDeleting an object checks whether anything references it. An object used nowhere is soft-deleted. An object in use is only deactivated: it disappears from pickers but stays on the documents that use it, and staff can reactivate it. The confirmation dialog tells which will happen. Soft deletion is not erasure of personal data (see FR-CUS-05)All (per permission)Must havePhase 5 (rule and first entities), then every new entity
FR-CAT-08Hidden consumables on a jobA suggested part of a job can be marked non-billable (grease, screws). Its line has no price, is left out of the quote total, the public approval page, the PDFs and the customer’s decisions; it goes to the repair order with its job, its stock is deducted, and its cost stays on the stock issue for the profit reportsGarage OwnerShould havePhase 7 (Release 7.3)
FR-CAT-09Part selling priceA part has a selling price per base unit (VND), which is what the customer pays, separate from its cost (what the garage pays, FR-INV-07). A packaging unit uses the base price times its factor unless it has its own price. Part lines on quotes and the job picker prefill from it; changing a price never changes existing quotes. Cost is hidden without inventory.cost.read, the price is visible to anyone who can quote. A warning shows when a price is below the average costGarage Owner, Inventory StaffMust havePhase 6

3.22. Scheduling

Customers book appointments with a garage. Requirements follow the design recommendations of Release Plan Phase 12.

IDRequirement NameDescriptionActorPriorityPhase
FR-BKG-01Booking settingsPer garage: working hours, holidays and blocked periods, slot length, capacity per slot (vehicles taken at once), minimum lead time, cancellation window, and auto-confirm or manual confirm. Times follow the garage’s time zone (FR-TEN-05)Garage OwnerMust havePhase 12
FR-BKG-02Slot availabilityFree slots are computed from the settings and existing bookings when read, never stored in advance. A booking is created with a database-level capacity check so two customers cannot take the last slotSystemMust havePhase 12
FR-BKG-03Customer booking in the appA customer with a user books a garage, a vehicle, one or more jobs from the job catalogue and a slot, and can see, reschedule or cancel their bookingsEnd CustomerMust havePhase 12
FR-BKG-04Public booking pageEach garage has a public page and QR code (/b/:garageSlug). A person without a user verifies their e-mail by OTP and a walk-in customer is created (FR-CUS-01). An unverified booking holds its slot for 15 minutes onlyEnd CustomerMust havePhase 12
FR-BKG-05Confirm, reject and manageStaff see bookings on a calendar (web and owner app), confirm or reject requests, create bookings by hand and mark a customer as arrived or no-showService AdvisorMust havePhase 12
FR-BKG-06RemindersPush notification to the customer 24 hours before the slot when the customer has a linked user (the Customer App is the main channel), e-mail otherwise, and notices to staff on new requests and cancellations. SMS and Zalo are added with Phase 16SystemShould havePhase 12
FR-BKG-07Convert to quote or repair orderCreate a quote or repair order from a booking with the customer, vehicle and jobs prefilled. The new document counts toward the plan’s daily limit, the booking does notService AdvisorMust havePhase 12
FR-BKG-08Abuse protectionAt most 2 open bookings per verified e-mail or phone per garage and 5 across the platform; per-IP rate limits on the public endpoints; a captcha after the limit trips; availability is shown without other customers’ data; a garage may require manual confirmation after repeated no-shows. Booking is a plan capability (booking_enabled) and is not meteredSystemMust havePhase 12
FR-BKG-09Bays and technician assignmentOptional resources: the garage defines bays (lift, wash bay, paint booth) and marks which jobs need which bay type. A booking may carry a bay and a technician, with conflict detection over the estimated duration (the jobs’ durations). A grid calendar by bay or technician supports drag and drop. Customers never choose the technician. Without bays the simple capacity per slot appliesGarage Owner, Service AdvisorCould havePhase 12 (Release 12.3)
FR-BKG-10Problem description and photosThe customer describes what is wrong and attaches up to three photos; they prefill the quote created from the bookingEnd CustomerShould havePhase 12
FR-BKG-11Visit status and owner pageAfter conversion the booking card shows the linked repair order’s progress (waiting, in service, done), and the quote or repair order links back to the booking. An owner-level page lists the owner’s garages for bookingService Advisor, End CustomerShould havePhase 12

3.23. Suppliers

A supplier sells parts to the garage. It is a garage-owned record in the Supplier module, separate from customers (vehicle owners) and from insurers. Money goes out to suppliers (payables, payment-out vouchers); it comes in from customers (receivables).

IDRequirement NameDescriptionActorPriorityPhase
FR-SUP-01Manage suppliersMaintain the garage’s directory of parts suppliers: name (unique per garage), tax code, bank details, contact person, phone, e-mail, address and a note. In Phase 1 a supplier is the supplier type of “partners”; from Release 5.0 the record is its own suppliers table with supplier.read / supplier.write permissions. Follows the delete-or-deactivate rule (FR-CAT-07)Garage Owner, Inventory StaffMust havePhase 1 / Phase 5 (rename)
FR-SUP-02Link a supplier with a userWhen a supplier has a VietGara user, the garage sends a link request that the user confirms. The link has its own consent text and table (supplier_user_links) and does not use the customer flow of FR-CUS-06Garage Owner, SupplierCould havePhase 17
FR-SUP-03Supplier portalA linked supplier user sees the purchase orders addressed to them, confirms or declines lines, and attaches delivery notes and invoices. It is a supplier-facing surface, not the Customer AppSupplierCould havePhase 17

3.24. Public Web Presence

The public sites are static and hold no tenant data. They live in their own repositories (viettechno-website, vietgara-help) and are published separately from the product’s web consoles (ADR-013).

IDRequirement NameDescriptionActorPriorityPhase
FR-WEB-01Company homepage and product pagesA public homepage for VietTechno with one landing page per product (VietGara first): what it does, features by role, screenshots, plans and prices, stories, a blog, the privacy policy and the terms of use. Vietnamese first, with EnglishVisitorShould havePhase 10
FR-WEB-02Contact and demo requestA form with name, garage name, phone, e-mail, message and consent, protected by an anti-spam check. The request is stored and e-mailed to support. The page also shows the phone, Zalo and e-mail contactsVisitorShould havePhase 10
FR-WEB-03User guideA public, searchable how-to guide for garage owners and staff, organized by task, with screenshots refreshed each release. Each web console page and mobile app screen links to its guide pageVisitor, Garage Owner, StaffShould havePhase 10
FR-WEB-04Contact request endpointPOST /api/v1/public/contact-requests, called by the website’s server-side function and not by browsers. Validates, rate-limits per source, stores the request and notifies support by e-mail. No other module reads itExternal SystemShould havePhase 10

4. Traceability Matrix

The table below maps each functional group to its corresponding feature in the Vision & Scope Document and the responsible service in the Software Architecture Document, to help verify consistency across documents.

Functional Group (FRD)Corresponding Feature (Vision & Scope)Responsible Service (SAD)
Identity & Access Management—Identity & Access
Tenant / Garage Management—Tenant/Garage Management
License Management—License Management
Customer & Vehicle Management—Customer & Vehicle
Quote & PricingQuotes & Repair OrdersQuote & Pricing
Repair OrderQuotes & Repair OrdersRepair Order
Inventory ManagementParts Inventory ManagementInventory
Billing & SettlementSettlement & ReceivablesBilling & Settlement
ReceivablesSettlement & ReceivablesReceivables
Insurance IntegrationInsurance ReconciliationInsurance Integration
Payment Gateway AdapterOnline PaymentsPayment Gateway Adapter
E-Invoice ServiceE-InvoicingE-Invoice Service
Document/Print Service—Document/Print Service
Notification Service—Notification Service
Reporting & AnalyticsReporting & AnalyticsReporting & Analytics
Customer AppCustomer AppCustomer BFF + related services
Technician AppTechnician AppTechnician BFF + Repair Order
Owner AppMobile appsExisting REST API (same as the Owner Web)
Admin AppMobile appsExisting /admin REST API
Platform AnalyticsReporting & AnalyticsPlatform Analytics (platform-admin read path)
Catalogue & Reference DataParts Inventory ManagementCatalogue (units, parts, jobs) with Inventory
SchedulingAppointment BookingBooking
SuppliersParts Inventory ManagementSupplier (directory; portal in Phase 17)
Public Web PresencePublic website and user guideviettechno-website, vietgara-help (static sites); Notification (contact request e-mail)