@fayz-ai/plugin-fiscal-br 0.5.1 → 0.7.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.
@@ -115,7 +115,7 @@ export declare const SUGGESTION_TOOL: {
115
115
  };
116
116
  readonly tipo: {
117
117
  readonly type: "string";
118
- readonly enum: readonly ["insumo", "revenda", "patrimonio", "despesa", "servico"];
118
+ readonly enum: readonly ["insumo", "revenda", "patrimonio", "uso_consumo", "despesa", "servico"];
119
119
  };
120
120
  readonly c: {
121
121
  readonly type: readonly ["integer", "null"];
@@ -1 +1 @@
1
- {"version":3,"file":"note-suggestion.d.ts","sourceRoot":"","sources":["../../src/lib/note-suggestion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"note-suggestion.d.ts","sourceRoot":"","sources":["../../src/lib/note-suggestion.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,8 @@ export declare const MIGRATION_016_A_NOTA_GUARDA_O_PROPRIO_XML = "-- -----------
18
18
  export declare const MIGRATION_017_QUEM_EMITE_E_O_CNPJ_NAO_A_LOJA = "-- Quem emite \u00E9 o CNPJ, n\u00E3o a loja.\n--\n-- As abas \"Certificado\" e \"Emiss\u00E3o Fiscal\" do cadastro de empresa do V1\n-- guardam, em companies, como aquela pessoa jur\u00EDdica emite NFS-e e NFC-e e se\n-- recebe DANFes da SEFAZ. No V2 a pessoa jur\u00EDdica \u00E9\n-- public.company_legal_entities (base), e a filial chega nela por\n-- app.units.company_legal_entity_id (168). Esta tabela \u00E9 uma linha por pessoa\n-- jur\u00EDdica:\n--\n-- unidade \u2192 app.units.company_legal_entity_id \u2192 company_legal_entities.id\n-- \u2192 plg_fiscalbr_emitter_settings.legal_entity_id (UNIQUE)\n--\n-- Duas filiais com o mesmo CNPJ dividem a mesma configura\u00E7\u00E3o, como no V1.\n--\n-- O certificado A1 N\u00C3O mora aqui. O .pfx e a senha v\u00E3o direto ao provedor\n-- (PlugNotas) e o que fica \u00E9 o recibo: id no provedor, titular e validade. O\n-- CSC da NFC-e \u00E9 segredo \u2014 o navegador grava, mas n\u00E3o l\u00EA de volta: a coluna\n-- fica fora do GRANT SELECT e a tela v\u00EA s\u00F3 `nfce_csc_token_set`.\n--\n-- Plano aprovado em docs/port/empresa.schema.json. Idempotente.\n\nCREATE TABLE IF NOT EXISTS public.plg_fiscalbr_emitter_settings (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n legal_entity_id uuid NOT NULL,\n\n nfse_enabled boolean NOT NULL DEFAULT false,\n nfse_production boolean NOT NULL DEFAULT false,\n nfse_national boolean NOT NULL DEFAULT false,\n nfse_service_code_national text,\n nfse_service_code_municipal text,\n nfse_nbs_code text,\n nfse_cnae text,\n nfse_iss_rate numeric(5,2) CHECK (nfse_iss_rate IS NULL OR (nfse_iss_rate >= 0 AND nfse_iss_rate <= 100)),\n nfse_iss_taxation smallint,\n nfse_iss_exigibility smallint,\n nfse_ibscbs_cst text,\n nfse_ibscbs_classification text,\n nfse_simples_regime smallint,\n nfse_net_value boolean NOT NULL DEFAULT false,\n nfse_additional_info text,\n nfse_city_features jsonb,\n\n nfce_enabled boolean NOT NULL DEFAULT false,\n nfce_production boolean NOT NULL DEFAULT false,\n nfce_series integer CHECK (nfce_series IS NULL OR nfce_series > 0),\n nfce_csc_id text,\n nfce_csc_token text,\n nfce_csc_token_set boolean GENERATED ALWAYS AS (nfce_csc_token IS NOT NULL AND nfce_csc_token <> '') STORED,\n nfce_generic_item jsonb,\n\n nfe_enabled boolean NOT NULL DEFAULT false,\n\n certificate_provider_id text,\n certificate_cn text,\n certificate_expires_at timestamptz,\n certificate_uploaded_at timestamptz,\n\n dfe_sync_enabled boolean NOT NULL DEFAULT false,\n dfe_sync_cursor text,\n dfe_last_sync_at timestamptz,\n provider_synced_at timestamptz,\n\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now(),\n UNIQUE (tenant_id, id)\n);\n\nDO $$\nBEGIN\n IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'plg_fiscalbr_emitter_settings_legal_entity_fkey') THEN\n -- company_legal_entities \u00E9 da base, n\u00E3o de outro plugin: a FK f\u00EDsica \u00E9\n -- permitida (a regra do 000 pro\u00EDbe FK entre PLUGINS).\n ALTER TABLE ONLY public.plg_fiscalbr_emitter_settings\n ADD CONSTRAINT plg_fiscalbr_emitter_settings_legal_entity_fkey\n FOREIGN KEY (legal_entity_id) REFERENCES public.company_legal_entities(id) ON DELETE CASCADE;\n END IF;\nEND $$;\n\nCREATE UNIQUE INDEX IF NOT EXISTS plg_fiscalbr_emitter_settings_legal_entity_uidx\n ON public.plg_fiscalbr_emitter_settings USING btree (legal_entity_id);\n\nCOMMENT ON TABLE public.plg_fiscalbr_emitter_settings IS\n 'V1: companies (abas Certificado + Emiss\u00E3o Fiscal). Como uma pessoa jur\u00EDdica emite NFS-e/NFC-e e recebe DANFes. Uma linha por CNPJ; a filial chega por app.units.company_legal_entity_id.';\nCOMMENT ON COLUMN public.plg_fiscalbr_emitter_settings.legal_entity_id IS 'A chave que conecta: company_legal_entities.id. UNIQUE.';\nCOMMENT ON COLUMN public.plg_fiscalbr_emitter_settings.nfse_production IS 'V1: companies.nfse_producao \u2014 false = homologa\u00E7\u00E3o.';\nCOMMENT ON COLUMN public.plg_fiscalbr_emitter_settings.nfse_national IS 'V1: companies.nfse_nacional \u2014 padr\u00E3o nacional \u00D7 municipal.';\nCOMMENT ON COLUMN public.plg_fiscalbr_emitter_settings.nfse_service_code_national IS 'V1: companies.nfse_codigo_tributacao_nacional';\nCOMMENT ON COLUMN public.plg_fiscalbr_emitter_settings.nfse_service_code_municipal IS 'V1: companies.nfse_codigo_tributacao_municipio';\nCOMMENT ON COLUMN public.plg_fiscalbr_emitter_settings.nfse_nbs_code IS 'V1: companies.nfse_codigo_nbs';\nCOMMENT ON COLUMN public.plg_fiscalbr_emitter_settings.nfse_cnae IS 'V1: companies.nfse_cnae \u2014 CNAE do servi\u00E7o, pode diferir do principal.';\nCOMMENT ON COLUMN public.plg_fiscalbr_emitter_settings.nfse_iss_rate IS 'V1: companies.nfse_iss_aliquota (%)';\nCOMMENT ON COLUMN public.plg_fiscalbr_emitter_settings.nfse_iss_taxation IS 'V1: companies.nfse_iss_tipo_tributacao';\nCOMMENT ON COLUMN public.plg_fiscalbr_emitter_settings.nfse_iss_exigibility IS 'V1: companies.nfse_iss_exigibilidade';\nCOMMENT ON COLUMN public.plg_fiscalbr_emitter_settings.nfse_simples_regime IS 'V1: companies.nfse_regime_apuracao_sn \u2014 s\u00F3 para optante do Simples.';\nCOMMENT ON COLUMN public.plg_fiscalbr_emitter_settings.nfse_net_value IS 'V1: companies.nfse_valor_liquido \u2014 emitir pelo valor l\u00EDquido.';\nCOMMENT ON COLUMN public.plg_fiscalbr_emitter_settings.nfse_city_features IS 'V1: companies.nfse_city_features \u2014 o que a prefeitura aceita, devolvido pelo provedor.';\nCOMMENT ON COLUMN public.plg_fiscalbr_emitter_settings.nfce_csc_token IS 'V1: companies.nfce_csc_token \u2014 SEGREDO. Fora do GRANT SELECT de authenticated.';\nCOMMENT ON COLUMN public.plg_fiscalbr_emitter_settings.nfce_generic_item IS 'V1: companies.nfce_item_generico \u2014 {ncm, cfop, csosn}.';\nCOMMENT ON COLUMN public.plg_fiscalbr_emitter_settings.certificate_provider_id IS 'V1: companies.certificate_plugnotas_id \u2014 recibo; o .pfx n\u00E3o fica no banco.';\nCOMMENT ON COLUMN public.plg_fiscalbr_emitter_settings.dfe_sync_enabled IS 'V1: companies.dfe_sync_enabled \u2014 receber DANFes automaticamente.';\nCOMMENT ON COLUMN public.plg_fiscalbr_emitter_settings.dfe_sync_cursor IS 'V1: companies.dfe_sync_cursor \u2014 NSU onde a busca na SEFAZ parou.';\n\nALTER TABLE public.plg_fiscalbr_emitter_settings ENABLE ROW LEVEL SECURITY;\nALTER TABLE public.plg_fiscalbr_emitter_settings FORCE ROW LEVEL SECURITY;\n\n-- O segredo fica fora do SELECT: grava-se, n\u00E3o se l\u00EA.\nREVOKE ALL ON TABLE public.plg_fiscalbr_emitter_settings FROM anon, authenticated;\nGRANT INSERT, UPDATE, DELETE ON TABLE public.plg_fiscalbr_emitter_settings TO authenticated;\nGRANT SELECT (\n id, tenant_id, legal_entity_id,\n nfse_enabled, nfse_production, nfse_national, nfse_service_code_national, nfse_service_code_municipal,\n nfse_nbs_code, nfse_cnae, nfse_iss_rate, nfse_iss_taxation, nfse_iss_exigibility, nfse_ibscbs_cst,\n nfse_ibscbs_classification, nfse_simples_regime, nfse_net_value, nfse_additional_info, nfse_city_features,\n nfce_enabled, nfce_production, nfce_series, nfce_csc_id, nfce_csc_token_set, nfce_generic_item,\n nfe_enabled, certificate_provider_id, certificate_cn, certificate_expires_at, certificate_uploaded_at,\n dfe_sync_enabled, dfe_sync_cursor, dfe_last_sync_at, provider_synced_at, created_at, updated_at\n) ON public.plg_fiscalbr_emitter_settings TO authenticated;\nGRANT ALL ON TABLE public.plg_fiscalbr_emitter_settings TO service_role;\n\nDROP POLICY IF EXISTS plg_fiscalbr_emitter_settings_authz_select ON public.plg_fiscalbr_emitter_settings;\nCREATE POLICY plg_fiscalbr_emitter_settings_authz_select ON public.plg_fiscalbr_emitter_settings\n FOR SELECT TO authenticated USING (\n tenant_id = (SELECT app.current_tenant_id())\n AND (SELECT app.has_permission('financial.read', NULL::uuid)));\n\nDROP POLICY IF EXISTS plg_fiscalbr_emitter_settings_authz_write ON public.plg_fiscalbr_emitter_settings;\nCREATE POLICY plg_fiscalbr_emitter_settings_authz_write ON public.plg_fiscalbr_emitter_settings\n FOR ALL TO authenticated\n USING (\n tenant_id = (SELECT app.current_tenant_id())\n AND (SELECT app.has_permission('settings.manage', NULL::uuid)))\n WITH CHECK (\n tenant_id = (SELECT app.current_tenant_id())\n AND (SELECT app.has_permission('settings.manage', NULL::uuid))\n AND EXISTS (SELECT 1 FROM public.company_legal_entities le\n WHERE le.id = plg_fiscalbr_emitter_settings.legal_entity_id\n AND le.tenant_id = plg_fiscalbr_emitter_settings.tenant_id));\n";
19
19
  export declare const MIGRATION_018_A_NOTA_DO_V1_ALCANCA_A_CONTA = "-- A nota que veio do V1 alcan\u00E7a a conta que a gerou.\n--\n-- A conta a receber pergunta \"que notas eu tenho?\" pelo pedido dela:\n-- plg_financial_invoices.order_id \u2192 plg_fiscalbr_document_orders \u2192 a nota.\n-- A importa\u00E7\u00E3o s\u00F3 preencheu esse v\u00EDnculo a partir da tabela N:N do V1\n-- (fiscal_document_invoice_sources). A NFS-e do V1 nunca usou essa tabela: ela\n-- aponta a conta por fiscal_documents.invoice_id, que chegou aqui apenas como\n-- metadata.v1.invoice_ref. Medido em 06-10-2026 no cluster do ChefControl: 488\n-- NFS-e e 122 NFC-e sem caminho at\u00E9 a conta.\n--\n-- A conta importada guarda o pr\u00F3prio id do V1 em\n-- metadata.migration.source_numeric_id, ent\u00E3o o par se resolve sem adivinhar.\n-- Num pool sem dado do V1 isto n\u00E3o casa nada. Aditivo e idempotente.\n\nINSERT INTO public.plg_fiscalbr_document_orders (tenant_id, document_id, order_id)\nSELECT DISTINCT f.tenant_id, f.document_id, i.order_id\n FROM public.plg_fiscalbr_documents f\n JOIN public.plg_financial_invoices i\n ON i.tenant_id = f.tenant_id\n AND i.metadata -> 'migration' ->> 'source_table' = 'invoices'\n AND i.metadata -> 'migration' ->> 'source_numeric_id' = f.metadata -> 'v1' ->> 'invoice_ref'\n JOIN public.orders o ON o.id = i.order_id\n WHERE f.metadata -> 'v1' ->> 'invoice_ref' IS NOT NULL\nON CONFLICT (document_id, order_id) DO NOTHING;\n";
20
20
  export declare const MIGRATION_019_A_NOTA_EMITIDA_SE_CANCELA_PELO_V2 = "-- A nota emitida se consulta e se cancela pelo V2.\n--\n-- Quem fala com a PlugNotas \u00E9 a fun\u00E7\u00E3o `fiscalbr-plugnotas` (a chave s\u00F3 existe\n-- no servidor), mas ela roda com o JWT de quem clicou e n\u00E3o grava nada direto:\n-- pergunta aqui se a pessoa pode, e devolve o resultado aqui. Uma porta de\n-- leitura, uma de escrita, a permiss\u00E3o conferida nas duas.\n--\n-- consultar e baixar o PDF \u2192 financial.read na unidade da nota\n-- cancelar \u2192 financial.edit na unidade da nota\n--\n-- A espelho em `documents.status` anda junto: as duas tabelas s\u00E3o a mesma nota\n-- vista de dois lugares (005), e um status divergente entre elas \u00E9 a nota\n-- dizendo duas coisas. Idempotente.\n\nCREATE OR REPLACE FUNCTION public.fiscalbr_note_for_provider(p_document_id uuid, p_action text)\nRETURNS jsonb\nLANGUAGE plpgsql\nSTABLE SECURITY DEFINER\nSET search_path TO ''\nAS $$\nDECLARE\n v public.plg_fiscalbr_documents%ROWTYPE;\nBEGIN\n SELECT * INTO v FROM public.plg_fiscalbr_documents\n WHERE document_id = p_document_id AND tenant_id = app.current_tenant_id();\n IF NOT FOUND THEN\n RAISE EXCEPTION 'fiscal: note not found' USING ERRCODE = 'P0002';\n END IF;\n PERFORM public.plg_financial_require_permission(\n CASE WHEN p_action = 'cancel' THEN 'financial.edit' ELSE 'financial.read' END, v.unit_id);\n RETURN jsonb_build_object(\n 'document_id', v.document_id, 'model', v.model, 'status', v.status,\n 'environment', v.environment, 'provider_document_id', v.provider_document_id,\n 'cancelled_at', v.cancelled_at, 'access_key', v.access_key, 'number', v.number);\nEND $$;\n\nCREATE OR REPLACE FUNCTION public.fiscalbr_note_apply(\n p_document_id uuid,\n p_action text,\n p_patch jsonb,\n p_event jsonb DEFAULT NULL\n)\nRETURNS void\nLANGUAGE plpgsql\nSECURITY DEFINER\nSET search_path TO ''\nAS $$\nDECLARE\n v public.plg_fiscalbr_documents%ROWTYPE;\n v_status text := p_patch ->> 'status';\nBEGIN\n SELECT * INTO v FROM public.plg_fiscalbr_documents\n WHERE document_id = p_document_id AND tenant_id = app.current_tenant_id()\n FOR UPDATE;\n IF NOT FOUND THEN\n RAISE EXCEPTION 'fiscal: note not found' USING ERRCODE = 'P0002';\n END IF;\n PERFORM public.plg_financial_require_permission(\n CASE WHEN p_action = 'cancel' THEN 'financial.edit' ELSE 'financial.read' END, v.unit_id);\n IF v_status IS NOT NULL AND v_status NOT IN ('processing','authorized','rejected','error','cancelled','substituted') THEN\n RAISE EXCEPTION 'fiscal: unknown status %', v_status USING ERRCODE = '22023';\n END IF;\n\n -- Only what the provider answers; identity (model, unit, order) never moves.\n UPDATE public.plg_fiscalbr_documents SET\n status = COALESCE(v_status, status),\n number = COALESCE(p_patch ->> 'number', number),\n series = COALESCE(p_patch ->> 'series', series),\n access_key = COALESCE(p_patch ->> 'access_key', access_key),\n verification_code = COALESCE(p_patch ->> 'verification_code', verification_code),\n status_payload = COALESCE(p_patch -> 'status_payload', status_payload),\n rejection_payload = CASE WHEN p_patch ? 'rejection_payload' THEN p_patch -> 'rejection_payload' ELSE rejection_payload END,\n authorized_at = COALESCE((p_patch ->> 'authorized_at')::timestamptz, authorized_at),\n last_polled_at = CASE WHEN p_action = 'poll' THEN now() ELSE last_polled_at END,\n cancelled_at = CASE WHEN p_patch ? 'cancelled_at' THEN (p_patch ->> 'cancelled_at')::timestamptz ELSE cancelled_at END,\n cancel_reason = CASE WHEN p_patch ? 'cancel_reason' THEN p_patch ->> 'cancel_reason' ELSE cancel_reason END,\n cancelled_by_user_id = CASE WHEN p_action = 'cancel' THEN auth.uid()\n WHEN p_patch ? 'cancelled_at' AND p_patch -> 'cancelled_at' = 'null'::jsonb THEN NULL\n ELSE cancelled_by_user_id END\n WHERE document_id = p_document_id;\n\n IF v_status IS NOT NULL THEN\n UPDATE public.documents SET status = v_status WHERE id = p_document_id AND status IS DISTINCT FROM v_status;\n END IF;\n\n IF p_event IS NOT NULL THEN\n INSERT INTO public.plg_fiscalbr_document_events\n (tenant_id, unit_id, document_id, event_type, status, justification, response_payload, created_by_user_id)\n VALUES (v.tenant_id, v.unit_id, p_document_id, p_event ->> 'event_type', p_event ->> 'status',\n p_event ->> 'justification', p_event -> 'response_payload', auth.uid());\n END IF;\nEND $$;\n\nREVOKE ALL ON FUNCTION public.fiscalbr_note_for_provider(uuid, text) FROM PUBLIC, anon;\nREVOKE ALL ON FUNCTION public.fiscalbr_note_apply(uuid, text, jsonb, jsonb) FROM PUBLIC, anon;\nGRANT EXECUTE ON FUNCTION public.fiscalbr_note_for_provider(uuid, text) TO authenticated;\nGRANT EXECUTE ON FUNCTION public.fiscalbr_note_apply(uuid, text, jsonb, jsonb) TO authenticated;\n";
21
+ export declare const MIGRATION_020_A_NOTA_ACHA_O_FORNECEDOR_PELO_CNPJ = "-- A nota acha o fornecedor pelo CNPJ \u2014 e, se n\u00E3o achar, cadastra.\n--\n-- O est\u00E1gio (009) s\u00F3 casava o CNPJ no momento do import. As notas que vieram\n-- do V1 atravessaram sem o v\u00EDnculo (003 deixou para \"a costura\"), e um\n-- fornecedor cadastrado depois nunca era religado: 1029 notas com o fornecedor\n-- no cadastro e a tela dizendo \"n\u00E3o est\u00E1 no cadastro\", e o t\u00EDtulo aceito no V2\n-- nascendo sem contraparte (o tra\u00E7o em Contas a Pagar).\n--\n-- O V1 nunca pediu cadastro: ao aceitar, `resolveSupplierId` procura o\n-- fornecedor pelo CNPJ e, sem achar, cria com o nome e o CNPJ da nota. Esta\n-- fun\u00E7\u00E3o \u00E9 esse gesto, com duas pontas:\n--\n-- p_create = false s\u00F3 casa (ao abrir a nota)\n-- p_create = true casa ou cria (antes de aceitar)\n--\n-- O t\u00EDtulo da nota, se j\u00E1 existe e est\u00E1 SEM contraparte, recebe a mesma pessoa.\n-- Nunca troca um v\u00EDnculo gravado. Idempotente.\n\nCREATE OR REPLACE FUNCTION public.plg_fiscalbr_supplier_for_cnpj(p_tenant uuid, p_cnpj text)\nRETURNS uuid\nLANGUAGE sql\nSTABLE\nSET search_path TO ''\nAS $$\n SELECT p.id FROM public.people p\n WHERE p.tenant_id = p_tenant\n AND p_cnpj <> ''\n AND public.plg_fiscalbr_digits(p.document_number) = p_cnpj\n ORDER BY (p.kind = 'supplier') DESC, p.created_at\n LIMIT 1\n$$;\n\nCREATE OR REPLACE FUNCTION public.fiscalbr_link_inbox_supplier(p_document_id uuid, p_create boolean DEFAULT false)\nRETURNS jsonb\nLANGUAGE plpgsql\nSECURITY DEFINER\nSET search_path TO ''\nAS $$\nDECLARE\n v_tenant uuid := public.plg_financial_require_tenant();\n v_doc public.plg_fiscalbr_inbox_documents%ROWTYPE;\n v_cnpj text;\n v_party uuid;\n v_created boolean := false;\nBEGIN\n SELECT * INTO v_doc FROM public.plg_fiscalbr_inbox_documents\n WHERE id = p_document_id AND tenant_id = v_tenant;\n IF NOT FOUND THEN\n RAISE EXCEPTION 'fiscal: inbox note not found' USING ERRCODE = 'P0002';\n END IF;\n PERFORM public.plg_financial_require_permission(\n CASE WHEN p_create THEN 'financial.create' ELSE 'financial.read' END, v_doc.unit_id);\n\n v_party := v_doc.supplier_party_id;\n v_cnpj := public.plg_fiscalbr_digits(v_doc.supplier_cnpj);\n\n IF v_party IS NULL THEN\n v_party := public.plg_fiscalbr_supplier_for_cnpj(v_tenant, v_cnpj);\n END IF;\n\n -- Without a CNPJ there is nothing to match on; a name-only person would be a\n -- duplicate waiting to happen, so creation needs the document.\n IF v_party IS NULL AND p_create AND v_cnpj <> '' THEN\n INSERT INTO public.people (tenant_id, kind, name, document_number)\n VALUES (v_tenant, 'supplier', coalesce(nullif(trim(v_doc.supplier_name), ''), 'Fornecedor ' || v_cnpj), v_cnpj)\n RETURNING id INTO v_party;\n v_created := true;\n END IF;\n\n IF v_party IS NOT NULL AND v_doc.supplier_party_id IS NULL THEN\n UPDATE public.plg_fiscalbr_inbox_documents\n SET supplier_party_id = v_party\n WHERE id = v_doc.id AND supplier_party_id IS NULL;\n END IF;\n\n IF v_party IS NOT NULL AND v_doc.invoice_id IS NOT NULL THEN\n UPDATE public.plg_financial_invoices\n SET counterparty_person_id = v_party\n WHERE id = v_doc.invoice_id AND tenant_id = v_tenant AND counterparty_person_id IS NULL;\n END IF;\n\n RETURN jsonb_build_object('supplier_party_id', v_party, 'created', v_created);\nEND;\n$$;\n\nREVOKE ALL ON FUNCTION public.fiscalbr_link_inbox_supplier(uuid, boolean) FROM PUBLIC;\nGRANT EXECUTE ON FUNCTION public.fiscalbr_link_inbox_supplier(uuid, boolean) TO authenticated;\n\n-- Backfill: match only, NULLs only. Nothing is created here \u2014 creating a person\n-- is the operator's gesture (accepting), not a migration's.\nWITH p AS (\n SELECT DISTINCT ON (tenant_id, dg) tenant_id, dg, id\n FROM (SELECT tenant_id, id, kind, created_at, public.plg_fiscalbr_digits(document_number) AS dg\n FROM public.people\n WHERE document_number IS NOT NULL) x\n WHERE length(dg) = 14\n ORDER BY tenant_id, dg, (kind = 'supplier') DESC, created_at\n)\nUPDATE public.plg_fiscalbr_inbox_documents d\n SET supplier_party_id = p.id\n FROM p\n WHERE d.supplier_party_id IS NULL\n AND p.tenant_id = d.tenant_id\n AND p.dg = public.plg_fiscalbr_digits(d.supplier_cnpj);\n\nUPDATE public.plg_financial_invoices i\n SET counterparty_person_id = d.supplier_party_id\n FROM public.plg_fiscalbr_inbox_documents d\n WHERE d.invoice_id = i.id\n AND d.tenant_id = i.tenant_id\n AND d.supplier_party_id IS NOT NULL\n AND i.counterparty_person_id IS NULL;\n";
22
+ export declare const MIGRATION_021_USO_E_CONSUMO_ENTRA_NO_ESTOQUE = "-- \"Materiais de Uso e Consumo\" vira um tipo de registro da nota recebida.\n--\n-- \u00C9 o que a casa gasta sem vender nem transformar \u2014 luva, descart\u00E1vel, material\n-- de limpeza \u2014 e que ainda assim se conta no estoque. Entra no estoque como o\n-- insumo: precisa de produto vinculado e gera movimento ao aceitar.\n--\n-- Aditivo e idempotente. A fun\u00E7\u00E3o de aceite \u00E9 REMENDADA, n\u00E3o reescrita (mesmo\n-- padr\u00E3o da 015): copiar o corpo da 010 apagaria o `reason` que a 015 enxertou.\n\nALTER TABLE public.plg_fiscalbr_inbox_items\n DROP CONSTRAINT IF EXISTS plg_fiscalbr_inbox_items_entry_type_chk;\nALTER TABLE public.plg_fiscalbr_inbox_items\n ADD CONSTRAINT plg_fiscalbr_inbox_items_entry_type_chk\n CHECK (entry_type IS NULL OR entry_type IN ('insumo','revenda','patrimonio','uso_consumo','despesa','servico'));\n\nALTER TABLE public.plg_fiscalbr_supplier_product_map\n DROP CONSTRAINT IF EXISTS plg_fiscalbr_supplier_product_map_entry_type_chk;\nALTER TABLE public.plg_fiscalbr_supplier_product_map\n ADD CONSTRAINT plg_fiscalbr_supplier_product_map_entry_type_chk\n CHECK (entry_type IS NULL OR entry_type IN ('insumo','revenda','patrimonio','uso_consumo','despesa','servico'));\n\nDO $m$\nDECLARE\n v_def text;\n v_antes text := $q$entry_type IN ('insumo','revenda','patrimonio')$q$;\n v_depois text := $q$entry_type IN ('insumo','revenda','patrimonio','uso_consumo')$q$;\nBEGIN\n SELECT pg_get_functiondef(p.oid) INTO v_def\n FROM pg_proc p JOIN pg_namespace n ON n.oid = p.pronamespace\n WHERE n.nspname = 'public' AND p.proname = 'fiscalbr_accept_inbox_document';\n\n IF v_def IS NULL THEN\n RAISE EXCEPTION 'fiscalbr/021: fiscalbr_accept_inbox_document n\u00E3o existe \u2014 aplicar 009/010 antes';\n END IF;\n\n IF position('uso_consumo' in v_def) > 0 THEN RETURN; END IF;\n\n IF position(v_antes in v_def) = 0 THEN\n RAISE EXCEPTION 'fiscalbr/021: o corpo de fiscalbr_accept_inbox_document n\u00E3o \u00E9 o esperado \u2014 confira \u00E0 m\u00E3o em vez de deixar passar calado';\n END IF;\n\n EXECUTE replace(v_def, v_antes, v_depois);\nEND\n$m$;\n";
21
23
  export declare const MIGRATIONS: Array<{
22
24
  id: string;
23
25
  sql: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,sBAAsB,2g0BA2jBlC,CAAA;AAED,eAAO,MAAM,0DAA0D,uzRAmMtE,CAAA;AAED,eAAO,MAAM,+CAA+C,m5oBAyW3D,CAAA;AAED,eAAO,MAAM,0CAA0C,o1XAgPtD,CAAA;AAED,eAAO,MAAM,8CAA8C,6qCAsB1D,CAAA;AAED,eAAO,MAAM,2CAA2C,w8dA6MvD,CAAA;AAED,eAAO,MAAM,yCAAyC,42BAkBrD,CAAA;AAED,eAAO,MAAM,oDAAoD,4oDA+BhE,CAAA;AAED,eAAO,MAAM,yDAAyD,otbA0NrE,CAAA;AAED,eAAO,MAAM,gEAAgE,q1+BAoiB5E,CAAA;AAED,eAAO,MAAM,gEAAgE,mqVAgO5E,CAAA;AAED,eAAO,MAAM,8CAA8C,k/HAiF1D,CAAA;AAED,eAAO,MAAM,oDAAoD,w2OA4JhE,CAAA;AAED,eAAO,MAAM,oDAAoD,gvRAwJhE,CAAA;AAED,eAAO,MAAM,kDAAkD,shPAoK9D,CAAA;AAED,eAAO,MAAM,8CAA8C,8/EA0C1D,CAAA;AAED,eAAO,MAAM,yCAAyC,2mJA2ErD,CAAA;AAED,eAAO,MAAM,4CAA4C,68QA0IxD,CAAA;AAED,eAAO,MAAM,0CAA0C,83CAwBtD,CAAA;AAED,eAAO,MAAM,+CAA+C,81JAiG3D,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAqBzD,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,sBAAsB,2g0BA2jBlC,CAAA;AAED,eAAO,MAAM,0DAA0D,uzRAmMtE,CAAA;AAED,eAAO,MAAM,+CAA+C,m5oBAyW3D,CAAA;AAED,eAAO,MAAM,0CAA0C,o1XAgPtD,CAAA;AAED,eAAO,MAAM,8CAA8C,6qCAsB1D,CAAA;AAED,eAAO,MAAM,2CAA2C,w8dA6MvD,CAAA;AAED,eAAO,MAAM,yCAAyC,42BAkBrD,CAAA;AAED,eAAO,MAAM,oDAAoD,4oDA+BhE,CAAA;AAED,eAAO,MAAM,yDAAyD,otbA0NrE,CAAA;AAED,eAAO,MAAM,gEAAgE,q1+BAoiB5E,CAAA;AAED,eAAO,MAAM,gEAAgE,mqVAgO5E,CAAA;AAED,eAAO,MAAM,8CAA8C,k/HAiF1D,CAAA;AAED,eAAO,MAAM,oDAAoD,w2OA4JhE,CAAA;AAED,eAAO,MAAM,oDAAoD,gvRAwJhE,CAAA;AAED,eAAO,MAAM,kDAAkD,shPAoK9D,CAAA;AAED,eAAO,MAAM,8CAA8C,8/EA0C1D,CAAA;AAED,eAAO,MAAM,yCAAyC,2mJA2ErD,CAAA;AAED,eAAO,MAAM,4CAA4C,68QA0IxD,CAAA;AAED,eAAO,MAAM,0CAA0C,83CAwBtD,CAAA;AAED,eAAO,MAAM,+CAA+C,81JAiG3D,CAAA;AAED,eAAO,MAAM,gDAAgD,y+IAgH5D,CAAA;AAED,eAAO,MAAM,4CAA4C,ylEA4CxD,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAuBzD,CAAA"}
package/dist/types.d.ts CHANGED
@@ -53,7 +53,7 @@ export interface PlugNotasFinancialProviderOptions {
53
53
  gateway: PlugNotasFiscalGateway;
54
54
  }
55
55
  /** Os cinco tipos de registro do V1, medidos em 3.402 linhas de produção. */
56
- export type InboxEntryType = 'insumo' | 'revenda' | 'patrimonio' | 'despesa' | 'servico';
56
+ export type InboxEntryType = 'insumo' | 'revenda' | 'patrimonio' | 'uso_consumo' | 'despesa' | 'servico';
57
57
  /** Despesa e serviço nunca viram estoque: viram só título a pagar. */
58
58
  export declare const STOCK_BEARING_ENTRY_TYPES: readonly InboxEntryType[];
59
59
  export declare const isStockBearing: (type: string | null | undefined) => boolean;
@@ -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":"InboundNotesView.d.ts","sourceRoot":"","sources":["../../src/views/InboundNotesView.tsx"],"names":[],"mappings":"AAYA,OAAO,KAA4D,MAAM,OAAO,CAAA;AAgDhF,MAAM,WAAW,qBAAqB;IACpC,iFAAiF;IACjF,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,EAAE,qBAAqB,qBAuXrF"}
1
+ {"version":3,"file":"InboundNotesView.d.ts","sourceRoot":"","sources":["../../src/views/InboundNotesView.tsx"],"names":[],"mappings":"AAYA,OAAO,KAA4D,MAAM,OAAO,CAAA;AAkDhF,MAAM,WAAW,qBAAqB;IACpC,iFAAiF;IACjF,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,EAAE,qBAAqB,qBAmbrF"}
@@ -1 +1 @@
1
- {"version":3,"file":"InvoiceNotesButton.d.ts","sourceRoot":"","sources":["../../src/views/InvoiceNotesButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAA;AAmC/D,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,gGAAgG;AAChG,wBAAgB,kBAAkB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,uBAAuB,4BAoE9F"}
1
+ {"version":3,"file":"InvoiceNotesButton.d.ts","sourceRoot":"","sources":["../../src/views/InvoiceNotesButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAA;AAoC/D,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,gGAAgG;AAChG,wBAAgB,kBAAkB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,uBAAuB,4BAoE9F"}
@@ -1 +1 @@
1
- {"version":3,"file":"ManifestView.d.ts","sourceRoot":"","sources":["../../src/views/ManifestView.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAoD,MAAM,OAAO,CAAA;AAmBxE,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,wBAAgB,YAAY,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,iBAAiB,qBA0IrE"}
1
+ {"version":3,"file":"ManifestView.d.ts","sourceRoot":"","sources":["../../src/views/ManifestView.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAoD,MAAM,OAAO,CAAA;AAoBxE,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,wBAAgB,YAAY,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,iBAAiB,qBAgJrE"}
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import { type InstalmentInput, type PaymentCode } from '../data/inbox';
3
+ /**
4
+ * Put a read payment code on the instalment it belongs to: the empty one with
5
+ * the same amount, else the first empty one, else a new instalment. Never
6
+ * overwrites a code already there.
7
+ */
8
+ export declare function applyPaymentCode(list: InstalmentInput[], code: PaymentCode): {
9
+ next: InstalmentInput[];
10
+ index: number;
11
+ };
12
+ export declare function NoteAttachmentsCard({ noteId, invoiceId, readOnly, instalments, onInstalments }: {
13
+ noteId: string;
14
+ invoiceId?: string | null;
15
+ readOnly?: boolean;
16
+ instalments: InstalmentInput[];
17
+ onInstalments: (next: InstalmentInput[]) => void;
18
+ }): React.JSX.Element;
19
+ //# sourceMappingURL=NoteAttachmentsCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NoteAttachmentsCard.d.ts","sourceRoot":"","sources":["../../src/views/NoteAttachmentsCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAA;AAGvE,OAAO,EAEL,KAAK,eAAe,EAAuB,KAAK,WAAW,EAC5D,MAAM,eAAe,CAAA;AAOtB;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,WAAW,GAAG;IAAE,IAAI,EAAE,eAAe,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAevH;AAED,wBAAgB,mBAAmB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,EAAE;IAC/F,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,eAAe,EAAE,CAAA;IAC9B,aAAa,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,IAAI,CAAA;CACjD,qBAqKA"}
@@ -1 +1 @@
1
- {"version":3,"file":"NoteReconcileView.d.ts","sourceRoot":"","sources":["../../src/views/NoteReconcileView.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAoD,MAAM,OAAO,CAAA;AA4ExE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,uFAAuF;IACvF,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAC1B;AAED,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAe,EAAE,EAAE,sBAAsB,qBA8kC3G"}
1
+ {"version":3,"file":"NoteReconcileView.d.ts","sourceRoot":"","sources":["../../src/views/NoteReconcileView.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAoD,MAAM,OAAO,CAAA;AA+ExE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,uFAAuF;IACvF,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAC1B;AAED,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAe,EAAE,EAAE,sBAAsB,qBA6mC3G"}
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { type PullByKeyResult } from '../data/inbox';
3
+ export interface PullByKeyDialogProps {
4
+ open: boolean;
5
+ onOpenChange: (open: boolean) => void;
6
+ unitId?: string | null;
7
+ /** Called after a note was staged, with what the parser found. */
8
+ onPulled: (result: Extract<PullByKeyResult, {
9
+ status: 'staged';
10
+ }>) => void;
11
+ }
12
+ export declare function PullByKeyDialog({ open, onOpenChange, unitId, onPulled }: PullByKeyDialogProps): React.JSX.Element;
13
+ //# sourceMappingURL=PullByKeyDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PullByKeyDialog.d.ts","sourceRoot":"","sources":["../../src/views/PullByKeyDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAMlD,OAAO,EAAsD,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AAOxG,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,kEAAkE;IAClE,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,EAAE;QAAE,MAAM,EAAE,QAAQ,CAAA;KAAE,CAAC,KAAK,IAAI,CAAA;CAC3E;AAED,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,oBAAoB,qBAkG7F"}
@@ -1 +1 @@
1
- {"version":3,"file":"inventoryView.d.ts","sourceRoot":"","sources":["../../src/views/inventoryView.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,OAAO,EAAoB,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAGjF,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,qBAA0B;;;;;;;;;;;EA6B5E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IAC9D,QAAQ,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5E,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB,qBA2DA;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACzD,KAAK,EAAE,MAAM,IAAI,GAChB,KAAK,CAAC,SAAS,GAAG,SAAS,CAG7B"}
1
+ {"version":3,"file":"inventoryView.d.ts","sourceRoot":"","sources":["../../src/views/inventoryView.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,OAAO,EAAoB,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAIjF,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,qBAA0B;;;;;;;;;;;EA6B5E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IAC9D,QAAQ,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5E,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB,qBA2DA;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACzD,KAAK,EAAE,MAAM,IAAI,GAChB,KAAK,CAAC,SAAS,GAAG,SAAS,CAG7B"}
@@ -0,0 +1,192 @@
1
+ // fiscalbr-dfe-pull — fetch ONE inbound NF-e (XML, or with `action: 'pdf'` its DANFE) by access key.
2
+ //
3
+ // Env: PLUGNOTAS_API_KEY (server-only), PLUGNOTAS_BASE_URL (optional), SUPABASE_URL, SUPABASE_ANON_KEY.
4
+ //
5
+ // Port of the `{ chave, company_id }` branch of the V1 `dfe-plugnotas-sync`, minus
6
+ // its manifestation: the V1 sends «Confirmação da Operação» for every new note,
7
+ // and the V2 does not manifest (founder decision, 30-09 / 08-10). This function
8
+ // only returns the XML; the browser stages it through the same RPC as «Importar
9
+ // XML», so permissions, de-para and the payable are exactly that path's.
10
+ //
11
+ // Reads run with the caller's JWT: the CNPJ comes from rows the caller can see.
12
+ import { createClient } from 'https://esm.sh/@supabase/supabase-js@2.45.0'
13
+
14
+ const corsHeaders = {
15
+ 'Access-Control-Allow-Origin': '*',
16
+ 'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type',
17
+ }
18
+
19
+ const json = (body: unknown, status = 200) =>
20
+ new Response(JSON.stringify(body), { status, headers: { ...corsHeaders, 'Content-Type': 'application/json' } })
21
+
22
+ // deno-lint-ignore no-explicit-any
23
+ type Any = any
24
+
25
+ const API = () => (Deno.env.get('PLUGNOTAS_BASE_URL') || 'https://api.plugnotas.com.br').replace(/\/$/, '')
26
+ const digits = (v: unknown) => String(v ?? '').replace(/\D/g, '')
27
+
28
+ function isValidAccessKey(key: string): boolean {
29
+ if (!/^\d{44}$/.test(key)) return false
30
+ let sum = 0
31
+ let weight = 2
32
+ for (let i = 42; i >= 0; i--) {
33
+ sum += Number(key[i]) * weight
34
+ weight = weight === 9 ? 2 : weight + 1
35
+ }
36
+ const rest = sum % 11
37
+ return Number(key[43]) === (rest < 2 ? 0 : 11 - rest)
38
+ }
39
+
40
+ function parse(text: string): Any {
41
+ try { return JSON.parse(text) } catch { return null }
42
+ }
43
+
44
+ /** First string under any of `names`, at any depth — PlugNotas nests its envelopes differently per endpoint. */
45
+ function deepString(value: Any, names: string[], depth = 0): string {
46
+ if (!value || typeof value !== 'object' || depth > 6) return ''
47
+ for (const n of names) if (typeof value[n] === 'string' && value[n]) return value[n]
48
+ for (const v of Object.values(value)) {
49
+ const found = deepString(v, names, depth + 1)
50
+ if (found) return found
51
+ }
52
+ return ''
53
+ }
54
+
55
+ /** A full NF-e has items (`<det`); a `resNFe` is only the SEFAZ summary and cannot be staged. */
56
+ const isFullNfe = (xml: string) => /<infNFe[\s>]/.test(xml) && /<det[\s>]/.test(xml)
57
+
58
+ async function downloadXml(apiKey: string, cnpj: string, key: string): Promise<{ xml: string; summaryOnly: boolean }> {
59
+ const urls = [
60
+ `${API()}/nfe/destinada/${cnpj}/${key}/xml`,
61
+ `${API()}/nfe/destinada/${key}/xml`,
62
+ `${API()}/nfe/${key}/xml`,
63
+ ]
64
+ let summaryOnly = false
65
+ for (const url of urls) {
66
+ try {
67
+ const res = await fetch(url, { headers: { 'x-api-key': apiKey, Accept: 'application/xml,text/xml,application/json' } })
68
+ if (!res.ok) continue
69
+ const text = await res.text()
70
+ const xml = text.includes('<') && !text.trimStart().startsWith('{') ? text : String(parse(text)?.xml ?? parse(text)?.data ?? '')
71
+ if (!xml.includes('<')) continue
72
+ if (isFullNfe(xml)) return { xml, summaryOnly: false }
73
+ if (/<resNFe[\s>]/.test(xml)) summaryOnly = true
74
+ } catch { /* next candidate */ }
75
+ }
76
+ return { xml: '', summaryOnly }
77
+ }
78
+
79
+ Deno.serve(async (req) => {
80
+ if (req.method === 'OPTIONS') return new Response('ok', { headers: corsHeaders })
81
+ try {
82
+ const apiKey = Deno.env.get('PLUGNOTAS_API_KEY')
83
+ if (!apiKey) return json({ error: 'A conexão com a SEFAZ não está configurada neste ambiente.' }, 503)
84
+ const auth = req.headers.get('Authorization') || ''
85
+ if (!auth) return json({ error: 'Unauthorized' }, 401)
86
+
87
+ const body: Any = await req.json().catch(() => ({}))
88
+ const key = digits(body?.key)
89
+ if (key.length !== 44) return json({ error: 'A chave de acesso da NF-e tem 44 dígitos.' }, 400)
90
+ if (!isValidAccessKey(key)) {
91
+ return json({ error: 'O dígito verificador desta chave não confere. Confira os 44 dígitos no DANFE ou no XML.' }, 400)
92
+ }
93
+
94
+ // A user with two accounts has no tenant without this; it only chooses among
95
+ // the caller's own memberships, never widens.
96
+ const tenantId = typeof body?.tenantId === 'string' ? body.tenantId : ''
97
+ const db = createClient(Deno.env.get('SUPABASE_URL')!, Deno.env.get('SUPABASE_ANON_KEY')!, {
98
+ global: { headers: { Authorization: auth, ...(tenantId ? { 'x-fayz-tenant': tenantId } : {}) } },
99
+ })
100
+
101
+ const { data: rows, error } = await db
102
+ .from('plg_fiscalbr_emitter_settings')
103
+ .select('legal_entity_id, certificate_provider_id, company_legal_entities!inner(id, legal_name, trade_name, document_number)')
104
+ .eq('dfe_sync_enabled', true)
105
+ if (error) return json({ error: error.message }, 500)
106
+
107
+ const eligible = (rows ?? [])
108
+ .filter((r: Any) => r.certificate_provider_id && digits(r.company_legal_entities?.document_number).length === 14)
109
+ .map((r: Any) => ({
110
+ id: r.legal_entity_id as string,
111
+ name: (r.company_legal_entities.trade_name || r.company_legal_entities.legal_name) as string,
112
+ cnpj: digits(r.company_legal_entities.document_number),
113
+ }))
114
+ if (eligible.length === 0) {
115
+ return json({
116
+ error: 'Nenhum CNPJ desta conta está recebendo DANFes da SEFAZ. Ative «Recebe DANFes» e envie o certificado A1 no cadastro da empresa.',
117
+ code: 'no_eligible_cnpj',
118
+ }, 422)
119
+ }
120
+ const chosen = typeof body?.legalEntityId === 'string'
121
+ ? eligible.find((e) => e.id === body.legalEntityId)
122
+ : eligible.length === 1 ? eligible[0] : undefined
123
+ if (!chosen) return json({ error: 'De qual CNPJ é esta nota?', code: 'choose_cnpj', options: eligible }, 409)
124
+ const cnpj = chosen.cnpj
125
+
126
+ if (body?.action === 'pdf') {
127
+ for (const url of [`${API()}/nfe/${key}/pdf`, `${API()}/nfe/destinada/${cnpj}/${key}/pdf`]) {
128
+ try {
129
+ const res = await fetch(url, { headers: { 'x-api-key': apiKey, Accept: 'application/pdf' } })
130
+ const bytes = new Uint8Array(await res.arrayBuffer())
131
+ // %PDF — PlugNotas answers some misses with 200 and a JSON body.
132
+ if (res.ok && bytes[0] === 0x25 && bytes[1] === 0x50 && bytes[2] === 0x44 && bytes[3] === 0x46) {
133
+ return new Response(bytes, { headers: { ...corsHeaders, 'Content-Type': 'application/pdf' } })
134
+ }
135
+ } catch { /* next candidate */ }
136
+ }
137
+ return json({ error: 'O serviço fiscal ainda não tem o DANFE desta nota.', code: 'no_pdf' }, 404)
138
+ }
139
+
140
+ // Already indexed by PlugNotas (e.g. the V1 sync saw it): no request needed.
141
+ let found = await downloadXml(apiKey, cnpj, key)
142
+ if (found.xml) return json({ xml: found.xml, cnpj })
143
+
144
+ // Asynchronous on PlugNotas: the POST returns a protocol, then we poll.
145
+ const post = await fetch(`${API()}/nfe/sincronizarDestinada/${cnpj}`, {
146
+ method: 'POST',
147
+ headers: { 'x-api-key': apiKey, 'Content-Type': 'application/json', Accept: 'application/json' },
148
+ body: JSON.stringify({ chave: [key] }),
149
+ })
150
+ const postText = await post.text()
151
+ if (!post.ok) {
152
+ const message = deepString(parse(postText), ['message', 'mensagem', 'error']) || postText.slice(0, 300)
153
+ // 15-minute throttle per key on PlugNotas' side; anything else is a real failure.
154
+ const throttled = post.status === 429 || /15 ?min|aguarde|already|já solicitad/i.test(message)
155
+ return json({
156
+ error: throttled
157
+ ? 'Esta chave já foi pedida há pouco. A SEFAZ só aceita o mesmo pedido a cada 15 minutos — tente de novo depois.'
158
+ : `O serviço fiscal recusou o pedido: ${message}`,
159
+ code: throttled ? 'throttled' : 'provider_error',
160
+ }, throttled ? 429 : 502)
161
+ }
162
+
163
+ const target = deepString(parse(postText), ['protocol', 'protocolo']) || key
164
+ const deadline = Date.now() + 40_000
165
+ while (Date.now() < deadline) {
166
+ await new Promise((r) => setTimeout(r, 2_500))
167
+ const res = await fetch(`${API()}/nfe/sincronizarDestinada/${cnpj}/${target}`, {
168
+ headers: { 'x-api-key': apiKey, Accept: 'application/json' },
169
+ })
170
+ const status = deepString(parse(await res.text()), ['status', 'situacao']).toUpperCase()
171
+ if (['REJEITADO', 'ERRO', 'DENEGADO', 'CANCELADO'].includes(status)) {
172
+ return json({ error: `A SEFAZ respondeu «${status.toLowerCase()}» para esta chave. Confira se a nota é mesmo contra este CNPJ.`, code: 'rejected' }, 422)
173
+ }
174
+ if (status === 'CONCLUIDO') break
175
+ }
176
+
177
+ found = await downloadXml(apiKey, cnpj, key)
178
+ if (found.xml) return json({ xml: found.xml, cnpj })
179
+ if (found.summaryOnly) {
180
+ return json({
181
+ error: 'A SEFAZ só entregou o resumo desta nota, sem os itens. Ela libera o XML completo depois que a nota é manifestada — faça a manifestação no sistema antigo e puxe de novo.',
182
+ code: 'summary_only',
183
+ }, 409)
184
+ }
185
+ return json({
186
+ pending: true,
187
+ message: 'O serviço fiscal registrou o pedido, mas a nota ainda não chegou. Tente de novo em alguns minutos.',
188
+ }, 202)
189
+ } catch (e) {
190
+ return json({ error: e instanceof Error ? e.message : String(e) }, 500)
191
+ }
192
+ })
@@ -0,0 +1,138 @@
1
+ // fiscalbr-payment-extract — read a boleto barcode or a Pix code off an attached
2
+ // image/PDF so the instalment fills itself. Port of the V1 `danfe-payment-extract`.
3
+ //
4
+ // Env: OPENAI_API_KEY (already set for fiscalbr-suggest-note-items),
5
+ // FISCALBR_EXTRACT_MODEL (optional). Deployed with verify_jwt: nothing is
6
+ // read or written here; amount and due date are re-derived from the digits in
7
+ // the browser, so the model only has to transcribe.
8
+ const corsHeaders = {
9
+ 'Access-Control-Allow-Origin': '*',
10
+ 'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type',
11
+ 'Access-Control-Allow-Methods': 'POST, OPTIONS',
12
+ };
13
+
14
+ const OPENAI_API_KEY = Deno.env.get('OPENAI_API_KEY');
15
+
16
+ const TOOL_SCHEMA = {
17
+ type: 'function' as const,
18
+ name: 'extract_payment_code',
19
+ description: 'Extrai o código de barras de boleto OU a chave/copia-e-cola PIX do documento.',
20
+ parameters: {
21
+ type: 'object',
22
+ properties: {
23
+ kind: { type: 'string', enum: ['barcode', 'pix', 'none'], description: 'Tipo do código encontrado.' },
24
+ code: { type: 'string', description: 'O código exatamente como visto, sem espaços ou pontos para boleto; PIX copia-e-cola completo ou chave.' },
25
+ amount: { type: ['number', 'null'], description: 'Valor monetário associado se visível.' },
26
+ due_date: { type: ['string', 'null'], description: 'Data de vencimento em formato ISO YYYY-MM-DD se visível no documento.' },
27
+ },
28
+ required: ['kind'],
29
+ },
30
+ };
31
+
32
+ const SYSTEM_PROMPT = `Você analisa imagens/PDFs de boletos bancários, comprovantes ou QR Codes PIX e extrai SOMENTE um código pagável.
33
+
34
+ Regras:
35
+ - Boleto bancário: retorne kind="barcode" e o código de barras NUMÉRICO com 44 a 48 dígitos, sem espaços/pontos/traços. Se houver "linha digitável" (47/48 dígitos), retorne-a.
36
+ - PIX (QR Code, chave ou copia-e-cola): retorne kind="pix" e o conteúdo completo (string EMV iniciando com 00020126... ou a chave isolada: CPF/CNPJ/email/telefone/UUID).
37
+ - Se nada disso for legível, retorne kind="none".
38
+ - NUNCA invente dígitos. Se incompleto, retorne kind="none".`;
39
+
40
+ Deno.serve(async (req) => {
41
+ if (req.method === 'OPTIONS') return new Response('ok', { headers: corsHeaders });
42
+
43
+ try {
44
+ if (!OPENAI_API_KEY) {
45
+ return new Response(JSON.stringify({ ok: false, error: 'OPENAI_API_KEY não configurada' }), {
46
+ status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
47
+ });
48
+ }
49
+
50
+ const { name, mime, base64 } = await req.json();
51
+ // ~15 MB of file; anything bigger is not a boleto and would only burn tokens.
52
+ if (typeof base64 === 'string' && base64.length > 20_000_000) {
53
+ return new Response(JSON.stringify({ ok: false, error: 'Arquivo grande demais para leitura (máx. 15 MB).' }), {
54
+ status: 413, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
55
+ });
56
+ }
57
+ if (!base64 || !mime) {
58
+ return new Response(JSON.stringify({ ok: false, error: 'Arquivo inválido' }), {
59
+ status: 400, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
60
+ });
61
+ }
62
+
63
+ const filePart = mime.startsWith('image/')
64
+ ? { type: 'input_image', image_url: `data:${mime};base64,${base64}`, detail: 'high' }
65
+ : mime === 'application/pdf'
66
+ ? { type: 'input_file', filename: name || 'doc.pdf', file_data: `data:application/pdf;base64,${base64}` }
67
+ : null;
68
+
69
+ if (!filePart) {
70
+ return new Response(JSON.stringify({ ok: true, kind: 'none' }), {
71
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
72
+ });
73
+ }
74
+
75
+ const oaiResp = await fetch('https://api.openai.com/v1/responses', {
76
+ method: 'POST',
77
+ headers: {
78
+ 'Authorization': `Bearer ${OPENAI_API_KEY}`,
79
+ 'Content-Type': 'application/json',
80
+ },
81
+ body: JSON.stringify({
82
+ model: Deno.env.get('FISCALBR_EXTRACT_MODEL') ?? 'gpt-4o',
83
+ input: [
84
+ { role: 'system', content: SYSTEM_PROMPT },
85
+ { role: 'user', content: [
86
+ { type: 'input_text', text: 'Analise o arquivo e retorne via extract_payment_code.' },
87
+ filePart,
88
+ ] },
89
+ ],
90
+ tools: [TOOL_SCHEMA],
91
+ tool_choice: { type: 'function', name: 'extract_payment_code' },
92
+ }),
93
+ });
94
+
95
+ if (!oaiResp.ok) {
96
+ const txt = await oaiResp.text();
97
+ return new Response(JSON.stringify({ ok: false, error: `OpenAI ${oaiResp.status}: ${txt.slice(0, 300)}` }), {
98
+ status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
99
+ });
100
+ }
101
+
102
+ const oai = await oaiResp.json();
103
+ let parsed: any = null;
104
+ for (const item of oai.output || []) {
105
+ if (item.type === 'function_call' && item.name === 'extract_payment_code') {
106
+ try { parsed = JSON.parse(item.arguments); } catch { /* noop */ }
107
+ break;
108
+ }
109
+ }
110
+
111
+ const kind = parsed?.kind || 'none';
112
+ const code = typeof parsed?.code === 'string' ? parsed.code.trim() : '';
113
+ const amount = typeof parsed?.amount === 'number' ? parsed.amount : null;
114
+ const dueRaw = typeof parsed?.due_date === 'string' ? parsed.due_date.trim() : '';
115
+ const due_date = /^\d{4}-\d{2}-\d{2}$/.test(dueRaw) ? dueRaw : null;
116
+
117
+ // Light sanity check for barcodes
118
+ if (kind === 'barcode') {
119
+ const digits = code.replace(/\D/g, '');
120
+ if (digits.length < 44 || digits.length > 48) {
121
+ return new Response(JSON.stringify({ ok: true, kind: 'none' }), {
122
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
123
+ });
124
+ }
125
+ return new Response(JSON.stringify({ ok: true, kind, code: digits, amount, due_date }), {
126
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
127
+ });
128
+ }
129
+
130
+ return new Response(JSON.stringify({ ok: true, kind, code, amount, due_date }), {
131
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
132
+ });
133
+ } catch (e: any) {
134
+ return new Response(JSON.stringify({ ok: false, error: e.message }), {
135
+ status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
136
+ });
137
+ }
138
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fayz-ai/plugin-fiscal-br",
3
- "version": "0.5.1",
3
+ "version": "0.7.0",
4
4
  "description": "[preview] Brazilian fiscal addon for asynchronous NFC-e emission through PlugNotas",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -24,10 +24,10 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@tanstack/react-table": "^8.20.0",
27
- "@fayz-ai/admin": "^0.39.0",
28
- "@fayz-ai/core": "^0.39.0",
29
- "@fayz-ai/plugin-financial": "^0.21.1",
30
- "@fayz-ai/ui": "^0.39.0"
27
+ "@fayz-ai/admin": "^0.42.0",
28
+ "@fayz-ai/core": "^0.40.0",
29
+ "@fayz-ai/plugin-financial": "^0.22.1",
30
+ "@fayz-ai/ui": "^0.42.0"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/node": "^20.0.0",