From 7a889d8caca8a23061537965c3f1e27bab21760d Mon Sep 17 00:00:00 2001 From: Alexis Lopez - Adhoc Date: Tue, 25 Jul 2023 16:52:00 -0300 Subject: [PATCH] [FW] payment_mercadopago: add check payment wizard to payment provider --- payment_mercadopago/__init__.py | 2 + payment_mercadopago/__manifest__.py | 4 +- .../security/ir.model.access.csv | 3 + payment_mercadopago/wizards/__init__.py | 2 + payment_mercadopago/wizards/check_payments.py | 108 ++++++++++++++++++ .../wizards/check_payments.xml | 62 ++++++++++ 6 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 payment_mercadopago/security/ir.model.access.csv create mode 100644 payment_mercadopago/wizards/__init__.py create mode 100644 payment_mercadopago/wizards/check_payments.py create mode 100644 payment_mercadopago/wizards/check_payments.xml diff --git a/payment_mercadopago/__init__.py b/payment_mercadopago/__init__.py index 0530e9d..4d315db 100644 --- a/payment_mercadopago/__init__.py +++ b/payment_mercadopago/__init__.py @@ -4,6 +4,8 @@ ############################################################################## from . import models from . import controllers +from . import wizards + from odoo.addons.payment import reset_payment_provider diff --git a/payment_mercadopago/__manifest__.py b/payment_mercadopago/__manifest__.py index d403725..9e74f3c 100644 --- a/payment_mercadopago/__manifest__.py +++ b/payment_mercadopago/__manifest__.py @@ -2,7 +2,7 @@ 'name': 'Mercado Pago Payment Acquirer', 'category': 'Accounting/Payment Acquirers', 'summary': 'Payment Acquirer: MercadoPago', - 'version': "16.0.2.0.0", + 'version': "16.0.3.0.0", 'description': """ Mercado pago Payment =================== @@ -20,8 +20,10 @@ 'python': ['mercadopago'], }, 'data': [ + 'security/ir.model.access.csv', 'views/payment_views.xml', 'views/payment_mercadopago_templates.xml', + 'wizards/check_payments.xml', 'data/payment_acquirer_data.xml', ], 'demo': [ diff --git a/payment_mercadopago/security/ir.model.access.csv b/payment_mercadopago/security/ir.model.access.csv new file mode 100644 index 0000000..380c520 --- /dev/null +++ b/payment_mercadopago/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +payment_mercadopago.mercadopago_check_payment,mercadopago_check_payment,payment_mercadopago.model_payment_mercadopago_check_payment,base.group_system,1,1,1,1 +payment_mercadopago.mercadopago_check_payment_line,mercadopago_check_payment_line,payment_mercadopago.model_payment_mercadopago_check_payment_line,base.group_system,1,1,1,1 diff --git a/payment_mercadopago/wizards/__init__.py b/payment_mercadopago/wizards/__init__.py new file mode 100644 index 0000000..8873c7f --- /dev/null +++ b/payment_mercadopago/wizards/__init__.py @@ -0,0 +1,2 @@ +from . import check_payments + diff --git a/payment_mercadopago/wizards/check_payments.py b/payment_mercadopago/wizards/check_payments.py new file mode 100644 index 0000000..f9b14bc --- /dev/null +++ b/payment_mercadopago/wizards/check_payments.py @@ -0,0 +1,108 @@ +from odoo import fields, models +import logging +from odoo.addons.payment_mercadopago.models.mercadopago_request import MercadoPagoAPI +from odoo.exceptions import UserError + +_logger = logging.getLogger(__name__) + +class PaymentMercadopagoCheckPayment(models.TransientModel): + _name = "payment.mercadopago.check_payment" + _description = "Mercadopago check payments" + + provider_id = fields.Many2one('payment.provider', domain="[('code', '=', 'mercadopago')]", required=True) + date_form = fields.Date(required=True, default = lambda self: fields.Date.today()) + date_to = fields.Date(required=True, default = lambda self: fields.Date.today()) + line_ids = fields.One2many('payment.mercadopago.check_payment.line', 'check_id', string='lines') + confirmed = fields.Boolean(default=True) + no_match = fields.Boolean() + + def check_status(self, mp_status, odoo_state): + states = { + 'pending': 'pending', + 'approved': 'done', + 'authorized': 'authorized', + 'in_process': 'pending', + 'in_mediation': 'pending', + 'rejected': 'cancel', + 'cancelled': 'cancel', + 'refunded': 'done', + 'charged_back': 'done' + } + custom_state = states.get(mp_status) + return odoo_state == custom_state + + def action_search_payments(self): + MP = MercadoPagoAPI(self.provider_id) + lines = [] + self.line_ids = False + payments = MP.mp.payment().search(filters={'begin_date':str(self.date_form) + "T00:00:00.000Z", 'end_date':str(self.date_to) + "T23:59:59.000Z", 'limit':1}) + if 'error' in payments['response']: + raise UserError(payments['response']['message']) + offset = 0 + total = payments['response']['paging']['total'] + while offset <= total: + filters={'begin_date':str(self.date_form) + "T00:00:00.000Z", 'end_date':str(self.date_to) + "T23:59:59.000Z", 'limit':100, 'offset':offset} + _logger.info("Search in MP %s" % filters) + payments = MP.mp.payment().search(filters=filters) + offset += 100 + external_reference = [payment['external_reference'] for payment in payments['response']['results']] + tx_ids = self.env['payment.transaction'].search([('reference', 'in', external_reference)]) + if 'results' in payments['response']: + for payment in payments['response']['results']: + if not self.confirmed or payment.get('status') in ['refunded','approved','authorized','charged_back']: + transaction_id = tx_ids.filtered(lambda t: t.reference == payment['external_reference']) + if transaction_id and self.no_match and self.check_status(payment.get('status'), transaction_id.state): + continue + lines.append((0, 0, { + 'mp_id': payment.get('id'), + 'mp_amount': payment.get('transaction_amount'), + 'mp_state': payment.get('status'), + 'mp_external_reference':payment.get('external_reference'), + 'mp_partner':payment.get('external_reference'), + 'transaction_id': transaction_id.id + })) + self.line_ids = lines + return { + 'type': 'ir.actions.act_window', + 'res_model': 'payment.mercadopago.check_payment', + 'res_id': self.id, + 'target': 'new', + 'views': [(self.env.ref('payment_mercadopago.check_payments_view_form').id, 'form')], + } + + +class PaymentMercadopagoCheckPaymentLine(models.TransientModel): + _name = "payment.mercadopago.check_payment.line" + _description = "Mercadopago check payments" + + check_id = fields.Many2one('payment.mercadopago.check_payment') + transaction_id = fields.Many2one('payment.transaction') + transaction_state = fields.Selection('State', related='transaction_id.state') + mp_amount = fields.Float() + mp_id = fields.Char() + mp_state = fields.Char() + mp_external_reference = fields.Char() + mp_partner = fields.Char() + + def get_tx_info_from_mercadopago(self): + txt = [] + for rec in self: + if rec.check_id.provider_id.code != 'mercadopago': + continue + MP = MercadoPagoAPI(rec.check_id.provider_id) + + payments = MP.mp.payment().search(filters = {'external_reference': rec.mp_external_reference}) + for payment in payments['response']['results']: + txt += ['---------------------------'] + txt += ["STATUS: %s" % payment['status']] + txt += ["AMOUNT: %s" % payment['transaction_amount']] + txt += ["description: %s" % payment['description']] + txt += ['---------------------------'] + txt += ['%s: %s' % (x, payment[x]) for x in payment] + txt += ['---------------------------'] + try: + rec._mercadopago_s2s_validate_tree(payment) + except: + _logger.error('cant validate_tree') + + raise UserError("%s" % ' \n'.join(txt)) diff --git a/payment_mercadopago/wizards/check_payments.xml b/payment_mercadopago/wizards/check_payments.xml new file mode 100644 index 0000000..cccec9a --- /dev/null +++ b/payment_mercadopago/wizards/check_payments.xml @@ -0,0 +1,62 @@ + + + + + check_payments.view.form + payment.mercadopago.check_payment + +
+ +

+ + + + + + + + + + + + + + + + + + +