Files
oto-enterprise-os-dtp/05_deliverables_mvp/fiscal/ecf_dgii/ecf_spec.json
T
Claude Code DTP Worker ee421add1d [DTP-Worker] Sprint 8 · buffer · Fiscal/ecf_dgii : le JEU DE DEVISES moneda (USD/DOP) ANCRÉ sur CLAUDE.md #10
Le champ que `Encabezado.TipoMoneda` porte dans chaque e-CF DGII —
`moneda.options = ["USD","DOP"]` — vit dans `ecf_spec.json` ET, byte-gaté par
check_artifacts, dans `out/ecf_plan.json`. C'est une valeur CANONIQUE de CLAUDE.md
#10 (« **USD + DOP** devises ») dont le README se réclame « #10 » (README:37/57/77).
Or byte-gater une constante prouve la REPRODUCTIBILITÉ, PAS l'ANCRAGE :
check_artifacts prouve ecf_plan==build depuis le spec, JAMAIS que spec[moneda]==#10.
Les blocs fiscaux amont gatent le FormaPago (Cardnet · #10) + états/champs
émetteurs, AVEUGLES au jeu de devises ; le bloc « Fiches #10 » ancre les fiches
ERPNext/CRM, AVEUGLE au module fiscal.

Piège #6 : RENOMMER/ÉTENDRE les devises dans CLAUDE.md #10 (`USD + DOP`→`USD + EUR`,
ou +`EUR`) ET dans le spec de façon cohérente reste byte-VERT tout en faisant
émettre à l'e-CF un `TipoMoneda` d'une devise qui CONTREDIT le mandat — « vert
trompeur » de la classe de la marque SEO §Entités, la persona Chat OTOIA ou les
tokens branding #4, qu'aucune suite tests/ (FONCTIONS de génération, jamais l'ancre
à CLAUDE.md) n'attrape. L'agent ERPNext Backend câblerait TipoMoneda hors mandat.

