1
|
# -*- 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
|
if ctx.get('next_rdv'):
|
18
|
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
|
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
|
|
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
|