diff --git a/dental_clinic_management/README.rst b/dental_clinic_management/README.rst new file mode 100755 index 000000000..2f181ff9f --- /dev/null +++ b/dental_clinic_management/README.rst @@ -0,0 +1,48 @@ +.. 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, + 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_clinic_management/__init__.py b/dental_clinic_management/__init__.py new file mode 100644 index 000000000..5b6f8fcc1 --- /dev/null +++ b/dental_clinic_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_clinic_management/__manifest__.py b/dental_clinic_management/__manifest__.py new file mode 100644 index 000000000..e27381e8a --- /dev/null +++ b/dental_clinic_management/__manifest__.py @@ -0,0 +1,78 @@ +# -*- 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': '17.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_clinic_management/static/src/js/dental_clinic.js" + ] + }, + 'data': [ + 'security/dental_clinic_management_groups.xml', + 'security/dental_clinic_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/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_prescription_templates.xml', + 'report/dental_prescription_report.xml', + 'wizard/xray_report_views.xml', + 'views/dental_clinic_management_menu.xml', + ], + 'images': ['static/description/banner.jpg'], + 'license': 'AGPL-3', + 'installable': True, + 'auto_install': False, + 'application': True, +} diff --git a/dental_clinic_management/controllers/__init__.py b/dental_clinic_management/controllers/__init__.py new file mode 100644 index 000000000..f4c0fd7f3 --- /dev/null +++ b/dental_clinic_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_clinic_management/controllers/dental_clinic.py b/dental_clinic_management/controllers/dental_clinic.py new file mode 100644 index 000000000..bf747e74b --- /dev/null +++ b/dental_clinic_management/controllers/dental_clinic.py @@ -0,0 +1,100 @@ +# -*- 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 _ +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_clinic_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""" + if len(kw.get('time_shift')) == 0: + raise UserError(_('Doctor Doesnot 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}') + + @route('/success_appointment', auth='public', website=True) + def success_appointment(self, **kwargs): + """Return when appointment creation is success""" + return request.render( + 'dental_clinic_management.website_rental_success_template', {'token': kwargs}) + + @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_clinic_management.website_all_doctors', + {'doctor_ids': doctor_id}) diff --git a/dental_clinic_management/controllers/patient_portal.py b/dental_clinic_management/controllers/patient_portal.py new file mode 100644 index 000000000..698bdde85 --- /dev/null +++ b/dental_clinic_management/controllers/patient_portal.py @@ -0,0 +1,65 @@ +# -*- 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_clinic_management.group_dental_manager') in request.env.user.groups_id: + domain = [] + elif request.env.ref('dental_clinic_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_clinic_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_clinic_management.prescription_portal_template', + {'prescription_details': prescription, 'page_name': 'prescription'}) diff --git a/dental_clinic_management/data/dental_department_data.xml b/dental_clinic_management/data/dental_department_data.xml new file mode 100644 index 000000000..9a66fb9de --- /dev/null +++ b/dental_clinic_management/data/dental_department_data.xml @@ -0,0 +1,15 @@ + + + + + + Clinical Department + + + Telehealth Department + + + Quality Assurance + + + diff --git a/dental_clinic_management/data/dental_specialist_data.xml b/dental_clinic_management/data/dental_specialist_data.xml new file mode 100644 index 000000000..e2f9715d3 --- /dev/null +++ b/dental_clinic_management/data/dental_specialist_data.xml @@ -0,0 +1,18 @@ + + + + + + Orthodontist + ORTHO + + + Periodontist + PEROD + + + Endodontist + ENDO + + + diff --git a/dental_clinic_management/data/dental_time_shift_data.xml b/dental_clinic_management/data/dental_time_shift_data.xml new file mode 100644 index 000000000..333f98294 --- /dev/null +++ b/dental_clinic_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_clinic_management/data/dental_treatment_data.xml b/dental_clinic_management/data/dental_treatment_data.xml new file mode 100644 index 000000000..7445e7eb0 --- /dev/null +++ b/dental_clinic_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_clinic_management/data/insurance_company_data.xml b/dental_clinic_management/data/insurance_company_data.xml new file mode 100644 index 000000000..f09dbbc52 --- /dev/null +++ b/dental_clinic_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_clinic_management/data/ir_sequence.xml b/dental_clinic_management/data/ir_sequence.xml new file mode 100644 index 000000000..350859836 --- /dev/null +++ b/dental_clinic_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_clinic_management/data/medicine_frequency_data.xml b/dental_clinic_management/data/medicine_frequency_data.xml new file mode 100644 index 000000000..560cbc800 --- /dev/null +++ b/dental_clinic_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_clinic_management/data/treatment_category_data.xml b/dental_clinic_management/data/treatment_category_data.xml new file mode 100644 index 000000000..3135c56a6 --- /dev/null +++ b/dental_clinic_management/data/treatment_category_data.xml @@ -0,0 +1,15 @@ + + + + + + Preventive Dentistry + + + Restorative Dentistry + + + Cosmetic Dentistry + + + diff --git a/dental_clinic_management/data/website_menu.xml b/dental_clinic_management/data/website_menu.xml new file mode 100644 index 000000000..eb97980fc --- /dev/null +++ b/dental_clinic_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_clinic_management/doc/RELEASE_NOTES.md b/dental_clinic_management/doc/RELEASE_NOTES.md new file mode 100644 index 000000000..242feab93 --- /dev/null +++ b/dental_clinic_management/doc/RELEASE_NOTES.md @@ -0,0 +1,6 @@ +## Module + +#### 21.03.2024 +#### Version 17.0.1.0.0 +#### ADD +Initial commit for Dental Clinic Management diff --git a/dental_clinic_management/models/__init__.py b/dental_clinic_management/models/__init__.py new file mode 100644 index 000000000..398ff6936 --- /dev/null +++ b/dental_clinic_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_clinic_management/models/dental_appointment.py b/dental_clinic_management/models/dental_appointment.py new file mode 100644 index 000000000..5a7235fd0 --- /dev/null +++ b/dental_clinic_management/models/dental_appointment.py @@ -0,0 +1,131 @@ +# -*- 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_clinic_management/models/dental_doctor.py b/dental_clinic_management/models/dental_doctor.py new file mode 100644 index 000000000..ec1e07241 --- /dev/null +++ b/dental_clinic_management/models/dental_doctor.py @@ -0,0 +1,65 @@ +# -*- 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 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") + 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 patient") + 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") + + 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_clinic_management/models/dental_medicine.py b/dental_clinic_management/models/dental_medicine.py new file mode 100644 index 000000000..438074469 --- /dev/null +++ b/dental_clinic_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_clinic_management/models/dental_patients.py b/dental_clinic_management/models/dental_patients.py new file mode 100644 index 000000000..a684dc49e --- /dev/null +++ b/dental_clinic_management/models/dental_patients.py @@ -0,0 +1,121 @@ +# -*- 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['company_type'] == 'person': + vals['is_patient'] = True + res = super(DentalPatients, self).create(vals) + if 'company_type' in vals and vals['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_clinic_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_clinic_management/models/dental_prescription.py b/dental_clinic_management/models/dental_prescription.py new file mode 100644 index 000000000..49be1a9a1 --- /dev/null +++ b/dental_clinic_management/models/dental_prescription.py @@ -0,0 +1,221 @@ +# -*- 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_clinic_management/models/dental_specialist.py b/dental_clinic_management/models/dental_specialist.py new file mode 100644 index 000000000..b09e7a7ca --- /dev/null +++ b/dental_clinic_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_clinic_management/models/dental_time_shift.py b/dental_clinic_management/models/dental_time_shift.py new file mode 100644 index 000000000..eacede9e4 --- /dev/null +++ b/dental_clinic_management/models/dental_time_shift.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 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") + end_time = fields.Float(string="End Time", help="End time of time slot") + + @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_clinic_management/models/dental_treatment.py b/dental_clinic_management/models/dental_treatment.py new file mode 100644 index 000000000..8222eeef2 --- /dev/null +++ b/dental_clinic_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_clinic_management/models/insurance_company.py b/dental_clinic_management/models/insurance_company.py new file mode 100644 index 000000000..cf876bd17 --- /dev/null +++ b/dental_clinic_management/models/insurance_company.py @@ -0,0 +1,32 @@ +# -*- 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_clinic_management/models/medical_questionnaire.py b/dental_clinic_management/models/medical_questionnaire.py new file mode 100644 index 000000000..8e8409785 --- /dev/null +++ b/dental_clinic_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="") + 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_clinic_management/models/medical_questions.py b/dental_clinic_management/models/medical_questions.py new file mode 100644 index 000000000..cd18b54b7 --- /dev/null +++ b/dental_clinic_management/models/medical_questions.py @@ -0,0 +1,51 @@ +# -*- 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_clinic_management/models/medicine_frequency.py b/dental_clinic_management/models/medicine_frequency.py new file mode 100644 index 000000000..51f0b11cb --- /dev/null +++ b/dental_clinic_management/models/medicine_frequency.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 MedicineFrequency(models.Model): + """To specifing 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 frquency of medicine how to eat") diff --git a/dental_clinic_management/models/treatment_category.py b/dental_clinic_management/models/treatment_category.py new file mode 100644 index 000000000..9a70d4d9b --- /dev/null +++ b/dental_clinic_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_clinic_management/report/dental_prescription_report.xml b/dental_clinic_management/report/dental_prescription_report.xml new file mode 100644 index 000000000..bf5acbc5a --- /dev/null +++ b/dental_clinic_management/report/dental_prescription_report.xml @@ -0,0 +1,14 @@ + + + + + Prescription Pdf + dental.prescription + qweb-pdf + dental_clinic_management.report_prescription + dental_clinic_management.report_prescription + 'Prescription Report - %s' % (object.sequence_no) + + report + + \ No newline at end of file diff --git a/dental_clinic_management/report/dental_prescription_templates.xml b/dental_clinic_management/report/dental_prescription_templates.xml new file mode 100644 index 000000000..69bc8cacb --- /dev/null +++ b/dental_clinic_management/report/dental_prescription_templates.xml @@ -0,0 +1,119 @@ + + + + + \ No newline at end of file diff --git a/dental_clinic_management/security/dental_clinic_management_groups.xml b/dental_clinic_management/security/dental_clinic_management_groups.xml new file mode 100644 index 000000000..38679e464 --- /dev/null +++ b/dental_clinic_management/security/dental_clinic_management_groups.xml @@ -0,0 +1,23 @@ + + + + + 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_clinic_management/security/dental_clinic_management_security.xml b/dental_clinic_management/security/dental_clinic_management_security.xml new file mode 100644 index 000000000..d3eb163e1 --- /dev/null +++ b/dental_clinic_management/security/dental_clinic_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_clinic_management/security/ir.model.access.csv b/dental_clinic_management/security/ir.model.access.csv new file mode 100644 index 000000000..b38745329 --- /dev/null +++ b/dental_clinic_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_clinic_management.group_dental_doctor,1,1,0,0 +access_user_dental_prescription,access.user.dental.prescription,model_dental_prescription,dental_clinic_management.group_dental_doctor,1,1,1,1 +access_user_dental_prescription_lines,access.user.dental.prescription_lines,model_dental_prescription_lines,dental_clinic_management.group_dental_doctor,1,1,1,1 +access_user_dental_specialist,access.user.dental.specialist,model_dental_specialist,dental_clinic_management.group_dental_doctor,1,0,0,0 +access_user_treatment_category,access.user.treatment.category,model_treatment_category,dental_clinic_management.group_dental_doctor,1,0,0,0 +access_user_dental_treatment,access.user.dental.treatment,model_dental_treatment,dental_clinic_management.group_dental_doctor,1,0,0,0 +access_user_insurance_company,access.user.insurance.company,model_insurance_company,dental_clinic_management.group_dental_doctor,1,0,0,0 +access_manager_dental_appointment,access.manager.dental.appointment,model_dental_appointment,dental_clinic_management.group_dental_manager,1,1,1,1 +access_manager_dental_prescription,access.manager.dental.prescription,model_dental_prescription,dental_clinic_management.group_dental_manager,1,1,1,1 +access_manager_dental_prescription_lines,access.manager.dental.prescription_lines,model_dental_prescription_lines,dental_clinic_management.group_dental_manager,1,1,1,1 +access_manager_dental_specialist,access.manager.dental.specialist,model_dental_specialist,dental_clinic_management.group_dental_manager,1,1,1,1 +access_manager_treatment_category,access.manager.treatment.category,model_treatment_category,dental_clinic_management.group_dental_manager,1,1,1,1 +access_manager_dental_treatment,access.manager.dental.treatment,model_dental_treatment,dental_clinic_management.group_dental_manager,1,1,1,1 +access_manager_insurance_company,access.manager.insurance.company,model_insurance_company,dental_clinic_management.group_dental_manager,1,1,1,1 diff --git a/dental_clinic_management/static/description/assets/icons/capture (1).png b/dental_clinic_management/static/description/assets/icons/capture (1).png new file mode 100644 index 000000000..8824deafc Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/capture (1).png differ diff --git a/dental_clinic_management/static/description/assets/icons/check.png b/dental_clinic_management/static/description/assets/icons/check.png new file mode 100644 index 000000000..c8e85f51d Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/check.png differ diff --git a/dental_clinic_management/static/description/assets/icons/chevron.png b/dental_clinic_management/static/description/assets/icons/chevron.png new file mode 100644 index 000000000..2089293d6 Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/chevron.png differ diff --git a/dental_clinic_management/static/description/assets/icons/cogs.png b/dental_clinic_management/static/description/assets/icons/cogs.png new file mode 100644 index 000000000..95d0bad62 Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/cogs.png differ diff --git a/dental_clinic_management/static/description/assets/icons/consultation.png b/dental_clinic_management/static/description/assets/icons/consultation.png new file mode 100644 index 000000000..8319d4baa Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/consultation.png differ diff --git a/dental_clinic_management/static/description/assets/icons/ecom-black.png b/dental_clinic_management/static/description/assets/icons/ecom-black.png new file mode 100644 index 000000000..a9385ff13 Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/ecom-black.png differ diff --git a/dental_clinic_management/static/description/assets/icons/education-black.png b/dental_clinic_management/static/description/assets/icons/education-black.png new file mode 100644 index 000000000..3eb09b27b Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/education-black.png differ diff --git a/dental_clinic_management/static/description/assets/icons/hotel-black.png b/dental_clinic_management/static/description/assets/icons/hotel-black.png new file mode 100644 index 000000000..130f613be Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/hotel-black.png differ diff --git a/dental_clinic_management/static/description/assets/icons/img.png b/dental_clinic_management/static/description/assets/icons/img.png new file mode 100644 index 000000000..70197f477 Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/img.png differ diff --git a/dental_clinic_management/static/description/assets/icons/license.png b/dental_clinic_management/static/description/assets/icons/license.png new file mode 100644 index 000000000..a5869797e Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/license.png differ diff --git a/dental_clinic_management/static/description/assets/icons/lifebuoy.png b/dental_clinic_management/static/description/assets/icons/lifebuoy.png new file mode 100644 index 000000000..658d56ccc Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/lifebuoy.png differ diff --git a/dental_clinic_management/static/description/assets/icons/manufacturing-black.png b/dental_clinic_management/static/description/assets/icons/manufacturing-black.png new file mode 100644 index 000000000..697eb0e9f Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/manufacturing-black.png differ diff --git a/dental_clinic_management/static/description/assets/icons/photo-capture.png b/dental_clinic_management/static/description/assets/icons/photo-capture.png new file mode 100644 index 000000000..06c111758 Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/photo-capture.png differ diff --git a/dental_clinic_management/static/description/assets/icons/pos-black.png b/dental_clinic_management/static/description/assets/icons/pos-black.png new file mode 100644 index 000000000..97c0f90c1 Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/pos-black.png differ diff --git a/dental_clinic_management/static/description/assets/icons/puzzle.png b/dental_clinic_management/static/description/assets/icons/puzzle.png new file mode 100644 index 000000000..65cf854e7 Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/puzzle.png differ diff --git a/dental_clinic_management/static/description/assets/icons/restaurant-black.png b/dental_clinic_management/static/description/assets/icons/restaurant-black.png new file mode 100644 index 000000000..4a35eb939 Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/restaurant-black.png differ diff --git a/dental_clinic_management/static/description/assets/icons/service-black.png b/dental_clinic_management/static/description/assets/icons/service-black.png new file mode 100644 index 000000000..301ab51cb Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/service-black.png differ diff --git a/dental_clinic_management/static/description/assets/icons/trading-black.png b/dental_clinic_management/static/description/assets/icons/trading-black.png new file mode 100644 index 000000000..9398ba2f1 Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/trading-black.png differ diff --git a/dental_clinic_management/static/description/assets/icons/training.png b/dental_clinic_management/static/description/assets/icons/training.png new file mode 100644 index 000000000..884ca024d Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/training.png differ diff --git a/dental_clinic_management/static/description/assets/icons/update.png b/dental_clinic_management/static/description/assets/icons/update.png new file mode 100644 index 000000000..ecbc5a01a Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/update.png differ diff --git a/dental_clinic_management/static/description/assets/icons/user.png b/dental_clinic_management/static/description/assets/icons/user.png new file mode 100644 index 000000000..6ffb23d9f Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/user.png differ diff --git a/dental_clinic_management/static/description/assets/icons/wrench.png b/dental_clinic_management/static/description/assets/icons/wrench.png new file mode 100644 index 000000000..6c04dea0f Binary files /dev/null and b/dental_clinic_management/static/description/assets/icons/wrench.png differ diff --git a/dental_clinic_management/static/description/assets/misc/Cybrosys R.png b/dental_clinic_management/static/description/assets/misc/Cybrosys R.png new file mode 100644 index 000000000..da4058087 Binary files /dev/null and b/dental_clinic_management/static/description/assets/misc/Cybrosys R.png differ diff --git a/dental_clinic_management/static/description/assets/misc/email.svg b/dental_clinic_management/static/description/assets/misc/email.svg new file mode 100644 index 000000000..15291cdc3 --- /dev/null +++ b/dental_clinic_management/static/description/assets/misc/email.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dental_clinic_management/static/description/assets/misc/phone.svg b/dental_clinic_management/static/description/assets/misc/phone.svg new file mode 100644 index 000000000..b7bd7f251 --- /dev/null +++ b/dental_clinic_management/static/description/assets/misc/phone.svg @@ -0,0 +1,3 @@ + + + diff --git a/dental_clinic_management/static/description/assets/misc/star (1) 2.svg b/dental_clinic_management/static/description/assets/misc/star (1) 2.svg new file mode 100644 index 000000000..5ae9f507a --- /dev/null +++ b/dental_clinic_management/static/description/assets/misc/star (1) 2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dental_clinic_management/static/description/assets/misc/support (1) 1.svg b/dental_clinic_management/static/description/assets/misc/support (1) 1.svg new file mode 100644 index 000000000..7d37a8f30 --- /dev/null +++ b/dental_clinic_management/static/description/assets/misc/support (1) 1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dental_clinic_management/static/description/assets/misc/support-email.svg b/dental_clinic_management/static/description/assets/misc/support-email.svg new file mode 100644 index 000000000..eb70370d6 --- /dev/null +++ b/dental_clinic_management/static/description/assets/misc/support-email.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/dental_clinic_management/static/description/assets/misc/tick-mark.svg b/dental_clinic_management/static/description/assets/misc/tick-mark.svg new file mode 100644 index 000000000..2dbb40187 --- /dev/null +++ b/dental_clinic_management/static/description/assets/misc/tick-mark.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/dental_clinic_management/static/description/assets/misc/whatsapp 1.svg b/dental_clinic_management/static/description/assets/misc/whatsapp 1.svg new file mode 100644 index 000000000..0bfaf8fc6 --- /dev/null +++ b/dental_clinic_management/static/description/assets/misc/whatsapp 1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dental_clinic_management/static/description/assets/misc/whatsapp.svg b/dental_clinic_management/static/description/assets/misc/whatsapp.svg new file mode 100644 index 000000000..b618aea1d --- /dev/null +++ b/dental_clinic_management/static/description/assets/misc/whatsapp.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dental_clinic_management/static/description/assets/modules/1.jpg b/dental_clinic_management/static/description/assets/modules/1.jpg new file mode 100644 index 000000000..08bbafeb6 Binary files /dev/null and b/dental_clinic_management/static/description/assets/modules/1.jpg differ diff --git a/dental_clinic_management/static/description/assets/modules/2.png b/dental_clinic_management/static/description/assets/modules/2.png new file mode 100644 index 000000000..a1209a01f Binary files /dev/null and b/dental_clinic_management/static/description/assets/modules/2.png differ diff --git a/dental_clinic_management/static/description/assets/modules/3.jpg b/dental_clinic_management/static/description/assets/modules/3.jpg new file mode 100644 index 000000000..3d171226b Binary files /dev/null and b/dental_clinic_management/static/description/assets/modules/3.jpg differ diff --git a/dental_clinic_management/static/description/assets/modules/4.jpg b/dental_clinic_management/static/description/assets/modules/4.jpg new file mode 100644 index 000000000..1f3f2e27f Binary files /dev/null and b/dental_clinic_management/static/description/assets/modules/4.jpg differ diff --git a/dental_clinic_management/static/description/assets/modules/5.jpg b/dental_clinic_management/static/description/assets/modules/5.jpg new file mode 100644 index 000000000..0db717519 Binary files /dev/null and b/dental_clinic_management/static/description/assets/modules/5.jpg differ diff --git a/dental_clinic_management/static/description/assets/modules/6.jpg b/dental_clinic_management/static/description/assets/modules/6.jpg new file mode 100644 index 000000000..cd62a577c Binary files /dev/null and b/dental_clinic_management/static/description/assets/modules/6.jpg differ diff --git a/dental_clinic_management/static/description/assets/screenshots/10.png b/dental_clinic_management/static/description/assets/screenshots/10.png new file mode 100644 index 000000000..d3e7dd6aa Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/10.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/11.png b/dental_clinic_management/static/description/assets/screenshots/11.png new file mode 100644 index 000000000..7de0ae3f2 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/11.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/12.png b/dental_clinic_management/static/description/assets/screenshots/12.png new file mode 100644 index 000000000..914d5c2f3 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/12.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/13.png b/dental_clinic_management/static/description/assets/screenshots/13.png new file mode 100644 index 000000000..79982ae37 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/13.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/14.png b/dental_clinic_management/static/description/assets/screenshots/14.png new file mode 100644 index 000000000..3082bf412 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/14.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/15.png b/dental_clinic_management/static/description/assets/screenshots/15.png new file mode 100644 index 000000000..5fc1ebc7d Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/15.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/16.png b/dental_clinic_management/static/description/assets/screenshots/16.png new file mode 100644 index 000000000..423a08831 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/16.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/17.png b/dental_clinic_management/static/description/assets/screenshots/17.png new file mode 100644 index 000000000..bf77afe9d Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/17.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/18.png b/dental_clinic_management/static/description/assets/screenshots/18.png new file mode 100644 index 000000000..6b2c921a4 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/18.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/19.png b/dental_clinic_management/static/description/assets/screenshots/19.png new file mode 100644 index 000000000..ca25e8163 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/19.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/2.png b/dental_clinic_management/static/description/assets/screenshots/2.png new file mode 100644 index 000000000..faa58883c Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/2.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/20.png b/dental_clinic_management/static/description/assets/screenshots/20.png new file mode 100644 index 000000000..7dae4e301 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/20.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/21.png b/dental_clinic_management/static/description/assets/screenshots/21.png new file mode 100644 index 000000000..8da4261bc Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/21.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/22.png b/dental_clinic_management/static/description/assets/screenshots/22.png new file mode 100644 index 000000000..7b7b83801 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/22.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/23.png b/dental_clinic_management/static/description/assets/screenshots/23.png new file mode 100644 index 000000000..5dd9172f4 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/23.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/24.png b/dental_clinic_management/static/description/assets/screenshots/24.png new file mode 100644 index 000000000..c68091899 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/24.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/25.png b/dental_clinic_management/static/description/assets/screenshots/25.png new file mode 100644 index 000000000..e901a0ce5 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/25.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/26.png b/dental_clinic_management/static/description/assets/screenshots/26.png new file mode 100644 index 000000000..3fdcfaa9e Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/26.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/27.png b/dental_clinic_management/static/description/assets/screenshots/27.png new file mode 100644 index 000000000..e44704192 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/27.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/28.png b/dental_clinic_management/static/description/assets/screenshots/28.png new file mode 100644 index 000000000..a26be1e35 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/28.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/29.png b/dental_clinic_management/static/description/assets/screenshots/29.png new file mode 100644 index 000000000..b835bbd41 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/29.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/3.png b/dental_clinic_management/static/description/assets/screenshots/3.png new file mode 100644 index 000000000..052e73184 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/3.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/30.png b/dental_clinic_management/static/description/assets/screenshots/30.png new file mode 100644 index 000000000..74e752555 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/30.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/31.png b/dental_clinic_management/static/description/assets/screenshots/31.png new file mode 100644 index 000000000..6d1e06449 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/31.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/32.png b/dental_clinic_management/static/description/assets/screenshots/32.png new file mode 100644 index 000000000..dad9e7f00 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/32.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/33.png b/dental_clinic_management/static/description/assets/screenshots/33.png new file mode 100644 index 000000000..10901f7c7 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/33.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/34.png b/dental_clinic_management/static/description/assets/screenshots/34.png new file mode 100644 index 000000000..ba1725908 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/34.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/35.png b/dental_clinic_management/static/description/assets/screenshots/35.png new file mode 100644 index 000000000..6a76ff82d Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/35.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/36.png b/dental_clinic_management/static/description/assets/screenshots/36.png new file mode 100644 index 000000000..f56933573 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/36.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/37.png b/dental_clinic_management/static/description/assets/screenshots/37.png new file mode 100644 index 000000000..8fc4e49d3 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/37.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/4.png b/dental_clinic_management/static/description/assets/screenshots/4.png new file mode 100644 index 000000000..40f65de0f Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/4.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/5.png b/dental_clinic_management/static/description/assets/screenshots/5.png new file mode 100644 index 000000000..f4dd13f19 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/5.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/6.png b/dental_clinic_management/static/description/assets/screenshots/6.png new file mode 100644 index 000000000..1ae5ac422 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/6.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/7.png b/dental_clinic_management/static/description/assets/screenshots/7.png new file mode 100644 index 000000000..e377fa00c Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/7.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/8.png b/dental_clinic_management/static/description/assets/screenshots/8.png new file mode 100644 index 000000000..5f06b3683 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/8.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/9.png b/dental_clinic_management/static/description/assets/screenshots/9.png new file mode 100644 index 000000000..c8852c275 Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/9.png differ diff --git a/dental_clinic_management/static/description/assets/screenshots/hero.gif b/dental_clinic_management/static/description/assets/screenshots/hero.gif new file mode 100644 index 000000000..7406d483d Binary files /dev/null and b/dental_clinic_management/static/description/assets/screenshots/hero.gif differ diff --git a/dental_clinic_management/static/description/banner.jpg b/dental_clinic_management/static/description/banner.jpg new file mode 100644 index 000000000..2906054e1 Binary files /dev/null and b/dental_clinic_management/static/description/banner.jpg differ diff --git a/dental_clinic_management/static/description/icon.png b/dental_clinic_management/static/description/icon.png new file mode 100644 index 000000000..e8626cc79 Binary files /dev/null and b/dental_clinic_management/static/description/icon.png differ diff --git a/dental_clinic_management/static/description/index.html b/dental_clinic_management/static/description/index.html new file mode 100644 index 000000000..d49e5e9ee --- /dev/null +++ b/dental_clinic_management/static/description/index.html @@ -0,0 +1,1149 @@ + + + + + + + Odoo App 3 Index + + + + + + + + +
+
+
+
+
+ +
+
+
+ Community +
+
+ Enterprise +
+
+
+
+
+
+

