Projet

Général

Profil

Télécharger (21,9 ko) Statistiques
| Branche: | Tag: | Révision:

calebasse / calebasse / ressources / models.py @ 1164bc89

1 998ef74c Benjamin Dauvergne
# -*- coding: utf-8 -*-
2
3 74d65534 Mikaël Ates
from datetime import date, datetime
4 d7cdd2a8 Benjamin Dauvergne
import bisect
5 74d65534 Mikaël Ates
6 998ef74c Benjamin Dauvergne
from django.db import models
7 f7d9fa12 Benjamin Dauvergne
from django.db.models import query
8 677bc5b0 Mikaël Ates
from model_utils import Choices
9 96f613c6 Benjamin Dauvergne
10
from calebasse.models import PhoneNumberField, ZipCodeField
11 998ef74c Benjamin Dauvergne
12 f7d9fa12 Benjamin Dauvergne
from model_utils.managers import PassThroughManager
13 e1926dd5 Benjamin Dauvergne
14 f7d9fa12 Benjamin Dauvergne
15
class ServiceLinkedQuerySet(query.QuerySet):
16 e1926dd5 Benjamin Dauvergne
    def for_service(self, service, allow_global=True):
17
        '''Allows service local and service global objects'''
18
        return self.filter(models.Q(service=service)
19
                |models.Q(service__isnull=allow_global))
20
21 f7d9fa12 Benjamin Dauvergne
ServiceLinkedManager = PassThroughManager.for_queryset_class(ServiceLinkedQuerySet)
22
23 96f613c6 Benjamin Dauvergne
class NamedAbstractModel(models.Model):
24 a0f667ab Jérôme Schneider
    name = models.CharField(max_length=150, verbose_name=u'Nom')
25 1097fd0a Benjamin Dauvergne
26 96f613c6 Benjamin Dauvergne
    def __unicode__(self):
27 01b413fe Benjamin Dauvergne
        return self.name
28 96f613c6 Benjamin Dauvergne
29
    def __repr__(self):
30
        return '<%s %r>' % (self.__class__.__name__, unicode(self))
31 1097fd0a Benjamin Dauvergne
32 998ef74c Benjamin Dauvergne
    class Meta:
33 96f613c6 Benjamin Dauvergne
        abstract = True
34
        ordering = ['name']
35 998ef74c Benjamin Dauvergne
36 96f613c6 Benjamin Dauvergne
class ServiceLinkedAbstractModel(models.Model):
37
    objects = ServiceLinkedManager()
38
    service = models.ForeignKey('Service', null=True, blank=True)
39 1097fd0a Benjamin Dauvergne
40 96f613c6 Benjamin Dauvergne
    class Meta:
41
        abstract = True
42 998ef74c Benjamin Dauvergne
43 07286094 Thomas NOEL
DEST_TYPE = {
44
    # code grand regime: type destinataire
45
    '01': 'CT', # regime general
46
    '02': 'MA', # agricole
47
    '03': 'SR', # independant
48
    '04': 'CF', # sncf
49
    '05': 'RP', # ratp
50
    '06': 'EN', # invalide marine
51
    '07': 'RM', # minier
52
    '08': 'CM', # militaire
53
    '10': 'CE', # notaires
54
    '12': 'CI', # cci paris
55
    '14': 'AN', # assemblee nationale
56
    '15': 'SE', # senat
57
    '16': 'PB', # port autonome bordeaux
58
    '90': 'CC', # cultes
59
    '91': 'SM', # ensuite toutes les mutuelles nationales
60
    '92': 'SM',
61
    '93': 'SM',
62
    '94': 'SM',
63
    '95': 'SM',
64
    '96': 'SM',
65
    '99': 'SM',
66
}
67
68
69 00baf982 Jérôme Schneider
class HealthCenter(NamedAbstractModel):
70 998ef74c Benjamin Dauvergne
    class Meta:
71 00baf982 Jérôme Schneider
        verbose_name = u'Centre d\'assurance maladie'
72
        verbose_name_plural = u'Centres d\'assurances maladie'
73 998ef74c Benjamin Dauvergne
74 c9db0256 Jérôme Schneider
    def __unicode__(self):
75 60264e91 Mikaël Ates
        return self.large_regime.code + ' ' + self.health_fund + ' ' + self.code + ' ' + self.name
