246 lines
11 KiB
Python
246 lines
11 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright 2020-Today TechKhedut.
|
|
# Part of TechKhedut. See LICENSE file for full copyright and licensing details.
|
|
from odoo import api, fields, models, _
|
|
|
|
|
|
class ConstructionDashboard(models.Model):
|
|
_name = 'tk.construction.dashboard'
|
|
_description = "Construction Dashboard"
|
|
|
|
name = fields.Char()
|
|
|
|
@api.model
|
|
def get_construction_state(self, site_id, project_id):
|
|
site_domain = []
|
|
project_domain = []
|
|
int_domain = []
|
|
if (not site_id and not project_id) or (site_id == 'all_site' and project_id == 'all_project'):
|
|
pass
|
|
elif not site_id == 'all_site' and project_id == 'all_project':
|
|
site_domain = [('construction_site_id', '=', int(site_id))]
|
|
int_domain = [('site_id', '=', int(site_id))]
|
|
projects = self.env['tk.construction.project'].search(
|
|
site_domain).mapped('id')
|
|
project_domain = [('project_id', 'in', projects)]
|
|
elif site_id and project_id:
|
|
site_domain = [('construction_site_id', '=', int(site_id))]
|
|
int_domain = [('site_id', '=', int(site_id))]
|
|
project_domain = [('project_id', '=', int(project_id))]
|
|
total_site = self.env['tk.construction.site'].search_count([])
|
|
total_project = self.env['tk.construction.project'].search_count(
|
|
site_domain)
|
|
total_mrq = self.env['material.requisition'].search_count(
|
|
project_domain)
|
|
job_sheet_count = self.env['job.costing'].search_count(project_domain)
|
|
job_order_count = self.env['job.order'].search_count(project_domain)
|
|
back_order = self.env['material.requisition'].sudo().search_count(
|
|
[('is_back_order', '=', True)] + project_domain)
|
|
forward_transfer = self.env['internal.transfer'].sudo().search_count(
|
|
[('is_forward_transfer', '=', True)] + int_domain)
|
|
return {
|
|
'total_site': total_site,
|
|
'total_project': total_project,
|
|
'total_mrq': total_mrq,
|
|
'job_sheet_count': job_sheet_count,
|
|
'job_order_count': job_order_count,
|
|
'mrq_state': self.get_mrq_state(project_domain),
|
|
'site_state': self.get_site_state(),
|
|
'internal_state': self.get_it_state(int_domain),
|
|
'site_timeline': self.construction_time_line(),
|
|
'project_timeline': self.project_time_line(site_domain),
|
|
'project_status': self.get_project_status(site_domain),
|
|
'job_order_po': self.get_purchase_order(project_domain),
|
|
'back_order': back_order,
|
|
'forward_transfer': forward_transfer,
|
|
'purchase_order': self.get_purchase_order_state(project_domain),
|
|
'con_sites': self.get_site_list(),
|
|
}
|
|
|
|
@api.model
|
|
def get_project_list(self, site_domain):
|
|
projects = {}
|
|
if not site_domain == 'all_site':
|
|
domain = [('construction_site_id', '=', int(site_domain))]
|
|
project_obj = self.env['tk.construction.project'].sudo()
|
|
for rec in project_obj.search(domain):
|
|
projects[rec.id] = rec.name
|
|
return projects
|
|
if site_domain == 'all_site':
|
|
return projects
|
|
|
|
def get_site_list(self):
|
|
site_obj = self.env['tk.construction.site'].sudo()
|
|
sites = {}
|
|
for rec in site_obj.search([]):
|
|
sites[rec.id] = rec.name
|
|
return sites
|
|
|
|
def get_mrq_state(self, project_domain):
|
|
material_requisition = self.env['material.requisition'].sudo()
|
|
draft = material_requisition.search_count(
|
|
[('stage', '=', 'draft')] + project_domain)
|
|
waiting_approval = material_requisition.search_count(
|
|
[('stage', '=', 'department_approval')] + project_domain)
|
|
approved = material_requisition.search_count(
|
|
[('stage', '=', 'approve')] + project_domain)
|
|
ready_delivery = material_requisition.search_count(
|
|
[('stage', '=', 'ready_delivery')] + project_domain)
|
|
material_arrive = material_requisition.search_count(
|
|
[('stage', '=', 'material_arrived')] + project_domain)
|
|
internal_transfer = material_requisition.search_count(
|
|
[('stage', '=', 'internal_transfer')] + project_domain)
|
|
reject = material_requisition.search_count(
|
|
[('stage', '=', 'reject')] + project_domain)
|
|
cancel = material_requisition.search_count(
|
|
[('stage', '=', 'cancel')] + project_domain)
|
|
return [
|
|
['Draft', 'Waiting Approval', 'In Progress', 'Ready Delivery', 'Material Arrive', 'Internal Transfer',
|
|
'Reject', 'Cancel'],
|
|
[draft, waiting_approval, approved, ready_delivery,
|
|
material_arrive, internal_transfer, reject, cancel]
|
|
]
|
|
|
|
def get_site_state(self):
|
|
site = self.env['tk.construction.site'].sudo()
|
|
draft = site.search_count([('status', '=', 'draft')])
|
|
in_progress = site.search_count([('status', '=', 'in_progress')])
|
|
done = site.search_count([('status', '=', 'complete')])
|
|
return [
|
|
['Draft', 'In Progress', 'Complete'], [draft, in_progress, done]
|
|
]
|
|
|
|
def get_it_state(self, site_domain):
|
|
internal_transfer = self.env['internal.transfer'].sudo()
|
|
draft = internal_transfer.search_count(
|
|
[('stage', '=', 'draft')] + site_domain)
|
|
in_progress = internal_transfer.search_count(
|
|
[('stage', '=', 'in_progress')] + site_domain)
|
|
done = internal_transfer.search_count(
|
|
[('stage', '=', 'done')] + site_domain)
|
|
return [
|
|
['Draft', 'In Progress', 'Done'], [draft, in_progress, done]
|
|
]
|
|
|
|
def construction_time_line(self):
|
|
site_data = []
|
|
construction_site_data = self.env['tk.construction.site'].search([])
|
|
for site in construction_site_data:
|
|
if site.status == "in_progress":
|
|
site_data.append({
|
|
'name': site.name,
|
|
'start_date': str(site.start_date),
|
|
'end_date': str(site.end_date),
|
|
})
|
|
return site_data
|
|
|
|
def project_time_line(self, site_domain):
|
|
data = []
|
|
project_data = self.env['tk.construction.project'].search(site_domain)
|
|
for p in project_data:
|
|
if p.stage == "Construction":
|
|
data.append({
|
|
'name': str(p.name) + " - " + str(p.construction_site_id.name),
|
|
'start_date': str(p.start_date),
|
|
'end_date': str(p.end_date),
|
|
})
|
|
return data
|
|
|
|
def get_project_status(self, site_domain):
|
|
project_obj = self.env['tk.construction.project'].sudo()
|
|
planning = project_obj.search_count(
|
|
[('stage', '=', 'Planning')] + site_domain)
|
|
procurement = project_obj.search_count(
|
|
[('stage', '=', 'Procurement')] + site_domain)
|
|
construction = project_obj.search_count(
|
|
[('stage', '=', 'Construction')] + site_domain)
|
|
handover = project_obj.search_count(
|
|
[('stage', '=', 'Handover')] + site_domain)
|
|
return [
|
|
['Planning', 'Procurement', 'Construction', 'Handover'],
|
|
[planning, procurement, construction, handover]
|
|
]
|
|
|
|
def get_purchase_order(self, project_domain):
|
|
jo_order = []
|
|
mrq_po = []
|
|
equip_po = []
|
|
labour_po = []
|
|
overhead_po = []
|
|
job_order = self.env['job.order'].sudo().search(project_domain)
|
|
for j in job_order:
|
|
if j.project_id.stage == "Construction":
|
|
name = str(j.name) + " - " + str(j.title)
|
|
jo_order.append(name)
|
|
mrq_po.append(j.material_req_id.po_count)
|
|
equip_po.append(j.equip_po_count)
|
|
labour_po.append(j.labour_po_count)
|
|
overhead_po.append(j.overhead_po_count)
|
|
data = [jo_order, mrq_po, equip_po, labour_po, overhead_po]
|
|
return data
|
|
|
|
def get_purchase_order_state(self, project_domain):
|
|
domain = project_domain
|
|
po_obj = self.env['purchase.order'].sudo()
|
|
mr_po = po_obj.search_count(
|
|
[('material_req_id', '!=', False)] + domain)
|
|
equip_po = 0
|
|
labour_po = 0
|
|
overhead_po = 0
|
|
job_orders = self.env['job.order'].search(domain)
|
|
for rec in job_orders:
|
|
equip_po = equip_po + po_obj.search_count(
|
|
[('job_order_id', '=', rec.id), ('purchase_order', '=', 'equipment')])
|
|
labour_po = labour_po + po_obj.search_count(
|
|
[('job_order_id', '=', rec.id), ('purchase_order', '=', 'labour')])
|
|
overhead_po = overhead_po + po_obj.search_count(
|
|
[('job_order_id', '=', rec.id), ('purchase_order', '=', 'overhead')])
|
|
return {
|
|
'mr_po': mr_po,
|
|
'equip_po': equip_po,
|
|
'labour_po': labour_po,
|
|
'overhead_po': overhead_po,
|
|
}
|
|
|
|
@api.model
|
|
def get_construction_project_domain(self, site_id, project_id):
|
|
site_domain = []
|
|
project_domain = []
|
|
if site_id == 'all_site':
|
|
pass
|
|
elif not site_id == 'all_site' and project_id == 'all_project':
|
|
site_domain = [('construction_site_id', '=', int(site_id))]
|
|
projects = self.env['tk.construction.project'].search(
|
|
site_domain).mapped('id')
|
|
project_domain = [('project_id', 'in', projects)]
|
|
elif site_id and project_id:
|
|
site_domain = [('construction_site_id', '=', int(site_id))]
|
|
project_domain = [('project_id', '=', int(project_id))]
|
|
return [site_domain, project_domain]
|
|
|
|
@api.model
|
|
def get_job_order_po(self, site_id, project_id, source):
|
|
project_domain = []
|
|
if site_id == 'all_site':
|
|
pass
|
|
elif not site_id == 'all_site' and project_id == 'all_project':
|
|
site_domain = [('construction_site_id', '=', int(site_id))]
|
|
projects = self.env['tk.construction.project'].search(
|
|
site_domain).mapped('id')
|
|
project_domain = [('project_id', 'in', projects)]
|
|
elif site_id and project_id:
|
|
project_domain = [('project_id', '=', int(project_id))]
|
|
ids = []
|
|
po_obj = self.env['purchase.order'].sudo()
|
|
for data in self.env['job.order'].search(project_domain):
|
|
if source == 'equip':
|
|
ids = ids + po_obj.search(
|
|
[('job_order_id', '=', data.id), ('purchase_order', '=', 'equipment')]).mapped('id')
|
|
if source == 'labour':
|
|
ids = ids + po_obj.search(
|
|
[('job_order_id', '=', data.id), ('purchase_order', '=', 'labour')]).mapped('id')
|
|
if source == 'overhead':
|
|
ids = ids + po_obj.search(
|
|
[('job_order_id', '=', data.id), ('purchase_order', '=', 'overhead')]).mapped('id')
|
|
return ids
|