Salta al contingut principal
GoCardless API · invalid_state · reemborsaments

GoCardless total_amount_confirmation_invalid: el total reemborsat no quadra

Cada reemborsament que es demana a GoCardless du una xifra de control: tot el reemborsat d'aquest pagament, comptant el nou. Si no coincideix amb el que GoCardless té apuntat, rebutja el reemborsament amb total_amount_confirmation_invalid. És una salvaguarda contra dos sistemes que reemborsen el mateix cobrament sense saber l'un de l'altre.

FlexigoTech · Responsable: Víctor Gómez · Actualitzat el 6 de novembre de 2026

L'essencial

Versions
Odoo 17, 18, 19 i 20
Comprovat
al codi del connector, versió 17.0, 18.0, 19.0 i 20.0 · a les fonts enllaçades al final
Lectura
3 min

Què diu GoCardless

ReasonTipusText de GoCardless
total_amount_confirmation_invalidinvalid_stateTotal amount refunded does not match the confirmation value.
number_of_refunds_exceededinvalid_stateMaximum of 5 refunds per payment already reached.

La referència dels reemborsaments explica el primer: «total_amount_confirmation_invalid if the confirmation amount doesn't match the total amount refunded for the payment.». I per a què serveix: «This safeguard is there to prevent two processes from creating refunds without awareness of each other.».

Aquest camp, diu GoCardless, és la suma dels reemborsaments que ja té el pagament més el que es crea, en cèntims. En el seu exemple, un reemborsament de 100 du un total_amount_confirmation de 150: d'aquest pagament ja s'havien retornat 50.

Targeta de l'error total_amount_confirmation_invalid de GoCardless
El reason, el seu tipus invalid_state, el camp total_amount_confirmation i el límit de 5 reemborsaments per pagament.

Com calcula el connector aquesta xifra

Per a cada reemborsament, el connector suma els reemborsaments d'aquest cobrament que a Odoo estan pendents, autoritzats o fets, i hi afegeix el nou. Els que estan en error no compten. Aquesta suma va com a total_amount_confirmation.

Que compti també els pendents importa: un reemborsament en camí ja està demanat a GoCardless, i si no el sumés, la xifra es quedaria curta i GoCardless rebutjaria el següent.

Quan no quadra

La xifra surt del que Odoo sap. Si algú ha retornat diners d'aquest cobrament per un camí que no passa per Odoo, per exemple amb un altre programa connectat al mateix compte de GoCardless, GoCardless ho té apuntat i Odoo no. El total que envia el connector es queda curt, i GoCardless rebutja el reemborsament. És exactament el cas per al qual existeix aquesta salvaguarda: si l'acceptés, el client rebria dues vegades els mateixos diners.

number_of_refunds_exceeded és una altra cosa: el connector permet reemborsaments parcials, i GoCardless admet com a molt 5 per pagament. El sisè es rebutja encara que quedi import per retornar.

Què fa Odoo amb el connector

A Odoo, un cobrament es reemborsa des del seu pagament, amb el botó de reemborsament, i només si la seva transacció està confirmada. El connector envia el reemborsament amb la seva clau d'idempotència i, si GoCardless el rebutja, la transacció del reemborsament passa a «Error» amb «GoCardless rejected the request.» i, a sota, el missatge de GoCardless amb el reason i el request_id entre claudàtors.

Des de la versió 1.1.5, un reemborsament en error no mostra el botó «Retry collection»: un reemborsament no és un cobrament.

Esquema: què respon GoCardless quan el total no quadra i què fa Odoo amb el connector
Esquema fet a partir del codi del connector (17.0, 18.0, 19.0 i 20.0) i de la documentació de GoCardless.