76 c9db0256 Jérôme Schneider
77 569eb325 Jérôme Schneider
    code = models.CharField(verbose_name=u"Code du centre",
78 00baf982 Jérôme Schneider
            max_length=4,
79
            null=True, blank=True)
80
    large_regime = models.ForeignKey('LargeRegime',
81
            verbose_name=u"Grand régime")
82 569eb325 Jérôme Schneider
    dest_organism = models.CharField(max_length=8,
83
            verbose_name=u"Organisme destinataire")
84
    computer_center_code = models.CharField(max_length=8,
85
            verbose_name=u"Code centre informatique",
86
            null=True, default=True)
87
    abbreviation = models.CharField(verbose_name=u'Abbrévation',
88
            max_length=8,
89
            null=True, default=True)
90 60264e91 Mikaël Ates
    health_fund = models.CharField(verbose_name=u"Numéro de la caisse",
91
            max_length=3)
92 aa9b05ad Mikaël Ates
    active = models.BooleanField(default=True, verbose_name=u"Active")
93
    address = models.CharField(max_length=120, verbose_name=u"Adresse")
94 1097fd0a Benjamin Dauvergne
    address_complement = models.CharField(max_length=120, blank=True,
95 aa9b05ad Mikaël Ates
            null=True, default=None, verbose_name=u"Adresse complémentaire")
96
    zip_code = models.CharField(max_length=8, verbose_name=u"Code postal")
97
    city = models.CharField(max_length=80, verbose_name=u"Ville")
98
    phone = models.CharField(max_length=30, verbose_name=u"Téléphone")
99 569eb325 Jérôme Schneider
    fax = models.CharField(max_length=30,
100 aa9b05ad Mikaël Ates
            null=True, blank=True, verbose_name=u"Fax")
101 00baf982 Jérôme Schneider
    email = models.EmailField(
102 aa9b05ad Mikaël Ates
            null=True, blank=True, verbose_name=u"Courriel")
103 00baf982 Jérôme Schneider
    accounting_number = models.CharField(max_length=30,
104 aa9b05ad Mikaël Ates
             null=True, blank=True, verbose_name=u"Numéro de compte")
105
    correspondant = models.CharField(max_length=80, verbose_name=u"Correspondant")
106 7dd45876 Thomas NOEL
    hc_invoice = models.ForeignKey('HealthCenter',
107
            verbose_name=u"Centre pour facturation (optionnel)",
108
            null=True, blank=True, default=None)
109 1097fd0a Benjamin Dauvergne
110 07286094 Thomas NOEL
    def b2_000(self):
111
        '''
112
        renvoie le numéro destinataire selon la norme B2, type 000
113
        '''
114
        return DEST_TYPE[self.large_regime.code] + '000000' + self.large_regime.code[0:2] + self.computer_center_code[0:3] + self.dest_organism[0:3]
115
116 00baf982 Jérôme Schneider
117
class LargeRegime(NamedAbstractModel):
118
    class Meta:
119
        verbose_name = u'Grand régime'
120
        verbose_name_plural = u'Grands régimes'
121
122
    def __unicode__(self):
123 569eb325 Jérôme Schneider
        return self.code + ' ' + self.name
124 00baf982 Jérôme Schneider
125 569eb325 Jérôme Schneider
    code = models.CharField(verbose_name=u"Code grand régime",
126 00baf982 Jérôme Schneider
            max_length=2)
127 0f4c0029 Jérôme Schneider
128 998ef74c Benjamin Dauvergne
129 96f613c6 Benjamin Dauvergne
class TransportCompany(NamedAbstractModel):
130 de505e40 Mikaël Ates
    description = models.TextField(blank=True, null=True, default=None)
131
    address = models.CharField(max_length=120,
132
            verbose_name=u"Adresse", blank=True, null=True, default=None)
133
    address_complement = models.CharField(max_length=120,
134
            blank=True,
135
            null=True,
136
            default=None,
137
            verbose_name=u"Complément d'adresse")
138
    zip_code = ZipCodeField(verbose_name=u"Code postal",
139
        blank=True, null=True, default=None)
140
    city = models.CharField(max_length=80, verbose_name=u"Ville",
141
        blank=True, null=True, default=None)
142
    phone = PhoneNumberField(verbose_name=u"Téléphone",
143
        blank=True, null=True, default=None)
144
    fax = models.CharField(max_length=30,
145
            blank=True, null=True, default=None)
146
    email = models.EmailField(blank=True, null=True)
