source: cpc/trunk/project/apps/frontend/modules/plot/actions/components.class.php @ 1002

Last change on this file since 1002 was 1002, checked in by roux, 11 years ago

le bug du nouvel an

File size: 11.5 KB
Line 
1<?php
2
3class plotComponents extends sfComponents
4{
5  public function executeParlementaire() {
6    static $seuil_invective = 20;
7    if (!isset($this->options)) $this->options = array();
8    if (!isset($this->options['session'])) $this->options['session'] = 'lastyear';
9    if ($this->options['session'] == 'lastyear') {
10      if (isset($this->parlementaire->fin_mandat) && $this->parlementaire->fin_mandat > $this->parlementaire->debut_mandat) {
11        $date = strtotime($this->parlementaire->fin_mandat);
12        $this->mandat_clos = true;
13      } else $date = time();
14      $annee = date('Y', $date); $sem = date('W', $date);
15      $annee0 = $annee - 1;
16      $sem0 = $sem;
17      if ($sem == 53 && date('n', $date) == 1) {
18        $annee0--;
19        $sem = 0;
20      }
21      $last_year = $date - 32054400;
22      $date_debut = date('Y-m-d', $last_year);
23      $n_weeks = ($annee - $annee0)*53 + $sem - $sem0 + 1;
24    } else {
25      $query4 = Doctrine_Query::create()
26        ->select('s.annee, s.numero_semaine')
27        ->from('Seance s')
28        ->where('s.session = ?', $this->options['session'])
29        ->orderBy('s.date ASC');
30      $date_debut = $query4->fetchOne();
31      $annee0 = $date_debut['annee'];
32      $sem0 = $date_debut['numero_semaine'];
33      $query4 = Doctrine_Query::create()
34        ->select('s.annee, s.numero_semaine')
35        ->from('Seance s')
36        ->where('s.session = ?', $this->options['session'])
37        ->orderBy('s.date DESC');
38      $date_fin = $query4->fetchOne();
39      $annee = $date_fin['annee'];
40      $sem = $date_fin['numero_semaine'];
41      $n_weeks = ($annee - $annee0)*53 + $sem - $sem0 + 1;
42    }
43    $this->labels = $this->getLabelsSemaines($n_weeks, $annee, $sem);
44    $this->vacances = $this->getVacances($n_weeks, $annee0, $sem0, strtotime($this->parlementaire->debut_mandat));
45
46    $query = Doctrine_Query::create()
47      ->select('COUNT(p.id) as nombre, p.id,s.type, s.annee, s.numero_semaine')
48      ->from('Presence p')
49      ->where('p.parlementaire_id = ?', $this->parlementaire->id)
50      ->leftJoin('p.Seance s');
51    if ($this->options['session'] == 'lastyear')
52      $query->andWhere('s.date > ?', $date_debut);
53    else $query->andWhere('s.session = ?', $this->options['session']);
54    $query->groupBy('s.type, s.annee, s.numero_semaine');
55    $presences = $query->fetchArray();
56
57    $this->n_presences = array('commission' => array_fill(1, $n_weeks, 0),
58                               'hemicycle' => array_fill(1, $n_weeks, 0));
59    foreach ($presences as $presence) {
60      $n = ($presence['Seance']['annee'] - $annee0)*53 + $presence['Seance']['numero_semaine'] - $sem0 + 1;
61      if ($n <= $n_weeks) $this->n_presences[$presence['Seance']['type']][$n] += $presence['nombre'];
62    }
63    unset($presences);
64
65    $query2 = Doctrine_Query::create()
66      ->select('count(distinct s.id) as nombre, sum(i.nb_mots) as mots, count(i.id) as interv, s.type, s.annee, s.numero_semaine, i.fonction')
67      ->from('Intervention i')
68      ->where('i.parlementaire_id = ?', $this->parlementaire->id)
69      ->andWhere('i.nb_mots > ?', $seuil_invective)
70      ->leftJoin('i.Seance s');
71    if ($this->options['session'] == 'lastyear')
72      $query2->andWhere('s.date > ?', $date_debut);
73    else $query2->andWhere('s.session = ?', $this->options['session']);
74    $query2->groupBy('s.type, s.annee, s.numero_semaine');
75    $participations = $query2->fetchArray();
76
77    $this->n_participations = array('commission' => array_fill(1, $n_weeks, 0),
78                                    'hemicycle' => array_fill(1, $n_weeks, 0));
79    $this->n_mots = array('commission' => array_fill(1, $n_weeks, 0),
80                          'hemicycle' => array_fill(1, $n_weeks, 0));
81    $this->fonctions = array('commission' => 0, 'hemicycle' => 0);
82    foreach ($participations as $participation) {
83      $n = ($participation['Seance']['annee'] - $annee0)*53 + $participation['Seance']['numero_semaine'] - $sem0 + 1;
84      if ($n <= $n_weeks) {
85        $this->n_participations[$participation['Seance']['type']][$n] += $participation['nombre'];
86        $this->n_mots[$participation['Seance']['type']][$n] += $participation['mots']/10000;
87        if ($participation['fonction'] != "") $this->fonctions[$participation['Seance']['type']] += $participation['nombre'];
88      }
89    }
90    unset($participations);
91
92    if (isset($this->options['questions'])) {
93      $query3 = Doctrine_Query::create()
94        ->select('count(distinct s.id) as nombre, i.id, s.annee, s.numero_semaine')
95        ->from('Intervention i')
96        ->where('i.parlementaire_id = ?', $this->parlementaire->id)
97        ->andWhere('i.type = ?', 'question')
98        ->andWhere('i.fonction NOT LIKE ?', 'président%')
99        ->andWhere('i.nb_mots > ?', 2*$seuil_invective)
100        ->leftJoin('i.Seance s');
101      if ($this->options['session'] == 'lastyear')
102        $query3->andWhere('s.date > ?', $date_debut);
103      else $query3->andWhere('s.session = ?', $this->options['session']);
104      $query3->groupBy('s.annee, s.numero_semaine');
105      $questionsorales = $query3->fetchArray();
106
107      $this->n_questions = array_fill(1, $n_weeks, 0);
108      foreach ($questionsorales as $question) {
109        $n = ($question['Seance']['annee'] - $annee0)*53 + $question['Seance']['numero_semaine'] - $sem0 + 1;
110        if ($n <= $n_weeks) {
111          if ($this->n_questions[$n] == 0)
112            $this->n_questions[$n] -= 0.15;
113          $this->n_questions[$n] += $question['nombre'];
114        }
115      }
116      unset($questionsorales);
117    }
118  }
119
120  public static function getVacances($n_weeks, $annee0, $sem0, $debut_mandat) {
121    $n_vacances = array_fill(1, $n_weeks, 0);
122    $mandat_an0 = date('Y', $debut_mandat);
123    $mandat_sem0 = date('W', $debut_mandat);
124    if ($mandat_sem0 == 53) { $mandat_an0++; $mandat_sem0 = 1; }
125    $week0 = ($mandat_an0 - $annee0)*53 + $mandat_sem0 - $sem0 + 1;
126    for ($n = 0; $n < $week0 ; $n++) 
127      $n_vacances[$n] = 20;
128
129    $vacances = Doctrine::getTable('VariableGlobale')->findOneByChamp('vacances');
130    if ($vacances) foreach (unserialize($vacances->value) as $vacance) {
131      $n = ($vacance['annee'] - $annee0)*53 + $vacance['semaine'] - $sem0 + 1;
132      if ($n > 0 && $n < $n_weeks)
133        $n_vacances[$n] = 20;
134    }
135    return $n_vacances;
136 }
137
138 public static function getLabelsSemaines($n_weeks, $annee, $sem) {
139    if ($sem <= 1) $an = $annee - 1;
140    else $an = $annee;
141    $hashmap = array( '3'  => "Jan ".sprintf('%02d', $an-2000), '6'  => " Fév", '10' => " Mar", '15' => "Avr",
142                      '19' => " Mai", '24' => "Juin", '28' => "Juil", '33' => "Août",
143                      '38' => "Sept", '42' => " Oct", '47' => "Nov", '52' => "Déc");
144    $labels = array_fill(1, $n_weeks, "");
145    for ($i = 1; $i <= $n_weeks; $i++) {
146      $index = $i + $sem; if ($index > 53) $index -= 53;
147      if (isset($hashmap[$index]) && !(($index == 3) && ($sem < 3 && $sem > 1))) $labels[$i] = $hashmap[$index];
148    }
149    if ($sem < 3 && $sem != 0) $labels[54] = "Jan";
150    return $labels;
151  }
152
153  public function executeGroupes() {
154    $this->empty = 0;
155    if (!isset($this->plot)) $this->plot = 'total';
156    $this->labels = array('NI','UMP','NC','SRC','GDR');
157    $this->interventions = array();
158    if ($this->plot == 'total') {
159      $this->presences = array();
160      $this->interventions_moy = array();
161      $this->presences_moy = array();
162      $groupes = unserialize(Doctrine::getTable('VariableGlobale')->findOneByChamp('stats_groupes')->value);
163      $this->time = 'lastyear';
164      foreach($this->labels as $groupe) if ($groupes[$groupe]) {
165        $this->presences[] = $groupes[$groupe]['semaine']['somme'];
166        $this->presences_moy[] = $groupes[$groupe]['semaine']['somme']/$groupes[$groupe]['groupe']['nb'];
167        $this->interventions[] = $groupes[$groupe]['hemicycle_interventions']['somme'];
168        $this->interventions_moy[] = $groupes[$groupe]['hemicycle_interventions']['somme']/$groupes[$groupe]['groupe']['nb'];
169      }
170    } else {
171      $groupes = array();
172      $this->temps = array();
173      if (preg_match('/section_(\d+)$/', $this->plot, $match)) {
174        $interventions = Doctrine_Query::create()
175          ->select('p.groupe_acronyme, count(i.id) as count')
176          ->from('Parlementaire p, p.Interventions i, i.Section s')
177          ->where('i.section_id = ? OR s.section_id = ?', array($match[1], $match[1]))
178          ->andWhere('i.fonction NOT LIKE ?', 'président%')
179          ->andWhere('i.nb_mots > 20')
180          ->groupBy('p.id')
181          ->fetchArray();
182        $mots = Doctrine_Query::create()
183          ->select('p.groupe_acronyme, sum(i.nb_mots) as sum')
184          ->from('Parlementaire p, p.Interventions i, i.Section s')
185          ->where('i.section_id = ? OR s.section_id = ?', array($match[1], $match[1]))
186          ->andWhere('i.fonction NOT LIKE ?', 'président%')
187          ->groupBy('p.id')
188          ->fetchArray();
189      } else if (preg_match('/seance_(com|hemi)_(\d+)$/', $this->plot, $match)) {
190        if (preg_match('/com/', $this->plot)) $this->seance = $match[2];
191        $interventions = Doctrine_Query::create()
192          ->select('p.groupe_acronyme, count(i.id) as count')
193          ->from('Parlementaire p, p.Interventions i, i.Section s')
194          ->where('i.seance_id = ?', $match[2])
195          ->andWhere('i.fonction NOT LIKE ?', 'président%')
196          ->andWhere('i.nb_mots > 20')
197          ->groupBy('p.id')
198          ->fetchArray();
199        $mots = Doctrine_Query::create()
200          ->select('p.groupe_acronyme, sum(i.nb_mots) as sum')
201          ->from('Parlementaire p, p.Interventions i, i.Section s')
202          ->where('i.seance_id = ?', $match[2])
203          ->andWhere('i.fonction NOT LIKE ?', 'président%')
204          ->groupBy('p.id')
205          ->fetchArray();
206        if ($match[1] == 'com') {
207          $this->presences = array();
208          $presences = Doctrine_Query::create()
209            ->select('p.groupe_acronyme, count(pr.id)')
210            ->from('Parlementaire p, p.Presences pr, pr.Seance s')
211            ->where('s.id = ?', $match[2])
212            ->andWhere('s.type = ?', 'commission')
213            ->groupBy('p.id')
214            ->fetchArray();
215          foreach ($presences as $groupe)
216            if (!isset($groupes[$groupe['groupe_acronyme']]['presences']))
217              $groupes[$groupe['groupe_acronyme']]['presences'] = $groupe['count'];
218            else $groupes[$groupe['groupe_acronyme']]['presences'] += $groupe['count'];
219        }
220      } else throw new Exception('wrong plot argument');
221      if (!count($interventions) && (!isset($presences) || !count($presences))) {
222        $this->empty = 1;
223        return ;
224      }
225      foreach ($interventions as $groupe)
226        if (!isset($groupes[$groupe['groupe_acronyme']]['interventions']))
227          $groupes[$groupe['groupe_acronyme']]['interventions'] = $groupe['count'];
228        else $groupes[$groupe['groupe_acronyme']]['interventions'] += $groupe['count'];
229      foreach ($mots as $groupe)
230      if (!isset($groupes[$groupe['groupe_acronyme']]['temps_parole']))
231          $groupes[$groupe['groupe_acronyme']]['temps_parole'] = $groupe['sum'];
232        else $groupes[$groupe['groupe_acronyme']]['temps_parole'] += $groupe['sum'];
233
234      foreach($this->labels as $groupe) {
235        if (!isset($groupes[$groupe]['interventions']))
236          $this->interventions[] = 0;
237        else $this->interventions[] = $groupes[$groupe]['interventions'];
238        if (!isset($groupes[$groupe]['temps_parole']))
239          $this->temps[] = 0;
240        else $this->temps[] = $groupes[$groupe]['temps_parole'];
241        if (isset($presences)) {
242          if (!isset($groupes[$groupe]['presences']))
243            $this->presences[] = 0;
244          else $this->presences[] = $groupes[$groupe]['presences'];
245        }
246      }
247    }
248  }
249 
250}
Note: See TracBrowser for help on using the repository browser.