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

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

débuts pas finis pour graphes d'accueil

File size: 13.8 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 executeNewGroupes() {
154  }
155
156  public function executeGetGroupesData() {
157    $this->data = array();
158    $this->data['groupes'] = array('UMP' => array(),'NC' => array(),'SRC' => array(),'GDR' => array(), 'NI' => array());
159    $this->data['titres'] = array("Députés", "Interventions", "Amendements", "Propositions", "Quest. Orales", "Quest. Écrites");
160    $n = count($this->data['titres']);
161    $stats = unserialize(Doctrine::getTable('VariableGlobale')->findOneByChamp('stats_groupes')->value);
162    $amdmts = Doctrine_Query::create()
163      ->select('p.groupe_acronyme, count(DISTINCT(a.id)) as ct')
164      ->from('Parlementaire p, p.ParlementaireAmendements pa, pa.Amendement a')
165      ->where('a.date > ?', date('Y-m-d', time()-60*60*24*365))
166      ->groupBy('p.groupe_acronyme')
167      ->fetchArray();
168    $props = Doctrine_Query::create()
169      ->select('p.groupe_acronyme, count(DISTINCT(t.id)) as ct')
170      ->from('Parlementaire p, p.ParlementaireTextelois pt, pt.Texteloi t')
171      ->where('t.date > ?', date('Y-m-d', time()-60*60*24*365))
172      ->andWhere('pt.importance = 1')
173      ->andWhere('t.type LIKE ?', "proposition%")
174      ->groupBy('p.groupe_acronyme')
175      ->fetchArray();
176    foreach ($this->data['groupes'] as $groupe => $arr) if ($stats[$groupe]) {
177      $this->data['groupes'][$groupe][] = $stats[$groupe]['groupe']['nb'];
178      $this->data['groupes'][$groupe][] = $stats[$groupe]['hemicycle_interventions']['somme']+$stats[$groupe]['commission_interventions']['somme'];
179    }
180    foreach ($amdmts as $amdt)
181      $this->data['groupes'][$amdt['groupe_acronyme']][] = $amdt['ct'];
182    foreach ($props as $pro)
183      $this->data['groupes'][$pro['groupe_acronyme']][] = $pro['ct'];
184    foreach ($this->data['groupes'] as $groupe => $arr) if ($stats[$groupe]) {
185      $this->data['groupes'][$groupe][] = $stats[$groupe]['questions_ecrites']['somme'];
186      $this->data['groupes'][$groupe][] = $stats[$groupe]['questions_orales']['somme'];
187    }
188    $this->data['totaux'] = array();
189    for ($i=0;$i<$n;$i++)
190      $this->data['totaux'][] = 0;
191    foreach ($this->data['groupes'] as $groupe => $arr)
192      for ($i=0;$i<$n;$i++)
193        $this->data['totaux'][$i] += $this->data['groupes'][$groupe][$i];
194    foreach ($this->data['groupes'] as $groupe => $arr)
195      for ($i=0;$i<$n;$i++)
196        $this->data['groupes'][$groupe][$i] = $this->data['groupes'][$groupe][$i] / $this->data['totaux'][$i] * 100;
197  }
198
199  public function executeGroupes() {
200    $this->empty = 0;
201    if (!isset($this->plot)) $this->plot = 'total';
202    $this->labels = array('NI','UMP','NC','SRC','GDR');
203    $this->interventions = array();
204    if ($this->plot == 'total') {
205      $this->presences = array();
206      $this->interventions_moy = array();
207      $this->presences_moy = array();
208      $groupes = unserialize(Doctrine::getTable('VariableGlobale')->findOneByChamp('stats_groupes')->value);
209      $this->time = 'lastyear';
210      foreach($this->labels as $groupe) if ($groupes[$groupe]) {
211        $this->presences[] = $groupes[$groupe]['semaines_presence']['somme'];
212        $this->presences_moy[] = $groupes[$groupe]['semaines_presence']['somme']/$groupes[$groupe]['groupe']['nb'];
213        $this->interventions[] = $groupes[$groupe]['hemicycle_interventions']['somme'];
214        $this->interventions_moy[] = $groupes[$groupe]['hemicycle_interventions']['somme']/$groupes[$groupe]['groupe']['nb'];
215      }
216    } else {
217      $groupes = array();
218      $this->temps = array();
219      if (preg_match('/section_(\d+)$/', $this->plot, $match)) {
220        $interventions = Doctrine_Query::create()
221          ->select('p.groupe_acronyme, count(i.id) as count')
222          ->from('Parlementaire p, p.Interventions i, i.Section s')
223          ->where('i.section_id = ? OR s.section_id = ?', array($match[1], $match[1]))
224          ->andWhere('i.fonction NOT LIKE ?', 'président%')
225          ->andWhere('i.nb_mots > 20')
226          ->groupBy('p.id')
227          ->fetchArray();
228        $mots = Doctrine_Query::create()
229          ->select('p.groupe_acronyme, sum(i.nb_mots) as sum')
230          ->from('Parlementaire p, p.Interventions i, i.Section s')
231          ->where('i.section_id = ? OR s.section_id = ?', array($match[1], $match[1]))
232          ->andWhere('i.fonction NOT LIKE ?', 'président%')
233          ->groupBy('p.id')
234          ->fetchArray();
235      } else if (preg_match('/seance_(com|hemi)_(\d+)$/', $this->plot, $match)) {
236        if (preg_match('/com/', $this->plot)) $this->seance = $match[2];
237        $interventions = Doctrine_Query::create()
238          ->select('p.groupe_acronyme, count(i.id) as count')
239          ->from('Parlementaire p, p.Interventions i, i.Section s')
240          ->where('i.seance_id = ?', $match[2])
241          ->andWhere('i.fonction NOT LIKE ?', 'président%')
242          ->andWhere('i.nb_mots > 20')
243          ->groupBy('p.id')
244          ->fetchArray();
245        $mots = Doctrine_Query::create()
246          ->select('p.groupe_acronyme, sum(i.nb_mots) as sum')
247          ->from('Parlementaire p, p.Interventions i, i.Section s')
248          ->where('i.seance_id = ?', $match[2])
249          ->andWhere('i.fonction NOT LIKE ?', 'président%')
250          ->groupBy('p.id')
251          ->fetchArray();
252        if ($match[1] == 'com') {
253          $this->presences = array();
254          $presences = Doctrine_Query::create()
255            ->select('p.groupe_acronyme, count(pr.id)')
256            ->from('Parlementaire p, p.Presences pr, pr.Seance s')
257            ->where('s.id = ?', $match[2])
258            ->andWhere('s.type = ?', 'commission')
259            ->groupBy('p.id')
260            ->fetchArray();
261          foreach ($presences as $groupe)
262            if (!isset($groupes[$groupe['groupe_acronyme']]['presences']))
263              $groupes[$groupe['groupe_acronyme']]['presences'] = $groupe['count'];
264            else $groupes[$groupe['groupe_acronyme']]['presences'] += $groupe['count'];
265        }
266      } else throw new Exception('wrong plot argument');
267      if (!count($interventions) && (!isset($presences) || !count($presences))) {
268        $this->empty = 1;
269        return ;
270      }
271      foreach ($interventions as $groupe)
272        if (!isset($groupes[$groupe['groupe_acronyme']]['interventions']))
273          $groupes[$groupe['groupe_acronyme']]['interventions'] = $groupe['count'];
274        else $groupes[$groupe['groupe_acronyme']]['interventions'] += $groupe['count'];
275      foreach ($mots as $groupe)
276      if (!isset($groupes[$groupe['groupe_acronyme']]['temps_parole']))
277          $groupes[$groupe['groupe_acronyme']]['temps_parole'] = $groupe['sum'];
278        else $groupes[$groupe['groupe_acronyme']]['temps_parole'] += $groupe['sum'];
279
280      foreach($this->labels as $groupe) {
281        if (!isset($groupes[$groupe]['interventions']))
282          $this->interventions[] = 0;
283        else $this->interventions[] = $groupes[$groupe]['interventions'];
284        if (!isset($groupes[$groupe]['temps_parole']))
285          $this->temps[] = 0;
286        else $this->temps[] = $groupes[$groupe]['temps_parole'];
287        if (isset($presences)) {
288          if (!isset($groupes[$groupe]['presences']))
289            $this->presences[] = 0;
290          else $this->presences[] = $groupes[$groupe]['presences'];
291        }
292      }
293    }
294  }
295 
296}
Note: See TracBrowser for help on using the repository browser.