You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
212 lines
9.0 KiB
212 lines
9.0 KiB
# -*- coding: utf-8 -*-
|
|
#############################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
|
|
# Author: Gayathri V (odoo@cybrosys.com)
|
|
#
|
|
# You can modify it under the terms of the GNU AFFERO
|
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
|
|
#
|
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
|
|
# (AGPL v3) along with this program.
|
|
# If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
#############################################################################
|
|
import datetime
|
|
from odoo.exceptions import UserError
|
|
from odoo import api, fields, models, _
|
|
|
|
|
|
class LabAppointment(models.Model):
|
|
"""
|
|
Model for managing lab appointments.This class defines the structure a
|
|
nd behavior of lab appointments, including the creation of invoices and
|
|
lab test requests.
|
|
"""
|
|
_name = 'lab.appointment'
|
|
_inherit = ['mail.thread']
|
|
_description = "Appointment"
|
|
_order = 'appointment_date'
|
|
|
|
user_id = fields.Many2one('res.users', help="Responsible user",
|
|
string='Responsible', readonly=True)
|
|
patient_id = fields.Many2one('lab.patient',
|
|
string='Patient', required=True,
|
|
help='Patient Name')
|
|
name = fields.Char(string='Appointment ID', readonly=True,
|
|
default=lambda self: _('New'),
|
|
help='Name of the lab appointment')
|
|
date = fields.Datetime(string='Requested Date',
|
|
default=lambda s: fields.Datetime.now(),
|
|
help="Date in which patient appointment is noted")
|
|
appointment_date = fields.Datetime(string='Appointment Date',
|
|
default=lambda s: fields.Datetime.now(),
|
|
help="This is the appointment date")
|
|
physician_id = fields.Many2one('res.partner',
|
|
string='Referred By',
|
|
help="Physician referred by")
|
|
comment = fields.Text(string='Comments', help="Extra information")
|
|
appointment_line_ids = fields.One2many('lab.appointment.lines',
|
|
'test_line_appointment_id',
|
|
string="Test Request",
|
|
help="Test requests for appointment")
|
|
request_count = fields.Integer(compute="_compute_state",
|
|
string='# of Requests', copy=False,
|
|
default=0,help="Number of Requests")
|
|
inv_count = fields.Integer(compute="_compute_state",help="Number of Invoice",
|
|
string='# of Invoices', copy=False, default=0)
|
|
state = fields.Selection([
|
|
('draft', 'Draft'),
|
|
('confirm', 'Confirmed'),
|
|
('request_lab', 'Lab Requested'),
|
|
('completed', 'Test Result'),
|
|
('to_invoice', 'To Invoice'),
|
|
('invoiced', 'Done'),
|
|
('cancel', 'Cancelled'),
|
|
], string='Status', readonly=True, copy=False, index=True, tracking=True,
|
|
default='draft',
|
|
)
|
|
priority = fields.Selection([
|
|
('0', 'Low'),
|
|
('1', 'Normal'),
|
|
('2', 'High')
|
|
], default='0')
|
|
|
|
|
|
@api.model_create_multi
|
|
def create(self, vals_list):
|
|
"""
|
|
Create a new lab appointment record.This method creates a new lab
|
|
appointment record and assigns a unique appointment ID to it.
|
|
:param self: The record itself.
|
|
:param dict vals_list: A dictionary of values for creating the lab
|
|
appointment record.
|
|
:return: The created lab appointment record.
|
|
:rtype: LabAppointment
|
|
|
|
"""
|
|
for vals in vals_list:
|
|
vals['name'] = self.env['ir.sequence'].next_by_code(
|
|
'lab.appointment') or _('New')
|
|
return super().create(vals_list)
|
|
|
|
def _compute_state(self):
|
|
"""
|
|
Compute the number of test requests and invoices related to the
|
|
appointment.This method calculates and updates the counts of test
|
|
requests and invoices associated with the appointment.
|
|
:param self: The record itself.
|
|
"""
|
|
for obj in self:
|
|
obj.request_count = self.env['lab.request'].search_count(
|
|
[('app_id', '=', obj.id)])
|
|
obj.inv_count = self.env['account.move'].search_count(
|
|
[('lab_request_id', '=', obj.id)])
|
|
|
|
def action_create_invoice(self):
|
|
"""
|
|
Create an invoice for the lab appointment.This method creates an
|
|
invoice for the lab appointment and adds invoice lines for the
|
|
selected lab tests.
|
|
:param self: The record itself.
|
|
"""
|
|
account_move = self.env["account.move"]
|
|
for lab in self:
|
|
lab.write({'state': 'to_invoice'})
|
|
curr_invoice = {
|
|
'partner_id': lab.patient_id.patient_id.id,
|
|
'state': 'draft',
|
|
'move_type': 'out_invoice',
|
|
'invoice_date': str(datetime.datetime.now()),
|
|
'invoice_origin': "Lab Test# : " + lab.name,
|
|
'lab_request_id': lab.id,
|
|
'is_lab_invoice': True,
|
|
}
|
|
inv_ids = account_move.create(curr_invoice)
|
|
inv_id = inv_ids.id
|
|
if inv_ids:
|
|
journal = self.env['account.journal'].search(
|
|
[('type', '=', 'sale')], limit=1)
|
|
prd_account_id = journal.default_account_id.id
|
|
list_value = []
|
|
if lab.appointment_line_ids:
|
|
for line in lab.appointment_line_ids:
|
|
list_value.append((0, 0, {
|
|
'name': line.lab_test_id.lab_test,
|
|
'price_unit': line.cost,
|
|
'quantity': 1.0,
|
|
'account_id': prd_account_id,
|
|
'move_id': inv_id,
|
|
}))
|
|
inv_ids.write({'invoice_line_ids': list_value})
|
|
view_id = self.env.ref('account.view_move_form').id
|
|
return {
|
|
'view_mode': 'form',
|
|
'res_model': 'account.move',
|
|
'view_id': view_id,
|
|
'type': 'ir.actions.act_window',
|
|
'name': _('Lab Invoices'),
|
|
'res_id': inv_id
|
|
}
|
|
|
|
def action_request(self):
|
|
"""
|
|
Create lab test requests for the selected lab tests.This method
|
|
creates lab test requests for the selected lab tests associated
|
|
with the appointment
|
|
:param self: The record itself.
|
|
"""
|
|
if self.appointment_line_ids:
|
|
for line in self.appointment_line_ids:
|
|
lab_test = self.env['lab.test'].search(
|
|
[('lab_test', '=', line.lab_test_id.lab_test)])
|
|
self.env['lab.request'].create(
|
|
{'lab_request_id': self.name,
|
|
'app_id': self.id,
|
|
'lab_requestor_id': self.patient_id.id,
|
|
'lab_requesting_date': self.appointment_date,
|
|
'test_request_id': line.lab_test_id.id,
|
|
'request_line_ids': [(6, 0,
|
|
[x.id for x in lab_test.test_lines_ids])],
|
|
})
|
|
self.state = 'request_lab'
|
|
else:
|
|
raise UserError(_('Please Select Lab Test.'))
|
|
|
|
def action_confirm_appointment(self):
|
|
"""
|
|
Confirm the lab appointment and send a confirmation email to the
|
|
patient.
|
|
:param self: The record itself.
|
|
"""
|
|
message_body = ("Dear " +
|
|
self.patient_id.name + "," +
|
|
"<br>Your Appointment Has been Confirmed " +
|
|
"<br>Appointment ID : " + self.name +
|
|
"<br>Date : " + str(self.appointment_date) +
|
|
'<br><br>Thank you')
|
|
template_obj = self.env['mail.mail']
|
|
template_data = {
|
|
'subject': 'Appointment Confirmation',
|
|
'body_html': message_body,
|
|
'email_from': 'michaelmorbius915@gmail.com',
|
|
'email_to': self.patient_id.email
|
|
}
|
|
template_id = template_obj.create(template_data)
|
|
template_obj.send(template_id)
|
|
self.write({'state': 'confirm'})
|
|
|
|
def action_cancel_appointment(self):
|
|
"""
|
|
Cancel the lab appointment.This method cancels the lab appointment
|
|
by setting its state to 'cancel'.
|
|
:param self: The record itself.
|
|
"""
|
|
return self.write({'state': 'cancel'})
|
|
|