147
    correspondant = models.CharField(max_length=80, blank=True, null=True)
148
    old_camsp_id = models.CharField(max_length=256,
149
            verbose_name=u'Ancien ID au CAMSP', blank=True, null=True)
150
    old_cmpp_id = models.CharField(max_length=256,
151
            verbose_name=u'Ancien ID au CMPP', blank=True, null=True)
152
    old_sessad_dys_id = models.CharField(max_length=256,
153
            verbose_name=u'Ancien ID au SESSAD TED', blank=True, null=True)
154
    old_sessad_ted_id = models.CharField(max_length=256,
155
            verbose_name=u'Ancien ID au SESSAD DYS', blank=True, null=True)
156
157 998ef74c Benjamin Dauvergne
    class Meta:
158
        verbose_name = u'Compagnie de transport'
159
        verbose_name_plural = u'Compagnies de transport'
160
161
162 2828e0c4 Mikaël Ates
class ManagementCode(NamedAbstractModel):
163
    class Meta:
164
        verbose_name = u'Code de gestion'
165
        verbose_name_plural = u'Codes de gestion'
166
167
    def __unicode__(self):
168
        return self.code + ' ' + self.name
169
170
    code = models.CharField(verbose_name=u"Code",
171
            max_length=10)
172
    old_id = models.CharField(max_length=256,
173
            verbose_name=u'Ancien ID', blank=True, null=True)
174
175
176 96f613c6 Benjamin Dauvergne
class UninvoicableCode(models.Model):
177 998ef74c Benjamin Dauvergne
    class Meta:
178
        verbose_name = u'Code de non-facturation'
179
        verbose_name_plural = u'Codes de non-facturation'
180
181
182 1f17fe24 Mikaël Ates
class Office(NamedAbstractModel):
183 998ef74c Benjamin Dauvergne
    class Meta:
184
        verbose_name = u'Établissement'
185
        verbose_name_plural = u'Établissements'
186
187 1097fd0a Benjamin Dauvergne
    def __unicode__(self):
188 1f17fe24 Mikaël Ates
        return self.name
189 1097fd0a Benjamin Dauvergne
190 dfbedf34 Jérôme Schneider
    description = models.TextField(blank=True, null=True)
191 96f613c6 Benjamin Dauvergne
192
    # Contact
193 dfbedf34 Jérôme Schneider
    phone = PhoneNumberField(verbose_name=u"Téléphone", blank=True, null=True)
194
    fax = PhoneNumberField(verbose_name=u"Fax", blank=True, null=True)
195
    email = models.EmailField(blank=True, null=True)
196 96f613c6 Benjamin Dauvergne
197
    # Address
198
    address = models.CharField(max_length=120,
199 1f17fe24 Mikaël Ates
            verbose_name=u"Adresse", blank=True, null=True, default=None)
200 96f613c6 Benjamin Dauvergne
    address_complement = models.CharField(max_length=120,
201
            blank=True,
202
            null=True,
203
            default=None,
204 1c4e6090 Mikaël Ates
            verbose_name=u"Complément d'adresse")
205 1f17fe24 Mikaël Ates
    zip_code = ZipCodeField(verbose_name=u"Code postal",
206
            blank=True, null=True, default=None)
207
    city = models.CharField(max_length=80, verbose_name=u"Ville",
208
            blank=True, null=True, default=None)
209 96f613c6 Benjamin Dauvergne
210 1097fd0a Benjamin Dauvergne
    # TODO: add this fields : finess, suite, dm, dpa, genre, categorie, statut_juridique, mft, mt, dmt
211 998ef74c Benjamin Dauvergne
212 6c60a174 Mikaël Ates
class SchoolType(NamedAbstractModel):
213
    class Meta:
214
        verbose_name = u'Type du lieu de socialisation'
215
        verbose_name_plural = u'Types du lieu de socialisation'
216
217
    services = models.ManyToManyField('ressources.Service')
218
219
class School(NamedAbstractModel):
220 998ef74c Benjamin Dauvergne
    class Meta:
221 45e8608e Mikaël Ates
        verbose_name = u'Lieu de socialisation'
222
        verbose_name_plural = u'Lieux de socialisation'
223 998ef74c Benjamin Dauvergne
224 1097fd0a Benjamin Dauvergne
    def __unicode__(self):
225 5458878e Mikaël Ates
        if self.school_type.name != 'Inconnu':
226
            return unicode(self.school_type) + ' ' + self.name
