112 lines
5.8 KiB
Python
112 lines
5.8 KiB
Python
from odoo import fields, models, api
|
|
|
|
|
|
class PosKdsReportLine(models.Model):
|
|
_name = 'pos.kds.report.line'
|
|
_description = 'KDS Line Completion Report'
|
|
_order = 'completion_datetime desc'
|
|
|
|
pos_order_id = fields.Many2one('pos.order', string='Order', required=True, ondelete='cascade', index=True)
|
|
pos_order_line_id = fields.Many2one('pos.order.line', string='Order Line', required=True, ondelete='cascade', index=True)
|
|
product_id = fields.Many2one('product.product', string='Product', required=True, index=True)
|
|
pos_category_id = fields.Many2one('pos.category', string='POS Category', compute='_compute_pos_category', store=True, index=True)
|
|
pos_config_id = fields.Many2one('pos.config', string='POS Shop', compute='_compute_pos_config', store=True, index=True)
|
|
prep_display_id = fields.Many2one('pos.prep.display', string='Preparation Display', required=True, index=True)
|
|
|
|
state = fields.Selection([
|
|
('in_prep', 'In Preparation'),
|
|
('ready', 'Ready'),
|
|
('done', 'Completed'),
|
|
('cancelled', 'Cancelled')
|
|
], string='Status', default='done', index=True)
|
|
|
|
preparation_time = fields.Integer('Preparation Time (s)', aggregator='sum', help="Seconds taken to prepare")
|
|
preparation_time_avg = fields.Integer('Average Preparation Time (s)', aggregator='avg', help="Average seconds taken to prepare")
|
|
service_time = fields.Integer('Service Time (s)', aggregator='sum', help="Seconds taken to serve")
|
|
service_time_avg = fields.Integer('Average Service Time (s)', aggregator='avg', help="Average seconds taken to serve")
|
|
completion_time = fields.Integer('Completion Time (s)', aggregator='sum', help="Total seconds taken to complete (prep + service)")
|
|
completion_time_avg = fields.Integer('Average Completion Time (s)', aggregator='avg', help="Average total seconds taken to complete")
|
|
completion_datetime = fields.Datetime('Completion Date', default=fields.Datetime.now, index=True)
|
|
|
|
@api.depends('product_id')
|
|
def _compute_pos_category(self):
|
|
for record in self:
|
|
record.pos_category_id = record.product_id.pos_categ_ids[:1] if record.product_id.pos_categ_ids else False
|
|
|
|
@api.depends('pos_order_id')
|
|
def _compute_pos_config(self):
|
|
for record in self:
|
|
record.pos_config_id = record.pos_order_id.session_id.config_id
|
|
|
|
@api.depends('pos_order_id.name', 'product_id.name')
|
|
def _compute_display_name(self):
|
|
for record in self:
|
|
record.display_name = f"{record.pos_order_id.name} - {record.product_id.name}"
|
|
|
|
def init(self):
|
|
super().init()
|
|
self.env.cr.execute("""
|
|
UPDATE pos_kds_report_line
|
|
SET preparation_time_avg = COALESCE(preparation_time, 0)
|
|
WHERE preparation_time_avg IS NULL OR preparation_time_avg = 0;
|
|
|
|
UPDATE pos_kds_report_line
|
|
SET service_time_avg = COALESCE(service_time, 0)
|
|
WHERE service_time_avg IS NULL OR service_time_avg = 0;
|
|
|
|
UPDATE pos_kds_report_line
|
|
SET completion_time_avg = COALESCE(completion_time, 0)
|
|
WHERE completion_time_avg IS NULL OR completion_time_avg = 0;
|
|
""")
|
|
|
|
|
|
class PosKdsReportOrder(models.Model):
|
|
_name = 'pos.kds.report.order'
|
|
_description = 'KDS Order Completion Report'
|
|
_order = 'completion_datetime desc'
|
|
|
|
pos_order_id = fields.Many2one('pos.order', string='Order', required=True, ondelete='cascade', index=True)
|
|
pos_config_id = fields.Many2one('pos.config', string='POS Shop', compute='_compute_pos_config', store=True, index=True)
|
|
prep_display_id = fields.Many2one('pos.prep.display', string='Preparation Display', required=True, index=True)
|
|
|
|
state = fields.Selection([
|
|
('in_prep', 'In Preparation'),
|
|
('ready', 'Ready'),
|
|
('done', 'Completed'),
|
|
('cancelled', 'Cancelled')
|
|
], string='Status', default='done', index=True)
|
|
|
|
preparation_time = fields.Integer('Preparation Time (s)', aggregator='sum', help="Max preparation time across lines")
|
|
preparation_time_avg = fields.Integer('Average Preparation Time (s)', aggregator='avg', help="Average preparation time across lines")
|
|
service_time = fields.Integer('Service Time (s)', aggregator='sum', help="Max service time across lines")
|
|
service_time_avg = fields.Integer('Average Service Time (s)', aggregator='avg', help="Average service time across lines")
|
|
completion_time = fields.Integer('Completion Time (s)', aggregator='sum', help="Max completion time across all lines of the order on this display")
|
|
completion_time_avg = fields.Integer('Average Completion Time (s)', aggregator='avg', help="Average completion time across all lines of the order on this display")
|
|
completion_datetime = fields.Datetime('Completion Date', default=fields.Datetime.now, index=True)
|
|
|
|
@api.depends('pos_order_id')
|
|
def _compute_pos_config(self):
|
|
for record in self:
|
|
record.pos_config_id = record.pos_order_id.session_id.config_id
|
|
|
|
@api.depends('pos_order_id.name', 'prep_display_id.name')
|
|
def _compute_display_name(self):
|
|
for record in self:
|
|
record.display_name = f"{record.pos_order_id.name} ({record.prep_display_id.name})"
|
|
|
|
def init(self):
|
|
super().init()
|
|
self.env.cr.execute("""
|
|
UPDATE pos_kds_report_order
|
|
SET preparation_time_avg = COALESCE(preparation_time, 0)
|
|
WHERE preparation_time_avg IS NULL OR preparation_time_avg = 0;
|
|
|
|
UPDATE pos_kds_report_order
|
|
SET service_time_avg = COALESCE(service_time, 0)
|
|
WHERE service_time_avg IS NULL OR service_time_avg = 0;
|
|
|
|
UPDATE pos_kds_report_order
|
|
SET completion_time_avg = COALESCE(completion_time, 0)
|
|
WHERE completion_time_avg IS NULL OR completion_time_avg = 0;
|
|
""")
|