Assign operating workstreams to company context

This commit is contained in:
metatroncubeswdev 2026-08-30 11:27:46 -04:00
parent 462e91f00c
commit 315ab7497a
2 changed files with 37 additions and 8 deletions

View File

@ -14,6 +14,7 @@ class OperatingSystemSetup:
self.env = env self.env = env
self.Partner = env["res.partner"].sudo() self.Partner = env["res.partner"].sudo()
self.Project = env["project.project"].sudo() self.Project = env["project.project"].sudo()
self.Invoice = env["account.move"].sudo()
def run(self): def run(self):
self._promote_existing_customers() self._promote_existing_customers()
@ -23,7 +24,7 @@ class OperatingSystemSetup:
self._ensure_followup_cron_active() self._ensure_followup_cron_active()
def _promote_existing_customers(self): def _promote_existing_customers(self):
invoice_partners = self.env["account.move"].sudo().search( invoice_partners = self.Invoice.search(
[ [
("move_type", "=", "out_invoice"), ("move_type", "=", "out_invoice"),
("state", "=", "posted"), ("state", "=", "posted"),
@ -166,10 +167,12 @@ class OperatingSystemSetup:
limit=1, limit=1,
) )
if not project: if not project:
company = self._project_company(partner, is_internal)
project = self.Project.create( project = self.Project.create(
{ {
"name": project_name, "name": project_name,
"partner_id": partner.id if not is_internal else False, "partner_id": partner.id if not is_internal else False,
"company_id": company.id if company else False,
"allow_timesheets": True, "allow_timesheets": True,
"allow_milestones": True, "allow_milestones": True,
"mcs_delivery_type": delivery_type, "mcs_delivery_type": delivery_type,
@ -186,10 +189,13 @@ class OperatingSystemSetup:
return project return project
values = {} values = {}
company = self._project_company(partner, is_internal)
if not project.partner_id and not is_internal: if not project.partner_id and not is_internal:
values["partner_id"] = partner.id values["partner_id"] = partner.id
if project.partner_id and project.partner_id != partner and not is_internal: if project.partner_id and project.partner_id != partner and not is_internal:
values["partner_id"] = partner.id values["partner_id"] = partner.id
if company and not project.company_id:
values["company_id"] = company.id
if not project.mcs_delivery_type: if not project.mcs_delivery_type:
values["mcs_delivery_type"] = delivery_type values["mcs_delivery_type"] = delivery_type
if not project.mcs_initiative_type: if not project.mcs_initiative_type:
@ -213,6 +219,29 @@ class OperatingSystemSetup:
} }
return mapping.get(delivery_type, "client") return mapping.get(delivery_type, "client")
def _project_company(self, partner, is_internal=False):
if is_internal:
return self.env.company
invoice = self.Invoice.search(
[
("move_type", "=", "out_invoice"),
("state", "=", "posted"),
("commercial_partner_id", "=", partner.commercial_partner_id.id),
("company_id", "!=", False),
],
order="invoice_date desc, id desc",
limit=1,
)
if invoice:
return invoice.company_id
if partner.currency_id:
company = self.env["res.company"].sudo().search(
[("currency_id", "=", partner.currency_id.id)], limit=1
)
if company:
return company
return self.env.company
def _ensure_followup_cron_active(self): def _ensure_followup_cron_active(self):
cron = self.env.ref( cron = self.env.ref(
"mcs_operating_system.ir_cron_mcs_schedule_missing_followups", "mcs_operating_system.ir_cron_mcs_schedule_missing_followups",
@ -241,7 +270,7 @@ class OperatingSystemSetup:
] ]
): ):
has_invoice = bool( has_invoice = bool(
self.env["account.move"].sudo().search_count( self.Invoice.search_count(
[ [
("move_type", "=", "out_invoice"), ("move_type", "=", "out_invoice"),
("state", "=", "posted"), ("state", "=", "posted"),

View File

@ -200,7 +200,7 @@ class McsOperatingDashboard(models.Model):
active_projects = Project.search( active_projects = Project.search(
[("active", "=", True)] [("active", "=", True)]
+ self._company_domain(Project, company_ids, include_shared=True) + self._company_domain(Project, company_ids, include_shared=False)
) )
client_projects = active_projects.filtered( client_projects = active_projects.filtered(
lambda project: project.mcs_delivery_type lambda project: project.mcs_delivery_type
@ -266,7 +266,7 @@ class McsOperatingDashboard(models.Model):
) )
active_tasks = Task.search( active_tasks = Task.search(
[("active", "=", True)] [("active", "=", True)]
+ self._company_domain(Task, company_ids, include_shared=True) + self._company_domain(Task, company_ids, include_shared=False)
) )
monthly_target = sum(active_projects.mapped("mcs_monthly_revenue_target")) monthly_target = sum(active_projects.mapped("mcs_monthly_revenue_target"))
@ -702,7 +702,7 @@ class McsOperatingDashboard(models.Model):
"view_mode": "tree,form,kanban", "view_mode": "tree,form,kanban",
"views": self._action_views("tree", "form", "kanban"), "views": self._action_views("tree", "form", "kanban"),
"domain": [("active", "=", True), ("mcs_monthly_revenue_target", ">", 0)] "domain": [("active", "=", True), ("mcs_monthly_revenue_target", ">", 0)]
+ self._company_domain(Project, company_ids, include_shared=True), + self._company_domain(Project, company_ids, include_shared=False),
}, },
"contracted_projects": { "contracted_projects": {
"type": "ir.actions.act_window", "type": "ir.actions.act_window",
@ -711,7 +711,7 @@ class McsOperatingDashboard(models.Model):
"view_mode": "tree,form,kanban", "view_mode": "tree,form,kanban",
"views": self._action_views("tree", "form", "kanban"), "views": self._action_views("tree", "form", "kanban"),
"domain": [("active", "=", True), ("mcs_contracted_revenue", ">", 0)] "domain": [("active", "=", True), ("mcs_contracted_revenue", ">", 0)]
+ self._company_domain(Project, company_ids, include_shared=True), + self._company_domain(Project, company_ids, include_shared=False),
}, },
"pipeline": { "pipeline": {
"type": "ir.actions.act_window", "type": "ir.actions.act_window",
@ -763,7 +763,7 @@ class McsOperatingDashboard(models.Model):
("active", "=", True), ("active", "=", True),
("mcs_portfolio_health", "in", ["at_risk", "blocked"]), ("mcs_portfolio_health", "in", ["at_risk", "blocked"]),
] ]
+ self._company_domain(Project, company_ids, include_shared=True), + self._company_domain(Project, company_ids, include_shared=False),
}, },
"ceo_actions": { "ceo_actions": {
"type": "ir.actions.act_window", "type": "ir.actions.act_window",
@ -780,7 +780,7 @@ class McsOperatingDashboard(models.Model):
"view_mode": "tree,form,kanban", "view_mode": "tree,form,kanban",
"views": self._action_views("tree", "form", "kanban"), "views": self._action_views("tree", "form", "kanban"),
"domain": [("mcs_delivery_type", "in", ["internal_product", "internal_r_and_d"])] "domain": [("mcs_delivery_type", "in", ["internal_product", "internal_r_and_d"])]
+ self._company_domain(Project, company_ids, include_shared=True), + self._company_domain(Project, company_ids, include_shared=False),
}, },
} }