227
        return self.name
228 1097fd0a Benjamin Dauvergne
229 81411908 Jérôme Schneider
    def save(self, **kwargs):
230
        self.display_name = ""
231
        if self.school_type.name != 'Inconnu':
232
            self.display_name = unicode(self.school_type) + ' ' + self.name
233
        else:
234
            self.display_name = self.name
235
        if self.address:
236 436efc5a Jérôme Schneider
            self.display_name += u" - "  + self.address
237 9fa48803 Jérôme Schneider
        if self.zip_code:
238
            self.display_name += u" "  + self.zip_code
239
        if self.city:
240
            self.display_name += u" "  + self.city
241 81411908 Jérôme Schneider
        if self.private:
242 436efc5a Jérôme Schneider
            self.display_name += u" (Privé)"
243 81411908 Jérôme Schneider
        else:
244 436efc5a Jérôme Schneider
            self.display_name += u" (Public)"
245 81411908 Jérôme Schneider
        super(School, self).save(**kwargs)
246
247
    display_name = models.CharField(max_length=256,
248
            blank=True, null=True, default='')
249 6c60a174 Mikaël Ates
    school_type = models.ForeignKey('ressources.SchoolType',
250
        verbose_name=u"Type d'établissement")
251 2d4b9891 Jérôme Schneider
    description = models.TextField(blank=True, null=True, default=None)
252 276485e3 Frédéric Péters
    address = models.CharField(max_length=120,
253
            verbose_name=u"Adresse", blank=True, null=True, default=None)
254 96f613c6 Benjamin Dauvergne
    address_complement = models.CharField(max_length=120,
255
            blank=True,
256
            null=True,
257 276485e3 Frédéric Péters
            default=None,
258
            verbose_name=u"Complément d'adresse")
259 6c60a174 Mikaël Ates
    zip_code = ZipCodeField(verbose_name=u"Code postal",
260
        blank=True, null=True, default=None)
261 276485e3 Frédéric Péters
    city = models.CharField(max_length=80, verbose_name=u"Ville",
262 6c60a174 Mikaël Ates
        blank=True, null=True, default=None)
263
    phone = PhoneNumberField(verbose_name=u"Téléphone",
264
        blank=True, null=True, default=None)
265 2d4b9891 Jérôme Schneider
    fax = models.CharField(max_length=30,
266
            blank=True, null=True, default=None)
267 6c60a174 Mikaël Ates
    email = models.EmailField(blank=True, null=True, default=None)
268 2d4b9891 Jérôme Schneider
    director_name = models.CharField(max_length=70,
269 276485e3 Frédéric Péters
            blank=True, null=True, default=None,
270
            verbose_name=u"Nom du directeur")
271 5458878e Mikaël Ates
    old_id = models.CharField(max_length=256,
272
            verbose_name=u'Ancien ID', blank=True, null=True)
273
    old_service = models.CharField(max_length=256,
274
            verbose_name=u'Ancien Service', blank=True, null=True)
275 645e3ab4 Mikaël Ates
    private = models.BooleanField(verbose_name=u"Privé", default=False)
276 fe0dcf03 Jérôme Schneider
    services = models.ManyToManyField('ressources.Service', blank=True, null=True)
277 1097fd0a Benjamin Dauvergne
278 45e8608e Mikaël Ates
279 96f613c6 Benjamin Dauvergne
class SchoolTeacherRole(NamedAbstractModel):
280
    class Meta:
281
        verbose_name = u'Type de rôle des professeurs'
282
        verbose_name_plural = u'Types de rôle des professeurs'
283 998ef74c Benjamin Dauvergne
284 45e8608e Mikaël Ates
285 5458878e Mikaël Ates
class SchoolLevel(NamedAbstractModel):
286
    old_id = models.CharField(max_length=256,
287
            verbose_name=u'Ancien ID', blank=True, null=True)
288
    old_service = models.CharField(max_length=256,
289
            verbose_name=u'Ancien Service', blank=True, null=True)
290
291
    class Meta:
292
        verbose_name = u'Classe'
293
        verbose_name_plural = u'Classes'
294
295 6c60a174 Mikaël Ates
296 45e8608e Mikaël Ates
class SocialisationDuration(models.Model):
297
    class Meta:
298
        verbose_name = u'Période de socialisation'
299
        verbose_name_plural = u'Périodes de socialisation'
