# -*- 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