Tower: upload laundry_management 19.0.19.0.4 (via marketplace)

This commit is contained in:
2026-05-01 15:01:10 +00:00
parent d95c52e27a
commit 9e5070e4c7

View File

@@ -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')