300
301 6c60a174 Mikaël Ates
    school = models.ForeignKey('ressources.School',
302
        verbose_name=u'Lieu de socialisation',
303 c29af9dd Mikaël Ates
        blank=True, null=True,
304
        on_delete=models.SET_NULL)
305 5458878e Mikaël Ates
    level = models.ForeignKey('ressources.SchoolLevel',
306
        verbose_name=u'Classe',
307 c29af9dd Mikaël Ates
        blank=True, null=True,
308
        on_delete=models.SET_NULL)
309 14c6fc82 Mikaël Ates
    redoublement = models.BooleanField(verbose_name=u"Redoublement",
310
            default=False)
311 45e8608e Mikaël Ates
    start_date = models.DateField(verbose_name=u"Date d'arrivée")
312 6c60a174 Mikaël Ates
    contact = models.CharField(verbose_name=u"Contact", max_length=200, blank=True, null=True, default=None)
313 45e8608e Mikaël Ates
    end_date = models.DateField(verbose_name=u"Date de départ",
314
        blank=True, null=True)
315
    created = models.DateTimeField(u'Création', auto_now_add=True)
316
    comment = models.TextField(max_length=3000,
317
        blank=True, null=True, verbose_name=u"Commentaire")
318
319
320 96f613c6 Benjamin Dauvergne
class InscriptionMotive(NamedAbstractModel):
321 998ef74c Benjamin Dauvergne
    class Meta:
322
        verbose_name = u'Motif d\'inscription'
323
        verbose_name_plural = u'Motifs d\'inscription'
324
325
326 96f613c6 Benjamin Dauvergne
class Nationality(NamedAbstractModel):
327 998ef74c Benjamin Dauvergne
    class Meta:
328
        verbose_name = u'Nationalité'
329
        verbose_name_plural = u'Nationalités'
330
331
332 96f613c6 Benjamin Dauvergne
class Job(NamedAbstractModel):
333 998ef74c Benjamin Dauvergne
    class Meta:
334
        verbose_name = u'Profession'
335
        verbose_name_plural = u'Professions'
336
337
338 dd986559 Serghei MIHAI
class RessourceQuerySet(query.QuerySet):
339 96f613c6 Benjamin Dauvergne
    def for_etablissement(self, etablissement):
340
        return self.filter(etablissement=etablissement)
341
342
    def for_service(self, service):
343
        return self.filter(etablissement__service=service)
344
345
346 dd986559 Serghei MIHAI
class Ressource(NamedAbstractModel):
347
    objects = PassThroughManager.for_queryset_class(RessourceQuerySet)()
348 96f613c6 Benjamin Dauvergne
    etablissement = models.ForeignKey('Office')
349
350 998ef74c Benjamin Dauvergne
    class Meta:
351 f08202ab Serghei MIHAI
        verbose_name = u'Ressource'
352
        verbose_name_plural = u'Ressources'
353 998ef74c Benjamin Dauvergne
354 a37b47e6 Mikaël Ates
355 88a1a343 Mikaël Ates
class AnalyseMotive(NamedAbstractModel):
356 cea6ec34 Jérôme Schneider
    class Meta:
357
        verbose_name = u"Motif analysé"
358
        verbose_name_plural = u"Motifs analysés"
359
360 a37b47e6 Mikaël Ates
361 88a1a343 Mikaël Ates
class FamilyMotive(NamedAbstractModel):
362 cea6ec34 Jérôme Schneider
    class Meta:
363
        verbose_name = u"Motif familiale"
364
        verbose_name_plural = u"Motifs familiaux"
365
366 a37b47e6 Mikaël Ates
367
class AdviceGiver(NamedAbstractModel):
368
    class Meta:
369
        verbose_name = u"Demandeur"
370
        verbose_name_plural = u"Demandeurs"
371
372
373
class Provenance(NamedAbstractModel):
374
    old_id = models.CharField(max_length=256,
375
            verbose_name=u'Ancien ID', blank=True, null=True)
376
    old_service = models.CharField(max_length=256,
377
            verbose_name=u'Ancien Service', blank=True, null=True)
378
    class Meta:
379
        verbose_name = u'Conseilleur'
380
        verbose_name_plural = u'Conseilleurs'
381
382
383
class ProvenancePlace(NamedAbstractModel):
384
    class Meta:
385
        verbose_name = u'Lieu de provenance'
386
        verbose_name_plural = u'Lieux de provenance'
