diff --git a/account_ebics_payment_return/models/account_payment_return.py b/account_ebics_payment_return/models/account_payment_return.py index 392c9863..8d6a3481 100644 --- a/account_ebics_payment_return/models/account_payment_return.py +++ b/account_ebics_payment_return/models/account_payment_return.py @@ -71,7 +71,8 @@ def _process_pain002(self): except Exception as e: _logger.info( - "[FAIL] import file '%s' to bank Statements", self.name, exc_info=True + "[FAIL] import file '%s' to bank Statements", + self.name, exc_info=True ) self.env.cr.rollback() self.invalidate_cache() @@ -95,14 +96,15 @@ def _on_error_parse_xml_and_cancel(self, err_message): ).text _logger.info("PAIN002 po_name: %s", po_name) po_state = root.find( - "./ns:CstmrPmtStsRpt/ns:OrgnlGrpInfAndSts/ns:GrpSts", namespaces={"ns": ns} + "./ns:CstmrPmtStsRpt/ns:OrgnlGrpInfAndSts/ns:GrpSts", + namespaces={"ns": ns} ).text _logger.info("PAIN002 po_state: %s", po_state) payment_order = self.env["account.payment.order"].search( [("name", "=", po_name)] ) _logger.info("PAIN002 payment_order: %s", payment_order) - if payment_order.state == "generated": + if payment_order.state in ("generated", "uploaded"): if po_state == "RJCT": _logger.info( "RJCT payment order %s with the folowing err: %s", @@ -121,13 +123,14 @@ def _on_error_parse_xml_and_cancel(self, err_message): for t in tx: if t.find("./ns:TxSts", namespaces={"ns": ns}).text == "RJCT": # search for payment line - payment_line_ids = payment_order.bank_line_ids.filtered( - lambda r, transaction=t: r.name - == transaction.find( - "./ns:OrgnlEndToEndId", namespaces={"ns": ns} - ).text - )[0].payment_line_ids - _logger.info("PAIN002 payment_line_ids: %s", payment_line_ids) + endtoend_id=t.find("./ns:OrgnlEndToEndId", + namespaces={"ns": ns}).text + payment_ids = payment_order.payment_ids.filtered( + lambda l: int(endtoend_id) in l.move_id.mapped("id")) + payment_line_ids = payment_order.payment_line_ids.filtered( + lambda l: payment_ids in l.payment_ids) + _logger.info(f"PAIN002 payments found: {payment_ids.name} " + f"with endtoend_id: {endtoend_id}", ) # free line with message rsn = t.findall( @@ -136,9 +139,19 @@ def _on_error_parse_xml_and_cancel(self, err_message): rsn_text = [] for r in rsn: rsn_text.append(r.text) - payment_line_ids.free_line(" ".join(rsn_text)) + rsn_txt = " ".join(rsn_text) + _logger.info(f"PAIN002 line free: {rsn_txt} " + f"for lines {payment_line_ids}") + for b in payment_line_ids: + try: + b.free_line(rsn_txt) + _logger.info(f"PAIN002 line free: {rsn_txt}") + except Exception as e: + _logger.error(f"Error freeing line {b.id}: {e}") - payment_order.generated2uploaded() + + if payment_order.state == "generated": + payment_order.generated2uploaded() self.write({"state": "done", "note_process": err_message}) def _unlink_pain002(self):