1 |
aa31cdc8
|
Jérôme Schneider
|
# -*- coding: utf-8 -*-
|
2 |
|
|
|
3 |
|
|
from datetime import date
|
4 |
|
|
|
5 |
|
|
from django.db import models
|
6 |
|
|
from django.utils import formats
|
7 |
|
|
|
8 |
|
|
from calebasse.agenda.models import Event, EventWithAct
|
9 |
|
|
from calebasse.dossiers.states import STATES_BTN_MAPPER
|
10 |
|
|
|
11 |
|
|
def get_status(ctx, user):
|
12 |
|
|
"""
|
13 |
|
|
Return status and hc_status
|
14 |
|
|
"""
|
15 |
|
|
status = []
|
16 |
|
|
close_btn = STATES_BTN_MAPPER['CLOS']
|
17 |
d5f5c285
|
Serghei MIHAI
|
if ctx.get('next_rdv'):
|
18 |
aa31cdc8
|
Jérôme Schneider
|
close_btn = STATES_BTN_MAPPER['CLOS_RDV']
|
19 |
|
|
if ctx['object'].service.slug == "cmpp":
|
20 |
|
|
ctx['can_rediag'] = ctx['object'].create_diag_healthcare(user)
|
21 |
|
|
status = ctx['object'].get_healthcare_status()
|
22 |
|
|
highlight = False
|
23 |
|
|
if status[0] == -1:
|
24 |
|
|
status = 'Indéterminé.'
|
25 |
|
|
highlight = True
|
26 |
|
|
elif status[0] == 0:
|
27 |
|
|
status = "Prise en charge de diagnostic en cours."
|
28 |
|
|
elif status[0] == 1:
|
29 |
|
|
status = 'Patient jamais pris en charge.'
|
30 |
|
|
elif status[0] == 2:
|
31 |
|
|
status = "Prise en charge de diagnostic complète, faire une demande de prise en charge de traitement."
|
32 |
|
|
highlight = True
|
33 |
|
|
elif status[0] == 3:
|
34 |
|
|
if ctx['can_rediag']:
|
35 |
|
|
status = "Prise en charge de traitement expirée. Patient élligible en rediagnostic."
|
36 |
|
|
highlight = True
|
37 |
|
|
else:
|
38 |
|
|
status = "Prise en charge de traitement expirée. La demande d'un renouvellement est possible."
|
39 |
|
|
highlight = True
|
40 |
|
|
elif status[0] == 4:
|
41 |
|
|
status = "Il existe une prise en charge de traitement mais qui ne prendra effet que le %s." % str(status[1])
|
42 |
|
|
elif status[0] == 5:
|
43 |
|
|
status = "Prise en charge de traitement en cours."
|
44 |
|
|
elif status[0] == 6:
|
45 |
|
|
status = "Prise en charge de traitement complète mais qui peut être prolongée."
|
46 |
|
|
highlight = True
|
47 |
|
|
elif status[0] == 7:
|
48 |
|
|
status = "Prise en charge de traitement complète et déjà prolongée, se terminant le %s." % \
|
49 |
|
|
formats.date_format(status[2], "SHORT_DATE_FORMAT")
|
50 |
|
|
else:
|
51 |
|
|
status = 'Statut inconnu.'
|
52 |
|
|
hc_status = (status, highlight)
|
53 |
|
|
if ctx['object'].last_state.status.type == "ACCUEIL":
|
54 |
|
|
# Inscription automatique au premier acte facturable valide
|
55 |
|
|
status = [STATES_BTN_MAPPER['FIN_ACCUEIL'],
|
56 |
|
|
STATES_BTN_MAPPER['DIAGNOSTIC'],
|
57 |
|
|
STATES_BTN_MAPPER['TRAITEMENT']]
|
58 |
|
|
elif ctx['object'].last_state.status.type == "FIN_ACCUEIL":
|
59 |
|
|
# Passage automatique en diagnostic ou traitement
|
60 |
|
|
status = [STATES_BTN_MAPPER['ACCUEIL'],
|
61 |
|
|
STATES_BTN_MAPPER['DIAGNOSTIC'],
|
62 |
|
|
STATES_BTN_MAPPER['TRAITEMENT']]
|
63 |
|
|
elif ctx['object'].last_state.status.type == "DIAGNOSTIC":
|
64 |
|
|
# Passage automatique en traitement
|
65 |
|
|
status = [STATES_BTN_MAPPER['TRAITEMENT'],
|
66 |
|
|
close_btn,
|
67 |
|
|
STATES_BTN_MAPPER['ACCUEIL']]
|
68 |
|
|
elif ctx['object'].last_state.status.type == "TRAITEMENT":
|
69 |
|
|
# Passage automatique en diagnostic si on ajoute une prise en charge diagnostic,
|
70 |
|
|
# ce qui est faisable dans l'onglet prise en charge par un bouton visible sous conditions
|
71 |
|
|
status = [STATES_BTN_MAPPER['DIAGNOSTIC'],
|
72 |
|
|
close_btn,
|
73 |
|
|
STATES_BTN_MAPPER['ACCUEIL']]
|
74 |
|
|
elif ctx['object'].last_state.status.type == "CLOS":
|
75 |
|
|
# Passage automatique en diagnostic ou traitement
|
76 |
|
|
status = [STATES_BTN_MAPPER['DIAGNOSTIC'],
|
77 |
|
|
STATES_BTN_MAPPER['TRAITEMENT'],
|
78 |
|
|
STATES_BTN_MAPPER['ACCUEIL']]
|
79 |
a55313cc
|
Mikaël Ates
|
elif ctx['object'].service.slug == "camsp":
|
80 |
|
|
hc_status = None
|
81 |
|
|
if ctx['object'].last_state.status.type == "ACCUEIL":
|
82 |
|
|
status = [STATES_BTN_MAPPER['FIN_ACCUEIL'],
|
83 |
|
|
STATES_BTN_MAPPER['BILAN']]
|
84 |
|
|
elif ctx['object'].last_state.status.type == "FIN_ACCUEIL":
|
85 |
|
|
status = [STATES_BTN_MAPPER['ACCUEIL'],
|
86 |
|
|
STATES_BTN_MAPPER['BILAN'],
|
87 |
|
|
STATES_BTN_MAPPER['SURVEILLANCE'],
|
88 |
|
|
STATES_BTN_MAPPER['SUIVI'],
|
89 |
|
|
close_btn]
|
90 |
|
|
elif ctx['object'].last_state.status.type == "BILAN":
|
91 |
|
|
status = [STATES_BTN_MAPPER['SURVEILLANCE'],
|
92 |
|
|
STATES_BTN_MAPPER['SUIVI'],
|
93 |
|
|
close_btn,
|
94 |
|
|
STATES_BTN_MAPPER['ACCUEIL']]
|
95 |
|
|
elif ctx['object'].last_state.status.type == "SURVEILLANCE":
|
96 |
|
|
status = [STATES_BTN_MAPPER['SUIVI'],
|
97 |
|
|
close_btn,
|
98 |
|
|
STATES_BTN_MAPPER['ACCUEIL'],
|
99 |
|
|
STATES_BTN_MAPPER['BILAN']]
|
100 |
|
|
elif ctx['object'].last_state.status.type == "SUIVI":
|
101 |
|
|
status = [close_btn,
|
102 |
|
|
STATES_BTN_MAPPER['ACCUEIL'],
|
103 |
|
|
STATES_BTN_MAPPER['BILAN'],
|
104 |
|
|
STATES_BTN_MAPPER['SURVEILLANCE']]
|
105 |
|
|
elif ctx['object'].last_state.status.type == "CLOS":
|
106 |
|
|
status = [STATES_BTN_MAPPER['ACCUEIL'],
|
107 |
|
|
STATES_BTN_MAPPER['BILAN'],
|
108 |
|
|
STATES_BTN_MAPPER['SURVEILLANCE'],
|
109 |
|
|
STATES_BTN_MAPPER['SUIVI']]
|
110 |
|
|
elif ctx['object'].service.slug == "sessad-ted" or ctx['object'].service.slug == "sessad-dys":
|
111 |
|
|
hc_status = None
|
112 |
|
|
if ctx['object'].last_state.status.type == "ACCUEIL":
|
113 |
|
|
status = [STATES_BTN_MAPPER['FIN_ACCUEIL'],
|
114 |
|
|
STATES_BTN_MAPPER['TRAITEMENT']]
|
115 |
|
|
elif ctx['object'].last_state.status.type == "FIN_ACCUEIL":
|
116 |
|
|
status = [STATES_BTN_MAPPER['ACCUEIL'],
|
117 |
|
|
STATES_BTN_MAPPER['TRAITEMENT'],
|
118 |
|
|
close_btn]
|
119 |
|
|
elif ctx['object'].last_state.status.type == "TRAITEMENT":
|
120 |
|
|
status = [close_btn,
|
121 |
|
|
STATES_BTN_MAPPER['ACCUEIL']]
|
122 |
|
|
elif ctx['object'].last_state.status.type == "CLOS":
|
123 |
|
|
status = [STATES_BTN_MAPPER['ACCUEIL'],
|
124 |
|
|
STATES_BTN_MAPPER['TRAITEMENT']]
|
125 |
|
|
return (status, hc_status)
|
126 |
aa31cdc8
|
Jérôme Schneider
|
|
127 |
|
|
def get_last_rdv(patient_record):
|
128 |
|
|
last_rdv = {}
|
129 |
|
|
event = Event.objects.last_appointment(patient_record)
|
130 |
|
|
if event:
|
131 |
|
|
last_rdv['start_datetime'] = event.start_datetime
|
132 |
|
|
last_rdv['participants'] = event.participants.all()
|
133 |
|
|
last_rdv['act_type'] = event.eventwithact.act_type
|
134 |
|
|
last_rdv['act_state'] = event.act.get_state()
|
135 |
|
|
last_rdv['is_absent'] = event.is_absent()
|
136 |
|
|
return last_rdv
|
137 |
|
|
|
138 |
|
|
def get_next_rdv(patient_record):
|
139 |
|
|
Q = models.Q
|
140 |
|
|
today = date.today()
|
141 |
|
|
qs = EventWithAct.objects.filter(patient=patient_record) \
|
142 |
|
|
.filter(exception_to__isnull=True, canceled=False) \
|
143 |
|
|
.filter(Q(start_datetime__gte=today) \
|
144 |
|
|
| Q(exceptions__isnull=False) \
|
145 |
|
|
| ( Q(recurrence_periodicity__isnull=False) \
|
146 |
|
|
& (Q(recurrence_end_date__gte=today) \
|
147 |
|
|
| Q(recurrence_end_date__isnull=True) \
|
148 |
|
|
))) \
|
149 |
|
|
.distinct() \
|
150 |
|
|
.select_related() \
|
151 |
|
|
.prefetch_related('participants', 'exceptions__eventwithact')
|
152 |
|
|
occurrences = []
|
153 |
|
|
for event in qs:
|
154 |
|
|
occurrences.extend(filter(lambda e: e.start_datetime.date() >= today, event.all_occurences(limit=180)))
|
155 |
|
|
occurrences = sorted(occurrences, key=lambda e: e.start_datetime)
|
156 |
|
|
if occurrences:
|
157 |
|
|
return occurrences[0]
|
158 |
|
|
else:
|
159 |
|
|
return None
|