387
388
389 a9381abc Mikaël Ates
class OutMotive(NamedAbstractModel):
390 dc1389b8 Mikaël Ates
    class Meta:
391
        verbose_name = u"Motif de sortie"
392
        verbose_name_plural = u"Motifs de sortie"
393
394 a37b47e6 Mikaël Ates
395 a9381abc Mikaël Ates
class OutTo(NamedAbstractModel):
396 dc1389b8 Mikaël Ates
    class Meta:
397
        verbose_name = u"Orientation de sortie"
398
        verbose_name_plural = u"Orientations de sortie"
399
400 96f613c6 Benjamin Dauvergne
401 91365af6 Jérôme Schneider
class Service(NamedAbstractModel):
402 1097fd0a Benjamin Dauvergne
    admin_only = True
403
404 4079f834 Benjamin Dauvergne
    slug = models.SlugField()
405 96f613c6 Benjamin Dauvergne
    description = models.TextField()
406
407
    # Contact
408
    phone = PhoneNumberField(verbose_name=u"Téléphone")
409
    fax = PhoneNumberField(verbose_name=u"Fax")
410
    email = models.EmailField()
411 4079f834 Benjamin Dauvergne
412
    class Meta:
413
        verbose_name = u'Service'
414
        verbose_name_plural = u'Services'
415 998ef74c Benjamin Dauvergne
416 a37b47e6 Mikaël Ates
417 f7d9fa12 Benjamin Dauvergne
class ActTypeQuerySet(query.QuerySet):
418 b37eebfb Jérôme Schneider
    def for_service(self, service):
419
        return self.filter(service=service)
420 998ef74c Benjamin Dauvergne
421 906e14dc Jérôme Schneider
class ActType(NamedAbstractModel, ServiceLinkedAbstractModel):
422 f7d9fa12 Benjamin Dauvergne
    objects = PassThroughManager.for_queryset_class(ActTypeQuerySet)()
423 fe0a540c Mikaël Ates
    billable = models.BooleanField(default=True, verbose_name=u"Facturable")
424 55bfb7f5 Benjamin Dauvergne
    old_id = models.CharField(max_length=256,
425
            verbose_name=u'Ancien ID', blank=True, null=True)
426 0f4a8003 Benjamin Dauvergne
    display_first = models.BooleanField(default=False, verbose_name=u"Acte principalement utilisé")
427 f2c11d3a Mikaël Ates
    group = models.BooleanField(default=False, verbose_name=u'En groupe')
428 1097fd0a Benjamin Dauvergne
429 3fb70ba0 Benjamin Dauvergne
    class Meta(NamedAbstractModel.Meta):
430 998ef74c Benjamin Dauvergne
        verbose_name = u'Type d\'actes'
431
        verbose_name_plural = u'Types d\'actes'
432 0f4a8003 Benjamin Dauvergne
        ordering = ('-display_first','name')
433 998ef74c Benjamin Dauvergne
434 96f613c6 Benjamin Dauvergne
class ParentalAuthorityType(NamedAbstractModel):
435 998ef74c Benjamin Dauvergne
    class Meta:
436
        verbose_name = u'Type d\'autorité parentale'
437
        verbose_name_plural = u'Types d\'autorités parentales'
438
439
440 96f613c6 Benjamin Dauvergne
class ParentalCustodyType(NamedAbstractModel):
441 998ef74c Benjamin Dauvergne
    class Meta:
442
        verbose_name = u'Type de gardes parentales'
443
        verbose_name_plural = u'Types de gardes parentales'
444
445
446 96f613c6 Benjamin Dauvergne
class SessionType(NamedAbstractModel):
447 998ef74c Benjamin Dauvergne
    class Meta:
448
        verbose_name = u'Type de séance'
449
        verbose_name_plural = u'Types de séances'
450
451
452 96f613c6 Benjamin Dauvergne
class FamilySituationType(NamedAbstractModel):
453 998ef74c Benjamin Dauvergne
    class Meta:
454
        verbose_name = u'Type de situation familiale'
455
        verbose_name_plural = u'Types de situations familiales'
456
457
458 08391712 Mikaël Ates
class MaritalStatusType(NamedAbstractModel):
459
    class Meta:
460
        verbose_name = u'Régime matrimonial'
461
        verbose_name_plural = u'Régimes matrimoniaux'
462
463
464 96f613c6 Benjamin Dauvergne
class TransportType(NamedAbstractModel):
465 998ef74c Benjamin Dauvergne
    class Meta:
