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

Last change on this file since 1439 was 1439, checked in by roux, 10 years ago

legende over sur graphes, laborieeux sur multigraphes donc retiré

File size: 11.4 KB
Line 
1<?php
2
3class plotComponents extends sfComponents
4{
5  public function executeParlementaire() {
6  }
7 
8  public function executeGetParlData() {
9    static $seuil_invective = 20;
10    $this->data = array();
11    if (!isset($this->options)) $this->options = array();
12    if (!isset($this->options['session'])) $this->options['session'] = 'lastyear';
13    if ($this->options['session'] == 'lastyear') {
14      if (isset($this->parlementaire->fin_mandat) && $this->parlementaire->fin_mandat > $this->parlementaire->debut_mandat) {
15        $date = strtotime($this->parlementaire->fin_mandat);
16        $this->data['mandat_clos'] = true;
17      } else $date = time();
18      $annee = date('Y', $date); $sem = date('W', $date);
19      $annee0 = $annee - 1;
20      $sem0 = $sem;
21      if ($sem == 53 && date('n', $date) == 1) {
22        $annee0--;
23        $sem = 0;
24      }
25      $last_year = $date - 32054400;
26      $date_debut = date('Y-m-d', $last_year);
27      $n_weeks = ($annee - $annee0)*53 + $sem - $sem0 + 1;
28    } else {
29      $query4 = Doctrine_Query::create()
30        ->select('s.annee, s.numero_semaine')
31        ->from('Seance s')
32        ->where('s.session = ?', $this->options['session'])
33        ->orderBy('s.date ASC');
34      $date_debut = $query4->fetchOne();
35      $annee0 = $date_debut['annee'];
36      $sem0 = $date_debut['numero_semaine'];
37      $query4 = Doctrine_Query::create()
38        ->select('s.annee, s.numero_semaine')
39        ->from('Seance s')
40        ->where('s.session = ?', $this->options['session'])
41        ->orderBy('s.date DESC');
42      $date_fin = $query4->fetchOne();
43      $annee = $date_fin['annee'];
44      $sem = $date_fin['numero_semaine'];
45      $n_weeks = ($annee - $annee0)*53 + $sem - $sem0 + 1;
46    }
47    $this->data['labels'] = $this->getLabelsSemaines($n_weeks, $annee, $sem);
48    $this->data['vacances'] = $this->getVacances($n_weeks, $annee0, $sem0, strtotime($this->parlementaire->debut_mandat));
49
50    $query = Doctrine_Query::create()
51      ->select('COUNT(p.id) as nombre, p.id,s.type, s.annee, s.numero_semaine')
52      ->from('Presence p')
53      ->where('p.parlementaire_id = ?', $this->parlementaire->id)
54      ->leftJoin('p.Seance s');
55    if ($this->options['session'] == 'lastyear')
56      $query->andWhere('s.date > ?', $date_debut);
57    else $query->andWhere('s.session = ?', $this->options['session']);
58    $query->groupBy('s.type, s.annee, s.numero_semaine');
59    $presences = $query->fetchArray();
60
61    $this->data['n_presences'] = array('commission' => array_fill(1, $n_weeks, 0),
62                               'hemicycle' => array_fill(1, $n_weeks, 0));
63    foreach ($presences as $presence) {
64      $n = ($presence['Seance']['annee'] - $annee0)*53 + $presence['Seance']['numero_semaine'] - $sem0 + 1;
65      if ($n <= $n_weeks) $this->data['n_presences'][$presence['Seance']['type']][$n] += $presence['nombre'];
66    }
67    unset($presences);
68
69    $query2 = Doctrine_Query::create()
70      ->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')
71      ->from('Intervention i')
72      ->where('i.parlementaire_id = ?', $this->parlementaire->id)
73      ->andWhere('i.nb_mots > ?', $seuil_invective)
74      ->leftJoin('i.Seance s');
75    if ($this->options['session'] == 'lastyear')
76      $query2->andWhere('s.date > ?', $date_debut);
77    else $query2->andWhere('s.session = ?', $this->options['session']);
78    $query2->groupBy('s.type, s.annee, s.numero_semaine');
79    $participations = $query2->fetchArray();
80
81    $this->data['n_participations'] = array('commission' => array_fill(1, $n_weeks, 0),
82                                    'hemicycle' => array_fill(1, $n_weeks, 0));
83    $this->data['n_mots'] = array('commission' => array_fill(1, $n_weeks, 0),
84                          'hemicycle' => array_fill(1, $n_weeks, 0));
85    foreach ($participations as $participation) {
86      $n = ($participation['Seance']['annee'] - $annee0)*53 + $participation['Seance']['numero_semaine'] - $sem0 + 1;
87      if ($n <= $n_weeks) {
88        $this->data['n_participations'][$participation['Seance']['type']][$n] += $participation['nombre'];
89        $this->data['n_mots'][$participation['Seance']['type']][$n] += $participation['mots']/10000;
90      }
91    }
92    unset($participations);
93
94    $query3 = Doctrine_Query::create()
95      ->select('count(distinct s.id) as nombre, i.id, s.annee, s.numero_semaine')
96      ->from('Intervention i')
97      ->where('i.parlementaire_id = ?', $this->parlementaire->id)
98      ->andWhere('i.type = ?', 'question')
99      ->andWhere('i.fonction NOT LIKE ?', 'président%')
100      ->andWhere('i.nb_mots > ?', 2*$seuil_invective)
101      ->leftJoin('i.Seance s');
102    if ($this->options['session'] == 'lastyear')
103      $query3->andWhere('s.date > ?', $date_debut);
104    else $query3->andWhere('s.session = ?', $this->options['session']);
105    $query3->groupBy('s.annee, s.numero_semaine');
106    $questionsorales = $query3->fetchArray();
107
108    $this->data['n_questions'] = array_fill(1, $n_weeks, 0);
109    foreach ($questionsorales as $question) {
110      $n = ($question['Seance']['annee'] - $annee0)*53 + $question['Seance']['numero_semaine'] - $sem0 + 1;
111      if ($n <= $n_weeks) {
112        if ($this->data['n_questions'][$n] == 0)
113          $this->data['n_questions'][$n] -= 0.15;
114        $this->data['n_questions'][$n] += $question['nombre'];
115      }
116    }
117    unset($questionsorales);
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.