public static function send(PetitionSigning $signing, $subject_prefix = null)
 {
     if ($signing->getValidationKind() != PetitionSigning::VALIDATION_KIND_EMAIL) {
         return;
     }
     $widget = $signing->getWidget();
     $petition = $widget->getPetition();
     $petition_text = $widget->getPetitionText();
     $subject = $petition_text->getEmailValidationSubject();
     $body = $petition_text->getEmailValidationBody();
     $validation = UtilLink::signValidation($signing->getId(), $signing->getValidationData());
     $url_ref_ = $signing->getField(Petition::FIELD_REF);
     // $this->getValue('ref');
     $url_readmore_ = $petition->getReadMoreUrl();
     $url_ref = UtilPolicat::firstString(array($url_ref_, $url_readmore_));
     $url_readmore = UtilPolicat::firstString(array($url_readmore_, $url_ref_));
     $from = $petition->getFrom();
     $to = $signing->getEmail();
     $additional_subst = array('URL-REFERER' => $url_ref, 'URL-READMORE' => $url_readmore, 'VALIDATION' => $validation, '#REFERER-URL#' => $url_ref, '#READMORE-URL#' => $url_readmore, '#VALIDATION-URL#' => $validation);
     if ($subject_prefix) {
         $i18n = sfContext::getInstance()->getI18N();
         $i18n->setCulture($signing->getWidget()->getPetitionText()->getLanguageId());
         $translated = $i18n->__($subject_prefix);
         $subject = $translated . ' ' . $subject;
     }
     UtilMail::sendWithSubst(null, $from, $to, $subject, $body, $petition_text, $widget, $additional_subst, $signing->getSubst());
 }
 /**
  *
  * @param Petition $petition
  * @param string $ts_1
  * @param string $ts_2
  * @param PetitionSigning $existing_signing
  * @return Doctrine_Query
  */
 public function queryByTargetSelector(Petition $petition, $ts_1, $ts_2, $existing_signing = null)
 {
     $ts = $petition->getTargetSelectors();
     $query = $this->createQuery('c')->where('c.mailing_list_id = ?', $petition->getMailingListId());
     if ($existing_signing) {
         $query->andWhere('c.id NOT IN (SELECT psc.contact_id FROM PetitionSigningContact psc WHERE psc.petition_signing_id = ?)', $existing_signing->getId());
     }
     if ($ts_1 && count($ts) > 0) {
         $sel = $ts[0]['id'];
         if (is_numeric($sel)) {
             $is_mapping = array_key_exists('kind', $ts[0]) && $ts[0]['kind'] == MailingListMeta::KIND_MAPPING;
             $is_choice = array_key_exists('kind', $ts[0]) && $ts[0]['kind'] == MailingListMeta::KIND_CHOICE;
             $query->leftJoin('c.ContactMeta cm1');
             if ($is_mapping) {
                 $mapped_ts1 = MappingPairTable::getInstance()->getMapByIdAndA($ts[0]['mapping_id'], $ts_1);
                 $query->andWhere('cm1.mailing_list_meta_id = ?', $ts[0]['meta_id'])->leftJoin('cm1.MailingListMetaChoice mlmc1')->andWhereIn('mlmc1.choice', $mapped_ts1);
             } elseif ($is_choice && is_numeric($ts_1)) {
                 $query->andWhere('cm1.mailing_list_meta_id = ?', $sel)->andWhere('cm1.mailing_list_meta_choice_id = ?', $ts_1);
             } else {
                 // should not happen
                 $query->andWhere('cm1.mailing_list_meta_id = ?', $sel)->andWhere('cm1.value = ?', $ts_1);
             }
         } else {
             if ($sel === 'contact') {
                 if (is_numeric($ts_1)) {
                     $query->andWhere("c.id = ?", $ts_1);
                 }
             } else {
                 if (is_string($ts_1) && $ts_1 != 'all') {
                     $query->andWhere("c.{$sel} = ?", $ts_1);
                 }
             }
         }
         if ($ts_2 && count($ts) > 1) {
             $sel = $ts[1]['id'];
             if (is_numeric($sel)) {
                 if (is_numeric($ts_2)) {
                     $query->leftJoin('c.ContactMeta cm2')->andWhere('cm2.mailing_list_meta_id = ?', $sel)->andWhere('cm2.mailing_list_meta_choice_id = ?', $ts_2);
                 }
             } else {
                 if (is_string($ts_2) && $ts_2 != 'all') {
                     $query->andWhere("c.{$sel} = ?", $ts_2);
                 }
             }
         } else {
             if (is_numeric($ts_2)) {
                 $query->andWhere("c.id = ?", $ts_2);
             }
         }
     }
     return $query;
 }
 public function savePetitionSigning(PetitionSigning $signing, $clean = true)
 {
     $string = '';
     foreach (array(Petition::FIELD_FULLNAME => 'fullname', Petition::FIELD_FIRSTNAME => 'firstname', Petition::FIELD_LASTNAME => 'lastname', Petition::FIELD_EMAIL => 'email', Petition::FIELD_ADDRESS => 'address', Petition::FIELD_CITY => 'city', Petition::FIELD_POSTCODE => 'post_code') as $field_name) {
         $field = trim($signing->getField($field_name, ''));
         if ($field) {
             $string .= ' ' . $field;
         }
     }
     $parts = explode(' ', PetitionSigningSearchTable::normalize($string));
     $final_parts = array();
     foreach ($parts as $part) {
         $part = trim($part);
         $len = mb_strlen($part, 'UTF-8');
         if ($len > 2) {
             if ($len > 48) {
                 $final_parts[] = mb_substr($part, 0, 48, 'UTF-8');
             } else {
                 $final_parts[] = $part;
             }
         }
     }
     $unique_array = array_unique($final_parts, SORT_STRING);
     if (count($unique_array)) {
         if ($clean && $signing->getId()) {
             $this->createQuery('pss')->where('pss.id = ?', $signing->getId())->delete()->execute();
         }
         $i = 0;
         try {
             $con = $this->getConnection();
             $con->beginTransaction();
             foreach ($unique_array as $keyword) {
                 if ($i++ > 10) {
                     break;
                 }
                 $psk = new PetitionSigningSearch();
                 $psk->setPetitionSigning($signing);
                 $psk->setKeyword($keyword);
                 $psk->save();
                 $psk->free();
             }
             $con->commit();
         } catch (Exception $e) {
             $con->rollback();
         }
     }
 }
 protected function doUpdateObject($values)
 {
     $code = PetitionSigning::genCode();
     if ($this->getObject()->getPetition()->isGeoKind()) {
         // EMAIL-TO-LIST ACTION (AND PLEDGE)
         $fields = array();
         $formFields = array();
         foreach ($this->formfields as $fieldname) {
             $formFields[] = $fieldname;
         }
         if ($this->getObject()->getPetition()->isEmailKind()) {
             $formFields[] = Petition::FIELD_EMAIL_SUBJECT;
             $formFields[] = Petition::FIELD_EMAIL_BODY;
         }
         $non_json_fields = array('email', 'country', 'subscribe');
         foreach ($formFields as $fieldname) {
             if (!in_array($fieldname, $non_json_fields)) {
                 if (array_key_exists($fieldname, $values)) {
                     $fields[$fieldname] = $values[$fieldname];
                 }
             }
         }
         $fields[Petition::FIELD_REF] = $values[Petition::FIELD_REF];
         $wave = new PetitionSigningWave();
         $wave->setWave($this->getObject()->getWavePending());
         $wave->setFields(json_encode($fields));
         $wave->setEmail($this->getValue(Petition::FIELD_EMAIL));
         $wave->setCountry($this->getObject()->getPetition()->getWithCountry() ? $this->getValue(Petition::FIELD_COUNTRY) : $this->getObject()->getPetition()->getDefaultCountry());
         $wave->setValidationData($code);
         $wave->setLanguageId($this->getObject()->getWidget()->getPetitionText()->getLanguageId());
         $wave->setWidgetId($this->getObject()->getWidgetId());
         $wave->setContactNum($this->contact_num);
         $object = $this->getObject();
         $object['PetitionSigningWave'][] = $wave;
     }
     if (!$this->getObject()->isNew()) {
         unset($values[Petition::FIELD_EMAIL_SUBJECT], $values[Petition::FIELD_EMAIL_BODY]);
     }
     if (!$this->getObject()->getPetition()->getWithCountry()) {
         $values['country'] = $this->getObject()->getPetition()->getDefaultCountry();
     }
     $validation_kind = $this->getOption('validation_kind', PetitionSigning::VALIDATION_KIND_NONE);
     switch ($validation_kind) {
         case PetitionSigning::VALIDATION_KIND_EMAIL:
             $values['validation_data'] = $code;
             $values['validation_kind'] = PetitionSigning::VALIDATION_KIND_EMAIL;
             break;
         case PetitionSigning::VALIDATION_KIND_NONE:
         default:
             $values['validation_kind'] = PetitionSigning::VALIDATION_KIND_NONE;
             break;
     }
     unset($values['id']);
     parent::doUpdateObject($values);
 }
 protected function execute($arguments = array(), $options = array())
 {
     // initialize the database connection
     $databaseManager = new sfDatabaseManager($this->configuration);
     $connection = $databaseManager->getDatabase($options['connection'])->getConnection();
     $filename = $arguments['filename'];
     $petition_id = $arguments['petition_id'];
     $search_table = PetitionSigningSearchTable::getInstance();
     $petition = PetitionTable::getInstance()->findById($petition_id, true);
     if (empty($petition)) {
         echo "Petition not found.\n";
         return;
     }
     $campaign = $petition->getCampaign();
     $formfields = $petition->getFormfields();
     $formfields[] = Petition::FIELD_REF;
     $table = Doctrine_Core::getTable('PetitionSigning');
     printf("Campaign: %s\nPetition: %s\n", $campaign['name'], $petition['name']);
     $first_id = false;
     $first_line = null;
     if (($handle = @fopen($filename, "r")) !== false) {
         $con = $table->getConnection();
         $con->beginTransaction();
         echo "Begin transaction\n";
         try {
             $emails = array();
             $i = 0;
             while (($data = fgetcsv($handle, 1000, ",")) !== false) {
                 $i++;
                 if ($i % 100 == 0) {
                     echo "{$i}\n";
                 }
                 //if ($i > 300) break;
                 if (!is_array($first_line)) {
                     $first_line = $data;
                 } else {
                     $line = array_combine($first_line, $data);
                     $signing = new PetitionSigning();
                     $signing->setPetitionId($petition_id);
                     $signing->setStatus(PetitionSigning::STATUS_VERIFIED);
                     foreach ($formfields as $formfield) {
                         switch ($formfield) {
                             //                case 'created_at':
                             //                  $signing->setCreatedAt($line[$formfield]);
                             //                  break;
                             //                case 'updated_at':
                             //                  $signing->setUpdatedAt($line[$formfield]);
                             //                  break;
                             case Petition::FIELD_FULLNAME:
                                 $fullname = array();
                                 if (isset($line[Petition::FIELD_FIRSTNAME])) {
                                     $fullname[] = trim($line[Petition::FIELD_FIRSTNAME]);
                                 }
                                 if (isset($line[Petition::FIELD_LASTNAME])) {
                                     $fullname[] = trim($line[Petition::FIELD_LASTNAME]);
                                 }
                                 if (isset($line[Petition::FIELD_FULLNAME])) {
                                     $fullname[] = trim($line[Petition::FIELD_FULLNAME]);
                                 }
                                 $fullname = join(' ', $fullname);
                                 $signing->setField(Petition::FIELD_FULLNAME, $fullname);
                                 break;
                             case Petition::FIELD_SUBSCRIBE:
                                 if (isset($line[Petition::FIELD_SUBSCRIBE]) && $line[Petition::FIELD_SUBSCRIBE] == '1') {
                                     $signing->setField(Petition::FIELD_SUBSCRIBE, array('yes'));
                                 } else {
                                     $signing->setField(Petition::FIELD_SUBSCRIBE, array());
                                 }
                                 break;
                             default:
                                 if (isset($line[$formfield])) {
                                     $signing->setField($formfield, $line[$formfield]);
                                 }
                         }
                     }
                     $signing->save();
                     $search_table->savePetitionSigning($signing, false);
                     if ($first_id === false) {
                         $first_id = $signing->getId();
                     }
                     $email = $signing->getField(Petition::FIELD_EMAIL);
                     if (is_string($email)) {
                         $emails[] = trim($email);
                     }
                     $signing->free();
                 }
             }
             echo "checking duplicates\n";
             while (count($emails) > 0) {
                 $i = 0;
                 $where_param = array();
                 $where = array();
                 while ($i++ < 100) {
                     $email = array_shift($emails);
                     if (empty($email)) {
                         $break;
                     }
                     $where_param[] = $email;
                     $where[] = '(LOWER(ps.email) = LOWER(?))';
                 }
                 echo count($emails) . "\n";
                 $duplicates = $table->createQuery('ps')->where('ps.petition_id = ?', $petition_id)->andWhere('ps.id < ?', $first_id)->andWhere(join(' OR ', $where), $where_param)->execute();
                 foreach ($duplicates as $duplicate) {
                     $duplicate->setStatus(PetitionSigning::STATUS_DUPLICATE);
                 }
                 $duplicates->save();
                 $duplicates->free();
             }
             echo "Commit transaction";
             $con->commit();
             echo ".\n";
         } catch (Exception $e) {
             $con->rollback();
             echo "DB error. (rollback)\n";
         }
         fclose($handle);
     } else {
         echo "File error.\n";
         return;
     }
 }