466
        verbose_name = u'Type de transport'
467
        verbose_name_plural = u'Types de transports'
468 96f613c6 Benjamin Dauvergne
469
470
class WorkerType(NamedAbstractModel):
471 9ceeb537 Benjamin Dauvergne
    intervene = models.BooleanField(
472
            verbose_name=u'Intervenant',
473 1164bc89 Mikaël Ates
            default=True, blank=True)
474 9ceeb537 Benjamin Dauvergne
475 96f613c6 Benjamin Dauvergne
    class Meta:
476
        verbose_name = u'Type de personnel'
477
        verbose_name_plural = u'Types de personnel'
478 677bc5b0 Mikaël Ates
479
480
AXIS =  Choices(
481
        (1, 'Axe I : catégories cliniques'),
482
        (2, 'Axe II : facteurs organiques'),
483 6e7e04bb Frédéric Péters
        (3, 'Axe II : facteurs environnementaux'),
484 677bc5b0 Mikaël Ates
)
485
486
class CodeCFTMEA(NamedAbstractModel):
487
    code = models.IntegerField(verbose_name=u"Code")
488
    axe = models.IntegerField(verbose_name=u"Axe", choices=AXIS,
489
            max_length=1)
490 d3eeac81 Mikaël Ates
    ordering_code = models.CharField(max_length=20, blank=True, null=True,
491
            verbose_name=u"Classification")
492 677bc5b0 Mikaël Ates
493
    def __unicode__(self):
494 d3eeac81 Mikaël Ates
        return "%s %s" % (self.ordering_code, self.name)
495 677bc5b0 Mikaël Ates
496
    class Meta:
497 d3eeac81 Mikaël Ates
        ordering = ['ordering_code']
498 1f17fe24 Mikaël Ates
        verbose_name = u'Code CFTMEA'
499
        verbose_name_plural = u'Codes CFTMEA'
500 1c4e6090 Mikaël Ates
501 a4bccba9 Mikaël Ates
class MDPH(models.Model):
502 1c4e6090 Mikaël Ates
    class Meta:
503 1f17fe24 Mikaël Ates
        verbose_name = u'Etablissement MDPH'
504
        verbose_name_plural = u'Etablissements MDPH'
505 1c4e6090 Mikaël Ates
506
    def __unicode__(self):
507
        return self.department
508
509
    department = models.CharField(max_length=200,
510
            verbose_name=u"Département")
511
512
    description = models.TextField(blank=True, null=True)
513
514
    # Contact
515
    phone = PhoneNumberField(verbose_name=u"Téléphone", blank=True, null=True)
516
    fax = PhoneNumberField(verbose_name=u"Fax", blank=True, null=True)
517
    email = models.EmailField(blank=True, null=True)
518
    website = models.CharField(max_length=200,
519
            verbose_name=u"Site Web", blank=True, null=True)
520
521
    # Address
522
    address = models.CharField(max_length=120,
523
            verbose_name=u"Adresse", blank=True, null=True)
524
    address_complement = models.CharField(max_length=120,
525
            blank=True,
526
            null=True,
527
            default=None,
528
            verbose_name=u"Complément d'addresse")
529
    zip_code = ZipCodeField(verbose_name=u"Code postal",
530
        blank=True, null=True)
531
    city = models.CharField(max_length=80,
532
            verbose_name=u"Ville", blank=True, null=True)
533 b69d90d2 Mikaël Ates
534
class MDPHRequest(models.Model):
535 1f17fe24 Mikaël Ates
    class Meta:
536
        verbose_name = u'Demande MDPH'
537
        verbose_name_plural = u'Demandes MDPH'
538
539 b69d90d2 Mikaël Ates
    start_date = models.DateField(verbose_name=u"Date de la demande")
540 a4bccba9 Mikaël Ates
    mdph = models.ForeignKey('ressources.MDPH',
541
            verbose_name=u"MDPH")
542 b69d90d2 Mikaël Ates
    comment = models.TextField(max_length=3000,
543
        blank=True, null=True, verbose_name=u"Commentaire")
544
    created = models.DateTimeField(u'Création', auto_now_add=True)
545
546
MDPH_HELP =  Choices(
547
        (0, "Non défini"),
548
        (1, "AEEH (Allocation d'éducation de l'enfant handicapé)"),
549
        (2, 'AVS (Assistant de vie scolaire)'),
550
        (3, 'EVS (Emplois de vie scolaire)'),
551
)
552
553
class MDPHResponse(models.Model):
554 1f17fe24 Mikaël Ates
    class Meta:
