/**
  * Executes actionSignings action
  *
  * @param sfRequest $request A request object
  */
 public function executeActionSignings(sfWebRequest $request)
 {
     $this->setLayout(false);
     $response = $this->getResponse();
     // does the client want JSONP?
     $callback = trim(preg_replace('/[^a-z_.]/i', '', $request->getParameter('callback', null)));
     // determine the requested action (petition)
     $action_id = $request->getParameter('action_id');
     if (!is_numeric($action_id) || $action_id < 0) {
         $response->setStatusCode(400);
         return $this->renderJson(array('status' => 'error', 'message' => 'bad action ID given'), $callback);
     }
     $petition = PetitionTable::getInstance()->findByIdCachedActive($action_id);
     if (!$petition) {
         $response->setStatusCode(404);
         return $this->renderJson(array('status' => 'error', 'message' => 'action could not be found'), $callback);
     }
     $signings_table = PetitionSigningTable::getInstance();
     $token_table = PetitionApiTokenTable::getInstance();
     $timeToLive = 60;
     $refresh = false;
     $token_code = $request->getPostParameter('token');
     if ($token_code) {
         $token = $token_table->fetchByPetitionAndToken($petition, $token_code, PetitionApiTokenTable::STATUS_ACTIVE);
         if (!$token) {
             return $this->renderJson(array('status' => 'error', 'message' => 'token wrong'), $callback);
         }
         $foreign_singings = $request->getPostParameter('signings', null);
         if ($foreign_singings) {
             if (is_array($foreign_singings)) {
                 $offsets = ApiTokenOffsetTable::getInstance()->fetchOffsetsByToken($token);
                 $change = false;
                 foreach ($foreign_singings as $country_code => $country_addnum) {
                     if (preg_match('/^[a-z]{2}$/i', $country_code) && preg_match('/^-?[0-9]+$/i', $country_addnum)) {
                         $country_code = strtoupper($country_code);
                         if ($offsets->contains($country_code)) {
                             $offset = $offsets->get($country_code);
                             /* @var $offset ApiTokenOffset */
                             if ($offset->getAddnum() != $country_addnum) {
                                 $offset->setAddnum($country_addnum);
                                 $change = true;
                             }
                         } else {
                             $offset = new ApiTokenOffset();
                             $offset->setApiToken($token);
                             $offset->setCountry($country_code);
                             $offset->setAddnum($country_addnum);
                             $change = true;
                             $offset->save();
                         }
                     }
                 }
                 if ($change) {
                     $offsets->save();
                     $refresh = true;
                 }
             } else {
                 return $this->renderJson(array('status' => 'error', 'message' => 'wrong format'), $callback);
             }
         }
     }
     // widget filter: collect desired widget ids (comma separated list)
     $widget_ids = $request->getParameter('widgets', '');
     if ($widget_ids) {
         if ($widget_ids === true || $widget_ids === 'true' || $widget_ids === 'TRUE') {
             $widget_ids = true;
         } else {
             $widget_ids = array_filter(array_unique(array_map('intval', explode(',', $widget_ids))));
         }
     } else {
         $widget_ids = null;
     }
     // prepare date range filter
     $min_date = $request->getParameter('from_via_policat', null);
     $max_date = $request->getParameter('to_via_policat', null);
     $with_date = $min_date !== null || $max_date !== null;
     if ($min_date !== null && $max_date !== null && $min_date > $max_date) {
         $t = $min_date;
         $min_date = $max_date;
         $max_date = $t;
     }
     $min_date = (int) $min_date;
     $max_date = (int) $max_date;
     $segregate = $request->getParameter('segregate');
     $by_countries = $segregate === 'countries';
     $data = array('action_id' => (int) $action_id);
     //    // as per customer requests, we only add the addnum stuff when we are NOT filtering by widget(s)
     //    if (empty($widgets) && !$countryFilter && !$min_date && !$max_date) {
     //      $data['signings'] += $add_num;
     //    }
     if ($widget_ids) {
         foreach (WidgetTable::getInstance()->fetchIdsByPetition($petition) as $widget_id) {
             if ($widget_ids === true || is_array($widget_ids) && in_array($widget_id, $widget_ids)) {
                 if (!array_key_exists('widgets', $data)) {
                     $data['widgets'] = array();
                     $data['widget_first_signing'] = array();
                     $data['widget_last_signing'] = array();
                 }
                 if ($by_countries) {
                     $widget_data = $signings_table->countByWidgetCountries($widget_id, $min_date, $max_date, $timeToLive, $refresh);
                 } else {
                     $widget_data = $signings_table->countByWidget($widget_id, $min_date, $max_date, $timeToLive, $refresh);
                 }
                 $data['widgets'][(int) $widget_id] = $widget_data;
                 if ($widget_data) {
                     $widget_min_max = $signings_table->fetchSigningDateRange(array_keys($data['widgets']), $min_date, $max_date, $timeToLive, $refresh);
                     if ($widget_min_max) {
                         $data['widget_first_signing'][(int) $widget_id] = strtotime($widget_min_max['min_created']);
                         $data['widget_last_signing'][(int) $widget_id] = strtotime($widget_min_max['max_created']);
                     }
                 }
                 $data['widgets_first_signing'] = min($data['widget_first_signing']);
                 $data['widgets_last_signing'] = max($data['widget_last_signing']);
             }
         }
     }
     if ($by_countries) {
         $data['signings_via_policat'] = $signings_table->countByPetitionCountries($action_id, $min_date, $max_date, $timeToLive, $refresh);
     } else {
         $data['signings_via_policat'] = $signings_table->countByPetition($action_id, $min_date, $max_date, $timeToLive, $refresh);
     }
     if ($data['signings_via_policat']) {
         $action_min_max = $signings_table->fetchSigningDateRangeByPetition($action_id, $min_date, $max_date, $timeToLive, $refresh);
         if ($action_min_max) {
             $data['policat_first_signing'] = strtotime($action_min_max['min_created']);
             $data['policat_last_signing'] = strtotime($action_min_max['max_created']);
         }
     }
     if ($by_countries) {
         $data['signings_via_api'] = $token_table->sumOffsetsCountry($action_id, $timeToLive, $refresh);
     } else {
         $data['signings_via_api'] = $token_table->sumOffsets($action_id, $timeToLive, $refresh);
     }
     $data['manual_counter_tweak'] = (int) $petition->getAddNum();
     if (!$with_date) {
         if ($by_countries) {
             $total = array();
             foreach ($data['signings_via_policat'] as $country => $num) {
                 $total[$country] = $num;
             }
             if (array_key_exists('unknown', $total)) {
                 $total['unknown'] = 0;
             }
             $total['unknown'] += $data['manual_counter_tweak'];
             foreach ($data['signings_via_api'] as $country => $num) {
                 if (array_key_exists($country, $total)) {
                     $total[$country] += $num;
                 } else {
                     $total[$country] = $num;
                 }
             }
         } else {
             $total = $data['signings_via_api'] + $data['signings_via_policat'] + $data['manual_counter_tweak'];
         }
         $data['signings_total'] = $total;
     }
     $response->addCacheControlHttpHeader('public');
     $response->addCacheControlHttpHeader('max-age', 60);
     return $this->renderJson($data, $callback);
 }
 public function getOffsetSum($timeToLive = 600, $refresh = false)
 {
     return ApiTokenOffsetTable::getInstance()->sumOffsetsBYToken($this);
 }