scripts: import dossiers update.

This commit is contained in:
Mikaël Ates 2013-01-06 23:37:42 +01:00
parent 8e11918610
commit fa39865b17
1 changed files with 202 additions and 37 deletions

View File

@ -22,7 +22,7 @@ from calebasse.personnes.models import Worker, Holiday, ExternalWorker, External
from calebasse.ressources.models import (WorkerType, ParentalAuthorityType, ParentalCustodyType,
FamilySituationType, TransportType, TransportCompany, Provenance, AnalyseMotive, FamilyMotive,
CodeCFTMEA, SocialisationDuration, School, SchoolLevel, OutMotive, OutTo, AdviceGiver,
MaritalStatusType, Job, PatientRelatedLink)
MaritalStatusType, Job, PatientRelatedLink, HealthCenter)
# Configuration
db_path = "./scripts/20130104-213225"
@ -212,7 +212,7 @@ def get_nir(nir, key, writer, line, service):
return nir
def main():
def import_dossiers_phase_1():
""" """
print "====== Début à %s ======" % str(datetime.today())
@ -225,6 +225,9 @@ def main():
f3 = open('./scripts/contacts_manuel.csv', 'wb')
writer3 = csv.writer(f3, delimiter=';', quotechar='|', quoting=csv.QUOTE_MINIMAL)
f4 = open('./scripts/pc_manuel.csv', 'wb')
writer4 = csv.writer(f4, delimiter=';', quotechar='|', quoting=csv.QUOTE_MINIMAL)
status_accueil = Status.objects.filter(type="ACCUEIL")[0]
status_diagnostic = Status.objects.filter(type="DIAGNOSTIC")[0]
status_traitement = Status.objects.filter(type="TRAITEMENT")[0]
@ -251,7 +254,7 @@ def main():
csvfile = open(os.path.join(db_path, db, 'dossiers.csv'), 'rb')
csvlines = csv.reader(csvfile, delimiter=';', quotechar='|')
d_cols = csvlines.next()
writer2.writerow(d_cols + ['service', 'creation', 'commenataire'])
writer2.writerow(d_cols + ['service', 'creation', 'commentaire'])
tables_data['dossiers'] = []
for line in csvlines:
#Au moins nom et prénom
@ -263,6 +266,17 @@ def main():
csvfile.close()
print "<-- Terminé"
print "--> Lecture table des caisses..."
csvfile = open(os.path.join(db_path, db, 'caisses.csv'), 'rb')
csvlines = csv.reader(csvfile, delimiter=';', quotechar='|')
caisses_cols = csvlines.next()
tables_data['caisses'] = {}
for line in csvlines:
data = _get_dict(caisses_cols, line)
tables_data['caisses'][data['id']] = data
csvfile.close()
print "<-- Terminé"
print "--> Chargement mises..."
mises = {}
csvfile = open(os.path.join(db_path, db, 'mises.csv'), 'rb')
@ -394,7 +408,19 @@ def main():
csvfile.close()
print "<-- Terminé"
print "--> Chargement des prise en charge pour le CMPP..."
print "--> Chargement des prise en charge..."
csvfile = open(os.path.join(db_path, db, 'pc.csv'), 'rb')
csvlines = csv.reader(csvfile, delimiter=';', quotechar='|')
pc_cols = csvlines.next()
writer4.writerow(pc_cols + ['service', 'creation', 'commentaire'])
tables_data['pcs'] = {}
for line in csvlines:
data = _get_dict(pc_cols, line)
if line[1] in tables_data['pcs'].keys():
tables_data['pcs'][line[1]].append(data)
else:
tables_data['pcs'][line[1]] = [data]
csvfile.close()
print "<-- Terminé"
print "--> Ajout des contacts..."
@ -459,6 +485,7 @@ def main():
begin_rights = None
end_rights = None
health_center = None
old_contact_id = line[0]
contact = PatientContact(phone=phone, mobile= mobile,
contact_comment=contact_comment,
@ -470,7 +497,8 @@ def main():
thirdparty_payer = thirdparty_payer,
begin_rights = begin_rights,
end_rights = end_rights,
health_center = health_center)
health_center = health_center,
old_contact_id=old_contact_id)
contact.save()
if not line[1] in adresses_per_old_id:
@ -543,7 +571,8 @@ def main():
s = status_suivi
elif dossier['suivi'] == '4':
s = status_surveillance
fss.append((s, date_traitement, "Il peut y avoir plusieurs états de suivi durant cette période de suivi mais ils ne peuvent être déterminés."))
# fss.append((s, date_traitement, "Il peut y avoir plusieurs états de suivi durant cette période de suivi mais ils ne peuvent être déterminés."))
fss.append((s, date_traitement, ""))
else:
# Le retour supprime la précédente de clôture, on choisit le retour à j-1
if date_traitement:
@ -557,26 +586,55 @@ def main():
s = status_suivi
elif dossier['suivi'] == '4':
s = status_surveillance
fss.append((s, date_retour, "Il peut y avoir plusieurs états de suivi durant cette période de suivi mais ils ne peuvent être déterminés."))
# fss.append((s, date_retour, "Il peut y avoir plusieurs états de suivi durant cette période de suivi mais ils ne peuvent être déterminés."))
fss.append((s, date_retour, ""))
if date_clos:
if date_retour and date_clos < date_retour:
print 'La date de clôture ne peut être antérieure à la date de fermeture!'
print 'La date de clôture ne peut être antérieure à la date de retour!'
else:
fss.append((status_clos, date_clos, None))
else:
pass
# date_traitement c'est diagnostic ou traitement
# CMPP : Si retour ret_diag = -1 si retour en diag.
# Pour savoir si c'est traitement ou diagnostique il faut connaître les actes validés passés
# Donc cela ne peut être fait que lorsque l'import des actes seront effectués et que l'on sera comment ils sont pris en charge
# Donc on run ce script, on run l'import des rdv patients et actes, puis un script pour mettre à jour les états et imputer les actes facturés aux pc
# L'import des pc ne peut aussi se faire qu'après l'import des actes
# imports des actes dit ce qui a été facturé sans le détail de quelle facture ou quel invoice.
# à l'import, tous les actes 2012 seront locked, jedui et vendredi seront à faire à la main par les secrétaires
# pour le camsp et sessads, on prendre à partir de 2013 les actes
# pour le cmpp, il va faloire imputer tous les actes facturés aux prises en charges
# pour savoir dans la nouvelle facturation (134) comment les imputer et donc savoir dans quel état est le dossier
date_retour = _to_date(dossier['ret_date'])
if date_accueil:
fss.append((status_accueil, date_accueil, None))
if not date_retour:
if date_traitement:
fss.append((status_diagnostic, date_traitement, "Inscription en diag mais pourrait etre en trait. A préciser"))
else:
# Le retour supprime la précédente de clôture, on choisit le retour à j-1
if date_traitement:
# c'est l'inscription
if date_traitement < date_retour:
fss.append((status_diagnostic, date_traitement, "A préciser."))
fss.append((status_traitement, date_traitement + relativedelta(days=1), "A préciser."))
old_clos_date = date_retour + relativedelta(days=-1)
fss.append((status_clos, old_clos_date, "La date de clôture est indéterminée (par défaut positionnée à 1 jour avant le retour)."))
fss.append((status_diagnostic, date_retour, "Retour en diag mais pourrait etre en trait. A préciser"))
if date_clos:
if date_retour and date_clos < date_retour:
print 'La date de clôture ne peut être antérieure à la date de retour!'
else:
fss.append((status_clos, date_clos, None))
else:
if old_id in tables_data['pcs'].keys():
pcs = tables_data['pcs'][old_id]
last_pc = pcs(len(pcs)-1)
if last_pc['genre_pc'] == 2:
status, date, msg = fss[len(fss)-1]
last_date = date + relativedelta(days=1)
fss.append((status_traitement, last_date, "Date à préciser."))
else:
pass
# pc idag, reste en diag.
else:
pass
# pas de pc, par defaut en diag.
# Il faut l'historique des actes du patient
# Il faut pour chaque acte assigner à la pc
# on sait les derniers actes s'ils sont affecté ou non
# Il faudrait conserver avec les actes les num de facture ?
# rEvori el fonctionnement de l'assignation d'un acte a une pc
for col in ('mdph', 'code_archive', 'aeeh', 'mdph_departement', 'pps', 'pps_deb', 'pps_fin', 'mdph_Debut', 'mdph_Fin'):
if _exist(dossier[col]):
@ -783,21 +841,21 @@ def main():
# print 'Patient %s existe' % patient
# Init states
if service.name != 'CMPP':
if not fss:
print "Pas d'etat et le dossier patient %s (old_id) a ete cree!" % old_id
else:
fs = FileState(status=fss[0][0], author=creator, previous_state=None)
date_selected = fss[0][1]
fs.patient = patient
fs.date_selected = date_selected
fs.comment = fss[0][2]
fs.save()
patient.last_state = fs
patient.save()
if len(fss) > 1:
for status, date, comment in fss[1:]:
patient.set_state(status=status, author=creator, date_selected=date, comment=comment)
if not fss:
print "Pas d'etat et le dossier patient %s (old_id) a ete cree!" % old_id
else:
fs = FileState(status=fss[0][0], author=creator, previous_state=None)
date_selected = fss[0][1]
fs.patient = patient
fs.date_selected = date_selected
fs.comment = fss[0][2]
fs.save()
patient.last_state = fs
patient.save()
if len(fss) > 1:
for status, date, comment in fss[1:]:
patient.set_state(status=status, author=creator, date_selected=date, comment=comment)
if old_id in mises_per_patient.keys():
for quotation in mises_per_patient[old_id]:
@ -850,11 +908,118 @@ def main():
patient.end_rights = contact.end_rights
patient.health_center = contact.health_center
patient.contact_comment = contact.contact_comment
patient.old_contact_id = contact.old_contact_id
patient.save()
contact.delete()
else:
patient.contacts.add(contact)
policyholder = None
health_center = None
other_health_center = None
if old_id in tables_data['pcs'].keys():
pcs = tables_data['pcs'][old_id]
i = len(pcs)-1
found = False
last_pc = None
while not found and i >= 0:
last_pc = pcs[i]
if 'contact_id' in last_pc.keys():
found = True
i = i -1
if not found:
writer2.writerow([dossier[c].encode('utf-8') for c in d_cols] + [service.name, 'Oui', "Pas de pc, le patient est l'assure sans caisse"])
# print "Pas de d'assure pour le patient %s" % old_id
# print "Le patient sera l'assure"
else:
try:
caisse = None
centre = None
lg = None
policyholder = patient.contacts.get(old_contact_id=_to_int(last_pc['contact_id']))
if last_pc['caisse_id'] in tables_data['caisses'].keys():
lg = tables_data['caisses'][last_pc['caisse_id']]['tp']
if len(lg) < 2:
lg = ['0', lg]
lg = ''.join(lg)
caisse = tables_data['caisses'][last_pc['caisse_id']]['caisse']
while len(caisse) < 3:
caisse = ['0', caisse]
caisse = ''.join(caisse)
centre = tables_data['caisses'][last_pc['caisse_id']]['centre']
while len(centre) < 4:
centre = ['0', centre]
centre = ''.join(centre)
if lg and caisse:
health_centers = HealthCenter.objects.filter(large_regime__code=lg, health_fund=caisse)
if health_centers and len(health_centers.all()) == 1:
health_center = health_centers[0]
if last_pc['centre']:
while len(last_pc['centre']) < 4:
last_pc['centre'] = ['0', last_pc['centre']]
last_pc['centre'] = ''.join(last_pc['centre'])
other_health_center = last_pc['centre']
elif health_centers and len(health_centers.all()) > 1:
print lg
print caisse
health_centers = None
if last_pc['centre']:
while len(last_pc['centre']) < 4:
last_pc['centre'] = ['0', last_pc['centre']]
last_pc['centre'] = ''.join(last_pc['centre'])
print "centre 1 %s" % last_pc['centre']
health_centers = HealthCenter.objects.filter(large_regime__code=lg, health_fund=caisse,
code = last_pc['centre'])
elif centre:
print "centre 2 %s" % centre
health_centers = HealthCenter.objects.filter(large_regime__code=lg, health_fund=caisse,
code = centre)
if health_centers and len(health_centers.all()) == 1:
health_center = health_centers[0]
elif health_centers:
# print "Plusieurs caisses avec le meme centre, patient %s" % old_id
writer4.writerow([last_pc[c].encode('utf-8') for c in pc_cols] + \
[service.name, '', "Plusieurs caisses avec le meme centre, patient %s" % old_id])
else:
# print "Caisse non determinee par code centre, patient %s" % old_id
writer4.writerow([last_pc[c].encode('utf-8') for c in pc_cols] + \
[service.name, '', "Caisse non determinee par code centre, patient %s" % old_id])
else:
# print 'Caisse non trouvee avec ce numero de caisse et grand regime, patient %s' % old_id
writer4.writerow([last_pc[c].encode('utf-8') for c in pc_cols] + \
[service.name, '', 'Caisse non trouvee avec ce numero de caisse et grand regime, patient %s' % old_id])
else:
# print 'Infos manquantes dans fichiers des caisses, patient %s' % old_id
writer4.writerow([last_pc[c].encode('utf-8') for c in pc_cols] + \
[service.name, '', 'Infos manquantes dans fichiers des caisses, patient %s' % old_id])
else:
# print 'Pas de caisse dans le fichiers caisse avec l id %s, patient %s' % (last_pc['caisse_id'], old_id)
writer4.writerow([last_pc[c].encode('utf-8') for c in pc_cols] + \
[service.name, '', 'Pas de caisse dans le fichier caisse avec l id %s, patient %s' % (last_pc['caisse_id'], old_id)])
except:
# print "Pas de contact avec id %s, patient %s" % (last_pc['contact_id'], old_id)
writer4.writerow([last_pc[c].encode('utf-8') for c in pc_cols] + \
[service.name, '', "Pas d'assuré existant, le patient est choisi."])
else:
writer2.writerow([dossier[c].encode('utf-8') for c in d_cols] + \
[service.name, 'Oui', "Pas de pc, le patient est l'assure sans caisse"])
# print "Pas de pc pour le patient %s" % old_id
# print "Le patient sera l'assure"
if not policyholder:
policyholder = patient.patientcontact
policyholder.health_center = health_center
policyholder.other_health_center = other_health_center
policyholder.save()
patient.policyholder = policyholder
patient.save()
# On ne pass plus par le clean du contact form, du coup, pas moyen de modifier le health center!
# Faut-il gére un code de gestion ?
#Etat des dossiers
# patient.policyholder soit le contact, d'il n'y en a qu'un
@ -891,4 +1056,4 @@ def main():
if __name__ == "__main__":
main()
import_dossiers_phase_1()