147 lines
6.3 KiB
Python
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()
|