This commit is contained in:
gsinghpal
2026-02-24 01:18:44 -05:00
parent e8e554de95
commit f85658c03a
41 changed files with 4440 additions and 119 deletions

View File

@@ -0,0 +1,167 @@
# -*- coding: utf-8 -*-
# Copyright 2024-2026 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
from datetime import timedelta
from odoo import models, fields, api, _
class FusionLTCCleanup(models.Model):
_name = 'fusion.ltc.cleanup'
_description = 'LTC Cleanup Schedule'
_inherit = ['mail.thread', 'mail.activity.mixin']
_order = 'scheduled_date desc, id desc'
name = fields.Char(
string='Reference',
required=True,
copy=False,
readonly=True,
default=lambda self: _('New'),
)
facility_id = fields.Many2one(
'fusion.ltc.facility',
string='LTC Facility',
required=True,
tracking=True,
index=True,
)
scheduled_date = fields.Date(
string='Scheduled Date',
required=True,
tracking=True,
)
completed_date = fields.Date(
string='Completed Date',
tracking=True,
)
state = fields.Selection([
('scheduled', 'Scheduled'),
('in_progress', 'In Progress'),
('completed', 'Completed'),
('cancelled', 'Cancelled'),
('rescheduled', 'Rescheduled'),
], string='Status', default='scheduled', required=True, tracking=True)
technician_id = fields.Many2one(
'res.users',
string='Technician',
tracking=True,
)
task_id = fields.Many2one(
'fusion.technician.task',
string='Field Service Task',
)
notes = fields.Text(string='Notes')
items_cleaned = fields.Integer(string='Items Cleaned')
photo_ids = fields.Many2many(
'ir.attachment',
'ltc_cleanup_photo_rel',
'cleanup_id',
'attachment_id',
string='Photos',
)
@api.model_create_multi
def create(self, vals_list):
for vals in vals_list:
if vals.get('name', _('New')) == _('New'):
vals['name'] = self.env['ir.sequence'].next_by_code('fusion.ltc.cleanup') or _('New')
return super().create(vals_list)
def action_start(self):
self.write({'state': 'in_progress'})
def action_complete(self):
self.write({
'state': 'completed',
'completed_date': fields.Date.context_today(self),
})
for record in self:
record._schedule_next_cleanup()
record.message_post(
body=_("Cleanup completed. Items cleaned: %s", record.items_cleaned or 0),
message_type='comment',
)
def action_cancel(self):
self.write({'state': 'cancelled'})
def action_reschedule(self):
self.write({'state': 'rescheduled'})
def action_reset(self):
self.write({'state': 'scheduled'})
def _schedule_next_cleanup(self):
facility = self.facility_id
interval = facility._get_cleanup_interval_days()
next_date = (self.completed_date or fields.Date.context_today(self)) + timedelta(days=interval)
facility.next_cleanup_date = next_date
next_cleanup = self.env['fusion.ltc.cleanup'].create({
'facility_id': facility.id,
'scheduled_date': next_date,
'technician_id': self.technician_id.id if self.technician_id else False,
})
self.activity_schedule(
'mail.mail_activity_data_todo',
date_deadline=next_date - timedelta(days=7),
summary=_('Upcoming cleanup at %s', facility.name),
note=_('Next cleanup is scheduled for %s at %s.', next_date, facility.name),
)
return next_cleanup
def action_create_task(self):
self.ensure_one()
if self.task_id:
return {
'type': 'ir.actions.act_window',
'res_model': 'fusion.technician.task',
'view_mode': 'form',
'res_id': self.task_id.id,
}
task = self.env['fusion.technician.task'].create({
'task_type': 'ltc_visit',
'facility_id': self.facility_id.id,
'scheduled_date': self.scheduled_date,
'technician_id': self.technician_id.id if self.technician_id else False,
'description': _('Cleanup visit at %s', self.facility_id.name),
})
self.task_id = task.id
return {
'type': 'ir.actions.act_window',
'res_model': 'fusion.technician.task',
'view_mode': 'form',
'res_id': task.id,
}
@api.model
def _cron_schedule_cleanups(self):
today = fields.Date.context_today(self)
week_ahead = today + timedelta(days=7)
facilities = self.env['fusion.ltc.facility'].search([
('active', '=', True),
('cleanup_frequency', '!=', False),
('next_cleanup_date', '<=', week_ahead),
('next_cleanup_date', '>=', today),
])
for facility in facilities:
existing = self.search([
('facility_id', '=', facility.id),
('scheduled_date', '=', facility.next_cleanup_date),
('state', 'not in', ['cancelled', 'rescheduled']),
], limit=1)
if not existing:
cleanup = self.create({
'facility_id': facility.id,
'scheduled_date': facility.next_cleanup_date,
})
cleanup.activity_schedule(
'mail.mail_activity_data_todo',
date_deadline=facility.next_cleanup_date - timedelta(days=3),
summary=_('Cleanup scheduled at %s', facility.name),
note=_('Cleanup is scheduled for %s.', facility.next_cleanup_date),
)