Files
enterprise-addons/pos_urban_piper/models/res_config_settings.py
T

147 lines
6.3 KiB
Python

from odoo import fields, models, _
from odoo.exceptions import UserError, RedirectWarning
from .pos_urban_piper_request import UrbanPiperClient
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
urbanpiper_username = fields.Char(
related="company_id.pos_urbanpiper_username",
readonly=False
)
urbanpiper_apikey = fields.Char(
related="company_id.pos_urbanpiper_apikey",
readonly=False
)
pos_urbanpiper_store_identifier = fields.Char(
string='UrbanPiper Store Identifier',
related='pos_config_id.urbanpiper_store_identifier',
readonly=False,
help='The POS ID associated with UrbanPiper.'
)
pos_urbanpiper_pricelist_id = fields.Many2one(
'product.pricelist',
related='pos_config_id.urbanpiper_pricelist_id',
string='UrbanPiper Pricelist',
help='The pricelist used for UrbanPiper orders.'
)
pos_urbanpiper_fiscal_position_id = fields.Many2one(
'account.fiscal.position',
related='pos_config_id.urbanpiper_fiscal_position_id',
string='UrbanPiper Fiscal Position',
help='The fiscal position used for UrbanPiper transactions.'
)
pos_urbanpiper_payment_methods_ids = fields.Many2many(
'pos.payment.method',
related='pos_config_id.urbanpiper_payment_methods_ids',
string='Online Delivery Payment Methods',
domain="[('is_delivery_payment', '=', True)]",
help='The payment methods used for online delivery through UrbanPiper.'
)
pos_urbanpiper_last_sync_date = fields.Datetime(
string='Last Sync on',
related='pos_config_id.urbanpiper_last_sync_date',
help='The date and time of the last synchronization with UrbanPiper.'
)
pos_urbanpiper_webhook_url = fields.Char(
string='Urban Piper Webhook URL',
related='pos_config_id.urbanpiper_webhook_url',
help='Register webhook with Urbanpiper.',
readonly=False
)
pos_urbanpiper_delivery_provider_ids = fields.Many2many(
'pos.delivery.provider',
related='pos_config_id.urbanpiper_delivery_provider_ids',
string='Online Delivery Providers',
help='The delivery providers used for online delivery through UrbanPiper.'
)
def urbanpiper_create_store(self):
"""
Create the store in UrbanPiper.
"""
self.pos_config_id._check_required_request_params()
if not self.pos_config_id.company_id.city:
msg = _('Your company %s needs to have a correct city in order create the store.', self.pos_config_id.company_id.name)
action = {
'view_mode': 'form',
'res_model': 'res.company',
'type': 'ir.actions.act_window',
'res_id': self.pos_config_id.company_id.id,
'views': [[self.env.ref('base.view_company_form').id, 'form']],
}
raise RedirectWarning(msg, action, _('Go to Company configuration'))
up = UrbanPiperClient(self.pos_config_id)
up.configure_webhook()
response_json = up.request_store_create()
return self.pos_config_id._urbanpiper_handle_response(response_json)
def urbanpiper_sync_menu(self):
"""
Sync the menu with UrbanPiper. This will update the menu items and categories in UrbanPiper.
"""
self.pos_config_id._check_required_request_params()
if not self.pos_config_id.urbanpiper_delivery_provider_ids:
raise UserError(_('UrbanPiper Delivery Providers are required.'))
for provider in self.pos_urbanpiper_delivery_provider_ids:
if self.pos_config_id.company_id.country_id not in provider.available_country_ids:
country_names = [country.name for country in provider.available_country_ids]
raise UserError(
_('(%(provider_name)s) delivery is only available in the following countries: \n%(country_names)s',
provider_name=provider.name, country_names=', '.join(country_names))
)
up = UrbanPiperClient(self.pos_config_id)
up.configure_webhook()
menu_response = up.request_sync_menu()
categ_response = up.request_category_timing()
combined_response = {
"status": "success",
"message": ""
}
for response in [menu_response, categ_response]:
if response.get('status') == 'error':
combined_response['status'] = "error"
combined_response['message'] = response.get('message', '') or response.get('error_message', '')
break
else:
combined_response['message'] += response.get('message', '') + ' '
return self.pos_config_id._urbanpiper_handle_response(combined_response)
def action_refresh_webhooks(self):
"""
If a webhook already exists on Atlas, refresh it; otherwise, create a new one.
and products become available for syncing again as fresh entries.
"""
self.pos_config_id._reset_urbanpiper_product_linkages()
self.pos_config_id._check_required_request_params()
up = UrbanPiperClient(self.pos_config_id)
response_json = up.request_refresh_webhooks()
return self.pos_config_id._urbanpiper_handle_response(response_json)
def open_test_order_wizard(self):
"""
Open the test order wizard to create test orders.
"""
return {
'name': _('Test Food Delivery Order'),
'views': [(self.env.ref('pos_urban_piper.pos_urban_piper_test_order_wizard_view_form').id, 'form')],
'res_model': 'pos.urbanpiper.test.order.wizard',
'type': 'ir.actions.act_window',
'target': 'new',
'context': {
'dialog_size': 'medium',
'delivery_provider_ids': self.pos_urbanpiper_delivery_provider_ids.ids,
'config_id': self.pos_config_id.id
}
}
def action_flush_and_sync_menu(self):
"""
Resets all existing UrbanPiper product linkages and performs a fresh menu sync.
"""
self.ensure_one()
self.pos_config_id._reset_urbanpiper_product_linkages()
return self.with_context(flush=True).urbanpiper_sync_menu()