Courtesy of Transifex's translators for reporting bad/unclear sentences. closes odoo/odoo#62564 X-original-commit: 9b3b2e8d711e3be75b1faffaf6f4f8f4ec90186e Related: odoo/enterprise#15038 Signed-off-by: Martin Trigaux (mat) <mat@odoo.com>
112 lines
4.4 KiB
Python
112 lines
4.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
import uuid
|
|
from werkzeug.urls import url_join
|
|
|
|
from odoo import api, fields, models, _
|
|
from odoo.exceptions import ValidationError
|
|
|
|
|
|
class AdyenAccount(models.Model):
|
|
_inherit = 'adyen.account'
|
|
|
|
store_ids = fields.One2many('adyen.store', 'adyen_account_id')
|
|
terminal_ids = fields.One2many('adyen.terminal', 'adyen_account_id')
|
|
|
|
@api.model
|
|
def _sync_adyen_cron(self):
|
|
self.env['adyen.terminal']._sync_adyen_terminals()
|
|
super(AdyenAccount, self)._sync_adyen_cron()
|
|
|
|
def action_order_terminal(self):
|
|
if not self.store_ids:
|
|
raise ValidationError(_('Please create a store first.'))
|
|
|
|
store_uuids = ','.join(self.store_ids.mapped('store_uuid'))
|
|
onboarding_url = self.env['ir.config_parameter'].sudo().get_param('adyen_platforms.onboarding_url')
|
|
return {
|
|
'type': 'ir.actions.act_url',
|
|
'target': 'new',
|
|
'url': url_join(onboarding_url, 'order_terminals?store_uuids=%s' % store_uuids),
|
|
}
|
|
|
|
|
|
class AdyenStore(models.Model):
|
|
_name = 'adyen.store'
|
|
_inherit = ['adyen.address.mixin']
|
|
_description = 'Adyen for Platforms Store'
|
|
|
|
adyen_account_id = fields.Many2one('adyen.account', ondelete='cascade')
|
|
store_reference = fields.Char('Reference', default=lambda self: uuid.uuid4().hex)
|
|
store_uuid = fields.Char('UUID', readonly=True) # Given by Adyen
|
|
name = fields.Char('Name', required=True)
|
|
phone_number = fields.Char('Phone Number', required=True)
|
|
terminal_ids = fields.One2many('adyen.terminal', 'store_id', string='Payment Terminals', readonly=True)
|
|
|
|
@api.model
|
|
def create(self, values):
|
|
adyen_store_id = super(AdyenStore, self).create(values)
|
|
response = adyen_store_id.adyen_account_id._adyen_rpc('create_store', adyen_store_id._format_data())
|
|
stores = response['accountHolderDetails']['storeDetails']
|
|
created_store = next(store for store in stores if store['storeReference'] == adyen_store_id.store_reference)
|
|
adyen_store_id.with_context(update_from_adyen=True).sudo().write({
|
|
'store_uuid': created_store['store'],
|
|
})
|
|
return adyen_store_id
|
|
|
|
def unlink(self):
|
|
for store_id in self:
|
|
store_id.adyen_account_id._adyen_rpc('close_stores', {
|
|
'accountHolderCode': store_id.adyen_account_id.account_holder_code,
|
|
'stores': [store_id.store_uuid],
|
|
})
|
|
return super(AdyenStore, self).unlink()
|
|
|
|
def _format_data(self):
|
|
return {
|
|
'accountHolderCode': self.adyen_account_id.account_holder_code,
|
|
'accountHolderDetails': {
|
|
'storeDetails': [{
|
|
'storeReference': self.store_reference,
|
|
'storeName': self.name,
|
|
'merchantCategoryCode': '7999',
|
|
'address': {
|
|
'city': self.city,
|
|
'country': self.country_id.code,
|
|
'houseNumberOrName': self.house_number_or_name,
|
|
'postalCode': self.zip,
|
|
'stateOrProvince': self.state_id.code or None,
|
|
'street': self.street,
|
|
},
|
|
'fullPhoneNumber': self.phone_number,
|
|
}],
|
|
}
|
|
}
|
|
|
|
|
|
class AdyenTerminal(models.Model):
|
|
_name = 'adyen.terminal'
|
|
_description = 'Adyen for Platforms Terminal'
|
|
_rec_name = 'terminal_uuid'
|
|
|
|
adyen_account_id = fields.Many2one('adyen.account', ondelete='cascade')
|
|
store_id = fields.Many2one('adyen.store')
|
|
terminal_uuid = fields.Char('Terminal ID')
|
|
|
|
@api.model
|
|
def _sync_adyen_terminals(self):
|
|
for adyen_store_id in self.env['adyen.store'].search([]):
|
|
response = adyen_store_id.adyen_account_id._adyen_rpc('connected_terminals', {
|
|
'store': adyen_store_id.store_uuid,
|
|
})
|
|
terminals_in_db = set(self.search([('store_id', '=', adyen_store_id.id)]).mapped('terminal_uuid'))
|
|
|
|
# Added terminals
|
|
for terminal in set(response.get('uniqueTerminalIds')) - terminals_in_db:
|
|
self.sudo().create({
|
|
'adyen_account_id': adyen_store_id.adyen_account_id.id,
|
|
'store_id': adyen_store_id.id,
|
|
'terminal_uuid': terminal,
|
|
})
|