@fayz-ai/plugin-financial 0.1.7 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +2 -0
  2. package/dist/FinancialContext.d.ts +2 -0
  3. package/dist/FinancialContext.d.ts.map +1 -1
  4. package/dist/FinancialPage.d.ts.map +1 -1
  5. package/dist/data/index.d.ts +1 -0
  6. package/dist/data/index.d.ts.map +1 -1
  7. package/dist/data/mock.d.ts +15 -0
  8. package/dist/data/mock.d.ts.map +1 -1
  9. package/dist/data/supabase.d.ts.map +1 -1
  10. package/dist/data/tables.d.ts +11 -0
  11. package/dist/data/tables.d.ts.map +1 -0
  12. package/dist/data/types.d.ts +2 -1
  13. package/dist/data/types.d.ts.map +1 -1
  14. package/dist/index.cjs +1594 -252
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.d.ts +13 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +1456 -131
  19. package/dist/index.js.map +1 -1
  20. package/dist/locales/en.d.ts.map +1 -1
  21. package/dist/locales/pt-BR.d.ts.map +1 -1
  22. package/dist/migrations/index.d.ts +16 -0
  23. package/dist/migrations/index.d.ts.map +1 -0
  24. package/dist/quick-add.d.ts +13 -0
  25. package/dist/quick-add.d.ts.map +1 -0
  26. package/dist/registries.d.ts.map +1 -1
  27. package/dist/store.d.ts +3 -1
  28. package/dist/store.d.ts.map +1 -1
  29. package/dist/types.d.ts +42 -0
  30. package/dist/types.d.ts.map +1 -1
  31. package/dist/views/CardsView.d.ts.map +1 -1
  32. package/dist/views/InvoiceListView.d.ts.map +1 -1
  33. package/dist/views/QuickTransactionForm.d.ts +16 -0
  34. package/dist/views/QuickTransactionForm.d.ts.map +1 -0
  35. package/dist/views/SummaryView.d.ts +5 -4
  36. package/dist/views/SummaryView.d.ts.map +1 -1
  37. package/dist/views/dashboardWidgets.d.ts.map +1 -1
  38. package/package.json +7 -4
  39. package/src/FinancialContext.tsx +2 -0
  40. package/src/FinancialPage.tsx +86 -7
  41. package/src/README.md +5 -5
  42. package/src/contract.test.ts +1 -1
  43. package/src/data/capability.test.ts +45 -0
  44. package/src/data/index.ts +1 -0
  45. package/src/data/mock.ts +50 -10
  46. package/src/data/supabase.ts +95 -49
  47. package/src/data/tables.ts +12 -0
  48. package/src/data/types.ts +2 -1
  49. package/src/index.ts +24 -4
  50. package/src/locales/en.ts +75 -0
  51. package/src/locales/pt-BR.ts +75 -0
  52. package/src/migrations/000_plg_rename.sql +30 -0
  53. package/src/migrations/001_financial_base.sql +30 -30
  54. package/src/migrations/002_chart_of_accounts.sql +10 -10
  55. package/src/migrations/003_card_brands.sql +4 -4
  56. package/src/migrations/004_order_to_cash.sql +28 -28
  57. package/src/migrations/005_seed_defaults.sql +6 -6
  58. package/src/migrations/006_rls_policies.sql +5 -5
  59. package/src/migrations/{006_extract_fee_amount.sql → 006b_extract_fee_amount.sql} +4 -4
  60. package/src/migrations/007_reconciliation.sql +9 -9
  61. package/src/migrations/007b_movement_payment_method_type.sql +6 -0
  62. package/src/migrations/008_split_payment_movements.sql +5 -5
  63. package/src/migrations/index.ts +544 -0
  64. package/src/quick-add.ts +58 -0
  65. package/src/registries.ts +8 -7
  66. package/src/store.ts +88 -0
  67. package/src/types.ts +45 -0
  68. package/src/views/CardsView.tsx +186 -50
  69. package/src/views/InvoiceListView.tsx +60 -3
  70. package/src/views/QuickTransactionForm.tsx +537 -0
  71. package/src/views/SummaryView.tsx +197 -6
  72. package/src/views/dashboardWidgets.tsx +251 -5
