Module: FactPulse::Helpers::MontantHelpers

Defined in:
lib/factpulse/helpers/client.rb

Overview

Helpers pour créer des montants totaux simplifiés.

Class Method Summary collapse

Class Method Details

.adresse_electronique(identifiant, scheme_id: '0009') ⇒ Object

Crée une adresse électronique. scheme_id: “0009”=SIREN, “0225”=SIRET



90
91
92
# File 'lib/factpulse/helpers/client.rb', line 90

def self.adresse_electronique(identifiant, scheme_id: '0009')
  { 'identifiant' => identifiant, 'schemeId' => scheme_id }
end

.adresse_postale(ligne1, code_postal, ville, pays: 'FR', ligne2: nil, ligne3: nil) ⇒ Object

Crée une adresse postale pour l’API FactPulse.



82
83
84
85
86
87
# File 'lib/factpulse/helpers/client.rb', line 82

def self.adresse_postale(ligne1, code_postal, ville, pays: 'FR', ligne2: nil, ligne3: nil)
  result = { 'ligneUn' => ligne1, 'codePostal' => code_postal, 'nomVille' => ville, 'paysCodeIso' => pays }
  result['ligneDeux'] = ligne2 if ligne2
  result['ligneTrois'] = ligne3 if ligne3
  result
end

.beneficiaire(nom, **options) ⇒ Hash

Crée un bénéficiaire (factor) pour l’affacturage.

Le bénéficiaire (BG-10 / PayeeTradeParty) est utilisé lorsque le paiement doit être effectué à un tiers différent du fournisseur, typiquement un factor (société d’affacturage).

Pour les factures affacturées, il faut aussi:

  • Utiliser un type de document affacturé (393, 396, 501, 502, 472, 473)

  • Ajouter une note ACC avec la mention de subrogation

  • L’IBAN du bénéficiaire sera utilisé pour le paiement

Examples:

factor = beneficiaire('FACTOR SAS',
  siret: '30000000700033',
  iban: 'FR76 3000 4000 0500 0012 3456 789'
)

Parameters:

  • nom (String)

    Raison sociale du factor (BT-59)

  • options (Hash)

    Options: :siret (BT-60), :siren (BT-61), :iban, :bic

Returns:

  • (Hash)

    Dict prêt à être utilisé dans une facture affacturée



151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/factpulse/helpers/client.rb', line 151

def self.beneficiaire(nom, **options)
  # Auto-calcul SIREN depuis SIRET
  siret = options[:siret]
  siren = options[:siren] || (siret && siret.length == 14 ? siret[0, 9] : nil)

  result = { 'nom' => nom }
  result['siret'] = siret if siret
  result['siren'] = siren if siren
  result['iban'] = options[:iban] if options[:iban]
  result['bic'] = options[:bic] if options[:bic]
  result
end

.calculer_tva_intra(siren) ⇒ Object

Calcule le numéro TVA intracommunautaire français depuis un SIREN.



95
96
97
98
99
# File 'lib/factpulse/helpers/client.rb', line 95

def self.calculer_tva_intra(siren)
  return nil if siren.nil? || siren.length != 9 || !siren.match?(/^\d+$/)
  cle = (12 + 3 * (siren.to_i % 97)) % 97
  format('FR%02d%s', cle, siren)
end

.destinataire(nom, siret, adresse_ligne1, code_postal, ville, **options) ⇒ Object

Crée un destinataire (client) avec auto-calcul SIREN et adresses.



119
120
121
122
123
124
125
126
127
128
129
# File 'lib/factpulse/helpers/client.rb', line 119

def self.destinataire(nom, siret, adresse_ligne1, code_postal, ville, **options)
  siren = options[:siren] || (siret.length == 14 ? siret[0, 9] : nil)
  result = {
    'nom' => nom, 'siret' => siret,
    'adresseElectronique' => adresse_electronique(siret, scheme_id: '0225'),
    'adressePostale' => adresse_postale(adresse_ligne1, code_postal, ville, pays: options[:pays] || 'FR', ligne2: options[:adresse_ligne2])
  }
  result['siren'] = siren if siren
  result['codeServiceExecutant'] = options[:code_service_executant] if options[:code_service_executant]
  result
end

.fournisseur(nom, siret, adresse_ligne1, code_postal, ville, **options) ⇒ Object

Crée un fournisseur (émetteur) avec auto-calcul SIREN, TVA intracommunautaire et adresses.



