export type ID = string export type AccountType = 'asset' | 'liability' | 'equity' | 'income' | 'expense' export interface Account { id: ID code: string name: string type: AccountType parentId: ID | null isGroup: boolean openingBalance: number } export interface VoucherLine { id: ID accountId: ID description: string debit: number credit: number } export type VoucherStatus = 'draft' | 'posted' export interface Voucher { id: ID number: number date: string description: string /** Event or subject the voucher relates to (بابت). */ regarding?: string status: VoucherStatus lines: VoucherLine[] /** Set when the voucher was generated automatically by another module. */ source?: string } export type PartyKind = 'customer' | 'supplier' export type PartyExternalSource = '' | 'funzone_customer' | 'funzone_owner' export interface Party { id: ID kind: PartyKind name: string phone: string economicCode: string address: string openingBalance: number /** FunZone user id when synced from the platform. */ externalId?: ID externalSource?: PartyExternalSource firstName?: string lastName?: string username?: string email?: string nationalCode?: string iban?: string walletBalance?: number isActive?: boolean isVerified?: boolean birthday?: string | null /** Venue names for owner/supplier records. */ venues?: string[] } export interface Product { id: ID code: string name: string unit: string salePrice: number purchasePrice: number stock: number reorderLevel: number } export type SalesDocumentType = 'proforma' | 'invoice' | 'return' export interface SalesType { id: ID code: string name: string description: string active: boolean } export type AdjustmentKind = 'debit' | 'credit' /** Debit/credit notice adjusting customer receivable (اعلامیه بدهکار/بستانکار). */ export interface PartyAdjustment { id: ID number: number partyId: ID kind: AdjustmentKind date: string amount: number description: string } export interface InvoiceLine { id: ID productId: ID quantity: number unitPrice: number discount: number taxRate: number /** FunZone event the customer paid for (shown in کالا / بابت). */ eventName?: string } export type InvoiceKind = 'sale' | 'purchase' export type InvoiceStatus = 'draft' | 'confirmed' | 'paid' export interface Invoice { id: ID kind: InvoiceKind documentType: SalesDocumentType number: number partyId: ID salesTypeId?: ID relatedInvoiceId?: ID date: string status: InvoiceStatus note: string lines: InvoiceLine[] } export type TreasuryKind = 'receipt' | 'payment' export type TreasuryMethod = 'cash' | 'bank' | 'cheque' export interface TreasuryTxn { id: ID number: number kind: TreasuryKind method: TreasuryMethod date: string partyId: ID | null amount: number /** Event ticket fee split (FunZone): tax 10%, platform profit 14%, owner net 76%. */ taxAmount?: number platformProfitAmount?: number ownerNetAmount?: number reference: string description: string /** FunZone event name when imported from customer payments. */ eventName?: string /** Set when imported from FunZone platform (dedup key). */ source?: string } export interface Employee { id: ID code: string name: string position: string baseSalary: number insuranceNo: string hireDate: string active: boolean } export interface Payslip { id: ID employeeId: ID period: string baseSalary: number overtime: number bonus: number deductions: number insurance: number tax: number } /** Account mapping used to auto-generate journal vouchers from live FunZone data. */ export interface VoucherAccountMap { /** Cash/bank settlement account (debit on inflow, credit on outflow). */ bankAccountId: ID /** Liability owed to venue owners (their wallet balance). */ ownerPayableAccountId: ID /** Liability owed to customers (their wallet balance). */ customerPayableAccountId: ID /** Expense recognising the owner's share of a booking. */ ownerShareAccountId: ID /** Income account for reservation/ticket sales. */ salesIncomeAccountId: ID } export interface CompanySettings { name: string economicCode: string fiscalYear: string baseCurrency: string taxRate: number address: string phone: string voucherAccounts: VoucherAccountMap } export interface AppData { accounts: Account[] vouchers: Voucher[] parties: Party[] products: Product[] invoices: Invoice[] salesTypes: SalesType[] partyAdjustments: PartyAdjustment[] treasury: TreasuryTxn[] employees: Employee[] payslips: Payslip[] settings: CompanySettings }