Initial commit
This commit is contained in:
103
fusion_payroll/models/payroll_work_location.py
Normal file
103
fusion_payroll/models/payroll_work_location.py
Normal file
@@ -0,0 +1,103 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from odoo import models, fields, api, _
|
||||
|
||||
|
||||
class PayrollWorkLocation(models.Model):
|
||||
"""
|
||||
Work Location
|
||||
Represents a physical work location where employees work.
|
||||
"""
|
||||
_name = 'payroll.work.location'
|
||||
_description = 'Work Location'
|
||||
_order = 'is_primary desc, name'
|
||||
|
||||
name = fields.Char(
|
||||
string='Location Name',
|
||||
help='Name or identifier for this work location',
|
||||
)
|
||||
company_id = fields.Many2one(
|
||||
'res.company',
|
||||
string='Company',
|
||||
required=True,
|
||||
default=lambda self: self.env.company,
|
||||
ondelete='cascade',
|
||||
)
|
||||
street = fields.Char(
|
||||
string='Street Address',
|
||||
)
|
||||
street2 = fields.Char(
|
||||
string='Street Address 2',
|
||||
)
|
||||
city = fields.Char(
|
||||
string='City',
|
||||
)
|
||||
state_id = fields.Many2one(
|
||||
'res.country.state',
|
||||
string='Province',
|
||||
domain="[('country_id', '=?', country_id)]",
|
||||
)
|
||||
zip = fields.Char(
|
||||
string='Postal Code',
|
||||
)
|
||||
country_id = fields.Many2one(
|
||||
'res.country',
|
||||
string='Country',
|
||||
default=lambda self: self.env.ref('base.ca', raise_if_not_found=False),
|
||||
)
|
||||
is_primary = fields.Boolean(
|
||||
string='Primary Location',
|
||||
default=False,
|
||||
help='Mark this as the primary work location',
|
||||
)
|
||||
status = fields.Selection([
|
||||
('active', 'Active'),
|
||||
('inactive', 'Inactive'),
|
||||
], string='Status', default='active', required=True)
|
||||
|
||||
employee_ids = fields.Many2many(
|
||||
'hr.employee',
|
||||
'payroll_work_location_employee_rel',
|
||||
'location_id',
|
||||
'employee_id',
|
||||
string='Employees',
|
||||
help='Employees assigned to this work location',
|
||||
)
|
||||
employee_count = fields.Integer(
|
||||
string='Employees Assigned',
|
||||
compute='_compute_employee_count',
|
||||
store=True,
|
||||
)
|
||||
|
||||
@api.depends('employee_ids')
|
||||
def _compute_employee_count(self):
|
||||
"""Compute number of employees assigned to this location."""
|
||||
for location in self:
|
||||
location.employee_count = len(location.employee_ids)
|
||||
|
||||
@api.constrains('is_primary')
|
||||
def _check_primary_location(self):
|
||||
"""Ensure only one primary location per company."""
|
||||
for location in self:
|
||||
if location.is_primary:
|
||||
other_primary = self.search([
|
||||
('company_id', '=', location.company_id.id),
|
||||
('is_primary', '=', True),
|
||||
('id', '!=', location.id),
|
||||
])
|
||||
if other_primary:
|
||||
raise UserError(_('Only one primary location is allowed per company.'))
|
||||
|
||||
def name_get(self):
|
||||
"""Return display name with address."""
|
||||
result = []
|
||||
for location in self:
|
||||
name = location.name or _('Unnamed Location')
|
||||
if location.city:
|
||||
name = f"{name}, {location.city}"
|
||||
if location.state_id:
|
||||
name = f"{name}, {location.state_id.code}"
|
||||
if location.is_primary:
|
||||
name = f"{name} ({_('PRIMARY')})"
|
||||
result.append((location.id, name))
|
||||
return result
|
||||
Reference in New Issue
Block a user