103 lines
4.8 KiB
Python
103 lines
4.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
from odoo import models, fields, api, _
|
|
|
|
class SocialWhatsAppTemplate(models.Model):
|
|
_name = 'social.whatsapp.template'
|
|
_description = 'WhatsApp Business Template Mapping'
|
|
_order = 'sequence, id'
|
|
|
|
name = fields.Char(string='Mapping Name', required=True)
|
|
sequence = fields.Integer(string='Sequence', default=10)
|
|
event_type = fields.Selection([
|
|
('order_confirmed', 'Order Confirmed'),
|
|
('order_processing', 'Order Processing / Being Prepared'),
|
|
('order_shipped', 'Order Shipped / Out for Delivery'),
|
|
('order_delivered', 'Order Delivered'),
|
|
('customer_enquiry', 'Inquiry Auto-Reply'),
|
|
], string='Trigger Event', required=True, index=True)
|
|
template_name = fields.Char(string='Meta Approved Template Name', required=True,
|
|
help='Exact template name created and approved in Meta WhatsApp Business Manager.')
|
|
language_code = fields.Char(string='Language Code', default='en_US', required=True,
|
|
help='Language code (e.g. en_US, en, es_LA, fr).')
|
|
is_active = fields.Boolean(string='Active', default=True)
|
|
company_id = fields.Many2one('res.company', string='Company', default=lambda self: self.env.company)
|
|
|
|
# Dynamic Field Mappings for Body Parameters {{1}}, {{2}}, {{3}}, {{4}}
|
|
param_1_field = fields.Selection([
|
|
('order_name', 'Order Reference (e.g. SO1234)'),
|
|
('partner_name', 'Customer Name'),
|
|
('amount_total', 'Order Total Amount'),
|
|
('carrier_name', 'Carrier / Delivery Method'),
|
|
('tracking_number', 'Tracking / ETA Reference'),
|
|
('tracking_url', 'Order / Tracking URL'),
|
|
], string='Parameter 1 ({{1}})', default='order_name')
|
|
|
|
param_2_field = fields.Selection([
|
|
('order_name', 'Order Reference (e.g. SO1234)'),
|
|
('partner_name', 'Customer Name'),
|
|
('amount_total', 'Order Total Amount'),
|
|
('carrier_name', 'Carrier / Delivery Method'),
|
|
('tracking_number', 'Tracking / ETA Reference'),
|
|
('tracking_url', 'Order / Tracking URL'),
|
|
], string='Parameter 2 ({{2}})', default='partner_name')
|
|
|
|
param_3_field = fields.Selection([
|
|
('order_name', 'Order Reference (e.g. SO1234)'),
|
|
('partner_name', 'Customer Name'),
|
|
('amount_total', 'Order Total Amount'),
|
|
('carrier_name', 'Carrier / Delivery Method'),
|
|
('tracking_number', 'Tracking / ETA Reference'),
|
|
('tracking_url', 'Order / Tracking URL'),
|
|
], string='Parameter 3 ({{3}})', default='amount_total')
|
|
|
|
param_4_field = fields.Selection([
|
|
('order_name', 'Order Reference (e.g. SO1234)'),
|
|
('partner_name', 'Customer Name'),
|
|
('amount_total', 'Order Total Amount'),
|
|
('carrier_name', 'Carrier / Delivery Method'),
|
|
('tracking_number', 'Tracking / ETA Reference'),
|
|
('tracking_url', 'Order / Tracking URL'),
|
|
], string='Parameter 4 ({{4}})', default='tracking_url')
|
|
|
|
description = fields.Text(string='Description / Template Copy',
|
|
help='Human-readable preview of the template content approved in Meta.')
|
|
|
|
_sql_constraints = [
|
|
('event_company_unique', 'unique(event_type, company_id)',
|
|
'Only one active template mapping can be configured per event type for each company.')
|
|
]
|
|
|
|
def _get_field_value(self, field_type, order, picking=None):
|
|
if not field_type or not order:
|
|
return ""
|
|
base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url', '').rstrip('/')
|
|
if field_type == 'order_name':
|
|
return order.name or ''
|
|
elif field_type == 'partner_name':
|
|
return order.partner_id.name or 'Customer'
|
|
elif field_type == 'amount_total':
|
|
curr = order.currency_id.symbol or order.currency_id.name or '$'
|
|
return f"{curr}{order.amount_total:.2f}"
|
|
elif field_type == 'carrier_name':
|
|
if picking and hasattr(picking, 'carrier_id') and picking.carrier_id:
|
|
return picking.carrier_id.name
|
|
return "Standard Delivery"
|
|
elif field_type == 'tracking_number':
|
|
if picking and hasattr(picking, 'carrier_tracking_ref') and picking.carrier_tracking_ref:
|
|
return picking.carrier_tracking_ref
|
|
return order.name
|
|
elif field_type == 'tracking_url':
|
|
return f"{base_url}/my/orders/{order.id}"
|
|
return ""
|
|
|
|
def build_parameters(self, order, picking=None):
|
|
"""Builds parameter list for Meta template body interpolation."""
|
|
self.ensure_one()
|
|
params = []
|
|
for fld in (self.param_1_field, self.param_2_field, self.param_3_field, self.param_4_field):
|
|
if fld:
|
|
val = self._get_field_value(fld, order, picking)
|
|
if val:
|
|
params.append(val)
|
|
return params
|