function inscrireAction() { $this->view->individu = $individu = $this->_helper->Individu(); $this->metas(array('DC.Title' => 'Éditer le CV')); $this->branche->append(); $this->assert(null, $individu, 'inscrire', "Vous n'avez pas le droit d'inscrire cet individu dans une unité."); $this->view->apps = $individu->findAppartenances(); /* CV scout */ $apps = $individu->findInscriptionsActives(); $unites = $individu->findUnitesCandidates(); $m = new Wtk_Form_Model('inscrire'); $g = $m->addGroup('actuel'); $g->addDate('date', "Date d'inscription"); $gg = $g->addGroup('apps'); $default_next = null; if ($apps->count()) { $default_next = $apps->rewind()->current()->unite; foreach ($apps as $app) { $gg->addBool($app->id, "N'est plus " . $app->getShortDescription(), true); } } if ($unites->count()) { $i0 = $g->addBool('inscrire', "Inscrire dans une autre unité ou promouvoir", true)->setReadonly((bool) $apps->count() == 0); $i1 = $g->addEnum('unite', "Unité", $default_next); foreach ($unites as $u) { $i1->addItem($u->id, $u->getFullname()); } if ($apps->count()) { $m->addConstraintDepends($i1, $i0); } } else { $message = "Aucune unité pour " . $individu->getFullname() . " !"; $aide = "Les contraintes d'âge et de sexe ne permettent pas " . "d'inscrire {$individu->getFullname()} dans une unité."; throw new Strass_Controller_Action_Exception_Notice($message, 500, $aide); } $g = $m->addGroup('role'); $g->addEnum('role', 'Rôle'); $i0 = $g->addBool('clore', "Ne l'est plus depuis", $apps->count() > 0); $i1 = $g->addDate('fin', "Date de fin", $m->get('actuel/date')); $m->addConstraintDepends($i1, $i0); $this->view->model = $pm = new Wtk_Pages_Model_Form($m); $tu = new Unites(); $tr = new Roles(); $page = $pm->partialValidate(); if ($pm->pageCmp($page, 'role') == 0 && !$m->get('actuel/inscrire')) { $page = $pm->gotoEnd(); } /* si on veut inscrire, et qu'on connait l'unité */ if ($pm->pageCmp($page, 'role') >= 0 && $m->get('actuel/inscrire')) { $g = $m->getInstance('role'); /* Sélections des rôles ou on peut l'inscrire */ $unite = $tu->findOne($m->get('actuel/unite')); $roles = $unite->findParentTypesUnite()->findRoles(); $i = $g->getChild('role'); foreach ($roles as $role) { $i->addItem($role->id . '__', $role->titre); foreach ($role->findTitres() as $titre) { $i->addItem($role->id . '__' . $titre->nom, $titre->nom); } } } /* Ne préremplir le role que si la page role va etre affichée */ if ($pm->pageCmp($page, 'role') == 0) { $g = $m->getInstance('role'); $i = $g->getChild('role'); /* Préselection du role */ $candidats = $individu->findRolesCandidats($unite); if ($candidats->count()) { $i->set($candidats->current()->id); } /* Présélection de la date */ $annee = intval(strtok($m->get('actuel/date'), '/')); if ($app = $individu->findInscriptionSuivante($annee)) { /* on a trouvé un successeur, donc potentiellement on clot */ $m->getInstance('role/clore')->set(TRUE); $m->getInstance('role/fin')->set($app->debut); } else { $i = $m->getInstance('actuel/date'); $fin = $i->getDateArray(); $fin['year'] += 1; $future = $fin['year'] > date('%Y'); $m->getInstance('role/clore')->set(!$future); $m->getInstance('role/fin')->set($fin); } } if ($pm->validate()) { $t = new Appartenances(); $db = $t->getAdapter(); $db->beginTransaction(); try { foreach ($m->get('actuel/apps') as $k => $clore) { if (!$clore) { continue; } $app = $t->findOne($k); $app->fin = $m->get('actuel/date'); $app->save(); } if ($m->get('actuel/inscrire')) { $app = new Appartient(); $app->individu = $individu->id; $app->unite = $m->get('actuel/unite'); list($role, $titre) = explode('__', $m->get('role/role')); $app->role = intval($role); $app->titre = $titre; $app->debut = $m->get('actuel/date'); if ($m->get('role/clore')) { $app->fin = $m->get('role/fin'); } $app->save(); } $this->logger->info("Inscription éditée", $this->_helper->Url('fiche')); $db->commit(); } catch (Exception $e) { $db->rollBack(); throw $e; } $this->redirectSimple('fiche'); } }