[FIX] * errors in transaction confirmation , sms, portal actions

This commit is contained in:
Abdurrahman Saber 2025-08-07 06:47:54 +03:00
parent 51ca859a9a
commit 16e133f1f6
5 changed files with 84 additions and 38 deletions

View File

@ -206,6 +206,7 @@ class DonationRecurring(models.Model):
# return picking # return picking
def action_activate(self): def action_activate(self):
bot = self.env.ref('base.partner_root').id
for rec in self: for rec in self:
rec.name = self.env['ir.sequence'].next_by_code('donation.recurring') or _('New') rec.name = self.env['ir.sequence'].next_by_code('donation.recurring') or _('New')
for line in rec.recurring_line_ids: for line in rec.recurring_line_ids:
@ -219,10 +220,12 @@ class DonationRecurring(models.Model):
rec._message_sms_with_template( rec._message_sms_with_template(
template=template, template=template,
partner_ids=rec.partner_id.ids, partner_ids=rec.partner_id.ids,
put_in_queue=True put_in_queue=True,
author_id=bot
) )
def action_pause(self): def action_pause(self):
bot = self.env.ref('base.partner_root').id
for record in self: for record in self:
record.state = 'paused' record.state = 'paused'
template = self.env.company.donation_recurring_paused_sms_template_id template = self.env.company.donation_recurring_paused_sms_template_id
@ -232,10 +235,12 @@ class DonationRecurring(models.Model):
record._message_sms_with_template( record._message_sms_with_template(
template=template, template=template,
partner_ids=record.partner_id.ids, partner_ids=record.partner_id.ids,
put_in_queue=True put_in_queue=True,
author_id=bot
) )
def action_resume(self): def action_resume(self):
bot = self.env.ref('base.partner_root').id
today = fields.Date.context_today(self) today = fields.Date.context_today(self)
for record in self: for record in self:
if record.state != 'active': if record.state != 'active':
@ -262,13 +267,27 @@ class DonationRecurring(models.Model):
record._message_sms_with_template( record._message_sms_with_template(
template=template, template=template,
partner_ids=record.partner_id.ids, partner_ids=record.partner_id.ids,
put_in_queue=True put_in_queue=True,
author_id=bot
) )
def action_cancel(self): def action_cancel(self):
template = self.env.company.donation_recurring_cancelled_sms_template_id
bot = self.env.ref('base.partner_root').id
if not template:
raise ValidationError(
_("⚠️ SMS template for 'Cancel Recurring Donation' is not configured in Company settings.")
)
for record in self: for record in self:
record.state = 'cancel' record.state = 'cancel'
record.date_end = fields.Date.context_today(self) record.date_end = fields.Date.context_today(self)
record._message_sms_with_template(
template=template,
partner_ids=record.partner_id.ids,
put_in_queue=True,
author_id=bot
)
def action_reset_to_active(self): def action_reset_to_active(self):
for record in self: for record in self:
@ -323,6 +342,7 @@ class DonationRecurring(models.Model):
rec.recurring_next_date += relativedelta(months=interval) rec.recurring_next_date += relativedelta(months=interval)
def unlink(self): def unlink(self):
bot = self.env.ref('base.partner_root').id
for rec in self: for rec in self:
if rec.state == 'active': if rec.state == 'active':
raise UserError( raise UserError(
@ -335,7 +355,8 @@ class DonationRecurring(models.Model):
rec._message_sms_with_template( rec._message_sms_with_template(
template=template, template=template,
partner_ids=rec.partner_id.ids, partner_ids=rec.partner_id.ids,
put_in_queue=True put_in_queue=True,
author_id=bot
) )
return super(DonationRecurring, self).unlink() return super(DonationRecurring, self).unlink()

View File

@ -101,6 +101,7 @@ class SaleOrder(models.Model):
def action_confirm(self): def action_confirm(self):
res = super().action_confirm() res = super().action_confirm()
bot = self.env.ref('base.partner_root').id
if res: if res:
sms_template_id = self.env.ref('ensan_sale_management.sms_template_data_donation') sms_template_id = self.env.ref('ensan_sale_management.sms_template_data_donation')
donar_sms_template_id = self.env.ref('ensan_sale_management.sms_template_donors_data_donation') donar_sms_template_id = self.env.ref('ensan_sale_management.sms_template_donors_data_donation')
@ -110,13 +111,15 @@ class SaleOrder(models.Model):
rec._message_sms_with_template( rec._message_sms_with_template(
template=sms_template_id, template=sms_template_id,
put_in_queue=False, put_in_queue=False,
sms_numbers=[rec.order_mobile_number] partner_ids=rec.partner_id.ids,
author_id=bot
) )
for donator in rec.donators_ids: for donator in rec.donators_ids:
donator._message_sms_with_template( donator._message_sms_with_template(
template=donar_sms_template_id, template=donar_sms_template_id,
put_in_queue=False, put_in_queue=False,
sms_numbers=[donator.donator_mobile_number] sms_numbers=[donator.donator_mobile_number],
author_id=bot
) )
return res return res
@ -170,13 +173,15 @@ class SaleOrder(models.Model):
@api.model @api.model
def _cron_send_recovery_sms(self): def _cron_send_recovery_sms(self):
bot = self.env.ref('base.partner_root').id
records = self.search([('is_abandoned_cart', '=', True), ('cart_recovery_sms_sent', '=', False)]) records = self.search([('is_abandoned_cart', '=', True), ('cart_recovery_sms_sent', '=', False)])
for rec in records: for rec in records:
sms_template_id = rec.website_id.cart_recovery_sms_template_id sms_template_id = rec.website_id.cart_recovery_sms_template_id
rec._message_sms_with_template( rec._message_sms_with_template(
template=sms_template_id, template=sms_template_id,
put_in_queue=True, put_in_queue=True,
partner_ids=rec.partner_id.ids partner_ids=rec.partner_id.ids,
author_id=bot
) )
records.write({'cart_recovery_sms_sent': True}) records.write({'cart_recovery_sms_sent': True})

View File

@ -58,7 +58,7 @@ class ApplepayController(http.Controller):
phone = '+' + '966' + phone phone = '+' + '966' + phone
return phone.replace('+', '') return phone.replace('+', '')
@http.route('/payment/applepay/return', type='http', auth='public', csrf=False) @http.route('/payment/applepay/return', type='http', auth='public', website=True, csrf=False)
def applepay_return(self, **post): def applepay_return(self, **post):
""" applepay.""" """ applepay."""
acquirer = request.env['payment.acquirer'].sudo().search([('provider', '=', 'applepay')], limit=1) acquirer = request.env['payment.acquirer'].sudo().search([('provider', '=', 'applepay')], limit=1)

View File

@ -1,11 +1,12 @@
import requests import requests
import re import re
import logging
from odoo.http import route, request, Controller from odoo.http import route, request, Controller
from odoo.addons.payment_hyperpay.data.payment_icon import payment_icon from odoo.addons.payment_hyperpay.data.payment_icon import payment_icon
from odoo.addons.payment.controllers.portal import PaymentProcessing from odoo.addons.payment.controllers.portal import PaymentProcessing
_logger = logging.getLogger(__name__)
TEST_URL = "https://eu-test.oppwa.com" TEST_URL = "https://eu-test.oppwa.com"
LIVE_URL = "https://eu-prod.oppwa.com" LIVE_URL = "https://eu-prod.oppwa.com"
@ -88,11 +89,6 @@ class HyperPayTokenization(Controller):
@route('/hyperpay/tokens/result', type='http', auth='public', website=True) @route('/hyperpay/tokens/result', type='http', auth='public', website=True)
def token_return(self, **post): def token_return(self, **post):
try: try:
if post.get('transaction_id'):
transaction = request.env['payment.transaction'].sudo().search([('id', '=', int(post.get('transaction_id')))])
if transaction:
transaction.s2s_do_refund()
else:
acquirer_id = request.env['payment.acquirer'].sudo().search([('id', '=', int(post.get('acquirer_id', 0)))]) acquirer_id = request.env['payment.acquirer'].sudo().search([('id', '=', int(post.get('acquirer_id', 0)))])
if acquirer_id.state == 'test': if acquirer_id.state == 'test':
@ -118,11 +114,11 @@ class HyperPayTokenization(Controller):
return {'state': False, 'message': 'Card data not found'} return {'state': False, 'message': 'Card data not found'}
self._post_process_token_return(resp) self._post_process_token_return(resp)
except Exception as er: except Exception as er:
request.env.cr.rollback() # request.env.cr.rollback()
raise er _logger.error(er)
return request.redirect('/my/recurring_donation') return request.redirect('/my/recurring_donation')
def _post_process_token_return(self, data): def _post_process_token_return(self, data):
acquirer_id = int(data.get('customParameters', {}).get('SHOPPER_acquirer_id', 0)) acquirer_id = int(data.get('customParameters', {}).get('SHOPPER_acquirer_id', 0))
card = data.get('card', {}) card = data.get('card', {})

View File

@ -1,5 +1,9 @@
from odoo import models, fields, _ import psycopg2
from odoo import models, fields, _, api
from odoo.exceptions import ValidationError from odoo.exceptions import ValidationError
import logging
_logger = logging.getLogger(__name__)
class RecurringDonation(models.Model): class RecurringDonation(models.Model):
_inherit = 'donation.recurring' _inherit = 'donation.recurring'
@ -16,6 +20,16 @@ class RecurringDonation(models.Model):
def _recurring_confirm_sale_order(self, order): def _recurring_confirm_sale_order(self, order):
transaction_id = self._create_payment_transaction(order) transaction_id = self._create_payment_transaction(order)
if transaction_id.state == 'done': if transaction_id.state == 'done':
try:
transaction_id._post_process_after_done()
except psycopg2.OperationalError as e:
# Serialization Error, Try again in cron
self.env.cr.rollback()
except Exception as e:
# Unknown Error, Mute for front-end and log
self.env.cr.rollback()
_logger.exception("Error while processing transaction(s) %s, exception \"%s\"", transaction_id.ids, str(e))
return super()._recurring_confirm_sale_order(order) return super()._recurring_confirm_sale_order(order)
return False return False
@ -35,3 +49,13 @@ class RecurringDonation(models.Model):
return self.preferred_payment_token_id.id return self.preferred_payment_token_id.id
return self.env['payment.token'].sudo().search([('partner_id', '=', self.partner_id.id), ('verified', '=', True)], limit=1).id return self.env['payment.token'].sudo().search([('partner_id', '=', self.partner_id.id), ('verified', '=', True)], limit=1).id
class ReportInvoiceWithPayment(models.AbstractModel):
_inherit = 'report.account.report_invoice_with_payments'
@api.model
def _get_report_values(self, docids, data=None):
rslt = super()._get_report_values(docids, data)
rslt['company'] = self.env.company
return rslt