555
        verbose_name = u'Réponse MDPH'
556
        verbose_name_plural = u'Réponses MDPH'
557
558 b69d90d2 Mikaël Ates
    start_date = models.DateField(verbose_name=u"Date de début")
559
    end_date = models.DateField(verbose_name=u"Date de fin")
560 a4bccba9 Mikaël Ates
    mdph = models.ForeignKey('ressources.MDPH',
561
            verbose_name=u"MDPH")
562 b69d90d2 Mikaël Ates
    comment = models.TextField(max_length=3000,
563
        blank=True, null=True, verbose_name=u"Commentaire")
564
    created = models.DateTimeField(u'Création', auto_now_add=True)
565
    type_aide = models.IntegerField(verbose_name=u"Type d'aide", choices=MDPH_HELP,
566
            max_length=1, default=0)
567
    name =  models.CharField(max_length=200,
568
            verbose_name=u"Nom", blank=True, null=True)
569
    rate =  models.CharField(max_length=10,
570
            verbose_name=u"Taux", blank=True, null=True)
571 1f17fe24 Mikaël Ates
572
573
class HolidayType(NamedAbstractModel):
574
    for_group = models.BooleanField(
575 e52ab81f Mikaël Ates
            verbose_name=u'Absence de groupe',
576 1164bc89 Mikaël Ates
            default=True, blank=True)
577 1f17fe24 Mikaël Ates
578
    class Meta:
579 e52ab81f Mikaël Ates
        verbose_name = u"Type d'absence"
580
        verbose_name_plural = u"Types d'absence"
581 53ccde9e Mikaël Ates
582
class PatientRelatedLink(NamedAbstractModel):
583
    old_camsp_id = models.CharField(max_length=256,
584
            verbose_name=u'Ancien ID au CAMSP', blank=True, null=True)
585
    old_cmpp_id = models.CharField(max_length=256,
586
            verbose_name=u'Ancien ID au CMPP', blank=True, null=True)
587
    old_sessad_dys_id = models.CharField(max_length=256,
588
            verbose_name=u'Ancien ID au SESSAD TED', blank=True, null=True)
589
    old_sessad_ted_id = models.CharField(max_length=256,
590
            verbose_name=u'Ancien ID au SESSAD DYS', blank=True, null=True)
591
    class Meta:
592
        verbose_name = u'Type de lien avec le patient (parenté)'
593
        verbose_name_plural = u'Types de lien avec le patient (parenté)'
594 74d65534 Mikaël Ates
595
class PricePerAct(models.Model):
596
    price = models.DecimalField(verbose_name=u"Tarif", max_digits=5, decimal_places=2)
597
    start_date = models.DateField(verbose_name=u"Prise d'effet")
598
599 d7cdd2a8 Benjamin Dauvergne
    class Pricing(object):
600
        def __init__(self, ppas):
601
            ppas = ppas.order_by('start_date')
602
            self.dates = [ppa.start_date for ppa in ppas]
603
            self.ppas = list(ppas)
604
605
        def price_at_date(self, date):
606
            i = bisect.bisect(self.dates, date)
607
            if i == 0:
608 1b28a039 Mikaël Ates
                raise RuntimeError('No existing price at date %s' % date)
609
            return self.ppas[i-1].price
610 d7cdd2a8 Benjamin Dauvergne
611 74d65534 Mikaël Ates
    class Meta:
612
        verbose_name = u"Tarif horaire de l'acte"
613
        verbose_name_plural = u"Tarifs horaires de l'acte"
614
615 d7cdd2a8 Benjamin Dauvergne
    @classmethod
616
    def pricing(cls):
617
        return cls.Pricing(cls.objects.all())
618
619 74d65534 Mikaël Ates
    @classmethod
620
    def get_price(cls, at_date=None):
621
        if not at_date:
622
            at_date = date.today()
623
        if isinstance(at_date, datetime):
624
            at_date = date(day=at_date.day, month=at_date.month,
625
                year=at_date.year)
626
        found = cls.objects.filter(start_date__lte = at_date).latest('start_date')
627
        if not found:
628
            raise Exception('No price to apply')
629
        return found.price
630
631
    def __unicode__(self):
632
        return str(self.price) + ' (' + str(self.start_date) + ')'