public function executeSioccupadi()
 {
     $options = array('limit' => 20, 'sort_by_relevance' => true);
     // estrazione tag, tipo firma, tipo atto
     // questo dovrebbe andare in TagPeer, ma romperebbe la neutralità del plugin
     $c = new Criteria();
     $c->addJoin(OppCaricaHasAttoPeer::ATTO_ID, OppAttoPeer::ID);
     $c->addJoin(TaggingPeer::TAGGABLE_ID, OppAttoPeer::ID);
     $c->addJoin(TagPeer::ID, TaggingPeer::TAG_ID);
     $c->add(OppCaricaHasAttoPeer::CARICA_ID, $this->carica->getId());
     $c->add(TaggingPeer::TAGGABLE_MODEL, 'OppAtto');
     $c->clearSelectColumns();
     $c->addSelectColumn(TagPeer::TRIPLE_VALUE);
     $c->addSelectColumn(OppCaricaHasAttoPeer::TIPO);
     $c->addSelectColumn(OppAttoPeer::TIPO_ATTO_ID);
     // costruzione array associativo dei tag
     $tags = array();
     $rs = TagPeer::doSelectRS($c);
     while ($rs->next()) {
         $value = $rs->getString(1);
         $tipo = $rs->getString(2);
         $tipo_atto_id = $rs->getInt(3);
         if (!array_key_exists($value, $tags)) {
             $tags[$value] = 0;
         }
         $tags[$value] += OppCaricaHasAttoPeer::get_fattore_firma($tipo) * OppAttoPeer::get_fattore_tipo_atto($tipo_atto_id);
     }
     // ordinamento per rilevanza, prima dello slice
     arsort($tags);
     // slice dell'array, se specificata l'opzione limit
     if (isset($options['limit']) && count($tags) > $options['limit']) {
         $this->n_remaining_tags = count($tags) - $options['limit'];
         $tags = array_slice($tags, 0, $options['limit'], true);
     }
     // ordinamento per triple_value, in caso sort_by_relevance non sia specificato
     if (!isset($options['sort_by_relevance']) || true !== $options['sort_by_relevance']) {
         krsort($tags);
     }
     $this->tags = $tags;
 }
 /**
  * estrae tutte le firme fino a una certa data
  *
  * @param string $data 
  * @return array di OppCaricaHasAtto
  * @author Guglielmo Celata
  */
 public function getFirme($data)
 {
     return OppCaricaHasAttoPeer::getFirme($this->getId(), $data);
 }
 /**
  * torna un array associativo di politici che si occupano di certi argomenti, 
  * ordinati in base al punteggio, con eventuale limit
  *
  * @param array $argomenti_ids 
  * @param string $ramo (C o S)
  * @param integer $gruppo_id filtro opzionale per gruppo
  * @param boolean fetch_interventi (se fetchare o meno gli interventi)
  * @return array di hash, con chiave carica_id
  *          - politico_id,
  *          - nome, cognome, acronimo,
  *          - punteggio
  * @author Guglielmo Celata
  */
 public static function getClassificaPoliticiSiOccupanoDiArgomenti($argomenti_ids, $ramo, $data, $limit = null, $gruppo_ids = null, $fetch_interventi = true)
 {
     // definizione array tipi di cariche
     if ($ramo == 'C') {
         $tipi_cariche = array(1);
     } else {
         if ($ramo == 'S') {
             $tipi_cariche = array(4, 5);
         } else {
             $tipi_cariche = array(1, 4, 5);
         }
     }
     if (is_array($gruppo_ids)) {
         if (count($gruppo_ids) > 0) {
             $group_constraint = sprintf(" and g.id in (%s) ", implode(", ", $gruppo_ids));
         } else {
             $group_constraint = '';
         }
     } else {
         if (is_null($gruppo_ids)) {
             $group_constraint = '';
         } else {
             $group_constraint = " and g.id = {$gruppo_ids} ";
         }
     }
     // Firme
     // estrazione di tutte le firme relative ad atti non-omnibus taggati con argomento
     $con = Propel::getConnection(self::DATABASE_NAME);
     $sql = sprintf("select p.nome, p.cognome, p.id as politico_id, g.acronimo, c.id as carica_id, c.circoscrizione, ca.tipo, ca.atto_id, ah.indice, ah.priorita from opp_carica c, opp_carica_has_atto ca, opp_carica_has_gruppo cg, opp_gruppo g, sf_tagging t, opp_act_history_cache ah, opp_politico p, opp_atto a where p.id=c.politico_id and c.id=ca.carica_id and cg.carica_id=c.id and cg.data_fine is null and cg.gruppo_id=g.id %s and a.is_omnibus = 0 and t.taggable_id=ca.atto_id and t.taggable_model='OppAtto' and ah.chi_tipo='A' and ah.data='%s' and ah.chi_id=ca.atto_id  and a.id=ca.atto_id and (ca.tipo != 'P' or ca.tipo = 'P' and a.pred is null) and c.tipo_carica_id in (%s) and c.data_fine is null and cg.data_fine is null and t.tag_id in (%s) group by ca.tipo, ca.atto_id, ca.carica_id", $group_constraint, $data, implode(", ", $tipi_cariche), implode(", ", $argomenti_ids));
     $stm = $con->createStatement();
     $rs = $stm->executeQuery($sql, ResultSet::FETCHMODE_ASSOC);
     // costruzione array associativo dei politici (sommatoria pesata)
     $politici = array();
     while ($rs->next()) {
         $row = $rs->getRow();
         $carica_id = $row['carica_id'];
         $circoscrizione = $row['circoscrizione'];
         $atto_id = $row['atto_id'];
         $tipo = $row['tipo'];
         $punti_atto = $row['indice'];
         $priorita = $row['priorita'];
         $politico_id = $row['politico_id'];
         $nome = $row['nome'];
         $cognome = $row['cognome'];
         $acronimo = $row['acronimo'];
         if (!array_key_exists($carica_id, $politici)) {
             $politici[$carica_id] = array('politico_id' => $politico_id, 'circoscrizione' => $circoscrizione, 'nome' => $nome, 'cognome' => $cognome, 'acronimo' => $acronimo, 'punteggio' => 0);
         }
         $politici[$carica_id]['punteggio'] += OppCaricaHasAttoPeer::get_nuovo_fattore_firma($tipo) * $punti_atto / (double) $priorita;
     }
     // Firme
     // estrazione di tutte le firme relative ad atti omnibus taggati con argomento
     $con = Propel::getConnection(self::DATABASE_NAME);
     $sql = sprintf("select p.nome, p.cognome, p.id as politico_id, g.acronimo, c.id as carica_id, c.circoscrizione, ca.tipo, ca.atto_id, ah.indice, ah.priorita from opp_carica c, opp_carica_has_atto ca, opp_carica_has_gruppo cg, opp_gruppo g, sf_tagging_for_index t, opp_act_history_cache ah, opp_politico p, opp_atto a where p.id=c.politico_id and c.id=ca.carica_id and cg.carica_id=c.id and cg.data_fine is null and cg.gruppo_id=g.id %s and a.is_omnibus = 1 and t.atto_id=ca.atto_id and (ca.tipo != 'P' or ca.tipo = 'P' and a.pred is null) and  ah.chi_tipo='A' and ah.data='%s' and ah.chi_id=ca.atto_id and a.id=ca.atto_id and c.tipo_carica_id in (%s) and c.data_fine is null and cg.data_fine is null and t.tag_id in (%s) group by ca.tipo, ca.atto_id, ca.carica_id", $group_constraint, $data, implode(", ", $tipi_cariche), implode(", ", $argomenti_ids));
     $stm = $con->createStatement();
     $rs = $stm->executeQuery($sql, ResultSet::FETCHMODE_ASSOC);
     // aggiunta all'array della classifica dei politici
     while ($rs->next()) {
         $row = $rs->getRow();
         $carica_id = $row['carica_id'];
         $circoscrizione = $row['circoscrizione'];
         $atto_id = $row['atto_id'];
         $tipo = $row['tipo'];
         $punti_atto = $row['indice'];
         $priorita = $row['priorita'];
         $politico_id = $row['politico_id'];
         $nome = $row['nome'];
         $cognome = $row['cognome'];
         $acronimo = $row['acronimo'];
         if (!array_key_exists($carica_id, $politici)) {
             $politici[$carica_id] = array('politico_id' => $politico_id, 'circoscrizione' => $circoscrizione, 'nome' => $nome, 'cognome' => $cognome, 'acronimo' => $acronimo, 'punteggio' => 0);
         }
         $politici[$carica_id]['punteggio'] += OppCaricaHasAttoPeer::get_nuovo_fattore_firma($tipo) * $punti_atto / (double) $priorita;
     }
     if ($fetch_interventi) {
         // Interventi
         // estrazione degli interventi relativi ad atti non-omnibus taggati con argomenti
         $sql = sprintf("select count(*) as ni, p.id as politico_id, p.nome, p.cognome, c.circoscrizione, g.acronimo, i.atto_id, i.carica_id, ah.indice, ah.priorita from opp_intervento i, opp_atto a, opp_politico p, opp_carica c, opp_carica_has_gruppo cg, opp_gruppo g, sf_tagging t, opp_act_history_cache ah where p.id=c.politico_id and ah.chi_id=i.atto_id and i.atto_id=a.id and c.id=i.carica_id and cg.carica_id=c.id and cg.data_fine is null  and cg.gruppo_id=g.id %s  and ah.data='%s' and c.tipo_carica_id in (%s) and c.data_fine is null and a.is_omnibus = 0 and t.taggable_id=a.id and t.taggable_model='OppAtto' and t.tag_id in (%s) group by i.carica_id, i.atto_id;", $group_constraint, $data, implode(", ", $tipi_cariche), implode(", ", $argomenti_ids));
         $stm = $con->createStatement();
         $rs = $stm->executeQuery($sql, ResultSet::FETCHMODE_ASSOC);
         // costruzione array associativo dei politici (sommatoria pesata)
         while ($rs->next()) {
             $row = $rs->getRow();
             $n_interventi = $row['ni'];
             $carica_id = $row['carica_id'];
             $atto_id = $row['atto_id'];
             $circoscrizione = $row['circoscrizione'];
             $priorita = $row['priorita'];
             $punti_atto = $row['indice'];
             $politico_id = $row['politico_id'];
             $nome = $row['nome'];
             $cognome = $row['cognome'];
             $acronimo = $row['acronimo'];
             if (!array_key_exists($carica_id, $politici)) {
                 $politici[$carica_id] = array('politico_id' => $politico_id, 'circoscrizione' => $circoscrizione, 'nome' => $nome, 'cognome' => $cognome, 'acronimo' => $acronimo, 'punteggio' => 0);
             }
             $politici[$carica_id]['punteggio'] += OppCaricaHasAttoPeer::get_nuovo_fattore_firma('I') * $n_interventi * $punti_atto / (double) $priorita;
         }
         // estrazione di tutte le sedute con interventi relativi ad atti omnibus taggati con argomenti
         $sql = sprintf("select count(*) as ni, p.id as politico_id, p.nome, p.cognome, c.circoscrizione, g.acronimo, i.atto_id, i.sede_id, i.data, i.carica_id, ah.indice, ah.priorita from opp_intervento i, opp_atto a, opp_politico p, opp_carica c, opp_carica_has_gruppo cg, opp_gruppo g, sf_tagging_for_index t, opp_act_history_cache ah where p.id=c.politico_id and ah.chi_id=i.atto_id and i.atto_id=a.id and c.id=i.carica_id and cg.carica_id=c.id  and cg.data_fine is null and cg.gruppo_id=g.id %s  and ah.data='%s' and c.tipo_carica_id in (%s) and c.data_fine is null and a.is_omnibus = 1 and t.atto_id=a.id and t.tag_id in (%s) group by i.carica_id, i.atto_id;", $group_constraint, $data, implode(", ", $tipi_cariche), implode(", ", $argomenti_ids));
         $stm = $con->createStatement();
         $rs = $stm->executeQuery($sql, ResultSet::FETCHMODE_ASSOC);
         // costruzione array associativo dei politici (sommatoria pesata)
         while ($rs->next()) {
             $row = $rs->getRow();
             $n_interventi = $row['ni'];
             $carica_id = $row['carica_id'];
             $circoscrizione = $row['circoscrizione'];
             $atto_id = $row['atto_id'];
             $priorita = $row['priorita'];
             $punti_atto = $row['indice'];
             $politico_id = $row['politico_id'];
             $nome = $row['nome'];
             $cognome = $row['cognome'];
             $acronimo = $row['acronimo'];
             if (!array_key_exists($carica_id, $politici)) {
                 $politici[$carica_id] = array('politico_id' => $politico_id, 'circoscrizione' => $circoscrizione, 'nome' => $nome, 'cognome' => $cognome, 'acronimo' => $acronimo, 'punteggio' => 0);
             }
             $politici[$carica_id]['punteggio'] += OppCaricaHasAttoPeer::get_nuovo_fattore_firma('I') * $n_interventi * $punti_atto / (double) $priorita;
         }
     }
     // ordinamento per rilevanza, prima dello slice
     if (count($politici) > 1) {
         uasort($politici, array("OppCaricaPeer", "comparisonIndice"));
     }
     // slice dell'array, se specificata l'opzione limit
     if (!is_null($limit) && count($politici) > $limit) {
         $politici = array_slice($politici, 0, $limit, true);
     }
     return $politici;
 }
 /**
  * torna gli atti firmati dal politico, come array di id
  * qualsiasi firma
  *
  * @param string $criteria 
  * @param string $con 
  * @return void
  * @author Guglielmo Celata
  */
 public function getOppCaricaHasAttosPKs($criteria = null, $con = null)
 {
     $oppCaricaHasAttosPKs = array();
     if (!$this->isNew()) {
         if ($criteria === null) {
             $criteria = new Criteria();
         } elseif ($criteria instanceof Criteria) {
             $criteria = clone $criteria;
         }
         $criteria->add(OppCaricaHasAttoPeer::CARICA_ID, $this->getId());
         $criteria->clearSelectColumns();
         $criteria->addSelectColumn(OppCaricaHasAttoPeer::ATTO_ID);
         $rs = OppCaricaHasAttoPeer::doSelectRS($criteria, $con);
         while ($rs->next()) {
             $oppCaricaHasAttosPKs[] = $rs->getInt(1);
         }
     }
     return $oppCaricaHasAttosPKs;
 }
                    throw new Exception('$a è negativo');
                }
                break;
            } catch (Exception $e) {
                //echo 'Caught exception: ',  $e->getMessage(), "\n";
            }
        }
        $errore = $html->find('p.messaggioErrore');
        $numero = -1;
        foreach ($errore as $er) {
            $numero = 0;
        }
        if ($numero == -1) {
            $numero = $html->find('div.rigaTabRic div.sottoTit');
            $numero = $numero[0]->find('strong');
            $numero = $numero[2]->plaintext;
        }
        $c = new Criteria();
        $c->addJoin(OppCaricaHasAttoPeer::ATTO_ID, OppAttoPeer::ID);
        $c->add(OppAttoPeer::TIPO_ATTO_ID, 1);
        $c->add(OppCaricaHasAttoPeer::CARICA_ID, $result->getId());
        $c->add(OppCaricaHasAttoPeer::TIPO, 'R', Criteria::NOT_EQUAL);
        $count = OppCaricaHasAttoPeer::doCount($c);
        if ($numero < $count) {
            echo "!!!! ERRORE in " . $result->getId() . " nel DB n." . $count . " nel sito " . $numero . "\n";
        }
        if ($numero > $count) {
            echo "!!!! ERRORE MANCANO FIRME in " . $result->getId() . " nel DB n." . $count . " nel sito " . $numero . "\n";
        }
    }
}
 public function executeSenatorisioccupanodi()
 {
     $options = array('limit' => 10, 'sort_by_relevance' => true);
     //$options = array('sort_by_relevance' => true);
     // estrazione cariche, tipo firma, tipo atto
     $c = new Criteria();
     $c->addJoin(OppCaricaPeer::ID, OppCaricaHasAttoPeer::CARICA_ID);
     $c->addJoin(OppCaricaHasAttoPeer::ATTO_ID, OppAttoPeer::ID);
     $c->addJoin(TaggingPeer::TAGGABLE_ID, OppAttoPeer::ID);
     $c->add(OppCaricaPeer::TIPO_CARICA_ID, array(4, 5), Criteria::IN);
     $c->add(OppCaricaPeer::DATA_FINE, NULL);
     $c->add(TaggingPeer::TAG_ID, $this->tag->getId());
     $c->add(TaggingPeer::TAGGABLE_MODEL, 'OppAtto');
     $c->clearSelectColumns();
     $c->addSelectColumn(OppCaricaPeer::ID);
     $c->addSelectColumn(OppCaricaHasAttoPeer::TIPO);
     $c->addSelectColumn(OppAttoPeer::TIPO_ATTO_ID);
     // costruzione array associativo dei politici
     $politici = array();
     $rs = OppCaricaPeer::doSelectRS($c);
     while ($rs->next()) {
         $carica_id = $rs->getInt(1);
         $tipo = $rs->getString(2);
         $tipo_atto_id = $rs->getInt(3);
         if (!array_key_exists($carica_id, $politici)) {
             $politici[$carica_id] = 0;
         }
         $politici[$carica_id] += OppCaricaHasAttoPeer::get_nuovo_fattore_firma($tipo) * OppAttoPeer::get_fattore_tipo_atto($tipo_atto_id);
     }
     // ordinamento per rilevanza, prima dello slice
     arsort($politici);
     // slice dell'array, se specificata l'opzione limit
     $this->n_remaining_politici = 0;
     if (isset($options['limit']) && count($politici) > $options['limit']) {
         $this->n_remaining_politici = count($politici) - $options['limit'];
         $politici = array_slice($politici, 0, $options['limit'], true);
     }
     // ordinamento per triple_value, in caso sort_by_relevance non sia specificato
     if (!isset($options['sort_by_relevance']) || true !== $options['sort_by_relevance']) {
         krsort($politici);
     }
     $this->politici = $politici;
 }
 /**
  * calcola l'indice di rilevanza, per un atto, nel suo complesso
  *
  * @param integer $atto_id
  * @param integer $tipo_atto_id 
  * @param date $data 
  * @param SimpleXMLElement    $xml_node   
  * @param boolean   $verbose
  * @return float
  * @author Guglielmo Celata
  */
 public static function calcolaRilevanzaAtto($atto, $tipo_atto_id, $data, $xml_node, $verbose = false)
 {
     $atto_node = $xml_node->addChild('atto', null, self::$opp_ns);
     $atto_id = $atto->getId();
     // calcolo gruppi e schieramenti che presentano
     list($schier_pres, $grup_pres) = OppCaricaHasAttoPeer::getSchierGrupPresAtto($atto_id, $data);
     if ($verbose) {
         printf("\n    presentazione:\n");
         printf("      schieramenti: %s\n", join(',', $schier_pres));
         printf("      gruppi: %s\n", join(',', $grup_pres));
     }
     // il peso di un atto non dipende mai da chi lo ha presentato
     // il coefficiente che si considera è sempre quello di maggioranza
     $di_maggioranza = true;
     // determina la priorità dell'atto
     $priorita = is_null($atto->getPriorityValue()) ? 1 : $atto->getPriorityValue();
     $atto_is_ratifica = $atto->isRatifica();
     // determina il tipo di atto (per quello che concerne il calcolo dell'indice)
     $tipo_atto = OppTipoAttoPeer::getTipoPerIndice($tipo_atto_id);
     if (is_null($tipo_atto)) {
         return 0;
     }
     $atto_node->addAttribute('tipo_atto', $tipo_atto);
     $atto_node->addAttribute('priorita', $priorita);
     $atto_node->addAttribute('id', $atto_id);
     $punteggio = 0.0;
     // punteggio dato all'atto per-se, a seconda del tipo
     if ($tipo_atto == 'SDDL') {
         $punteggio = 1.0;
     } else {
         $punteggio = 0.5;
     }
     $presentazione_node = $atto_node->addChild('presentazione', null, self::$opp_ns);
     $presentazione_node->addAttribute('totale', $punteggio);
     // --- consenso ---
     $consenso_node = $atto_node->addChild('consenso', null, self::$opp_ns);
     $firmeRS = OppCaricaHasAttoPeer::getFirmeAttoDataTipoRS($atto_id, $data, "'C'");
     $n_firme = array('gruppo' => 0, 'altri' => 0, 'opp' => 0);
     while ($firmeRS->next()) {
         $row = $firmeRS->getRow();
         if ($verbose) {
             printf("    %d firme per gruppo %d\n", $row['nf'], $row['gruppo_id']);
         }
         // gestione del caso in cui l'atto è presentato dai due schieramenti
         // tutte le firme sono assegnate a gruppo, altri e opp
         if (count($schier_pres) > 1) {
             $n_firme['gruppo'] += $row['nf'];
             $n_firme['altri'] += $row['nf'];
             $n_firme['opp'] += $row['nf'];
             continue;
         }
         // gestione del caso in cui l'atto è presentato da più di un gruppo
         // le firme dello schieramento di pres. sono assegnate a gruppo e altri
         if (count($grup_pres) > 1) {
             if ($row['maggioranza'] == $schier_pres[0]) {
                 $n_firme['gruppo'] += $row['nf'];
                 $n_firme['altri'] += $row['nf'];
             } else {
                 $n_firme['opp'] += $row['nf'];
             }
             continue;
         }
         if (in_array($row['gruppo_id'], $grup_pres)) {
             if ($row['nf'] > 1) {
                 $n_firme['gruppo'] += $row['nf'];
             }
         } else {
             if (count($schier_pres) > 0 && $row['maggioranza'] == $schier_pres[0]) {
                 $n_firme['altri'] += $row['nf'];
             } else {
                 $n_firme['gruppo'] += $row['nf'];
             }
         }
     }
     $d_punteggio = 0.0;
     foreach ($n_firme as $tipo => $value) {
         if (!$value) {
             continue;
         }
         $soglia = self::$soglia_cofirme;
         if ($tipo_atto == 'mozione') {
             $soglia = self::$soglia_cofirme_mozioni;
         }
         if ($value <= $soglia) {
             $d_punteggio += $dd_punteggio = self::getPunteggio($tipo_atto, "cofirme_{$tipo}_lo", $di_maggioranza);
         } else {
             $d_punteggio += $dd_punteggio = self::getPunteggio($tipo_atto, "cofirme_{$tipo}_hi", $di_maggioranza);
         }
         $firme_node = $consenso_node->addChild('firme_' . $tipo, null, self::$opp_ns);
         $firme_node->addAttribute('n_firme', $value);
         $firme_node->addAttribute('totale', $dd_punteggio);
         if ($verbose) {
             printf("    firme %s (%d) %7.2f\n", $tipo, $value, $dd_punteggio);
         }
     }
     $punteggio += $d_punteggio;
     if ($verbose) {
         printf("  totale firme  %7.2f\n", $d_punteggio);
     }
     $consenso_node->addAttribute('n_firme', $n_firme['gruppo'] + $n_firme['altri'] + $n_firme['opp']);
     $consenso_node->addAttribute('totale', $d_punteggio);
     // --- iter ---
     // controlla se atti non assorbiti sono diventati legge dopo passaggi in altri rami
     // atti diventati legge non prendono il punteggio di approvazione
     $diventato_legge_in_altri_rami = false;
     if (!isset($passaggio) || $passaggio != 'assorbito') {
         $atto = OppAttoPeer::retrieveByPK($atto_id);
         $c = new Criteria();
         $c->add(OppAttoHasIterPeer::ITER_ID, 16);
         $c->add(OppAttoHasIterPeer::DATA, $data, Criteria::LESS_EQUAL);
         while ($atto_succ_id = $atto->getSucc()) {
             $atto = OppAttoPeer::retrieveByPK($atto_succ_id);
             if ($atto->countOppAttoHasIters($c) > 0) {
                 $diventato_legge_in_altri_rami = true;
             }
         }
         unset($c);
         unset($atto);
     }
     // determina se l'atto è parte di un Testo Unificato
     $is_unified = OppAttoPeer::isUnifiedText($atto_id);
     // determina se l'atto è stato assorbito
     $is_absorbed = OppAttoPeer::isAbsorbed($atto_id);
     // determina se l'atto unificato è principale o meno
     $is_unificato_non_main = is_array($is_unified) && !$is_unified['is_main_unified'];
     $is_unificato_main = is_array($is_unified) && $is_unified['is_main_unified'];
     $itinera_atto_rs = OppAttoHasIterPeer::getItineraAttoDataRS($atto_id, $data);
     $iter_node = $atto_node->addChild('iter', null, self::$opp_ns);
     $d_punteggio = 0.0;
     $n_passaggi = 0;
     while ($itinera_atto_rs->next()) {
         $iter_atto = $itinera_atto_rs->getRow();
         $passaggio = OppIterPeer::getIterPerIndice($iter_atto['iter_id']);
         if (is_null($passaggio)) {
             continue;
         }
         // se l'atto è unificato e non-main, allora prende il punteggio come gli atti assorbiti
         if ($is_unificato_non_main && $passaggio == 'approvato') {
             $passaggio = 'assorbito';
         }
         // se diventato legge in altri rami, non prende punteggio di approvazione
         if ($diventato_legge_in_altri_rami && $passaggio == 'approvato') {
             continue;
         }
         $n_passaggi++;
         $passaggio_node = $iter_node->addChild('passaggio', null, self::$opp_ns);
         if ($passaggio == 'assorbito' && $is_unificato_non_main) {
             $passaggio_node->addAttribute('tipo', 'assorbimento come unificato non principale');
         } else {
             $passaggio_node->addAttribute('tipo', $passaggio);
         }
         $d_punteggio += $dd_punteggio = self::getPunteggio($tipo_atto, $passaggio, $di_maggioranza);
         if ($verbose) {
             if ($passaggio == 'assorbito' && $is_unificato_non_main) {
                 printf("    iter %s %7.2f\n", 'assorbimento come unificato non principale', $dd_punteggio);
             } else {
                 printf("    iter %s %7.2f\n", $passaggio, $dd_punteggio);
             }
         }
         $passaggio_node->addAttribute('totale', $dd_punteggio);
         // il break su atti assorbiti avviene dopo l'assegnazione del punteggio
         if ($passaggio == 'assorbito') {
             break;
         }
         // --- bonus maggioranza ---
         if ($passaggio == 'approvato') {
             if ($di_maggioranza && OppAttoPeer::isAttoVotatoDaOpposizione($atto_id, $data)) {
                 $d_punteggio += $dd_punteggio = self::getPunteggio($tipo_atto, 'bonus_bi_partisan', true);
                 $bonus_node = $iter_node->addChild('bonus_maggioranza', null, self::$opp_ns);
                 $bonus_node->addAttribute('totale', $dd_punteggio);
                 if ($verbose) {
                     printf("    bonus di maggioranza! %7.2f\n", $dd_punteggio);
                 }
             }
         }
         // break se mozione, risoluzione o odg approvato
         if (in_array($tipo_atto, array('mozione', 'risoluzione', 'odg')) && $passaggio == 'approvato') {
             break;
         }
     }
     // assegna punteggio se diventato legge in altri rami
     if ($diventato_legge_in_altri_rami && is_null($is_absorbed) && (is_null($is_unified) || $is_unificato_main)) {
         $d_punteggio += $dd_punteggio = self::getPunteggio($tipo_atto, 'diventato_legge', $di_maggioranza);
         $passaggio_node = $iter_node->addChild('passaggio', null, self::$opp_ns);
         $passaggio_node->addAttribute('tipo', "diventato legge in altri rami");
         $passaggio_node->addAttribute('totale', $dd_punteggio);
         if ($verbose) {
             printf("    iter %s %7.2f\n", "diventato legge in altri rami", $dd_punteggio);
         }
     }
     $punteggio += $d_punteggio;
     if ($verbose) {
         printf("  totale iter   %7.2f\n", $d_punteggio);
     }
     $iter_node->addAttribute('n_passaggi', $n_passaggi);
     $iter_node->addAttribute('totale', $d_punteggio);
     // --- componente emendamenti con funzione sigmoide ---
     $punteggio += $d_punteggio = self::calcolaComponenteEmendamentiPerAtto($atto_id, $data, $atto_node, $verbose);
     // --- sedute con interventi in commissione e assemblea ---
     $sedute_con_interventi_node = $atto_node->addChild('sedute_con_interventi', null, self::$opp_ns);
     $sedute_commissioni_node = $sedute_con_interventi_node->addChild('commissioni', null, self::$opp_ns);
     $n_sedute_commissioni = OppInterventoPeer::getNSeduteConInterventiAttoData($atto_id, 'C', $data);
     if ($n_sedute_commissioni) {
         $n_sedute_commissioni--;
     }
     if ($verbose) {
         printf("    n. sedute in commissione   %d\n", $n_sedute_commissioni);
     }
     $d_punteggio_sedute_commissioni = $n_sedute_commissioni * parent::$punteggi['seduta_in_comm'];
     $sedute_commissioni_node->addAttribute('n_sedute', $n_sedute_commissioni);
     $sedute_commissioni_node->addAttribute('totale', $d_punteggio_sedute_commissioni);
     $sedute_assemblea_node = $sedute_con_interventi_node->addChild('assemblea', null, self::$opp_ns);
     $n_sedute_assemblea = OppInterventoPeer::getNSeduteConInterventiAttoData($atto_id, 'A', $data);
     if ($n_sedute_assemblea) {
         $n_sedute_assemblea--;
     }
     if ($verbose) {
         printf("    n. sedute in commissione   %d\n", $n_sedute_assemblea);
     }
     $d_punteggio_sedute_assemblea = $n_sedute_assemblea * parent::$punteggi['seduta_in_ass'];
     $sedute_assemblea_node->addAttribute('n_sedute', $n_sedute_assemblea);
     $sedute_assemblea_node->addAttribute('totale', $d_punteggio_sedute_assemblea);
     $punteggio += $d_punteggio_sedute = $d_punteggio_sedute_commissioni + $d_punteggio_sedute_assemblea;
     if ($verbose) {
         printf("  totale sedute   %7.2f\n", $d_punteggio_sedute);
     }
     $sedute_con_interventi_node->addAttribute('totale', $d_punteggio_sedute);
     if ($atto_is_ratifica) {
         $atto_node->addAttribute('totale_pre_decurtazione_ratifica', $punteggio);
         if ($verbose) {
             print "questo ATTO è una ratifica\n";
         }
         $punteggio = $punteggio / self::$punteggi['fattore_diminuzione_ratifica'];
     }
     $punteggio = $priorita * $punteggio;
     $atto_node->addAttribute('totale', $punteggio);
     return $punteggio;
 }
 public function executeUserVsSinglePolitician()
 {
     $user_id = $this->user->getId();
     $pol_id = $this->politico->getId();
     $leg = $this->legislatura;
     $arr = array();
     $come = array();
     $contro = array();
     $indice = 0;
     $c = new Criteria();
     $c->add(OppCaricaPeer::POLITICO_ID, $pol_id);
     $c->add(OppCaricaPeer::LEGISLATURA, $leg);
     $cariche = OppCaricaPeer::doSelect($c);
     foreach ($cariche as $carica) {
         $arr[] = $carica->getId();
     }
     $c = new Criteria();
     $c->add(sfVotingPeer::USER_ID, $user_id);
     $voting_objects = sfVotingPeer::doSelect($c);
     foreach ($voting_objects as $voting_object) {
         $c = new Criteria();
         $c->addJoin(OppAttoPeer::ID, OppCaricaHasAttoPeer::ATTO_ID);
         $c->add(OppCaricaHasAttoPeer::CARICA_ID, $arr, Criteria::IN);
         $c->add(OppAttoPeer::ID, $voting_object->getVotableID());
         $c->add(OppAttoPeer::LEGISLATURA, $leg);
         $c->add(OppCaricaHasAttoPeer::TIPO, 'R', Criteria::NOT_EQUAL);
         $firme = OppCaricaHasAttoPeer::doSelect($c);
         foreach ($firme as $firma) {
             $value = $this->calcolaIndice($firma->getOppAtto()->getTipoAttoId(), $firma->getTipo());
             $indice = $indice + $value * $voting_object->getVoting();
             if ($voting_object->getVoting() == 1) {
                 if (!in_array($firma->getAttoId(), $come)) {
                     $come[] = $firma->getAttoId();
                 }
             } else {
                 if (!in_array($firma->getAttoId(), $contro)) {
                     $contro[] = $firma->getAttoId();
                 }
             }
         }
     }
     $this->comes = $come;
     $this->contros = $contro;
     $this->indice = $indice;
 }
 public static function getRecordsetFirmatari($id, $tipo)
 {
     $c = new Criteria();
     $c->clearSelectColumns();
     $c->addSelectColumn(OppPoliticoPeer::ID);
     $c->addSelectColumn(OppPoliticoPeer::NOME);
     $c->addSelectColumn(OppPoliticoPeer::COGNOME);
     $c->addSelectColumn(OppGruppoPeer::NOME);
     $c->addSelectColumn(OppCaricaHasAttoPeer::DATA);
     $c->addSelectColumn(OppGruppoPeer::ACRONIMO);
     $c->addSelectColumn(OppCaricaPeer::TIPO_CARICA_ID);
     $c->addSelectColumn(OppCaricaPeer::ID);
     $c->add(OppCaricaHasAttoPeer::ATTO_ID, $id, Criteria::EQUAL);
     $c->addJoin(OppCaricaHasAttoPeer::CARICA_ID, OppCaricaPeer::ID, Criteria::LEFT_JOIN);
     $c->addJoin(OppCaricaPeer::POLITICO_ID, OppPoliticoPeer::ID, Criteria::LEFT_JOIN);
     $c->addJoin(OppCaricaPeer::ID, OppCaricaHasGruppoPeer::CARICA_ID, Criteria::LEFT_JOIN);
     $c->addJoin(OppCaricaHasGruppoPeer::GRUPPO_ID, OppGruppoPeer::ID, Criteria::LEFT_JOIN);
     $c->add(OppCaricaHasGruppoPeer::DATA_FINE, NULL, Criteria::ISNULL);
     $c->add(OppCaricaHasAttoPeer::TIPO, $tipo, Criteria::EQUAL);
     $c->addAscendingOrderByColumn(OppPoliticoPeer::COGNOME);
     $c->addAscendingOrderByColumn(OppCaricaHasGruppoPeer::DATA_FINE);
     $rs = OppCaricaHasAttoPeer::doSelectRS($c);
     return $rs;
 }
