From 9e5070e4c7e731974f422a60f4d294781a136e1e Mon Sep 17 00:00:00 2001 From: git_admin Date: Fri, 1 May 2026 15:01:10 +0000 Subject: [PATCH] Tower: upload laundry_management 19.0.19.0.4 (via marketplace) --- .../models/laundry_settings.py | 137 ++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 addons/laundry_management/models/laundry_settings.py diff --git a/addons/laundry_management/models/laundry_settings.py b/addons/laundry_management/models/laundry_settings.py new file mode 100644 index 0000000..0b092bd --- /dev/null +++ b/addons/laundry_management/models/laundry_settings.py @@ -0,0 +1,137 @@ +from odoo import models, fields, api + + +class LaundrySettings(models.TransientModel): + """Laundry Management settings panel (PART 9). + + Extends res.config.settings to add laundry-specific configuration: + - WhatsApp Business API credentials and behaviour + - Commission tracking rates, rules, and default account + - Session enforcement and default cash journal + - Print format defaults + - Cash control: default difference account + """ + _inherit = 'res.config.settings' + + # ── WhatsApp ────────────────────────────────────────────────────── + laundry_wa_token = fields.Char( + string='WhatsApp Cloud API Token', + config_parameter='laundry.whatsapp_api_token', + ) + laundry_wa_phone_id = fields.Char( + string='Phone Number ID', + config_parameter='laundry.whatsapp_phone_id', + ) + laundry_wa_store_number = fields.Char( + string='Store WhatsApp Number', + config_parameter='laundry.whatsapp_store_number', + help='E.164 format without + (e.g. 966501234567). Used as fallback number.', + ) + laundry_wa_auto_send = fields.Boolean( + string='Auto-send WhatsApp on Order Confirm', + ) + + # ── Commission ──────────────────────────────────────────────────── + laundry_commission_enabled = fields.Boolean( + string='Enable Staff Commission Tracking', + ) + laundry_commission_type = fields.Selection([ + ('percentage', 'Percentage of Order Total (%)'), + ('fixed', 'Fixed Amount per Order'), + ], string='Commission Type') + laundry_commission_reception_rate = fields.Float( + string='Reception Commission', digits=(10, 2), + ) + laundry_commission_processing_rate = fields.Float( + string='Processing Commission', digits=(10, 2), + ) + laundry_commission_delivery_rate = fields.Float( + string='Delivery Commission', digits=(10, 2), + ) + laundry_commission_account_id = fields.Many2one( + 'account.account', + string='Commission Expense Account', + domain="[('account_type', 'in', ['expense', 'expense_direct_cost']), ('company_ids', 'in', [company_id])]", + help='Account for booking commission expenses (for future accounting integration).', + ) + + # ── Session / Cash Control ──────────────────────────────────────── + laundry_require_session = fields.Boolean( + string='Require Open Session to Confirm Orders', + ) + laundry_cash_journal_id = fields.Many2one( + 'account.journal', + string='Default Cash Journal', + domain="[('type', '=', 'cash'), ('company_id', '=', company_id)]", + help='Default cash journal used in the payment wizard.', + ) + laundry_difference_account_id = fields.Many2one( + 'account.account', + string='Cash Difference Account', + domain="[('company_ids', 'in', [company_id])]", + help='Default account for posting session cash count variances.', + ) + + # ── Print ───────────────────────────────────────────────────────── + laundry_default_paper = fields.Selection([ + ('a4', 'A4 Full Receipt'), + ('thermal', 'Thermal / 80mm Roll'), + ], string='Default Print Format') + + # company_id helper for domain filtering + company_id = fields.Many2one( + 'res.company', string='Company', + default=lambda self: self.env.company, + readonly=True, + ) + + # ── Load & Save ─────────────────────────────────────────────────── + def get_values(self): + res = super().get_values() + ICP = self.env['ir.config_parameter'].sudo() + + def _bool(key, default='False'): + return ICP.get_param(key, default) == 'True' + + def _float(key, default='0.0'): + try: + return float(ICP.get_param(key, default)) + except (ValueError, TypeError): + return 0.0 + + def _int_record(key): + val = ICP.get_param(key, '') + try: + return int(val) if val else False + except (ValueError, TypeError): + return False + + res.update({ + 'laundry_wa_auto_send': _bool('laundry_management.wa_auto_send'), + 'laundry_commission_enabled': _bool('laundry_management.commission_enabled'), + 'laundry_commission_type': ICP.get_param('laundry_management.commission_type', 'percentage'), + 'laundry_commission_reception_rate': _float('laundry_management.commission_reception_rate'), + 'laundry_commission_processing_rate': _float('laundry_management.commission_processing_rate'), + 'laundry_commission_delivery_rate': _float('laundry_management.commission_delivery_rate'), + 'laundry_commission_account_id': _int_record('laundry_management.commission_account_id'), + 'laundry_require_session': _bool('laundry_management.require_session'), + 'laundry_cash_journal_id': _int_record('laundry_management.cash_journal_id'), + 'laundry_difference_account_id': _int_record('laundry_management.difference_account_id'), + 'laundry_default_paper': ICP.get_param('laundry_management.default_paper', 'a4'), + }) + return res + + def set_values(self): + super().set_values() + ICP = self.env['ir.config_parameter'].sudo() + ICP.set_param('laundry_management.wa_auto_send', str(self.laundry_wa_auto_send)) + ICP.set_param('laundry_management.commission_enabled', str(self.laundry_commission_enabled)) + ICP.set_param('laundry_management.commission_type', self.laundry_commission_type or 'percentage') + ICP.set_param('laundry_management.commission_reception_rate', str(self.laundry_commission_reception_rate)) + ICP.set_param('laundry_management.commission_processing_rate', str(self.laundry_commission_processing_rate)) + ICP.set_param('laundry_management.commission_delivery_rate', str(self.laundry_commission_delivery_rate)) + ICP.set_param('laundry_management.commission_account_id', str(self.laundry_commission_account_id.id or '')) + ICP.set_param('laundry_management.require_session', str(self.laundry_require_session)) + ICP.set_param('laundry_management.cash_journal_id', str(self.laundry_cash_journal_id.id or '')) + ICP.set_param('laundry_management.difference_account_id', str(self.laundry_difference_account_id.id or '')) + ICP.set_param('laundry_management.default_paper', self.laundry_default_paper or 'a4')