import time from datetime import datetime from calendar import monthrange from netforce.model import Model, fields, get_model from netforce.access import get_active_user, set_active_user from . import utils class PatientMove(Model): _name="clinic.patient.move" _fields={ 'patient_id': fields.Many2One('clinic.patient','Patient',search=True, required=True), 'patient_type_id': fields.Many2One("clinic.patient.type","Patient Type"), 'date': fields.Date("Date", required=True,search=True), 'location_from_id': fields.Many2One("clinic.department","Location From",search=True,required=True), 'location_to_id': fields.Many2One("clinic.department","Location To",search=True,required=True), "state": fields.Selection([['normal','Normal'],['new','New'],['dispose','Dispose']], "State"), 'note': fields.Text("Note",search=True), } _defaults={ 'date': lambda *a: time.strftime("%Y-%m-%d"), 'state': 'normal', } def onchange_patient(self, context={}): data=context['data'] patient_id=data['patient_id'] patient=get_model('clinic.patient').browse(patient_id) location_from_id=patient.department_id.id location_to_id=get_model('clinic.patient')._get_department(context) data.update({ 'location_from_id': location_from_id, 'location_to_id': location_to_id, 'patient_type_id': patient.type_id.id, }) return data def dispose_patient(self, ids, context={}): obj=self.browse(ids)[0] if obj.state=='new': obj.patient_id.write({ 'dispose': False, }) elif obj.state=='dispose': obj.patient_id.write({ 'dispose': True, }) else: pass def create(self, vals, **kw): new_id=super().create(vals, **kw) obj=self.browse(new_id) obj.dispose_patient() return new_id def write(self, ids, vals, **kw): super().write(ids, vals, **kw) for obj in self.browse(ids): obj.dispose_patient() def get_data(self, date, department_id, context={}): if not date: raise Exception("Missing date!") y,m,d=date.split("-") y=int(y) m=int(m) weekday, day_month=monthrange(y, m) cond1=[ ['date','>=','%s-%s-01'%(y,str(m).zfill(2))], ['date','<=','%s-%s-%s'%(y,str(m).zfill(2),day_month)], ['location_to_id','=', department_id], ] cond=cond1+[['state','=','normal']] ids=self.search(cond) move_ids=ids prev_month=len(ids) cond=cond1+[['state','=','new']] ids=self.search(cond) move_ids+=ids current_month=len(ids) current_items=[] for index, val in enumerate(self.read(ids)): val['no']=index+1 current_items.append(val) cond=cond1+[['state','=','dispose']] ids=self.search(cond) dispose_ids=ids dispose_month=len(ids) dispose_items=[] for index, val in enumerate(self.read(ids)): val['no']=index+1 dispose_items.append(val) move_ids=[id for id in move_ids if id not in dispose_ids] # group by type types={} for move in get_model("clinic.patient.move").browse(move_ids): type_name=move.patient_type_id.name types.setdefault(type_name,0) types[type_name]+=1 patient_types={} for pt in get_model("clinic.patient.type").search_browse([]): patient_types[pt.name]=types.get(pt.name, '') type_lines=[] type_names=sorted(patient_types.keys()) for type_name in type_names: qty=patient_types[type_name] type_lines.append({ 'name': type_name, 'qty': qty, }) next_month=prev_month+current_month-dispose_month prev_m=m-1 if prev_m <= 0: prev_m=1 next_m=m+1 if next_m > 12: next_m=1 prev_month_thai=utils.MONTHS['th_TH'][prev_m] current_month_thai=utils.MONTHS['th_TH'][m] dispose_month_thai=utils.MONTHS['th_TH'][m] next_month_thai=utils.MONTHS['th_TH'][next_m] res={ 'prev_month': prev_month, 'prev_month_thai': prev_month_thai, 'current_month': current_month, 'current_month_thai': current_month_thai, 'current_items': current_items, 'dispose_month': dispose_month, 'dispose_month_thai': dispose_month_thai, 'dispose_items': dispose_items, 'next_month': next_month, 'next_month_thai': next_month_thai, 'type_lines': type_lines, } return res def auto_get_data(self, date, department_id, context={}): user_id=get_active_user() set_active_user(1) datenow=time.strftime("%Y-%m-%d") if not date: raise Exception("Missing date!") if not department_id: raise Exception("Missing department!") y,m,d=date.split("-") weekday, day_month=monthrange(int(y), int(m)) cond=[ ['date','>=','%s-%s-01'%(y,m)], ['date','<=','%s-%s-%s'%(y,m,day_month)], ['location_to_id','=',department_id], ] res=self.search(cond) #XXX reset data if res and date > datenow: ids=self.search(cond) print("reset data...") print(ids) self.delete(ids) res=None # copy data from previous month if not res: y=int(y) m=int(m)-1 if m<=0: m=1 y-=1 weekday, day_month=monthrange(int(y), int(m)) cond=[ ['date','>=','%s-%s-01'%(y,m)], ['date','<=','%s-%s-%s'%(y,m,day_month)], ['location_to_id','=',department_id], ] res=self.search_browse(cond) for obj in res: if obj.state=='dispose': continue vals={ 'location_from_id': obj.location_from_id.id, 'location_to_id': obj.location_to_id.id, 'patient_id': obj.patient_id.id, 'patient_type_id': obj.patient_type_id.id, 'date': date, } self.create(vals) # copy from patient if not res: cond=[ ['walkin','=','no'], ['dispose','=',False], ] locations={ 'LS-FL1': 1, 'LS-FL2': 2, 'LS-FL3': 3, 'SS-FL3': 4, 'SS-FL4': 5, } for obj in get_model("clinic.patient").search_browse(cond): if not obj.location: continue locs=obj.location.split(",") vals={ 'location_from_id': locations[locs[0]], #first 'location_to_id': locations[locs[-1]], #last 'patient_id': obj.id, 'patient_type_id': obj.type_id.id, 'note': obj.note, 'date': date, } self.create(vals) set_active_user(user_id) PatientMove.register()