from odoo import fields, models, api import logging import json _logger = logging.getLogger(__name__) class MidtransNotification(models.Model): _name = 'midtrans.notification' json_raw = fields.Char(string='JSON Raw Text') sale_order_id = fields.Many2one('sale.order', string='Sales Order') payment_status = fields.Selection([ ('pending', 'Pending'), ('capture', 'Capture'), ('settlement', 'Settlement'), ('deny', 'Deny'), ('cancel', 'Cancel'), ('expire', 'Expire'), ('failure', 'Failure'), ('refund', 'Refund'), ('chargeback', 'Chargeback'), ('partial_refund', 'Partial Refund'), ('partial_chargeback', 'Partial Chargeback'), ('authorize', 'Authorize'), ], string='Payment Status', help='Payment Gateway Status / Midtrans / Web, https://docs.midtrans.com/en/after-payment/status-cycle') def _parse_notification(self): query = [ ('payment_status', '=', False) ] notifications = self.env['midtrans.notification'].search(query, order='id') for notif in notifications: payment_status = json.loads(notif.json_raw)['transaction_status'] payment_type = json.loads(notif.json_raw)['payment_type'] gross_amount = json.loads(notif.json_raw)['gross_amount'] order_id = json.loads(notif.json_raw)['order_id'] orders = order_id.split('_') order = orders[0].replace('-', '/') if 'cpl' in order_id: order = order.replace('/cpl', '') sale_order = self.env['sale.order'].search([('name', '=', order)], limit=1) notif.payment_status = payment_status notif.sale_order_id = sale_order.id sale_order.payment_type = payment_type sale_order.gross_amount = gross_amount sale_order.payment_status = payment_status _logger.info('Success Parsing Midtrans Notification %s' % notif.id) class MidtransRecurring(models.Model): _name = 'midtrans.recurring' json_raw = fields.Char(string='JSON Raw Text') class MidtransAccount(models.Model): _name = 'midtrans.account' json_raw = fields.Char(string='JSON Raw Text')