@baruk/core 0.3.1 → 0.5.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.
- package/.baruk-provenance.json +10 -0
- package/CHANGELOG.md +127 -0
- package/dist/audit/repository.d.ts +33 -1
- package/dist/audit/repository.d.ts.map +1 -1
- package/dist/audit/repository.js +41 -7
- package/dist/audit/repository.js.map +1 -1
- package/dist/auth/password-reset.d.ts +30 -1
- package/dist/auth/password-reset.d.ts.map +1 -1
- package/dist/auth/password-reset.js +139 -11
- package/dist/auth/password-reset.js.map +1 -1
- package/dist/auth/service.d.ts +60 -2
- package/dist/auth/service.d.ts.map +1 -1
- package/dist/auth/service.js +121 -11
- package/dist/auth/service.js.map +1 -1
- package/dist/billing/ar-repository.d.ts +374 -0
- package/dist/billing/ar-repository.d.ts.map +1 -0
- package/dist/billing/ar-repository.js +783 -0
- package/dist/billing/ar-repository.js.map +1 -0
- package/dist/billing/auto-generation.d.ts +87 -0
- package/dist/billing/auto-generation.d.ts.map +1 -0
- package/dist/billing/auto-generation.js +181 -0
- package/dist/billing/auto-generation.js.map +1 -0
- package/dist/billing/live-guard.d.ts +64 -0
- package/dist/billing/live-guard.d.ts.map +1 -0
- package/dist/billing/live-guard.js +68 -0
- package/dist/billing/live-guard.js.map +1 -0
- package/dist/billing/payment-means-catalog.d.ts +17 -0
- package/dist/billing/payment-means-catalog.d.ts.map +1 -0
- package/dist/billing/payment-means-catalog.js +21 -0
- package/dist/billing/payment-means-catalog.js.map +1 -0
- package/dist/billing/payment-means.d.ts +38 -0
- package/dist/billing/payment-means.d.ts.map +1 -0
- package/dist/billing/payment-means.js +29 -0
- package/dist/billing/payment-means.js.map +1 -0
- package/dist/billing/payment-rail.d.ts +118 -0
- package/dist/billing/payment-rail.d.ts.map +1 -0
- package/dist/billing/payment-rail.js +295 -0
- package/dist/billing/payment-rail.js.map +1 -0
- package/dist/billing/provider/asaas.d.ts +46 -1
- package/dist/billing/provider/asaas.d.ts.map +1 -1
- package/dist/billing/provider/asaas.js +194 -14
- package/dist/billing/provider/asaas.js.map +1 -1
- package/dist/billing/provider/manual.js +1 -1
- package/dist/billing/provider/manual.js.map +1 -1
- package/dist/billing/provider/types.d.ts +115 -8
- package/dist/billing/provider/types.d.ts.map +1 -1
- package/dist/billing/provider-account.d.ts +127 -0
- package/dist/billing/provider-account.d.ts.map +1 -0
- package/dist/billing/provider-account.js +217 -0
- package/dist/billing/provider-account.js.map +1 -0
- package/dist/billing/provider-onboarding.d.ts +67 -0
- package/dist/billing/provider-onboarding.d.ts.map +1 -0
- package/dist/billing/provider-onboarding.js +234 -0
- package/dist/billing/provider-onboarding.js.map +1 -0
- package/dist/billing/receivable.d.ts +5 -1
- package/dist/billing/receivable.d.ts.map +1 -1
- package/dist/billing/reconcile.d.ts +58 -0
- package/dist/billing/reconcile.d.ts.map +1 -0
- package/dist/billing/reconcile.js +138 -0
- package/dist/billing/reconcile.js.map +1 -0
- package/dist/billing/repository.d.ts +134 -1
- package/dist/billing/repository.d.ts.map +1 -1
- package/dist/billing/repository.js +193 -20
- package/dist/billing/repository.js.map +1 -1
- package/dist/cjs/audit/repository.js +41 -7
- package/dist/cjs/audit/repository.js.map +1 -1
- package/dist/cjs/auth/password-reset.js +141 -11
- package/dist/cjs/auth/password-reset.js.map +1 -1
- package/dist/cjs/auth/service.js +121 -10
- package/dist/cjs/auth/service.js.map +1 -1
- package/dist/cjs/billing/ar-repository.js +804 -0
- package/dist/cjs/billing/ar-repository.js.map +1 -0
- package/dist/cjs/billing/auto-generation.js +186 -0
- package/dist/cjs/billing/auto-generation.js.map +1 -0
- package/dist/cjs/billing/live-guard.js +72 -0
- package/dist/cjs/billing/live-guard.js.map +1 -0
- package/dist/cjs/billing/payment-means-catalog.js +25 -0
- package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
- package/dist/cjs/billing/payment-means.js +33 -0
- package/dist/cjs/billing/payment-means.js.map +1 -0
- package/dist/cjs/billing/payment-rail.js +301 -0
- package/dist/cjs/billing/payment-rail.js.map +1 -0
- package/dist/cjs/billing/provider/asaas.js +194 -14
- package/dist/cjs/billing/provider/asaas.js.map +1 -1
- package/dist/cjs/billing/provider/manual.js +1 -1
- package/dist/cjs/billing/provider/manual.js.map +1 -1
- package/dist/cjs/billing/provider-account.js +229 -0
- package/dist/cjs/billing/provider-account.js.map +1 -0
- package/dist/cjs/billing/provider-onboarding.js +239 -0
- package/dist/cjs/billing/provider-onboarding.js.map +1 -0
- package/dist/cjs/billing/reconcile.js +143 -0
- package/dist/cjs/billing/reconcile.js.map +1 -0
- package/dist/cjs/billing/repository.js +197 -19
- package/dist/cjs/billing/repository.js.map +1 -1
- package/dist/cjs/clients/ibge.js +103 -0
- package/dist/cjs/clients/ibge.js.map +1 -0
- package/dist/cjs/clients/repository.js +276 -23
- package/dist/cjs/clients/repository.js.map +1 -1
- package/dist/cjs/collection/branding.js +330 -0
- package/dist/cjs/collection/branding.js.map +1 -0
- package/dist/cjs/collection/channel-accounts.js +137 -0
- package/dist/cjs/collection/channel-accounts.js.map +1 -0
- package/dist/cjs/collection/channel.js +17 -0
- package/dist/cjs/collection/channel.js.map +1 -0
- package/dist/cjs/collection/clearance-store.js +74 -0
- package/dist/cjs/collection/clearance-store.js.map +1 -0
- package/dist/cjs/collection/communication-bridge.js +140 -0
- package/dist/cjs/collection/communication-bridge.js.map +1 -0
- package/dist/cjs/collection/communication-runtime.js +256 -0
- package/dist/cjs/collection/communication-runtime.js.map +1 -0
- package/dist/cjs/collection/consent-repository.js +84 -0
- package/dist/cjs/collection/consent-repository.js.map +1 -0
- package/dist/cjs/collection/copy.js +125 -0
- package/dist/cjs/collection/copy.js.map +1 -0
- package/dist/cjs/collection/delivery-callback.js +151 -0
- package/dist/cjs/collection/delivery-callback.js.map +1 -0
- package/dist/cjs/collection/email-layout.js +252 -0
- package/dist/cjs/collection/email-layout.js.map +1 -0
- package/dist/cjs/collection/engine.js +434 -0
- package/dist/cjs/collection/engine.js.map +1 -0
- package/dist/cjs/collection/format.js +76 -0
- package/dist/cjs/collection/format.js.map +1 -0
- package/dist/cjs/collection/payment-block.js +3 -0
- package/dist/cjs/collection/payment-block.js.map +1 -0
- package/dist/cjs/collection/policy.js +175 -0
- package/dist/cjs/collection/policy.js.map +1 -0
- package/dist/cjs/collection/repository.js +260 -0
- package/dist/cjs/collection/repository.js.map +1 -0
- package/dist/cjs/collection/subject.js +104 -0
- package/dist/cjs/collection/subject.js.map +1 -0
- package/dist/cjs/collection/template-catalog.js +165 -0
- package/dist/cjs/collection/template-catalog.js.map +1 -0
- package/dist/cjs/collection/template.js +78 -0
- package/dist/cjs/collection/template.js.map +1 -0
- package/dist/cjs/communication/adapters/email.js +132 -0
- package/dist/cjs/communication/adapters/email.js.map +1 -0
- package/dist/cjs/communication/adapters/sms.js +127 -0
- package/dist/cjs/communication/adapters/sms.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp.js +213 -0
- package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
- package/dist/cjs/communication/audit.js +61 -0
- package/dist/cjs/communication/audit.js.map +1 -0
- package/dist/cjs/communication/capabilities.js +76 -0
- package/dist/cjs/communication/capabilities.js.map +1 -0
- package/dist/cjs/communication/channel.js +53 -0
- package/dist/cjs/communication/channel.js.map +1 -0
- package/dist/cjs/communication/claim.js +228 -0
- package/dist/cjs/communication/claim.js.map +1 -0
- package/dist/cjs/communication/clearance.js +18 -0
- package/dist/cjs/communication/clearance.js.map +1 -0
- package/dist/cjs/communication/consent.js +43 -0
- package/dist/cjs/communication/consent.js.map +1 -0
- package/dist/cjs/communication/context.js +45 -0
- package/dist/cjs/communication/context.js.map +1 -0
- package/dist/cjs/communication/credentials.js +121 -0
- package/dist/cjs/communication/credentials.js.map +1 -0
- package/dist/cjs/communication/dry-run-scenario.js +166 -0
- package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
- package/dist/cjs/communication/dry-run.js +97 -0
- package/dist/cjs/communication/dry-run.js.map +1 -0
- package/dist/cjs/communication/engine.js +495 -0
- package/dist/cjs/communication/engine.js.map +1 -0
- package/dist/cjs/communication/graph.js +50 -0
- package/dist/cjs/communication/graph.js.map +1 -0
- package/dist/cjs/communication/idempotency.js +26 -0
- package/dist/cjs/communication/idempotency.js.map +1 -0
- package/dist/cjs/communication/identity.js +110 -0
- package/dist/cjs/communication/identity.js.map +1 -0
- package/dist/cjs/communication/index.js +135 -0
- package/dist/cjs/communication/index.js.map +1 -0
- package/dist/cjs/communication/onboarding.js +297 -0
- package/dist/cjs/communication/onboarding.js.map +1 -0
- package/dist/cjs/communication/policy.js +16 -0
- package/dist/cjs/communication/policy.js.map +1 -0
- package/dist/cjs/communication/routing.js +77 -0
- package/dist/cjs/communication/routing.js.map +1 -0
- package/dist/cjs/communication/sender-profile.js +128 -0
- package/dist/cjs/communication/sender-profile.js.map +1 -0
- package/dist/cjs/communication/status.js +86 -0
- package/dist/cjs/communication/status.js.map +1 -0
- package/dist/cjs/communication/stores/onboarding.js +135 -0
- package/dist/cjs/communication/stores/onboarding.js.map +1 -0
- package/dist/cjs/communication/stores/postgres.js +458 -0
- package/dist/cjs/communication/stores/postgres.js.map +1 -0
- package/dist/cjs/communication/stores/routing.js +334 -0
- package/dist/cjs/communication/stores/routing.js.map +1 -0
- package/dist/cjs/communication/stores/secrets.js +126 -0
- package/dist/cjs/communication/stores/secrets.js.map +1 -0
- package/dist/cjs/communication/template-provider.js +22 -0
- package/dist/cjs/communication/template-provider.js.map +1 -0
- package/dist/cjs/communication/template.js +63 -0
- package/dist/cjs/communication/template.js.map +1 -0
- package/dist/cjs/communication/webhook-subscription.js +258 -0
- package/dist/cjs/communication/webhook-subscription.js.map +1 -0
- package/dist/cjs/communication/webhook.js +292 -0
- package/dist/cjs/communication/webhook.js.map +1 -0
- package/dist/cjs/competence/business-days.js +155 -0
- package/dist/cjs/competence/business-days.js.map +1 -0
- package/dist/cjs/competence/catalog-validation.js +174 -0
- package/dist/cjs/competence/catalog-validation.js.map +1 -0
- package/dist/cjs/competence/obligation-preview.js +190 -0
- package/dist/cjs/competence/obligation-preview.js.map +1 -0
- package/dist/cjs/competence/repository.js +622 -0
- package/dist/cjs/competence/repository.js.map +1 -0
- package/dist/cjs/contacts/phone.js +192 -0
- package/dist/cjs/contacts/phone.js.map +1 -0
- package/dist/cjs/dashboard/pilot-panel.js +90 -0
- package/dist/cjs/dashboard/pilot-panel.js.map +1 -0
- package/dist/cjs/dashboard/repository.js +11 -1
- package/dist/cjs/dashboard/repository.js.map +1 -1
- package/dist/cjs/db/client.js +17 -11
- package/dist/cjs/db/client.js.map +1 -1
- package/dist/cjs/db/provision-e2e-identity.js +111 -0
- package/dist/cjs/db/provision-e2e-identity.js.map +1 -0
- package/dist/cjs/db/seed-catalog.js +48 -0
- package/dist/cjs/db/seed-catalog.js.map +1 -0
- package/dist/cjs/db/seed.js +15 -7
- package/dist/cjs/db/seed.js.map +1 -1
- package/dist/cjs/documents/repository.js +244 -0
- package/dist/cjs/documents/repository.js.map +1 -0
- package/dist/cjs/documents/requests.js +136 -0
- package/dist/cjs/documents/requests.js.map +1 -0
- package/dist/cjs/fiscal/applicability.js +164 -0
- package/dist/cjs/fiscal/applicability.js.map +1 -0
- package/dist/cjs/fiscal/conditions.js +198 -0
- package/dist/cjs/fiscal/conditions.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-contract.js +390 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-contract.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js +108 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js +220 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
- package/dist/cjs/fiscal/coverage/model.js +127 -0
- package/dist/cjs/fiscal/coverage/model.js.map +1 -0
- package/dist/cjs/fiscal/coverage/requests.js +99 -0
- package/dist/cjs/fiscal/coverage/requests.js.map +1 -0
- package/dist/cjs/fiscal/credentials/material.js +168 -0
- package/dist/cjs/fiscal/credentials/material.js.map +1 -0
- package/dist/cjs/fiscal/credentials/readiness.js +163 -0
- package/dist/cjs/fiscal/credentials/readiness.js.map +1 -0
- package/dist/cjs/fiscal/eligibility.js +199 -0
- package/dist/cjs/fiscal/eligibility.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js +128 -0
- package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/adn-transport.js +229 -0
- package/dist/cjs/fiscal/ingestion/adn-transport.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/direction.js +36 -0
- package/dist/cjs/fiscal/ingestion/direction.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/nfse-adn.js +228 -0
- package/dist/cjs/fiscal/ingestion/nfse-adn.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/pipeline.js +704 -0
- package/dist/cjs/fiscal/ingestion/pipeline.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/provider.js +51 -0
- package/dist/cjs/fiscal/ingestion/provider.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/repository.js +132 -0
- package/dist/cjs/fiscal/ingestion/repository.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-provider.js +103 -0
- package/dist/cjs/fiscal/ingestion/synthetic-provider.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js +13 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport.js +61 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/xml-reader.js +121 -0
- package/dist/cjs/fiscal/ingestion/xml-reader.js.map +1 -0
- package/dist/cjs/fiscal/repository.js +470 -0
- package/dist/cjs/fiscal/repository.js.map +1 -0
- package/dist/cjs/fiscal/sync/circuit.js +124 -0
- package/dist/cjs/fiscal/sync/circuit.js.map +1 -0
- package/dist/cjs/fiscal/sync/intervention.js +140 -0
- package/dist/cjs/fiscal/sync/intervention.js.map +1 -0
- package/dist/cjs/fiscal/sync/lease.js +146 -0
- package/dist/cjs/fiscal/sync/lease.js.map +1 -0
- package/dist/cjs/fiscal/sync/observability.js +244 -0
- package/dist/cjs/fiscal/sync/observability.js.map +1 -0
- package/dist/cjs/fiscal/sync/orchestrator.js +490 -0
- package/dist/cjs/fiscal/sync/orchestrator.js.map +1 -0
- package/dist/cjs/fiscal/sync/policy.js +143 -0
- package/dist/cjs/fiscal/sync/policy.js.map +1 -0
- package/dist/cjs/fiscal/sync/reprocess.js +241 -0
- package/dist/cjs/fiscal/sync/reprocess.js.map +1 -0
- package/dist/cjs/fiscal/sync/retry.js +183 -0
- package/dist/cjs/fiscal/sync/retry.js.map +1 -0
- package/dist/cjs/fiscal/sync/secret-boundary.js +123 -0
- package/dist/cjs/fiscal/sync/secret-boundary.js.map +1 -0
- package/dist/cjs/fiscal/transport/https.js +309 -0
- package/dist/cjs/fiscal/transport/https.js.map +1 -0
- package/dist/cjs/fiscal/transport/synthetic-tls.js +328 -0
- package/dist/cjs/fiscal/transport/synthetic-tls.js.map +1 -0
- package/dist/cjs/fiscal/transport/types.js +93 -0
- package/dist/cjs/fiscal/transport/types.js.map +1 -0
- package/dist/cjs/import/br-documents.js +85 -0
- package/dist/cjs/import/br-documents.js.map +1 -0
- package/dist/cjs/import/clients-import.js +347 -40
- package/dist/cjs/import/clients-import.js.map +1 -1
- package/dist/cjs/index.js +711 -39
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/documents.js +224 -17
- package/dist/cjs/legal/documents.js.map +1 -1
- package/dist/cjs/legal/index.js +3 -1
- package/dist/cjs/legal/index.js.map +1 -1
- package/dist/cjs/legal/types.js +1 -0
- package/dist/cjs/legal/types.js.map +1 -1
- package/dist/cjs/mail/auth-templates.js +29 -0
- package/dist/cjs/mail/auth-templates.js.map +1 -0
- package/dist/cjs/mail/dedup-store.js +12 -51
- package/dist/cjs/mail/dedup-store.js.map +1 -1
- package/dist/cjs/mail/index.js +16 -4
- package/dist/cjs/mail/index.js.map +1 -1
- package/dist/cjs/mail/provider.js +12 -247
- package/dist/cjs/mail/provider.js.map +1 -1
- package/dist/cjs/mail/resend.js +14 -18
- package/dist/cjs/mail/resend.js.map +1 -1
- package/dist/cjs/mail/sender-resolver.js +12 -11
- package/dist/cjs/mail/sender-resolver.js.map +1 -1
- package/dist/cjs/mail/template-renderer.js +11 -16
- package/dist/cjs/mail/template-renderer.js.map +1 -1
- package/dist/cjs/mail/transactional-outbound.js +117 -0
- package/dist/cjs/mail/transactional-outbound.js.map +1 -0
- package/dist/cjs/mail/types.js +8 -35
- package/dist/cjs/mail/types.js.map +1 -1
- package/dist/cjs/onboarding/persistence.js +4 -4
- package/dist/cjs/onboarding/persistence.js.map +1 -1
- package/dist/cjs/pilot/go-live-checklist.js +212 -0
- package/dist/cjs/pilot/go-live-checklist.js.map +1 -0
- package/dist/cjs/pilot/milestone.js +79 -0
- package/dist/cjs/pilot/milestone.js.map +1 -0
- package/dist/cjs/platform/capabilities.js +144 -0
- package/dist/cjs/platform/capabilities.js.map +1 -0
- package/dist/cjs/platform/job-contract.js +411 -0
- package/dist/cjs/platform/job-contract.js.map +1 -0
- package/dist/cjs/portal/provisioning.js +144 -0
- package/dist/cjs/portal/provisioning.js.map +1 -0
- package/dist/cjs/pricing-engine/canonical.js +42 -0
- package/dist/cjs/pricing-engine/canonical.js.map +1 -0
- package/dist/cjs/pricing-engine/errors.js +6 -1
- package/dist/cjs/pricing-engine/errors.js.map +1 -1
- package/dist/cjs/pricing-engine/index.js +12 -1
- package/dist/cjs/pricing-engine/index.js.map +1 -1
- package/dist/cjs/pricing-engine/pipeline.js +200 -26
- package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
- package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
- package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
- package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
- package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/cjs/rbac/authorize.js +28 -0
- package/dist/cjs/rbac/authorize.js.map +1 -1
- package/dist/cjs/rbac/catalog.js +101 -1
- package/dist/cjs/rbac/catalog.js.map +1 -1
- package/dist/cjs/rbac/workload-provisioning.js +160 -0
- package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
- package/dist/cjs/rbac/workload.js +191 -0
- package/dist/cjs/rbac/workload.js.map +1 -0
- package/dist/cjs/storage/checksum.js +15 -0
- package/dist/cjs/storage/checksum.js.map +1 -0
- package/dist/cjs/storage/key.js +72 -0
- package/dist/cjs/storage/key.js.map +1 -0
- package/dist/cjs/storage/local.js +100 -0
- package/dist/cjs/storage/local.js.map +1 -0
- package/dist/cjs/storage/r2.js +181 -0
- package/dist/cjs/storage/r2.js.map +1 -0
- package/dist/cjs/storage/registry.js +41 -0
- package/dist/cjs/storage/registry.js.map +1 -0
- package/dist/cjs/storage/types.js +50 -0
- package/dist/cjs/storage/types.js.map +1 -0
- package/dist/cjs/subscription-billing/index.js +2 -1
- package/dist/cjs/subscription-billing/index.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
- package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
- package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/registry.js +17 -0
- package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
- package/dist/cjs/subscription-billing/service.js +208 -83
- package/dist/cjs/subscription-billing/service.js.map +1 -1
- package/dist/cjs/subscription-billing/types.js.map +1 -1
- package/dist/cjs/tenancy/features.js +131 -0
- package/dist/cjs/tenancy/features.js.map +1 -0
- package/dist/cjs/tenancy/provisioning.js +32 -8
- package/dist/cjs/tenancy/provisioning.js.map +1 -1
- package/dist/cjs/tenancy/settings.js +224 -0
- package/dist/cjs/tenancy/settings.js.map +1 -0
- package/dist/cjs/users/repository.js +143 -3
- package/dist/cjs/users/repository.js.map +1 -1
- package/dist/cjs/vault/repository.js +81 -0
- package/dist/cjs/vault/repository.js.map +1 -1
- package/dist/clients/ibge.d.ts +17 -0
- package/dist/clients/ibge.d.ts.map +1 -0
- package/dist/clients/ibge.js +98 -0
- package/dist/clients/ibge.js.map +1 -0
- package/dist/clients/repository.d.ts +196 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +270 -24
- package/dist/clients/repository.js.map +1 -1
- package/dist/collection/branding.d.ts +137 -0
- package/dist/collection/branding.d.ts.map +1 -0
- package/dist/collection/branding.js +322 -0
- package/dist/collection/branding.js.map +1 -0
- package/dist/collection/channel-accounts.d.ts +57 -0
- package/dist/collection/channel-accounts.d.ts.map +1 -0
- package/dist/collection/channel-accounts.js +133 -0
- package/dist/collection/channel-accounts.js.map +1 -0
- package/dist/collection/channel.d.ts +24 -0
- package/dist/collection/channel.d.ts.map +1 -0
- package/dist/collection/channel.js +16 -0
- package/dist/collection/channel.js.map +1 -0
- package/dist/collection/clearance-store.d.ts +39 -0
- package/dist/collection/clearance-store.d.ts.map +1 -0
- package/dist/collection/clearance-store.js +69 -0
- package/dist/collection/clearance-store.js.map +1 -0
- package/dist/collection/communication-bridge.d.ts +66 -0
- package/dist/collection/communication-bridge.d.ts.map +1 -0
- package/dist/collection/communication-bridge.js +134 -0
- package/dist/collection/communication-bridge.js.map +1 -0
- package/dist/collection/communication-runtime.d.ts +132 -0
- package/dist/collection/communication-runtime.d.ts.map +1 -0
- package/dist/collection/communication-runtime.js +249 -0
- package/dist/collection/communication-runtime.js.map +1 -0
- package/dist/collection/consent-repository.d.ts +32 -0
- package/dist/collection/consent-repository.d.ts.map +1 -0
- package/dist/collection/consent-repository.js +79 -0
- package/dist/collection/consent-repository.js.map +1 -0
- package/dist/collection/copy.d.ts +50 -0
- package/dist/collection/copy.d.ts.map +1 -0
- package/dist/collection/copy.js +122 -0
- package/dist/collection/copy.js.map +1 -0
- package/dist/collection/delivery-callback.d.ts +49 -0
- package/dist/collection/delivery-callback.d.ts.map +1 -0
- package/dist/collection/delivery-callback.js +147 -0
- package/dist/collection/delivery-callback.js.map +1 -0
- package/dist/collection/email-layout.d.ts +45 -0
- package/dist/collection/email-layout.d.ts.map +1 -0
- package/dist/collection/email-layout.js +247 -0
- package/dist/collection/email-layout.js.map +1 -0
- package/dist/collection/engine.d.ts +200 -0
- package/dist/collection/engine.d.ts.map +1 -0
- package/dist/collection/engine.js +427 -0
- package/dist/collection/engine.js.map +1 -0
- package/dist/collection/format.d.ts +32 -0
- package/dist/collection/format.d.ts.map +1 -0
- package/dist/collection/format.js +70 -0
- package/dist/collection/format.js.map +1 -0
- package/dist/collection/payment-block.d.ts +24 -0
- package/dist/collection/payment-block.d.ts.map +1 -0
- package/dist/collection/payment-block.js +2 -0
- package/dist/collection/payment-block.js.map +1 -0
- package/dist/collection/policy.d.ts +78 -0
- package/dist/collection/policy.d.ts.map +1 -0
- package/dist/collection/policy.js +168 -0
- package/dist/collection/policy.js.map +1 -0
- package/dist/collection/repository.d.ts +129 -0
- package/dist/collection/repository.d.ts.map +1 -0
- package/dist/collection/repository.js +246 -0
- package/dist/collection/repository.js.map +1 -0
- package/dist/collection/subject.d.ts +66 -0
- package/dist/collection/subject.d.ts.map +1 -0
- package/dist/collection/subject.js +99 -0
- package/dist/collection/subject.js.map +1 -0
- package/dist/collection/template-catalog.d.ts +16 -0
- package/dist/collection/template-catalog.d.ts.map +1 -0
- package/dist/collection/template-catalog.js +162 -0
- package/dist/collection/template-catalog.js.map +1 -0
- package/dist/collection/template.d.ts +37 -0
- package/dist/collection/template.d.ts.map +1 -0
- package/dist/collection/template.js +73 -0
- package/dist/collection/template.js.map +1 -0
- package/dist/communication/adapters/email.d.ts +28 -0
- package/dist/communication/adapters/email.d.ts.map +1 -0
- package/dist/communication/adapters/email.js +129 -0
- package/dist/communication/adapters/email.js.map +1 -0
- package/dist/communication/adapters/sms.d.ts +95 -0
- package/dist/communication/adapters/sms.d.ts.map +1 -0
- package/dist/communication/adapters/sms.js +121 -0
- package/dist/communication/adapters/sms.js.map +1 -0
- package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
- package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-language.js +36 -0
- package/dist/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.js +97 -0
- package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/communication/adapters/whatsapp.d.ts +29 -0
- package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp.js +210 -0
- package/dist/communication/adapters/whatsapp.js.map +1 -0
- package/dist/communication/audit.d.ts +105 -0
- package/dist/communication/audit.d.ts.map +1 -0
- package/dist/communication/audit.js +56 -0
- package/dist/communication/audit.js.map +1 -0
- package/dist/communication/capabilities.d.ts +88 -0
- package/dist/communication/capabilities.d.ts.map +1 -0
- package/dist/communication/capabilities.js +72 -0
- package/dist/communication/capabilities.js.map +1 -0
- package/dist/communication/channel.d.ts +125 -0
- package/dist/communication/channel.d.ts.map +1 -0
- package/dist/communication/channel.js +47 -0
- package/dist/communication/channel.js.map +1 -0
- package/dist/communication/claim.d.ts +368 -0
- package/dist/communication/claim.d.ts.map +1 -0
- package/dist/communication/claim.js +224 -0
- package/dist/communication/claim.js.map +1 -0
- package/dist/communication/clearance.d.ts +53 -0
- package/dist/communication/clearance.d.ts.map +1 -0
- package/dist/communication/clearance.js +15 -0
- package/dist/communication/clearance.js.map +1 -0
- package/dist/communication/consent.d.ts +65 -0
- package/dist/communication/consent.d.ts.map +1 -0
- package/dist/communication/consent.js +40 -0
- package/dist/communication/consent.js.map +1 -0
- package/dist/communication/context.d.ts +48 -0
- package/dist/communication/context.d.ts.map +1 -0
- package/dist/communication/context.js +41 -0
- package/dist/communication/context.js.map +1 -0
- package/dist/communication/credentials.d.ts +74 -0
- package/dist/communication/credentials.d.ts.map +1 -0
- package/dist/communication/credentials.js +115 -0
- package/dist/communication/credentials.js.map +1 -0
- package/dist/communication/dry-run-scenario.d.ts +37 -0
- package/dist/communication/dry-run-scenario.d.ts.map +1 -0
- package/dist/communication/dry-run-scenario.js +163 -0
- package/dist/communication/dry-run-scenario.js.map +1 -0
- package/dist/communication/dry-run.d.ts +40 -0
- package/dist/communication/dry-run.d.ts.map +1 -0
- package/dist/communication/dry-run.js +92 -0
- package/dist/communication/dry-run.js.map +1 -0
- package/dist/communication/engine.d.ts +163 -0
- package/dist/communication/engine.d.ts.map +1 -0
- package/dist/communication/engine.js +492 -0
- package/dist/communication/engine.js.map +1 -0
- package/dist/communication/graph.d.ts +38 -0
- package/dist/communication/graph.d.ts.map +1 -0
- package/dist/communication/graph.js +45 -0
- package/dist/communication/graph.js.map +1 -0
- package/dist/communication/idempotency.d.ts +33 -0
- package/dist/communication/idempotency.d.ts.map +1 -0
- package/dist/communication/idempotency.js +23 -0
- package/dist/communication/idempotency.js.map +1 -0
- package/dist/communication/identity.d.ts +127 -0
- package/dist/communication/identity.d.ts.map +1 -0
- package/dist/communication/identity.js +105 -0
- package/dist/communication/identity.js.map +1 -0
- package/dist/communication/index.d.ts +66 -0
- package/dist/communication/index.d.ts.map +1 -0
- package/dist/communication/index.js +42 -0
- package/dist/communication/index.js.map +1 -0
- package/dist/communication/onboarding.d.ts +223 -0
- package/dist/communication/onboarding.d.ts.map +1 -0
- package/dist/communication/onboarding.js +287 -0
- package/dist/communication/onboarding.js.map +1 -0
- package/dist/communication/policy.d.ts +115 -0
- package/dist/communication/policy.d.ts.map +1 -0
- package/dist/communication/policy.js +13 -0
- package/dist/communication/policy.js.map +1 -0
- package/dist/communication/routing.d.ts +99 -0
- package/dist/communication/routing.d.ts.map +1 -0
- package/dist/communication/routing.js +73 -0
- package/dist/communication/routing.js.map +1 -0
- package/dist/communication/sender-profile.d.ts +100 -0
- package/dist/communication/sender-profile.d.ts.map +1 -0
- package/dist/communication/sender-profile.js +123 -0
- package/dist/communication/sender-profile.js.map +1 -0
- package/dist/communication/status.d.ts +48 -0
- package/dist/communication/status.d.ts.map +1 -0
- package/dist/communication/status.js +79 -0
- package/dist/communication/status.js.map +1 -0
- package/dist/communication/stores/onboarding.d.ts +88 -0
- package/dist/communication/stores/onboarding.d.ts.map +1 -0
- package/dist/communication/stores/onboarding.js +127 -0
- package/dist/communication/stores/onboarding.js.map +1 -0
- package/dist/communication/stores/postgres.d.ts +81 -0
- package/dist/communication/stores/postgres.d.ts.map +1 -0
- package/dist/communication/stores/postgres.js +453 -0
- package/dist/communication/stores/postgres.js.map +1 -0
- package/dist/communication/stores/routing.d.ts +169 -0
- package/dist/communication/stores/routing.d.ts.map +1 -0
- package/dist/communication/stores/routing.js +324 -0
- package/dist/communication/stores/routing.js.map +1 -0
- package/dist/communication/stores/secrets.d.ts +89 -0
- package/dist/communication/stores/secrets.d.ts.map +1 -0
- package/dist/communication/stores/secrets.js +122 -0
- package/dist/communication/stores/secrets.js.map +1 -0
- package/dist/communication/template-provider.d.ts +85 -0
- package/dist/communication/template-provider.d.ts.map +1 -0
- package/dist/communication/template-provider.js +21 -0
- package/dist/communication/template-provider.js.map +1 -0
- package/dist/communication/template.d.ts +87 -0
- package/dist/communication/template.d.ts.map +1 -0
- package/dist/communication/template.js +59 -0
- package/dist/communication/template.js.map +1 -0
- package/dist/communication/webhook-subscription.d.ts +156 -0
- package/dist/communication/webhook-subscription.d.ts.map +1 -0
- package/dist/communication/webhook-subscription.js +252 -0
- package/dist/communication/webhook-subscription.js.map +1 -0
- package/dist/communication/webhook.d.ts +121 -0
- package/dist/communication/webhook.d.ts.map +1 -0
- package/dist/communication/webhook.js +283 -0
- package/dist/communication/webhook.js.map +1 -0
- package/dist/competence/business-days.d.ts +51 -0
- package/dist/competence/business-days.d.ts.map +1 -0
- package/dist/competence/business-days.js +145 -0
- package/dist/competence/business-days.js.map +1 -0
- package/dist/competence/catalog-validation.d.ts +86 -0
- package/dist/competence/catalog-validation.d.ts.map +1 -0
- package/dist/competence/catalog-validation.js +168 -0
- package/dist/competence/catalog-validation.js.map +1 -0
- package/dist/competence/obligation-preview.d.ts +103 -0
- package/dist/competence/obligation-preview.d.ts.map +1 -0
- package/dist/competence/obligation-preview.js +184 -0
- package/dist/competence/obligation-preview.js.map +1 -0
- package/dist/competence/repository.d.ts +285 -0
- package/dist/competence/repository.d.ts.map +1 -0
- package/dist/competence/repository.js +602 -0
- package/dist/competence/repository.js.map +1 -0
- package/dist/contacts/phone.d.ts +70 -0
- package/dist/contacts/phone.d.ts.map +1 -0
- package/dist/contacts/phone.js +186 -0
- package/dist/contacts/phone.js.map +1 -0
- package/dist/dashboard/pilot-panel.d.ts +100 -0
- package/dist/dashboard/pilot-panel.d.ts.map +1 -0
- package/dist/dashboard/pilot-panel.js +87 -0
- package/dist/dashboard/pilot-panel.js.map +1 -0
- package/dist/dashboard/repository.d.ts.map +1 -1
- package/dist/dashboard/repository.js +11 -1
- package/dist/dashboard/repository.js.map +1 -1
- package/dist/db/client.d.ts +45 -0
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +16 -11
- package/dist/db/client.js.map +1 -1
- package/dist/db/migrate.d.ts +36 -1
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +208 -35
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/provision-e2e-identity.d.ts +2 -0
- package/dist/db/provision-e2e-identity.d.ts.map +1 -0
- package/dist/db/provision-e2e-identity.js +109 -0
- package/dist/db/provision-e2e-identity.js.map +1 -0
- package/dist/db/seed-catalog.d.ts +18 -0
- package/dist/db/seed-catalog.d.ts.map +1 -0
- package/dist/db/seed-catalog.js +45 -0
- package/dist/db/seed-catalog.js.map +1 -0
- package/dist/db/seed.js +16 -8
- package/dist/db/seed.js.map +1 -1
- package/dist/documents/repository.d.ts +97 -0
- package/dist/documents/repository.d.ts.map +1 -0
- package/dist/documents/repository.js +236 -0
- package/dist/documents/repository.js.map +1 -0
- package/dist/documents/requests.d.ts +73 -0
- package/dist/documents/requests.d.ts.map +1 -0
- package/dist/documents/requests.js +127 -0
- package/dist/documents/requests.js.map +1 -0
- package/dist/fiscal/applicability.d.ts +73 -0
- package/dist/fiscal/applicability.d.ts.map +1 -0
- package/dist/fiscal/applicability.js +160 -0
- package/dist/fiscal/applicability.js.map +1 -0
- package/dist/fiscal/conditions.d.ts +99 -0
- package/dist/fiscal/conditions.d.ts.map +1 -0
- package/dist/fiscal/conditions.js +190 -0
- package/dist/fiscal/conditions.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-contract.d.ts +315 -0
- package/dist/fiscal/contracts/nfse-adn-contract.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-contract.js +386 -0
- package/dist/fiscal/contracts/nfse-adn-contract.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts +13 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.js +103 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.d.ts +77 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.js +215 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
- package/dist/fiscal/coverage/model.d.ts +86 -0
- package/dist/fiscal/coverage/model.d.ts.map +1 -0
- package/dist/fiscal/coverage/model.js +120 -0
- package/dist/fiscal/coverage/model.js.map +1 -0
- package/dist/fiscal/coverage/requests.d.ts +70 -0
- package/dist/fiscal/coverage/requests.d.ts.map +1 -0
- package/dist/fiscal/coverage/requests.js +95 -0
- package/dist/fiscal/coverage/requests.js.map +1 -0
- package/dist/fiscal/credentials/material.d.ts +81 -0
- package/dist/fiscal/credentials/material.d.ts.map +1 -0
- package/dist/fiscal/credentials/material.js +164 -0
- package/dist/fiscal/credentials/material.js.map +1 -0
- package/dist/fiscal/credentials/readiness.d.ts +92 -0
- package/dist/fiscal/credentials/readiness.d.ts.map +1 -0
- package/dist/fiscal/credentials/readiness.js +159 -0
- package/dist/fiscal/credentials/readiness.js.map +1 -0
- package/dist/fiscal/eligibility.d.ts +106 -0
- package/dist/fiscal/eligibility.d.ts.map +1 -0
- package/dist/fiscal/eligibility.js +194 -0
- package/dist/fiscal/eligibility.js.map +1 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts +57 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts.map +1 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.js +121 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
- package/dist/fiscal/ingestion/adn-transport.d.ts +123 -0
- package/dist/fiscal/ingestion/adn-transport.d.ts.map +1 -0
- package/dist/fiscal/ingestion/adn-transport.js +220 -0
- package/dist/fiscal/ingestion/adn-transport.js.map +1 -0
- package/dist/fiscal/ingestion/direction.d.ts +60 -0
- package/dist/fiscal/ingestion/direction.d.ts.map +1 -0
- package/dist/fiscal/ingestion/direction.js +32 -0
- package/dist/fiscal/ingestion/direction.js.map +1 -0
- package/dist/fiscal/ingestion/nfse-adn.d.ts +91 -0
- package/dist/fiscal/ingestion/nfse-adn.d.ts.map +1 -0
- package/dist/fiscal/ingestion/nfse-adn.js +222 -0
- package/dist/fiscal/ingestion/nfse-adn.js.map +1 -0
- package/dist/fiscal/ingestion/pipeline.d.ts +168 -0
- package/dist/fiscal/ingestion/pipeline.d.ts.map +1 -0
- package/dist/fiscal/ingestion/pipeline.js +699 -0
- package/dist/fiscal/ingestion/pipeline.js.map +1 -0
- package/dist/fiscal/ingestion/provider.d.ts +206 -0
- package/dist/fiscal/ingestion/provider.d.ts.map +1 -0
- package/dist/fiscal/ingestion/provider.js +47 -0
- package/dist/fiscal/ingestion/provider.js.map +1 -0
- package/dist/fiscal/ingestion/repository.d.ts +82 -0
- package/dist/fiscal/ingestion/repository.d.ts.map +1 -0
- package/dist/fiscal/ingestion/repository.js +127 -0
- package/dist/fiscal/ingestion/repository.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-provider.d.ts +92 -0
- package/dist/fiscal/ingestion/synthetic-provider.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-provider.js +99 -0
- package/dist/fiscal/ingestion/synthetic-provider.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.d.ts +19 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.js +9 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport.d.ts +55 -0
- package/dist/fiscal/ingestion/synthetic-transport.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport.js +57 -0
- package/dist/fiscal/ingestion/synthetic-transport.js.map +1 -0
- package/dist/fiscal/ingestion/xml-reader.d.ts +55 -0
- package/dist/fiscal/ingestion/xml-reader.d.ts.map +1 -0
- package/dist/fiscal/ingestion/xml-reader.js +112 -0
- package/dist/fiscal/ingestion/xml-reader.js.map +1 -0
- package/dist/fiscal/repository.d.ts +220 -0
- package/dist/fiscal/repository.d.ts.map +1 -0
- package/dist/fiscal/repository.js +449 -0
- package/dist/fiscal/repository.js.map +1 -0
- package/dist/fiscal/sync/circuit.d.ts +86 -0
- package/dist/fiscal/sync/circuit.d.ts.map +1 -0
- package/dist/fiscal/sync/circuit.js +118 -0
- package/dist/fiscal/sync/circuit.js.map +1 -0
- package/dist/fiscal/sync/intervention.d.ts +81 -0
- package/dist/fiscal/sync/intervention.d.ts.map +1 -0
- package/dist/fiscal/sync/intervention.js +135 -0
- package/dist/fiscal/sync/intervention.js.map +1 -0
- package/dist/fiscal/sync/lease.d.ts +118 -0
- package/dist/fiscal/sync/lease.d.ts.map +1 -0
- package/dist/fiscal/sync/lease.js +139 -0
- package/dist/fiscal/sync/lease.js.map +1 -0
- package/dist/fiscal/sync/observability.d.ts +148 -0
- package/dist/fiscal/sync/observability.d.ts.map +1 -0
- package/dist/fiscal/sync/observability.js +239 -0
- package/dist/fiscal/sync/observability.js.map +1 -0
- package/dist/fiscal/sync/orchestrator.d.ts +132 -0
- package/dist/fiscal/sync/orchestrator.d.ts.map +1 -0
- package/dist/fiscal/sync/orchestrator.js +487 -0
- package/dist/fiscal/sync/orchestrator.js.map +1 -0
- package/dist/fiscal/sync/policy.d.ts +87 -0
- package/dist/fiscal/sync/policy.d.ts.map +1 -0
- package/dist/fiscal/sync/policy.js +136 -0
- package/dist/fiscal/sync/policy.js.map +1 -0
- package/dist/fiscal/sync/reprocess.d.ts +76 -0
- package/dist/fiscal/sync/reprocess.d.ts.map +1 -0
- package/dist/fiscal/sync/reprocess.js +237 -0
- package/dist/fiscal/sync/reprocess.js.map +1 -0
- package/dist/fiscal/sync/retry.d.ts +82 -0
- package/dist/fiscal/sync/retry.d.ts.map +1 -0
- package/dist/fiscal/sync/retry.js +176 -0
- package/dist/fiscal/sync/retry.js.map +1 -0
- package/dist/fiscal/sync/secret-boundary.d.ts +169 -0
- package/dist/fiscal/sync/secret-boundary.d.ts.map +1 -0
- package/dist/fiscal/sync/secret-boundary.js +116 -0
- package/dist/fiscal/sync/secret-boundary.js.map +1 -0
- package/dist/fiscal/transport/https.d.ts +86 -0
- package/dist/fiscal/transport/https.d.ts.map +1 -0
- package/dist/fiscal/transport/https.js +303 -0
- package/dist/fiscal/transport/https.js.map +1 -0
- package/dist/fiscal/transport/synthetic-tls.d.ts +80 -0
- package/dist/fiscal/transport/synthetic-tls.d.ts.map +1 -0
- package/dist/fiscal/transport/synthetic-tls.js +323 -0
- package/dist/fiscal/transport/synthetic-tls.js.map +1 -0
- package/dist/fiscal/transport/types.d.ts +134 -0
- package/dist/fiscal/transport/types.d.ts.map +1 -0
- package/dist/fiscal/transport/types.js +88 -0
- package/dist/fiscal/transport/types.js.map +1 -0
- package/dist/import/br-documents.d.ts +26 -0
- package/dist/import/br-documents.d.ts.map +1 -0
- package/dist/import/br-documents.js +78 -0
- package/dist/import/br-documents.js.map +1 -0
- package/dist/import/clients-import.d.ts +122 -4
- package/dist/import/clients-import.d.ts.map +1 -1
- package/dist/import/clients-import.js +341 -41
- package/dist/import/clients-import.js.map +1 -1
- package/dist/index.d.ts +217 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +196 -11
- package/dist/index.js.map +1 -1
- package/dist/legal/documents.d.ts +12 -1
- package/dist/legal/documents.d.ts.map +1 -1
- package/dist/legal/documents.js +222 -16
- package/dist/legal/documents.js.map +1 -1
- package/dist/legal/index.d.ts +2 -2
- package/dist/legal/index.d.ts.map +1 -1
- package/dist/legal/index.js +1 -1
- package/dist/legal/index.js.map +1 -1
- package/dist/legal/types.d.ts +69 -3
- package/dist/legal/types.d.ts.map +1 -1
- package/dist/legal/types.js +1 -0
- package/dist/legal/types.js.map +1 -1
- package/dist/mail/auth-templates.d.ts +15 -0
- package/dist/mail/auth-templates.d.ts.map +1 -0
- package/dist/mail/auth-templates.js +26 -0
- package/dist/mail/auth-templates.js.map +1 -0
- package/dist/mail/dedup-store.d.ts +1 -24
- package/dist/mail/dedup-store.d.ts.map +1 -1
- package/dist/mail/dedup-store.js +9 -48
- package/dist/mail/dedup-store.js.map +1 -1
- package/dist/mail/index.d.ts +2 -1
- package/dist/mail/index.d.ts.map +1 -1
- package/dist/mail/index.js +13 -2
- package/dist/mail/index.js.map +1 -1
- package/dist/mail/provider.d.ts +2 -30
- package/dist/mail/provider.d.ts.map +1 -1
- package/dist/mail/provider.js +10 -246
- package/dist/mail/provider.js.map +1 -1
- package/dist/mail/resend.d.ts +2 -12
- package/dist/mail/resend.d.ts.map +1 -1
- package/dist/mail/resend.js +11 -17
- package/dist/mail/resend.js.map +1 -1
- package/dist/mail/sender-resolver.d.ts +1 -7
- package/dist/mail/sender-resolver.d.ts.map +1 -1
- package/dist/mail/sender-resolver.js +11 -10
- package/dist/mail/sender-resolver.js.map +1 -1
- package/dist/mail/template-renderer.d.ts +1 -9
- package/dist/mail/template-renderer.d.ts.map +1 -1
- package/dist/mail/template-renderer.js +10 -15
- package/dist/mail/template-renderer.js.map +1 -1
- package/dist/mail/transactional-outbound.d.ts +115 -0
- package/dist/mail/transactional-outbound.d.ts.map +1 -0
- package/dist/mail/transactional-outbound.js +113 -0
- package/dist/mail/transactional-outbound.js.map +1 -0
- package/dist/mail/types.d.ts +2 -142
- package/dist/mail/types.d.ts.map +1 -1
- package/dist/mail/types.js +1 -33
- package/dist/mail/types.js.map +1 -1
- package/dist/onboarding/persistence.d.ts +10 -1
- package/dist/onboarding/persistence.d.ts.map +1 -1
- package/dist/onboarding/persistence.js +4 -4
- package/dist/onboarding/persistence.js.map +1 -1
- package/dist/pilot/go-live-checklist.d.ts +41 -0
- package/dist/pilot/go-live-checklist.d.ts.map +1 -0
- package/dist/pilot/go-live-checklist.js +209 -0
- package/dist/pilot/go-live-checklist.js.map +1 -0
- package/dist/pilot/milestone.d.ts +56 -0
- package/dist/pilot/milestone.d.ts.map +1 -0
- package/dist/pilot/milestone.js +74 -0
- package/dist/pilot/milestone.js.map +1 -0
- package/dist/platform/capabilities.d.ts +88 -0
- package/dist/platform/capabilities.d.ts.map +1 -0
- package/dist/platform/capabilities.js +140 -0
- package/dist/platform/capabilities.js.map +1 -0
- package/dist/platform/job-contract.d.ts +232 -0
- package/dist/platform/job-contract.d.ts.map +1 -0
- package/dist/platform/job-contract.js +403 -0
- package/dist/platform/job-contract.js.map +1 -0
- package/dist/portal/provisioning.d.ts +58 -0
- package/dist/portal/provisioning.d.ts.map +1 -0
- package/dist/portal/provisioning.js +139 -0
- package/dist/portal/provisioning.js.map +1 -0
- package/dist/pricing-engine/canonical.d.ts +14 -0
- package/dist/pricing-engine/canonical.d.ts.map +1 -0
- package/dist/pricing-engine/canonical.js +39 -0
- package/dist/pricing-engine/canonical.js.map +1 -0
- package/dist/pricing-engine/errors.d.ts.map +1 -1
- package/dist/pricing-engine/errors.js +6 -1
- package/dist/pricing-engine/errors.js.map +1 -1
- package/dist/pricing-engine/index.d.ts +12 -2
- package/dist/pricing-engine/index.d.ts.map +1 -1
- package/dist/pricing-engine/index.js +6 -1
- package/dist/pricing-engine/index.js.map +1 -1
- package/dist/pricing-engine/pipeline.d.ts.map +1 -1
- package/dist/pricing-engine/pipeline.js +202 -28
- package/dist/pricing-engine/pipeline.js.map +1 -1
- package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
- package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-adapter.js +75 -0
- package/dist/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/pricing-engine/shadow-diff.d.ts +26 -0
- package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-diff.js +52 -0
- package/dist/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/pricing-engine/shadow-facade.d.ts +42 -0
- package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-facade.js +82 -0
- package/dist/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.js +18 -0
- package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
- package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-metrics.js +31 -0
- package/dist/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.js +39 -0
- package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/pricing-engine/types.d.ts +2 -0
- package/dist/pricing-engine/types.d.ts.map +1 -1
- package/dist/rbac/authorize.d.ts +12 -0
- package/dist/rbac/authorize.d.ts.map +1 -1
- package/dist/rbac/authorize.js +27 -0
- package/dist/rbac/authorize.js.map +1 -1
- package/dist/rbac/catalog.d.ts.map +1 -1
- package/dist/rbac/catalog.js +101 -1
- package/dist/rbac/catalog.js.map +1 -1
- package/dist/rbac/workload-provisioning.d.ts +66 -0
- package/dist/rbac/workload-provisioning.d.ts.map +1 -0
- package/dist/rbac/workload-provisioning.js +153 -0
- package/dist/rbac/workload-provisioning.js.map +1 -0
- package/dist/rbac/workload.d.ts +124 -0
- package/dist/rbac/workload.d.ts.map +1 -0
- package/dist/rbac/workload.js +184 -0
- package/dist/rbac/workload.js.map +1 -0
- package/dist/storage/checksum.d.ts +9 -0
- package/dist/storage/checksum.d.ts.map +1 -0
- package/dist/storage/checksum.js +12 -0
- package/dist/storage/checksum.js.map +1 -0
- package/dist/storage/key.d.ts +37 -0
- package/dist/storage/key.d.ts.map +1 -0
- package/dist/storage/key.js +67 -0
- package/dist/storage/key.js.map +1 -0
- package/dist/storage/local.d.ts +40 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +96 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/r2.d.ts +43 -0
- package/dist/storage/r2.d.ts.map +1 -0
- package/dist/storage/r2.js +177 -0
- package/dist/storage/r2.js.map +1 -0
- package/dist/storage/registry.d.ts +23 -0
- package/dist/storage/registry.d.ts.map +1 -0
- package/dist/storage/registry.js +37 -0
- package/dist/storage/registry.js.map +1 -0
- package/dist/storage/types.d.ts +67 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +45 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/subscription-billing/index.d.ts +6 -5
- package/dist/subscription-billing/index.d.ts.map +1 -1
- package/dist/subscription-billing/index.js +3 -3
- package/dist/subscription-billing/index.js.map +1 -1
- package/dist/subscription-billing/provider/asaas.d.ts +14 -0
- package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
- package/dist/subscription-billing/provider/asaas.js +32 -7
- package/dist/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/subscription-billing/provider/disabled.d.ts +9 -0
- package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
- package/dist/subscription-billing/provider/disabled.js +8 -0
- package/dist/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/subscription-billing/provider/registry.d.ts +10 -0
- package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
- package/dist/subscription-billing/provider/registry.js +17 -0
- package/dist/subscription-billing/provider/registry.js.map +1 -1
- package/dist/subscription-billing/service.d.ts +38 -1
- package/dist/subscription-billing/service.d.ts.map +1 -1
- package/dist/subscription-billing/service.js +147 -23
- package/dist/subscription-billing/service.js.map +1 -1
- package/dist/subscription-billing/types.d.ts +13 -0
- package/dist/subscription-billing/types.d.ts.map +1 -1
- package/dist/subscription-billing/types.js.map +1 -1
- package/dist/tenancy/features.d.ts +69 -0
- package/dist/tenancy/features.d.ts.map +1 -0
- package/dist/tenancy/features.js +123 -0
- package/dist/tenancy/features.js.map +1 -0
- package/dist/tenancy/provisioning.d.ts.map +1 -1
- package/dist/tenancy/provisioning.js +32 -8
- package/dist/tenancy/provisioning.js.map +1 -1
- package/dist/tenancy/settings.d.ts +63 -0
- package/dist/tenancy/settings.d.ts.map +1 -0
- package/dist/tenancy/settings.js +218 -0
- package/dist/tenancy/settings.js.map +1 -0
- package/dist/users/repository.d.ts +54 -1
- package/dist/users/repository.d.ts.map +1 -1
- package/dist/users/repository.js +142 -4
- package/dist/users/repository.js.map +1 -1
- package/dist/vault/repository.d.ts +67 -0
- package/dist/vault/repository.d.ts.map +1 -1
- package/dist/vault/repository.js +78 -0
- package/dist/vault/repository.js.map +1 -1
- package/package.json +20 -4
- package/src/db/migrations/0023_user_invite_activation.sql +15 -0
- package/src/db/migrations/0024_set_user_password_function.sql +32 -0
- package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
- package/src/db/migrations/0026_documents_and_competence.sql +353 -0
- package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
- package/src/db/migrations/0028_collection_engine.sql +94 -0
- package/src/db/migrations/0029_payment_rail.sql +107 -0
- package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
- package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
- package/src/db/migrations/0032_settlement_reversal.sql +76 -0
- package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
- package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
- package/src/db/migrations/0035_payment_account_environments.sql +61 -0
- package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
- package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
- package/src/db/migrations/0038_notification_channels.sql +175 -0
- package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
- package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
- package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
- package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
- package/src/db/migrations/0043_workload_identity.sql +105 -0
- package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
- package/src/db/migrations/0045_role_write_scope.sql +122 -0
- package/src/db/migrations/0046_pilot_activation_model.sql +184 -0
- package/src/db/migrations/0047_recipient_clearance.sql +89 -0
- package/src/db/migrations/0048_item_type_note.sql +16 -0
- package/src/db/migrations/0049_national_fiscal_engine.sql +279 -0
- package/src/db/migrations/0050_fiscal_vocabulary_readonly.sql +29 -0
- package/src/db/migrations/0051_seed_rules_from_catalog.sql +72 -0
- package/src/db/migrations/0052_fiscal_rule_delete_scope.sql +57 -0
- package/src/db/migrations/0053_rule_validity_lower_bound.sql +44 -0
- package/src/db/migrations/0054_tenant_profile_and_rule_source.sql +89 -0
- package/src/db/migrations/0055_job_capability_contract.sql +300 -0
- package/src/db/migrations/0056_fiscal_document_ingestion.sql +337 -0
- package/src/db/migrations/0057_fiscal_pending_event_inbox.sql +228 -0
- package/src/db/migrations/0058_fiscal_operational_engine.sql +516 -0
- package/src/db/migrations/0059_fiscal_contract_version.sql +59 -0
- package/dist/cjs/mail/resend-client.js +0 -103
- package/dist/cjs/mail/resend-client.js.map +0 -1
- package/dist/mail/resend-client.d.ts +0 -16
- package/dist/mail/resend-client.d.ts.map +0 -1
- package/dist/mail/resend-client.js +0 -100
- package/dist/mail/resend-client.js.map +0 -1
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
-- 0055 — o contrato de capacidade dos JOBS, e a elegibilidade fiscal default-deny.
|
|
2
|
+
--
|
|
3
|
+
-- ═══ O que a Onda A fechou, e o que ficou aberto ═══════════════════════════
|
|
4
|
+
--
|
|
5
|
+
-- A Onda A fechou o skew de release entre a tela e a API: `GET /v1/capabilities`
|
|
6
|
+
-- declara o que aquele build serve, o console exige o que vai usar, e a
|
|
7
|
+
-- requisição condenada não parte (0054 / docs/architecture/141).
|
|
8
|
+
--
|
|
9
|
+
-- Isso protege a superfície HTTP. Não protege NADA que roda sem navegador.
|
|
10
|
+
--
|
|
11
|
+
-- Os dois crons deste produto (`baruk-collection-cron`, `baruk-billing-cron`)
|
|
12
|
+
-- publicam na Render como serviços SEPARADOS do serviço web, a partir da mesma
|
|
13
|
+
-- imagem mas com deploys independentes — e as migrations rodam no
|
|
14
|
+
-- `preDeployCommand` do serviço WEB, não no cron. A ordem entre "a imagem nova
|
|
15
|
+
-- do cron subiu" e "o schema novo foi aplicado" não é garantida por nada.
|
|
16
|
+
--
|
|
17
|
+
-- Então existem os dois lados da janela:
|
|
18
|
+
--
|
|
19
|
+
-- worker NOVO + schema VELHO → o job depende de coluna/tabela que ainda não
|
|
20
|
+
-- existe. Hoje isso aparece como exceção no meio do loop, DEPOIS de já ter
|
|
21
|
+
-- escrito no tenant anterior — estado parcial, que é exatamente o que a
|
|
22
|
+
-- ingestão fiscal não pode produzir.
|
|
23
|
+
--
|
|
24
|
+
-- worker VELHO + schema NOVO → o job escreve linhas sem o que o schema novo
|
|
25
|
+
-- passou a esperar. Aditivo sobrevive; obrigatório não.
|
|
26
|
+
--
|
|
27
|
+
-- ═══ Por que capacidade, e não SHA — de novo, e por outro motivo ═══════════
|
|
28
|
+
--
|
|
29
|
+
-- Para a tela, a contraparte é a API. Para um worker, a contraparte é o BANCO:
|
|
30
|
+
-- é a única superfície que os dois lados enxergam. Comparar o commit da imagem
|
|
31
|
+
-- do cron com o commit do serviço web acoplaria o job ao processo de release e
|
|
32
|
+
-- reprovaria um hotfix inofensivo.
|
|
33
|
+
--
|
|
34
|
+
-- Por isso o registro vive AQUI, no banco, e quem o escreve é a MIGRATION —
|
|
35
|
+
-- isto é, o mesmo ato que cria a capacidade. Uma capacidade não pode ser
|
|
36
|
+
-- declarada por quem a consome: `baruk_app` recebe apenas SELECT nesta tabela
|
|
37
|
+
-- (ver `db/migrate.ts`). Autoridade escrita pelo controlado não é autoridade,
|
|
38
|
+
-- e um worker que pudesse declarar a própria capacidade teria um portão com a
|
|
39
|
+
-- chave do lado de dentro.
|
|
40
|
+
|
|
41
|
+
-- ── 1 · Registro de capacidades da PLATAFORMA ──────────────────────────────
|
|
42
|
+
--
|
|
43
|
+
-- Global, sem `tenant_id`: a capacidade é do schema, não do escritório. Sem RLS
|
|
44
|
+
-- pelo mesmo motivo que `fiscal_attribute_definition` — e, como lá, a proteção
|
|
45
|
+
-- é o privilégio, não a policy.
|
|
46
|
+
--
|
|
47
|
+
-- Chave IMUTÁVEL, igual ao contrato HTTP: mudança incompatível ganha `.v2`, e a
|
|
48
|
+
-- `.v1` só sai quando nenhum worker em produção ainda a exigir. É essa regra
|
|
49
|
+
-- que faz `worker velho + schema novo` ser seguro: o registro só CRESCE, e
|
|
50
|
+
-- compatibilidade é continência de conjunto.
|
|
51
|
+
CREATE TABLE IF NOT EXISTS platform_capability (
|
|
52
|
+
key text PRIMARY KEY,
|
|
53
|
+
label text NOT NULL,
|
|
54
|
+
-- Versão do FORMATO do contrato, não da capacidade. Um worker que não
|
|
55
|
+
-- reconhece a versão trata tudo como indisponível: fail-closed é a única
|
|
56
|
+
-- leitura segura de um contrato que não se sabe ler.
|
|
57
|
+
contract_version int NOT NULL,
|
|
58
|
+
-- Qual migration declarou. Não é decoração: é como se responde "desde qual
|
|
59
|
+
-- deploy esta capacidade existe?" sem depender de git em tempo de execução.
|
|
60
|
+
declared_by_migration text NOT NULL,
|
|
61
|
+
declared_at timestamptz NOT NULL DEFAULT now(),
|
|
62
|
+
CONSTRAINT platform_capability_key_format
|
|
63
|
+
CHECK (key ~ '^[a-z0-9]+(-[a-z0-9]+)*(\.[a-z0-9]+(-[a-z0-9]+)*)+\.v[0-9]+$')
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
COMMENT ON TABLE platform_capability IS
|
|
67
|
+
'O que ESTE schema sabe fazer. Escrito só por migration (baruk_app tem apenas SELECT): quem consome a capacidade não pode declará-la.';
|
|
68
|
+
|
|
69
|
+
INSERT INTO platform_capability (key, label, contract_version, declared_by_migration) VALUES
|
|
70
|
+
('office.job-contract.v1',
|
|
71
|
+
'Contrato de capacidade para jobs e workers', 1, '0055'),
|
|
72
|
+
('office.collection-cycle.v1',
|
|
73
|
+
'Ciclo diário de cobrança: geração de recebíveis da competência + régua', 1, '0055'),
|
|
74
|
+
('office.saas-billing-cycle.v1',
|
|
75
|
+
'Ciclo do Billing SaaS: trial, renovação, régua e suspensão', 1, '0055')
|
|
76
|
+
ON CONFLICT (key) DO NOTHING;
|
|
77
|
+
|
|
78
|
+
-- ── 2 · Cursor do job, por tenant ──────────────────────────────────────────
|
|
79
|
+
--
|
|
80
|
+
-- Existe para que "não consumir cursor irreversivelmente" seja uma propriedade
|
|
81
|
+
-- verificável, e não uma promessa. O cursor só avança quando o lote INTEIRO
|
|
82
|
+
-- termina sob um contrato compatível; run bloqueado não o toca.
|
|
83
|
+
--
|
|
84
|
+
-- `contract_version` grava sob qual contrato aquela posição foi alcançada. Um
|
|
85
|
+
-- worker que leia um cursor gravado sob contrato que ele não reconhece PARA —
|
|
86
|
+
-- em vez de reinterpretar a posição com semântica diferente.
|
|
87
|
+
CREATE TABLE IF NOT EXISTS job_cursor (
|
|
88
|
+
id uuid PRIMARY KEY,
|
|
89
|
+
tenant_id uuid NOT NULL REFERENCES tenant(id),
|
|
90
|
+
job_name text NOT NULL,
|
|
91
|
+
position text NOT NULL,
|
|
92
|
+
contract_version int NOT NULL,
|
|
93
|
+
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
94
|
+
CONSTRAINT job_cursor_tenant_id_uq UNIQUE (tenant_id, id)
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
CREATE UNIQUE INDEX IF NOT EXISTS job_cursor_uq ON job_cursor (tenant_id, job_name);
|
|
98
|
+
|
|
99
|
+
ALTER TABLE job_cursor ENABLE ROW LEVEL SECURITY;
|
|
100
|
+
ALTER TABLE job_cursor FORCE ROW LEVEL SECURITY;
|
|
101
|
+
CREATE POLICY job_cursor_tenant_isolation ON job_cursor
|
|
102
|
+
USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
|
|
103
|
+
WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
|
|
104
|
+
|
|
105
|
+
-- ── 3 · Trilha de execução do job ──────────────────────────────────────────
|
|
106
|
+
--
|
|
107
|
+
-- Um job bloqueado por incompatibilidade não pode falhar em silêncio. Esta
|
|
108
|
+
-- tabela é o registro nomeado do bloqueio: qual job, qual versão, o que exigia,
|
|
109
|
+
-- o que o schema declarava, e quando.
|
|
110
|
+
--
|
|
111
|
+
-- Sem PII e sem segredo por construção: só nomes de capacidade e contadores.
|
|
112
|
+
CREATE TABLE IF NOT EXISTS job_run (
|
|
113
|
+
id uuid PRIMARY KEY,
|
|
114
|
+
tenant_id uuid NOT NULL REFERENCES tenant(id),
|
|
115
|
+
job_name text NOT NULL,
|
|
116
|
+
job_version int NOT NULL,
|
|
117
|
+
-- Os cinco estados. `TEMPORARILY_UNAVAILABLE` é deliberadamente separado de
|
|
118
|
+
-- `INCOMPATIBLE`: o primeiro volta sozinho e merece retry; o segundo exige um
|
|
119
|
+
-- deploy, e insistir nele é gastar orçamento contra uma parede.
|
|
120
|
+
readiness text NOT NULL CHECK (readiness IN (
|
|
121
|
+
'READY', 'TEMPORARILY_UNAVAILABLE', 'INCOMPATIBLE',
|
|
122
|
+
'DISABLED', 'BLOCKED_BY_TENANT_CONFIG')),
|
|
123
|
+
status text NOT NULL CHECK (status IN ('completed', 'blocked', 'failed')),
|
|
124
|
+
contract_version int,
|
|
125
|
+
required_capabilities text[] NOT NULL DEFAULT '{}',
|
|
126
|
+
observed_capabilities text[] NOT NULL DEFAULT '{}',
|
|
127
|
+
missing_capabilities text[] NOT NULL DEFAULT '{}',
|
|
128
|
+
mutations int NOT NULL DEFAULT 0 CHECK (mutations >= 0),
|
|
129
|
+
cursor_advanced boolean NOT NULL DEFAULT false,
|
|
130
|
+
detail text,
|
|
131
|
+
started_at timestamptz NOT NULL DEFAULT now(),
|
|
132
|
+
finished_at timestamptz,
|
|
133
|
+
CONSTRAINT job_run_tenant_id_uq UNIQUE (tenant_id, id),
|
|
134
|
+
-- O fail-closed vira invariante do BANCO, não promessa do TypeScript: é
|
|
135
|
+
-- impossível registrar um run bloqueado que tenha mutado ou avançado cursor.
|
|
136
|
+
-- Um refactor futuro que erre a ordem das operações não passa daqui.
|
|
137
|
+
CONSTRAINT job_run_blocked_is_inert
|
|
138
|
+
CHECK (status <> 'blocked' OR (mutations = 0 AND cursor_advanced = false)),
|
|
139
|
+
-- `READY` e bloqueio são mutuamente exclusivos: um run bloqueado tem de dizer
|
|
140
|
+
-- POR QUE, e 'READY' não é um motivo.
|
|
141
|
+
CONSTRAINT job_run_blocked_has_reason
|
|
142
|
+
CHECK (status <> 'blocked' OR readiness <> 'READY')
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
CREATE INDEX IF NOT EXISTS job_run_tenant_job_idx
|
|
146
|
+
ON job_run (tenant_id, job_name, started_at DESC);
|
|
147
|
+
|
|
148
|
+
ALTER TABLE job_run ENABLE ROW LEVEL SECURITY;
|
|
149
|
+
ALTER TABLE job_run FORCE ROW LEVEL SECURITY;
|
|
150
|
+
CREATE POLICY job_run_tenant_isolation ON job_run
|
|
151
|
+
USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
|
|
152
|
+
WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
|
|
153
|
+
|
|
154
|
+
COMMENT ON CONSTRAINT job_run_blocked_is_inert ON job_run IS
|
|
155
|
+
'Fail-closed como invariante de banco: run bloqueado com mutação ou cursor avançado não é gravável.';
|
|
156
|
+
|
|
157
|
+
-- ═══ 4 · Elegibilidade fiscal — default deny em três camadas ════════════════
|
|
158
|
+
--
|
|
159
|
+
-- O achado que motiva isto: hoje NADA no produto distingue "cliente que existe"
|
|
160
|
+
-- de "cliente que pode entrar em automação fiscal". Um job futuro que
|
|
161
|
+
-- selecionasse por `deleted_at IS NULL` alcançaria, no tenant da SC, dois
|
|
162
|
+
-- cadastros que foram criados em teste — e alcançaria a carteira real inteira
|
|
163
|
+
-- no dia seguinte a uma importação.
|
|
164
|
+
--
|
|
165
|
+
-- É a mesma lição da 0047 (liberação do destinatário), aplicada a documento
|
|
166
|
+
-- fiscal em vez de e-mail: a ausência tem de ser a barreira. Um default "entra
|
|
167
|
+
-- quem ninguém proibiu" transforma omissão em autorização — e omissão é o
|
|
168
|
+
-- estado natural de todo cliente que acabou de entrar.
|
|
169
|
+
--
|
|
170
|
+
-- Três camadas, porque três coisas diferentes podem estar erradas:
|
|
171
|
+
-- tenant → o ESCRITÓRIO ligou automação fiscal? em qual ambiente?
|
|
172
|
+
-- cliente → ESTE cliente foi inscrito, para ESTE tipo de documento?
|
|
173
|
+
-- credencial → existe insumo para operar em nome dele? verificado?
|
|
174
|
+
--
|
|
175
|
+
-- E uma quarta, que não é tabela: o estado de operação real
|
|
176
|
+
-- (`tenant_pilot_milestone.real_pilot_start`, 0047). Ambiente `production`
|
|
177
|
+
-- exige o marco declarado; `synthetic` não — é o que mantém desenvolvimento e
|
|
178
|
+
-- homologação possíveis sem abrir a porta da carteira real.
|
|
179
|
+
|
|
180
|
+
-- ── 4.1 · O escritório liga a automação, e declara em qual ambiente ────────
|
|
181
|
+
--
|
|
182
|
+
-- Ausência de linha = `disabled`. Não existe valor que signifique "herda".
|
|
183
|
+
--
|
|
184
|
+
-- `mode` é ambiente E chave ao mesmo tempo, de propósito: separá-los criaria o
|
|
185
|
+
-- estado `enabled=true, environment=null`, que alguém teria de interpretar — e
|
|
186
|
+
-- interpretação é onde documento de homologação vira documento real.
|
|
187
|
+
CREATE TABLE IF NOT EXISTS tenant_fiscal_automation (
|
|
188
|
+
tenant_id uuid PRIMARY KEY REFERENCES tenant(id),
|
|
189
|
+
mode text NOT NULL DEFAULT 'disabled'
|
|
190
|
+
CHECK (mode IN ('disabled', 'synthetic', 'production')),
|
|
191
|
+
enabled_at timestamptz,
|
|
192
|
+
enabled_by uuid REFERENCES "user"(id),
|
|
193
|
+
note text,
|
|
194
|
+
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
195
|
+
-- Ligar exige autor e data: "quem ligou isto?" é a única pergunta que a
|
|
196
|
+
-- linha existe para responder, e ela não pode ficar sem resposta.
|
|
197
|
+
CONSTRAINT tenant_fiscal_automation_enable_coherent
|
|
198
|
+
CHECK (mode = 'disabled' OR (enabled_at IS NOT NULL AND enabled_by IS NOT NULL))
|
|
199
|
+
);
|
|
200
|
+
|
|
201
|
+
ALTER TABLE tenant_fiscal_automation ENABLE ROW LEVEL SECURITY;
|
|
202
|
+
ALTER TABLE tenant_fiscal_automation FORCE ROW LEVEL SECURITY;
|
|
203
|
+
CREATE POLICY tenant_fiscal_automation_tenant_isolation ON tenant_fiscal_automation
|
|
204
|
+
USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
|
|
205
|
+
WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
|
|
206
|
+
|
|
207
|
+
COMMENT ON TABLE tenant_fiscal_automation IS
|
|
208
|
+
'Ausência de linha = automação fiscal desligada. Nenhuma migration liga escritório nenhum; ligar é ato humano com autor e data.';
|
|
209
|
+
|
|
210
|
+
-- ── 4.2 · A inscrição do cliente, por tipo de documento ────────────────────
|
|
211
|
+
--
|
|
212
|
+
-- Por TIPO, e não um booleano no cliente: um escritório pode acompanhar a NFS-e
|
|
213
|
+
-- de um cliente sem tocar na NF-e dele, e o inverso. Um booleano forçaria tudo
|
|
214
|
+
-- ou nada, e "tudo" é sempre a escolha errada quando o insumo é documento
|
|
215
|
+
-- fiscal de terceiro.
|
|
216
|
+
--
|
|
217
|
+
-- Revogação é lógica e mantém o histórico: quem esteve inscrito e saiu é um
|
|
218
|
+
-- fato que a trilha precisa preservar.
|
|
219
|
+
CREATE TABLE IF NOT EXISTS client_fiscal_enrollment (
|
|
220
|
+
id uuid PRIMARY KEY,
|
|
221
|
+
tenant_id uuid NOT NULL REFERENCES tenant(id),
|
|
222
|
+
client_id uuid NOT NULL,
|
|
223
|
+
document_type text NOT NULL CHECK (document_type IN ('nfe', 'nfse', 'cte', 'nfce')),
|
|
224
|
+
enrolled_at timestamptz NOT NULL DEFAULT now(),
|
|
225
|
+
enrolled_by uuid REFERENCES "user"(id),
|
|
226
|
+
revoked_at timestamptz,
|
|
227
|
+
revoked_by uuid REFERENCES "user"(id),
|
|
228
|
+
note text,
|
|
229
|
+
CONSTRAINT client_fiscal_enrollment_tenant_id_uq UNIQUE (tenant_id, id),
|
|
230
|
+
FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id),
|
|
231
|
+
CONSTRAINT client_fiscal_enrollment_revoke_coherent
|
|
232
|
+
CHECK ((revoked_at IS NULL) = (revoked_by IS NULL))
|
|
233
|
+
);
|
|
234
|
+
|
|
235
|
+
-- Uma inscrição VIVA por (cliente, tipo). Revogadas coexistem: são histórico.
|
|
236
|
+
CREATE UNIQUE INDEX IF NOT EXISTS client_fiscal_enrollment_live_uq
|
|
237
|
+
ON client_fiscal_enrollment (tenant_id, client_id, document_type)
|
|
238
|
+
WHERE revoked_at IS NULL;
|
|
239
|
+
|
|
240
|
+
ALTER TABLE client_fiscal_enrollment ENABLE ROW LEVEL SECURITY;
|
|
241
|
+
ALTER TABLE client_fiscal_enrollment FORCE ROW LEVEL SECURITY;
|
|
242
|
+
CREATE POLICY client_fiscal_enrollment_tenant_isolation ON client_fiscal_enrollment
|
|
243
|
+
USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
|
|
244
|
+
WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
|
|
245
|
+
|
|
246
|
+
-- ── 4.3 · Prontidão da credencial ──────────────────────────────────────────
|
|
247
|
+
--
|
|
248
|
+
-- Esta fase NÃO exige certificado A1. Ela define o conceito e o lugar.
|
|
249
|
+
--
|
|
250
|
+
-- O estado `no_credential` não está no CHECK de propósito: ele é a AUSÊNCIA de
|
|
251
|
+
-- linha, como em `client.communication_cleared_at`. Um enum com `no_credential`
|
|
252
|
+
-- permitiria a linha existir dizendo "não tem" — e daí alguém a criaria por
|
|
253
|
+
-- conveniência, e "não tem" viraria um estado configurável em vez do estado
|
|
254
|
+
-- natural de todo cliente.
|
|
255
|
+
--
|
|
256
|
+
-- `secret_ref` é referência do cofre (`vault://<nome>`), nunca o segredo. O
|
|
257
|
+
-- certificado é do CLIENTE, não do escritório e nem nosso: o que guardamos é
|
|
258
|
+
-- para onde apontar.
|
|
259
|
+
CREATE TABLE IF NOT EXISTS client_fiscal_credential (
|
|
260
|
+
id uuid PRIMARY KEY,
|
|
261
|
+
tenant_id uuid NOT NULL REFERENCES tenant(id),
|
|
262
|
+
client_id uuid NOT NULL,
|
|
263
|
+
kind text NOT NULL CHECK (kind IN ('certificate_a1', 'municipal_portal')),
|
|
264
|
+
status text NOT NULL
|
|
265
|
+
CHECK (status IN ('configured_not_verified', 'verified', 'expired', 'revoked')),
|
|
266
|
+
secret_ref text,
|
|
267
|
+
verified_at timestamptz,
|
|
268
|
+
expires_on date,
|
|
269
|
+
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
270
|
+
CONSTRAINT client_fiscal_credential_tenant_id_uq UNIQUE (tenant_id, id),
|
|
271
|
+
FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id),
|
|
272
|
+
-- `verified` sem data de verificação é uma afirmação sem prova.
|
|
273
|
+
CONSTRAINT client_fiscal_credential_verified_coherent
|
|
274
|
+
CHECK (status <> 'verified' OR verified_at IS NOT NULL),
|
|
275
|
+
-- Referência do cofre, jamais material. Um `-----BEGIN` aqui é acidente
|
|
276
|
+
-- grave; o banco recusa antes de virar um vazamento em backup.
|
|
277
|
+
CONSTRAINT client_fiscal_credential_ref_is_reference
|
|
278
|
+
CHECK (secret_ref IS NULL OR secret_ref ~ '^vault://[A-Za-z0-9_.:-]+$')
|
|
279
|
+
);
|
|
280
|
+
|
|
281
|
+
CREATE UNIQUE INDEX IF NOT EXISTS client_fiscal_credential_uq
|
|
282
|
+
ON client_fiscal_credential (tenant_id, client_id, kind);
|
|
283
|
+
|
|
284
|
+
ALTER TABLE client_fiscal_credential ENABLE ROW LEVEL SECURITY;
|
|
285
|
+
ALTER TABLE client_fiscal_credential FORCE ROW LEVEL SECURITY;
|
|
286
|
+
CREATE POLICY client_fiscal_credential_tenant_isolation ON client_fiscal_credential
|
|
287
|
+
USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
|
|
288
|
+
WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
|
|
289
|
+
|
|
290
|
+
COMMENT ON COLUMN client_fiscal_credential.secret_ref IS
|
|
291
|
+
'Referência do cofre (vault://…). NUNCA o certificado nem a senha dele — o material é do cliente e não passa por aqui.';
|
|
292
|
+
|
|
293
|
+
-- ── 5 · Nenhum cliente existente nasce elegível ────────────────────────────
|
|
294
|
+
--
|
|
295
|
+
-- Não há UPDATE, INSERT ou backfill nesta migration que torne alguém elegível.
|
|
296
|
+
-- É a afirmação central do gate e ela é verificável: as três tabelas acima
|
|
297
|
+
-- nascem VAZIAS, e vazio significa negado nas três camadas.
|
|
298
|
+
--
|
|
299
|
+
-- Vale para os 13 registros da SC e para os tenants sintéticos de certificação
|
|
300
|
+
-- pelo mesmo motivo — nenhum deles é mencionado, então nenhum deles é ligado.
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
-- 0056 — o documento fiscal como registro canônico, e o cursor que o busca.
|
|
2
|
+
--
|
|
3
|
+
-- ═══ O problema operacional, na frase de quem o tem ════════════════════════
|
|
4
|
+
--
|
|
5
|
+
-- A proprietária da SC precisa chegar mais cedo ou sair mais tarde para "fazer
|
|
6
|
+
-- baixa de nota fiscal de cliente". Essa expressão não descreve UMA rotina: ela
|
|
7
|
+
-- cobre buscar NFS-e emitidas no portal do município, buscar NF-e destinadas ao
|
|
8
|
+
-- cliente no ambiente nacional, salvar XML, conferir contra o que o cliente
|
|
9
|
+
-- mandou, e classificar por competência. Fluxos diferentes, sistemas
|
|
10
|
+
-- diferentes, e só o último é trabalho de contador.
|
|
11
|
+
--
|
|
12
|
+
-- Esta migration cria onde o resultado dessa busca cabe — e nada além disso.
|
|
13
|
+
-- Capturar documento NÃO é escriturar: apuração, obrigação e fechamento
|
|
14
|
+
-- continuam em outros domínios, e é deliberado que esta tabela não os toque.
|
|
15
|
+
--
|
|
16
|
+
-- ═══ Por que um modelo só para NF-e, NFS-e e CT-e ══════════════════════════
|
|
17
|
+
--
|
|
18
|
+
-- A pesquisa oficial desta onda mediu que os três compartilham a MESMA forma de
|
|
19
|
+
-- distribuição:
|
|
20
|
+
--
|
|
21
|
+
-- NF-e NT 2014.002 v1.02c (ago/2020) — WS `NFeDistribuicaoDFe`,
|
|
22
|
+
-- `distNSU`/`consNSU`/`consChNFe`, lote de até 50, `ultNSU`/`maxNSU`,
|
|
23
|
+
-- `docZip` gZip+base64.
|
|
24
|
+
-- CT-e NT 2015.002 — WS `CTeDistribuicaoDFe`, `distNSU`/`consNSU`,
|
|
25
|
+
-- `ultNSU`/`maxNSU`, `docZip`. Mesma semântica, outro documento.
|
|
26
|
+
-- NFS-e Manual dos Contribuintes do ADN v1.0 (12/02/2026) —
|
|
27
|
+
-- `GET /DFe/{NSU}` e `GET /NFSe/{ChaveAcesso}/Eventos`. REST em vez de
|
|
28
|
+
-- SOAP, e o MESMO conceito de NSU.
|
|
29
|
+
--
|
|
30
|
+
-- Um cursor NSU sobre um ator identificado por documento serve aos três. Modelar
|
|
31
|
+
-- só NFS-e agora criaria retrabalho garantido, e modelar cada um em tabela
|
|
32
|
+
-- própria triplicaria dedupe, cursor e trilha. Um registro canônico com
|
|
33
|
+
-- `document_type`, e o específico no payload normalizado.
|
|
34
|
+
|
|
35
|
+
-- ── 1 · O documento fiscal ─────────────────────────────────────────────────
|
|
36
|
+
--
|
|
37
|
+
-- RAW e NORMALIZED coexistem, e nenhum dos dois é derivável do outro em
|
|
38
|
+
-- produção: o XML original é o que tem valor probatório e o que a Receita
|
|
39
|
+
-- reconhece; o normalizado é o que a tela lê sem reparsear XML a cada render.
|
|
40
|
+
-- Normalizar NUNCA destrói o original — `raw_blob_id` aponta para `blob`, que
|
|
41
|
+
-- já carrega sha256, tamanho e chave de storage particionada por
|
|
42
|
+
-- {tenant}/{client}/{yyyy}/{mm}.
|
|
43
|
+
--
|
|
44
|
+
-- `normalized` é jsonb e não colunas por campo. Isso não é preguiça de
|
|
45
|
+
-- modelagem: a reforma tributária acrescenta IBS e CBS aos leiautes, e um
|
|
46
|
+
-- schema rígido demais hoje descartaria em silêncio campos que ainda não
|
|
47
|
+
-- existem. O que é consultado vira coluna; o resto sobrevive no jsonb e no XML.
|
|
48
|
+
CREATE TABLE IF NOT EXISTS fiscal_document (
|
|
49
|
+
id uuid PRIMARY KEY,
|
|
50
|
+
tenant_id uuid NOT NULL REFERENCES tenant(id),
|
|
51
|
+
client_id uuid NOT NULL,
|
|
52
|
+
|
|
53
|
+
document_type text NOT NULL CHECK (document_type IN ('nfse', 'nfe', 'cte', 'nfce')),
|
|
54
|
+
-- `received` é o caso que a NT 2014.002 privilegia: "Documentos emitidos pela
|
|
55
|
+
-- própria empresa NÃO estarão disponíveis para consulta" no DF-e da NF-e. Já
|
|
56
|
+
-- o ADN da NFS-e devolve documentos em que o contribuinte é emitente,
|
|
57
|
+
-- tomador OU intermediário. A coluna existe porque a resposta é diferente por
|
|
58
|
+
-- documento, e tratar tudo como "nota do cliente" perderia a distinção que
|
|
59
|
+
-- decide o que se faz com ela.
|
|
60
|
+
direction text NOT NULL CHECK (direction IN ('issued', 'received', 'intermediary')),
|
|
61
|
+
|
|
62
|
+
source text NOT NULL,
|
|
63
|
+
-- Sem fallback entre ambientes, nos dois sentidos (Gate B0 §4). Documento de
|
|
64
|
+
-- homologação nunca vira documento real por omissão de coluna.
|
|
65
|
+
source_environment text NOT NULL
|
|
66
|
+
CHECK (source_environment IN ('synthetic', 'homologation', 'production')),
|
|
67
|
+
-- Posição do cursor que entregou este documento. Texto e não bigint: o NSU da
|
|
68
|
+
-- NT 2014.002 tem até 15 dígitos e o do ADN não promete ser numérico.
|
|
69
|
+
source_nsu text,
|
|
70
|
+
|
|
71
|
+
access_key text,
|
|
72
|
+
document_number text,
|
|
73
|
+
series text,
|
|
74
|
+
issuer_document text,
|
|
75
|
+
issuer_name text,
|
|
76
|
+
recipient_document text,
|
|
77
|
+
recipient_name text,
|
|
78
|
+
issued_at timestamptz,
|
|
79
|
+
-- Competência CONTÁBIL, separada da emissão de propósito: nota emitida em
|
|
80
|
+
-- 02/10 pode pertencer à competência 2026-09, e assumir que as duas são a
|
|
81
|
+
-- mesma coisa é como o fechamento mensal sai errado.
|
|
82
|
+
competence_label text CHECK (competence_label IS NULL OR competence_label ~ '^\d{4}-\d{2}$'),
|
|
83
|
+
gross_amount numeric(14,2),
|
|
84
|
+
currency text NOT NULL DEFAULT 'BRL',
|
|
85
|
+
|
|
86
|
+
-- Cancelada não é apagada. A nota existiu, foi contabilizada por alguém, e
|
|
87
|
+
-- some do painel só se alguém decidir escondê-la — nunca por efeito colateral
|
|
88
|
+
-- de um evento.
|
|
89
|
+
status text NOT NULL DEFAULT 'active'
|
|
90
|
+
CHECK (status IN ('active', 'cancelled', 'replaced', 'denied')),
|
|
91
|
+
-- `summary` é o `resNFe`: o que o ambiente nacional entrega ao destinatário
|
|
92
|
+
-- ANTES da manifestação. `full` é o `procNFe`. A distinção é do leiaute, não
|
|
93
|
+
-- nossa, e o produto precisa dizer qual tem — um resumo apresentado como
|
|
94
|
+
-- documento completo é uma mentira sobre o que o escritório possui.
|
|
95
|
+
content_kind text NOT NULL DEFAULT 'summary' CHECK (content_kind IN ('summary', 'full')),
|
|
96
|
+
|
|
97
|
+
raw_blob_id uuid,
|
|
98
|
+
raw_sha256 text CHECK (raw_sha256 IS NULL OR raw_sha256 ~ '^[a-f0-9]{64}$'),
|
|
99
|
+
normalized jsonb NOT NULL DEFAULT '{}'::jsonb,
|
|
100
|
+
|
|
101
|
+
-- Identidade de deduplicação. Calculada pelo adapter conforme o tipo: chave de
|
|
102
|
+
-- acesso quando existe, senão o par (fonte, identificador do provedor), senão
|
|
103
|
+
-- o hash do conteúdo. Nunca o NSU sozinho — o mesmo documento pode reaparecer
|
|
104
|
+
-- sob outro NSU num replay, e é exatamente esse o caso que a dedupe existe
|
|
105
|
+
-- para absorver.
|
|
106
|
+
dedupe_key text NOT NULL,
|
|
107
|
+
|
|
108
|
+
ingested_at timestamptz NOT NULL DEFAULT now(),
|
|
109
|
+
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
110
|
+
|
|
111
|
+
CONSTRAINT fiscal_document_tenant_id_uq UNIQUE (tenant_id, id),
|
|
112
|
+
FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id),
|
|
113
|
+
FOREIGN KEY (tenant_id, raw_blob_id) REFERENCES blob (tenant_id, id),
|
|
114
|
+
-- Um documento marcado `full` sem original guardado é uma afirmação sem
|
|
115
|
+
-- lastro. `summary` pode não ter blob: o resumo cabe no normalizado.
|
|
116
|
+
CONSTRAINT fiscal_document_full_has_raw
|
|
117
|
+
CHECK (content_kind <> 'full' OR raw_blob_id IS NOT NULL)
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
-- A dedupe é por (tenant, cliente, chave). Cliente entra porque a MESMA nota
|
|
121
|
+
-- pode ser destinada a um cliente e emitida por outro dentro do mesmo
|
|
122
|
+
-- escritório — são dois fatos contábeis distintos sobre o mesmo XML.
|
|
123
|
+
CREATE UNIQUE INDEX IF NOT EXISTS fiscal_document_dedupe_uq
|
|
124
|
+
ON fiscal_document (tenant_id, client_id, dedupe_key);
|
|
125
|
+
|
|
126
|
+
CREATE INDEX IF NOT EXISTS fiscal_document_client_idx
|
|
127
|
+
ON fiscal_document (tenant_id, client_id, issued_at DESC);
|
|
128
|
+
CREATE INDEX IF NOT EXISTS fiscal_document_competence_idx
|
|
129
|
+
ON fiscal_document (tenant_id, competence_label, document_type);
|
|
130
|
+
|
|
131
|
+
ALTER TABLE fiscal_document ENABLE ROW LEVEL SECURITY;
|
|
132
|
+
ALTER TABLE fiscal_document FORCE ROW LEVEL SECURITY;
|
|
133
|
+
-- Duas fronteiras, não uma. O ramo aberto de `app.current_client` é o mesmo
|
|
134
|
+
-- padrão das demais tabelas client-scoped: staff vê o escritório inteiro, o
|
|
135
|
+
-- portal vê só o próprio cliente.
|
|
136
|
+
CREATE POLICY fiscal_document_tenant_isolation ON fiscal_document
|
|
137
|
+
USING (
|
|
138
|
+
tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
|
|
139
|
+
AND (
|
|
140
|
+
NULLIF(current_setting('app.current_client', true), '') IS NULL
|
|
141
|
+
OR client_id = NULLIF(current_setting('app.current_client', true), '')::uuid
|
|
142
|
+
)
|
|
143
|
+
)
|
|
144
|
+
WITH CHECK (
|
|
145
|
+
tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
|
|
146
|
+
AND (
|
|
147
|
+
NULLIF(current_setting('app.current_client', true), '') IS NULL
|
|
148
|
+
OR client_id = NULLIF(current_setting('app.current_client', true), '')::uuid
|
|
149
|
+
)
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
COMMENT ON COLUMN fiscal_document.competence_label IS
|
|
153
|
+
'Competência CONTÁBIL (YYYY-MM), separada de issued_at: emissão e competência divergem, e assumir que são a mesma coisa erra o fechamento.';
|
|
154
|
+
COMMENT ON COLUMN fiscal_document.content_kind IS
|
|
155
|
+
'summary = resNFe (o que o ambiente nacional entrega antes da manifestação); full = procNFe. Apresentar resumo como documento completo é mentir sobre o que o escritório possui.';
|
|
156
|
+
|
|
157
|
+
-- ── 2 · Eventos do documento ───────────────────────────────────────────────
|
|
158
|
+
--
|
|
159
|
+
-- Cancelamento, substituição e correção são EVENTOS, e o documento continua
|
|
160
|
+
-- existindo. A NT 2014.002 é explícita: o cancelamento é entregue mesmo sem
|
|
161
|
+
-- manifestação do destinatário, justamente porque ele muda o que a nota
|
|
162
|
+
-- significa sem apagá-la.
|
|
163
|
+
CREATE TABLE IF NOT EXISTS fiscal_document_event (
|
|
164
|
+
id uuid PRIMARY KEY,
|
|
165
|
+
tenant_id uuid NOT NULL REFERENCES tenant(id),
|
|
166
|
+
fiscal_document_id uuid NOT NULL,
|
|
167
|
+
event_type text NOT NULL
|
|
168
|
+
CHECK (event_type IN ('cancellation', 'replacement', 'correction',
|
|
169
|
+
'manifestation', 'other')),
|
|
170
|
+
event_code text,
|
|
171
|
+
occurred_at timestamptz,
|
|
172
|
+
source_nsu text,
|
|
173
|
+
raw_blob_id uuid,
|
|
174
|
+
payload jsonb NOT NULL DEFAULT '{}'::jsonb,
|
|
175
|
+
dedupe_key text NOT NULL,
|
|
176
|
+
ingested_at timestamptz NOT NULL DEFAULT now(),
|
|
177
|
+
CONSTRAINT fiscal_document_event_tenant_id_uq UNIQUE (tenant_id, id),
|
|
178
|
+
FOREIGN KEY (tenant_id, fiscal_document_id) REFERENCES fiscal_document (tenant_id, id),
|
|
179
|
+
FOREIGN KEY (tenant_id, raw_blob_id) REFERENCES blob (tenant_id, id)
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
CREATE UNIQUE INDEX IF NOT EXISTS fiscal_document_event_dedupe_uq
|
|
183
|
+
ON fiscal_document_event (tenant_id, fiscal_document_id, dedupe_key);
|
|
184
|
+
|
|
185
|
+
ALTER TABLE fiscal_document_event ENABLE ROW LEVEL SECURITY;
|
|
186
|
+
ALTER TABLE fiscal_document_event FORCE ROW LEVEL SECURITY;
|
|
187
|
+
CREATE POLICY fiscal_document_event_tenant_isolation ON fiscal_document_event
|
|
188
|
+
USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
|
|
189
|
+
WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
|
|
190
|
+
|
|
191
|
+
-- ── 3 · O cursor de sincronização ──────────────────────────────────────────
|
|
192
|
+
--
|
|
193
|
+
-- Por (tenant, cliente, fonte, ambiente), e não por job: o NSU do ambiente
|
|
194
|
+
-- nacional é POR CNPJ consultado. O `job_cursor` do Gate B0 é por tenant e não
|
|
195
|
+
-- tem essa granularidade — reaproveitá-lo colapsaria a posição de todos os
|
|
196
|
+
-- clientes numa só e o primeiro cliente sincronizado apagaria a posição dos
|
|
197
|
+
-- outros.
|
|
198
|
+
--
|
|
199
|
+
-- ═══ `next_attempt_after` é a defesa contra o cStat 656 ════════════════════
|
|
200
|
+
--
|
|
201
|
+
-- A NT 2014.002 §3.5 é explícita: "A empresa deverá aguardar um tempo mínimo de
|
|
202
|
+
-- UMA HORA para efetuar uma nova solicitação de distribuição caso receba a
|
|
203
|
+
-- indicação que não existem mais documentos" (`ultNSU` == `maxNSU`, cStat 137).
|
|
204
|
+
-- Consultar antes disso é "consumo indevido" e o ambiente nacional rejeita com
|
|
205
|
+
-- **cStat 656**, bloqueando o CNPJ.
|
|
206
|
+
--
|
|
207
|
+
-- E o CNPJ bloqueado é o DO CLIENTE, não o nosso. Um laço mal escrito aqui
|
|
208
|
+
-- produz dano num terceiro que não pediu nada — por isso a espera é uma coluna
|
|
209
|
+
-- do banco e não um `sleep` no processo. Processo morre; linha não.
|
|
210
|
+
CREATE TABLE IF NOT EXISTS fiscal_sync_cursor (
|
|
211
|
+
id uuid PRIMARY KEY,
|
|
212
|
+
tenant_id uuid NOT NULL REFERENCES tenant(id),
|
|
213
|
+
client_id uuid NOT NULL,
|
|
214
|
+
source text NOT NULL,
|
|
215
|
+
environment text NOT NULL
|
|
216
|
+
CHECK (environment IN ('synthetic', 'homologation', 'production')),
|
|
217
|
+
-- Última posição CONFIRMADAMENTE persistida. Nunca adiantada antes do commit
|
|
218
|
+
-- dos documentos daquele lote.
|
|
219
|
+
last_nsu text,
|
|
220
|
+
-- Maior NSU que o provedor declarou existir. `last_nsu = max_nsu` é a
|
|
221
|
+
-- condição que arma a espera de uma hora.
|
|
222
|
+
max_nsu text,
|
|
223
|
+
last_success_at timestamptz,
|
|
224
|
+
-- Antes deste instante, nenhuma requisição sai. É o que impede o 656.
|
|
225
|
+
next_attempt_after timestamptz,
|
|
226
|
+
consecutive_failures int NOT NULL DEFAULT 0 CHECK (consecutive_failures >= 0),
|
|
227
|
+
last_error_class text,
|
|
228
|
+
contract_version int NOT NULL DEFAULT 1,
|
|
229
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
230
|
+
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
231
|
+
CONSTRAINT fiscal_sync_cursor_tenant_id_uq UNIQUE (tenant_id, id),
|
|
232
|
+
FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id)
|
|
233
|
+
);
|
|
234
|
+
|
|
235
|
+
CREATE UNIQUE INDEX IF NOT EXISTS fiscal_sync_cursor_uq
|
|
236
|
+
ON fiscal_sync_cursor (tenant_id, client_id, source, environment);
|
|
237
|
+
|
|
238
|
+
ALTER TABLE fiscal_sync_cursor ENABLE ROW LEVEL SECURITY;
|
|
239
|
+
ALTER TABLE fiscal_sync_cursor FORCE ROW LEVEL SECURITY;
|
|
240
|
+
CREATE POLICY fiscal_sync_cursor_tenant_isolation ON fiscal_sync_cursor
|
|
241
|
+
USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
|
|
242
|
+
WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
|
|
243
|
+
|
|
244
|
+
COMMENT ON COLUMN fiscal_sync_cursor.next_attempt_after IS
|
|
245
|
+
'Defesa contra o cStat 656 da NT 2014.002: uma hora de espera depois de cStat 137. O CNPJ que o 656 bloqueia é o do CLIENTE — por isso a espera é linha de banco, não sleep de processo.';
|
|
246
|
+
|
|
247
|
+
-- ── 4 · A trilha do lote ───────────────────────────────────────────────────
|
|
248
|
+
--
|
|
249
|
+
-- `job_run` (Gate B0) responde "o worker pôde rodar?". Esta responde "o que a
|
|
250
|
+
-- busca trouxe?" — são perguntas diferentes e uma não substitui a outra.
|
|
251
|
+
--
|
|
252
|
+
-- Sem XML e sem PII: contadores, classe de erro e as duas pontas do cursor.
|
|
253
|
+
CREATE TABLE IF NOT EXISTS fiscal_sync_run (
|
|
254
|
+
id uuid PRIMARY KEY,
|
|
255
|
+
tenant_id uuid NOT NULL REFERENCES tenant(id),
|
|
256
|
+
client_id uuid NOT NULL,
|
|
257
|
+
source text NOT NULL,
|
|
258
|
+
environment text NOT NULL
|
|
259
|
+
CHECK (environment IN ('synthetic', 'homologation', 'production')),
|
|
260
|
+
outcome text NOT NULL
|
|
261
|
+
CHECK (outcome IN ('completed', 'no_documents', 'throttled',
|
|
262
|
+
'blocked_eligibility', 'blocked_credential',
|
|
263
|
+
'blocked_contract', 'provider_error', 'failed')),
|
|
264
|
+
documents_fetched int NOT NULL DEFAULT 0 CHECK (documents_fetched >= 0),
|
|
265
|
+
documents_new int NOT NULL DEFAULT 0 CHECK (documents_new >= 0),
|
|
266
|
+
documents_duplicate int NOT NULL DEFAULT 0 CHECK (documents_duplicate >= 0),
|
|
267
|
+
documents_failed int NOT NULL DEFAULT 0 CHECK (documents_failed >= 0),
|
|
268
|
+
cursor_before text,
|
|
269
|
+
cursor_after text,
|
|
270
|
+
error_class text,
|
|
271
|
+
detail text,
|
|
272
|
+
started_at timestamptz NOT NULL DEFAULT now(),
|
|
273
|
+
finished_at timestamptz,
|
|
274
|
+
duration_ms int,
|
|
275
|
+
CONSTRAINT fiscal_sync_run_tenant_id_uq UNIQUE (tenant_id, id),
|
|
276
|
+
FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id),
|
|
277
|
+
-- A mesma invariante do `job_run`, aplicada ao dado: um lote bloqueado não
|
|
278
|
+
-- trouxe documento e não moveu cursor. O banco recusa a linha incoerente em
|
|
279
|
+
-- vez de confiar na ordem das operações do TypeScript.
|
|
280
|
+
CONSTRAINT fiscal_sync_run_blocked_is_inert
|
|
281
|
+
CHECK (outcome NOT IN ('blocked_eligibility', 'blocked_credential', 'blocked_contract', 'throttled')
|
|
282
|
+
OR (documents_fetched = 0 AND documents_new = 0 AND cursor_after IS NOT DISTINCT FROM cursor_before))
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
CREATE INDEX IF NOT EXISTS fiscal_sync_run_idx
|
|
286
|
+
ON fiscal_sync_run (tenant_id, client_id, started_at DESC);
|
|
287
|
+
|
|
288
|
+
ALTER TABLE fiscal_sync_run ENABLE ROW LEVEL SECURITY;
|
|
289
|
+
ALTER TABLE fiscal_sync_run FORCE ROW LEVEL SECURITY;
|
|
290
|
+
CREATE POLICY fiscal_sync_run_tenant_isolation ON fiscal_sync_run
|
|
291
|
+
USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
|
|
292
|
+
WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
|
|
293
|
+
|
|
294
|
+
-- ── 5 · A capacidade que o worker fiscal vai exigir ────────────────────────
|
|
295
|
+
--
|
|
296
|
+
-- Declarada AQUI, na mesma migration que cria o schema que a sustenta — é a
|
|
297
|
+
-- regra expand → declare → deploy → contract do doc 142. Antes disso o worker
|
|
298
|
+
-- fica INCOMPATIBLE e não escreve; depois passa sozinho.
|
|
299
|
+
INSERT INTO platform_capability (key, label, contract_version, declared_by_migration) VALUES
|
|
300
|
+
('office.fiscal-ingestion.v1',
|
|
301
|
+
'Ingestão de documentos fiscais: registro canônico, eventos, cursor e trilha', 1, '0056')
|
|
302
|
+
ON CONFLICT (key) DO NOTHING;
|
|
303
|
+
|
|
304
|
+
-- ── 6 · O terceiro ambiente ────────────────────────────────────────────────
|
|
305
|
+
--
|
|
306
|
+
-- A 0055 modelou dois: `synthetic` e `production`. A pesquisa desta onda mostrou
|
|
307
|
+
-- que faltava um, e que ele é o mais importante do meio do caminho: a
|
|
308
|
+
-- **produção restrita** do ADN (`adn.producaorestrita.nfse.gov.br`) e a
|
|
309
|
+
-- homologação da SEFAZ não são nem laboratório nem produção. São ambientes
|
|
310
|
+
-- OFICIAIS, que respondem como o real, com documento que não vale nada.
|
|
311
|
+
--
|
|
312
|
+
-- Sem essa distinção, ligar homologação exigiria declarar o escritório em
|
|
313
|
+
-- `production` — e aí um adapter apontado para produção de verdade passaria a
|
|
314
|
+
-- elegibilidade que alguém abriu para ensaiar. É o fallback silencioso que o
|
|
315
|
+
-- Gate B0 proibiu, entrando pela porta do vocabulário.
|
|
316
|
+
ALTER TABLE tenant_fiscal_automation DROP CONSTRAINT IF EXISTS tenant_fiscal_automation_mode_check;
|
|
317
|
+
ALTER TABLE tenant_fiscal_automation ADD CONSTRAINT tenant_fiscal_automation_mode_check
|
|
318
|
+
CHECK (mode IN ('disabled', 'synthetic', 'homologation', 'production'));
|
|
319
|
+
|
|
320
|
+
COMMENT ON COLUMN tenant_fiscal_automation.mode IS
|
|
321
|
+
'disabled (ausência de linha também) | synthetic (fixture) | homologation (ambiente OFICIAL de teste, documento sem valor) | production. Sem fallback entre eles, em nenhuma direção.';
|
|
322
|
+
|
|
323
|
+
-- ── 6 · Retirada de `client_fiscal_credential` ─────────────────────────────
|
|
324
|
+
--
|
|
325
|
+
-- Criada ontem, na 0055, e é invenção: o domínio de certificado já existe em
|
|
326
|
+
-- `digital_certificate` (vertical contábil, migration 1002), COM consumidores
|
|
327
|
+
-- vivos — a rota de compliance e o painel do piloto. Duas tabelas para o mesmo
|
|
328
|
+
-- fato dariam duas respostas para "este cliente tem certificado?", e elas
|
|
329
|
+
-- divergiriam na primeira vez que alguém atualizasse só uma.
|
|
330
|
+
--
|
|
331
|
+
-- A remoção é segura e foi medida antes: em produção a tabela tem
|
|
332
|
+
-- `n_tup_ins = 0` — nenhuma inserção desde a criação, não apenas nenhuma linha
|
|
333
|
+
-- viva. Nada é perdido porque nada foi escrito.
|
|
334
|
+
--
|
|
335
|
+
-- A prontidão passa a sair de `digital_certificate`, que ganha o que lhe
|
|
336
|
+
-- faltava para responder à pergunta (ver a migration 1004 da vertical).
|
|
337
|
+
DROP TABLE IF EXISTS client_fiscal_credential;
|