Project

General

Profile

Download (5.4 KB) Statistics
| Branch: | Tag: | Revision:

calebasse / calebasse / facturation / list_acts.py @ 731000d7

1
# -*- coding: utf-8 -*-
2
from datetime import datetime, timedelta
3

    
4
from calebasse.actes.validation import are_all_acts_of_the_day_locked
5

    
6

    
7
def list_acts_for_billing_first_round(end_day, service, start_day=None):
8
    """Used to sort acts and extract acts billable before specific service
9
        requirements.
10

    
11
    At first, all acts not billed are listed per patient.
12
    Then acts are sorted.
13
    Each sorting split the acts in two sets, one set for rejected acts,
14
        on set for selected sets.
15
    First sort rejects acts days where all acts are not locked:
16
        acts_not_locked
17
    Second sort rejects acts not in state 'VALIDE':
18
        acts_not_valide
19
    Third sort rejects acts not billable:
20
        acts_not_billable
21
    Acts billable in :
22
        acts_billable
23

    
24
    acts = acts_not_locked + \
25
        acts_not_valide + \
26
            acts_not_billable + \
27
                acts_billable
28

    
29
    :param end_day: formatted date that gives the last day when acts are taken
30
        in account.
31
    :type end_day: datetime
32
    :param service: service in which acts are dealt with.
33
    :type service: calebasse.ressources.Service
34

    
35
    :returns: a list of dictionnaries where patients are the keys and values
36
        are lists of acts. The second element of this list in not a dict but
37
        a list of the days where are all days are not locked.
38
    :rtype: list
39
    """
40

    
41
    from calebasse.actes.models import EventAct
42
    acts = EventAct.objects.filter(is_billed=False,
43
        patient__service=service).order_by('-date')
44
    # Filter acts according to the date
45
    i = 0
46
    for act in acts:
47
        # On enlève tous les acts sup au jour de l'end_date
48
        if datetime(act.date.year, act.date.month, act.date.day) <= \
49
                datetime(end_day.year, end_day.month, end_day.day):
50
            acts = acts[i:]
51
            break
52
        i = i + 1
53
    if start_day:
54
        i = 0
55
        for act in acts:
56
            # On enlève tous les acts inf au jour de la start_date
57
            if datetime(act.date.year, act.date.month, act.date.day) < \
58
                    datetime(start_day.year, start_day.month, start_day.day):
59
                break
60
            i = i + 1
61
        acts = acts[:i]
62
    acts_not_locked = {}
63
    days_not_locked = []
64
    acts_not_valide = {}
65
    acts_not_billable = {}
66
    acts_billable = {}
67
    locked = False
68
    for act in acts:
69
        current_day = datetime(act.date.year, act.date.month, act.date.day)
70
        locked = are_all_acts_of_the_day_locked(current_day)
71
        if not locked:
72
            if not current_day in days_not_locked:
73
                days_not_locked.append(current_day)
74
            if act.patient in acts_not_locked:
75
                acts_not_locked[act.patient].append((act, act.date))
76
            else:
77
                acts_not_locked[act.patient] = [(act, act.date)]
78
        elif not act.is_state('VALIDE'):
79
            if act.patient in acts_not_valide:
80
                acts_not_valide[act.patient].append((act, act.get_state()))
81
            else:
82
                acts_not_valide[act.patient] = [(act, act.get_state())]
83
        elif not act.is_billable():
84
            if act.patient in acts_not_billable:
85
                acts_not_billable[act.patient].append(act)
86
            else:
87
                acts_not_billable[act.patient] = [act]
88
        else:
89
            if act.patient in acts_billable:
90
                acts_billable[act.patient].append(act)
91
            else:
92
                acts_billable[act.patient] = [act]
93
    return (acts_not_locked, days_not_locked, acts_not_valide,
94
        acts_not_billable, acts_billable)
95

    
96

    
97
def list_acts_for_billing_CAMSP(start_day, end_day, service):
98
    """Used to sort acts billable by specific service requirements.
99

    
100
    For the CAMSP, only the state of the patient record 'CAMSP_STATE_SUIVI'
101
        at the date of the act determine if the acte is billable.
102

    
103
    acts = acts_not_locked + \
104
        acts_not_valide + \
105
            acts_not_billable + \
106
                acts_bad_state + \
107
                    acts_accepted
108

    
109
    :param end_day: formatted date that gives the last day when acts are taken
110
        in account.
111
    :type end_day: datetime
112
    :param service: service in which acts are dealt with.
113
    :type service: calebasse.ressources.Service
114

    
115
    :returns: a list of dictionnaries where patients are the keys and values
116
        are lists of acts. The second element of this list in not a dict but
117
        a list of the days where are all days are not locked.
118
    :rtype: list
119
    """
120

    
121
    acts_not_locked, days_not_locked, acts_not_valide, \
122
        acts_not_billable, acts_billable = \
123
            list_acts_for_billing_first_round(end_day, service,
124
                start_day=start_day)
125
    acts_bad_state = {}
126
    acts_accepted = {}
127
    for patient, acts in acts_billable.items():
128
        for act in acts:
129
            if patient.was_in_state_at_day(act.date, 'CAMSP_STATE_SUIVI'):
130
                if act.patient in acts_accepted:
131
                    acts_accepted[act.patient].append(act)
132
                else:
133
                    acts_accepted[act.patient] = [act]
134
            else:
135
                if act.patient in acts_bad_state:
136
                    acts_bad_state[act.patient]. \
137
                        append((act, 'NOT_ACCOUNTABLE_STATE'))
138
                else:
139
                    acts_bad_state[act.patient] = \
140
                        [(act, 'NOT_ACCOUNTABLE_STATE')]
141
    return (acts_not_locked, days_not_locked, acts_not_valide,
142
        acts_not_billable, acts_bad_state,
143
        acts_accepted)
(3-3/7)