Feat/dgfip tva#125
Conversation
Adds a new top-level 'DGFIP' provider (code 43) for error tracking. Distinct from 'DGFIP - Adélie' (03) and 'DGFIP - SVAIR' (27) which identify specific upstream channels; reserved for endpoints that proxy DGFIP data published through other channels (e.g. data.gouv.fr datasets).
GET /v3/dgfip/numero_tva/:siren returns the French intra-community VAT numbers associated with a SIREN, sourced from the DGFIP TVA dataset published on data.gouv.fr. Architecture is a thin proxy of tabular-api.data.gouv.fr — for each request we issue a single 'vat_no__contains=<siren>&page_size=200' query to the data.gouv tabular API and reshape the rows into the API Entreprise collection response. There is no local mirror: server-side filtering on the tabular API runs in ~200ms p99, and matches per SIREN are bounded (an entreprise typically has 1–3 historical VAT numbers). The endpoint is wired and tested but stays operationally offline until the resource UUID and base URL credentials are populated: Siade.credentials[:dgfip_tva_base_url] = https://tabular-api.data.gouv.fr Siade.credentials[:dgfip_tva_resource_id] = <DGFIP-provided UUID> When the credentials are missing the endpoint returns 503 via ProviderUnavailable. Target go-live: 2026-06-10 (DGFIP dataset publication).
Adds Resources::Dgfip#numero_tva(siren, version:) — open-data lookup of the intra-community VAT numbers associated with a SIREN, proxied by SIADE from tabular-api.data.gouv.fr. Scaffolded automatically from the OpenAPI spec by clients/ruby/bin/scaffold_resources. The gem hasn't shipped its initial release yet, so the new method lands under the [Unreleased] section of the changelog rather than as its own SemVer entry.
Drift catch-up: the source yamls already contained the corrected error code (00100, was 0100) and meta.provider blocks, but the generated README and summary.csv were never re-run. Picked up by running bin/generate_payload_readme.rb during unrelated work on the numero_tva mocks. No payload .yaml change.
Three 200 fixtures covering the realistic shape of the endpoint:
- 200-single.yaml — SIREN with one VAT number (the common case)
- 200-multiple.yaml — SIREN with two historical VAT numbers, sorted by
date_emission ASC, exercising the collection ordering
- 200-empty.yaml — SIREN absent from the DGFIP extraction; collection
is empty (not a 404)
No 4xx fixtures: 422 input validation is rejected upstream of the mock
backend; 503 from a misconfigured upstream resource_id is an operational
concern, not a data-shape concern, so it doesn't need a fixture here.
README.md and summary.csv regenerated via bin/generate_payload_readme.rb.
skelz0r
left a comment
There was a problem hiding this comment.
Globalement la seule question importante est : on tape sur quoi ? quels sont les quotas ? Tout le MakeRequest/BuildRequest est conditionné par les réponses à ces questions. Si c'est genre 10 appels/minute c'est même pas la peine de faire ça et faut voir comme on gère.
La signature de l'API ne me semble pas correct non plus : y'a des infos useless pour nos usagers + il manque la date de la dernière mise à jour dans les meta. D'ailleurs cette date de dernière mise à jour pourrait être dans les erreurs 404. D'ailleurs, est-ce qu'on peut à travers le système que tu exploites, avoir ces infos ?
A la lumière des 2 grosses interrogations métier et technique j'ai review partiellement.
| date_emission: | ||
| title: "Date d'émission du numéro de TVA" | ||
| type: "string" | ||
| format: "date" | ||
| example: "1993-01-01" | ||
| date_derniere_modification: | ||
| title: "Date de dernière modification du numéro de TVA" | ||
| type: "string" | ||
| format: "date" | ||
| example: "2024-02-13" |
| @@ -0,0 +1,28 @@ | |||
| class APIEntreprise::V3AndMore::DGFIP::TVAController < APIEntreprise::V3AndMore::BaseController | |||
| include APIEntreprise::CommonDGFIPOrganizerParams | |||
| @@ -0,0 +1,6 @@ | |||
| class APIEntreprise::DGFIP::NumeroTVASerializer::V3 < APIEntreprise::V3AndMore::BaseSerializer | |||
| attributes :numero_tva_intracommunautaire, | |||
There was a problem hiding this comment.
où est le meta de la dernière mise à jour des données ?
| end | ||
|
|
||
| def request_uri | ||
| URI("#{base_url}/api/resources/#{resource_id}/data/") |
There was a problem hiding this comment.
on tape sur quoi ici ? ce n'est pas clair.
|
@skelz0r Concernant la limite j'ai pas posté mon analyse, je vais la mettre sur linear ptetre, extract:
|
Du coup ? |
|
Du coup on est large à priori. Je pourrais faire un test pour voir quelle est la limite mais ça serait un peu malvenu de taper le FD comme un bourrin non? (et possiblement me faire bannir) |
Je ne vois pas comment tu peux en déduire qu'on est large avec 50 requêtes 😅 En bref, 99% de la complexité ici est dans ce travail --^ là j'ai aucun élément pour pouvoir valider ta PR car je n'ai aucune idée de si ça va tenir la charge. |
|
@skelz0r Okay j'ai fait un point avec Geoffrey qui a éclaircit certain trucs parce que effectivement j'ai un peu fait cette PR à l'aveugle (sorry j'étais crevé ces dernières temps 😅) - surtout que le fichier et la page ne sont pas encore up L'API ne serait pas normalement tabularisée sur data.gouv car le fichier dépasse 280 mo mais on va faire une exception car on pense avec Geoffrey que c'est mieux de taper sur data.gouv Concernant les limites il me confirme qu'on est très largement OK dans notre ordre de grandeur de volume |
|
Ok intéressant, donc c'est sûr que ça passera par data.gouv ? Ça sera avec un compte (donc API key ?) ? |
|
Pas de système de power-user authentifié sur data.gouv Y'a des avantages clairs a passer par data.gouv, après y'a un seul problème c'est que les données seront J+1, mais je pense que pour la TVA c'est OK Ça peut se discuter |
D'où le fait de renvoyer la dernière date de mise à jour (et c'était un pré-requis que le fichier soit transféré chaque jour de la veille). Une idée du rate limiting ? Faudrait quand même qu'on sache, ça me semble assez étrange, ils vont faire du filtrage IP ? |
fix https://linear.app/pole-api/issue/API-6752/spec-v1-endpoint-siren-numeros-de-tva-dgfip-ttc