pennylane-client 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 94653df77c6a2fc7f58347338d0591fe5af9fb27567d55a50fddb4249b4f5bd9
4
- data.tar.gz: e55bfa20edd8f782e88b95a4409e8a18ab13ee90eaeac9da94a7c3a275b4cb3b
3
+ metadata.gz: 20da1547f714650d441632ef8e0484ed02cbcbfb7d7c2c7c96f1b7aab0a9667d
4
+ data.tar.gz: 21e6c36c9b7f0fa4edf1d9a53bb595c55af9914a0afd4b8b6bcf07fb50aca979
5
5
  SHA512:
6
- metadata.gz: f385797cce13228dd684878e630b746fa2e5e2baf30bcc56ff88bdc63bb2c74c4e22fc5aa863abbd08c4a49cf5f8c4ee14ebcaf8309a89a5ec741c2b20bf9cc1
7
- data.tar.gz: 217e0c3ee07cf1f95afe8a8110bd81639eeb38a7a80aca2dfbd6ad01458c6218fef9954fd93f84be3c0509c170a0fcd5e40417e4fc96b565e61931359e5820f7
6
+ metadata.gz: dff99f4f2e536e4c938e510d0b95bc32cb2c516d6dc7ff0bc9779d7a26e5e7063a956ee7eb0227ce11e35a99b977b9cfc61623e9afd7252a4d7ce67e707e0f83
7
+ data.tar.gz: 78aef7a7c0ea2424ae9f90b0c1e9676a664bf7129236b1f9099355fdbe7d9b22d4c6d2c70a8d2d1a817256338f647bac89b58a7f181d2672a12e766f61ab54a0
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ### Ajouté
4
+ - `CustomerInvoices#mark_as_paid` marque une facture payée, sans date ni montant : Pennylane
5
+ importe un Factur-X acquitté comme non payé. Le marquage doit attendre que Pennylane ait lu le
6
+ fichier, sinon la fin de la lecture l'efface.
7
+
3
8
 
4
9
  ## 0.2.0
5
10
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pennylane-client (0.2.0)
4
+ pennylane-client (0.2.1)
5
5
  faraday (>= 0.9, < 3.0)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -103,8 +103,9 @@ end
103
103
 
104
104
  `import` accepte un chemin ou un IO ; un IO sans chemin demande `filename:`. `customer_id`,
105
105
  facultatif, rattache la facture à un client Pennylane ; Pennylane le reprend une fois le fichier lu.
106
- Sans lui, Pennylane décide seul du rattachement, d'après le Factur-X — un cas pas encore mesuré en
107
- sandbox.
106
+ Sans lui, Pennylane crée le client à partir de l'acheteur du Factur-X : nom, SIREN, numéro de TVA et
107
+ adresse, avec une référence externe qu'il génère. Mesuré en sandbox pour un acheteur inconnu ; pour
108
+ un acheteur déjà client, rien ne dit encore s'il est retrouvé ou créé une seconde fois.
108
109
 
109
110
  Pennylane refuse un fichier déjà déposé et donne l'identifiant de la facture existante : un dépôt
110
111
  interrompu avant sa réponse peut donc être rejoué sans risque. Mais il ne reconnaît le doublon qu'au
@@ -175,9 +176,9 @@ Deux cas méritent l'attention de l'application hôte :
175
176
  - **`consistent?` faux.** Le montant d'une transaction rapprochée est celui de la transaction
176
177
  entière : un virement qui règle plusieurs factures apparaît sur chacune pour son montant total. La
177
178
  somme des paiements dépasse alors le montant encaissé, qui reste juste.
178
- - **`marked_paid?` vrai.** « Marquer comme payée », dans Pennylane, déclare la facture payée sans
179
- enregistrer de paiement ni toucher au reste à payer. Aucune date ni aucun montant n'existe pour ce
180
- reliquat.
179
+ - **`marked_paid?` vrai.** « Marquer comme payée », dans Pennylane ou par `mark_as_paid`, déclare la
180
+ facture payée sans enregistrer de paiement ni toucher au reste à payer. Aucune date ni aucun
181
+ montant n'existe pour ce reliquat.
181
182
 
182
183
  `settlement` lit la facture si on lui passe un identifiant, puis ses transactions : un ou deux
183
184
  appels. Après `find_many`, passez-lui les factures déjà lues.
@@ -185,6 +186,26 @@ appels. Après `find_many`, passez-lui les factures déjà lues.
185
186
  `invoices.payments(id)` liste à part les paiements passés par les moyens de paiement de Pennylane
186
187
  (Qonto, Stripe, GoCardless, lien de paiement).
187
188
 
189
+ ## Marquer une facture payée
190
+
191
+ Pennylane importe un Factur-X comme non payé, même acquitté : il ignore le cadre de facturation
192
+ (BT-23 `B2`, `S2` ou `M2`), le montant déjà payé et le net à payer. Une facture réglée hors de
193
+ Pennylane, en ligne par carte par exemple, se marque payée après son dépôt :
194
+
195
+ ```ruby
196
+ invoice = invoices.find(invoice_id)
197
+ invoices.mark_as_paid(invoice) unless invoice.schematron_validation_status == "pending" || invoice.paid?
198
+ ```
199
+
200
+ Attendez que Pennylane ait fini de lire le fichier, ce que signale `schematron_validation_status`
201
+ en quittant `"pending"`. Mesuré en sandbox, un marquage fait plus tôt est accepté sans erreur, puis
202
+ effacé par la fin de la lecture : la facture repasse non payée. Le passage de suivi qui suit le
203
+ dépôt est le bon moment.
204
+
205
+ Le marquage n'enregistre ni date, ni montant, ni paiement : `paid?` devient vrai, le reste à payer
206
+ ne bouge pas, et `settlement.marked_paid?` devient vrai. `status` peut rester `"incomplete"`. Marquer
207
+ une facture déjà payée est sans effet.
208
+
188
209
  ## Rechercher
189
210
 
190
211
  ```ruby
@@ -23,6 +23,10 @@ module Pennylane
23
23
  connection.post(path, body).body
24
24
  end
25
25
 
26
+ def put(path, body = nil)
27
+ connection.put(path, body).body
28
+ end
29
+
26
30
  def post_multipart(path, multipart)
27
31
  response = connection.post(path) do |request|
28
32
  request.headers["Content-Type"] = multipart.content_type
@@ -84,6 +84,13 @@ module Pennylane
84
84
  Entities::Settlement.new(invoice, matched_transactions(invoice.id))
85
85
  end
86
86
 
87
+ # Pennylane n'enregistre ni date, ni montant, ni paiement : le reste à payer est inchangé, et
88
+ # `settlement(...).marked_paid?` devient vrai.
89
+ def mark_as_paid(invoice_id)
90
+ put("customer_invoices/#{normalize_id(invoice_id)}/mark_as_paid")
91
+ nil
92
+ end
93
+
87
94
  # Journal des créations, modifications et suppressions, du plus ancien au plus récent.
88
95
  # L'API ne le conserve que quatre semaines : un `since` plus ancien est refusé en 422.
89
96
  def changes(since: nil, limit: MAX_CHANGES_LIMIT)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pennylane
4
- VERSION = "0.2.0"
4
+ VERSION = "0.2.1"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pennylane-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hôtentic
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-10-22 00:00:00.000000000 Z
11
+ date: 2026-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday