diff --git a/dental_clinical_management/README.rst b/dental_clinical_management/README.rst new file mode 100755 index 000000000..3b39f6297 --- /dev/null +++ b/dental_clinical_management/README.rst @@ -0,0 +1,50 @@ +.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg + :target: https://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +Dental Clinic Management +======================== +Dental Clinic Management is to manage the entire Dental Clinic. + +Configuration +============= +* No additional configuration required + +License +------- +GNU AFFERO GENERAL PUBLIC LICENSE v3.0 (AGPL-3) +(https://www.gnu.org/licenses/agpl-3.0-standalone.html) + +Company +------- +* `Cybrosys Techno Solutions `__ + +Credits +------- +* Developer: (V17) Kailas Krishna, + (V16) Nihala KP + (V15) Nihala KP + Contact: odoo@cybrosys.com + +Contacts +-------- +* Mail Contact : odoo@cybrosys.com +* Website : https://cybrosys.com + +Bug Tracker +----------- +Bugs are tracked on GitHub Issues. In case of trouble, please check there if +your issue has already been reported. + +Maintainer +========== +.. image:: https://cybrosys.com/images/logo.png + :target: https://cybrosys.com + +This module is maintained by Cybrosys Technologies. + +For support and more information, please visit `Our Website `__ + +Further information +=================== +HTML Description: ``__ diff --git a/dental_clinical_management/__init__.py b/dental_clinical_management/__init__.py new file mode 100644 index 000000000..5b6f8fcc1 --- /dev/null +++ b/dental_clinical_management/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from . import controllers +from . import models +from . import wizard diff --git a/dental_clinical_management/__manifest__.py b/dental_clinical_management/__manifest__.py new file mode 100644 index 000000000..459637ddb --- /dev/null +++ b/dental_clinical_management/__manifest__.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +{ + 'name': 'Dental Clinic Management', + 'version': '15.0.1.0.0', + 'category': 'Industries', + 'summary': """Dental Clinic Management is to manage the entire dental clinic.""", + 'description': """Dental Clinic Management software, dental clinics can + enhance efficiency, improve patient care, optimize resource utilization, + and maintain smooth operations.""", + 'author': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'maintainer': 'Cybrosys Techno Solutions', + 'website': "https://www.cybrosys.com", + 'depends': ['hr', 'website', 'mail', 'sale_management', 'purchase', + 'stock'], + 'assets': { + 'web.assets_frontend': [ + "/dental_clinical_management/static/src/js/dental_clinic.js" + ] + }, + 'data': [ + 'security/dental_clinical_management_groups.xml', + 'security/dental_clinical_management_security.xml', + 'security/ir.model.access.csv', + 'data/ir_sequence.xml', + 'data/dental_department_data.xml', + 'data/dental_specialist_data.xml', + 'data/treatment_category_data.xml', + 'data/dental_treatment_data.xml', + 'data/medical_questions_data.xml', + 'data/insurance_company_data.xml', + 'data/medicine_frequency_data.xml', + 'data/dental_time_shift_data.xml', + 'data/website_menu.xml', + 'views/dental_time_shift_views.xml', + 'views/dental_department_views.xml', + 'views/dental_doctor_views.xml', + 'views/dental_patients_views.xml', + 'views/dental_prescription_views.xml', + 'views/dental_medicine_views.xml', + 'views/dental_specialist_views.xml', + 'views/dental_treatment_views.xml', + 'views/insurance_company_views.xml', + 'views/medicine_frequency_views.xml', + 'views/medical_questions_views.xml', + 'views/treatment_category_views.xml', + 'views/dental_appointment_views.xml', + 'views/patient_portal_template.xml', + 'views/dental_clinic_template.xml', + 'report/dental_appointment_card.xml', + 'report/dental_prescription_templates.xml', + 'report/dental_prescription_report.xml', + 'wizard/xray_report_views.xml', + 'views/dental_clinical_management_menu.xml', + ], + 'images': ['static/description/banner.png'], + 'license': 'AGPL-3', + 'installable': True, + 'auto_install': False, + 'application': True, +} diff --git a/dental_clinical_management/controllers/__init__.py b/dental_clinical_management/controllers/__init__.py new file mode 100644 index 000000000..f4c0fd7f3 --- /dev/null +++ b/dental_clinical_management/controllers/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from . import dental_clinic +from . import patient_portal diff --git a/dental_clinical_management/controllers/dental_clinic.py b/dental_clinical_management/controllers/dental_clinic.py new file mode 100644 index 000000000..9fce99d44 --- /dev/null +++ b/dental_clinical_management/controllers/dental_clinic.py @@ -0,0 +1,148 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from odoo.exceptions import UserError +from odoo import _, http +from odoo.http import Controller, request, route + + +class DentalClinic(Controller): + """Controller for a dental clinic website that allows users to view clinic + details and schedule appointments online.""" + + @route('/dental_doctor', auth='public', website=True) + def dental_clinic(self): + """Renders the dental clinic page with patient, specialist, + and doctor information. This method retrieves the current user's + partner ID as the patient ID, fetches all records from the + `dental.specialist` model, and all records from the `hr.employee` + model to display on the dental clinic webpage.""" + patient_id = request.env.user.partner_id + specialised_id = request.env['dental.specialist'].sudo().search([]) + doctor_id = request.env['hr.employee'].sudo().search([]) + return request.render( + 'dental_clinical_management.website_dental_template', + {'patient_id': patient_id, + 'specialised_id': specialised_id, + 'doctor_id': doctor_id}) + + @route('/create/appointment', auth='public', website=True) + def create_appointment(self, **kw): + """To create a new appointment from website""" + appointment_exists = request.env['dental.appointment'].sudo().search( + [('patient_id', '=', int(kw.get('patient'))), + ('doctor_id', '=', int(kw.get('doctor'))), + ('date', '=', kw.get('date')), + ('shift_id', '=', int(kw.get('time_shift')))]) + + if appointment_exists: + return request.render( + 'dental_clinical_management.website_dental_scheduled_template', + ) + if len(kw.get('time_shift')) == 0: + raise UserError(_('Doctor Does not have the available appointment')) + else: + patient_appointment = request.env[ + 'dental.appointment'].sudo().create({ + 'patient_id': kw.get('patient'), + 'patient_phone': kw.get('phone'), + 'patient_age': kw.get('age'), + 'specialist_id': kw.get('specialization', False), + 'doctor_id': kw.get('doctor'), + 'shift_id': kw.get('time_shift'), + 'date': kw.get('date'), + }) + return request.redirect( + f'/success_appointment?token={patient_appointment.token_no}' + f'&doctor_id={patient_appointment.doctor_id}' + f'&sequence_no={patient_appointment.sequence_no}') + + @route('/success_appointment', auth='public', website=True) + def success_appointment(self, **kwargs): + """Return when appointment creation is success""" + return request.render( + 'dental_clinical_management.website_rental_success_template', + {'token': kwargs}) + + @http.route('/dental_clinic/appointment_card/', + type='http', auth="public", website=True) + def appointment_card(self, token): + """To download the appointment card for patients for doctor's + appointment""" + appointment = request.env['dental.appointment'].sudo().search( + [('sequence_no', '=', token)]) + if not appointment.exists(): + return request.not_found() + data = { + 'website': True, + 'token': appointment.token_no, + 'doctor': appointment.doctor_id.name, + 'specialised': appointment.specialist_id.name, + 'appointment_time': appointment.shift_id.name, + 'date': appointment.date, + } + report_action = request.env.ref( + 'dental_clinical_management.action_appointment_card') + pdf_content, _ = report_action.sudo()._render_qweb_pdf( + 'dental_clinical_management.appointment_card', data=data) + pdf_http_headers = [('Content-Type', 'application/pdf'), + ('Content-Length', len(pdf_content))] + return request.make_response(pdf_content, headers=pdf_http_headers) + + @route('/patient_details', type="json", auth='public', website=True) + def get_patient_details(self, patient_id): + """Retrieve and return details of a specific patient by their ID. + This method accesses the `res.partner` model, retrieves a patient + record by the given ID, and returns selected fields of the patient + such as phone number and age. + Args: + patient_id (int): The unique identifier of the patient.""" + patient = request.env['res.partner'].sudo().browse(int(patient_id)) + return patient.read(fields=['phone', 'patient_age']) + + @route('/specialised_doctors', type="json", auth='public', website=True) + def get_specialised_doctors(self, specialised_id): + """To get the list of doctors based on their specialisation""" + domain = [] + if specialised_id: + domain = [('specialised_in_id', '=', int(specialised_id))] + doctors = request.env['hr.employee'].sudo().search_read(domain, + ["name"]) + return doctors + + @route('/doctors_shifts', type="json", auth='public', website=True) + def get_doctors_shifts(self, doctor_id): + """To get the particular doctor time slots""" + doctors_shift = request.env['hr.employee'].sudo().browse( + int(doctor_id)).time_shift_ids + time_shifts = [{"id": rec.id, "name": rec.name} for rec in + doctors_shift] + return time_shifts + + @route('/all_doctors', auth='public', website=True) + def get_all_doctors(self): + """To list all the doctors""" + doctor_id = request.env['hr.employee'].sudo().search([]) + + return request.render('dental_clinical_management.website_all_doctors', + {'doctor_ids': doctor_id}) + + diff --git a/dental_clinical_management/controllers/patient_portal.py b/dental_clinical_management/controllers/patient_portal.py new file mode 100644 index 000000000..23b5a3a2a --- /dev/null +++ b/dental_clinical_management/controllers/patient_portal.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from odoo import http +from odoo.http import request +from odoo.addons.portal.controllers import portal + + +class PatientPortal(portal.CustomerPortal): + """Provide portal access for patients to view their treatment + details, prescriptions, and invoices.""" + + def _prepare_home_portal_values(self, counters): + """Extends the base method to include the count of dental prescriptions + in the returned dictionary if requested. + Args: + counters (list): A list of strings indicating which counts to + include in the response.""" + values = super()._prepare_home_portal_values(counters) + if 'prescriptions_count' in counters: + prescriptions_count = request.env[ + 'dental.prescription'].sudo().search_count([]) + values['prescriptions_count'] = prescriptions_count + return values + + @http.route(['/my/prescriptions'], type='http', auth="user", website=True) + def portal_my_prescriptions(self, **kwargs): + """Renders the prescriptions page for the logged-in user based on + their role. Managers see all prescriptions, doctors see their own, + and patients see their own prescriptions.""" + if (request.env.ref( + 'dental_clinical_management.group_dental_manager') in + request.env.user.groups_id): + domain = [] + elif (request.env.ref( + 'dental_clinical_management.group_dental_doctor') in + request.env.user.groups_id): + domain = [('prescribed_doctor_id', '=', + request.env.user.partner_id.employee_ids.id)] + else: + domain = [('patient_id', '=', request.env.user.partner_id.id)] + prescriptions = request.env['dental.prescription'].sudo().search(domain) + return request.render( + "dental_clinical_management.portal_my_prescriptions", + {'prescriptions': prescriptions, 'page_name': 'prescriptions'}) + + @http.route(['/view/prescriptions/'], + type='http', auth="public", website=True) + def view_prescriptions(self, id): + """View prescriptions based on the provided ID. + :param id: The ID of the prescription to view. + :return: Rendered template with prescription details.""" + prescription = request.env['dental.prescription'].browse(id) + return request.render( + 'dental_clinical_management.prescription_portal_template', + {'prescription_details': prescription, 'page_name': 'prescription'}) diff --git a/dental_clinical_management/data/dental_department_data.xml b/dental_clinical_management/data/dental_department_data.xml new file mode 100644 index 000000000..9a66fb9de --- /dev/null +++ b/dental_clinical_management/data/dental_department_data.xml @@ -0,0 +1,15 @@ + + + + + + Clinical Department + + + Telehealth Department + + + Quality Assurance + + + diff --git a/dental_clinical_management/data/dental_specialist_data.xml b/dental_clinical_management/data/dental_specialist_data.xml new file mode 100644 index 000000000..e2f9715d3 --- /dev/null +++ b/dental_clinical_management/data/dental_specialist_data.xml @@ -0,0 +1,18 @@ + + + + + + Orthodontist + ORTHO + + + Periodontist + PEROD + + + Endodontist + ENDO + + + diff --git a/dental_clinical_management/data/dental_time_shift_data.xml b/dental_clinical_management/data/dental_time_shift_data.xml new file mode 100644 index 000000000..333f98294 --- /dev/null +++ b/dental_clinical_management/data/dental_time_shift_data.xml @@ -0,0 +1,26 @@ + + + + + + morning + 06 + 09 + + + evening + 17 + 20 + + + day + 10 + 12 + + + night + 20 + 22 + + + \ No newline at end of file diff --git a/dental_clinical_management/data/dental_treatment_data.xml b/dental_clinical_management/data/dental_treatment_data.xml new file mode 100644 index 000000000..7445e7eb0 --- /dev/null +++ b/dental_clinical_management/data/dental_treatment_data.xml @@ -0,0 +1,26 @@ + + + + + + Teeth Whitening + + + + Gum Contouring + + + + Dental Fillings + + + + Dental Cleanings + + + + Routine Check-ups and Examinations + + + + diff --git a/dental_clinical_management/data/insurance_company_data.xml b/dental_clinical_management/data/insurance_company_data.xml new file mode 100644 index 000000000..f09dbbc52 --- /dev/null +++ b/dental_clinical_management/data/insurance_company_data.xml @@ -0,0 +1,15 @@ + + + + + + Star Health and Allied Insurance + + + Max Bupa Health Insurance + + + UnitedHealth Group + + + diff --git a/dental_clinical_management/data/ir_sequence.xml b/dental_clinical_management/data/ir_sequence.xml new file mode 100644 index 000000000..350859836 --- /dev/null +++ b/dental_clinical_management/data/ir_sequence.xml @@ -0,0 +1,19 @@ + + + + + Dental Prescription + dental.prescriptions + PRN + 3 + + + + + Dental Appointment + dental.appointment + DAP + 5 + + + diff --git a/dental_clinical_management/data/medical_questions_data.xml b/dental_clinical_management/data/medical_questions_data.xml new file mode 100644 index 000000000..20db541b8 --- /dev/null +++ b/dental_clinical_management/data/medical_questions_data.xml @@ -0,0 +1,26 @@ + + + + + Have you ever had any dental procedures + before? + + + + Do you have any dental concerns or issues? + + + + How often do you brush your teeth? + + + Do you smoke or use any tobacco products? + + + + When was your last dental check up and + cleaning? + + + + \ No newline at end of file diff --git a/dental_clinical_management/data/medicine_frequency_data.xml b/dental_clinical_management/data/medicine_frequency_data.xml new file mode 100644 index 000000000..560cbc800 --- /dev/null +++ b/dental_clinical_management/data/medicine_frequency_data.xml @@ -0,0 +1,30 @@ + + + + + + BD + Twice a day + + + OD + Once in a day + + + TDS + Three times a day + + + QDS + Four times a day + + + HS + Bed Time + + + PC + Before Meals + + + diff --git a/dental_clinical_management/data/treatment_category_data.xml b/dental_clinical_management/data/treatment_category_data.xml new file mode 100644 index 000000000..3135c56a6 --- /dev/null +++ b/dental_clinical_management/data/treatment_category_data.xml @@ -0,0 +1,15 @@ + + + + + + Preventive Dentistry + + + Restorative Dentistry + + + Cosmetic Dentistry + + + diff --git a/dental_clinical_management/data/website_menu.xml b/dental_clinical_management/data/website_menu.xml new file mode 100644 index 000000000..eb97980fc --- /dev/null +++ b/dental_clinical_management/data/website_menu.xml @@ -0,0 +1,17 @@ + + + + + Appointment + /dental_doctor + + 11 + + + + Doctors + /all_doctors + + 12 + + \ No newline at end of file diff --git a/dental_clinical_management/doc/RELEASE_NOTES.md b/dental_clinical_management/doc/RELEASE_NOTES.md new file mode 100644 index 000000000..5dc25e383 --- /dev/null +++ b/dental_clinical_management/doc/RELEASE_NOTES.md @@ -0,0 +1,6 @@ +## Module + +#### 02.11.2024 +#### Version 15.0.1.0.0 +#### ADD +- Initial commit for Dental Clinic Management diff --git a/dental_clinical_management/models/__init__.py b/dental_clinical_management/models/__init__.py new file mode 100644 index 000000000..398ff6936 --- /dev/null +++ b/dental_clinical_management/models/__init__.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from . import dental_appointment +from . import dental_doctor +from . import dental_medicine +from . import dental_patients +from . import dental_prescription +from . import dental_specialist +from . import dental_time_shift +from . import dental_treatment +from . import insurance_company +from . import medical_questionnaire +from . import medical_questions +from . import medicine_frequency +from . import treatment_category diff --git a/dental_clinical_management/models/dental_appointment.py b/dental_clinical_management/models/dental_appointment.py new file mode 100644 index 000000000..0e3a5f140 --- /dev/null +++ b/dental_clinical_management/models/dental_appointment.py @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from odoo import api, fields, models, _ + + +class DentalAppointment(models.Model): + """Patient dental appointment details""" + _name = 'dental.appointment' + _description = "Dental Appointment for patients" + _inherit = "mail.thread" + _rec_name = 'sequence_no' + + sequence_no = fields.Char(string='Sequence No', readonly=True, + default=lambda self: _('New'), + copy=False, + help="Sequence number of appointment") + token_no = fields.Integer(string='Token No', copy=False, + readonly=True, + help="Token number of the appointments") + patient_id = fields.Many2one('res.partner', + string="Patient Name", + domain="[('is_patient', '=', True)]", + copy=False, + required=True, + help="Add the patient") + patient_phone = fields.Char(related="patient_id.phone", string="Phone", + help="Phone number of the patient") + patient_age = fields.Integer(related="patient_id.patient_age", string="Age", + help="Age of the patient") + specialist_id = fields.Many2one('dental.specialist', + string="Doctors Department", + help='Choose the doctors department') + doctor_ids = fields.Many2many('hr.employee', + compute='_compute_doctor_ids', + string="Doctors Data", help="Doctors Data") + doctor_id = fields.Many2one('hr.employee', string="Doctor", + required=True, + domain="[('id', 'in', doctor_ids)]", + help="Name the of the doctor") + time_shift_ids = fields.Many2many('dental.time.shift', + string="Time Shift", + help="Choose the time shift", + compute='_compute_time_shifts') + shift_id = fields.Many2one('dental.time.shift', + string="Booking Time", + domain="[('id','in',time_shift_ids)]", + help="Choose the time shift") + date = fields.Date(string="Date", required=True, + default=fields.date.today(), + help="Date when to take appointment for doctor") + reason = fields.Text(string="Please describe the reason", + help="Just explain about the reason to take doctor " + "appointment") + state = fields.Selection([('draft', 'Draft'), + ('new', 'New Appointment'), + ('done', 'Prescribed'), + ('cancel', 'Cancel')], + default="draft", + string="State", help="state of the appointment") + + @api.model + def create(self, vals): + """Function declared for creating sequence Number for Appointments""" + if vals.get('sequence_no', _('New')) == _('New'): + vals['sequence_no'] = self.env['ir.sequence'].next_by_code( + 'dental.appointment') or _('New') + last_token = self.search( + [('doctor_id', '=', int(vals['doctor_id'])), + ('date', '=', vals['date']), + ('shift_id', '=', int(vals['shift_id']))], + order='id desc', limit=1) + vals['token_no'] = last_token.token_no + 1 if last_token else 1 + res = super(DentalAppointment, self).create(vals) + res.state = 'new' + return res + + def action_create_appointment(self): + """Change the state of the appointment while click create button""" + self.state = 'new' + + @api.depends('doctor_id') + def _compute_time_shifts(self): + """To get the doctors time shift""" + for record in self: + record.time_shift_ids = self.env['dental.time.shift'].search( + [('id', 'in', record.doctor_id.time_shift_ids.ids)]).ids + + @api.depends('specialist_id') + def _compute_doctor_ids(self): + """Searching for doctors based on there specialization""" + for record in self: + if record.specialist_id: + record.doctor_ids = self.env['hr.employee'].search( + [('specialised_in_id', '=', record.specialist_id.id)]).ids + else: + record.doctor_ids = self.env['hr.employee'].search([]).ids + + def action_cancel(self): + """Change the state of the appointment while click cancel button""" + self.state = 'cancel' + + def action_prescription(self): + """Created the action for view the prescriptions + of 'done' state appointments""" + return { + 'type': 'ir.actions.act_window', + 'target': 'inline', + 'name': 'Prescription', + 'view_mode': 'form', + 'res_model': 'dental.prescription', + 'res_id': self.env['dental.prescription'].search([ + ('appointment_id', '=', self.id)], limit=1).id, + } diff --git a/dental_clinical_management/models/dental_doctor.py b/dental_clinical_management/models/dental_doctor.py new file mode 100644 index 000000000..bcd899c0f --- /dev/null +++ b/dental_clinical_management/models/dental_doctor.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from odoo import api, fields, models +from odoo.exceptions import ValidationError + + + +class DentalDoctor(models.Model): + """To add the doctors of the clinic""" + _inherit = 'hr.employee' + + job_position = fields.Char(string="Designation", + help="To add the job position of the doctor") + specialised_in_id = fields.Many2one('dental.specialist', + string='Specialised In', + help="Add the doctor specialised", required="1") + dob = fields.Date(string="Date of Birth", + required=True, + help="DOB of the patient") + doctor_age = fields.Integer(compute='_compute_doctor_age', + store=True, + string="Age", + help="Age of the Doctor") + sex = fields.Selection([('male', 'Male'), + ('female', 'Female')], + string="Sex", + help="Sex of the patient") + time_shift_ids = fields.Many2many('dental.time.shift', + string="Time Shift", + help="Time shift of the doctor") + + @api.constrains('specialised_in_id') + def _check_shift(self): + for record in self: + if record.specialised_in_id and not record.time_shift_ids: + raise ValidationError("At least one shift must be assigned to the doctor.") + + + @api.model + def create(self, vals_list): + res = super(DentalDoctor, self).create(vals_list) + self.env['res.partner'].create({ + 'name': vals_list['name'], + 'email': vals_list['work_email'], + 'phone': vals_list['work_phone'], + }) + return res + + def unlink(self): + """Delete the corresponding user from 'res.users' while + deleting the doctor""" + for record in self: + self.env['res.users'].search([ + ('id', '=', record.user_id.id)]).unlink() + res = super(DentalDoctor, self).unlink() + return res + + @api.depends('dob') + def _compute_doctor_age(self): + """To calculate the age of the doctor from the DOB""" + for record in self: + record.doctor_age = (fields.date.today().year - record.dob.year - + ((fields.date.today().month, + fields.date.today().day) < + (record.dob.month, + record.dob.day))) if record.dob else False diff --git a/dental_clinical_management/models/dental_medicine.py b/dental_clinical_management/models/dental_medicine.py new file mode 100644 index 000000000..438074469 --- /dev/null +++ b/dental_clinical_management/models/dental_medicine.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from odoo import fields, models + + +class DentalMedicine(models.Model): + """For creating the medicines used in the dental clinic""" + _inherit = 'product.template' + + is_medicine = fields.Boolean('Is Medicine', + help="If the product is a Medicine") + generic_name = fields.Char(string="Generic Name", + required=True, + help="Generic name of the medicament") + dosage_strength = fields.Integer(string="Dosage Strength", + required=True, + help="Dosage strength of medicament") diff --git a/dental_clinical_management/models/dental_patients.py b/dental_clinical_management/models/dental_patients.py new file mode 100644 index 000000000..1a3ea5ff8 --- /dev/null +++ b/dental_clinical_management/models/dental_patients.py @@ -0,0 +1,129 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from odoo import api, fields, models, _ +from odoo.exceptions import UserError +from odoo.tools import email_normalize + + +class DentalPatients(models.Model): + """To create Patients in the clinic, use res.partner model and customize it""" + _inherit = 'res.partner' + + company_type = fields.Selection(selection_add=[('person', 'Patient'), + ('company', 'Medicine ' + 'Distibutor')], + help="Patient type") + dob = fields.Date(string="Date of Birth", + help="DOB of the patient") + patient_age = fields.Integer(compute='_compute_patient_age', + store=True, + string="Age", + help="Age of the patient") + sex = fields.Selection([('male', 'Male'), ('female', 'Female')], + string="Sex", + help="Sex of the patient") + insurance_company_id = fields.Many2one('insurance.company', + string="Insurance Company", + help="Mention the insurance company") + start_date = fields.Date(string="Member Since", + help="Patient insurance start date") + expiration_date = fields.Date(string="Expiration Date", + help="Patient insurance expiration date") + insureds_name = fields.Char(string="Insured's Name", + help="Name of the insured's") + identification_number = fields.Char(string="Identification Number", + help="Identification Number of " + "insured's") + is_patient = fields.Boolean(string="Is Patient", + help="To set it's a patient") + medical_questionnaire_ids = fields.One2many('medical.questionnaire', + 'patient_id', + readonly=False, + help="connect model medical " + "questionnaire in " + "patients") + report_ids = fields.One2many('xray.report', 'patient_id', + string='X-Ray', + help="To add the xray reports of the patient") + + @api.model + def create(self, vals): + """Overrides the create method to handle additional logic for DentalPatients. + When a new DentalPatient is created, It then proceeds to create a portal + wizard for the patient to grant them access to the portal. + + If the `company_type` is not `person`, it assumes the record is for a + Medicine Distributor or another entity. In this case, it creates a user + from a template with predefined groups and permissions, and normalizes + the email address for consistency.""" + if 'company_type' in vals and vals.get('company_type') == 'person': + vals['is_patient'] = True + res = super(DentalPatients, self).create(vals) + if 'company_type' in vals and vals.get('company_type') == 'person': + wizard = self.env['portal.wizard'].create({ + 'partner_ids': [fields.Command.link(res.id)] + }) + portal_wizard = self.env['portal.wizard.user'].sudo().create({ + 'partner_id': res.id, + 'email': res.email, + 'wizard_id': wizard.id, + }) + portal_wizard.action_grant_access() + else: + try: + user = self.env['res.users'].with_context( + no_reset_password=True)._create_user_from_template({ + 'email': email_normalize(res.email), + 'login': email_normalize(res.email), + 'partner_id': res.id, + 'groups_id': [ + self.env.ref("base.group_user").id, + self.env.ref( + 'dental_clinical_management.group_dental_doctor').id, + self.env.ref('sales_team.group_sale_salesman').id, + self.env.ref('hr.group_hr_user').id, + self.env.ref('account.group_account_invoice').id, + self.env.ref('stock.group_stock_user').id, + self.env.ref('purchase.group_purchase_user').id + ], + 'company_id': self.env.company.id, + 'company_ids': [(6, 0, self.env.company.ids)], + }) + self.env['hr.employee'].search( + [('work_email', '=', res.email)]).user_id = user.id + except: + raise UserError(_("Email already used for another dentist")) + return res + + @api.depends('dob') + def _compute_patient_age(self): + """Computes the age of the patient based on their date of birth (dob) + and updates the `patient_age` field. The age is calculated by + subtracting the year of the patient's dob from the current year. + If the current date is before the patient's birthday in the current + year, one year is subtracted from the age.""" + for record in self: + record.patient_age = (fields.date.today().year - record.dob.year - + ((fields.date.today().month, + fields.date.today().day) < + (record.dob.month, + record.dob.day))) if record.dob else False diff --git a/dental_clinical_management/models/dental_prescription.py b/dental_clinical_management/models/dental_prescription.py new file mode 100644 index 000000000..64970bfcc --- /dev/null +++ b/dental_clinical_management/models/dental_prescription.py @@ -0,0 +1,224 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from odoo import api, fields, models, _ + + +class DentalPrescription(models.Model): + """Prescription of patient from the dental clinic""" + _name = 'dental.prescription' + _description = "Dental Prescription" + _inherit = ['mail.thread'] + _rec_name = "sequence_no" + + sequence_no = fields.Char(string='Sequence No', required=True, + readonly=True, default=lambda self: _('New'), + help="Sequence number of the dental prescription") + appointment_ids = fields.Many2many('dental.appointment', + string="Appointment", + compute="_compute_appointment_ids", + help="All appointments created") + appointment_id = fields.Many2one('dental.appointment', + string="Appointment", + domain="[('id','in',appointment_ids)]", + required=True, + help="All appointments created") + patient_id = fields.Many2one(related="appointment_id.patient_id", + string="Patient", + required=True, + help="name of the patient") + token_no = fields.Integer(related="appointment_id.token_no", + string="Token Number", + help="Token number of the patient") + treatment_id = fields.Many2one('dental.treatment', + string="Treatment", + help="Name of the treatment " + "done for patient") + cost = fields.Float(related="treatment_id.cost", + string="Treatment Cost", + help="Cost of treatment") + currency_id = fields.Many2one('res.currency', 'Currency', + default=lambda self: self.env.user.company_id.currency_id, + required=True, + help="To add the currency type in cost") + prescribed_doctor_id = fields.Many2one(related="appointment_id.doctor_id", + string='Prescribed Doctor', + required=True, + help="Doctor who is prescribed") + prescription_date = fields.Date(related="appointment_id.date", + string='Prescription Date', + required=True, + help="Date of the prescription") + state = fields.Selection([('new', 'New'), + ('done', 'Prescribed'), + ('invoiced', 'Invoiced')], + default="new", + string="state", + help="state of the appointment") + medicine_ids = fields.One2many('dental.prescription_lines', + 'prescription_id', + string="Medicine", + help="medicines") + invoice_data_id = fields.Many2one(comodel_name="account.move", + string="Invoice Data", + help="Invoice Data") + grand_total = fields.Float(compute="_compute_grand_total", + string="Grand Total", + help="Get the grand total amount") + + @api.model + def create(self, vals): + """Function declared for creating sequence Number for patients""" + if vals.get('sequence_no', _('New')) == _('New'): + vals['sequence_no'] = self.env['ir.sequence'].next_by_code( + 'dental.prescriptions') or _('New') + res = super(DentalPrescription, self).create(vals) + return res + + @api.depends('appointment_id') + def _compute_appointment_ids(self): + """Computes and assigns the `appointment_ids` field for each record. + This method searches for all `dental.appointment` records that have + a state of `new` and a date equal to today's date. It then updates + the `appointment_ids` field of each `DentalPrescription` record + with the IDs of these found appointments.""" + for rec in self: + rec.appointment_ids = self.env['dental.appointment'].search( + [('state', '=', 'new'), ('date', '=', fields.Date.today())]).ids + + def action_prescribed(self): + """Marks the prescription and its associated appointment as `done`. + This method updates the state of both the DentalPrescription instance + and its linked dental.appointment instance to `done`, indicating that + the prescription has been finalized and the appointment has been completed. + """ + self.state = 'done' + self.appointment_id.state = 'done' + + def create_invoice(self): + """Create an invoice based on the patient invoice.""" + self.ensure_one() + invoice_vals = { + 'move_type': 'out_invoice', + 'partner_id': self.patient_id.id, + 'invoice_line_ids': [ + fields.Command.create({ + 'name': self.treatment_id.name, + 'quantity': 1, + 'price_unit': self.cost, + }) + ] + } + invoice = self.env['account.move'].create(invoice_vals) + for rec in self.medicine_ids: + product_id = self.env['product.product'].search([ + ('product_tmpl_id', '=', rec.medicament_id.id)]) + invoice['invoice_line_ids'] = [(0, 0, { + 'product_id': product_id.id, + 'name': rec.display_name, + 'quantity': rec.quantity, + 'price_unit': rec.price, + })] + self.invoice_data_id = invoice.id + invoice.action_post() + self.state = 'invoiced' + return { + 'name': _('Customer Invoice'), + 'view_mode': 'form', + 'view_id': self.env.ref('account.view_move_form').id, + 'res_model': 'account.move', + 'context': "{'move_type':'out_invoice'}", + 'type': 'ir.actions.act_window', + 'res_id': self.invoice_data_id.id, + } + + def action_view_invoice(self): + """Invoice view""" + return { + 'name': _('Customer Invoice'), + 'view_mode': 'form', + 'view_id': self.env.ref('account.view_move_form').id, + 'res_model': 'account.move', + 'context': "{'move_type':'out_invoice'}", + 'type': 'ir.actions.act_window', + 'res_id': self.invoice_data_id.id, + } + + def _compute_grand_total(self): + """Computes the grand total cost of the dental prescription. + + This method initializes the grand total with the cost of the treatment + and then iterates over all the prescribed medicines, adding their total + cost to the grand total. The grand total is stored in the `grand_total` + field of the `DentalPrescription` model.""" + self.grand_total = self.cost + for rec in self.medicine_ids: + self.grand_total += rec.total + + +class DentalPrescriptionLines(models.Model): + """Prescription lines of the dental clinic prescription""" + _name = 'dental.prescription_lines' + _description = "Dental Prescriptions Lines" + _rec_name = "medicament_id" + + medicament_id = fields.Many2one('product.template', + domain="[('is_medicine', '=', True)]", + string="Medicament", + help="Name of the medicine") + generic_name = fields.Char(string="Generic Name", + related="medicament_id.generic_name", + help="Generic name of the medicament") + dosage_strength = fields.Integer(string="Dosage Strength", + related="medicament_id.dosage_strength", + help="Dosage strength of medicament") + medicament_form = fields.Selection([('tablet', 'Tablets'), + ('capsule', 'Capsules'), + ('liquid', 'Liquid'), + ('injection', 'Injections')], + string="Medicament Form", + required=True, + help="Add the form of the medicine") + quantity = fields.Integer(string="Quantity", + required=True, + help="Quantity of medicine") + frequency_id = fields.Many2one('medicine.frequency', + string="Frequency", + required=True, + help="Frequency of medicine") + price = fields.Float(related='medicament_id.list_price', + string="Price", + help="Cost of medicine") + total = fields.Float(string="Total Price", + help="Total price of medicine") + prescription_id = fields.Many2one('dental.prescription', + help="Relate the model with " + "dental_prescription") + + @api.onchange('quantity') + def _onchange_quantity(self): + """Updates the total price of the medicament based on the quantity. + This method is triggered by an onchange event of the `quantity` field. + It calculates the total price by multiplying the `quantity` of the + medicament by its `price` and updates the `total` field with the new value. + """ + for rec in self: + rec.total = rec.price * rec.quantity diff --git a/dental_clinical_management/models/dental_specialist.py b/dental_clinical_management/models/dental_specialist.py new file mode 100644 index 000000000..b09e7a7ca --- /dev/null +++ b/dental_clinical_management/models/dental_specialist.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from odoo import fields, models + + +class DentalSpecialist(models.Model): + """To mention doctors Specialised field""" + _name = 'dental.specialist' + _description = "Dental Specialist" + + name = fields.Char(string="Name", help="Name of the dental specialist") + code = fields.Char(string="Code", help="Add the code for the name") diff --git a/dental_clinical_management/models/dental_time_shift.py b/dental_clinical_management/models/dental_time_shift.py new file mode 100644 index 000000000..19061aac5 --- /dev/null +++ b/dental_clinical_management/models/dental_time_shift.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from odoo import api, fields, models + + +class DentalTimeShift(models.Model): + """Doctors time shift, different time slots""" + _name = 'dental.time.shift' + _description = "Dental Time Shift" + _rec_name = 'name' + + name = fields.Char(string='Name', readonly=True, + help="name of the time shifts") + shift_type = fields.Selection( + selection=[('morning', 'Morning'), ('day', 'Day'), + ('evening', 'Evening'), ('night', 'Night')], + string="Shift Type", help="Selection field for the shift type") + start_time = fields.Float(string="Start Time", help="start time of time " + "slot", required=True) + end_time = fields.Float(string="End Time", help="End time of time slot", required=True) + + @api.model_create_multi + def create(self, vals_list): + """Overrides the default create method to set the `name` field of the + newly created `dental.time.shift` record(s) to a string that represents + the shift time range.""" + res = super(DentalTimeShift, self).create(vals_list) + res.name = f'{res.start_time} to {res.end_time}' + return res + + @api.onchange('start_time', 'end_time') + def _onchange_time(self): + name = f'{self.start_time} to {self.end_time}' + self.update({'name': name}) + diff --git a/dental_clinical_management/models/dental_treatment.py b/dental_clinical_management/models/dental_treatment.py new file mode 100644 index 000000000..8222eeef2 --- /dev/null +++ b/dental_clinical_management/models/dental_treatment.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from odoo import fields, models + + +class DentalTreatment(models.Model): + """For adding Dental treatment details of the patients""" + _name = 'dental.treatment' + _description = "Dental Treatment" + _inherit = ['mail.thread'] + + name = fields.Char(string='Treatment Name', help="Date of the treatment") + treatment_categ_id = fields.Many2one('treatment.category', + string="Category", + help="name of the treatment") + cost = fields.Float(string='Cost', + help="Cost of the Treatment") diff --git a/dental_clinical_management/models/insurance_company.py b/dental_clinical_management/models/insurance_company.py new file mode 100644 index 000000000..d574c79e4 --- /dev/null +++ b/dental_clinical_management/models/insurance_company.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from odoo import fields, models + + +class InsuranceCompany(models.Model): + """To add the insurance details""" + _name = 'insurance.company' + _description = "Insurance Company" + + name = fields.Char(string="Name", help="Name of the insurance company") + phone = fields.Char(string="Phone", help="Phone number of the insurance " + "company") + email = fields.Char(string="Email", help="Email of the insurance company") diff --git a/dental_clinical_management/models/medical_questionnaire.py b/dental_clinical_management/models/medical_questionnaire.py new file mode 100644 index 000000000..0ae7869ba --- /dev/null +++ b/dental_clinical_management/models/medical_questionnaire.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from odoo import fields, models + + +class MedicalQuestionnaire(models.Model): + """Medical questions to be asked to the patients while their appointment""" + _name = 'medical.questionnaire' + _description = 'Medical Questionnaire' + + question_id = fields.Many2one('medical.questions', + string='Questions', + help="All added question") + yes_no = fields.Selection([('yes', 'Yes'), ('no', 'No')], + string='Yes or No', help="choose the answer") + reason = fields.Text(string='Reason', help="Reason for the question answer") + patient_id = fields.Many2one('res.partner', + string='Patient', + help="Patient name") diff --git a/dental_clinical_management/models/medical_questions.py b/dental_clinical_management/models/medical_questions.py new file mode 100644 index 000000000..a0651da5f --- /dev/null +++ b/dental_clinical_management/models/medical_questions.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from odoo import api, fields, models + + +class MedicalQuestions(models.Model): + """To add medical questionnaire question""" + _name = 'medical.questions' + _description = 'Medical Questions' + _rec_name = 'question' + + question = fields.Char(string='Question') + + @api.model + def create(self, vals): + """Overrides the default create method to add a new medical question + record and automatically create a corresponding entry in the + `medical.questionnaire` model.""" + res = super(MedicalQuestions, self).create(vals) + self.env['medical.questionnaire'].create({ + 'question_id': res.id + }) + return res + + def unlink(self): + """Overrides the default unlink method to delete the current medical + question record. Before deletion, it searches for and deletes any + associated records in the `medical.questionnaire` model that + reference this medical question.""" + for rec in self: + for line in self.env['medical.questionnaire'].search( + [('question_id', '=', rec.id)]): + line.unlink() + return super(MedicalQuestions, self).unlink() diff --git a/dental_clinical_management/models/medicine_frequency.py b/dental_clinical_management/models/medicine_frequency.py new file mode 100644 index 000000000..818ad171e --- /dev/null +++ b/dental_clinical_management/models/medicine_frequency.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from odoo import fields, models + + +class MedicineFrequency(models.Model): + """To specifying the medicine frequency, how to consume it.""" + _name = 'medicine.frequency' + _description = "Medicine Frequency" + _rec_name = "medicament_frequency" + + code = fields.Char(string="Code", help="code of medicine frequency") + medicament_frequency = fields.Char(string="Medicine Frequency", + help="Add the frequency of medicine how " + "to eat") diff --git a/dental_clinical_management/models/treatment_category.py b/dental_clinical_management/models/treatment_category.py new file mode 100644 index 000000000..9a70d4d9b --- /dev/null +++ b/dental_clinical_management/models/treatment_category.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from odoo import fields, models + + +class TreatmentCategory(models.Model): + """Adding the treatment category""" + _name = 'treatment.category' + _description = "Treatment Category" + + name = fields.Char(string="Name", help="Name of the treatment category") diff --git a/dental_clinical_management/report/dental_appointment_card.xml b/dental_clinical_management/report/dental_appointment_card.xml new file mode 100644 index 000000000..63a2289be --- /dev/null +++ b/dental_clinical_management/report/dental_appointment_card.xml @@ -0,0 +1,108 @@ + + + + + + + Appointment Card + dental.appointment + qweb-pdf + dental_clinical_management.dental_clinical_management_appointment_card + dental_clinical_management.dental_clinical_management_appointment_card + + + + + Appointment Card + dental.appointment + qweb-pdf + dental_clinical_management.dental_clinical_management_appointment_cards + dental_clinical_management.dental_clinical_management_appointment_cards + + + diff --git a/dental_clinical_management/report/dental_prescription_report.xml b/dental_clinical_management/report/dental_prescription_report.xml new file mode 100644 index 000000000..4b37c2620 --- /dev/null +++ b/dental_clinical_management/report/dental_prescription_report.xml @@ -0,0 +1,17 @@ + + + + + Prescription Pdf + dental.prescription + qweb-pdf + dental_clinical_management.report_prescription + + dental_clinical_management.report_prescription + + 'Prescription Report - %s' % (object.sequence_no) + + report + + \ No newline at end of file diff --git a/dental_clinical_management/report/dental_prescription_templates.xml b/dental_clinical_management/report/dental_prescription_templates.xml new file mode 100644 index 000000000..9e3ad099d --- /dev/null +++ b/dental_clinical_management/report/dental_prescription_templates.xml @@ -0,0 +1,120 @@ + + + + + diff --git a/dental_clinical_management/security/dental_clinical_management_groups.xml b/dental_clinical_management/security/dental_clinical_management_groups.xml new file mode 100644 index 000000000..3fa3795f2 --- /dev/null +++ b/dental_clinical_management/security/dental_clinical_management_groups.xml @@ -0,0 +1,27 @@ + + + + + Dental Clinic + 18 + + + + User: Own Documents Only + + + the user will have access to his own data in the + dental clinic application. + + + + + Manager + the user will have an access to all the dental + clinic configuration. + + + + + + diff --git a/dental_clinical_management/security/dental_clinical_management_security.xml b/dental_clinical_management/security/dental_clinical_management_security.xml new file mode 100644 index 000000000..5f21d2023 --- /dev/null +++ b/dental_clinical_management/security/dental_clinical_management_security.xml @@ -0,0 +1,33 @@ + + + + + Own Appointments + + [('doctor_id.user_id', '=', user.id)] + + + + + All Appointments + + [(1, '=', 1)] + + + + + Own Prescriptions + + [('prescribed_doctor_id.user_id', '=', user.id)] + + + + + All Prescriptions + + [(1, '=', 1)] + + + \ No newline at end of file diff --git a/dental_clinical_management/security/ir.model.access.csv b/dental_clinical_management/security/ir.model.access.csv new file mode 100644 index 000000000..c2be870fc --- /dev/null +++ b/dental_clinical_management/security/ir.model.access.csv @@ -0,0 +1,27 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_dental_time_shift,access.dental.time.shift,model_dental_time_shift,base.group_user,1,1,1,1 +access_medicine_frequency,access.medicine.frequency,model_medicine_frequency,base.group_user,1,1,1,1 +access_medical_questions,access.medical.questions,model_medical_questions,base.group_user,1,1,1,1 +access_medical_questionnaire,access.medical.questionnaire,model_medical_questionnaire,base.group_user,1,1,1,1 +access_xray_report,access.xray.report,model_xray_report,base.group_user,1,1,1,1 +access_portal_dental_prescription,access.portal.dental.prescription,model_dental_prescription,base.group_portal,1,0,0,0 +access_portal_dental_prescription_lines,access.portal.dental.prescription_lines,model_dental_prescription_lines,base.group_portal,1,0,0,0 +access_portal_dental_appointment,access.portal.dental.appointment,model_dental_appointment,base.group_portal,1,0,0,0 +access_portal_dental_specialist,access.portal.dental.specialist,model_dental_specialist,base.group_portal,1,0,0,0 +access_portal_dental_treatment,access.portal.dental.treatment,model_dental_treatment,base.group_portal,1,0,0,0 +access_portal_product_template,access.portal.product.template,model_product_template,base.group_portal,1,0,0,0 +access_portal_medicine_frequency,access.portal.medicine.frequency,model_medicine_frequency,base.group_portal,1,0,0,0 +access_user_dental_appointment,access.user.dental.appointment,model_dental_appointment,dental_clinical_management.group_dental_doctor,1,1,0,0 +access_user_dental_prescription,access.user.dental.prescription,model_dental_prescription,dental_clinical_management.group_dental_doctor,1,1,1,1 +access_user_dental_prescription_lines,access.user.dental.prescription_lines,model_dental_prescription_lines,dental_clinical_management.group_dental_doctor,1,1,1,1 +access_user_dental_specialist,access.user.dental.specialist,model_dental_specialist,dental_clinical_management.group_dental_doctor,1,0,0,0 +access_user_treatment_category,access.user.treatment.category,model_treatment_category,dental_clinical_management.group_dental_doctor,1,0,0,0 +access_user_dental_treatment,access.user.dental.treatment,model_dental_treatment,dental_clinical_management.group_dental_doctor,1,0,0,0 +access_user_insurance_company,access.user.insurance.company,model_insurance_company,dental_clinical_management.group_dental_doctor,1,0,0,0 +access_manager_dental_appointment,access.manager.dental.appointment,model_dental_appointment,dental_clinical_management.group_dental_manager,1,1,1,1 +access_manager_dental_prescription,access.manager.dental.prescription,model_dental_prescription,dental_clinical_management.group_dental_manager,1,1,1,1 +access_manager_dental_prescription_lines,access.manager.dental.prescription_lines,model_dental_prescription_lines,dental_clinical_management.group_dental_manager,1,1,1,1 +access_manager_dental_specialist,access.manager.dental.specialist,model_dental_specialist,dental_clinical_management.group_dental_manager,1,1,1,1 +access_manager_treatment_category,access.manager.treatment.category,model_treatment_category,dental_clinical_management.group_dental_manager,1,1,1,1 +access_manager_dental_treatment,access.manager.dental.treatment,model_dental_treatment,dental_clinical_management.group_dental_manager,1,1,1,1 +access_manager_insurance_company,access.manager.insurance.company,model_insurance_company,dental_clinical_management.group_dental_manager,1,1,1,1 diff --git a/dental_clinical_management/static/description/assets/icons/check.png b/dental_clinical_management/static/description/assets/icons/check.png new file mode 100644 index 000000000..c8e85f51d Binary files /dev/null and b/dental_clinical_management/static/description/assets/icons/check.png differ diff --git a/dental_clinical_management/static/description/assets/icons/chevron.png b/dental_clinical_management/static/description/assets/icons/chevron.png new file mode 100644 index 000000000..2089293d6 Binary files /dev/null and b/dental_clinical_management/static/description/assets/icons/chevron.png differ diff --git a/dental_clinical_management/static/description/assets/icons/cogs.png b/dental_clinical_management/static/description/assets/icons/cogs.png new file mode 100644 index 000000000..95d0bad62 Binary files /dev/null and b/dental_clinical_management/static/description/assets/icons/cogs.png differ diff --git a/dental_clinical_management/static/description/assets/icons/consultation.png b/dental_clinical_management/static/description/assets/icons/consultation.png new file mode 100644 index 000000000..8319d4baa Binary files /dev/null and b/dental_clinical_management/static/description/assets/icons/consultation.png differ diff --git a/dental_clinical_management/static/description/assets/icons/ecom-black.png b/dental_clinical_management/static/description/assets/icons/ecom-black.png new file mode 100644 index 000000000..a9385ff13 Binary files /dev/null and b/dental_clinical_management/static/description/assets/icons/ecom-black.png differ diff --git a/dental_clinical_management/static/description/assets/icons/education-black.png b/dental_clinical_management/static/description/assets/icons/education-black.png new file mode 100644 index 000000000..3eb09b27b Binary files /dev/null and b/dental_clinical_management/static/description/assets/icons/education-black.png differ diff --git a/dental_clinical_management/static/description/assets/icons/hotel-black.png b/dental_clinical_management/static/description/assets/icons/hotel-black.png new file mode 100644 index 000000000..130f613be Binary files /dev/null and b/dental_clinical_management/static/description/assets/icons/hotel-black.png differ diff --git a/dental_clinical_management/static/description/assets/icons/license.png b/dental_clinical_management/static/description/assets/icons/license.png new file mode 100644 index 000000000..a5869797e Binary files /dev/null and b/dental_clinical_management/static/description/assets/icons/license.png differ diff --git a/dental_clinical_management/static/description/assets/icons/lifebuoy.png b/dental_clinical_management/static/description/assets/icons/lifebuoy.png new file mode 100644 index 000000000..658d56ccc Binary files /dev/null and b/dental_clinical_management/static/description/assets/icons/lifebuoy.png differ diff --git a/dental_clinical_management/static/description/assets/icons/manufacturing-black.png b/dental_clinical_management/static/description/assets/icons/manufacturing-black.png new file mode 100644 index 000000000..697eb0e9f Binary files /dev/null and b/dental_clinical_management/static/description/assets/icons/manufacturing-black.png differ diff --git a/dental_clinical_management/static/description/assets/icons/pos-black.png b/dental_clinical_management/static/description/assets/icons/pos-black.png new file mode 100644 index 000000000..97c0f90c1 Binary files /dev/null and b/dental_clinical_management/static/description/assets/icons/pos-black.png differ diff --git a/dental_clinical_management/static/description/assets/icons/puzzle.png b/dental_clinical_management/static/description/assets/icons/puzzle.png new file mode 100644 index 000000000..65cf854e7 Binary files /dev/null and b/dental_clinical_management/static/description/assets/icons/puzzle.png differ diff --git a/dental_clinical_management/static/description/assets/icons/restaurant-black.png b/dental_clinical_management/static/description/assets/icons/restaurant-black.png new file mode 100644 index 000000000..4a35eb939 Binary files /dev/null and b/dental_clinical_management/static/description/assets/icons/restaurant-black.png differ diff --git a/dental_clinical_management/static/description/assets/icons/service-black.png b/dental_clinical_management/static/description/assets/icons/service-black.png new file mode 100644 index 000000000..301ab51cb Binary files /dev/null and b/dental_clinical_management/static/description/assets/icons/service-black.png differ diff --git a/dental_clinical_management/static/description/assets/icons/trading-black.png b/dental_clinical_management/static/description/assets/icons/trading-black.png new file mode 100644 index 000000000..9398ba2f1 Binary files /dev/null and b/dental_clinical_management/static/description/assets/icons/trading-black.png differ diff --git a/dental_clinical_management/static/description/assets/icons/training.png b/dental_clinical_management/static/description/assets/icons/training.png new file mode 100644 index 000000000..884ca024d Binary files /dev/null and b/dental_clinical_management/static/description/assets/icons/training.png differ diff --git a/dental_clinical_management/static/description/assets/icons/update.png b/dental_clinical_management/static/description/assets/icons/update.png new file mode 100644 index 000000000..ecbc5a01a Binary files /dev/null and b/dental_clinical_management/static/description/assets/icons/update.png differ diff --git a/dental_clinical_management/static/description/assets/icons/user.png b/dental_clinical_management/static/description/assets/icons/user.png new file mode 100644 index 000000000..6ffb23d9f Binary files /dev/null and b/dental_clinical_management/static/description/assets/icons/user.png differ diff --git a/dental_clinical_management/static/description/assets/icons/wrench.png b/dental_clinical_management/static/description/assets/icons/wrench.png new file mode 100644 index 000000000..6c04dea0f Binary files /dev/null and b/dental_clinical_management/static/description/assets/icons/wrench.png differ diff --git a/dental_clinical_management/static/description/assets/misc/categories.png b/dental_clinical_management/static/description/assets/misc/categories.png new file mode 100644 index 000000000..bedf1e0b1 Binary files /dev/null and b/dental_clinical_management/static/description/assets/misc/categories.png differ diff --git a/dental_clinical_management/static/description/assets/misc/check-box.png b/dental_clinical_management/static/description/assets/misc/check-box.png new file mode 100644 index 000000000..42caf24b9 Binary files /dev/null and b/dental_clinical_management/static/description/assets/misc/check-box.png differ diff --git a/dental_clinical_management/static/description/assets/misc/compass.png b/dental_clinical_management/static/description/assets/misc/compass.png new file mode 100644 index 000000000..d5fed8faa Binary files /dev/null and b/dental_clinical_management/static/description/assets/misc/compass.png differ diff --git a/dental_clinical_management/static/description/assets/misc/corporate.png b/dental_clinical_management/static/description/assets/misc/corporate.png new file mode 100644 index 000000000..2eb13edbf Binary files /dev/null and b/dental_clinical_management/static/description/assets/misc/corporate.png differ diff --git a/dental_clinical_management/static/description/assets/misc/customer-support.png b/dental_clinical_management/static/description/assets/misc/customer-support.png new file mode 100644 index 000000000..79efc72ed Binary files /dev/null and b/dental_clinical_management/static/description/assets/misc/customer-support.png differ diff --git a/dental_clinical_management/static/description/assets/misc/cybrosys-logo.png b/dental_clinical_management/static/description/assets/misc/cybrosys-logo.png new file mode 100644 index 000000000..cc3cc0ccf Binary files /dev/null and b/dental_clinical_management/static/description/assets/misc/cybrosys-logo.png differ diff --git a/dental_clinical_management/static/description/assets/misc/features.png b/dental_clinical_management/static/description/assets/misc/features.png new file mode 100644 index 000000000..b41769f77 Binary files /dev/null and b/dental_clinical_management/static/description/assets/misc/features.png differ diff --git a/dental_clinical_management/static/description/assets/misc/logo.png b/dental_clinical_management/static/description/assets/misc/logo.png new file mode 100644 index 000000000..478462d3e Binary files /dev/null and b/dental_clinical_management/static/description/assets/misc/logo.png differ diff --git a/dental_clinical_management/static/description/assets/misc/pictures.png b/dental_clinical_management/static/description/assets/misc/pictures.png new file mode 100644 index 000000000..56d255fe9 Binary files /dev/null and b/dental_clinical_management/static/description/assets/misc/pictures.png differ diff --git a/dental_clinical_management/static/description/assets/misc/pie-chart.png b/dental_clinical_management/static/description/assets/misc/pie-chart.png new file mode 100644 index 000000000..426e05244 Binary files /dev/null and b/dental_clinical_management/static/description/assets/misc/pie-chart.png differ diff --git a/dental_clinical_management/static/description/assets/misc/right-arrow.png b/dental_clinical_management/static/description/assets/misc/right-arrow.png new file mode 100644 index 000000000..730984a06 Binary files /dev/null and b/dental_clinical_management/static/description/assets/misc/right-arrow.png differ diff --git a/dental_clinical_management/static/description/assets/misc/star.png b/dental_clinical_management/static/description/assets/misc/star.png new file mode 100644 index 000000000..2eb9ab29f Binary files /dev/null and b/dental_clinical_management/static/description/assets/misc/star.png differ diff --git a/dental_clinical_management/static/description/assets/misc/support.png b/dental_clinical_management/static/description/assets/misc/support.png new file mode 100644 index 000000000..4f18b8b82 Binary files /dev/null and b/dental_clinical_management/static/description/assets/misc/support.png differ diff --git a/dental_clinical_management/static/description/assets/misc/whatsapp.png b/dental_clinical_management/static/description/assets/misc/whatsapp.png new file mode 100644 index 000000000..d513a5356 Binary files /dev/null and b/dental_clinical_management/static/description/assets/misc/whatsapp.png differ diff --git a/dental_clinical_management/static/description/assets/modules/1.png b/dental_clinical_management/static/description/assets/modules/1.png new file mode 100644 index 000000000..c54c3f001 Binary files /dev/null and b/dental_clinical_management/static/description/assets/modules/1.png differ diff --git a/dental_clinical_management/static/description/assets/modules/2.jpg b/dental_clinical_management/static/description/assets/modules/2.jpg new file mode 100644 index 000000000..f5c548538 Binary files /dev/null and b/dental_clinical_management/static/description/assets/modules/2.jpg differ diff --git a/dental_clinical_management/static/description/assets/modules/3.png b/dental_clinical_management/static/description/assets/modules/3.png new file mode 100644 index 000000000..3f5e0a43a Binary files /dev/null and b/dental_clinical_management/static/description/assets/modules/3.png differ diff --git a/dental_clinical_management/static/description/assets/modules/4.png b/dental_clinical_management/static/description/assets/modules/4.png new file mode 100755 index 000000000..3dc1faa62 Binary files /dev/null and b/dental_clinical_management/static/description/assets/modules/4.png differ diff --git a/dental_clinical_management/static/description/assets/modules/5.jpg b/dental_clinical_management/static/description/assets/modules/5.jpg new file mode 100644 index 000000000..6cf5c8072 Binary files /dev/null and b/dental_clinical_management/static/description/assets/modules/5.jpg differ diff --git a/dental_clinical_management/static/description/assets/modules/6.png b/dental_clinical_management/static/description/assets/modules/6.png new file mode 100644 index 000000000..ef86cd097 Binary files /dev/null and b/dental_clinical_management/static/description/assets/modules/6.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/1.png b/dental_clinical_management/static/description/assets/screenshots/1.png new file mode 100644 index 000000000..c99c55768 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/1.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/10.png b/dental_clinical_management/static/description/assets/screenshots/10.png new file mode 100644 index 000000000..0479392c8 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/10.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/11.png b/dental_clinical_management/static/description/assets/screenshots/11.png new file mode 100644 index 000000000..7d4e6e56c Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/11.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/12.png b/dental_clinical_management/static/description/assets/screenshots/12.png new file mode 100644 index 000000000..a5dad4eb4 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/12.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/13.png b/dental_clinical_management/static/description/assets/screenshots/13.png new file mode 100644 index 000000000..dafd9306b Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/13.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/14.png b/dental_clinical_management/static/description/assets/screenshots/14.png new file mode 100644 index 000000000..42ae6b74e Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/14.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/15.png b/dental_clinical_management/static/description/assets/screenshots/15.png new file mode 100644 index 000000000..77e4f1e19 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/15.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/16.png b/dental_clinical_management/static/description/assets/screenshots/16.png new file mode 100644 index 000000000..9c2ed017a Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/16.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/17.png b/dental_clinical_management/static/description/assets/screenshots/17.png new file mode 100644 index 000000000..a4ad1037e Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/17.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/18.png b/dental_clinical_management/static/description/assets/screenshots/18.png new file mode 100644 index 000000000..a89b4dd75 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/18.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/19.png b/dental_clinical_management/static/description/assets/screenshots/19.png new file mode 100644 index 000000000..8acc183e3 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/19.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/2.png b/dental_clinical_management/static/description/assets/screenshots/2.png new file mode 100644 index 000000000..ccb4f63f4 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/2.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/20.png b/dental_clinical_management/static/description/assets/screenshots/20.png new file mode 100644 index 000000000..65999f34b Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/20.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/21.png b/dental_clinical_management/static/description/assets/screenshots/21.png new file mode 100644 index 000000000..9fbebacb2 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/21.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/22.png b/dental_clinical_management/static/description/assets/screenshots/22.png new file mode 100644 index 000000000..3929a1d70 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/22.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/23.png b/dental_clinical_management/static/description/assets/screenshots/23.png new file mode 100644 index 000000000..6ae621f8c Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/23.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/24.png b/dental_clinical_management/static/description/assets/screenshots/24.png new file mode 100644 index 000000000..c1e2bc74a Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/24.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/25.png b/dental_clinical_management/static/description/assets/screenshots/25.png new file mode 100644 index 000000000..229beaa68 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/25.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/26.png b/dental_clinical_management/static/description/assets/screenshots/26.png new file mode 100644 index 000000000..2aff94f36 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/26.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/27.png b/dental_clinical_management/static/description/assets/screenshots/27.png new file mode 100644 index 000000000..e1b0a1394 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/27.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/28.png b/dental_clinical_management/static/description/assets/screenshots/28.png new file mode 100644 index 000000000..447c2d348 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/28.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/29.png b/dental_clinical_management/static/description/assets/screenshots/29.png new file mode 100644 index 000000000..6d05cf3fd Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/29.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/3.png b/dental_clinical_management/static/description/assets/screenshots/3.png new file mode 100644 index 000000000..3c5f54916 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/3.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/30.png b/dental_clinical_management/static/description/assets/screenshots/30.png new file mode 100644 index 000000000..a583ebf63 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/30.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/31.png b/dental_clinical_management/static/description/assets/screenshots/31.png new file mode 100644 index 000000000..94a526def Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/31.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/32.png b/dental_clinical_management/static/description/assets/screenshots/32.png new file mode 100644 index 000000000..a2f0fc56d Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/32.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/33.png b/dental_clinical_management/static/description/assets/screenshots/33.png new file mode 100644 index 000000000..ebb5e6ea5 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/33.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/34.png b/dental_clinical_management/static/description/assets/screenshots/34.png new file mode 100644 index 000000000..553c46272 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/34.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/35.png b/dental_clinical_management/static/description/assets/screenshots/35.png new file mode 100644 index 000000000..4e910e2fc Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/35.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/4.png b/dental_clinical_management/static/description/assets/screenshots/4.png new file mode 100644 index 000000000..ef7c444dd Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/4.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/5.png b/dental_clinical_management/static/description/assets/screenshots/5.png new file mode 100644 index 000000000..bad961df7 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/5.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/6.png b/dental_clinical_management/static/description/assets/screenshots/6.png new file mode 100644 index 000000000..463e4f3d2 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/6.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/7.png b/dental_clinical_management/static/description/assets/screenshots/7.png new file mode 100644 index 000000000..a58c81e2b Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/7.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/8.png b/dental_clinical_management/static/description/assets/screenshots/8.png new file mode 100644 index 000000000..73118959c Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/8.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/9.png b/dental_clinical_management/static/description/assets/screenshots/9.png new file mode 100644 index 000000000..69fe1cff1 Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/9.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/user_group.png b/dental_clinical_management/static/description/assets/screenshots/user_group.png new file mode 100644 index 000000000..5f4ebb5cf Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/user_group.png differ diff --git a/dental_clinical_management/static/description/assets/screenshots/v15-hero.gif b/dental_clinical_management/static/description/assets/screenshots/v15-hero.gif new file mode 100644 index 000000000..12b25f3da Binary files /dev/null and b/dental_clinical_management/static/description/assets/screenshots/v15-hero.gif differ diff --git a/dental_clinical_management/static/description/banner.png b/dental_clinical_management/static/description/banner.png new file mode 100644 index 000000000..5f8f62deb Binary files /dev/null and b/dental_clinical_management/static/description/banner.png differ diff --git a/dental_clinical_management/static/description/icon.png b/dental_clinical_management/static/description/icon.png new file mode 100644 index 000000000..8a84caa88 Binary files /dev/null and b/dental_clinical_management/static/description/icon.png differ diff --git a/dental_clinical_management/static/description/index.html b/dental_clinical_management/static/description/index.html new file mode 100644 index 000000000..c67f8205a --- /dev/null +++ b/dental_clinical_management/static/description/index.html @@ -0,0 +1,823 @@ +
+ +
+ +
+
+ Community +
+
+ Enterprise +
+
+ Odoo.sh +
+
+
+ +
+
+
+ +

+ Dental Clinic Management

+

+ Dental Clinic Management Software, Dental Clinics Can + Enhance Efficiency, Improve Patient Care, Optimize Resource + Utilization, and Maintain Smooth Operations. + +

+
+
+
+ + +
+
+ +
+

+ Explore This + Module

+
+ + + + +
+
+ +
+

+ Overview +

+
+
+
+ An efficient patient management system streamlines appointment + scheduling, allowing patients to book and view available slots through + their portal. It facilitates easy access and updates to patient + information and medical history, enhancing the accuracy and timeliness + of care. Additionally, it supports the planning and tracking of patient + treatments, ensuring better outcomes and continuity of care. +
+
+ + + +
+
+ +
+

+ Features +

+
+
+
+
+ + + Efficiently manage patient appointments + +
+
+ + Easily access and update patient information and medical history. +
+
+ + Plan and track patient treatments for better outcomes and continuity of care. +
+
+ + Patients can schedule appointments, view availability through their portal + +
+ + +
+
+ + + +
+
+ +
+

+ Screenshots +

+
+
+
+
+

+ Dental Clinic User Groups +

+ +
+ +
+

+ Departments in the Dental Clinic. +

+ +
+ +
+

+ Doctors Specialization of their different fields. +

+ +
+ +
+

+ Time slots for doctors can be scheduled here.

+ +
+
+

+ Different Treatment Categories in the Dental Clinic.

+ +
+
+

+ Treatments can be listed under treatment category.

+ +
+
+

+ + Medical questionnaire to provide patient health information. +

+ +
+
+

+ Clinic administrators can create profiles for doctors. +

+ + +
+
+

+ Doctor's schedules can be added within their profiles, detailing + their time shifts for appointments .

+ +
+
+

+ + User has been Created.

+

+ A user account is automatically generated when creating a doctor + profile.

+ + +
+
+

+ + Patients can be created +

+ + +
+
+

+ + Patient's specific medical questionnaire details can be recorded + within their profiles. +

+ +
+
+

+ X-Ray Reports can be added inside the patients. +

+ + + +
+
+

+ + Patients insurance details can be added.

+ +
+
+

+ + Portal User has been created.

+

+ Creating a patient, a corresponding portal user is automatically + generated, facilitating seamless access to online services and + medical records. + +

+ +
+
+

+ Patients will receive an email to activate their account.

+

+ Allowing them to set a password and log in to access their + account. +

+ + +
+
+

+ Patients can schedule doctor appointments based on available + time slots. +

+ +
+
+

+ Appointment token numbers are automatically generated for each + booking. +