echo $ncariche . "\n";
// costruisce array dei politici, con le firme
$politici = array();
foreach ($cariche as $i => $carica) {
    $politico = $carica->getOppPolitico();
    $politici[$i]['id'] = $carica->getId();
    $politici[$i]['cognome'] = $politico->getCognome();
    $politici[$i]['nome'] = $politico->getNome();
    echo $i . "(" . $politici[$i]['id'] . "): " . $politici[$i]['nome'] . " " . $politici[$i]['cognome'] . ": ";
    // legge le firme dal DB e li mette nell'array firme
    $c = new Criteria();
    $c->clearSelectColumns();
    $c->addSelectColumn(OppCaricaHasAttoPeer::ATTO_ID);
    $c->addSelectColumn(OppCaricaHasAttoPeer::TIPO);
    $c->add(OppCaricaHasAttoPeer::CARICA_ID, $carica->getId());
    $res = OppCaricaHasAttoPeer::doSelectRS($c);
    $firme = array();
    while ($res->next()) {
        $firme[$res->getInt(1)] = $res->getString(2);
    }
    $politici[$i]['firme'] = $firme;
    unset($res);
    $nfirme = count($firme);
    echo " ({$nfirme} firme)\n";
}
// update dei valori delle firme
for ($i = 0; $i < $ncariche; $i++) {
    $dd = OppSimilaritaPeer::retrieveByPK($politici[$i]['id'], $politici[$i]['id']);
    if (is_null($dd)) {
        $dd = new OppSimilarita();
        $dd->setCaricaFromId($politici[$i]['id']);
        $atto = $intervento['atto'];
        ?>
      <li>
        <?php 
        echo $intervento['n_interventi'];
        ?>
 Interventi:
        Atto:  <?php 
        echo link_to($atto->getShortTitle(), '@singolo_atto?id=' . $atto->getId());
        ?>
        punti: <?php 
        echo $intervento['n_interventi'];
        ?>
 x <?php 
        echo $intervento['punti_atto'];
        ?>
 x 
               <?php 
        echo OppCaricaHasAttoPeer::get_nuovo_fattore_firma('I');
        ?>
 = 
               <?php 
        echo $intervento['punti_atto'] * $intervento['n_interventi'] * OppCaricaHasAttoPeer::get_nuovo_fattore_firma('I');
        ?>
      </li>    
    <?php 
    }
    ?>
  </ul>  
<?php 
}