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
-
.adresse_electronique(identifiant, scheme_id: '0009') ⇒ Object
Crée une adresse électronique.
-
.adresse_postale(ligne1, code_postal, ville, pays: 'FR', ligne2: nil, ligne3: nil) ⇒ Object
Crée une adresse postale pour l’API FactPulse.
-
.beneficiaire(nom, **options) ⇒ Hash
Crée un bénéficiaire (factor) pour l’affacturage.
-
.calculer_tva_intra(siren) ⇒ Object
Calcule le numéro TVA intracommunautaire français depuis un SIREN.
-
.destinataire(nom, siret, adresse_ligne1, code_postal, ville, **options) ⇒ Object
Crée un destinataire (client) avec auto-calcul SIREN et adresses.
-
.fournisseur(nom, siret, adresse_ligne1, code_postal, ville, **options) ⇒ Object
Crée un fournisseur (émetteur) avec auto-calcul SIREN, TVA intracommunautaire et adresses.
-
.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).
-
.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).
- .montant(value) ⇒ Object
- .montant_total(ht, tva, ttc, a_payer, remise_ttc: nil, motif_remise: nil, acompte: nil) ⇒ Object
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
151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/factpulse/helpers/client.rb', line 151 def self.beneficiaire(nom, **) # Auto-calcul SIREN depuis SIRET siret = [:siret] siren = [:siren] || (siret && siret.length == 14 ? siret[0, 9] : nil) result = { 'nom' => nom } result['siret'] = siret if siret result['siren'] = siren if siren result['iban'] = [:iban] if [:iban] result['bic'] = [:bic] if [: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, **) siren = [: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: [:pays] || 'FR', ligne2: [:adresse_ligne2]) } result['siren'] = siren if siren result['codeServiceExecutant'] = [:code_service_executant] if [: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, **) siren = [:siren] || (siret.length == 14 ? siret[0, 9] : nil) numero_tva_intra = [:numero_tva_intra] || (siren ? calculer_tva_intra(siren) : nil) result = { 'nom' => nom, 'idFournisseur' => [:id_fournisseur] || 0, 'siret' => siret, 'adresseElectronique' => adresse_electronique(siret, scheme_id: '0225'), 'adressePostale' => adresse_postale(adresse_ligne1, code_postal, ville, pays: [:pays] || 'FR', ligne2: [:adresse_ligne2]) } result['siren'] = siren if siren result['numeroTvaIntra'] = numero_tva_intra if numero_tva_intra result['iban'] = [:iban] if [:iban] result['idServiceFournisseur'] = [:code_service] if [:code_service] result['codeCoordonneeBancairesFournisseur'] = [:code_coordonnees_bancaires] if [: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', **) 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'] = [:reference] if [:reference] result['montantRemiseHt'] = montant([:montant_remise_ht]) if [:montant_remise_ht] result['codeRaisonReduction'] = [:code_raison_reduction] if [:code_raison_reduction] result['raisonReduction'] = [:raison_reduction] if [:raison_reduction] result['dateDebutPeriode'] = [:date_debut_periode] if [:date_debut_periode] result['dateFinPeriode'] = [:date_fin_periode] if [: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 |