Initial commit: Voiced invoice desktop app

Offline-first invoicing app for Test Vendor, built by Bongbetic.

- Tauri v2 (Rust) + React/TypeScript + IBM Carbon Design System UI
- SQLite (rusqlite) storage with a persistent invoice-number series
- Guided first-run setup, pre-filled vendor/bank details
- Fixed-amount or rate x quantity line items (per sec/min/hour/session/unit)
- GST as CGST+SGST or IGST, Indian amount-in-words
- Optional signature, with a computer-generated note as fallback
- Print-ready PDF export via @react-pdf/renderer
- Windows cross-compile via cargo-xwin (NSIS installer)

Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
This commit is contained in:
2026-10-03 23:07:51 +05:30
co-authored by CommandCodeBot
commit 875a12b2e6
121 changed files with 13660 additions and 0 deletions
+43
View File
@@ -0,0 +1,43 @@
import { invoke } from "@tauri-apps/api/core";
import type {
BankAccount,
Client,
Invoice,
InvoiceInput,
InvoiceSeries,
InvoiceSummary,
Settings,
} from "./types";
export const api = {
getSettings: () => invoke<Settings>("get_settings"),
saveSettings: (settings: Settings) => invoke<Settings>("save_settings", { settings }),
listBanks: () => invoke<BankAccount[]>("list_banks"),
saveBank: (bank: BankAccount) => invoke<BankAccount>("save_bank", { bank }),
deleteBank: (id: number) => invoke<void>("delete_bank", { id }),
getActiveSeries: () => invoke<InvoiceSeries | null>("get_active_series"),
listSeries: () => invoke<InvoiceSeries[]>("list_series"),
startNewSeries: (prefix: string, padding: number) =>
invoke<InvoiceSeries>("start_new_series", { prefix, padding }),
listClients: () => invoke<Client[]>("list_clients"),
saveClient: (client: Client) => invoke<Client>("save_client", { client }),
deleteClient: (id: number) => invoke<void>("delete_client", { id }),
peekNextInvoiceNumber: () => invoke<string>("peek_next_invoice_number"),
createInvoice: (input: InvoiceInput) => invoke<Invoice>("create_invoice", { input }),
listInvoices: () => invoke<InvoiceSummary[]>("list_invoices"),
getInvoice: (id: number) => invoke<Invoice>("get_invoice", { id }),
deleteInvoice: (id: number) => invoke<void>("delete_invoice", { id }),
importAsset: (sourcePath: string, kind: string) =>
invoke<string>("import_asset", { sourcePath, kind }),
saveAssetBytes: (kind: string, fileName: string, dataBase64: string) =>
invoke<string>("save_asset_bytes", { kind, fileName, dataBase64 }),
readAssetDataUri: (path: string) => invoke<string>("read_asset_data_uri", { path }),
removeAsset: (path: string) => invoke<void>("remove_asset", { path }),
saveBinaryFile: (path: string, dataBase64: string) =>
invoke<void>("save_binary_file", { path, dataBase64 }),
};