e9bbd6ba |
1 | # -=- encoding: utf-8 -=- |
2 | |
9afaa55e |
3 | import datetime |
49f9f116 |
4 | from django.db import models |
e9bbd6ba |
5 | from datamaster_modeles.models import Pays, Implantation |
6 | |
7 | GENRE_CHOICES = ( |
8 | ('M', 'Homme'), |
9 | ('F', 'Femme'), |
10 | ) |
11 | SITUATION_CHOICES = ( |
12 | ('C', 'Célibataire'), |
13 | ('F', 'Fiancé'), |
14 | ('M', 'Marié'), |
15 | ) |
16 | |
17 | class Employe(models.Model): |
9afaa55e |
18 | # Identification |
e9bbd6ba |
19 | id = models.IntegerField(primary_key=True) |
20 | nom = models.CharField(max_length=255) |
21 | prenom = models.CharField(max_length=255) |
9afaa55e |
22 | nationalite = models.ForeignKey('datamaster_modeles.Pays', to_field='code', |
23 | related_name='employes_nationalite', |
24 | db_column='nationalite') |
e9bbd6ba |
25 | date_naissance = models.DateField(null=True, blank=True) |
9afaa55e |
26 | # Infos personnelles |
27 | genre = models.CharField(max_length=1, null=True, blank=True, |
28 | choices=GENRE_CHOICES) |
29 | situation_famille = models.CharField(max_length=1, null=True, blank=True, |
30 | choices=SITUATION_CHOICES) |
e9bbd6ba |
31 | date_entree = models.DateField(null=True, blank=True) #devrait pas être là |
9afaa55e |
32 | # Coordonnées |
e9bbd6ba |
33 | tel_domicile = models.CharField(max_length=255, null=True, blank=True) |
34 | tel_cellulaire = models.CharField(max_length=255, null=True, blank=True) |
35 | adresse = models.CharField(max_length=255, null=True, blank=True) |
36 | no_rue = models.CharField(max_length=255, null=True, blank=True) |
37 | ville = models.CharField(max_length=255, null=True, blank=True) |
38 | province = models.CharField(max_length=255, null=True, blank=True) |
39 | code_postal = models.CharField(max_length=255, null=True, blank=True) |
9afaa55e |
40 | pays = models.ForeignKey('datamaster_modeles.Pays', to_field='code', |
41 | null=True, blank=True, |
42 | related_name='employes', db_column='pays') |
43 | # Métas |
e9bbd6ba |
44 | date_creation = models.DateField(auto_now_add=True) |
45 | date_maj = models.DateField(auto_now=True) |
46 | commentaire = models.TextField(null=True, blank=True) |
9afaa55e |
47 | |
48 | def __unicode__(self): |
49 | return u'%s %s' % (self.prenom, self.nom) |
50 | |
51 | |
e9bbd6ba |
52 | TYPE_DOSSIER_CHOICES = ( |
53 | ('2', 'Local'), |
54 | ('1', 'Expatrié'), |
55 | ) |
56 | |
57 | class Dossier(models.Model): |
9afaa55e |
58 | # Identification |
e9bbd6ba |
59 | id = models.IntegerField(primary_key=True) |
60 | code = models.CharField(max_length=10, unique=True) |
61 | employe = models.ForeignKey('Employe', db_column='employe') |
9afaa55e |
62 | # Postes |
63 | poste1 = models.ForeignKey('Poste', db_column='poste1', |
64 | related_name='dossiers_poste1') |
65 | implantation1 = models.ForeignKey('datamaster_modeles.Implantation', |
66 | db_column='implantation1', |
67 | related_name='dossiers_implantation1', |
68 | blank=True, null=True) |
e9bbd6ba |
69 | complement1 = models.TextField(null=True, blank=True) |
70 | responsable_implantation1 = models.IntegerField() |
9afaa55e |
71 | poste2 = models.ForeignKey('Poste', db_column='poste2', |
72 | related_name='dossiers_poste2', |
73 | blank=True, null=True) |
74 | implantation2 = models.ForeignKey('datamaster_modeles.Implantation', |
75 | db_column='implantation2', |
76 | related_name='dossiers_implantation2', |
77 | null=True, blank=True) |
e9bbd6ba |
78 | complement2 = models.TextField(null=True, blank=True) |
79 | responsable_implantation2 = models.IntegerField() |
9afaa55e |
80 | # Relations |
81 | service = models.ForeignKey('Service', db_column='service', |
82 | blank=True, null=True) |
83 | responsable = models.ForeignKey('Employe', db_column='responsable', |
84 | related_name='responsable_de', |
85 | blank=True, null=True) |
86 | remplacement_de = models.ForeignKey('Employe', db_column='remplacement_de', |
87 | related_name='replaced_by', |
88 | blank=True, null=True) |
e9bbd6ba |
89 | type = models.CharField(max_length=1, choices=TYPE_DOSSIER_CHOICES) |
9afaa55e |
90 | statut = models.ForeignKey('Statut', db_column='statut', |
91 | blank=True, null=True) |
92 | organisme_bstg = models.ForeignKey('OrganismeBstg', |
93 | db_column='organisme_bstg', |
94 | blank=True, null=True) |
95 | # Rémunération |
96 | classement = models.ForeignKey('Classement', db_column='classement', |
97 | blank=True, null=True) |
e9bbd6ba |
98 | regime_travail = models.IntegerField() |
9afaa55e |
99 | # Mandat |
e9bbd6ba |
100 | mandat_date_debut = models.DateField() |
9afaa55e |
101 | mandat_date_fin = models.DateField(null=True, blank=True) |
102 | # Contrat |
e9bbd6ba |
103 | contrat_date_debut = models.DateField() |
104 | contrat_date_fin = models.DateField() |
9afaa55e |
105 | type_contrat = models.ForeignKey('TypeContrat', db_column='type_contrat', |
106 | blank=True, null=True) |
107 | # Meta |
e9bbd6ba |
108 | date_creation = models.DateField(auto_now_add=True) |
109 | date_maj = models.DateField(auto_now=True) |
110 | commentaire = models.TextField(null=True, blank=True) |
9afaa55e |
111 | |
112 | def __unicode__(self): |
113 | return u'%s : %s %s' % (self.employe, self.poste1, self.complement1) |
e9bbd6ba |
114 | |
115 | LIEN_PARENTE_CHOICES = ( |
116 | ('Conjoint', 'Conjoint'), |
117 | ('Conjointe', 'Conjointe'), |
118 | ('Fille', 'Fille'), |
119 | ('Fils', 'Fils'), |
120 | ) |
121 | |
122 | class AyantDroit(models.Model): |
9afaa55e |
123 | # Identification |
e9bbd6ba |
124 | id = models.IntegerField(primary_key=True) |
125 | nom = models.CharField(max_length=255) |
126 | prenom = models.CharField(max_length=255) |
9afaa55e |
127 | # Relation |
128 | employe = models.ForeignKey('Employe', db_column='employe', |
129 | related_name='ayants_droit') |
130 | lien_parente = models.CharField(max_length=10, null=True, blank=True, |
131 | choices=LIEN_PARENTE_CHOICES) |
132 | # Méta |
e9bbd6ba |
133 | commentaire = models.TextField(null=True, blank=True) |
134 | actif = models.BooleanField() |
135 | |
136 | |
137 | class Remuneration(models.Model): |
9afaa55e |
138 | # Identification |
e9bbd6ba |
139 | id = models.IntegerField(primary_key=True) |
140 | dossier = models.ForeignKey('Dossier', db_column='dossier') |
141 | type = models.ForeignKey('TypeRemuneration', db_column='type') |
9afaa55e |
142 | type_revalorisation = models.ForeignKey('TypeRevalorisation', |
143 | db_column='type_revalorisation', |
144 | null=True, blank=True) |
145 | montant = models.FloatField(null=True, blank=True) |
146 | devise = models.ForeignKey('Devise', to_field='code', db_column='devise', |
147 | null=True, blank=True) |
148 | date_effective = models.DateField(null=True, blank=True) |
149 | pourcentage = models.IntegerField(null=True, blank=True) |
150 | # Méta |
e9bbd6ba |
151 | date_creation = models.DateField(auto_now_add=True) |
9afaa55e |
152 | user_creation = models.IntegerField(null=True, blank=True) #User ou employé |
153 | desactivation = models.BooleanField(null=True, blank=True) # |
154 | date_desactivation = models.DateField(null=True, blank=True) |
155 | user_desactivation = models.IntegerField(null=True, blank=True) #User ou employé |
156 | annulation = models.BooleanField(null=True, blank=True) |
157 | date_annulation = models.DateField(null=True, blank=True) |
158 | user_annulation = models.IntegerField(null=True, blank=True) #User ou employé |
159 | |
160 | def __unicode__(self): |
161 | try: |
162 | devise = self.devise.code |
163 | except: |
164 | devise = "???" |
165 | return "%s %s" % (self.montant, devise) |
e9bbd6ba |
166 | |
167 | class FamilleEmploi(models.Model): |
9afaa55e |
168 | # Identification |
e9bbd6ba |
169 | id = models.IntegerField(primary_key=True) |
170 | nom = models.CharField(max_length=255) |
9afaa55e |
171 | # Méta |
e9bbd6ba |
172 | actif = models.BooleanField() |
173 | |
174 | class TypePoste(models.Model): |
9afaa55e |
175 | # Identification |
e9bbd6ba |
176 | id = models.IntegerField(primary_key=True) |
177 | nom = models.CharField(max_length=255) |
178 | nom_feminin = models.CharField(max_length=255) |
179 | description = models.CharField(max_length=255) |
180 | is_responsable = models.BooleanField() |
9afaa55e |
181 | famille_emploi = models.ForeignKey('FamilleEmploi', |
182 | db_column='famille_emploi') |
183 | # Méta |
e9bbd6ba |
184 | date_modification = models.DateField(auto_now=True) |
185 | actif = models.BooleanField() |
186 | |
187 | def __unicode__(self): |
188 | return u'%s' % self.nom |
189 | |
190 | |
191 | TYPE_PAIEMENT_CHOICES = ( |
192 | ('Régulier', 'Régulier'), |
193 | ('Ponctuel', 'Ponctuel'), |
194 | ) |
195 | |
196 | NATURE_REMUNERATION_CHOICES = ( |
197 | ('Accessoire', 'Accessoire'), |
198 | ('Charges', 'Charges'), |
199 | ('Indemnité', 'Indemnité'), |
200 | ('RAS', 'RAS'), |
201 | ('Traitement', 'Traitement'), |
202 | ) |
203 | |
204 | class TypeRemuneration(models.Model): |
9afaa55e |
205 | # Identification |
e9bbd6ba |
206 | id = models.IntegerField(primary_key=True) |
207 | nom = models.CharField(max_length=255) |
9afaa55e |
208 | type_paiement = models.CharField(max_length=30, |
209 | choices=TYPE_PAIEMENT_CHOICES) |
210 | nature_remuneration = models.CharField(max_length=30, |
211 | choices=NATURE_REMUNERATION_CHOICES) |
212 | # Méta |
e9bbd6ba |
213 | actif = models.BooleanField() |
9afaa55e |
214 | |
215 | def __unicode__(self): |
216 | return u'%s' % self.nom |
e9bbd6ba |
217 | |
218 | class TypeRevalorisation(models.Model): |
9afaa55e |
219 | # Identification |
e9bbd6ba |
220 | id = models.IntegerField(primary_key=True) |
221 | nom = models.CharField(max_length=255) |
9afaa55e |
222 | # Méta |
e9bbd6ba |
223 | actif = models.BooleanField() |
224 | |
225 | PROPORTION_CHOICES = ( |
226 | ('0.5', '0.5'), |
227 | ('1', '1'), |
228 | ) |
229 | |
230 | class Poste(models.Model): |
9afaa55e |
231 | # Identification |
e9bbd6ba |
232 | id = models.IntegerField(primary_key=True) |
233 | implantation = models.ForeignKey('datamaster_modeles.Implantation', |
9afaa55e |
234 | db_column='implantation', related_name='postes') |
e9bbd6ba |
235 | type_poste = models.ForeignKey('TypePoste', db_column='type_poste') |
236 | proportion = models.CharField(max_length=10, choices=PROPORTION_CHOICES) |
237 | #(sert à quoi?) renommer "regime_travail" ou autre? convertir data en % (data * 100; ex: 1 = 100%) |
9afaa55e |
238 | # Méta |
e9bbd6ba |
239 | date_modification = models.DateField(auto_now=True) |
240 | actif = models.BooleanField() |
241 | |
9afaa55e |
242 | |
e9bbd6ba |
243 | def __unicode__(self): |
9afaa55e |
244 | return u'%s - %s [%s]' % (self.implantation, self.type_poste.nom, |
245 | self.id) |
e9bbd6ba |
246 | |
247 | |
248 | class Service(models.Model): |
9afaa55e |
249 | # Identification |
e9bbd6ba |
250 | id = models.IntegerField(primary_key=True) |
251 | nom = models.CharField(max_length=255) |
9afaa55e |
252 | # Méta |
e9bbd6ba |
253 | actif = models.BooleanField() |
254 | |
255 | def __unicode__(self): |
256 | return u'%s' % self.nom |
9afaa55e |
257 | |
258 | class Meta: |
259 | ordering = ['nom'] |
e9bbd6ba |
260 | |
261 | |
262 | TYPE_ORGANISME_CHOICES = ( |
263 | ('MAD', 'Mise à disposition'), |
264 | ('DET', 'Détachement'), |
265 | ) |
266 | |
267 | class OrganismeBstg(models.Model): |
9afaa55e |
268 | # Identification |
e9bbd6ba |
269 | id = models.IntegerField(primary_key=True) |
270 | nom = models.CharField(max_length=255) |
271 | type = models.CharField(max_length=10, choices=TYPE_ORGANISME_CHOICES) |
9afaa55e |
272 | # Méta |
e9bbd6ba |
273 | actif = models.BooleanField() |
274 | |
9afaa55e |
275 | def __unicode__(self): |
276 | return u'%s (%s)' % (self.nom, self.type) |
277 | |
278 | class Meta: |
279 | ordering = ['type', 'nom'] |
280 | |
e9bbd6ba |
281 | CONTRAT_CATEGORIE_CHOICES= ( |
282 | ('A', 'A'), |
283 | ('C', 'C'), |
284 | ) |
285 | class Statut(models.Model): |
9afaa55e |
286 | # Identification |
e9bbd6ba |
287 | id = models.IntegerField(primary_key=True) |
288 | code = models.CharField(max_length=25, unique=True) |
289 | nom = models.CharField(max_length=255) |
9afaa55e |
290 | type_contrat_categorie = models.CharField(max_length=10, |
291 | choices=CONTRAT_CATEGORIE_CHOICES) |
e9bbd6ba |
292 | #CHOICES A, C (veut dire quoi?) voir TypeContrat.categorie |
9afaa55e |
293 | # Méta |
e9bbd6ba |
294 | actif = models.BooleanField() |
295 | |
9afaa55e |
296 | def __unicode__(self): |
297 | return u'%s : %s' % (self.code, self.nom) |
298 | |
e9bbd6ba |
299 | TYPE_CLASSEMENT_CHOICES = ( |
300 | ('S', 'S'), |
301 | ('T', 'T'), |
302 | ) |
303 | class Classement(models.Model): |
9afaa55e |
304 | # Identification |
e9bbd6ba |
305 | id = models.IntegerField(primary_key=True) |
306 | type = models.CharField(max_length=10, choices=TYPE_CLASSEMENT_CHOICES) |
307 | echelon = models.IntegerField() |
308 | degre = models.IntegerField() |
309 | coefficient = models.FloatField() |
9afaa55e |
310 | # Méta |
e9bbd6ba |
311 | commentaire = models.TextField(null=True, blank=True) |
312 | date_modification = models.DateField(auto_now=True) |
313 | actif = models.BooleanField() |
314 | |
315 | def __unicode__(self): |
316 | return u'%s.%s.%s (%s)' % (self.type, self.echelon, self.degre, |
317 | self.coefficient) |
9afaa55e |
318 | class Meta: |
319 | ordering = ['type','echelon','degre','coefficient'] |
e9bbd6ba |
320 | |
321 | |
9afaa55e |
322 | class TauxChange(models.Model): |
323 | # Identification |
e9bbd6ba |
324 | id = models.IntegerField(primary_key=True) |
9afaa55e |
325 | devise = models.ForeignKey('Devise', to_field='code', db_column='devise') |
e9bbd6ba |
326 | annee = models.IntegerField() |
9afaa55e |
327 | taux = models.FloatField() |
328 | # Relations |
329 | implantation = models.ForeignKey('datamaster_modeles.Implantation', |
330 | db_column='implantation', |
331 | related_name='taux_change') |
e9bbd6ba |
332 | |
333 | |
9afaa55e |
334 | class ValeurPoint(models.Model): |
335 | # Identification |
e9bbd6ba |
336 | id = models.IntegerField(primary_key=True) |
9afaa55e |
337 | valeur = models.FloatField() |
338 | implantation = models.ForeignKey('datamaster_modeles.Implantation', |
339 | db_column='implantation', |
340 | related_name='valeurs_point') |
341 | # Méta |
e9bbd6ba |
342 | annee = models.IntegerField() |
9afaa55e |
343 | |
344 | # Stockage de tous les taux de change pour optimiser la recherche de la devise associée |
345 | annee_courante = datetime.datetime.now().year |
346 | tauxchange = TauxChange.objects.select_related('devise').filter(annee=annee_courante) |
347 | |
348 | def __unicode__(self): |
349 | tx = self.get_tauxchange_courant() |
350 | if tx: |
351 | devise_code = tx.devise.code |
352 | else: |
353 | devise_code = "??" |
354 | return u'%s %s (%s-%s)' % (self.valeur, devise_code, self.implantation_id, self.annee) |
355 | |
356 | class Meta: |
357 | ordering = ['valeur'] |
e9bbd6ba |
358 | |
359 | |
360 | class Devise(models.Model): |
361 | id = models.IntegerField(primary_key=True) |
362 | code = models.CharField(max_length=10, unique=True) |
363 | nom = models.CharField(max_length=255) |
364 | |
365 | def __unicode__(self): |
366 | return u'%s - %s' % (self.code, self.nom) |
367 | |
368 | |
369 | class TypeContrat(models.Model): |
9afaa55e |
370 | # Identification |
e9bbd6ba |
371 | id = models.IntegerField(primary_key=True) |
372 | nom = models.CharField(max_length=255) |
373 | nom_long = models.CharField(max_length=255) #description |
9afaa55e |
374 | categorie = models.CharField(max_length=10, |
375 | choices=CONTRAT_CATEGORIE_CHOICES) |
376 | # Méta |
e9bbd6ba |
377 | actif = models.BooleanField() |
49f9f116 |
378 | |
9afaa55e |
379 | def __unicode__(self): |
380 | return u'%s' % (self.nom) |