source: cpc/branches/senat/project/lib/task/fuseDossiersTask.class.php @ 2338

Last change on this file since 2338 was 2338, checked in by roux, 9 years ago

adaptation changements à NS

File size: 7.9 KB
Line 
1<?php
2
3class fuseDossiersTask extends sfBaseTask {
4  protected function configure() {
5    $this->namespace = 'fuse';
6    $this->name = 'Dossiers';
7    $this->briefDescription = 'Fusionne un dossier vers un autre';
8    $this->addArgument('baddossier', sfCommandArgument::REQUIRED, 'Dossier à intégrer'); 
9    $this->addArgument('gooddossier', sfCommandArgument::REQUIRED, 'Dossier d\'acccueil');
10    $this->addArgument('seanceid', sfCommandArgument::REQUIRED, 'Optionnel : limite à cette séance');
11    $this->addOption('env', null, sfCommandOption::PARAMETER_OPTIONAL, 'Changes the environment this task is run in', 'test');
12    $this->addOption('app', null, sfCommandOption::PARAMETER_OPTIONAL, 'Changes the environment this task is run in', 'frontend');
13 }
14
15  protected function execute($arguments = array(), $options = array()) {
16    $manager = new sfDatabaseManager($this->configuration);
17    $bad = Doctrine::getTable('Section')->find($arguments['baddossier']);
18    $good = Doctrine::getTable('Section')->find($arguments['gooddossier']);
19    $seance = $arguments['seanceid'];
20    if (!$bad || !$good) {
21      print "Dossier inexistant\n";
22      return;
23    }
24    if ($good->id != $good->section_id) {
25      print "Le dossier d'accueil est une sous section\n";
26      return;
27    }
28    if ($bad->id == $good->id)  {
29      print "Même dossier\n";
30      return;
31    }
32
33    #print " - Gère les sous-sections\n";
34    $n_itv = 0;
35    foreach ($bad->SubSections as $sub) {
36      if ($sub->id == $bad->id) continue;
37      print "\n + $sub->titre_complet";
38      $exist = Doctrine::getTable('Section')->createQuery('s')->where('s.section_id = ?', $good->id)->andWhere('s.titre = ?', $sub->getOrigTitre())->fetchOne();
39      if (isset($exist->section_id)) {
40        print " existe déjà pour la section d'accueil, met-à-jour\n";
41
42        $this->updateTags($sub, $exist);
43        $n_itv += $this->updateInterv($sub, $exist);
44        $this->updateComments($sub, $exist);
45        $this->updateMinDate($sub, $exist);
46
47        $query = Doctrine_Query::create()
48          ->delete('Section s')
49          ->where('s.id = ?', $sub->id);
50        if (! $query->execute()) {
51          print "\n  -> Suppression impossible de la sous-section $sub->id\n";
52          return;
53        } else print " fusionnée et supprimée\n";
54
55      } else {
56        $sub->setTitreComplet(str_replace($bad->getOrigTitre(), $good->getOrigTitre(), $sub->titre_complet));
57        $sub->section_id = $good->id;
58        print " -> $sub->titre_complet";
59        $sub->save();
60        $n_itv += $sub->nb_interventions;
61        $sub->nb_commentaires;
62      }
63    }
64
65  if ($bad->id != $bad->section_id) {
66    print "\n + $sub->titre_complet";
67    $exist = Doctrine::getTable('Section')->createQuery('s')->where('s.section_id = ?', $good->id)->andWhere('s.titre = ?', $bad->getOrigTitre())->fetchOne();
68    if (isset($exist->section_id)) {
69      print " existe déjà pour la section d'accueil, met-à-jour\n";
70      if ($seance) $n_itv += $this->updateInterv($bad, $exist, 0, $seance);
71      else {
72        $this->updateTags($bad, $exist);
73        $n_itv += $this->updateInterv($bad, $exist);
74        $this->updateComments($bad, $exist);
75        $this->updateMinDate($bad, $exist);
76        $query = Doctrine_Query::create()
77          ->delete('Section s')
78          ->where('s.id = ?', $bad->id);
79        if (! $query->execute()) {
80          print "\n  -> Suppression impossible de la sous-section $bad->id\n";
81          return;
82        } else print " fusionnée et supprimée\n";
83      }
84    } else {
85      if ($seance) {
86        $new = new Section();
87        $new->setTitreComplet(str_replace($bad->Section->getOrigTitre(), $good->getOrigTitre(), $bad->titre_complet));
88        $new->section_id = $good->id;
89        print " -> $new->titre_complet";
90        $this->updateInterv($bad, $new, 0, $seance);
91        $new->save();
92      } else {
93        $bad->setTitreComplet(str_replace($bad->getOrigTitre(), $good->getOrigTitre(), $bad->titre_complet));
94        $bad->section_id = $good->id;
95        print " -> $bad->titre_complet";
96        $bad->save();
97        $n_itv += $bad->nb_interventions;
98        $bad->nb_commentaires;
99      }
100    }
101
102  } else { 
103    $this->updateTags($bad, $good);
104    $this->updateInterv($bad, $good, $n_itv);
105    $this->updateComments($bad, $good);
106    $this->updateMinDate($bad, $good);
107 
108    $corresp = array(strtolower($bad->getOrigTitre()) => strtolower($good->getOrigTitre()));
109    print "\nEnregistre la correspondance en base :\n";
110    $option = Doctrine::getTable('VariableGlobale')->findOneByChamp('dossiers');
111    if (!$option) {
112      $option = new VariableGlobale();
113      $option->setChamp('dossiers');
114      $option->setValue(serialize($corresp));
115    } else $option->setValue(serialize(array_merge(unserialize($option->getValue()), $corresp)));
116    $option->save();
117    print_r($corresp);
118    print "  ";
119    $option = Doctrine::getTable('VariableGlobale')->findOneByChamp('linkdossiers');
120    if (!$option) {
121      $option = new VariableGlobale();
122      $option->setChamp('linkdossiers');
123      $option->setValue(serialize(array("$bad->id" => "$good->id")));
124    } else {
125      $value = unserialize($option->getValue());
126      $value["$bad->id"] = "$good->id";
127      $option->setValue(serialize($value));
128    }
129    $option->save();
130    print "$bad->id => $good->id\n";
131
132    $query = Doctrine_Query::create()
133      ->delete('Section s')
134      ->where('s.id = ?', $bad->id);
135    if (! $query->execute()) {
136      print 'Suppression impossible de la section '.$bad->id."\n";
137    }
138  }
139 }
140
141  private static function updateTags($b, $g) {
142    #print "      Gère les tags\n";
143    foreach(Doctrine::getTable('Tagging')->createQuery('t')->where('t.taggable_model = ?', 'Section')->andWhere('t.taggable_id = ?', $b->id)->execute() as $tag) {
144      #print $tag->tag_id." ";
145      if (count(Doctrine::getTable('Tagging')->createQuery('t')->where('t.taggable_model = ?', 'Section')->andWhere('t.taggable_id = ?', $g->id)->andWhere('t.tag_id = ?', $tag->tag_id)->execute()) > 0) {
146         $query = Doctrine_Query::create()
147           ->delete('Tagging t')
148           ->where('t.id = ?', $tag->id);
149         if (! $query->execute()) {
150           print 'Impossible de supprimer le tagging '.$tag->id."\n";
151         }
152      } else {
153        $tag->taggable_id = $g->id;
154        $tag->save();
155      }
156    }
157  }
158
159  private static function updateInterv($b, $g, $base = 0, $seance = 0) {
160    #print "      Gère les interventions\n";
161    $ct = 0;
162    $query = Doctrine::getTable('Intervention')->createQuery('i')->where('i.section_id = ?', $b->id);
163    if ($seance) $query->andWhere('i.seance_id = ?', $seance);
164    foreach($query->execute() as $itv) {
165      #print $itv->id." ";
166      $itv->section_id = $g->id;
167      $itv->save();
168      $ct++;
169    }
170    if ($ct != 0) {
171      $query = Doctrine_Query::create()
172        ->update('Section')
173        ->set('nb_interventions', $g->nb_interventions + $ct + $base)
174        ->where('id = ?', $g->id)
175        ->execute();
176    }
177    #print " / total : ".$ct."\n";
178    return $ct;
179  }
180
181  private static function updateComments($b, $g) {
182    #print "      Gère les commentaires\n";
183    $ct = 0;
184    foreach(Doctrine::getTable('CommentaireObject')->createQuery('c')->where('c.object_type = ?', 'Section')->andWhere('c.object_id = ?', $b->id)->execute() as $com) {
185      #print $com->id." ";
186      $com->object_id = $g->id;
187      $com->save();
188      $comment = $com->getCommentaire();
189      if ($comment->is_public == 1) $ct++;
190    }
191    if ($ct != 0) {
192      $query = Doctrine_Query::create()
193        ->update('Section')
194        ->set('nb_commentaires', $g->nb_commentaires + $ct)
195        ->where('id = ?', $g->id)
196        ->execute();
197    }
198    #print "\n";
199  }
200
201  private static function updateMinDate($b, $g) {
202    if (strtotime($b->min_date) < strtotime($g->min_date))
203      $query = Doctrine_Query::create()
204        ->update('Section')
205        ->set('min_date', '"'.$b->min_date.'"')
206        ->where('id = ?', $g->id)
207        ->execute();
208  }
209
210}
211
Note: See TracBrowser for help on using the repository browser.