You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							584 lines
						
					
					
						
							28 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							584 lines
						
					
					
						
							28 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								################################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
							 | 
						|
								#    Author: Subina P (odoo@cybrosys.com)
							 | 
						|
								#
							 | 
						|
								#    You can modify it under the terms of the GNU AFFERO
							 | 
						|
								#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
							 | 
						|
								#
							 | 
						|
								#    This program is distributed in the hope that it will be useful,
							 | 
						|
								#    but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						|
								#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						|
								#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
							 | 
						|
								#
							 | 
						|
								#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
							 | 
						|
								#    (AGPL v3) along with this program.
							 | 
						|
								#    If not, see <http://www.gnu.org/licenses/>.
							 | 
						|
								#
							 | 
						|
								################################################################################
							 | 
						|
								import math
							 | 
						|
								import re
							 | 
						|
								import base64
							 | 
						|
								from datetime import date
							 | 
						|
								from barcode import EAN13
							 | 
						|
								from barcode.writer import ImageWriter
							 | 
						|
								from dateutil.relativedelta import *
							 | 
						|
								from odoo import api, fields, models
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class ResPartner(models.Model):
							 | 
						|
								    """Inherited to add more fields and functions"""
							 | 
						|
								    _inherit = 'res.partner'
							 | 
						|
								    _description = 'Hospital Patients'
							 | 
						|
								
							 | 
						|
								    date_of_birth = fields.Date(string='Date of Birth',
							 | 
						|
								                                help='Date of birth of the patient')
							 | 
						|
								    blood_group = fields.Selection(string='Blood Group',
							 | 
						|
								                                   help='Blood group of the patient',
							 | 
						|
								                                   selection=[('a', 'A'), ('b', 'B'),
							 | 
						|
								                                              ('o', 'O'), ('ab', 'AB')])
							 | 
						|
								    rh_type = fields.Selection(selection=[('-', '-ve'), ('+', '+ve')],
							 | 
						|
								                               string='RH Type',
							 | 
						|
								                               help='Rh type of the blood group')
							 | 
						|
								    gender = fields.Selection(selection=[
							 | 
						|
								        ('male', 'Male'), ('female', 'Female'), ('other', 'Other')
							 | 
						|
								    ], string='Gender', help='Gender of the patient')
							 | 
						|
								    marital_status = fields.Selection(selection=[
							 | 
						|
								        ('married', 'Married'), ('unmarried', 'Unmarried'), ('widow', 'Widow'),
							 | 
						|
								        ('widower', 'Widower'), ('divorcee', 'Divorcee')
							 | 
						|
								    ], string='Marital Status', help='Marital status of patient')
							 | 
						|
								    is_alive = fields.Selection(
							 | 
						|
								        string='Status',
							 | 
						|
								        selection=[('alive', 'Alive'), ('dead', 'Dead')],
							 | 
						|
								        default='alive', help='True for alive patient')
							 | 
						|
								    patient_seq = fields.Char(string='Patient No.',
							 | 
						|
								                              help='Sequence number of the patient', copy=False,
							 | 
						|
								                              readonly=True, index=True,
							 | 
						|
								                              default=lambda self: 'New')
							 | 
						|
								    notes = fields.Html(string='Note', help='Notes regarding the notes',
							 | 
						|
								                        sanitize_style=True)
							 | 
						|
								    patient_profession = fields.Char(string="Profession",
							 | 
						|
								                                     help="Profession of patient")
							 | 
						|
								    doctor_id = fields.Many2one('hr.employee',
							 | 
						|
								                                domain=[('job_id.name', '=', 'Doctor')],
							 | 
						|
								                                string="Family Doctor",
							 | 
						|
								                                help='Family doctor of the patient')
							 | 
						|
								    barcode = fields.Char(string='Barcode', help='Barcode for the patient')
							 | 
						|
								    barcode_png = fields.Binary(string='Barcode PNG',
							 | 
						|
								                                help='Image file of the barcode', readonly=True)
							 | 
						|
								    group = fields.Selection(selection=[
							 | 
						|
								        ('hindu', 'Hindu'), ('muslim', 'Muslim'), ('christian', 'Christian')],
							 | 
						|
								        string="Ethnic Group", help="Specify your religion")
							 | 
						|
								    risk = fields.Text(string="Genetic Risks",
							 | 
						|
								                       help='Genetic risks of the patient')
							 | 
						|
								    insurance_id = fields.Many2one('hospital.insurance',
							 | 
						|
								                                   string="Insurance",
							 | 
						|
								                                   help="Patient insurance")
							 | 
						|
								    unique_id = fields.Char(string='Unique ID',
							 | 
						|
								                            help="Unique identifier to fetch "
							 | 
						|
								                                 "patient insurance data")
							 | 
						|
								    family_ids = fields.One2many('hospital.family',
							 | 
						|
								                                 'family_id',
							 | 
						|
								                                 string="Family ID", help='Family of a patient')
							 | 
						|
								    lab_test_ids = fields.One2many('patient.lab.test',
							 | 
						|
								                                   'patient_id',
							 | 
						|
								                                   string='Lab Test',
							 | 
						|
								                                   help='Lab tests for the patient')
							 | 
						|
								    prescription_ids = fields.One2many('prescription.line',
							 | 
						|
								                                       'res_partner_id',
							 | 
						|
								                                       string='Prescription',
							 | 
						|
								                                       help='Prescription for patient')
							 | 
						|
								    economic_level = fields.Selection(selection=[
							 | 
						|
								        ('low', 'Lower Class'), ('middle', 'Middle Class'),
							 | 
						|
								        ('upper', 'Upper Class')], string="Socioeconomic",
							 | 
						|
								        help="Specify your economic status")
							 | 
						|
								    education_level = fields.Selection(selection=[
							 | 
						|
								        ('post', 'Post Graduation'), ('graduation', 'Graduation'),
							 | 
						|
								        ('pre', 'Pre Graduation')], string="Education Level",
							 | 
						|
								        help="Education status of patient")
							 | 
						|
								    house_level = fields.Selection(selection=[
							 | 
						|
								        ('good', 'Good'), ('bad', 'Bad'), ('poor', 'Poor')],
							 | 
						|
								        string="House Condition", help="Specify your house's condition")
							 | 
						|
								    work_home = fields.Boolean(string='Work At Home',
							 | 
						|
								                               help='True if you are working from home')
							 | 
						|
								    hours_outside = fields.Integer(string='Hours Stay Outside Home',
							 | 
						|
								                                   help="Specify how many hours you stay away "
							 | 
						|
								                                        "from home")
							 | 
						|
								    hostile = fields.Boolean(string='Hostile Area',
							 | 
						|
								                             help="Specify your house in a friendly "
							 | 
						|
								                                  "neighbourhood ")
							 | 
						|
								    income = fields.Monetary(string='Income', help="The in come of patient")
							 | 
						|
								    currency_id = fields.Many2one('res.currency', string='Currency',
							 | 
						|
								                                  help='Currency in which invoices and payments'
							 | 
						|
								                                       ' will be generated',
							 | 
						|
								                                  default=lambda self: self.env.user.company_id
							 | 
						|
								                                  .currency_id.id, required=True)
							 | 
						|
								    sanitary = fields.Boolean('Sanitary Sewers',
							 | 
						|
								                              help="A sewer or sewer system for carrying off "
							 | 
						|
								                                   "wastewater, waste matter from a residence,"
							 | 
						|
								                                   " business, etc")
							 | 
						|
								    running = fields.Boolean(string='Running Water',
							 | 
						|
								                             help="water that comes into a building through "
							 | 
						|
								                                  "pipes. A cabin with hot and cold running "
							 | 
						|
								                                  "water.")
							 | 
						|
								    electricity = fields.Boolean(string='Electricity',
							 | 
						|
								                                 help='True if you have electricity')
							 | 
						|
								    gas = fields.Boolean(string='Gas Supply',
							 | 
						|
								                         help='True if you have gas supply')
							 | 
						|
								    trash = fields.Boolean(string='Trash Collection',
							 | 
						|
								                           help='True if you have trash collection')
							 | 
						|
								    home_phone = fields.Boolean(string='Telephone',
							 | 
						|
								                                help='True if you have telephone')
							 | 
						|
								    tv = fields.Boolean(string='Television', help='True if you have television')
							 | 
						|
								    internet = fields.Boolean(string='Internet',
							 | 
						|
								                              help='True if you have internet')
							 | 
						|
								    help = fields.Selection([('yes', 'Yes'), ('no', 'No')],
							 | 
						|
								                            string="Family Help",
							 | 
						|
								                            help="Specify whether your family is willing "
							 | 
						|
								                                 "to help or not")
							 | 
						|
								    discussion = fields.Selection([('yes', 'Yes'), ('no', 'No')],
							 | 
						|
								                                  string="Family Discussion ",
							 | 
						|
								                                  help="Specify your family have a good "
							 | 
						|
								                                       "discussion at home ")
							 | 
						|
								    ability = fields.Selection([('very', 'Very good'), ('good', 'Good'),
							 | 
						|
								                                ('bad', 'Bad'), ('poor', 'Poor')],
							 | 
						|
								                               string="Family Ability",
							 | 
						|
								                               help="family status of the patient")
							 | 
						|
								    time_sharing = fields.Selection([('yes', 'Yes'), ('no', 'No')],
							 | 
						|
								                                    string=" Family Time Sharing ",
							 | 
						|
								                                    help="Specify your family share time "
							 | 
						|
								                                         "at home ")
							 | 
						|
								    affection = fields.Selection([('very', 'Very good'),
							 | 
						|
								                                  ('good', 'Good'),
							 | 
						|
								                                  ('bad', 'Bad'), ('poor', 'Poor')],
							 | 
						|
								                                 string="Family Affection ",
							 | 
						|
								                                 help="Specify your family's affection ")
							 | 
						|
								    single = fields.Boolean(string='Single Parent Family',
							 | 
						|
								                            help='Whether single parent family or not')
							 | 
						|
								    violence = fields.Boolean(string='Domestic Violence',
							 | 
						|
								                              help='True if you are facing any domestic '
							 | 
						|
								                                   'violence')
							 | 
						|
								    children = fields.Boolean(string='Working Children',
							 | 
						|
								                              help='Do you have working children')
							 | 
						|
								    abuse = fields.Boolean(string='Sexual Abuse',
							 | 
						|
								                           help='Do you faced any sexual abuse')
							 | 
						|
								    drug = fields.Boolean(string='Drug Addiction',
							 | 
						|
								                          help='Do you have drug addiction')
							 | 
						|
								    withdrawal = fields.Boolean(string='Withdrawal',
							 | 
						|
								                                help='Do you faced any withdrawal symptoms')
							 | 
						|
								    in_prison = fields.Boolean(string='Has Been In Prison',
							 | 
						|
								                               help='True if you had been in prison')
							 | 
						|
								    current_prison = fields.Boolean(string='Currently In Prison',
							 | 
						|
								                                    help='True if you are in prison currently')
							 | 
						|
								    relative_prison = fields.Boolean(string='Relative In Prison',
							 | 
						|
								                                     help='True if any of your relative is '
							 | 
						|
								                                          'in prison')
							 | 
						|
								    hospital_vaccination_ids = fields.One2many(
							 | 
						|
								        'hospital.vaccination', 'patient_id',
							 | 
						|
								        string='Vaccination', help='Vaccination details of '
							 | 
						|
								                                   'patient')
							 | 
						|
								    fertile = fields.Boolean(string='Fertile', help="""Capable of developing 
							 | 
						|
								                                             into a complete organism; 
							 | 
						|
								                                             fertilized. Capable of supporting 
							 | 
						|
								                                             plant life; favorable to the 
							 | 
						|
								                                             growth of crops and plants.""")
							 | 
						|
								    menarche_age = fields.Integer(string='Menarche Age', help="""The first 
							 | 
						|
								                                     menstrual period in a female adolescent""")
							 | 
						|
								    pause = fields.Boolean(string='Menopause', help="""Menopause is a point in 
							 | 
						|
								                                 time 12 months after a woman's last period""")
							 | 
						|
								    pause_age = fields.Integer(string='Menopause Age',
							 | 
						|
								                               help='Age at which menopause occurred')
							 | 
						|
								    pap = fields.Boolean(string='PAP Test',
							 | 
						|
								                         help="""
							 | 
						|
								                         A procedure in which a small brush is used to gently 
							 | 
						|
								                         remove cells from the surface of the cervix and the 
							 | 
						|
								                         area around it so they can be checked under a 
							 | 
						|
								                         microscope for cervical cancer or cell changes that
							 | 
						|
								                         may lead to cervical cancer.""")
							 | 
						|
								    colposcopy = fields.Boolean(string='Colposcopy', help=""" test to take a
							 | 
						|
								                            closer look at your cervix""")
							 | 
						|
								    self = fields.Boolean(string='Self breast examination',
							 | 
						|
								                          help="A breast self-exam for breast awareness is "
							 | 
						|
								                               "in inspection "
							 | 
						|
								                               "of your breasts that women do on your own")
							 | 
						|
								    mommography = fields.Boolean(string='Mommography',
							 | 
						|
								                                 help="Mammograms can be used to look for "
							 | 
						|
								                                      "breast cancer")
							 | 
						|
								    last_pap = fields.Date(string="Last PAP Test",
							 | 
						|
								                           help='The date on which last PAP test has been done')
							 | 
						|
								    last_col = fields.Date(string="Last Colposcopy",
							 | 
						|
								                           help='The date on which last colposcopy has been '
							 | 
						|
								                                'done')
							 | 
						|
								    deceased = fields.Boolean(string='Deceased during 1st week',
							 | 
						|
								                              help='The family member deceased during first '
							 | 
						|
								                                   'week')
							 | 
						|
								    grandiva = fields.Boolean(string='Grandiva', help='True for grandiva')
							 | 
						|
								    alive = fields.Boolean(string='Born Alive', help='Whether born alive or '
							 | 
						|
								                                                     'not')
							 | 
						|
								    premature = fields.Integer(string='Premature',
							 | 
						|
								                               help="Premature birth is birth that happens too"
							 | 
						|
								                                    "soon, before 37 weeks of pregnancy")
							 | 
						|
								    abortions = fields.Integer(string='No Of Abortions', help='Number of '
							 | 
						|
								                                                              'abortions of '
							 | 
						|
								                                                              'patient')
							 | 
						|
								    exercise = fields.Boolean(string='Exercise', help='True if patient doing '
							 | 
						|
								                                                      'exercise regularly')
							 | 
						|
								    minute = fields.Integer(string='Minute/Day', help='The duration of '
							 | 
						|
								                                                      'exercise per day')
							 | 
						|
								
							 | 
						|
								    day_sleep = fields.Boolean(string='Sleeps At Daytime', help='True if '
							 | 
						|
								                                                                'sleeps at '
							 | 
						|
								                                                                'daytime')
							 | 
						|
								    sleep_hrs = fields.Integer(string='Sleep Hours', help='Duration of sleep')
							 | 
						|
								    meals = fields.Integer(string='Meals/Day', help='Number of meals per day')
							 | 
						|
								    alone = fields.Boolean(string='Eat Alone', help='True if eats alone')
							 | 
						|
								    coffee = fields.Boolean(string='Coffee', help='True if you have a habit '
							 | 
						|
								                                                  'of drinking coffee')
							 | 
						|
								    cup = fields.Integer(string='Cups/Day', help='Number of cups of coffee '
							 | 
						|
								                                                 'per day')
							 | 
						|
								    drink = fields.Boolean(string='Soft Drink', help='True if you drinks soft '
							 | 
						|
								                                                     'drinks')
							 | 
						|
								    salt = fields.Boolean(string='Salt', help='True if you use salt')
							 | 
						|
								    diet = fields.Boolean(string='Currently On Diet', help='True if you are '
							 | 
						|
								                                                           'on diet currently')
							 | 
						|
								    smoke = fields.Boolean(string='Smoker', help='True for smoker')
							 | 
						|
								    ex_smoke = fields.Boolean(string='Ex-Smoker', help='True for ex-smoker')
							 | 
						|
								    age_start = fields.Integer(string='Age of Started Smoking',
							 | 
						|
								                               help='Age on which you started your smoking')
							 | 
						|
								    cigarettes = fields.Integer(string='Cigarettes/Day',
							 | 
						|
								                                help='Number of cigarettes per day')
							 | 
						|
								    passive = fields.Boolean(string='Passive Smoker',
							 | 
						|
								                             help='True for passive smokers')
							 | 
						|
								    age_quit = fields.Integer(string='Age of Quitting',
							 | 
						|
								                              help='Age at which you quit your smoking habit')
							 | 
						|
								    alcoholic = fields.Boolean(string='Alcoholic', help='True for alcoholics')
							 | 
						|
								    ex_alcoholic = fields.Boolean(string='Ex-Alcoholic', help='True for ex- '
							 | 
						|
								                                                              'alcoholics')
							 | 
						|
								    age_start_alco = fields.Integer(string='Age to Start Drinking',
							 | 
						|
								                                    help='Age at which you started your '
							 | 
						|
								                                         'drinking habit')
							 | 
						|
								    beer = fields.Integer(string='Beer/Day',
							 | 
						|
								                          help='Number of beers per day')
							 | 
						|
								    liquor = fields.Integer(string='Liquor/Day',
							 | 
						|
								                            help='Liquors per day')
							 | 
						|
								    wine = fields.Integer(string='Wine/Day',
							 | 
						|
								                          help='Number of wines per day')
							 | 
						|
								    age_quit_alcoholic = fields.Integer(string='Age Of Quitting',
							 | 
						|
								                                        help='Age at which you started your '
							 | 
						|
								                                             'drinking habit')
							 | 
						|
								    drugs = fields.Boolean(string='Drug User', help='True for drug users')
							 | 
						|
								    ex_drugs = fields.Boolean(string='Ex-Drug User', help='True for Ex drug '
							 | 
						|
								                                                          'user')
							 | 
						|
								    iv_user = fields.Boolean(string='IV Drug User', help='True for IV drug '
							 | 
						|
								                                                         'user')
							 | 
						|
								    age_start_drug = fields.Integer(string='Age to Start Using Drugs',
							 | 
						|
								                                    help='Age at which you started using drug')
							 | 
						|
								    age_quit_drug = fields.Integer(string='Drug Quitting Age', help='Age of '
							 | 
						|
								                                                                    'quitting '
							 | 
						|
								                                                                    'drug')
							 | 
						|
								    orientation = fields.Selection([('straight', 'Straight'),
							 | 
						|
								                                    ('homo', 'Homosexual'),
							 | 
						|
								                                    ('trans', 'Trans-Gender')],
							 | 
						|
								                                   string="Orientation")
							 | 
						|
								    age_sex = fields.Integer(string="Age of First Encounter",
							 | 
						|
								                             help='Age of first sex encounter')
							 | 
						|
								    partners = fields.Integer(string="No of Partners",
							 | 
						|
								                              help='Number of sex partners')
							 | 
						|
								    anti = fields.Selection(
							 | 
						|
								        [('pills', 'Contraceptive Pills'), ('ring', 'Contraceptive Ring'),
							 | 
						|
								         ('injection', 'Contraceptive Injection')],
							 | 
						|
								        string="Contraceptive Methods", help='Choose your contraceptive method')
							 | 
						|
								    oral = fields.Boolean(string='Oral Sex', help=("uttered by the mouth or in "
							 | 
						|
								                                                   "words"))
							 | 
						|
								    anal = fields.Boolean(string='Anal Sex', help="True if you are "
							 | 
						|
								                                                  "encountering anal sex")
							 | 
						|
								    prostitute = fields.Boolean(string='Prostitute', help='True for '
							 | 
						|
								                                                          'prostitutes')
							 | 
						|
								    prostitute_sex = fields.Boolean(string='Sex With Prostitute',
							 | 
						|
								                                    help='True if you are encountered sex '
							 | 
						|
								                                         'with prostitute')
							 | 
						|
								    sex_notes = fields.Text(string='Notes', help='Write down the notes')
							 | 
						|
								    rider = fields.Boolean(string='Motorcycle Rider', help='True for '
							 | 
						|
								                                                           'motorcycle riders')
							 | 
						|
								    helmet = fields.Boolean(string='Uses Helmet',
							 | 
						|
								                            help='True if you regularly use helmet')
							 | 
						|
								    laws = fields.Boolean(string='Obey Traffic Laws',
							 | 
						|
								                          help='True if you obey traffic rules')
							 | 
						|
								    revision = fields.Boolean(string='Car Revision', help='True if car '
							 | 
						|
								                                                          'revision is done')
							 | 
						|
								    belt = fields.Boolean(string='Seat Belt',
							 | 
						|
								                          help='True if you uses seat belt regularly')
							 | 
						|
								    safety = fields.Boolean(string='Car Child Safety',
							 | 
						|
								                            help='True if you have car child safety')
							 | 
						|
								    home = fields.Boolean(string='Home Safety', help='True for home safety')
							 | 
						|
								    occupation = fields.Char(string='Occupation', help='Your occupation')
							 | 
						|
								
							 | 
						|
								    @api.model
							 | 
						|
								    def create(self, vals):
							 | 
						|
								        """Inherits create function for sequence generation"""
							 | 
						|
								        if vals.get('patient_seq', 'New') == 'New':
							 | 
						|
								            vals['patient_seq'] = self.env['ir.sequence'].next_by_code(
							 | 
						|
								                'patient.sequence') or 'New'
							 | 
						|
								        return super().create(vals)
							 | 
						|
								
							 | 
						|
								    def action_view_invoice(self):
							 | 
						|
								        """Returns patient invoice"""
							 | 
						|
								        self.ensure_one()
							 | 
						|
								        return {
							 | 
						|
								            'name': 'Patient Invoice',
							 | 
						|
								            'view_mode': 'tree,form',
							 | 
						|
								            'res_model': 'account.move',
							 | 
						|
								            'type': 'ir.actions.act_window',
							 | 
						|
								            'domain': [('partner_id', '=', self.id)],
							 | 
						|
								            'context': "{'create':False}"
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								    def name_get(self):
							 | 
						|
								        """Returns the patient name"""
							 | 
						|
								        result = []
							 | 
						|
								        for rec in self:
							 | 
						|
								            result.append((rec.id, f'{rec.patient_seq} - {rec.name}'))
							 | 
						|
								        return result
							 | 
						|
								
							 | 
						|
								    def alive_status(self):
							 | 
						|
								        """Function for setting the value of is_alive field"""
							 | 
						|
								        if self.is_alive == 'alive':
							 | 
						|
								            self.is_alive = 'dead'
							 | 
						|
								        else:
							 | 
						|
								            self.is_alive = 'alive'
							 | 
						|
								
							 | 
						|
								    def action_schedule(self):
							 | 
						|
								        """Returns form view of hospital appointment wizard"""
							 | 
						|
								        return {
							 | 
						|
								            'type': 'ir.actions.act_window',
							 | 
						|
								            'res_model': 'hospital.outpatient',
							 | 
						|
								            'view_type': 'form',
							 | 
						|
								            'view_mode': 'form',
							 | 
						|
								            'target': 'new',
							 | 
						|
								            'views': [[False, 'form']],
							 | 
						|
								            'context': {
							 | 
						|
								                'default_patient_id': self.id
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								    @api.model
							 | 
						|
								    def ean_checksum(self, eancode):
							 | 
						|
								        """Returns the checksum of an ean string of length 13, returns -1 if
							 | 
						|
								            the string has the wrong length"""
							 | 
						|
								        if len(eancode) != 13:
							 | 
						|
								            return -1
							 | 
						|
								        odd_sum = 0
							 | 
						|
								        even_sum = 0
							 | 
						|
								        ean_value = eancode
							 | 
						|
								        reverse_value = ean_value[::-1]
							 | 
						|
								        final_ean = reverse_value[1:]
							 | 
						|
								        for i in range(len(final_ean)):
							 | 
						|
								            if i % 2 == 0:
							 | 
						|
								                odd_sum += int(final_ean[i])
							 | 
						|
								            else:
							 | 
						|
								                even_sum += int(final_ean[i])
							 | 
						|
								        total = (odd_sum * 3) + even_sum
							 | 
						|
								        check = int(10 - math.ceil(total % 10.0)) % 10
							 | 
						|
								        return check
							 | 
						|
								
							 | 
						|
								    def check_ean(eancode):
							 | 
						|
								        """Returns True if eancode is a valid ean13 string, or null"""
							 | 
						|
								        if not eancode:
							 | 
						|
								            return True
							 | 
						|
								        if len(eancode) != 13:
							 | 
						|
								            return False
							 | 
						|
								        int(eancode)
							 | 
						|
								        return eancode.ean_checksum(eancode) == int(eancode[-1])
							 | 
						|
								
							 | 
						|
								    def generate_ean(self, ean):
							 | 
						|
								        """Creates and returns a valid ean13 from an invalid one"""
							 | 
						|
								        if not ean:
							 | 
						|
								            return "0000000000000"
							 | 
						|
								        ean = re.sub("[A-Za-z]", "0", ean)
							 | 
						|
								        ean = re.sub("[^0-9]", "", ean)
							 | 
						|
								        ean = ean[:13]
							 | 
						|
								        if len(ean) < 13:
							 | 
						|
								            ean = ean + '0' * (13 - len(ean))
							 | 
						|
								            return ean[:-1] + str(self.ean_checksum(ean))
							 | 
						|
								
							 | 
						|
								    def action_generate_patient_card(self):
							 | 
						|
								        """Method for generating the patient card"""
							 | 
						|
								        current_age = 0
							 | 
						|
								        gender_caps = ''
							 | 
						|
								        blood_caps = ''
							 | 
						|
								        if not self.barcode:
							 | 
						|
								            ean = self.sudo().generate_ean(str(self.id))
							 | 
						|
								            self.sudo().write({'barcode': ean})
							 | 
						|
								            number = self.barcode
							 | 
						|
								            my_code = EAN13(number, writer=ImageWriter())
							 | 
						|
								            my_code.save("code")
							 | 
						|
								            with open('code.png', 'rb') as f:
							 | 
						|
								                self.sudo().write({
							 | 
						|
								                    'barcode_png': base64.b64encode(f.read())
							 | 
						|
								                })
							 | 
						|
								        if self.gender:
							 | 
						|
								            gender_caps = self.gender.capitalize()
							 | 
						|
								        if self.blood_group:
							 | 
						|
								            blood_caps = self.blood_group.capitalize()
							 | 
						|
								        if self.date_of_birth:
							 | 
						|
								            today = date.today()
							 | 
						|
								            dob = self.date_of_birth
							 | 
						|
								            current_age = relativedelta(today, dob).years
							 | 
						|
								        company = self.env['res.company'].sudo().search(
							 | 
						|
								            [('id', '=', self.env.context['allowed_company_ids'])])
							 | 
						|
								        data = {
							 | 
						|
								            'name': self.name,
							 | 
						|
								            'code': self.patient_seq,
							 | 
						|
								            'age': current_age,
							 | 
						|
								            'gender': gender_caps,
							 | 
						|
								            'dob': self.date_of_birth,
							 | 
						|
								            'blood': blood_caps + str(self.rh_type),
							 | 
						|
								            'street': self.street,
							 | 
						|
								            'street2': self.street2,
							 | 
						|
								            'state': self.state_id.name,
							 | 
						|
								            'country': self.country_id.name,
							 | 
						|
								            'city': self.city,
							 | 
						|
								            'phone': self.phone,
							 | 
						|
								            'image': self.sudo().read(['image_1920'])[0],
							 | 
						|
								            'barcode': self.sudo().read(['barcode_png'])[0],
							 | 
						|
								            'company_name': company.name,
							 | 
						|
								            'company_street': company.street,
							 | 
						|
								            'company_street2': company.street2,
							 | 
						|
								            'company_city': company.city,
							 | 
						|
								            'company_state': company.state_id.name,
							 | 
						|
								            'company_zip': company.zip,
							 | 
						|
								        }
							 | 
						|
								        return self.env.ref(
							 | 
						|
								            'base_hospital_management.action_report_patient_card'
							 | 
						|
								        ).report_action(None, data=data)
							 | 
						|
								
							 | 
						|
								    @api.model
							 | 
						|
								    def reception_op_barcode(self, kw):
							 | 
						|
								        """Returns a patient based on the barcode"""
							 | 
						|
								        values = {
							 | 
						|
								            'name': '',
							 | 
						|
								            'date_of_birth': '',
							 | 
						|
								            'phone': '',
							 | 
						|
								            'blood_group': '',
							 | 
						|
								            'gender': '',
							 | 
						|
								        }
							 | 
						|
								        if kw['patient_data']:
							 | 
						|
								            patient = self.sudo().search(
							 | 
						|
								                ['|', ('id', '=', kw['patient_data']),
							 | 
						|
								                 ('phone', '=', kw['patient_data'])])
							 | 
						|
								            if patient:
							 | 
						|
								                values = {
							 | 
						|
								                    'name': patient.name,
							 | 
						|
								                    'date_of_birth': patient.date_of_birth,
							 | 
						|
								                    'phone': patient.phone,
							 | 
						|
								                    'blood_group': patient.blood_group,
							 | 
						|
								                    'gender': patient.gender,
							 | 
						|
								                }
							 | 
						|
								        return values
							 | 
						|
								
							 | 
						|
								    @api.model
							 | 
						|
								    def reception_op_phone(self, phone):
							 | 
						|
								        """Returns a patient details having the phone number"""
							 | 
						|
								        patient_phone = self.sudo().search(
							 | 
						|
								            [('phone', '=', phone['patient-phone'])])
							 | 
						|
								        return {
							 | 
						|
								            'patient_seq': patient_phone.patient_seq,
							 | 
						|
								            'name': patient_phone.name,
							 | 
						|
								            'date_of_birth': patient_phone.date_of_birth,
							 | 
						|
								            'blood_group': patient_phone.blood_group,
							 | 
						|
								            'gender': patient_phone.gender,
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								    @api.model
							 | 
						|
								    def action_get_patient_data(self, patient_id):
							 | 
						|
								        """Method which returns patient details"""
							 | 
						|
								        data = self.sudo().search([
							 | 
						|
								            '|', ('patient_seq', '=', patient_id),
							 | 
						|
								            ('barcode', '=', patient_id)
							 | 
						|
								        ])
							 | 
						|
								        patient_history = []
							 | 
						|
								        for rec in self.env['hospital.outpatient'].sudo().search(
							 | 
						|
								                [('patient_id', '=', data.id)]):
							 | 
						|
								            patient_history.append(
							 | 
						|
								                [rec.op_reference, str(rec.op_date),
							 | 
						|
								                 rec.doctor_id.doctor_id.name])
							 | 
						|
								        values = {
							 | 
						|
								            'name': data.name,
							 | 
						|
								            'unique': data.patient_seq,
							 | 
						|
								            'email': data.email,
							 | 
						|
								            'phone': data.phone,
							 | 
						|
								            'dob': data.date_of_birth,
							 | 
						|
								            'image_1920': data.image_1920,
							 | 
						|
								            'status': data.marital_status,
							 | 
						|
								            'history': patient_history,
							 | 
						|
								        }
							 | 
						|
								        if not data.name:
							 | 
						|
								            values['name'] = 'Patient Not Found'
							 | 
						|
								        if not data.patient_seq:
							 | 
						|
								            values['unique'] = ''
							 | 
						|
								        if data.blood_group:
							 | 
						|
								            blood_caps = data.blood_group.capitalize()
							 | 
						|
								            values['blood_group'] = blood_caps + str(data.rh_type)
							 | 
						|
								        else:
							 | 
						|
								            values['blood_group'] = ''
							 | 
						|
								        if data.gender:
							 | 
						|
								            gender_caps = data.gender.capitalize()
							 | 
						|
								            values['gender'] = gender_caps
							 | 
						|
								        else:
							 | 
						|
								            values['gender'] = ''
							 | 
						|
								        return values
							 | 
						|
								
							 | 
						|
								    @api.model
							 | 
						|
								    def create_sale_order_pharmacy(self, order):
							 | 
						|
								        """Method for creating sale order for medicines"""
							 | 
						|
								        medicine = []
							 | 
						|
								        op_record = self.env['hospital.outpatient'].sudo().search(
							 | 
						|
								            [('op_reference', '=', order), '|',
							 | 
						|
								             ('active', 'in', [False, True])])
							 | 
						|
								        for rec in op_record.prescription_ids:
							 | 
						|
								            medicine.append([rec.medicine_id.id, rec.quantity])
							 | 
						|
								        sale_order_pharmacy = self.env['sale.order'].sudo().create({
							 | 
						|
								            'partner_id': op_record.patient_id.id,
							 | 
						|
								        })
							 | 
						|
								        for new in medicine:
							 | 
						|
								            self.env['sale.order.line'].sudo().create({
							 | 
						|
								                'product_id': new[0],
							 | 
						|
								                'product_uom_qty': new[1],
							 | 
						|
								                'order_id': sale_order_pharmacy.id,
							 | 
						|
								            })
							 | 
						|
								
							 | 
						|
								    @api.model
							 | 
						|
								    def create_patient(self, post):
							 | 
						|
								        """Method for creating a patient"""
							 | 
						|
								        if post and not post['patient_id']:
							 | 
						|
								            patient = self.sudo().search([('name', '=', post['op_name'])])
							 | 
						|
								            if not patient:
							 | 
						|
								
							 | 
						|
								                patient = self.sudo().create({
							 | 
						|
								                    'name': post['op_name'],
							 | 
						|
								                    'blood_group': post['op_blood_group'],
							 | 
						|
								                    'gender': post['op_gender']
							 | 
						|
								                })
							 | 
						|
								                if 'op_dob' in post.keys():
							 | 
						|
								                    patient.sudo().write({'date_of_birth': post['op_dob']})
							 | 
						|
								        else:
							 | 
						|
								            patient = self.sudo().search([('id', '=', post['patient_id'])])
							 | 
						|
								            out_patient = self.env['hospital.outpatient'].sudo().search([('patient_id','=', patient.id)])
							 | 
						|
								            if not out_patient:
							 | 
						|
								                self.env['hospital.outpatient'].sudo().create({
							 | 
						|
								                    'patient_id': patient.id,
							 | 
						|
								                    'op_date': post['date'],
							 | 
						|
								                    'reason': post['reason'],
							 | 
						|
								                    'slot': post['slot'],
							 | 
						|
								                    'doctor_id': self.env['doctor.allocation'].sudo().browse(
							 | 
						|
								                        post['doctor']).id
							 | 
						|
								                })
							 | 
						|
								
							 | 
						|
								    @api.model
							 | 
						|
								    def fetch_patient_data(self):
							 | 
						|
								        """Method for returning patient data"""
							 | 
						|
								        return self.sudo().search_read(
							 | 
						|
								            [('patient_seq', 'not in', ['New', 'Employee', 'User'])])
							 | 
						|
								
							 |