Dental Clinic Management

+

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

+
+ +
+
+
+
+
+

+ Key Highlights +

+
+
+
+
+
+ +
+
+

+ 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

+
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ 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.
+
+
+
+
+
+
+ +
+
+ +
+
+
+ Doctor Login
+

+ While login as doctor, Doctor can only view their appointments and prescriptions. +

+
+
+
+
+
+
+ +
+
+
+ Patient Login
+

+ Logined 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.
+
+
+
+ +
+
+
+
    +
  • + Patient records management, including medical history, + treatment plans, and billing information. +
  • +
  • + Billing and invoicing capabilities, + including insurance claims processing. +
  • +
  • + Integration with digital + imaging systems for X-rays and other diagnostic images. +
  • + +
  • + Patients can securely access their health + information, appointment schedules, and test results online. +
  • +
  • + Patients can schedule appointments, + view availability through their portal. +
  • +
+
+
+
+
+
+
Version + 17.0.1.0.0|Released on:22th March 2024 +
+

+ Initial Commit for Dental Clinic Management.

+
+
+
+
+
+
+
+

+ Related Products

+
+
+ +
+
+

+ Our Services

+ +
+
+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Customization

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Implementation

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Support

+
+
+
+
+
+
+ service-icon +
+
+

Hire + Odoo Developer