Què fer

  1. Obre la transacció del cobrament des de la factura, amb el botó «Transacció de pagament» de dalt; el menú de transaccions només surt en mode desenvolupador, i a Odoo 20 no existeix. Des d'allà, el botó de reemborsaments porta a la transacció del reemborsament i al seu missatge.
  2. Amb total_amount_confirmation_invalid, mira al Dashboard de GoCardless els reemborsaments d'aquest pagament. Si n'hi ha algun fet fora d'Odoo, els diners ja han tornat al client: no els retornis una altra vegada des d'Odoo.
  3. Amb number_of_refunds_exceeded, aquest pagament ja no admet més reemborsaments a GoCardless. Si encara has de retornar alguna cosa, haurà de ser per una altra via.
  4. Per no arribar al límit, ajunta en un sol reemborsament el que s'hagi de retornar d'un mateix cobrament.
  5. Si necessites GoCardless, guarda el request_id del missatge: la seva documentació demana incloure'l en contactar amb el seu suport.

Per què Odoo no veu els reemborsaments fets per un altre camí?

GoCardless avisa per webhook de cada reemborsament creat, però el connector només aplica aquests avisos als reemborsaments que té a Odoo: un creat per un altre camí no té transacció, i no entra a la xifra.

Puc retornar només una part d'un cobrament?

Sí. El connector permet reemborsaments parcials, fins al límit de 5 per pagament que posa GoCardless; cadascun porta a la seva xifra de control els anteriors.

Amb el nostre connector

A Odoo 17, 18, 19 i 20 el connector envia en cada reemborsament el total del reemborsat d'aquest cobrament, comptant els que són en camí, perquè GoCardless aturi un reemborsament doble en lloc de pagar-lo, i deixa el rebuig a la transacció amb el seu request_id.

Continua llegint

GoCardless refund_payment_invalid_state: aquest cobrament encara no es pot reemborsarGoCardless respon refund_payment_invalid_state si el pagament no és confirmed ni paid_out. Les regles de termini de GoCardless i del connector a Odoo.GoCardless 409 idempotent_creation_conflict: el cobrament ja existiaGoCardless retorna 409 idempotent_creation_conflict si una clau d'idempotència ja ha creat res. Per què no és un error i com evita el connector cobrar dos cops.GoCardless MD06: el client demana al seu banc que li retorni un cobramentEl client demana al seu banc que li retorni un adeudament de GoCardless: charged_back, refund_requested i MD06. Què passa a Odoo amb la factura i el mandat.
Comprovat al codi del connector (versió 17.0, 18.0, 19.0 i 20.0) i a les fonts enllaçades

Fonts

  • docs.gocardless.com/docs/api-reference/responses-and-errors
  • docs.gocardless.com/docs/api-reference/refund
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 550 a 17.0 (d203ee6), línia 550 a 18.0 (e2ab18b), línia 549 a 19.0 (ce7f5a3) i línia 568 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 389 a 17.0 (d203ee6), línia 389 a 18.0 (e2ab18b), línia 388 a 19.0 (ce7f5a3) i línia 403 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 383 a 17.0 (d203ee6), línia 383 a 18.0 (e2ab18b), línia 382 a 19.0 (ce7f5a3) i línia 397 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_provider.py, línia 256 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 397 a 17.0 (d203ee6), línia 397 a 18.0 (e2ab18b), línia 396 a 19.0 (ce7f5a3) i línia 411 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_provider.py, línia 352 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_provider.py, línia 397 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_provider.py, línia 462 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 521 a 17.0 (d203ee6), línia 521 a 18.0 (e2ab18b), línia 521 a 19.0 (ce7f5a3) i línia 523 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 424 a 17.0 (d203ee6), línia 424 a 18.0 (e2ab18b), línia 423 a 19.0 (ce7f5a3) i línia 438 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 418 a 17.0 (d203ee6), línia 418 a 18.0 (e2ab18b), línia 417 a 19.0 (ce7f5a3) i línia 432 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 63 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • github.com/odoo/odoo/blob/20.0/addons/payment/models/payment_transaction.py
  • github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_payment_views.xml
  • github.com/odoo/odoo/blob/20.0/addons/payment/i18n/ca.po
  • github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
  • Codi del mòdul: flexigo_payment_gocardless: __manifest__.py, línia 31 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • github.com/odoo/odoo/blob/17.0/odoo/http.py