Correctif de déclaration : nouveau champ `moneda.options_source` (ecf_spec.json +
requis dans ecf.schema.json) citant « CLAUDE.md #10 — devises **USD + DOP** »,
DISTINCT de `source` (taux TipoCambio, reste null/a_confirmer côté VPS · #8).
Artefact régénéré (byte-gate re-verte · 39 tests module verts).

Gate ajouté (ci/check_readme_claims.sh, bloc « Fiscal · ecf_dgii — le JEU DE
DEVISES `moneda` … ANCRÉ sur CLAUDE.md #10 ») : RÉUTILISE exp["devises"] déjà
recomputé depuis #10 (zéro duplication) ; (a) spec[moneda].options == devises #10
ORDRE exact ; (b) artefact byte-gaté idem ; (c) options_source cite CLAUDE.md #10 +
chaque devise ; (d) prose README qui se réclame de #10 == jeu exact + toute mention
moneda/devise d'une paire concordante (scan ancré sur contexte, évite le faux
positif `RNC / ITBIS`). 7 morsures vérifiées (CLAUDE.md #10 rename = 4 bites en
cascade · spec options régénéré = le vrai silent green · artefact seul · reorder ·
options_source sans ancre · README ligne #10 · README table), restauré vert, 7
gates re-verts.

ci/README.md (clause récap + paragraphe « 4e surface du MÊME README ») mis à jour.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 07:43:29 +00:00

105 lines
6.2 KiB
JSON

{
"version": "1.0.0",
"config_name": "OTO e-CF DGII (Compupar)",
"provider": "Compupar",
"devise_field": "devise",
"_comment": "Contrat STRUCTUREL de l'intégration e-CF DGII via le proveedor certifié Compupar (roadmap Sprint 4 · ERPNext Backend « e-CF DGII intégration (Compupar) »). Il décrit : quels TYPES d'e-CF sont dans le périmètre d'émission OTO, QUEL évènement du pipeline vente déclenche une émission, SUR quel champ de base, PAR quel rôle Compta, et COMMENT les champs du Dossier Vente se projettent sur l'e-CF (field_map). ANTI-INVENTION (#6) : ce fichier n'encode AUCUN chiffre propre à OTO — RNC émetteur, taux ITBIS, TipoCambio USD→DOP et endpoints/credentials Compupar restent `null` + `a_confirmer: true` (le VPS/Direction les renseignent AVEC source · #8). Seules les DONNÉES DE RÉFÉRENCE DGII (codes de type e-CF, formes de paiement, format e-NCF) sont encodées, car ce sont des identifiants normalisés du standard e-CF DGII (pas des chiffres OTO), et elles portent leur `source`. Cross-cohérence : chaque `update_value` référence un état SOUMIS (doc_status=1) du workflow vente ; `base_field` référence un champ Currency du DocType OTO Dossier Vente ; `role_id` référence un rôle du portail `compta` de rbac_50_roles.json. Le worker n'écrit jamais sur le VPS (#8).",
"emisor": {
"rnc_emisor": null,
"razon_social": null,
"source": null,
"a_confirmer": true,
"note": "RNC + raison sociale de l'entité émettrice (WA SRL / AC Arias Cuevas selon projet) — jamais fabriqués ici ; renseignés par la Direction/Compta avec source (#6)."
},
"provider_config": {
"nom": "Compupar",
"role": "PAC — signe et transmet l'e-CF a la DGII pour le compte de l'emetteur ; recoit l'aprobacion comercial.",
"endpoint_recepcion": null,
"endpoint_aprobacion_comercial": null,
"credentials_ref": "/etc/oto/credentials (VPS · #8 · JAMAIS en repo)",
"certificat_ref": "certificat digital DGII cote VPS (#8)",
"source": "DGII · facturacion electronica — proveedor certifie (Compupar)",
"a_confirmer": true
},
"e_ncf": {
"prefix": "E",
"longueur": 13,
"regex": "^E[0-9]{12}$",
"structure": "E + tipoeCF (2 chiffres) + secuencia (10 chiffres)",
"note_secuencia": "La secuencia provient d'un RANGO autorise par la DGII (autorizacion de e-NCF) — jamais fabriquee en repo ; assignee cote VPS/Compupar (#8).",
"source": "DGII · formato e-NCF (Ley 32-23 de Facturacion Electronica)"
},
"tipos_ecf": [
{ "code": "31", "label": "Factura de Credito Fiscal Electronica", "en_scope": true },
{ "code": "32", "label": "Factura de Consumo Electronica", "en_scope": true },
{ "code": "33", "label": "Nota de Debito Electronica", "en_scope": true },
{ "code": "34", "label": "Nota de Credito Electronica", "en_scope": true },
{ "code": "41", "label": "Compras Electronico", "en_scope": false },
{ "code": "43", "label": "Gastos Menores Electronico", "en_scope": false },
{ "code": "44", "label": "Regimenes Especiales Electronico", "en_scope": false },
{ "code": "45", "label": "Gubernamental Electronico", "en_scope": false },
{ "code": "46", "label": "Comprobante para Exportaciones Electronico", "en_scope": true },
{ "code": "47", "label": "Comprobante para Pagos al Exterior Electronico", "en_scope": false }
],
"formas_pago": [
{ "code": "1", "label": "Efectivo" },
{ "code": "2", "label": "Cheque/Transferencia/Deposito" },
{ "code": "3", "label": "Tarjeta Debito/Credito" },
{ "code": "4", "label": "Venta a Credito" },
{ "code": "5", "label": "Bonos o Certificados de regalo" },
{ "code": "6", "label": "Permuta" },
{ "code": "7", "label": "Nota de credito" },
{ "code": "8", "label": "Otras Formas de pago" }
],
"forma_pago_defaut": {
"code": "3",
"motif": "Encaissements OTO par carte via Cardnet (CLAUDE.md #10) → FormaPago 3 (Tarjeta).",
"source": "DGII · tabla FormaPago (code 3) · CLAUDE.md #10 (Cardnet)"
},
"moneda": {
"tipo_moneda_field": "devise",
"options": ["USD", "DOP"],
"options_source": "CLAUDE.md #10 — devises **USD + DOP** (source unique · jamais inventé · #6). Distinct de `source` (taux TipoCambio) qui reste null/a_confirmer.",
"tipo_cambio": null,
"note_cambio": "Un e-CF libelle en USD exige un TipoCambio (DOP/USD) SOURCE (taux du jour BCRD/DGII) — jamais fabrique (#6). En DOP, TipoCambio non requis.",
"source": null,
"a_confirmer": true
},
"taxes": [
{
"code": "ITBIS",
"label": "Impuesto sobre Transferencias de Bienes Industrializados y Servicios",
"taux_pct": null,
"source": null,
"a_confirmer": true,
"note": "Le taux ITBIS applicable (et l'exoneration eventuelle CONFOTUR sur l'immobilier touristique) est fiscal et depend du projet ; renseigne par le Fiscaliste eCF avec source (#6) — jamais fabrique ici."
}
],
"emission_events": [
{
"update_value": "reservation",
"tipo_ecf": null,
"base_field": "montant_reservation",
"role_id": "compta-fiscaliste-ecf",
"libelle": "Emission e-CF sur depot de reservation encaisse",
"a_confirmer": true
},
{
"update_value": "contrat",
"tipo_ecf": null,
"base_field": "montant_contrat",
"role_id": "compta-fiscaliste-ecf",
"libelle": "Emission e-CF sur contrat signe (comprobante principal)",
"a_confirmer": true
}
],
"field_map": [
{ "dossier_field": "client", "ecf_element": "Comprador.RazonSocialComprador", "note": "Customer ERPNext → razon social acheteur" },
{ "dossier_field": "devise", "ecf_element": "Encabezado.TipoMoneda", "note": "Select USD/DOP → TipoMoneda (#10)" },
{ "dossier_field": "montant_contrat", "ecf_element": "Totales.MontoTotal", "note": "base Currency contrat → MontoTotal" },
{ "dossier_field": "montant_reservation", "ecf_element": "Totales.MontoTotal", "note": "base Currency reservation → MontoTotal (e-CF de reservation)" },
{ "dossier_field": "projet", "ecf_element": "DetallesItems.Item.NombreItem", "note": "projet/unite → description de la ligne" },
{ "dossier_field": "unite", "ecf_element": "DetallesItems.Item.NombreItem", "note": "reference d'unite → complement description" }
]
}