From bf7301fa76b524e070f8d6a18f9d357cd58e4574 Mon Sep 17 00:00:00 2001 From: "watcha.h@almacom.co.th" Date: Tue, 13 Jan 2015 19:08:38 +0700 Subject: [PATCH] xxxx --- .../layouts/clinic_gen_visit_form.xml | 36 +-- netforce_clinic/models/__init__.py | 1 + netforce_clinic/models/gen_visit.py | 302 +++++++----------- netforce_clinic/models/gen_visit_time.py | 17 + netforce_clinic/models/hd_case.py | 5 +- 5 files changed, 149 insertions(+), 212 deletions(-) create mode 100644 netforce_clinic/models/gen_visit_time.py diff --git a/netforce_clinic/layouts/clinic_gen_visit_form.xml b/netforce_clinic/layouts/clinic_gen_visit_form.xml index 35ab8e4..860c659 100644 --- a/netforce_clinic/layouts/clinic_gen_visit_form.xml +++ b/netforce_clinic/layouts/clinic_gen_visit_form.xml @@ -1,36 +1,26 @@
- - - - - - - - - - - - - - - - - + - - + + - + + + + - - + + + + + - + diff --git a/netforce_clinic/models/__init__.py b/netforce_clinic/models/__init__.py index 12a0fbb..421f67b 100644 --- a/netforce_clinic/models/__init__.py +++ b/netforce_clinic/models/__init__.py @@ -40,6 +40,7 @@ from . import cycle_monthly from . import cycle_monthly_line from . import gen_visit from . import gen_visit_line +from . import gen_visit_time from . import fin_setting from . import payment from . import account_payment diff --git a/netforce_clinic/models/gen_visit.py b/netforce_clinic/models/gen_visit.py index ed583e9..c9afedd 100644 --- a/netforce_clinic/models/gen_visit.py +++ b/netforce_clinic/models/gen_visit.py @@ -2,6 +2,7 @@ from datetime import datetime, timedelta from netforce.access import get_active_user from netforce.model import Model, fields, get_model +from netforce.utils import get_data_path FMT_DATE="%Y-%m-%d" FMT_DATETIME="%Y-%m-%d %H:%M:%S" @@ -13,24 +14,12 @@ class GenVisit(Model): _fields={ 'date_from': fields.Date("From", required=True), 'date_to': fields.Date("To", required=True), - 'time_start': fields.Char("Time Start"), - 'time_stop': fields.Char("Time Stop"), - 'cycle_id': fields.Many2One("clinic.cycle","Cycle", required=True), 'patient_lines': fields.One2Many("clinic.gen.visit.line","gen_id","Patient Lines"), - 'nurse_lines': fields.One2Many("clinic.gen.visit.line","gen_id","Nurse Lines"), - 'monday': fields.Boolean("Monday"), - 'tuesday': fields.Boolean("Tuesdays"), - 'wednesday': fields.Boolean("Wednesdays"), - 'thursday': fields.Boolean("Thursdays"), - 'friday': fields.Boolean("Fridays"), - 'sathurday': fields.Boolean("Sathurday"), - 'sunday': fields.Boolean("Sunday"), - 'doctor_id': fields.Many2One("clinic.staff","Doctor",domain=[['type','=','doctor']]), - 'department_id': fields.Many2One("clinic.department","Department"), - #"patient_type": fields.Selection([("s","Social Security"),("u","UC."),("others","Others")],"Patient Type"), 'patient_type_id': fields.Many2One("clinic.patient.type","Patient Type"), 'patient_categ_id': fields.Many2One("clinic.patient.categ", "Patient Category"), - 'nurse_categ_id': fields.Many2One("clinic.staff.categ", "Nurse Category", domain=[['type','=','nurse']]), + 'time_lines': fields.One2Many("clinic.gen.visit.time","gen_id","Time Lines"), + 'department_id': fields.Many2One("clinic.department","Department"), + 'doctor_id': fields.Many2One("clinic.staff","Doctor",domain=[['type','=','doctor']]), } @@ -39,69 +28,28 @@ class GenVisit(Model): if not ids: ids=[context.get("refer_id")] lines=[] - # XXX [None] if any(ids): - lines=[{'patient_id': id} for id in ids] + lines=[{'patient_id': id} for id in ids if type(id)==type(1)] return lines - def _get_nurse(self,context={}): - user_id=get_active_user() - print("user_id ",user_id) - nurse_ids=get_model("clinic.nurse").search([['user_id','=',user_id]]) - if nurse_ids: - return nurse_ids[0] - return None - - def _get_cycle(self,context={}): - cycle_ids=get_model('clinic.cycle').search([],order="sequence") - if cycle_ids: - cycle_id=cycle_ids[0] - return cycle_id or None - - def _get_start(self,context={}): - cycle_ids=get_model('clinic.cycle').search([],order="sequence") - time_start="00:00" - if cycle_ids: - cycle_id=cycle_ids[0] - cycle=get_model('clinic.cycle').browse(cycle_id) - time_start=cycle.time_start - return time_start - - def _get_stop(self,context={}): - cycle_ids=get_model('clinic.cycle').search([],order="sequence") - time_stop="00:00" - if cycle_ids: - cycle_id=cycle_ids[0] - cycle=get_model('clinic.cycle').browse(cycle_id) - time_stop=cycle.time_stop - return time_stop + def _get_time_lines(self,context={}): + return [ + {'day': 'mon',}, + {'day': 'tue',}, + {'day': 'wed',}, + {'day': 'thu',}, + {'day': 'fri',}, + {'day': 'sat',}, + {'day': 'sun',}, + ] _defaults={ - 'patient_lines': _get_patient_lines, 'date_from': lambda *a: datetime.now().strftime(FMT_DATE), 'date_to': lambda *a: (datetime.now()+timedelta(days=7)).strftime(FMT_DATE), - 'time_start': _get_start, - 'time_stop': _get_stop, - 'nurse_id': _get_nurse, - 'duration': 2, - 'cycle_id': _get_cycle, + 'patient_lines': _get_patient_lines, + 'time_lines': _get_time_lines, } - def default_get(self,field_names=None,context=None,**kw): - vals=super().default_get(field_names,context,**kw) - wd=datetime.now().weekday() - wds={ - 0: 'monday', - 1: 'tuesday', - 2: 'wednesday', - 3: 'thursday', - 4: 'friday', - 5: 'sathurday', - 6: 'sunday', - } - vals[wds[wd]]=True - return vals - def onchange_cycle(self,context={}): data=context['data'] cycle_id=data['cycle_id'] @@ -114,18 +62,37 @@ class GenVisit(Model): def gen_visit(self,ids,context): obj=self.browse(ids)[0] visit_obj=get_model('clinic.visit') - days=[ - obj.monday and 1 or 0, - obj.tuesday and 2 or 0, - obj.wednesday and 3 or 0, - obj.thursday and 4 or 0, - obj.friday and 5 or 0, - obj.sathurday and 6 or 0, - obj.sunday and 7 or 0, - ] - days=[day for day in days if day] + days={} + for tline in obj.time_lines: + if tline.day and tline.cycle_id and tline.time_start and tline.time_stop: + day=tline.day + cycle_id=tline.cycle_id.id + time_start=tline.time_start + time_stop=tline.time_stop + d=0 + if day=='mon': + d=1 + elif day=='tue': + d=2 + elif day=='wed': + d=3 + elif day=='thu': + d=4 + elif day=='fri': + d=5 + elif day=='sat': + d=6 + elif day=='sun': + d=7 + days.update({ + d:{ + 'cycle_id': cycle_id, + 'time_start': time_start, + 'time_stop': time_stop, + }}) if not days: - raise Exception("Please select Day") + raise Exception("Please select Days") + visit_vals=[] date_from=datetime.strptime(obj.date_from,FMT_DATE) date_to=datetime.strptime(obj.date_to,FMT_DATE) @@ -144,33 +111,12 @@ class GenVisit(Model): else: raise Exception("Please select some patient or patient type") - nurse_vals=[] - for nurse_line in obj.nurse_lines: - nurse=nurse_line.nurse_id - # None - if nurse: - nurse_vals.append({ - 'id': nurse.id, - 'level_id': nurse.level_id.id, - }) - - if not nurse_vals and obj.nurse_categ_id: - for nurse in get_model("clinic.staff").search_browse([['type','=','nurse'],['categ_id','=',obj.nurse_categ_id.id]]): - nurse_vals.append({ - 'id': nurse.id, - 'level_id': nurse.level_id.id, - }) - - schedules={} - cycle=obj.cycle_id - cstart='%s:00'%cycle.time_start - cstop='%s:00'%cycle.time_stop - + day_choices=days.keys() for patient_id in patients: patient=get_model("clinic.patient").browse(patient_id) ntoday=1 day_total=(date_to-date_from).days+ntoday - for weekday in days: + for weekday in day_choices: wd=date_from.weekday() start_date=date_from while wd != weekday-1: @@ -181,6 +127,8 @@ class GenVisit(Model): continue count=0 tmp=start_date + cstart=days[weekday]['time_start'] + cstop=days[weekday]['time_stop'] while count < day_total: tmp=start_date+timedelta(days=count) ttime_start="%s %s" % (tmp.strftime(FMT_DATE),cstart) @@ -189,7 +137,7 @@ class GenVisit(Model): 'patient_id': patient_id, 'doctor_id': obj.doctor_id.id or patient.doctor_id.id, 'department_id': obj.department_id.id, - 'cycle_id': cycle.id, + 'cycle_id': days[weekday]['cycle_id'], 'time_start': ttime_start, 'time_stop': ttime_stop, 'state': 'pending', @@ -201,18 +149,10 @@ class GenVisit(Model): dom.append(['time_start','>=','%s %s'%(tmp.strftime(FMT_DATE)[0:10],' 00:00:00')]) dom.append(['time_stop','<=','%s %s'%(tmp.strftime(FMT_DATE)[0:10],' 23:59:59')]) dom.append(['patient_id', '=', patient_id]) - dom.append(['cycle_id', '=', obj.cycle_id.id]) #XXX + dom.append(['cycle_id', '=', days[weekday]['cycle_id']]) dom.append(['state','=','pending']) vids=visit_obj.search(dom) visit_obj.delete(vids) - key='%s/%s'%(vals['cycle_id'], vals['time_start']) - if not schedules.get(key): - schedules[key]={ - 'cycle_id': obj.cycle_id.id, - 'time_start': ttime_start, - 'time_stop': ttime_stop, - 'state':'pending', - } start_date=tmp user_id=get_active_user() staff_ids=get_model("clinic.staff").search([['type','=','type'],['user_id','=',user_id]]) @@ -222,40 +162,6 @@ class GenVisit(Model): for vals in visit_vals: vals['nurse_id']=confirm_id visit_obj.create(vals) - - print("create schedule") - print("="*50) - for k, v in schedules.items(): - cycle_id,time_start=k.split("/") - schedule_date=time_start[0:10] - dom=[] - dom.append(['date','=',schedule_date]) - schedules=get_model("clinic.schedule").search_browse(dom) - if schedules: - schedule=schedules[0] - if schedule.state=='draft': - for line in schedule.lines: - line.delete() - else: - vals={ - 'date': time_start[0:10], - 'time_start': time_start, - 'time_stop': time_start, - } - schedule_id=get_model("clinic.schedule").create(vals) - schedule=get_model("clinic.schedule").browse(schedule_id) - - lines=[] - for nv in nurse_vals: - nurse_id=nv['id'] - lines.append(('create',{ - 'nurse_id': nurse_id, - 'cycle_id': cycle_id, - })) - schedule.write({'lines': lines}) - - print("="*50) - return { 'next': { 'name': 'clinic_visit', @@ -266,21 +172,43 @@ class GenVisit(Model): def clear_visit(self,ids,context={}): obj=self.browse(ids)[0] - days=[ - obj.monday and 1 or 0, - obj.tuesday and 2 or 0, - obj.wednesday and 3 or 0, - obj.thursday and 4 or 0, - obj.friday and 5 or 0, - ] - days=[day for day in days if day] + days={} + for tline in obj.time_lines: + if tline.day and tline.cycle_id and tline.time_start and tline.time_stop: + day=tline.day + cycle_id=tline.cycle_id.id + time_start=tline.time_start + time_stop=tline.time_stop + d=0 + if day=='mon': + d=1 + elif day=='tue': + d=2 + elif day=='wed': + d=3 + elif day=='thu': + d=4 + elif day=='fri': + d=5 + elif day=='sat': + d=6 + elif day=='sun': + d=7 + days.update({ + d:{ + 'cycle_id': cycle_id, + 'time_start': time_start, + 'time_stop': time_stop, + }}) + if not days: + raise Exception("Please select Days") + visit_ids=[] date_from=datetime.strptime(obj.date_from,FMT_DATE) date_to=datetime.strptime(obj.date_to,FMT_DATE) # FIXME add more 1 week for make sure date_to2=(date_to+timedelta(days=7)).strftime(FMT_DATETIME) visit_obj=get_model("clinic.visit") - schedule_obj=get_model("clinic.schedule") patients=[p.patient_id.id for p in obj.patient_lines if p.patient_id] if not patients and obj.patient_type: @@ -288,7 +216,6 @@ class GenVisit(Model): elif not patients and obj.patient_categ_id: patients=get_model("clinic.patient").search([['categ_id','=',obj.patient_categ_id.id]]) elif patients: - # continue to create with critiria pass else: dom=[] @@ -297,15 +224,6 @@ class GenVisit(Model): dom.append(['state','=','pending']) vids=visit_obj.search(dom) visit_obj.delete(vids) - schedule_obj=get_model("clinic.schedule") - dom[-1][2]='draft' #XXX - schedules=schedule_obj.search_browse(dom) - schedule_ids=[] - for sch in schedules: - for line in sch.lines: - if obj.cycle_id.id==line.cycle_id.id: - schedule_ids.append(sch.id) - schedule_obj.delete(schedule_ids) return { 'next': { 'name': 'clinic_gen_visit_form', @@ -314,18 +232,18 @@ class GenVisit(Model): 'flash': 'Clear %s visits'%len(vids), } - if days: + day_choices=days.keys() + if day_choices: for patient_id in patients: # loop days in weekend ntoday=1 day_total=(date_to-date_from).days+ntoday - for weekday in days: + for weekday in day_choices: wd=date_from.weekday() start_date=date_from while wd != weekday-1: start_date+=timedelta(days=1) wd=start_date.weekday() - #XXX should gen only in scop if start_date.strftime(FMT_DATE) > date_to.strftime(FMT_DATE): continue @@ -339,32 +257,31 @@ class GenVisit(Model): dom.append(['time_start','>=','%s'%time_start]) dom.append(['time_stop','<=','%s'%time_stop]) dom.append(['patient_id','=','%s'%patient_id]) + dom.append(['cycle_id','=','%s'%days[weekday]['cycle_id']]) dom.append(['state','=','pending']) count+=7 vids=visit_obj.search(dom) + print('x dom ', vids) if vids: visit_ids.append(vids[0]) start_date=tmp - else: - time_start=obj.date_from - time_stop=obj.date_to - for patient_id in patients: - dom=[] - dom.append(['time_start','>=','%s'%time_start]) - dom.append(['time_stop','<=','%s'%time_stop]) - dom.append(['patient_id','=','%s'%patient_id]) - dom.append(['state','=','pending']) - vids=visit_obj.search(dom) - if vids: - visit_ids.append(vids[0]) + else: + # discard + time_start=obj.date_from + time_stop=obj.date_to + for patient_id in patients: + dom=[] + dom.append(['time_start','>=','%s'%time_start]) + dom.append(['time_stop','<=','%s'%time_stop]) + dom.append(['patient_id','=','%s'%patient_id]) + dom.append(['state','=','pending']) + print('dom ', dom) + vids=visit_obj.search(dom) + if vids: + visit_ids.append(vids[0]) if visit_ids: get_model("clinic.visit").delete(visit_ids) - dom=[] - dom.append(['time_start','>=','%s %s'%(obj.date_from[0:10],' 00:00:00')]) - dom.append(['time_stop','<=','%s %s'%(date_to2[0:10],' 23:59:59')]) - dom.append(['cycle_id','=',obj.cycle_id.id]) - schedule_ids=schedule_obj.search(dom) - schedule_obj.delete(schedule_ids) + return { 'next': { 'name': 'clinic_visit', @@ -373,5 +290,16 @@ class GenVisit(Model): 'flash': 'Clear %s visits'%len(visit_ids), } + def onchange_cycle_line(self,context={}): + data=context['data'] + path=context['path'] + line=get_data_path(data,path,parent=True) + cycle_id=line['cycle_id'] + if cycle_id: + cycle=get_model('clinic.cycle').browse(cycle_id) + line['time_start']=cycle.time_start + line['time_stop']=cycle.time_stop + return data + GenVisit.register() diff --git a/netforce_clinic/models/gen_visit_time.py b/netforce_clinic/models/gen_visit_time.py new file mode 100644 index 0000000..f0c7382 --- /dev/null +++ b/netforce_clinic/models/gen_visit_time.py @@ -0,0 +1,17 @@ +from netforce.model import Model, fields, get_model + +class GenVisitTime(Model): + _name="clinic.gen.visit.time" + _transient=True + + _fields={ + 'gen_id': fields.Many2One("clinic.gen.visit","gen_id","Gen Visit"), + 'day': fields.Selection([('mon', 'Monday'), ('tue','Tuesday'), ('wed','Wedsday'),('thu','Thursday'),('fri','Friday'),('sat','Satherday'),('sun','Sunday')], 'Days'), + 'cycle_id': fields.Many2One("clinic.cycle","Cycle"), + 'time_start': fields.Char("Time Start"), + 'time_stop': fields.Char("Time Stop"), + } + + +GenVisitTime.register() + diff --git a/netforce_clinic/models/hd_case.py b/netforce_clinic/models/hd_case.py index 7b139d1..3933351 100644 --- a/netforce_clinic/models/hd_case.py +++ b/netforce_clinic/models/hd_case.py @@ -990,6 +990,7 @@ class HDCase(Model): for line in vals['lines']: mode=line[0] amt=0 + rmb='no' if mode=='create': line_vals=line[1] amt=line_vals.get("amount",0) @@ -1003,11 +1004,11 @@ class HDCase(Model): line['uom_id']=prod.uom_id.id continue line_id=line[1][0] - line_vals=line[1] + line_vals=line[2] + rmb=line_vals.get("reimbursable","no") line=get_model('clinic.hd.case.line').browse(line_id) amt=line.amount or 0 total_amt+=amt - rmb=line_vals.get("reimbursable","no") if rmb=='no': due_amt+=amt else: