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