From 11c65e8000282b9a761346f1fbff16e09581fc17 Mon Sep 17 00:00:00 2001
From: Criptomart <ofi@criptomart.net>
Date: Tue, 11 Aug 2026 13:21:28 +0200
Subject: [PATCH] [FIX] pos_payment_method_cashdro: leftovers of the 17.0 API

The 18.0 migration kept three uses of APIs that no longer exist, and the
module has neither tests nor tours (it needs a physical drawer), so the CI
can't catch them.

* `_cashdro_url()` reads `order.selected_paymentline`, replaced by
  `order.get_selected_paymentline()` in 18.0. Reading `.payment_method` on
  the resulting `undefined` throws a TypeError on every payment, which
  `cashdro_send_payment_request()` swallows into a generic "An error occurred
  while connecting to the cashdro" dialog.

* The `add_paymentline()` patch checks `line.payment_method`, renamed to
  `line.payment_method_id` in 18.0, so the payment line is never zeroed and
  keeps the default due amount instead of the amount the customer inserts.

* `_loader_params_pos_payment_method()` is the 17.0 loading API, replaced in
  18.0 by `_load_pos_data_fields()` on each model. The override is dead code
  and the CashDro credentials never reach the front end, so `_cashdro_url()`
  has no host to build the url with.
---
 pos_payment_method_cashdro/__manifest__.py         |  2 +-
 pos_payment_method_cashdro/models/__init__.py      |  1 -
 .../models/pos_payment_method.py                   | 11 ++++++++++-
 pos_payment_method_cashdro/models/pos_session.py   | 14 --------------
 .../static/src/js/models.esm.js                    |  4 ++--
 .../static/src/js/payment_cashdro.esm.js           |  3 ++-
 6 files changed, 15 insertions(+), 20 deletions(-)
 delete mode 100644 pos_payment_method_cashdro/models/pos_session.py

diff --git a/pos_payment_method_cashdro/__manifest__.py b/pos_payment_method_cashdro/__manifest__.py
index 708aac5..c19a642 100644
--- a/pos_payment_method_cashdro/__manifest__.py
+++ b/pos_payment_method_cashdro/__manifest__.py
@@ -3,7 +3,7 @@
 {
     "name": "PoS Payment Method CashDro",
     "summary": "Allows to pay with CashDro Terminals on the Point of Sale",
-    "version": "18.0.1.0.2",
+    "version": "18.0.1.0.3",
     "category": "Point Of Sale",
     "website": "https://github.com/OCA/pos",
     "author": "Tecnativa, Odoo Community Association (OCA)",
diff --git a/pos_payment_method_cashdro/models/__init__.py b/pos_payment_method_cashdro/models/__init__.py
index 604d90c..58690ef 100644
--- a/pos_payment_method_cashdro/models/__init__.py
+++ b/pos_payment_method_cashdro/models/__init__.py
@@ -1,2 +1 @@
 from . import pos_payment_method
-from . import pos_session
diff --git a/pos_payment_method_cashdro/models/pos_payment_method.py b/pos_payment_method_cashdro/models/pos_payment_method.py
index 285984a..08a64a1 100644
--- a/pos_payment_method_cashdro/models/pos_payment_method.py
+++ b/pos_payment_method_cashdro/models/pos_payment_method.py
@@ -1,6 +1,6 @@
 # Copyright 2021 Tecnativa - David Vidal
 # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-from odoo import fields, models
+from odoo import api, fields, models
 
 
 class PosPaymentMethod(models.Model):
@@ -16,6 +16,15 @@ class PosPaymentMethod(models.Model):
     cashdro_user = fields.Char()
     cashdro_password = fields.Char()
 
+    @api.model
+    def _load_pos_data_fields(self, config_id):
+        """The front end needs the credentials to build the CashDro url"""
+        return super()._load_pos_data_fields(config_id) + [
+            "cashdro_host",
+            "cashdro_user",
+            "cashdro_password",
+        ]
+
     def _onchange_journal_id(self):
         """Cash payment method force the `use_payment_terminal` to `False` as
         it's assumed that a cash journal can't have a payment terminal. Let's keep
diff --git a/pos_payment_method_cashdro/models/pos_session.py b/pos_payment_method_cashdro/models/pos_session.py
deleted file mode 100644
index 6123090..0000000
--- a/pos_payment_method_cashdro/models/pos_session.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright 2024 Tecnativa - David Vidal
-# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-from odoo import models
-
-
-class PosSession(models.Model):
-    _inherit = "pos.session"
-
-    def _loader_params_pos_payment_method(self):
-        result = super()._loader_params_pos_payment_method()
-        result["search_params"]["fields"].extend(
-            ["cashdro_host", "cashdro_user", "cashdro_password"]
-        )
-        return result
diff --git a/pos_payment_method_cashdro/static/src/js/models.esm.js b/pos_payment_method_cashdro/static/src/js/models.esm.js
index d228f08..d1ee2f7 100644
--- a/pos_payment_method_cashdro/static/src/js/models.esm.js
+++ b/pos_payment_method_cashdro/static/src/js/models.esm.js
@@ -22,8 +22,8 @@ patch(PosOrder.prototype, {
             return line;
         }
         if (
-            line.payment_method &&
-            line.payment_method.use_payment_terminal === "cashdro" &&
+            line.payment_method_id &&
+            line.payment_method_id.use_payment_terminal === "cashdro" &&
             line.amount > 0 // For refund transactions we need to keep the amount
         ) {
             line.set_amount(0);
diff --git a/pos_payment_method_cashdro/static/src/js/payment_cashdro.esm.js b/pos_payment_method_cashdro/static/src/js/payment_cashdro.esm.js
index 0c0bdf2..2c618bf 100644
--- a/pos_payment_method_cashdro/static/src/js/payment_cashdro.esm.js
+++ b/pos_payment_method_cashdro/static/src/js/payment_cashdro.esm.js
@@ -107,7 +107,8 @@ export class PaymentCashdro extends PaymentInterface {
     _cashdro_url() {
         // Cashdro machines don't support safe POST calls, so we're sending
         // all the data quite unsafely constantly...
-        const method = this.pos.get_order().selected_paymentline.payment_method;
+        const order = this.pos.get_order();
+        const method = order.get_selected_paymentline()?.payment_method_id;
         const host = method && method.cashdro_host;
         if (!host) {
             return false;
-- 
2.43.0