+
+
+
+
+ +
+
+ service-icon +
+
+

Odoo + Integration

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Migration

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Consultancy

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Implementation

+
+
+
+
+
+
+ service-icon +
+
+

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 + 99456767686 +
+
+
+
+
+
+
+
+
+ + + + + + diff --git a/dental_clinic_management/static/src/img/prescriptions.svg b/dental_clinic_management/static/src/img/prescriptions.svg new file mode 100644 index 000000000..6b3811746 --- /dev/null +++ b/dental_clinic_management/static/src/img/prescriptions.svg @@ -0,0 +1,36 @@ + + + + + + \ No newline at end of file diff --git a/dental_clinic_management/static/src/js/dental_clinic.js b/dental_clinic_management/static/src/js/dental_clinic.js new file mode 100644 index 000000000..3c40f7781 --- /dev/null +++ b/dental_clinic_management/static/src/js/dental_clinic.js @@ -0,0 +1,49 @@ +/** @odoo-module */ +import publicWidget from '@web/legacy/js/public/public_widget'; +import { jsonrpc } from "@web/core/network/rpc_service"; + + +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); + this.rpc = this.bindService("rpc"); + }, + _onSpecialisedChange: async function () { + var self = this + var specialised_id = this.$el.find('#specialised_id').val(); + await jsonrpc("/specialised_doctors", { + 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 jsonrpc("/doctors_shifts", { + 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_clinic_management/views/dental_appointment_views.xml b/dental_clinic_management/views/dental_appointment_views.xml new file mode 100644 index 000000000..70e2f8c81 --- /dev/null +++ b/dental_clinic_management/views/dental_appointment_views.xml @@ -0,0 +1,112 @@ + + + + + dental.appointment.search + dental.appointment + + + + + + + + + + + + + + + + + + + + + + dental.appointment.view.form + dental.appointment + +
+
+
+ + +
+ +
+
+

+
+ + + + + + + + + + + + + + + + + +
+
+ + +
+
+
+
+ + + + dental.appointment.view.tree + dental.appointment + + + + + + + + + + + + + +
diff --git a/dental_clinic_management/views/dental_clinic_management_menu.xml b/dental_clinic_management/views/dental_clinic_management_menu.xml new file mode 100644 index 000000000..51413696a --- /dev/null +++ b/dental_clinic_management/views/dental_clinic_management_menu.xml @@ -0,0 +1,110 @@ + + + + + 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_clinic_management/views/dental_clinic_template.xml b/dental_clinic_management/views/dental_clinic_template.xml new file mode 100644 index 000000000..6408856db --- /dev/null +++ b/dental_clinic_management/views/dental_clinic_template.xml @@ -0,0 +1,159 @@ + + + + + + + + + diff --git a/dental_clinic_management/views/dental_department_views.xml b/dental_clinic_management/views/dental_department_views.xml new file mode 100644 index 000000000..d6b4956e2 --- /dev/null +++ b/dental_clinic_management/views/dental_department_views.xml @@ -0,0 +1,20 @@ + + + + + hr.department.view.tree.inherit.dental.clinic.management + hr.department + + + + True + + + True + + + True + + + + diff --git a/dental_clinic_management/views/dental_doctor_views.xml b/dental_clinic_management/views/dental_doctor_views.xml new file mode 100644 index 000000000..e5e690578 --- /dev/null +++ b/dental_clinic_management/views/dental_doctor_views.xml @@ -0,0 +1,91 @@ + + + + + hr.employee.view.form.inherit.dental.clinic.management + hr.employee + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + 1 + + + 1 + + + + + + + hr.employee.view.tree.inherit.dental.clinic.management + hr.employee + + + + 1 + + + + + + + diff --git a/dental_clinic_management/views/dental_medicine_views.xml b/dental_clinic_management/views/dental_medicine_views.xml new file mode 100644 index 000000000..a975c053b --- /dev/null +++ b/dental_clinic_management/views/dental_medicine_views.xml @@ -0,0 +1,33 @@ + + + + + product.template.view.form.inherit.dental.clinic.management + product.template + + + + + + + + + + + + + + + + product.template.view.tree.inherit.dental.clinic.management + product.template + + + + + + + + + diff --git a/dental_clinic_management/views/dental_patients_views.xml b/dental_clinic_management/views/dental_patients_views.xml new file mode 100644 index 000000000..5db284c4b --- /dev/null +++ b/dental_clinic_management/views/dental_patients_views.xml @@ -0,0 +1,116 @@ + + + + + res.partner.view.form.inherit.dental.clinic.management + res.partner + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ Avatar +
+
+ +
+ +
+
+ +
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + company_type == 'person' + + + + company_type == 'person' + + + + company_type == 'person' + + + + company_type == 'person' + + + + company_type == 'person' + + + + company_type == 'person' + + + + company_type == 'company' + + + + company_type == 'company' + + + + company_type == 'company' + +
+
+
\ No newline at end of file diff --git a/dental_clinic_management/views/dental_prescription_views.xml b/dental_clinic_management/views/dental_prescription_views.xml new file mode 100644 index 000000000..4f26a754c --- /dev/null +++ b/dental_clinic_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_clinic_management/views/dental_specialist_views.xml b/dental_clinic_management/views/dental_specialist_views.xml new file mode 100644 index 000000000..7a2006066 --- /dev/null +++ b/dental_clinic_management/views/dental_specialist_views.xml @@ -0,0 +1,14 @@ + + + + + dental.specialist.view.tree + dental.specialist + + + + + + + + diff --git a/dental_clinic_management/views/dental_time_shift_views.xml b/dental_clinic_management/views/dental_time_shift_views.xml new file mode 100644 index 000000000..79044400f --- /dev/null +++ b/dental_clinic_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_clinic_management/views/dental_treatment_views.xml b/dental_clinic_management/views/dental_treatment_views.xml new file mode 100644 index 000000000..facb5903f --- /dev/null +++ b/dental_clinic_management/views/dental_treatment_views.xml @@ -0,0 +1,15 @@ + + + + + dental.treatment.view.tree + dental.treatment + + + + + + + + + diff --git a/dental_clinic_management/views/insurance_company_views.xml b/dental_clinic_management/views/insurance_company_views.xml new file mode 100644 index 000000000..ea589f60d --- /dev/null +++ b/dental_clinic_management/views/insurance_company_views.xml @@ -0,0 +1,15 @@ + + + + + insurance.company.view.tree + insurance.company + + + + + + + + + diff --git a/dental_clinic_management/views/medical_questions_views.xml b/dental_clinic_management/views/medical_questions_views.xml new file mode 100644 index 000000000..91d2f1f92 --- /dev/null +++ b/dental_clinic_management/views/medical_questions_views.xml @@ -0,0 +1,13 @@ + + + + + medical.questions.view.tree + medical.questions + + + + + + + diff --git a/dental_clinic_management/views/medicine_frequency_views.xml b/dental_clinic_management/views/medicine_frequency_views.xml new file mode 100644 index 000000000..6c1beaa3b --- /dev/null +++ b/dental_clinic_management/views/medicine_frequency_views.xml @@ -0,0 +1,14 @@ + + + + + medicine.frequency.view.tree + medicine.frequency + + + + + + + + diff --git a/dental_clinic_management/views/patient_portal_template.xml b/dental_clinic_management/views/patient_portal_template.xml new file mode 100644 index 000000000..0eb98d942 --- /dev/null +++ b/dental_clinic_management/views/patient_portal_template.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/dental_clinic_management/views/treatment_category_views.xml b/dental_clinic_management/views/treatment_category_views.xml new file mode 100644 index 000000000..50ed27b40 --- /dev/null +++ b/dental_clinic_management/views/treatment_category_views.xml @@ -0,0 +1,13 @@ + + + + + treatment.category.view.form + treatment.category + + + + + + + diff --git a/dental_clinic_management/wizard/__init__.py b/dental_clinic_management/wizard/__init__.py new file mode 100644 index 000000000..494ea33b4 --- /dev/null +++ b/dental_clinic_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_clinic_management/wizard/xray_report.py b/dental_clinic_management/wizard/xray_report.py new file mode 100644 index 000000000..b27e1f2b5 --- /dev/null +++ b/dental_clinic_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_clinic_management/wizard/xray_report_views.xml b/dental_clinic_management/wizard/xray_report_views.xml new file mode 100644 index 000000000..b75ef4a07 --- /dev/null +++ b/dental_clinic_management/wizard/xray_report_views.xml @@ -0,0 +1,23 @@ + + + + + xray.report.view.form + xray.report + +
+ + + + + + + + + +
+
+
+
\ No newline at end of file