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.
 
 
 
 
 

189 lines
8.0 KiB

# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Anusha P P @ cybrosys and Niyas Raphy @ cybrosys(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 fields, models, api, _
class Appointment(models.Model):
_name = 'lab.appointment'
_inherit = ['mail.thread']
_rec_name = 'name'
_description = "Appointment"
_order = 'appointment_date'
user_id = fields.Many2one('res.users', 'Responsible', readonly=True)
patient_id = fields.Many2one('lab.patient', string='Patient', required=True, select=True,
help='Patient Name')
name = fields.Char(string='Appointment ID', readonly=True, default=lambda self: _('New'))
date = fields.Datetime(string='Requested Date', default=lambda s: fields.Datetime.now(),
help="This is the 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', select=True)
comment = fields.Text(string='Comments')
appointment_lines = fields.One2many('lab.appointment.lines', 'test_line_appointment', string="Test Request")
request_count = fields.Integer(compute="_compute_state", string='# of Requests', copy=False, default=0)
inv_count = fields.Integer(compute="_compute_state", 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, track_visibility='onchange', default='draft',
)
priority = fields.Selection([
('0', 'Low'),
('1', 'Normal'),
('2', 'High')
], size=1)
_defaults = {
'priority': '0',
}
@api.model
def create(self, vals):
if vals:
vals['name'] = self.env['ir.sequence'].next_by_code('lab.appointment') or _('New')
result = super(Appointment, self).create(vals)
return result
def _compute_state(self):
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', '=', obj.id)])
def create_invoice(self):
invoice_obj = self.env["account.move"]
invoice_line_obj = self.env["account.move.line"]
journal = self.env['account.journal'].search([('type', '=', 'sale')], limit=1)
prd_account_id = journal.default_account_id.id
for lab in self:
lab.write({'state': 'to_invoice'})
if lab.patient_id:
curr_invoice = {
'partner_id': lab.patient_id.patient.id,
'state': 'draft',
'move_type': 'out_invoice',
'invoice_date': str(datetime.datetime.now()),
'invoice_origin': "Lab Test# : " + lab.name,
'lab_request': lab.id,
'is_lab_invoice': True,
}
inv_ids = invoice_obj.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_lines:
for line in lab.appointment_lines:
list_value.append((0,0, {
'name': line.lab_test.lab_test,
'price_unit': line.cost,
'quantity': 1.0,
'account_id': prd_account_id,
'move_id': inv_id,
}))
print(list_value)
inv_ids.write({'invoice_line_ids': list_value})
self.write({'state': 'invoiced'})
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):
if self.appointment_lines:
for line in self.appointment_lines:
data = self.env['lab.test'].search([('lab_test', '=', line.lab_test.lab_test)])
self.env['lab.request'].create({'lab_request_id': self.name,
'app_id': self.id,
'lab_requestor': self.patient_id.id,
'lab_requesting_date': self.appointment_date,
'test_request': line.lab_test.id,
'request_line': [(6, 0, [x.id for x in data.test_lines])],
})
self.state = 'request_lab'
else:
raise UserError(_('Please Select Lab Test.'))
def confirm_appointment(self):
message_body = "Dear " + self.patient_id.patient.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': self.env.user.company_id.email,
'email_to': self.patient_id.email
}
template_id = template_obj.create(template_data)
template_obj.send(template_id)
self.write({'state': 'confirm'})
def cancel_appointment(self):
return self.write({'state': 'cancel'})
class LabAppointmentLines(models.Model):
_name = 'lab.appointment.lines'
_description = 'Lab Appointment '
lab_test = fields.Many2one('lab.test', string="Test")
cost = fields.Float(string="Cost")
requesting_date = fields.Date(string="Date")
test_line_appointment = fields.Many2one('lab.appointment', string="Appointment")
@api.onchange('lab_test')
def cost_update(self):
if self.lab_test:
self.cost = self.lab_test.test_cost
class LabPatientInherit(models.Model):
_inherit = 'lab.patient'
app_count = fields.Integer(compute="_compute_state", string='# of Appointments', copy=False, default=0)
def _compute_state(self):
for obj in self:
obj.app_count = self.env['lab.appointment'].search_count([('patient_id', '=', obj.id)])