+ +
+
+

+ The list of appointments can be viewed for effective scheduling + and management. +

+ +
+
+

+ Medications for the dental clinic can be created and their + dosage and generic name details can be added for accurate + record-keeping and patient care +

+ + +
+
+

+ Medicament Frequencies can be added by default. +

+ +
+
+

+ Patient's prescriptions, including treatment details and + prescribed medications based on their appointments. +

+ +
+
+

+ Invoices for prescriptions can be generated. +

+ + +
+
+

+ Patient Login

+

+ Login as portal user. +

+ +
+
+

+ + Patients can access and view all of their prescriptions for + their reference. +

+ + +
+
+

+ Patients can easily view the list of doctors available at the + clinic. +

+ +
+
+

+ Patients can book appointments through the portal. +

+ +
+ +
+
+ + + +
+
+ +
+

+ Related + Products +

+
+
+
+ +
+
+ + + + +
+
+ +
+

+ Our Services +

+
+ +
+
+
+
+ +
+
+ Odoo + Customization
+
+ +
+
+ +
+
+ Odoo + Implementation
+
+ +
+
+ +
+
+ Odoo + Support
+
+ + +
+
+ +
+
+ Hire + Odoo + Developer
+
+ +
+
+ +
+
+ Odoo + Integration
+
+ +
+
+ +
+
+ Odoo + Migration
+
+ + +
+
+ +
+
+ Odoo + Consultancy
+
+ +
+
+ +
+
+ Odoo + Implementation
+
+ +
+
+ +
+
+ Odoo + Licensing Consultancy
+
+
+ +
+ + + + + +
+
+ +
+

+ Our + Industries +

+
+ +
+
+
+
+ +
+ Trading +
+

+ Easily procure + and + sell your products

+
+
+ +
+
+ +
+ POS +
+

+ Easy + configuration + and convivial experience

+
+
+ +
+
+ +
+ Education +
+

+ A platform for + educational management

+
+
+ +
+
+ +
+ Manufacturing +
+

+ Plan, track and + schedule your operations

+
+
+ +
+
+ +
+ E-commerce & Website +
+

+ Mobile + friendly, + awe-inspiring product pages

+
+
+ +
+
+ +
+ Service Management +
+

+ Keep track of + services and invoice

+
+
+ +
+
+ +
+ Restaurant +
+

+ Run your bar or + restaurant methodically

+
+
+ +
+
+ +
+ Hotel Management +
+

+ An + all-inclusive + hotel management application

+
+
+
+
+ + + + +
+
+ +
+

+ Support +

+
+
+
+
+
+
+ +
+
+

Need Help?

+

Got questions or need help? + Get in touch.

+ +

+ odoo@cybrosys.com

+
+
+
+
+
+
+
+ +
+
+

WhatsApp

+

Say hi to us on WhatsApp!

+ +

+ +91 86068 + 27707

+
+
+
+
+
+
+
+ +
+
+
+ \ No newline at end of file diff --git a/dental_clinical_management/static/src/img/appointment.jpeg b/dental_clinical_management/static/src/img/appointment.jpeg new file mode 100644 index 000000000..2129d18d3 Binary files /dev/null and b/dental_clinical_management/static/src/img/appointment.jpeg differ diff --git a/dental_clinical_management/static/src/img/prescriptions.svg b/dental_clinical_management/static/src/img/prescriptions.svg new file mode 100644 index 000000000..6b3811746 --- /dev/null +++ b/dental_clinical_management/static/src/img/prescriptions.svg @@ -0,0 +1,36 @@ + + + + + + \ No newline at end of file diff --git a/dental_clinical_management/static/src/js/dental_clinic.js b/dental_clinical_management/static/src/js/dental_clinic.js new file mode 100644 index 000000000..0ebffdc40 --- /dev/null +++ b/dental_clinical_management/static/src/js/dental_clinic.js @@ -0,0 +1,46 @@ +/** @odoo-module */ +import publicWidget from 'web.public.widget'; +const ajax = require('web.ajax'); +publicWidget.registry.DentalClinic = publicWidget.Widget.extend({ + selector: '#appointment_form', + events: { + 'change #specialised_id': '_onSpecialisedChange', + 'change #doctor_id': '_onDoctorChange', + }, + /** + * @constructor + */ + init: function (parent, options) { + this._super.apply(this, arguments); + }, + _onSpecialisedChange: async function () { + var self = this + var specialised_id = this.$el.find('#specialised_id').val(); + await ajax.jsonRpc("/specialised_doctors",'call' ,{ + specialised_id: specialised_id + }).then(function (records) { + self.$el.find('#doctor_id').empty(); + self.$el.find('#doctor_id').prepend(''); + records.forEach(function (record) { + self.$('#doctor_id').append( + `` + ); + }); + }); + }, + _onDoctorChange: async function () { + var self = this + var doctor_id = this.$el.find('#doctor_id').val(); + await ajax.jsonRpc("/doctors_shifts", 'call',{ + doctor_id: doctor_id + }).then(function (records) { + self.$el.find('#time_shift').empty(); + self.$el.find('#time_shift').prepend(''); + records.forEach(function (record) { + self.$('#time_shift').append( + `` + ); + }); + }); + }, +}); \ No newline at end of file diff --git a/dental_clinical_management/views/dental_appointment_views.xml b/dental_clinical_management/views/dental_appointment_views.xml new file mode 100644 index 000000000..d2721591e --- /dev/null +++ b/dental_clinical_management/views/dental_appointment_views.xml @@ -0,0 +1,119 @@ + + + + + dental.appointment.search + dental.appointment + + + + + + + + + + + + + + + + + + + + + + dental.appointment.view.form + dental.appointment + +
+
+
+ + +
+ +
+
+

+ +

+
+ + + + + + + + + + + + + + + + + +
+
+ + +
+
+
+
+ + + + dental.appointment.view.tree + dental.appointment + + + + + + + + + + + + + +
diff --git a/dental_clinical_management/views/dental_clinic_template.xml b/dental_clinical_management/views/dental_clinic_template.xml new file mode 100644 index 000000000..5eb7b4995 --- /dev/null +++ b/dental_clinical_management/views/dental_clinic_template.xml @@ -0,0 +1,205 @@ + + + + + + + + + + diff --git a/dental_clinical_management/views/dental_clinical_management_menu.xml b/dental_clinical_management/views/dental_clinical_management_menu.xml new file mode 100644 index 000000000..c1863ec68 --- /dev/null +++ b/dental_clinical_management/views/dental_clinical_management_menu.xml @@ -0,0 +1,140 @@ + + + + + Doctors Appointment + dental.appointment + tree,form + {'search_default_today': True} + + + + Doctors + hr.employee + tree,form + + + + Patients + res.partner + [('is_patient','=',True)] + {'default_company_type':'person'} + tree,form + + + + Dental Prescription + dental.prescription + tree,form + {'search_default_today': True} + + + + Specialized + dental.specialist + tree + + + + Treatment Category + treatment.category + tree + + + + Dental Treatment + dental.treatment + tree + + + + Medicines + product.template + [('is_medicine','=',True)] + {'default_is_medicine':True, + 'default_detailed_type': 'product'} + + tree,form + + + + Medicine Frequency + medicine.frequency + tree + + + + Insurance Company + insurance.company + tree + + + + Dental Time Shift + dental.time.shift + tree,form + + + + Medical Questions + medical.questions + tree + + + + report + xray.report + form + + + + + + + + + + + + + + + + + + + + + + diff --git a/dental_clinical_management/views/dental_department_views.xml b/dental_clinical_management/views/dental_department_views.xml new file mode 100644 index 000000000..9c980f0ea --- /dev/null +++ b/dental_clinical_management/views/dental_department_views.xml @@ -0,0 +1,22 @@ + + + + + + hr.department.view.tree.inherit.dental.clinical.management + + hr.department + + + + True + + + True + + + True + + + + diff --git a/dental_clinical_management/views/dental_doctor_views.xml b/dental_clinical_management/views/dental_doctor_views.xml new file mode 100644 index 000000000..b963d1909 --- /dev/null +++ b/dental_clinical_management/views/dental_doctor_views.xml @@ -0,0 +1,94 @@ + + + + + + hr.employee.view.form.inherit.dental.clinical.management + + hr.employee + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + 1 + + + 1 + + + + + + + + hr.employee.view.tree.inherit.dental.clinical.management + + hr.employee + + + + + + + + diff --git a/dental_clinical_management/views/dental_medicine_views.xml b/dental_clinical_management/views/dental_medicine_views.xml new file mode 100644 index 000000000..3a6b8d804 --- /dev/null +++ b/dental_clinical_management/views/dental_medicine_views.xml @@ -0,0 +1,37 @@ + + + + + + product.template.view.form.inherit.dental.clinical.management + + product.template + + + + + + + + + + + + + + + + + product.template.view.tree.inherit.dental.clinical.management + + product.template + + + + + + + + + diff --git a/dental_clinical_management/views/dental_patients_views.xml b/dental_clinical_management/views/dental_patients_views.xml new file mode 100644 index 000000000..3c416ff29 --- /dev/null +++ b/dental_clinical_management/views/dental_patients_views.xml @@ -0,0 +1,116 @@ + + + + + res.partner.view.form.inherit.dental.clinical.management + res.partner + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ Avatar +
+
+ +
+ +
+
+ +
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + {'invisible': [('company_type', '=', 'person')]} + + + + {'invisible': [('company_type', '=', 'person')]} + + + + {'invisible': [('company_type', '=', 'person')]} + + + + {'invisible': [('company_type', '=', 'person')]} + + + + {'invisible': [('company_type', '=', 'person')]} + + + + {'invisible': [('company_type', '=', 'person')]} + + + + {'invisible': [('company_type', '=', 'company')]} + + + + {'invisible': [('company_type', '=', 'company')]} + + + + {'invisible': [('company_type', '=', 'company')]} + +
+
+
\ No newline at end of file diff --git a/dental_clinical_management/views/dental_prescription_views.xml b/dental_clinical_management/views/dental_prescription_views.xml new file mode 100644 index 000000000..643328861 --- /dev/null +++ b/dental_clinical_management/views/dental_prescription_views.xml @@ -0,0 +1,122 @@ + + + + + dental.prescription.search + dental.prescription + + + + + + + + + + + + + + + + + + + + dental.prescription.view.form + dental.prescription + +
+
+
+ + +
+ +
+
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+
+
+ + + dental.prescription.view.tree + dental.prescription + + + + + + + + + + +
diff --git a/dental_clinical_management/views/dental_specialist_views.xml b/dental_clinical_management/views/dental_specialist_views.xml new file mode 100644 index 000000000..7a2006066 --- /dev/null +++ b/dental_clinical_management/views/dental_specialist_views.xml @@ -0,0 +1,14 @@ + + + + + dental.specialist.view.tree + dental.specialist + + + + + + + + diff --git a/dental_clinical_management/views/dental_time_shift_views.xml b/dental_clinical_management/views/dental_time_shift_views.xml new file mode 100644 index 000000000..79044400f --- /dev/null +++ b/dental_clinical_management/views/dental_time_shift_views.xml @@ -0,0 +1,39 @@ + + + + + dental.time.shift.view.tree + dental.time.shift + + + + + + + + + + + + dental.time.shift.view.form + dental.time.shift + +
+ +

+
+ +
+

+ + + + + + + +
+
+
+
+
diff --git a/dental_clinical_management/views/dental_treatment_views.xml b/dental_clinical_management/views/dental_treatment_views.xml new file mode 100644 index 000000000..facb5903f --- /dev/null +++ b/dental_clinical_management/views/dental_treatment_views.xml @@ -0,0 +1,15 @@ + + + + + dental.treatment.view.tree + dental.treatment + + + + + + + + + diff --git a/dental_clinical_management/views/insurance_company_views.xml b/dental_clinical_management/views/insurance_company_views.xml new file mode 100644 index 000000000..ea589f60d --- /dev/null +++ b/dental_clinical_management/views/insurance_company_views.xml @@ -0,0 +1,15 @@ + + + + + insurance.company.view.tree + insurance.company + + + + + + + + + diff --git a/dental_clinical_management/views/medical_questions_views.xml b/dental_clinical_management/views/medical_questions_views.xml new file mode 100644 index 000000000..91d2f1f92 --- /dev/null +++ b/dental_clinical_management/views/medical_questions_views.xml @@ -0,0 +1,13 @@ + + + + + medical.questions.view.tree + medical.questions + + + + + + + diff --git a/dental_clinical_management/views/medicine_frequency_views.xml b/dental_clinical_management/views/medicine_frequency_views.xml new file mode 100644 index 000000000..6c1beaa3b --- /dev/null +++ b/dental_clinical_management/views/medicine_frequency_views.xml @@ -0,0 +1,14 @@ + + + + + medicine.frequency.view.tree + medicine.frequency + + + + + + + + diff --git a/dental_clinical_management/views/patient_portal_template.xml b/dental_clinical_management/views/patient_portal_template.xml new file mode 100644 index 000000000..77f8fd0d9 --- /dev/null +++ b/dental_clinical_management/views/patient_portal_template.xml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/dental_clinical_management/views/treatment_category_views.xml b/dental_clinical_management/views/treatment_category_views.xml new file mode 100644 index 000000000..50ed27b40 --- /dev/null +++ b/dental_clinical_management/views/treatment_category_views.xml @@ -0,0 +1,13 @@ + + + + + treatment.category.view.form + treatment.category + + + + + + + diff --git a/dental_clinical_management/wizard/__init__.py b/dental_clinical_management/wizard/__init__.py new file mode 100644 index 000000000..494ea33b4 --- /dev/null +++ b/dental_clinical_management/wizard/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from . import xray_report diff --git a/dental_clinical_management/wizard/xray_report.py b/dental_clinical_management/wizard/xray_report.py new file mode 100644 index 000000000..b27e1f2b5 --- /dev/null +++ b/dental_clinical_management/wizard/xray_report.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +################################################################################ +from odoo import fields, models + + +class XRayReport(models.TransientModel): + """To add the x-ray report of the patients""" + _name = 'xray.report' + _description = 'X-Ray Report' + + patient_id = fields.Many2one('res.partner', + string='Patient', required=True, + help="name of the patient") + report_date = fields.Date(string='Report Date', + default=lambda self: fields.Date.context_today(self), + required=True, + help="date of report adding") + report_file = fields.Binary(string='Report File', required=True, + help="File to upload") + file_name = fields.Char(string="File Name", + help="Name of the file") + description = fields.Text(string='Description', + help="To add the description of the x-ray report") diff --git a/dental_clinical_management/wizard/xray_report_views.xml b/dental_clinical_management/wizard/xray_report_views.xml new file mode 100644 index 000000000..b75ef4a07 --- /dev/null +++ b/dental_clinical_management/wizard/xray_report_views.xml @@ -0,0 +1,23 @@ + + + + + xray.report.view.form + xray.report + +
+ + + + + + + + + +
+
+
+
\ No newline at end of file