187 lines
6.1 KiB
Python
187 lines
6.1 KiB
Python
import time
|
|
import datetime
|
|
import xlrd
|
|
import xmltodict
|
|
|
|
from netforce.model import Model, fields, get_model
|
|
from netforce.access import get_active_company
|
|
from netforce.utils import get_file_path
|
|
from netforce.utils import get_data_path
|
|
from netforce.database import get_connection
|
|
|
|
class ImportPayment(Model):
|
|
_name="clinic.import.payment"
|
|
_transient=True
|
|
|
|
_fields={
|
|
'date': fields.DateTime("Date"),
|
|
'file': fields.File("File"),
|
|
'result': fields.Text("Success"),
|
|
'hcode': fields.Char("Hospital Code"),
|
|
}
|
|
|
|
def get_hcode(self,context={}):
|
|
settings=get_model("settings").browse(1)
|
|
hcode=settings.hospital_code or ""
|
|
return hcode
|
|
|
|
_defaults={
|
|
'date': lambda *a: time.strftime("%Y-%m-%d %H:%M:%S"),
|
|
'hcode': get_hcode,
|
|
}
|
|
|
|
def read_excel(self,fpath=None):
|
|
data={}
|
|
if fpath:
|
|
suffix=fpath.split(".")[-1]
|
|
if suffix not in ('xls', 'xlsx'):
|
|
raise Exception("ERROR : please should file xls or xlsx")
|
|
wb=xlrd.open_workbook(fpath)
|
|
sheet=wb.sheet_by_name("Sheet1")
|
|
# read header values into the list
|
|
keys = [sheet.cell(0, col_index).value for col_index in range(sheet.ncols)]
|
|
data=[]
|
|
for row_index in range(1, sheet.nrows):
|
|
#d = {(keys[col_index] or "").lower(): sheet.cell(row_index, col_index).value for col_index in range(sheet.ncols)}
|
|
d={}
|
|
for col_index in range(sheet.ncols):
|
|
ctype=sheet.cell(row_index,col_index).ctype
|
|
if ctype==3:
|
|
value=sheet.cell(row_index, col_index).value
|
|
year, month, day, hour, minute, second = xlrd.xldate_as_tuple(value,wb.datemode)
|
|
value=datetime.datetime(year, month, day, hour, minute,second)
|
|
value=value.strftime("%Y-%m-%d")
|
|
else:
|
|
value=sheet.cell(row_index, col_index).value
|
|
d.update({(keys[col_index] or "").lower():value})
|
|
data.append(d)
|
|
return data
|
|
|
|
def read_xml(self,fpath=None,node=""):
|
|
data={}
|
|
if not node:
|
|
return data
|
|
if fpath:
|
|
suffix=fpath.split(".")[-1]
|
|
if suffix not in ('xml'):
|
|
raise Exception("ERROR : please should file xml")
|
|
data=xmltodict.parse(open(fpath,"r").read())
|
|
|
|
stmstm=data.get('STMSTM')
|
|
if stmstm:
|
|
hdbills=stmstm.get(node)
|
|
if not hdbills:
|
|
return {}
|
|
lines=[]
|
|
for k, v in hdbills.items():
|
|
collections=v
|
|
for collection in collections:
|
|
if isinstance(collection,dict):
|
|
line={}
|
|
for i, j in collection.items():
|
|
key=(i or "").lower()
|
|
line[key]=j
|
|
lines.append(line)
|
|
#titles=[title for title, value in lines[0].items()]
|
|
return lines
|
|
|
|
def import_nhso(self,ids,context={}):
|
|
obj=self.browse(ids)[0]
|
|
fname=obj.file
|
|
fpath=get_file_path(fname)
|
|
if not fpath:
|
|
raise Exception("Please select file")
|
|
lines=self.read_xml(fpath,node='HDBills')
|
|
if not lines:
|
|
raise Exception("Wrong file")
|
|
data_nhso=get_model("clinic.data.nhso")
|
|
nhso_ids=data_nhso.search([])
|
|
data_nhso.delete(nhso_ids)
|
|
result=""
|
|
result+="Match: %s"%(50)
|
|
result+="\n"
|
|
result+="*"*50
|
|
for line in lines:
|
|
# TODO need to check match or not
|
|
data_nhso.create(line)
|
|
line['type']='success'
|
|
print(line)
|
|
result+="\n"
|
|
result+="Not Match: %s"%(40)
|
|
result+="\n"
|
|
result+="*"*50
|
|
obj.write({
|
|
'result': result,
|
|
})
|
|
|
|
def import_sc(self,ids,context={}):
|
|
obj=self.browse(ids)[0]
|
|
fname=obj.file
|
|
fpath=get_file_path(fname)
|
|
lines=self.read_excel(fpath)
|
|
if not lines:
|
|
raise Exception("Wrong File")
|
|
data_sc=get_model("clinic.data.sc")
|
|
sc_ids=data_sc.search([])
|
|
data_sc.delete(sc_ids)
|
|
st={}
|
|
patient=get_model("clinic.patient")
|
|
old_patient=[x['hn'] for x in patient.search_read([],['hn']) if x['hn']]
|
|
fail_qty=0
|
|
success_qty=0
|
|
for line in lines:
|
|
hn=line.get('hn')
|
|
if not hn:
|
|
continue
|
|
# create patient if not found
|
|
if not st.get(hn) and (not hn in old_patient):
|
|
patient.create({
|
|
'type': 'sc',
|
|
'hn': hn,
|
|
'name': line.get('name14'),
|
|
'reg_date': time.strftime("%Y-%m-%d"),
|
|
})
|
|
st.update({hn: line.get('name14')})
|
|
print("create %s ok"%hn)
|
|
hcode=int((line.get('hcode18') or "0")) # XXX
|
|
type=hcode==23869 and 'success' or 'fail'
|
|
if type=='success':
|
|
success_qty+=1
|
|
else:
|
|
fail_qty+=1
|
|
vals={
|
|
'hn': hn,
|
|
'name14': line.get('name14'),
|
|
'hcode18': hcode,
|
|
'amount23': line.get('amount23'),
|
|
"cur": line.get('cur'),
|
|
'epoadm29': line.get('epoadm29'),
|
|
'eponame': line.get('eponame'),
|
|
'ln': line.get('ln'),
|
|
'st': line.get('st'),
|
|
'allow37': line.get('allow37'),
|
|
'dttran': line.get("dttran"),
|
|
'type': type,
|
|
}
|
|
data_sc.create(vals)
|
|
msg=''
|
|
msg+="%s\n"%("*"*50)
|
|
msg+='success: %s\n'%success_qty
|
|
msg+='fail: %s\n'%fail_qty
|
|
msg+="%s\n"%("*"*50)
|
|
|
|
obj.write({
|
|
'result': msg,
|
|
})
|
|
|
|
def import_mg(self,ids,context={}):
|
|
obj=self.browse(ids)[0]
|
|
fname=obj.file
|
|
fpath=get_file_path(fname)
|
|
print("fpath ", fpath)
|
|
|
|
def test_sc(self,ids,context={}):
|
|
pass
|
|
|
|
ImportPayment.register()
|