Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[16.0] [MIG] medical_queue_management: Migration to 16.0 #374

Merged
merged 18 commits into from
Feb 20, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions medical_queue_management/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
TO DO
2 changes: 2 additions & 0 deletions medical_queue_management/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import models
from . import wizards
39 changes: 39 additions & 0 deletions medical_queue_management/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Copyright 2023 CreuBlanca
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

{
"name": "Medical Queue Management",
"summary": """
Manage patients with queue""",
"version": "16.0.1.0.0",
"license": "AGPL-3",
"author": "CreuBlanca",
"website": "https://github.com/tegin/cb-medical",
"depends": [
"queue_management_display",
"cb_medical_careplan_sale",
"web_ir_actions_act_multi",
],
"data": [
"views/queue_location.xml",
"views/queue_location_action.xml",
"views/queue_location_group.xml",
"wizards/medical_careplan_add_plan_definition.xml",
"wizards/queue_token_location_kanban_assign.xml",
"views/queue_token_location.xml",
"views/queue_token.xml",
"views/res_partner_queue_location.xml",
"views/res_partner.xml",
"security/ir.model.access.csv",
"views/queue_area.xml",
"views/queue_location_area.xml",
"views/workflow_plan_definition.xml",
"views/medical_request_group.xml",
"views/medical_encounter.xml",
],
"demo": [],
"qweb": [],
"assets": {
"web.assets_backend": ["/medical_queue_management/static/src/**/*.scss"],
},
}
19 changes: 19 additions & 0 deletions medical_queue_management/migrations/14.0.1.1.0/post-migration.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Copyright 2024 Creu Blanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from openupgradelib import openupgrade


@openupgrade.migrate()
def migrate(env, version):
openupgrade.logged_query(
env.cr,
"""
UPDATE medical_request_group mrg
SET generate_queue_task = wpd.generate_queue_task,
queue_area_id = wpd.queue_area_id
FROM workflow_plan_definition wpd
WHERE wpd.id = mrg.plan_definition_id
AND mrg.plan_definition_action_id IS NULL
AND mrg.queue_token_location_id IS NOT NULL
""",
)
12 changes: 12 additions & 0 deletions medical_queue_management/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from . import medical_encounter
from . import medical_request_group
from . import workflow_plan_definition
from . import queue_location_area
from . import queue_area
from . import res_partner
from . import res_partner_queue_location
from . import queue_token
from . import queue_token_location
from . import queue_location_group
from . import queue_location_action
from . import queue_location
22 changes: 22 additions & 0 deletions medical_queue_management/models/medical_encounter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Copyright 2023 CreuBlanca
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import fields, models


class MedicalEncounter(models.Model):

_inherit = "medical.encounter"

queue_token_id = fields.Many2one("queue.token", readonly=True)

def _generate_token_vals(self):
return {}

def _get_queue_token(self):
self.ensure_one()
if not self.queue_token_id:
self.queue_token_id = self.env["queue.token"].create(
self._generate_token_vals()
)
return self.queue_token_id
95 changes: 95 additions & 0 deletions medical_queue_management/models/medical_request_group.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# Copyright 2023 CreuBlanca
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import _, api, fields, models
from odoo.exceptions import ValidationError


class MedicalRequestGroup(models.Model):

_inherit = "medical.request.group"

queue_token_location_id = fields.Many2one("queue.token.location", readonly=True)
generate_queue_task = fields.Selection(
selection=lambda r: r.env["workflow.plan.definition"]
._fields["generate_queue_task"]
.selection
)
queue_area_id = fields.Many2one("queue.area")

@api.constrains("performer_id", "center_id", "encounter_id", "fhir_state")
def _check_queue_token(self):
for record in self:
record._review_queue_token()

def _clean_queue_token(self):
if self.queue_token_location_id:
# TODO: Maybe we should cancell in-progress or finished jobs, isn't it :S
if self.queue_token_location_id.state == "draft":
self.queue_token_location_id.state = "cancelled"
self.queue_token_location_id = False
return False

def _review_queue_token(self):
if self.fhir_state == "cancelled":
return self._clean_queue_token()
if not self.generate_queue_task:
return self._clean_queue_token()
return getattr(self, "_review_queue_token_%s" % self.generate_queue_task)()

def _review_queue_token_performer(self):
location_area = self.performer_id.queue_location_ids.filtered(
lambda r: r.center_id == self.center_id
)
if not location_area:
location_area = self.performer_id.queue_location_ids.filtered(
lambda r: not r.center_id
)
if not location_area:
return self._clean_queue_token()
return self._manage_queue_token(
location=location_area.location_id, group=location_area.group_id
)

def _review_queue_token_area(self):
area = self.queue_area_id
location_area = area.location_ids.filtered(
lambda r: r.center_id == self.center_id
)
if not location_area:
return self._clean_queue_token()
return self._manage_queue_token(
location=location_area.location_id, group=location_area.group_id
)

def _manage_queue_token(self, location=False, group=False):
if not location and not group:
return self._clean_queue_token()
if location and group:
raise ValidationError(
_("Location and Group cannot be defined at the same time")
)
if self.queue_token_location_id:
if self.queue_token_location_id.state in ["draft"]:
self.queue_token_location_id.write(
{
"location_id": location and location.id,
"group_id": group and group.id,
}
)
return self.queue_token_location_id
return self._create_queue_token(location=location, group=group)

def _create_queue_token(self, location=False, group=False):
self.queue_token_location_id = self.env["queue.token.location"].create(
self._create_queue_token_vals(location=location, group=group)
)
return self.queue_token_location_id

def _create_queue_token_vals(self, location=False, group=False):
token = self.encounter_id._get_queue_token()
return {
"group_id": group and group.id,
"location_id": location and location.id,
"token_id": token.id,
}
14 changes: 14 additions & 0 deletions medical_queue_management/models/queue_area.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Copyright 2023 CreuBlanca
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import fields, models


class QueueArea(models.Model):

_name = "queue.area"
_description = "Queue Area"

name = fields.Char(required=True)
active = fields.Boolean(default=True)
location_ids = fields.One2many("queue.location.area", inverse_name="area_id")
12 changes: 12 additions & 0 deletions medical_queue_management/models/queue_location.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Copyright 2024 Dixmit
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import fields, models


class QueueLocation(models.Model):

_inherit = "queue.location"

action_ids = fields.Many2many("queue.location.action")
allows_flag = fields.Boolean()
17 changes: 17 additions & 0 deletions medical_queue_management/models/queue_location_action.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Copyright 2024 Dixmit
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import fields, models


class QueueLocationAction(models.Model):

_name = "queue.location.action"
_description = "Queue Location Action" # TODO
_order = "sequence asc"
_inherit = ["mail.thread", "mail.activity.mixin"]

sequence = fields.Integer()
name = fields.Char()
icon = fields.Char()
color = fields.Char()
24 changes: 24 additions & 0 deletions medical_queue_management/models/queue_location_area.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Copyright 2023 CreuBlanca
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import fields, models


class QueueLocationArea(models.Model):
_name = "queue.location.area"
_description = "Location Area"

area_id = fields.Many2one("queue.area", required=True)
center_id = fields.Many2one(
"res.partner", domain=[("is_center", "=", True)], required=True
)
location_id = fields.Many2one("queue.location")
group_id = fields.Many2one("queue.location.group")

_sql_constraints = [
(
"center_area_uniq",
"UNIQUE(area_id, center_id)",
"Center for each area must be unique!",
),
]
11 changes: 11 additions & 0 deletions medical_queue_management/models/queue_location_group.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Copyright 2024 Dixmit
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import fields, models


class QueueLocationGroup(models.Model):

_inherit = "queue.location.group"

color = fields.Char()
33 changes: 33 additions & 0 deletions medical_queue_management/models/queue_token.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Copyright 2023 Dixmit
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import api, fields, models


class QueueToken(models.Model):

_inherit = "queue.token"

encounter_ids = fields.One2many("medical.encounter", inverse_name="queue_token_id")
encounter_count = fields.Integer(compute="_compute_encounter_count")

@api.depends("encounter_ids")
def _compute_encounter_count(self):
for record in self:
record.encounter_count = len(record.encounter_ids)

def view_encounter(self):
self.ensure_one()
encounter = self.encounter_ids
encounter.ensure_one()
action = self.env["ir.actions.act_window"]._for_xml_id(
"medical_administration_encounter.action_encounter_medical_his"
)
action["res_id"] = encounter.id
action["view_mode"] = "form"
action["views"] = [
(view_id, view_mode)
for view_id, view_mode in action["views"]
if view_mode == "form"
]
return action
Loading