feat(api particulier): add DGFiP adapter
This commit is contained in:
parent
abad34ea7c
commit
f0913edebd
7 changed files with 419 additions and 0 deletions
|
@ -3,6 +3,7 @@ class APIParticulier::API
|
|||
|
||||
INTROSPECT_RESOURCE_NAME = "introspect"
|
||||
COMPOSITION_FAMILIALE_RESOURCE_NAME = "v2/composition-familiale"
|
||||
AVIS_IMPOSITION_RESOURCE_NAME = "v2/avis-imposition"
|
||||
|
||||
TIMEOUT = 20
|
||||
|
||||
|
@ -20,6 +21,14 @@ class APIParticulier::API
|
|||
codePostal: code_postal)
|
||||
end
|
||||
|
||||
def avis_imposition(numero_fiscal, reference_avis)
|
||||
# NOTE: Il est possible que l'utilisateur ajoute une quatorzième lettre à la fin de sa référence d'avis.
|
||||
# Il s'agit d'une clé de vérification qu'il est nécessaire de'enlever avant de contacter API Particulier.
|
||||
get(AVIS_IMPOSITION_RESOURCE_NAME,
|
||||
numeroFiscal: numero_fiscal.to_i.to_s.rjust(13, "0"),
|
||||
referenceAvis: reference_avis.to_i.to_s.rjust(13, "0"))
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def get(resource_name, params = {})
|
||||
|
|
49
app/lib/api_particulier/dgfip_adapter.rb
Normal file
49
app/lib/api_particulier/dgfip_adapter.rb
Normal file
|
@ -0,0 +1,49 @@
|
|||
class APIParticulier::DgfipAdapter
|
||||
class InvalidSchemaError < ::StandardError
|
||||
def initialize(errors)
|
||||
super(errors.map(&:to_json).join("\n"))
|
||||
end
|
||||
end
|
||||
|
||||
def initialize(api_particulier_token, numero_fiscal, reference_avis, requested_sources)
|
||||
@api = APIParticulier::API.new(api_particulier_token)
|
||||
@numero_fiscal = numero_fiscal
|
||||
@reference_avis = reference_avis
|
||||
@requested_sources = requested_sources
|
||||
end
|
||||
|
||||
def to_params
|
||||
@api.avis_imposition(@numero_fiscal, @reference_avis)
|
||||
.tap { |d| ensure_valid_schema!(d) }
|
||||
.then { |d| extract_requested_sources(d) }
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def ensure_valid_schema!(data)
|
||||
if !schemer.valid?(data)
|
||||
errors = schemer.validate(data).to_a
|
||||
raise InvalidSchemaError.new(errors)
|
||||
end
|
||||
end
|
||||
|
||||
def schemer
|
||||
@schemer ||= JSONSchemer.schema(Rails.root.join('app/schemas/avis-imposition.json'))
|
||||
end
|
||||
|
||||
def extract_requested_sources(data)
|
||||
@requested_sources['dgfip']&.map do |(scope, sources)|
|
||||
case scope
|
||||
when 'foyer_fiscal'
|
||||
{ scope => data['foyerFiscal'].slice(*sources).merge(data.slice(*sources)) }
|
||||
when 'declarant1', 'declarant2'
|
||||
sources.map { |source| { scope => data[scope].slice(*source) } }
|
||||
when 'agregats_fiscaux', 'echeance_avis', 'complements'
|
||||
sources.map { |source| { scope => data.slice(*source) } }
|
||||
else
|
||||
{ scope => data.slice(*sources) }
|
||||
end
|
||||
end
|
||||
&.flatten&.reduce(&:deep_merge) || {}
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue