public function getDatiStorici()
 {
     $rs = OppPoliticianHistoryCachePeer::getKWDatiPoliticoRSById($this->getId());
     $dati = array();
     while ($rs->next()) {
         $row = $rs->getRow();
         $tipi_dati = array('presenze', 'assenze', 'missioni', 'indice', 'ribellioni');
         foreach ($tipi_dati as $tipo) {
             $dato[$tipo] = $row[$tipo];
             $dato[$tipo . '_delta'] = $row[$tipo . '_delta'];
         }
         $dati[$row['data']] = $dato;
     }
     return $dati;
 }
 /**
  * legge l'indice di attività dalla cache
  *
  * @param string $data 
  * @return void
  * @author Guglielmo Celata
  */
 public function getIndiceAttivita($data = null)
 {
     if (is_null($data)) {
         throw new Exception("Missing date parameter");
     }
     $c = new Criteria();
     $c->add(OppPoliticianHistoryCachePeer::CHI_TIPO, 'P');
     $c->add(OppPoliticianHistoryCachePeer::CHI_ID, $this->getId());
     $c->add(OppPoliticianHistoryCachePeer::DATA, $data);
     $c->clearSelectColumns();
     $c->addSelectColumn(OppPoliticianHistoryCachePeer::INDICE);
     $rs = OppPoliticianHistoryCachePeer::doSelectRS($c);
     if ($rs->next()) {
         return $rs->getFloat(1);
     } else {
         return null;
     }
 }
 /**
  * API (protetta da una API key)
  * torna flusso xml di tutti i parlamentari (divisi per ramo)
  * per ciascun parlamentare, visualizza i dati anagrafici e di carica
  * nonché informazioni variabili, a seconda del parametro info_type
  *  - presenze: presenze, assenza, missione
  *  - attivita: indice di attività parlamentare (nuovo)
  *  - ribelli:  numero di voti ribelli
  * progetto op_kw
  *
  *  <opkw xmlns="http://www.openpolis.it/2010/opkw"
  *         xmlns:op="http://www.openpolis.it/2010/op"
  *         xmlns:op_location="http://www.openpolis.it/2010/op_location"
  *         xmlns:op_politician="http://www.openpolis.it/2010/op_politician"
  *         xmlns:xlink="http://www.w3.org/1999/xlink">
  *    <op:content> 
  *      <camera n_rappresentanti="600">
  *        <parlamentare xlink:href="/parlamentari/12345.xml">
  *          <thumbnail xlink:href="/parlamentari/thumb/332104.jpeg" width="40" height="53"/>
  *          <nome>NOME</nome>
  *          <cognome>COGNOME</cognome>
  *          <gruppo>
  *            <nome>NOME GRUPPO</nome>
  *            <acronimo>NOME GRUPPO</acronimo>
  *          </gruppo>
  *          <data_inizio_carica>2008-04-12</data_inizio_carica> ** solo se successiva a data inizio leg.
  *          <circoscrizione>Lombardia 1</circoscrizione>
  *
  *          ...* informazioni *...
  *
  *        </parlamentare>
  *        ...
  *      </camera>
  *      <senato>
  *        <parlamentare> ... </parlamentare>
  *      </camera>
  *    </op:content>
  *  </opkw>
  *
  * Informazioni possono essere:
  *          <presenze>
  *            <numero>3898</numero>
  *            <percentuale>84,59</percentuale>
  *          </presenze>
  *          <assenze>
  *            <numero>710</numero>
  *            <percentuale>15,41</percentuale>
  *          </assenze>
  *          <missioni>
  *            <numero>0</numero>
  *            <percentuale>0,00</percentuale>
  *          </missioni>
  *          <mese_precedente>+1</mese_precedente>
  *
  *          <indice>
  *            <numero>389,8</numero>
  *          </indice>
  *          <mese_precedente>+-1</mese_precedente>
  *
  *          <voti_ribelli>
  *            <numero>15</numero>
  *          </indice>
  *          <mese_precedente>-1</mese_precedente>
  *       
  * Return error in case something's wrong
  * <opkw xlmns="http://www.openpolis.it/2010/opkw"
  *       xmlns:op="http://www.openpolis.it/2010/op"
  *       xlmns:op_location="http://www.openpolis.it/2010/op_location"
  *       xmlns:op_politician="http://www.openpolis.it/2010/op_politician">
  *   <op:error>Messaggio di errore</op:error>
  * </opkw>
  * @return String
  * @author Guglielmo Celata
  **/
 public function executeElencoParlamentari()
 {
     $key = $this->getRequestParameter('key');
     $ramo = $this->getRequestParameter('ramo');
     $infotype = $this->getRequestParameter('infotype');
     $order_by = $this->getRequestParameter('orderby');
     $order_type = $this->getRequestParameter('ordertype');
     $con = Propel::getConnection('propel');
     $current_data = OppPoliticianHistoryCachePeer::fetchLastData('P', null, $con);
     $is_valid_key = deppApiKeysPeer::isValidKey($key);
     $resp_node = new SimpleXMLElement('<opkw xmlns="' . $this->opkw_ns . '" ' . ' xmlns:op="' . $this->op_ns . '" ' . ' xmlns:xlink="' . $this->xlink_ns . '" >' . '</opkw>');
     if ($is_valid_key) {
         // start producing xml
         $content_node = $resp_node->addChild('op:content', null, $this->op_ns);
         // camera o senato
         if ($ramo == 'tutti') {
             $rami = array('camera' => 'C', 'senato' => 'S');
         } else {
             $rami = array($ramo => strtoupper(substr($ramo, 0, 1)));
         }
         foreach ($rami as $ramo_name => $ramo_code) {
             $ramo_node = $content_node->addChild($ramo_name, null, $this->opkw_ns);
             // dato storico aggregato per tutto il ramo
             $ramo_storico_node = $ramo_node->addChild('ramo', null, $this->opkw_ns);
             $rs = OppPoliticianHistoryCachePeer::getKWRamoRS($ramo_code, $con);
             $cnt = 0;
             while ($rs->next()) {
                 $cnt++;
                 $r = $rs->getRow();
                 $this->addRamoNode($ramo_storico_node, $r, $infotype);
             }
             // gruppi
             $gruppi_node = $ramo_node->addChild('gruppi', null, $this->opkw_ns);
             $n_gruppi = OppPoliticianHistoryCachePeer::countByDataRamoChiTipo($current_data, $ramo_code, 'G', $con);
             $rs = OppPoliticianHistoryCachePeer::getKWGruppoRSByDataRamo($current_data, $ramo_code, null, null, $con);
             $cnt = 0;
             while ($rs->next()) {
                 $cnt++;
                 $g = $rs->getRow();
                 $this->addGruppoNode($gruppi_node, $g, $infotype, $cnt);
             }
             $gruppi_node->addAttribute('n_gruppi', $n_gruppi);
             // parlamentari
             $parlamentari_node = $ramo_node->addChild('parlamentari', null, $this->opkw_ns);
             $n_parlamentari = OppPoliticianHistoryCachePeer::countByDataRamoChiTipo($current_data, $ramo_code, 'P', $con);
             $rs = OppPoliticianHistoryCachePeer::getKWPoliticiRSByDataRamo($current_data, $ramo_code, $order_by, $order_type, $con);
             $cnt = 0;
             while ($rs->next()) {
                 $cnt++;
                 $p = $rs->getRow();
                 $this->addParlamentareNode($parlamentari_node, $p, $infotype, $cnt);
             }
             $parlamentari_node->addAttribute('n_rappresentanti', $n_parlamentari);
         }
     } else {
         $resp_node->addChild('op:error', 'Chiave di accesso non valida', $this->op_ns);
     }
     $xmlContent = $resp_node->asXML();
     $this->_send_output($xmlContent);
     return sfView::NONE;
 }
/**
 * calcola o ri-calcola le posizioni per indici e presenze
 * nelle tabelle cache, a una determinata data (o a tutte)
 *
 * @param string $task 
 * @param string $args 
 * @param string $options 
 * @return void
 * @author Guglielmo Celata
 */
function run_opp_rebuild_positions($task, $args, $options)
{
    static $loaded;
    // load application context
    if (!$loaded) {
        task_loader();
        $loaded = true;
    }
    $data = '';
    $dry_run = false;
    if (array_key_exists('data', $options)) {
        $data = $options['data'];
    }
    if (array_key_exists('dry-run', $options)) {
        $dry_run = true;
    }
    $msg = sprintf("start time: %s\n", date('H:i:s'));
    echo $msg;
    if ($data != '') {
        $p_dates = array($data => $data);
    }
    $p_dates = OppPoliticianHistoryCachePeer::extractDates('N', null, 10000);
    while ($rs->next()) {
        $cnt++;
        $r = $rs->getRow();
        printf("%6d) %1s %7d ... ", $cnt, $r['chi_tipo'], $r['chi_id']);
        // calcolo date fine mese scorso e precedente
        list($data_1, $data_2) = Util::getLast2MonthsDate($data);
        // estrazione record storici a due mesi
        $r_1 = OppPoliticianHistoryCachePeer::retrieveByDataChiTipoChiIdRamo($data_1, $r['chi_tipo'], $r['chi_id'], $r['ramo']);
        $r_2 = OppPoliticianHistoryCachePeer::retrieveByDataChiTipoChiIdRamo($data_2, $r['chi_tipo'], $r['chi_id'], $r['ramo']);
        // salta record per cui non c'è abbastanza storia
        if (!$r_1 instanceof OppPoliticianHistoryCache || !$r_2 instanceof OppPoliticianHistoryCache) {
            printf(" NA \n");
            continue;
        }
        list($presenze_delta, $assenze_delta, $missioni_delta) = presenzeDelta($data_lookup, $r, $r_1, $r_2);
        printf("d_presenze: %7.2f,  d_assenze: %7.2f,  d_missioni: %7.2f,  ", $presenze_delta, $assenze_delta, $missioni_delta);
        $indice_delta = indiceDelta($data_lookup, $r, $r_1, $r_2, $data_1, $data_2);
        printf("d_indice: %7.2f,  ", $indice_delta);
        $ribellioni_delta = ribellioniDelta($data_lookup, $r, $r_1, $r_2, $data_1, $data_2);
        printf("d_ribellioni: %7.2f", $ribellioni_delta);
        if (!$dry_run) {
            $r = OppPoliticianHistoryCachePeer::retrieveByDataChiTipoChiIdRamo($data_lookup, $r['chi_tipo'], $r['chi_id'], $r['ramo']);
            $r->setPresenzeDelta($presenze_delta);
            $r->setAssenzeDelta($assenze_delta);
            $r->setMissioniDelta($missioni_delta);
            $r->setIndiceDelta($indice_delta);
            $r->setRibellioniDelta($ribellioni_delta);
            $r->save();
            printf(" OK!\n");
        } else {
            printf("\n");
        }
    }
    echo "data: {$data_lookup}\n";
    $msg = sprintf("end time: %s\n", date('H:i:s'));
    echo $msg;
}
 protected function addListSortCriteria($c)
 {
     if ($sort_column = $this->session->getAttribute('sort', null, 'sf_admin/opp_storici/sort')) {
         $sort_column = OppPoliticianHistoryCachePeer::translateFieldName($sort_column, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME);
         if ($this->session->getAttribute('type', null, 'sf_admin/opp_storici/sort') == 'asc') {
             $c->addAscendingOrderByColumn($sort_column);
         } else {
             $c->addDescendingOrderByColumn($sort_column);
         }
     }
 }
 public function executeGetIndexChartsTopPoliticians()
 {
     # check query string parameters and validate to avoid SQL injection
     $this->forward404Unless($this->hasRequestParameter('ramo'));
     $ramo = $this->getRequestParameter('ramo', '');
     $this->forward404Unless(in_array($ramo, array('C', 'S')));
     //$this->forward404Unless($this->hasRequestParameter('data'));
     $data = $this->getRequestParameter('data', '');
     if ($data != '') {
         $this->forward404Unless(strtotime($data));
     }
     $this->forward404Unless($this->hasRequestParameter('limit'));
     $limit = (int) $this->getRequestParameter('limit', '');
     $this->forward404Unless(is_integer($limit));
     $group_acr = $this->getRequestParameter('group', '');
     $group_id = null;
     if ($group_acr != '') {
         $c = new Criteria();
         $c->add(OppGruppoPeer::ACRONIMO, $group_acr);
         $group = OppGruppoPeer::doSelectOne($c);
         $this->forward404If(is_null($group));
         $group_id = $group->getId();
     }
     foreach ($this->regioni as $reg) {
         sfContext::getInstance()->getLogger()->info($reg);
     }
     $constituency = $this->getRequestParameter('circoscrizione', '');
     if ($constituency != '') {
         $constituency_is_valid = in_array(strtolower($constituency), $this->regioni);
         $this->forward404Unless($constituency_is_valid);
     }
     if ($data != '') {
         $items = OppPoliticianHistoryCachePeer::getIndexChartsTopPoliticians($ramo, $data, $limit, $group_id, $constituency);
     } else {
         $items = OppCaricaPeer::getIndexChartsTopPoliticiansRealTime($ramo, $data, $limit, $group_id, $constituency);
     }
     $this->_send_json_output(json_encode($items));
     return sfView::NONE;
 }
/**
 * Calcola o ri-calcola l'indice di attività.
 * Si può specificare il ramo (camera, senato, governo, tutti) e la data
 * Se sono passati degli ID (argomenti), sono interpretati come ID di politici e il calcolo è fatto solo per loro
 */
function run_opp_calcola_nuovo_indice($task, $args, $options)
{
    static $loaded;
    // load application context
    if (!$loaded) {
        define('SF_ROOT_DIR', sfConfig::get('sf_root_dir'));
        define('SF_APP', 'fe');
        define('SF_ENVIRONMENT', 'task');
        define('SF_DEBUG', false);
        require_once SF_ROOT_DIR . DIRECTORY_SEPARATOR . 'apps' . DIRECTORY_SEPARATOR . SF_APP . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'config.php';
        sfContext::getInstance();
        sfConfig::set('pake', true);
        error_reporting(E_ALL);
        $loaded = true;
    }
    echo "memory usage: " . memory_get_usage() . "\n";
    $start_time = time();
    $data = '';
    $ramo = '';
    $verbose = false;
    $offset = null;
    $limit = null;
    if (array_key_exists('data', $options)) {
        $data = $options['data'];
    }
    if (array_key_exists('ramo', $options)) {
        $ramo = strtolower($options['ramo']);
    }
    if (array_key_exists('verbose', $options)) {
        $verbose = true;
    }
    if (array_key_exists('offset', $options)) {
        $offset = $options['offset'];
    }
    if (array_key_exists('limit', $options)) {
        $limit = $options['limit'];
    }
    $atti_ids = array();
    if (array_key_exists('atti', $options)) {
        $atti_ids = explode(",", $options['atti']);
    }
    $emendamenti_ids = array();
    if (array_key_exists('emendamenti', $options)) {
        $emendamenti_ids = explode(",", $options['emendamenti']);
    }
    // definisce la data fino alla quale vanno fatti i calcoli
    // data_lookup serve per controllare se i record già esistono
    if ($data != '') {
        $legislatura_corrente = OppLegislaturaPeer::getCurrent($data);
        $data_lookup = $data;
    } else {
        $legislatura_corrente = OppLegislaturaPeer::getCurrent();
        $data = date('Y-m-d');
        $data_lookup = OppPoliticianHistoryCachePeer::fetchLastData('N');
    }
    $msg = sprintf("calcolo indice di attività - data:   %10s, ramo: %10s\n", $data ? $data : '-', $ramo);
    echo pakeColor::colorize($msg, array('fg' => 'cyan', 'bold' => true));
    if (count($args) > 0) {
        try {
            $parlamentari_rs = OppCaricaPeer::getRSFromIDArray($args);
        } catch (Exception $e) {
            throw new Exception("Specificare degli ID validi. \n" . $e);
        }
    } else {
        $parlamentari_rs = OppCaricaPeer::getParlamentariRamoDataRS($ramo, $legislatura_corrente, $data, $offset, $limit);
    }
    echo "memory usage: " . memory_get_usage() . "\n";
    $cnt = 0;
    while ($parlamentari_rs->next()) {
        $cnt++;
        $p = $parlamentari_rs->getRow();
        $nome = $p['nome'];
        $cognome = $p['cognome'];
        $tipo_carica_id = $p['tipo_carica_id'];
        $id = $p['id'];
        switch ($tipo_carica_id) {
            case 1:
                $ramo = 'C';
                $prefisso = 'On.';
                break;
            case 4:
            case 5:
                $ramo = 'S';
                $prefisso = 'Sen.';
                break;
            case 2:
            case 3:
            case 6:
            case 7:
                $ramo = 'G';
                $prefisso = '';
                break;
            default:
                break;
        }
        $politico_stringa = sprintf("%s %s %s", $prefisso, $nome, strtoupper($cognome));
        printf("%4d) %40s [%06d] ... ", $cnt, $politico_stringa, $id);
        $indice = OppIndiceAttivitaPeer::calcola_indice_politico($id, $legislatura_corrente, $data, $verbose, $atti_ids, $emendamenti_ids);
        // inserimento o aggiornamento del valore in opp_politician_history_cache
        // uso N come ChiTipo, perché P è preso per il vecchio indice.
        // una volta fatta la sostituzione, la scrittura qui è ridondante
        $cache_record = OppPoliticianHistoryCachePeer::retrieveByDataChiTipoChiIdRamo($data_lookup, 'N', $id, $ramo);
        if ($cache_record === null) {
            $cache_record = new OppPoliticianHistoryCache();
        }
        $cache_record->setLegislatura($legislatura_corrente);
        $cache_record->setChiTipo('N');
        $cache_record->setChiId($id);
        $cache_record->setRamo($ramo);
        $cache_record->setIndice($indice);
        $cache_record->setData($data);
        $cache_record->setNumero(1);
        $cache_record->setUpdatedAt(date('Y-m-d H:i'));
        // forza riscrittura updated_at, per tenere traccia esecuzioni
        $cache_record->save();
        unset($cache_record);
        $msg = sprintf("%7.2f", $indice);
        echo pakeColor::colorize($msg, array('fg' => 'cyan', 'bold' => true));
        $msg = sprintf(" [%4d sec] [%10d bytes]\n", time() - $start_time, memory_get_usage());
        echo pakeColor::colorize($msg, array('fg' => 'red', 'bold' => false));
    }
    $msg = sprintf("%d parlamentari elaborati\n", $cnt);
    echo pakeColor::colorize($msg, array('fg' => 'cyan', 'bold' => true));
}
 public function executeListNuovoIndice()
 {
     $this->ramo = $this->getRequestParameter('ramo');
     $this->parlamentari_rs = OppPoliticianHistoryCachePeer::getClassificaParlamentariNuovoRS($this->ramo);
 }