import time from calendar import monthrange from datetime import datetime, timedelta #from calendar import monthrange from netforce.model import Model, fields, get_model from netforce.access import get_active_company from . import utils DRT=0 HD_STATE={ "draft":"Draft", 'waiting_treatment':'Waiting Treatment', "in_progress":"In Progress", "completed":"Finish Treatment", 'paid':'Paid', "waiting_payment":"Waiting Payment", "discountinued":"Discountinued", "cancelled":"Cancelled" } class VisitBoard(Model): _name="clinic.visit.board" _string="Visit Board" _transient=True _fields={ "date": fields.Date("Month", required=True), "date_from": fields.Date("From", required=True), "date_to": fields.Date("To", required=True), 'patient_id': fields.Many2One("clinic.patient","Patient"), } _defaults={ 'date': lambda *a: time.strftime("%Y-%m-%d"), 'date_from': lambda *a: time.strftime("%Y-%m-%d"), 'date_to': lambda *a: (datetime.now()+timedelta(days=DRT)).strftime("%Y-%m-%d"), } def get_report_data(self,ids,context={}): company_id=get_active_company() company=get_model("company").browse(company_id) date_from=datetime.now().strftime("%Y-%m-%d") date_to=(datetime.now()+timedelta(days=DRT)).strftime("%Y-%m-%d") patient_id=None if ids: obj=self.browse(ids)[0] date_from=obj.date_from date_to=obj.date_to patient_id=obj.patient_id.id time_start='%s 00:00:00'%(date_from) time_stop='%s 23:59:59'%(date_to) dom=[] dom.append(['time_start','>=','%s'%time_start]) dom.append(['time_stop','<=','%s'%time_stop]) if patient_id: dom.append(['patient_id','=',patient_id]) lines=[] empty_line={ 'no': '', 'number': '', 'visit_id': None, 'cycle_name': '', 'cycle_color': '', 'patient_id': None, 'patient_name': '', 'patient_type': '', 'patient_type_id': None, 'doctor_name': '', 'doctor_id': None, 'hd_case_number': '', 'hd_case_id': None, 'success_color': '', 'date':'', 'title': True, 'footer': False, 'details':'', 'hd_case_state': '', 'hn': '', } patient_types={t['id']:t['name'] for t in get_model("clinic.patient.type").search_read([[]],['name'])} cycle_names={t['id']:t['name'] for t in get_model("clinic.cycle").search_read([[]],['name'])} total_wait=0 total_done=0 total_cancel=0 types={} cycles={} no=1 for visit in get_model("clinic.visit").search_browse(dom): if visit.state in ('draft','pending'): total_wait+=1 elif visit.state in ('confirmed'): total_done+=1 else: total_cancel+=1 hd_case_id=None hd_case_number='' hd_case_state='' visit_color='' sickbed_name='N/A' sickbed_id=None if visit.hd_cases: hd_case=visit.hd_cases[0] sickbed_name=hd_case.sickbed_id.name or "N/A" sickbed_id=hd_case.sickbed_id.id hd_case_id=hd_case.id, if hd_case.number=='/': hd_case_number='*รอการรรักษา' else: hd_case_number=hd_case.number hd_case_state=hd_case.state if hd_case_state=='completed': visit_color='#99ff99' hd_case_number+=" (เสร็จสิ้น)" elif hd_case_state=='in_progress': hd_case_number+=' (กำลังรักษา)' number=visit.number if number=='/': number='*รอการยืนยัน' cycle=visit.cycle_id patient=visit.patient_id hn_name=patient.hn or '-' visit_date=visit.visit_date if visit.state=='cancelled': visit_color='#dbdbdb', if visit.number=='/': number='*(ยกเลิก)' else: number+='(ยกเลิก)' print('sickbed_id ', sickbed_id) line={ 'number': number, 'hn_name': hn_name, 'visit_id': visit.id, 'sickbed_name': sickbed_name, 'sickbed_id': sickbed_id, 'cycle_name': cycle.name, 'cycle_color': cycle.color, 'patient_name': patient.name, 'patient_id': patient.id, 'patient_type': patient.type_id.name or "", 'patient_type_id': patient.type_id.id or None, 'doctor_name': visit.doctor_id.name, 'doctor_id': visit.doctor_id.id, 'hd_case_number': hd_case_number, 'hd_case_id': hd_case_id, 'visit_color': visit_color, 'date': visit_date, 'title': False, 'footer': False, 'details':'', 'no': no, 'note': visit.note, 'hd_case_state':HD_STATE.get(hd_case_state,''), } lines.append(line) no+=1 if not types.get(visit_date): ptype={} [ptype.setdefault(t,0) for t in patient_types.keys()] types[visit_date]=ptype types[visit_date][patient.type_id.id]+=1 if not cycles.get(visit_date): cycle_name={} [cycle_name.setdefault(cid,0) for cid in cycle_names.keys()] cycles[visit_date]=cycle_name cycles[visit_date][cycle.id]+=1 dates=[] index=0 total_qty=0 count=0 for line in lines: date=line['date'] if not date: continue if date not in dates: count=0 total_qty=0 line=empty_line.copy() for qty in types[date].values(): total_qty+=qty line['cycle_name']=utils.date2thai(date,format='%(Td)s %(d)s %(Tm)s',lang="th_TH2"), lines.insert(index,line) dates.append(date) if count==total_qty and not patient_id: index+=1 # footer line=empty_line.copy() patient_str='[%s]'%', '.join('%s: %s'%(patient_types[k],v) for k,v in types[date].items()) cycle_str='[%s]'%', '.join('%s: %s'%(cycle_names[k],v) for k,v in cycles[date].items()) summary_str='[%s]'%', '.join(['รับไว้: %s'%total_wait,'จำหน่ายแล้ว: %s'%total_done, 'ยกเลิก: %s'%total_cancel]) line['details']='ทั้งหมด %s: %s'%(total_qty,', '.join([summary_str,cycle_str,patient_str])) line['footer']=True line['title']=False lines.insert(index,line) count+=1 index+=1 has_duration=False if date_from != date_to: has_duration=True data={ 'lines': lines, 'date': utils.date2thai(date_from,format='ประจำวัน%(Td)s ที่ %(d)s %(Tm)s %(BY)s'), 'company_name': company.name, 'company_parent_name': company.parent_id.name, 'has_duration': has_duration, 'date_from': utils.date2thai(date_from,format='%(d)s %(Tm)s %(By)s',lang="th_TH2"), 'date_to': utils.date2thai(date_to,format='%(d)s %(Tm)s %(By)s',lang="th_TH2"), } return data def onchange_date(self,context={}): data=context['data'] date=data['date'] year,month,day=date.split("-") weekday, total_day=monthrange(int(year), int(month)) data['date_from']="%s-%s-01"%(year,month) data['date_to']="%s-%s-%s"%(year,month,total_day) return data def make_visit(self,ids,context={}): return { 'next': { 'name': 'clinic_visit', 'mode': 'form', } } VisitBoard.register()