102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/factpulse/helpers/client.rb', line 102

def self.fournisseur(nom, siret, adresse_ligne1, code_postal, ville, **options)
  siren = options[:siren] || (siret.length == 14 ? siret[0, 9] : nil)
  numero_tva_intra = options[:numero_tva_intra] || (siren ? calculer_tva_intra(siren) : nil)
  result = {
    'nom' => nom, 'idFournisseur' => options[:id_fournisseur] || 0, 'siret' => siret,
    'adresseElectronique' => adresse_electronique(siret, scheme_id: '0225'),
    'adressePostale' => adresse_postale(adresse_ligne1, code_postal, ville, pays: options[:pays] || 'FR', ligne2: options[:adresse_ligne2])
  }
  result['siren'] = siren if siren
  result['numeroTvaIntra'] = numero_tva_intra if numero_tva_intra
  result['iban'] = options[:iban] if options[:iban]
  result['idServiceFournisseur'] = options[:code_service] if options[:code_service]
  result['codeCoordonneeBancairesFournisseur'] = options[:code_coordonnees_bancaires] if options[:code_coordonnees_bancaires]
  result
end

.ligne_de_poste(numero, denomination, quantite, montant_unitaire_ht, montant_total_ligne_ht, taux_tva: '20.00', categorie_tva: 'S', unite: 'FORFAIT', **options) ⇒ Object

Crée une ligne de poste (aligné sur LigneDePoste de models.py).



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/factpulse/helpers/client.rb', line 56

def self.ligne_de_poste(numero, denomination, quantite, montant_unitaire_ht, montant_total_ligne_ht,
                        taux_tva: '20.00', categorie_tva: 'S', unite: 'FORFAIT', **options)
  result = {
    'numero' => numero, 'denomination' => denomination,
    'quantite' => montant(quantite), 'montantUnitaireHt' => montant(montant_unitaire_ht),
    'montantTotalLigneHt' => montant(montant_total_ligne_ht), 'tauxTvaManuel' => montant(taux_tva),
    'categorieTva' => categorie_tva, 'unite' => unite
  }
  result['reference'] = options[:reference] if options[:reference]
  result['montantRemiseHt'] = montant(options[:montant_remise_ht]) if options[:montant_remise_ht]
  result['codeRaisonReduction'] = options[:code_raison_reduction] if options[:code_raison_reduction]
  result['raisonReduction'] = options[:raison_reduction] if options[:raison_reduction]
  result['dateDebutPeriode'] = options[:date_debut_periode] if options[:date_debut_periode]
  result['dateFinPeriode'] = options[:date_fin_periode] if options[:date_fin_periode]
  result
end

.ligne_de_tva(taux_manuel, montant_base_ht, montant_tva, categorie: 'S') ⇒ Object

Crée une ligne de TVA (aligné sur LigneDeTVA de models.py).



74
75
76
77
78
79
# File 'lib/factpulse/helpers/client.rb', line 74

def self.ligne_de_tva(taux_manuel, montant_base_ht, montant_tva, categorie: 'S')
  {
    'tauxManuel' => montant(taux_manuel), 'montantBaseHt' => montant(montant_base_ht),
    'montantTva' => montant(montant_tva), 'categorie' => categorie
  }
end

.montant(value) ⇒ Object



38
39
40
41
42
# File 'lib/factpulse/helpers/client.rb', line 38

def self.montant(value)
  return '0.00' if value.nil?
  return format('%.2f', value) if value.is_a?(Numeric)
  value.is_a?(String) ? value : '0.00'
end

.montant_total(ht, tva, ttc, a_payer, remise_ttc: nil, motif_remise: nil, acompte: nil) ⇒ Object



44
45
46
47
48
49
50
51
52
53
# File 'lib/factpulse/helpers/client.rb', line 44

def self.montant_total(ht, tva, ttc, a_payer, remise_ttc: nil, motif_remise: nil, acompte: nil)
  result = {
    'montantHtTotal' => montant(ht), 'montantTva' => montant(tva),
    'montantTtcTotal' => montant(ttc), 'montantAPayer' => montant(a_payer)
  }
  result['montantRemiseGlobaleTtc'] = montant(remise_ttc) if remise_ttc
  result['motifRemiseGlobaleTtc'] = motif_remise if motif_remise
  result['acompte'] = montant(acompte) if acompte
  result
end