Add toasts, Settings tabs, Clients page and item presets (Phase E1)
- Global Carbon toast stack replaces scattered inline notices; errors persist until closed. - Settings is split into eight tabs with one Save and a remembered last tab; Numbering embeds the series settings. - New Clients page with a DataTable, shared add/edit modal, structured addresses, GST category (informational), per-client notes and payment terms. The composed address string is kept for back-compat. Deleting a client warns about invoice count; issued invoices keep their own snapshot. - Migration M7 adds the client columns and item_presets; existing clients with a GSTIN are backfilled to registered_regular. - New invoice form: client ComboBox with type-ahead and inline create, client defaults applied on selection, and an Add from preset control. - Rust tests for M7 (fresh and v6 upgrade), client validation and CRUD, presets CRUD; vitest for the toast store and new helpers. PDF output and fingerprint goldens are unchanged. The new UI has not been run in a webview yet.
This commit is contained in:
@@ -84,3 +84,18 @@ export function accountError(value: string): string | undefined {
|
||||
export const isPan = (v: string) => PAN_RE.test(norm(v));
|
||||
export const isIfsc = (v: string) => IFSC_RE.test(norm(v));
|
||||
export const isGstin = (v: string) => GSTIN_RE.test(norm(v));
|
||||
|
||||
/**
|
||||
* Client GSTIN rules: shape, check digit, and that its state prefix matches the client's state when both
|
||||
* are given. Empty (or "NA") is valid; a client may be unregistered.
|
||||
*/
|
||||
export function clientGstinStateError(gstin: string, stateCode: string): string | undefined {
|
||||
const g = norm(gstin);
|
||||
if (!g || g === "NA") return undefined;
|
||||
const base = gstinFullError(g);
|
||||
if (base) return base;
|
||||
if (stateCode && g.slice(0, 2) !== stateCode) {
|
||||
return `GSTIN starts with ${g.slice(0, 2)}, but the state is ${stateCode}`;
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user