À finir : Travail calcul jours ouvrés entre 2 dates
[OpenERP/cmmi.git] / axes.py
1 #-*- coding: utf8 -*-
2 '''
3 '''
4
5 from openerp.osv import osv, fields
6 from datetime import *
7
8
9 class Mesurable(osv.Model):
10     _name = "cmmi.axes.mesurable"
11
12     _statuts = [("cree", "Crée"), ("encours", "En cours"),
13                 ("termine", "Terminé"), ("abandonne", "Abandonné"),
14                 ("suspendu", "Suspendu"), ("generique", "Générique")]
15
16     _columns = {
17         "name": fields.char(string="Title", size=64, required=True),
18         "description": fields.text(string="Description"),
19         "commentaire": fields.text(string="Commentaire"),
20         "statut": fields.selection(_statuts, string="Statut"),
21         "version": fields.char(string="Version", size=16),
22         "date_jalon": fields.date(string="Jalon"),
23         "date_init_deb": fields.date(string="Date initiale début"),
24         "date_init_fin": fields.date(string="Date initiale de fin"),
25         "date_plan_deb": fields.date(string="Date plannifiée début"),
26         "date_plan_fin": fields.date(string="Date plannifiée de fin"),
27         "date_reel_deb": fields.date(string="Data réelle début"),
28         "date_reel_fin": fields.date(string="Data réelle fin"),
29     }
30
31     _sql_constraints = [
32         (
33             "date_init_deb_before_date_init_fin",
34             "CHECK(date_init_deb<> date_init_fin)",
35             "The date_init_deb should be previous date_init_fin",
36         ),
37         (
38             "date_plan_deb_before_date_plan_fin",
39             "CHECK(date_plan_deb <> date_plan_fin)",
40             "The date_plan_deb should be previous date_plan_fin",
41         ),
42         (
43             "date_reel_deb_before_date_reel_fin",
44             "CHECK(date_reel_deb<> date_reel_fin)",
45             "The date_reel_deb should be previous date_reel_fin",
46         ),
47     ]
48
49
50 #=============== TODO TRAVAIL CALCUL JOURS OUVRES ==============================
51 #    def _annee_bissextile(self, annee): # TODO vérifier le besoin de self
52 #        """ Retourne vrai si l'année est bissextile, faux sinon. """
53 #        return (annee % 4 == 0 and annee % 100 != 0 or  annee % 400 == 0)
54 #
55 #
56 #    def _get_date_paques(self, annee): # TODO vérifier le besoin de self
57 #        """
58 #        Retourne la date du dimanque de pâques pour une année donnée
59 #            sous la forme d'un objet date.
60 #        """
61 #        a = annee % 19
62 #        b = annee // 100
63 #        c = annee % 100
64 #        d = (19 * a + b - b // 4 - ((b - (b + 8) // 25 + 1) // 3) + 15) % 30
65 #        e = (32 + 2 * (b % 4) + 2 * (c // 4) - d - (c % 4)) % 7
66 #        f = d + e - 7 * ((a + 11 * d + 22 * e) // 451) + 114
67 #        mois = f // 31
68 #        jours = f % 31 + 1
69 #        return date(annee, mois, jours)
70 #
71 #
72 #    def get_jours_feries(self, annee):
73 #        """
74 #        Retourne une liste contenant les jours fériés d'une année donnée.
75 #        """
76 #        date_paques = _get_date_paques(self, annee)
77 #        return [
78 #            date_paques+timedelta(days=1), # Lundi de Pâques
79 #            date_paques+timedelta(days=39), # Jeudi de l'Ascension
80 #            date_paques+timedelta(days=50), # Lundi de Pentecôte
81 #            date(annee, 1, 1), # Jour de l'An
82 #            date(annee, 5, 1), # Fête du travail
83 #            date(annee, 5, 8), # Armistice 1945
84 #            date(annee, 7, 14), # Fête Nationale
85 #            date(annee, 8, 15), # Assomption
86 #            date(annee, 11, 1), # Toussaint
87 #            date(annee, 11, 11), # Armistice 1918
88 #            date(annee, 12, 25), # Noël
89 #        ]
90 #
91 #    def _jour_ouvre(self, d):
92 #        """ Retourne vrai si la date est un jour ouvre, faux sinon."""
93 #        if (5,6).__contains__(d.weekday()) or _get_jours_feries(d.year).__contains__(d):
94 #            return False
95 #        else:
96 #            return True
97 #
98 #    def _nb_jours_ouvre_entre_2_dates(self, d1, d2):
99 #        """
100 #        Retourne le nombre de jours ouvres entre deux dates données.
101 #
102 #        >>> nb_jours_ouvre_entre_2_dates(date(2013, 5, 1), date(2013, 7, 31))
103 #        62
104 #        >>> nb_jours_ouvre_entre_2_dates(date(2013, 7, 31), date(2013, 5, 1))
105 #        62
106 #        """
107 #        if d1>d2:
108 #            d1, d2 = d2, d1 # Switch les 2 dates pour que d1 soit la plus petite
109 #        tmp = d1
110 #        jour_ouvres = 0
111 #        while tmp <= d2:
112 #            if _jour_ouvre(self, tmp): # Si tmp est un jour ouvre
113 #                jour_ouvres += 1
114 #            tmp += timedelta(days=1)
115 #        return jour_ouvres
116 #===============================================================================
117
118
119 class Chantier(osv.Model):
120     _name = "cmmi.axes.chantier"
121
122     _inherit = "cmmi.axes.mesurable"
123
124     _columns = {
125         "projet_id": fields.many2one("cmmi.projet",
126                                      string="Projet",
127                                      required=True),
128         "evolutions": fields.one2many("cmmi.evolution",
129                                       "chantier_id",
130                                       string="Evolutions"),
131     }
132
133
134 class Palier(osv.Model):
135     _name = "cmmi.axes.palier"
136
137     _inherit = "cmmi.axes.mesurable"
138
139     _types_palier = [("normal", "Normal"), ("exceptionnel", "Exceptionnel"),
140                      ("correctif", "Correctif"), ("autre", "Autre")]
141
142     _columns = {
143         "type_palier": fields.selection(_types_palier, string="Type"),
144         "projet_id": fields.many2one("cmmi.projet",
145                                      string="Projet",
146                                      required=True),
147         "evolutions": fields.one2many("cmmi.evolution",
148                                       "palier_id",
149                                       string="Evolutions"),
150         "phases": fields.one2many("cmmi.phase",
151                                   "palier_id",
152                                   string="Phases"),
153     }