Project

General

Profile

« Previous | Next » 

Revision 731000d7

Added by Mikaël Ates over 12 years ago

facturation: List acts billable for billing at the CAMSP.

The CAMSP is the simplest case. The elegibility for billing is only based
the validation and the state of the atient record.

View differences:

calebasse/facturation/list_acts.py
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)

Also available in: Unified diff