Files
odoo_source/addons/pos_self_order_adyen/controllers/main.py
T
Theo VINCENT (thvi) 7b95532d23 [FIX] pos_{adyen,self_order{,_adyen}}: permissions
- Adds some permissions to protect sensitive pos_adyen data and methods.
 - Reduces the risks of abuses of the pos_adyen features.

Those changes are not optimal. The whole system should be changed.

 - Fixes the printing of Adyen receipts data in the receipt.
 - Fixes an error when receiving a successful Adyen payment notification for the kiosk.
 - Fixes an error when Adyen returns an error for a payment for kiosk.
 - Fixes an error when requesting adjustment/capture to Adyen (pos_restaurant_adyen and kiosk).
 - Removes unused handling of adyen_latest_diagnosis field (the field will be removed in master).

closes odoo/odoo#140327

Task-id: 3500598
Signed-off-by: Théo Vincent (thvi) <thvi@odoo.com>
2023-12-28 09:40:08 +00:00

54 lines
2.8 KiB
Python

import logging
from odoo.addons.pos_adyen.controllers.main import PosAdyenController
from odoo import fields
from odoo.http import request
_logger = logging.getLogger(__name__)
class PosSelfAdyenController(PosAdyenController):
def _process_payment_response(self, data, adyen_pm_sudo):
self_order_id = None
try:
self_order_id = PosAdyenController._get_additional_data_from_unparsed(data['SaleToPOIResponse']['PaymentResponse']['Response']['AdditionalResponse'], 'metadata.self_order_id')
except KeyError:
self_order_id = None
if not self_order_id:
return super()._process_payment_response(data, adyen_pm_sudo)
order_sudo = request.env['pos.order'].sudo().search([('id', '=', self_order_id)], limit=1)
if not order_sudo:
_logger.warning('Received an Adyen event notification for the self order #%d that does not exist (anymore)', self_order_id)
return request.make_json_response('[accepted]') # https://docs.adyen.com/point-of-sale/design-your-integration/choose-your-architecture/cloud/#guarantee
order = order_sudo.sudo(False).with_user(order_sudo.session_id.config_id.self_ordering_default_user_id).with_company(order_sudo.session_id.config_id.company_id)
payment_result = data['SaleToPOIResponse']['PaymentResponse']['Response']['Result']
if payment_result == 'Success' and order.config_id.self_ordering_mode == 'kiosk':
payment_amount = data['SaleToPOIResponse']['PaymentResponse']['PaymentResult']['AmountsResp']['AuthorizedAmount']
card_type = data['SaleToPOIResponse']['PaymentResponse']['PaymentResult']['PaymentInstrumentData']['CardData']['PaymentBrand']
transaction_id = data['SaleToPOIResponse']['PaymentResponse']['SaleData']['SaleTransactionID']['TransactionID']
order.add_payment({
'amount': payment_amount,
'payment_date': fields.Datetime.now(),
'payment_method_id': adyen_pm_sudo.id,
'card_type': card_type,
'cardholder_name': '',
'transaction_id': transaction_id,
'payment_status': payment_result,
'ticket': '',
'pos_order_id': order.id
})
order.action_pos_order_paid()
order._send_order()
if order.config_id.self_ordering_mode == 'kiosk':
order.env['bus.bus']._sendone(f'pos_config-{order.config_id.access_token}', 'PAYMENT_STATUS', {
'payment_result': payment_result,
'order': order._export_for_self_order(),
})
return request.make_json_response('[accepted]') # https://docs.adyen.com/point-of-sale/design-your-integration/choose-your-architecture/cloud/#guarantee