@@ -1 +1 @@
1
- {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAqZrC,CAAA"}
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgerC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"pt-BR.d.ts","sourceRoot":"","sources":["../../src/locales/pt-BR.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAqZvC,CAAA"}
1
+ {"version":3,"file":"pt-BR.d.ts","sourceRoot":"","sources":["../../src/locales/pt-BR.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgevC,CAAA"}
@@ -0,0 +1,16 @@
1
+ export declare const MIGRATION_000_PLG_RENAME = "-- 000_plg_rename.sql \u2014 rename legacy financial tables to plg_financial_* for pools\n-- provisioned before the industry-pool rename. Guarded: fires only when the legacy\n-- name exists and the target does not, so fresh pools skip every branch.\nDO $$\nBEGIN\n IF to_regclass('public.financial_movements') IS NOT NULL AND to_regclass('public.plg_financial_movements') IS NULL THEN\n ALTER TABLE public.financial_movements RENAME TO plg_financial_movements;\n END IF;\n IF to_regclass('public.chart_of_accounts') IS NOT NULL AND to_regclass('public.plg_financial_chart_of_accounts') IS NULL THEN\n ALTER TABLE public.chart_of_accounts RENAME TO plg_financial_chart_of_accounts;\n END IF;\n IF to_regclass('public.bank_accounts') IS NOT NULL AND to_regclass('public.plg_financial_bank_accounts') IS NULL THEN\n ALTER TABLE public.bank_accounts RENAME TO plg_financial_bank_accounts;\n END IF;\n IF to_regclass('public.card_brands') IS NOT NULL AND to_regclass('public.plg_financial_card_brands') IS NULL THEN\n ALTER TABLE public.card_brands RENAME TO plg_financial_card_brands;\n END IF;\n IF to_regclass('public.cost_centers') IS NOT NULL AND to_regclass('public.plg_financial_cost_centers') IS NULL THEN\n ALTER TABLE public.cost_centers RENAME TO plg_financial_cost_centers;\n END IF;\n IF to_regclass('public.cash_register_sessions') IS NOT NULL AND to_regclass('public.plg_financial_cash_register_sessions') IS NULL THEN\n ALTER TABLE public.cash_register_sessions RENAME TO plg_financial_cash_register_sessions;\n END IF;\n IF to_regclass('public.payment_methods') IS NOT NULL AND to_regclass('public.plg_financial_payment_methods') IS NULL THEN\n ALTER TABLE public.payment_methods RENAME TO plg_financial_payment_methods;\n END IF;\n IF to_regclass('public.payment_method_types') IS NOT NULL AND to_regclass('public.plg_financial_payment_method_types') IS NULL THEN\n ALTER TABLE public.payment_method_types RENAME TO plg_financial_payment_method_types;\n END IF;\nEND $$;\n";
2
+ export declare const MIGRATION_001_FINANCIAL_BASE = "-- Financial Plugin: Base Tables\n-- Pattern: uuid PK, tenant_id FK, timestamps, RLS via project_rls.sql auto-detection\n\nCREATE TABLE IF NOT EXISTS public.plg_financial_payment_method_types (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n name text NOT NULL,\n transaction_type text NOT NULL,\n is_active boolean NOT NULL DEFAULT true,\n allowed_account_types jsonb DEFAULT '[]'::jsonb,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_financial_payment_method_types ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_financial_payment_method_types_tenant ON public.plg_financial_payment_method_types(tenant_id);\n\nCREATE TABLE IF NOT EXISTS public.plg_financial_payment_methods (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n name text NOT NULL,\n payment_method_type_id uuid REFERENCES public.plg_financial_payment_method_types(id),\n is_active boolean NOT NULL DEFAULT true,\n discount_mode text,\n discount_value numeric(12,2) DEFAULT 0,\n interest_mode text,\n interest_value numeric(12,2) DEFAULT 0,\n min_installments integer DEFAULT 1,\n max_installments integer DEFAULT 1,\n service_filter_mode text DEFAULT 'all',\n service_filter_ids jsonb DEFAULT '[]'::jsonb,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_financial_payment_methods ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_financial_payment_methods_tenant ON public.plg_financial_payment_methods(tenant_id);\n\nCREATE TABLE IF NOT EXISTS public.plg_financial_bank_accounts (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n name text NOT NULL,\n account_type text NOT NULL DEFAULT 'bank_account',\n bank_name text,\n account_number text,\n agency_number text,\n current_balance numeric(14,2) NOT NULL DEFAULT 0,\n initial_balance numeric(14,2) NOT NULL DEFAULT 0,\n credit_limit numeric(14,2),\n due_day integer,\n closing_day integer,\n is_active boolean NOT NULL DEFAULT true,\n unit_id uuid,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_financial_bank_accounts ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_financial_bank_accounts_tenant ON public.plg_financial_bank_accounts(tenant_id);\n\nCREATE TABLE IF NOT EXISTS public.plg_financial_cash_register_sessions (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n bank_account_id uuid NOT NULL REFERENCES public.plg_financial_bank_accounts(id),\n status text NOT NULL DEFAULT 'open',\n opened_at timestamptz NOT NULL DEFAULT now(),\n opened_by_user_id uuid,\n opened_by_name text,\n opening_balance numeric(14,2) NOT NULL,\n closed_at timestamptz,\n closed_by_user_id uuid,\n closed_by_name text,\n closing_balance numeric(14,2),\n expected_balance numeric(14,2),\n difference numeric(14,2),\n notes text,\n unit_id uuid,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_financial_cash_register_sessions ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_financial_cash_register_sessions_tenant ON public.plg_financial_cash_register_sessions(tenant_id);\n\n-- Financial movements (installments, payments) \u2014 plugin-specific, not archetype\n-- Invoices themselves use public.orders (kind='invoice_payable'/'invoice_receivable')\nCREATE TABLE IF NOT EXISTS public.plg_financial_movements (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n invoice_id uuid REFERENCES public.orders(id),\n direction text NOT NULL,\n movement_kind text NOT NULL,\n amount numeric(14,2) NOT NULL,\n paid_amount numeric(14,2) DEFAULT 0,\n status text NOT NULL DEFAULT 'pending',\n due_date date NOT NULL,\n payment_date date,\n installment_number integer,\n payment_method_id uuid REFERENCES public.plg_financial_payment_methods(id),\n bank_account_id uuid REFERENCES public.plg_financial_bank_accounts(id),\n cash_session_id uuid REFERENCES public.plg_financial_cash_register_sessions(id),\n card_brand text,\n card_installments integer,\n notes text,\n metadata jsonb DEFAULT '{}'::jsonb,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_financial_movements ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_financial_movements_tenant ON public.plg_financial_movements(tenant_id);\nCREATE INDEX IF NOT EXISTS idx_plg_financial_movements_invoice ON public.plg_financial_movements(invoice_id);\nCREATE INDEX IF NOT EXISTS idx_plg_financial_movements_due ON public.plg_financial_movements(tenant_id, due_date);\nCREATE INDEX IF NOT EXISTS idx_plg_financial_movements_bank ON public.plg_financial_movements(bank_account_id);\n";
3
+ export declare const MIGRATION_002_CHART_OF_ACCOUNTS = "-- Financial Plugin: Chart of Accounts + Cost Centers\n\nCREATE TABLE IF NOT EXISTS public.plg_financial_chart_of_accounts (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n code text NOT NULL,\n name text NOT NULL,\n node_type text NOT NULL DEFAULT 'leaf',\n parent_id uuid REFERENCES public.plg_financial_chart_of_accounts(id),\n is_active boolean NOT NULL DEFAULT true,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_financial_chart_of_accounts ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_financial_chart_of_accounts_tenant ON public.plg_financial_chart_of_accounts(tenant_id);\nCREATE INDEX IF NOT EXISTS idx_plg_financial_chart_of_accounts_parent ON public.plg_financial_chart_of_accounts(parent_id);\n\nCREATE TABLE IF NOT EXISTS public.plg_financial_cost_centers (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n code text NOT NULL,\n name text NOT NULL,\n is_active boolean NOT NULL DEFAULT true,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_financial_cost_centers ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_financial_cost_centers_tenant ON public.plg_financial_cost_centers(tenant_id);\n";
4
+ export declare const MIGRATION_003_CARD_BRANDS = "-- Financial Plugin: Card Brands\n\nCREATE TABLE IF NOT EXISTS public.plg_financial_card_brands (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n name text NOT NULL,\n is_active boolean NOT NULL DEFAULT true,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_financial_card_brands ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_financial_card_brands_tenant ON public.plg_financial_card_brands(tenant_id);\n";
5
+ export declare const MIGRATION_004_ORDER_TO_CASH = "-- Financial plugin \u2014 order-to-cash companion SQL.\n-- The atomic \"promote an order into an invoice + installment ledger\" function\n-- that CRM (approveQuote) and the agenda financial bridge both RPC. It belongs\n-- to the financial plugin (it writes plg_financial_movements + reads orders), and it\n-- ships WITH the plugin so enabling Payments provisions it. Idempotent.\n-- Depends on: public.orders, public.plg_financial_movements (001_financial_base).\n\n-- 1. Sequence generator (REC-00001 / PAG-00001 numbering)\nCREATE TABLE IF NOT EXISTS public.sequences (\n tenant_id uuid NOT NULL REFERENCES public.tenants(id),\n kind text NOT NULL,\n current_value bigint NOT NULL DEFAULT 0,\n PRIMARY KEY (tenant_id, kind)\n);\nCREATE OR REPLACE FUNCTION public.next_sequence(p_tenant_id uuid, p_kind text)\nRETURNS bigint LANGUAGE plpgsql AS $$\nDECLARE v_next bigint;\nBEGIN\n INSERT INTO public.sequences (tenant_id, kind, current_value)\n VALUES (p_tenant_id, p_kind, 1)\n ON CONFLICT (tenant_id, kind)\n DO UPDATE SET current_value = public.sequences.current_value + 1\n RETURNING current_value INTO v_next;\n RETURN v_next;\nEND;\n$$;\n\n-- 2. Order-to-cash columns on the spine orders (plugin extends public.orders)\nALTER TABLE public.orders\n ADD COLUMN IF NOT EXISTS stage text,\n ADD COLUMN IF NOT EXISTS direction text;\n\n-- 3. RLS + grants for plg_financial_movements (table from 001_financial_base.sql)\nALTER TABLE public.plg_financial_movements ENABLE ROW LEVEL SECURITY;\nGRANT SELECT, INSERT, UPDATE, DELETE ON public.plg_financial_movements TO authenticated;\nDO $$\nBEGIN\n IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE schemaname='public' AND tablename='plg_financial_movements' AND policyname='plg_financial_movements_select') THEN\n CREATE POLICY plg_financial_movements_select ON public.plg_financial_movements FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\n CREATE POLICY plg_financial_movements_insert ON public.plg_financial_movements FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));\n CREATE POLICY plg_financial_movements_update ON public.plg_financial_movements FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\n CREATE POLICY plg_financial_movements_delete ON public.plg_financial_movements FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\n END IF;\nEND $$;\n\n-- 4. The function (v2 \u2014 backward compatible with the 3-arg CRM call via defaults)\nDROP FUNCTION IF EXISTS public.fn_invoice_from_order(uuid, date, text);\nCREATE OR REPLACE FUNCTION public.fn_invoice_from_order(\n p_order_id uuid,\n p_due_date date DEFAULT NULL,\n p_status text DEFAULT NULL,\n p_installments int DEFAULT 1,\n p_direction text DEFAULT 'credit'\n) RETURNS uuid\nLANGUAGE plpgsql\nSECURITY DEFINER\nSET search_path = public\nAS $$\nDECLARE\n v_order public.orders%ROWTYPE;\n v_ref text;\n v_seq bigint;\n v_summary text;\n v_contact text;\n v_existing uuid;\n v_kind text;\n v_prefix text;\n v_n int := GREATEST(COALESCE(p_installments, 1), 1);\n v_total numeric;\n v_base numeric;\n v_amt numeric;\n v_alloc numeric := 0;\n v_due date;\n i int;\nBEGIN\n SELECT * INTO v_order FROM public.orders WHERE id = p_order_id;\n IF NOT FOUND THEN RAISE EXCEPTION 'fn_invoice_from_order: order % not found', p_order_id; END IF;\n IF v_order.tenant_id NOT IN (SELECT public.user_tenant_ids()) THEN\n RAISE EXCEPTION 'fn_invoice_from_order: forbidden';\n END IF;\n\n SELECT id INTO v_existing FROM public.plg_financial_movements\n WHERE invoice_id = p_order_id AND movement_kind = 'bill' LIMIT 1;\n IF v_existing IS NOT NULL THEN RETURN p_order_id; END IF;\n\n IF p_direction = 'debit' THEN v_kind := 'invoice_payable'; v_prefix := 'PAG';\n ELSE v_kind := 'invoice_receivable'; v_prefix := 'REC'; END IF;\n\n SELECT public.next_sequence(v_order.tenant_id, v_kind) INTO v_seq;\n v_ref := v_prefix || '-' || lpad(v_seq::text, 5, '0');\n\n SELECT string_agg(name, ', ' ORDER BY sort_order) INTO v_summary\n FROM public.order_items WHERE order_id = p_order_id;\n SELECT name INTO v_contact FROM public.people WHERE id = v_order.party_id;\n\n UPDATE public.orders SET\n status = COALESCE(p_status, status),\n stage = 'invoiced',\n direction = p_direction,\n reference_number = v_ref,\n metadata = COALESCE(metadata, '{}'::jsonb) || jsonb_build_object(\n 'itemsSummary', COALESCE(v_summary, ''),\n 'contactName', v_contact,\n 'installmentCount', v_n,\n 'quoteNumber', v_order.reference_number,\n 'direction', p_direction\n ),\n updated_at = now()\n WHERE id = p_order_id;\n\n v_total := COALESCE(v_order.total, 0);\n v_base := round(v_total / v_n, 2);\n v_due := COALESCE(p_due_date, current_date);\n FOR i IN 1..v_n LOOP\n IF i = v_n THEN v_amt := round(v_total - v_alloc, 2);\n ELSE v_amt := v_base; v_alloc := v_alloc + v_base; END IF;\n INSERT INTO public.plg_financial_movements\n (tenant_id, invoice_id, direction, movement_kind, amount, paid_amount, status, due_date, installment_number)\n VALUES\n (v_order.tenant_id, p_order_id, p_direction, 'bill', v_amt, 0, 'pending',\n (v_due + ((i - 1) || ' months')::interval)::date, i);\n END LOOP;\n\n RETURN p_order_id;\nEND;\n$$;\nGRANT EXECUTE ON FUNCTION public.fn_invoice_from_order(uuid, date, text, int, text) TO authenticated;\n\n-- 5. Derived balances view (Payments page + agenda payment badge read this)\nCREATE OR REPLACE VIEW public.v_invoice_balances AS\nWITH bill AS (\n SELECT\n invoice_id,\n SUM(amount) FILTER (WHERE status <> 'cancelled') AS billed,\n SUM(paid_amount) FILTER (WHERE status <> 'cancelled') AS paid,\n bool_or(status NOT IN ('paid','cancelled') AND due_date < current_date) AS has_overdue\n FROM public.plg_financial_movements\n WHERE movement_kind = 'bill'\n GROUP BY invoice_id\n)\nSELECT\n o.id AS invoice_id, o.tenant_id, o.kind, o.reference_number, o.party_id, o.direction,\n CASE WHEN o.direction = 'debit' OR o.kind = 'invoice_payable' THEN 'payable' ELSE 'receivable' END AS flow,\n COALESCE(b.billed, o.total, 0) AS amount,\n COALESCE(b.paid, 0) AS paid,\n CASE WHEN o.status = 'cancelled' OR o.stage = 'cancelled' THEN 0\n ELSE COALESCE(b.billed, o.total, 0) - COALESCE(b.paid, 0) END AS balance,\n CASE\n WHEN o.status = 'cancelled' OR o.stage = 'cancelled' THEN 'cancelled'\n WHEN COALESCE(b.billed, o.total, 0) = 0 THEN 'open'\n WHEN COALESCE(b.paid, 0) >= COALESCE(b.billed, o.total, 0) THEN 'paid'\n WHEN COALESCE(b.paid, 0) > 0 THEN 'partial'\n WHEN COALESCE(b.has_overdue, false) THEN 'overdue'\n ELSE 'open'\n END AS status,\n o.created_at, o.updated_at\nFROM public.orders o\nLEFT JOIN bill b ON b.invoice_id = o.id\nWHERE o.kind IN ('invoice_receivable','invoice_payable') OR b.invoice_id IS NOT NULL;\nALTER VIEW public.v_invoice_balances SET (security_invoker = true);\nGRANT SELECT ON public.v_invoice_balances TO authenticated;\n\n-- Refresh PostgREST's schema cache so the new RPC/views are visible immediately.\nNOTIFY pgrst, 'reload schema';\n";
6
+ export declare const MIGRATION_005_SEED_DEFAULTS = "-- Financial plugin \u2014 seed: payment method types + card brands.\n-- These are the read-only \"system\" registries the plugin's UI assumes exist\n-- (PaymentModal, card selection). They live as registry seedData in TS but were\n-- never written to the DB, so a fresh tenant had none. This backfills them for\n-- every tenant that has none. Idempotent. Plugin-owned so every app gets them.\n\nDO $$\nDECLARE t_id uuid;\nBEGIN\n FOR t_id IN (\n SELECT id FROM public.tenants\n WHERE id NOT IN (SELECT DISTINCT tenant_id FROM public.plg_financial_payment_method_types)\n )\n LOOP\n INSERT INTO public.plg_financial_payment_method_types (tenant_id, name, transaction_type) VALUES\n (t_id, 'Cash', 'cash'),\n (t_id, 'PIX', 'pix'),\n (t_id, 'Credit Card', 'credit_card'),\n (t_id, 'Debit Card', 'debit_card'),\n (t_id, 'Bank Transfer', 'bank_transfer'),\n (t_id, 'Check', 'check');\n END LOOP;\nEND $$;\n\nDO $$\nDECLARE t_id uuid;\nBEGIN\n FOR t_id IN (\n SELECT id FROM public.tenants\n WHERE id NOT IN (SELECT DISTINCT tenant_id FROM public.plg_financial_card_brands)\n )\n LOOP\n INSERT INTO public.plg_financial_card_brands (tenant_id, name) VALUES\n (t_id, 'Visa'), (t_id, 'Mastercard'), (t_id, 'American Express'),\n (t_id, 'Elo'), (t_id, 'Hipercard'), (t_id, 'Diners Club'),\n (t_id, 'Discover'), (t_id, 'JCB'), (t_id, 'Aura'), (t_id, 'Hiper');\n END LOOP;\nEND $$;\n";
7
+ export declare const MIGRATION_006_RLS_POLICIES = "-- Financial Plugin: RLS policies + grants for ALL base tables.\n--\n-- The base migrations (001/002/003) ENABLE row-level security but relied on an\n-- external `project_rls.sql` auto-detection step to create the actual policies.\n-- That step does not run in the Drizzle/companion pipeline, so every table\n-- except plg_financial_movements was RLS-enabled with NO policy \u2192 all inserts denied\n-- (\"new row violates row-level security policy\"). This creates the canonical\n-- per-tenant policies idempotently. Re-running is a no-op (IF NOT EXISTS guards;\n-- plg_financial_movements policies from 004 are skipped).\n--\n-- Canonical RLS form: tenant_id IN (SELECT public.user_tenant_ids()).\n\nDO $$\nDECLARE t text;\nBEGIN\n FOR t IN SELECT unnest(ARRAY[\n 'plg_financial_payment_method_types','plg_financial_payment_methods','plg_financial_bank_accounts',\n 'plg_financial_cash_register_sessions','plg_financial_movements',\n 'plg_financial_chart_of_accounts','plg_financial_cost_centers','plg_financial_card_brands'\n ])\n LOOP\n EXECUTE format('ALTER TABLE public.%I ENABLE ROW LEVEL SECURITY', t);\n EXECUTE format('GRANT SELECT, INSERT, UPDATE, DELETE ON public.%I TO authenticated', t);\n IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE schemaname='public' AND tablename=t AND policyname=t||'_select') THEN\n EXECUTE format('CREATE POLICY %I ON public.%I FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()))', t||'_select', t);\n END IF;\n IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE schemaname='public' AND tablename=t AND policyname=t||'_insert') THEN\n EXECUTE format('CREATE POLICY %I ON public.%I FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()))', t||'_insert', t);\n END IF;\n IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE schemaname='public' AND tablename=t AND policyname=t||'_update') THEN\n EXECUTE format('CREATE POLICY %I ON public.%I FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()))', t||'_update', t);\n END IF;\n IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE schemaname='public' AND tablename=t AND policyname=t||'_delete') THEN\n EXECUTE format('CREATE POLICY %I ON public.%I FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()))', t||'_delete', t);\n END IF;\n END LOOP;\nEND $$;\n";
8
+ export declare const MIGRATION_006B_EXTRACT_FEE_AMOUNT = "-- ---------------------------------------------------------------------------\n-- Financial extract (extrato): net card settlement + transfers\n-- ---------------------------------------------------------------------------\n-- Adds the processing/MDR fee column used by the bank/cash account statement so\n-- the running balance reflects the NET cash that actually lands in the account.\n-- gross = paid_amount (settles the receivable/payable)\n-- net cash = paid_amount - fee_amount (credits only; v1 has no fee on debits)\nALTER TABLE public.plg_financial_movements\n ADD COLUMN IF NOT EXISTS fee_amount numeric(14,2) NOT NULL DEFAULT 0;\n\nCOMMENT ON COLUMN public.plg_financial_movements.fee_amount IS\n 'Processing/MDR fee deducted at settlement. Net cash impact = paid_amount - fee_amount (credit). v1: same-day net, no D+N settlement-date modeling.';\n\nCREATE INDEX IF NOT EXISTS idx_plg_financial_movements_statement\n ON public.plg_financial_movements (bank_account_id, payment_date)\n WHERE status IN ('paid', 'partial');\n\n-- Transfers between accounts = a debit row (source) + credit row (destination),\n-- both status='paid', movement_kind='transfer', correlated via metadata jsonb:\n-- metadata->>'transferId' | 'transferRole' ('out'|'in') | 'counterAccountId'\n";
9
+ export declare const MIGRATION_007_RECONCILIATION = "-- ---------------------------------------------------------------------------\n-- Reconciliation (concilia\u00E7\u00E3o): bank-statement lines \u2194 internal movements\n-- ---------------------------------------------------------------------------\n-- An integration (e.g. open banking) imports bank-statement lines as\n-- plg_financial_movements tagged with (external_source, external_id). The matching\n-- UI then links each imported line to the internal movement it settles, or\n-- accepts it standalone. These columns make a movement carry its bank-line\n-- identity and its reconciliation state.\n-- external_source / external_id : the bank line's provider + unique id\n-- reconciled_at : when the line was matched/accepted (NULL = pending)\n-- matched_movement_id : the internal movement this line reconciles (NULL = standalone)\nALTER TABLE public.plg_financial_movements\n ADD COLUMN IF NOT EXISTS external_id text,\n ADD COLUMN IF NOT EXISTS external_source text,\n ADD COLUMN IF NOT EXISTS reconciled_at timestamptz,\n ADD COLUMN IF NOT EXISTS matched_movement_id uuid\n REFERENCES public.plg_financial_movements(id) ON DELETE SET NULL;\n\nCOMMENT ON COLUMN public.plg_financial_movements.external_source IS\n 'Provider of an imported bank-statement line (e.g. plugbank, inter). NULL for app-native movements.';\nCOMMENT ON COLUMN public.plg_financial_movements.external_id IS\n 'Provider-unique id of the imported bank line. Forms the import idempotency key with external_source.';\n\n-- Idempotency: a given bank line imports at most once per tenant.\nCREATE UNIQUE INDEX IF NOT EXISTS uq_plg_financial_movements_external\n ON public.plg_financial_movements (tenant_id, external_source, external_id)\n WHERE external_id IS NOT NULL AND external_source IS NOT NULL;\n\n-- Fast lookup of imported-but-unreconciled lines for the matching screen.\nCREATE INDEX IF NOT EXISTS idx_plg_financial_movements_unreconciled\n ON public.plg_financial_movements (tenant_id, payment_date)\n WHERE external_source IS NOT NULL AND reconciled_at IS NULL;\n";
10
+ export declare const MIGRATION_007B_MOVEMENT_PAYMENT_METHOD_TYPE = "-- payment_method_type_id existed on pre-pool installs (added out-of-band on\n-- the salon/beauty DB) but was never captured in the file series; 008 requires\n-- it on plg_financial_movements. No-op where the column already exists.\n\nALTER TABLE public.plg_financial_movements\n ADD COLUMN IF NOT EXISTS payment_method_type_id uuid REFERENCES public.plg_financial_payment_method_types(id);\n";
11
+ export declare const MIGRATION_008_SPLIT_PAYMENT_MOVEMENTS = "-- Split bill (obligation) vs payment (cash event).\n-- Each payment is now its own movement_kind='payment' row (one per cash event), so\n-- two payments on one installment show as two extract rows instead of one summed row.\n-- Bills stay pure obligations; v_invoice_balances already filters movement_kind='bill',\n-- so the new payment rows don't affect invoice balances. Backfill is idempotent.\n-- Requires fee_amount (006b_extract_fee_amount.sql).\n\nINSERT INTO public.plg_financial_movements\n (tenant_id, invoice_id, direction, movement_kind, amount, paid_amount, fee_amount, status,\n due_date, payment_date, installment_number, payment_method_id, payment_method_type_id,\n bank_account_id, cash_session_id, card_brand, card_installments, notes, metadata)\nSELECT\n b.tenant_id, b.invoice_id, b.direction, 'payment', b.paid_amount, b.paid_amount,\n COALESCE(b.fee_amount, 0), 'paid',\n b.due_date, COALESCE(b.payment_date, b.updated_at::date, CURRENT_DATE), b.installment_number,\n b.payment_method_id, b.payment_method_type_id, b.bank_account_id, b.cash_session_id,\n b.card_brand, b.card_installments, b.notes,\n jsonb_build_object('backfilledFromBill', b.id)\nFROM public.plg_financial_movements b\nWHERE b.movement_kind = 'bill' AND b.paid_amount > 0\n AND NOT EXISTS (\n SELECT 1 FROM public.plg_financial_movements p\n WHERE p.movement_kind = 'payment' AND p.metadata->>'backfilledFromBill' = b.id::text\n );\n\nUPDATE public.plg_financial_movements\nSET payment_date = NULL, bank_account_id = NULL, payment_method_id = NULL,\n payment_method_type_id = NULL, cash_session_id = NULL, card_brand = NULL, card_installments = NULL\nWHERE movement_kind = 'bill';\n";
12
+ export declare const MIGRATIONS: Array<{
13
+ id: string;
14
+ sql: string;
15
+ }>;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,wBAAwB,8+DA8BpC,CAAA;AAED,eAAO,MAAM,4BAA4B,woKA6GxC,CAAA;AAED,eAAO,MAAM,+BAA+B,67CA4B3C,CAAA;AAED,eAAO,MAAM,yBAAyB,0kBAYrC,CAAA;AAED,eAAO,MAAM,2BAA2B,yqOAoKvC,CAAA;AAED,eAAO,MAAM,2BAA2B,y6CAsCvC,CAAA;AAED,eAAO,MAAM,0BAA0B,k3EAqCtC,CAAA;AAED,eAAO,MAAM,iCAAiC,kxCAoB7C,CAAA;AAED,eAAO,MAAM,4BAA4B,sjEAgCxC,CAAA;AAED,eAAO,MAAM,2CAA2C,8YAMvD,CAAA;AAED,eAAO,MAAM,qCAAqC,qqDA6BjD,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAYzD,CAAA"}
@@ -0,0 +1,13 @@
1
+ import type { QuickTransactionType } from './types';
2
+ export interface QuickAddRequest {
3
+ type: QuickTransactionType;
4
+ /** Foreground the receipt/attachment step + auto-open the picker. */
5
+ receipt: boolean;
6
+ }
7
+ /** Fire a quick-add request from anywhere. Default = an expense. */
8
+ export declare function openQuickAdd(type?: QuickTransactionType, receipt?: boolean): void;
9
+ /** Read + clear the pending request (one-shot). */
10
+ export declare function consumeQuickAdd(): QuickAddRequest | null;
11
+ /** React binding — returns the pending request (null when none). */
12
+ export declare function usePendingQuickAdd(): QuickAddRequest | null;
13
+ //# sourceMappingURL=quick-add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quick-add.d.ts","sourceRoot":"","sources":["../src/quick-add.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEnD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,oBAAoB,CAAA;IAC1B,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAA;CACjB;AASD,oEAAoE;AACpE,wBAAgB,YAAY,CAAC,IAAI,GAAE,oBAAgC,EAAE,OAAO,UAAQ,GAAG,IAAI,CAG1F;AAED,mDAAmD;AACnD,wBAAgB,eAAe,IAAI,eAAe,GAAG,IAAI,CAIxD;AAaD,oEAAoE;AACpE,wBAAgB,kBAAkB,IAAI,eAAe,GAAG,IAAI,CAE3D"}
@@ -1 +1 @@
1
- {"version":3,"file":"registries.d.ts","sourceRoot":"","sources":["../src/registries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAuMtD,eAAO,MAAM,mBAAmB,EAAE,iBAAiB,EA2GlD,CAAA"}
1
+ {"version":3,"file":"registries.d.ts","sourceRoot":"","sources":["../src/registries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAwMtD,eAAO,MAAM,mBAAmB,EAAE,iBAAiB,EA2GlD,CAAA"}
package/dist/store.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { type StoreApi } from 'zustand/vanilla';
2
2
  import type { FinancialDataProvider } from './data/types';
3
- import type { Invoice, FinancialMovement, BankAccount, CashSession, PaymentMethod, PaymentMethodType, CardTransaction, FinancialSummary, StatementResult, InvoiceQuery, StatementQuery, CreateInvoiceInput, PayMovementInput, CreateTransferInput, OpenCashSessionInput, CloseCashSessionInput, DateRange } from './types';
3
+ import type { Invoice, FinancialMovement, BankAccount, CashSession, PaymentMethod, PaymentMethodType, CardTransaction, FinancialSummary, StatementResult, InvoiceQuery, StatementQuery, CreateInvoiceInput, PayMovementInput, CreateTransferInput, OpenCashSessionInput, CloseCashSessionInput, QuickTransactionInput, DateRange } from './types';
4
4
  export interface FinancialUIState {
5
5
  invoices: Invoice[];
6
6
  invoicesTotal: number;
@@ -30,6 +30,8 @@ export interface FinancialUIState {
30
30
  fetchStatement(query: StatementQuery): Promise<void>;
31
31
  fetchCardTransactions(dateRange?: DateRange): Promise<void>;
32
32
  createInvoice(input: CreateInvoiceInput): Promise<Invoice>;
33
+ /** FAY-1225 "log money in a few taps": one call → the right provider plumbing + full surface refresh. */
34
+ createQuickTransaction(input: QuickTransactionInput): Promise<void>;
33
35
  payMovement(input: PayMovementInput): Promise<void>;
34
36
  createTransfer(input: CreateTransferInput): Promise<void>;
35
37
  cancelInvoice(invoiceId: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAG5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACzD,OAAO,KAAK,EACV,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EACpD,aAAa,EAAE,iBAAiB,EAAE,eAAe,EACjD,gBAAgB,EAAE,eAAe,EACjC,YAAY,EAAiB,cAAc,EAC3C,kBAAkB,EAAE,gBAAgB,EAAE,mBAAmB,EACzD,oBAAoB,EAAE,qBAAqB,EAC3C,SAAS,EACV,MAAM,SAAS,CAAA;AAMhB,MAAM,WAAW,gBAAgB;IAE/B,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,OAAO,CAAA;IACxB,YAAY,EAAE,YAAY,CAAA;IAE1B,SAAS,EAAE,iBAAiB,EAAE,CAAA;IAC9B,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,OAAO,CAAA;IAEzB,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,mBAAmB,EAAE,OAAO,CAAA;IAE5B,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,mBAAmB,EAAE,OAAO,CAAA;IAE5B,cAAc,EAAE,aAAa,EAAE,CAAA;IAC/B,kBAAkB,EAAE,iBAAiB,EAAE,CAAA;IAEvC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAChC,cAAc,EAAE,OAAO,CAAA;IAEvB,SAAS,EAAE,eAAe,GAAG,IAAI,CAAA;IACjC,gBAAgB,EAAE,OAAO,CAAA;IACzB,cAAc,EAAE,cAAc,GAAG,IAAI,CAAA;IAErC,gBAAgB,EAAE,eAAe,EAAE,CAAA;IACnC,YAAY,EAAE,OAAO,CAAA;IAGrB,YAAY,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClD,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,iBAAiB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxD,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpD,qBAAqB,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3D,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1D,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnD,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/C,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IAClE,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;CACrE;AAMD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CA4KhG"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAG5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACzD,OAAO,KAAK,EACV,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EACpD,aAAa,EAAE,iBAAiB,EAAE,eAAe,EACjD,gBAAgB,EAAE,eAAe,EACjC,YAAY,EAAiB,cAAc,EAC3C,kBAAkB,EAAE,gBAAgB,EAAE,mBAAmB,EACzD,oBAAoB,EAAE,qBAAqB,EAC3C,qBAAqB,EACrB,SAAS,EACV,MAAM,SAAS,CAAA;AAMhB,MAAM,WAAW,gBAAgB;IAE/B,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,OAAO,CAAA;IACxB,YAAY,EAAE,YAAY,CAAA;IAE1B,SAAS,EAAE,iBAAiB,EAAE,CAAA;IAC9B,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,OAAO,CAAA;IAEzB,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,mBAAmB,EAAE,OAAO,CAAA;IAE5B,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,mBAAmB,EAAE,OAAO,CAAA;IAE5B,cAAc,EAAE,aAAa,EAAE,CAAA;IAC/B,kBAAkB,EAAE,iBAAiB,EAAE,CAAA;IAEvC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAChC,cAAc,EAAE,OAAO,CAAA;IAEvB,SAAS,EAAE,eAAe,GAAG,IAAI,CAAA;IACjC,gBAAgB,EAAE,OAAO,CAAA;IACzB,cAAc,EAAE,cAAc,GAAG,IAAI,CAAA;IAErC,gBAAgB,EAAE,eAAe,EAAE,CAAA;IACnC,YAAY,EAAE,OAAO,CAAA;IAGrB,YAAY,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClD,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,iBAAiB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxD,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpD,qBAAqB,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3D,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1D,yGAAyG;IACzG,sBAAsB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnE,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnD,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/C,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IAClE,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;CACrE;AAMD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAiQhG"}
package/dist/types.d.ts CHANGED
@@ -167,6 +167,15 @@ export interface ChartOfAccountsNode {
167
167
  tenantId: string;
168
168
  createdAt: string;
169
169
  }
170
+ export interface CostCenter {
171
+ id: string;
172
+ code: string;
173
+ name: string;
174
+ isActive: boolean;
175
+ tenantId: string;
176
+ createdAt: string;
177
+ updatedAt: string;
178
+ }
170
179
  export interface CardTransaction {
171
180
  id: string;
172
181
  movementId: string;
@@ -267,6 +276,8 @@ export interface InvoiceQuery {
267
276
  direction?: TransactionDirection;
268
277
  status?: InvoiceStatus | InvoiceStatus[];
269
278
  contactId?: string;
279
+ accountId?: string;
280
+ costCenterId?: string;
270
281
  dateRange?: DateRange;
271
282
  search?: string;
272
283
  page?: number;
@@ -294,6 +305,37 @@ export interface CreateTransferInput {
294
305
  date: string;
295
306
  notes?: string;
296
307
  }
308
+ /**
309
+ * "Log money in a few taps" (FAY-1225). A single-transaction quick-add that the
310
+ * store expands into the right provider calls: expense/income → createInvoice
311
+ * (+ payMovement when marked paid); transfer → createTransfer. Keeps the
312
+ * Mobills-style form dumb — it only collects fields, the store does the plumbing.
313
+ */
314
+ export type QuickTransactionType = 'expense' | 'income' | 'transfer';
315
+ export interface QuickTransactionInput {
316
+ type: QuickTransactionType;
317
+ /** Positive amount in the account currency */
318
+ amount: number;
319
+ /** YYYY-MM-DD */
320
+ date: string;
321
+ /** When true, the movement is settled immediately (creates a paid cash event). */
322
+ paid: boolean;
323
+ description?: string;
324
+ /** Chart-of-accounts / cost-center id (category chip) */
325
+ categoryId?: string;
326
+ /** expense/income: bank account or card. transfer: source account. */
327
+ bankAccountId?: string;
328
+ /** transfer: destination account */
329
+ toAccountId?: string;
330
+ /** Marks the transaction as recurring (stored in metadata; UI affordance). */
331
+ recurring?: boolean;
332
+ /**
333
+ * FAY-1226 "snap a receipt": a captured/attached receipt image as a data URL
334
+ * (mock mode has no Supabase bucket). Persisted on the created invoice's
335
+ * metadata so the transaction feed can show a 📎 indicator + preview.
336
+ */
337
+ receiptUrl?: string;
338
+ }
297
339
  export interface TransferResult {
298
340
  /** Shared correlation id stored in both legs' metadata */
299
341
  transferId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CardsView.d.ts","sourceRoot":"","sources":["../../src/views/CardsView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAA;AAMxC,wBAAgB,SAAS,sBAmExB"}
1
+ {"version":3,"file":"CardsView.d.ts","sourceRoot":"","sources":["../../src/views/CardsView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAA;AAsB3D,wBAAgB,SAAS,sBA2LxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"InvoiceListView.d.ts","sourceRoot":"","sources":["../../src/views/InvoiceListView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAA;AAQ3D,OAAO,KAAK,EAAE,oBAAoB,EAA0B,MAAM,UAAU,CAAA;AA2E5E,wBAAgB,eAAe,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;IAC5D,SAAS,EAAE,oBAAoB,CAAA;IAC/B,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;IAClB,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAC9B,qBAyFA"}
1
+ {"version":3,"file":"InvoiceListView.d.ts","sourceRoot":"","sources":["../../src/views/InvoiceListView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAA;AAQ3D,OAAO,KAAK,EAAE,oBAAoB,EAA2D,MAAM,UAAU,CAAA;AA2E7G,wBAAgB,eAAe,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;IAC5D,SAAS,EAAE,oBAAoB,CAAA;IAC/B,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;IAClB,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAC9B,qBAkJA"}
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import type { QuickTransactionType } from '../types';
3
+ export declare function QuickTransactionForm({ open, onOpenChange, defaultType, defaultAccountId, focusReceipt }: {
4
+ open: boolean;
5
+ onOpenChange: (open: boolean) => void;
6
+ defaultType?: QuickTransactionType;
7
+ /** Preselect an account (e.g. opening from a specific card tile → log an expense against it). */
8
+ defaultAccountId?: string;
9
+ /**
10
+ * FAY-1226 "snap a receipt": open with the attachment step foregrounded — a
11
+ * prominent capture card at the top of the sheet + auto-open the image picker
12
+ * (mobile offers the camera). Used by the "Enviar recibo" entry point.
13
+ */
14
+ focusReceipt?: boolean;
15
+ }): React.JSX.Element;
16
+ //# sourceMappingURL=QuickTransactionForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuickTransactionForm.d.ts","sourceRoot":"","sources":["../../src/views/QuickTransactionForm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAA;AAUnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAoIpD,wBAAgB,oBAAoB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAuB,EAAE,gBAAgB,EAAE,YAAoB,EAAE,EAAE;IAC5H,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,WAAW,CAAC,EAAE,oBAAoB,CAAA;IAClC,iGAAiG;IACjG,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,qBA8XA"}
@@ -1,9 +1,10 @@
1
1
  import React from 'react';
2
2
  /**
3
- * Financial summary. KPIs, cash-flow chart, breakdown, overdue alerts and the
4
- * recent-transactions table are registered dashboard widgets (see
5
- * ./dashboardWidgets), rendered through the shared DashboardCanvas; the
6
- * total-balance KPI also surfaces on the global app home.
3
+ * Financial summary. On desktop (md+) it renders the rich multi-column dashboard
4
+ * (KPI cards + Fluxo de Caixa chart + breakdown + overdue alerts + recent-
5
+ * transactions table) via the shared DashboardCanvas. On mobile (<md) it swaps
6
+ * to a Mobills-grade experience: a compact KPI strip over a date-grouped
7
+ * transaction list. The two paths share the same store — no forked screen.
7
8
  */
8
9
  export declare function SummaryView(): React.JSX.Element;
9
10
  //# sourceMappingURL=SummaryView.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SummaryView.d.ts","sourceRoot":"","sources":["../../src/views/SummaryView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB;;;;;GAKG;AACH,wBAAgB,WAAW,sBAE1B"}
1
+ {"version":3,"file":"SummaryView.d.ts","sourceRoot":"","sources":["../../src/views/SummaryView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6B,MAAM,OAAO,CAAA;AAUjD;;;;;;GAMG;AACH,wBAAgB,WAAW,sBAgB1B"}
@@ -1 +1 @@
1
- {"version":3,"file":"dashboardWidgets.d.ts","sourceRoot":"","sources":["../../src/views/dashboardWidgets.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAMvD,OAAO,EAAmF,KAAK,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AACnJ,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAuJhD,wBAAgB,+BAA+B,CAAC,GAAG,EAAE;IACnD,MAAM,EAAE,uBAAuB,CAAA;IAC/B,QAAQ,EAAE,qBAAqB,CAAA;IAC/B,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAA;CAClC,GAAG,kBAAkB,EAAE,CAuBvB"}
1
+ {"version":3,"file":"dashboardWidgets.d.ts","sourceRoot":"","sources":["../../src/views/dashboardWidgets.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAMvD,OAAO,EAAyG,KAAK,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AACzK,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAgYhD,wBAAgB,+BAA+B,CAAC,GAAG,EAAE;IACnD,MAAM,EAAE,uBAAuB,CAAA;IAC/B,QAAQ,EAAE,qBAAqB,CAAA;IAC/B,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAA;CAClC,GAAG,kBAAkB,EAAE,CAoCvB"}
package/package.json CHANGED
@@ -1,6 +1,9 @@
1
1
  {
2
2
  "name": "@fayz-ai/plugin-financial",
3
- "version": "0.1.7",
3
+ "fayz": {
4
+ "status": "beta"
5
+ },
6
+ "version": "0.8.0",
4
7
  "description": "Fayz SDK — plugin-financial plugin",
5
8
  "type": "module",
6
9
  "main": "./dist/index.cjs",
@@ -26,9 +29,9 @@
26
29
  "lucide-react": "^0.400.0",
27
30
  "zustand": "^4.5.0",
28
31
  "@tanstack/react-table": "^8.20.0",
29
- "@fayz-ai/core": "^0.6.0",
30
- "@fayz-ai/saas": "^0.6.0",
31
- "@fayz-ai/ui": "^0.6.0"
32
+ "@fayz-ai/ui": "^0.8.0",
33
+ "@fayz-ai/saas": "^0.8.0",
34
+ "@fayz-ai/core": "^0.8.0"
32
35
  },
33
36
  "devDependencies": {
34
37
  "@types/react": "^18.3.0",
@@ -28,6 +28,8 @@ export interface LocationOption {
28
28
 
29
29
  export interface ResolvedFinancialConfig {
30
30
  modules: FinancialModules
31
+ /** Show the plugin's own quick-add header buttons / FAB. Opt-in (default false). */
32
+ quickAdd: boolean
31
33
  labels: FinancialPluginLabels
32
34
  currency: FinancialCurrency
33
35
  itemTypes: ItemTypeOption[]
@@ -1,4 +1,4 @@
1
- import React, { useState, useCallback, useMemo } from 'react'
1
+ import React, { useState, useCallback, useMemo, useEffect } from 'react'
2
2
  import type { StoreApi } from 'zustand/vanilla'
3
3
  import { useTranslation } from '@fayz-ai/core'
4
4
  import { ModulePage, PageTransition, type ModuleNavItem } from '@fayz-ai/ui'
@@ -8,6 +8,11 @@ import type { FinancialUIState } from './store'
8
8
  import type { PluginRegistryDef, PluginQuickAction } from '@fayz-ai/core'
9
9
  import { useModuleNavigation, ModuleActionBar, parseViewId, PluginSettingsPanel } from '@fayz-ai/saas'
10
10
  import { SummaryView } from './views/SummaryView'
11
+ import { QuickTransactionForm } from './views/QuickTransactionForm'
12
+ import { usePendingQuickAdd, consumeQuickAdd } from './quick-add'
13
+ import type { QuickTransactionType } from './types'
14
+ import { Plus } from 'lucide-react'
15
+ import { Button } from '@fayz-ai/ui'
11
16
  import { PayablesView } from './views/PayablesView'
12
17
  import { ReceivablesView } from './views/ReceivablesView'
13
18
  import { CashRegistersView } from './views/CashRegistersView'
@@ -160,12 +165,58 @@ export function FinancialPage({ config, provider, store, registries }: {
160
165
  try { return localStorage.getItem('saas-core:financial-onboarded') === 'true' } catch { return false }
161
166
  })
162
167
 
168
+ // Skip the welcome wizard when the provider already has transactions — a user
169
+ // (or a seeded demo/dogfood provider) with existing data should land on the
170
+ // populated Summary, not a "let's get started" flow.
171
+ useEffect(() => {
172
+ if (onboardingComplete) return
173
+ let cancelled = false
174
+ void provider.getMovements({ pageSize: 1 })
175
+ .then((res) => { if (!cancelled && res.total > 0) setOnboardingComplete(true) })
176
+ .catch(() => { /* leave onboarding as-is on error */ })
177
+ return () => { cancelled = true }
178
+ }, [onboardingComplete, provider])
179
+
163
180
  const t = useTranslation()
164
181
  const intent = parseIntent(view)
165
182
  const isSettings = view === 'settings'
166
183
  const nav = buildNav(config, view, navigate, t)
167
184
 
185
+ // FAY-1225 "log money in a few taps": a reachable quick-add that opens the
186
+ // Mobills-grade transaction sheet (default = expense). Prominent primary
187
+ // button on desktop + a thumb-reachable FAB on mobile.
188
+ const [quickAddOpen, setQuickAddOpen] = useState(false)
189
+ const [quickAddType, setQuickAddType] = useState<QuickTransactionType>('expense')
190
+ // FAY-1226 "snap a receipt": when true, the sheet foregrounds the attachment
191
+ // step + auto-opens the camera/gallery picker.
192
+ const [quickAddReceipt, setQuickAddReceipt] = useState(false)
193
+ const openQuickAdd = useCallback((type: QuickTransactionType = 'expense') => {
194
+ setQuickAddType(type)
195
+ setQuickAddReceipt(false)
196
+ setQuickAddOpen(true)
197
+ }, [])
198
+
199
+ // FAY-1242: open the sheet on a global quick-add request (the app shell's
200
+ // elevated center "+" button). One-shot — consumed so it never re-fires.
201
+ const pendingQuickAdd = usePendingQuickAdd()
202
+ useEffect(() => {
203
+ if (!pendingQuickAdd) return
204
+ const req = consumeQuickAdd()
205
+ if (!req) return
206
+ setQuickAddType(req.type)
207
+ setQuickAddReceipt(req.receipt)
208
+ setQuickAddOpen(true)
209
+ }, [pendingQuickAdd])
210
+
211
+ // One-primary-action rule (FAY-1247): each module surfaces exactly ONE primary
212
+ // add affordance and config picks its face — never both. When quickAdd is the
213
+ // primary action (B2C, e.g. norman), suppress the ERP "+ New" menu here so the
214
+ // header shows only the quick-add "Nova transação" button. Payables are still
215
+ // covered: the quick-add sheet's "Pago: Não" creates an unpaid conta a pagar.
216
+ // When quickAdd is off (ERP default, beauty) this returns the payable/receivable/
217
+ // cash actions and no quick-add buttons render — exactly today's behavior.
168
218
  const quickActions = useMemo<PluginQuickAction[]>(() => {
219
+ if (config.quickAdd) return []
169
220
  const actions: PluginQuickAction[] = []
170
221
  if (config.modules.payables) {
171
222
  actions.push({
@@ -195,7 +246,7 @@ export function FinancialPage({ config, provider, store, registries }: {
195
246
  })
196
247
  }
197
248
  return actions
198
- }, [config.modules])
249
+ }, [config.modules, config.quickAdd])
199
250
 
200
251
  function handleOnboardingComplete() {
201
252
  setOnboardingComplete(true)
@@ -262,14 +313,42 @@ export function FinancialPage({ config, provider, store, registries }: {
262
313
  viewKey={view}
263
314
  direction={direction}
264
315
  headerAction={
265
- <ModuleActionBar
266
- quickActions={quickActions}
267
- settingsPath={registries && registries.length > 0 ? '/settings/financial' : undefined}
268
- settingsLabel={t('financial.settingsPage.title')}
269
- />
316
+ <div className="flex items-center gap-2">
317
+ {config.quickAdd && (
318
+ // One-primary-action rule (FAY-1247): quick-add is the single primary
319
+ // add affordance in B2C mode. The receipt entry point lives inside the
320
+ // sheet's "Fotografar ou anexar recibo" attachment step, so no separate
321
+ // "Enviar recibo" button is needed here.
322
+ <Button
323
+ size="sm"
324
+ className="hidden md:inline-flex"
325
+ onClick={() => openQuickAdd('expense')}
326
+ >
327
+ <Plus className="h-4 w-4" />
328
+ {t('financial.quickTx.newTransaction')}
329
+ </Button>
330
+ )}
331
+ <ModuleActionBar
332
+ quickActions={quickActions}
333
+ settingsPath={registries && registries.length > 0 ? '/settings/financial' : undefined}
334
+ settingsLabel={t('financial.settingsPage.title')}
335
+ />
336
+ </div>
270
337
  }
271
338
  >
272
339
  {renderView()}
340
+
341
+ {/* FAY-1242: the mobile quick-add + receipt FAB stack was removed — the
342
+ app shell's elevated center "+" bottom-nav button now owns global
343
+ quick-add (via openQuickAdd), and receipts stay reachable through the
344
+ form's Anexo step. Desktop keeps its header buttons above. */}
345
+
346
+ <QuickTransactionForm
347
+ open={quickAddOpen}
348
+ onOpenChange={setQuickAddOpen}
349
+ defaultType={quickAddType}
350
+ focusReceipt={quickAddReceipt}
351
+ />
273
352
  </ModulePage>
274
353
  </FinancialContextProvider>
275
354
  )
package/src/README.md CHANGED
@@ -7,7 +7,7 @@ Accounts payable/receivable, cash registers, bank statements, and financial repo
7
7
  ```typescript
8
8
  import { createFinancialPlugin } from '@fayz-ai/saas-core/plugins/financial'
9
9
 
10
- // In your createSaasApp config:
10
+ // In your defineSaas config:
11
11
  plugins: [
12
12
  createFinancialPlugin({
13
13
  currency: { code: 'BRL', locale: 'pt-BR', symbol: 'R$' },
@@ -100,11 +100,11 @@ Accessible via gear icon in Financial module or in global Settings > Financial t
100
100
 
101
101
  Run in order:
102
102
 
103
- 1. `001_financial_base.sql` — Core tables: payment_method_types, payment_methods, bank_accounts, cash_register_sessions, invoices, invoice_items, financial_movements
104
- 2. `002_chart_of_accounts.sql` — chart_of_accounts (self-referencing tree), cost_centers
105
- 3. `003_card_brands.sql` — card_brands
103
+ 1. `001_financial_base.sql` — Core tables: plg_financial_payment_method_types, plg_financial_payment_methods, plg_financial_bank_accounts, plg_financial_cash_register_sessions, invoices, invoice_items, plg_financial_movements
104
+ 2. `002_chart_of_accounts.sql` — plg_financial_chart_of_accounts (self-referencing tree), plg_financial_cost_centers
105
+ 3. `003_card_brands.sql` — plg_financial_card_brands
106
106
 
107
- All tables use `tenant_id` referencing `saas_core.tenants(id)` for multi-tenant isolation.
107
+ All tables use `tenant_id` referencing `public.tenants(id)` for multi-tenant isolation.
108
108
 
109
109
  ## Views
110
110
 
@@ -2,7 +2,7 @@
2
2
  // Exercises the gate's rules with inline manifests (no UI import) so the tool
3
3
  // itself is proven: a conformant manifest passes; each malformed shape throws.
4
4
  // Real plugins call assertPluginManifestContract(theirManifest) in an env where
5
- // their UI bundle loads (app-level / jsdom). See PLUGIN_PATTERNS.md → integrity.
5
+ // their UI bundle loads (app-level / jsdom). See docs/PLUGIN-PATTERNS.md → integrity.
6
6
  import { describe, it, expect } from 'vitest'
7
7
  import { assertPluginManifestContract, PluginContractError } from '@fayz-ai/core/testing'
8
8
  import type { PluginManifest } from '@fayz-ai/core'
@@ -25,6 +25,51 @@ describe('plugin-financial · invoice/movement slice (mock provider)', () => {
25
25
  const movs = await provider.getMovements({ direction: 'credit' })
26
26
  expect(movs.data.some((m) => m.invoiceId === invoice.id && m.amount === 300)).toBe(true)
27
27
  })
28
+
29
+ it('filters invoices by item account and cost center assignments', async () => {
30
+ const provider = createMockFinancialProvider()
31
+ const target = await provider.createInvoice({
32
+ direction: 'debit',
33
+ invoiceDate: '2026-06-01',
34
+ contactName: 'Supplier A',
35
+ items: [{
36
+ itemKind: 'other',
37
+ description: 'Supplies',
38
+ quantity: 1,
39
+ unitPrice: 120,
40
+ accountId: 'coa-expenses',
41
+ costCenterId: 'cc-salon',
42
+ }],
43
+ installments: [
44
+ { direction: 'debit', movementKind: 'bill', amount: 120, dueDate: '2026-06-10', installmentNumber: 1 },
45
+ ],
46
+ })
47
+ await provider.createInvoice({
48
+ direction: 'debit',
49
+ invoiceDate: '2026-06-01',
50
+ contactName: 'Supplier B',
51
+ items: [{
52
+ itemKind: 'other',
53
+ description: 'Marketing',
54
+ quantity: 1,
55
+ unitPrice: 80,
56
+ accountId: 'coa-marketing',
57
+ costCenterId: 'cc-marketing',
58
+ }],
59
+ installments: [
60
+ { direction: 'debit', movementKind: 'bill', amount: 80, dueDate: '2026-06-10', installmentNumber: 1 },
61
+ ],
62
+ })
63
+
64
+ const byAccount = await provider.getInvoices({ direction: 'debit', accountId: 'coa-expenses' })
65
+ expect(byAccount.data.map((invoice) => invoice.id)).toEqual([target.id])
66
+
67
+ const byCostCenter = await provider.getInvoices({ direction: 'debit', costCenterId: 'cc-salon' })
68
+ expect(byCostCenter.data.map((invoice) => invoice.id)).toEqual([target.id])
69
+
70
+ const byBoth = await provider.getInvoices({ direction: 'debit', accountId: 'coa-expenses', costCenterId: 'cc-marketing' })
71
+ expect(byBoth.data).toHaveLength(0)
72
+ })
28
73
  })
29
74
 
30
75
  describe('plugin-financial · ⚖️ reconciliation capability (mock provider)', () => {
package/src/data/index.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export type { FinancialDataProvider } from './types'
2
2
  export { createMockFinancialProvider } from './mock'
3
+ export type { MockFinancialSeed, MockFinancialProviderOptions } from './mock'