public function executeContacts()
 {
     $filter_form = new FilterContactForm();
     $filter_form->bindSelf('tc' . $this->target_list->getId());
     $this->form = $filter_form;
     $page = isset($this->page) ? $this->page : 1;
     $contact_table = ContactTable::getInstance();
     $this->contacts = new policatPager($filter_form->filter($contact_table->queryByTargetList($this->target_list)), $page, 'target_contact_pager', array('id' => $this->target_list->getId()), true, 20);
     if (isset($this->last_page) && $this->last_page) {
         $this->contacts = new policatPager($filter_form->filter($contact_table->queryByTargetList($this->target_list)), $this->contacts->getLastPage(), 'target_contact_pager', array('id' => $this->target_list->getId()), true, 20);
     }
 }
 public function executeContactDelete(sfWebRequest $request)
 {
     $contact = ContactTable::getInstance()->find($request->getParameter('id'));
     /* @var $contact Contact */
     if (!$contact) {
         return $this->notFound();
     }
     $target_list = $contact->getMailingList();
     if (!$this->getGuardUser()->isTargetListMember($target_list, true)) {
         return $this->noAccess();
     }
     $csrf_token = UtilCSRF::gen('delete_contact', $contact->getId(), $this->getUser()->getUserId());
     if ($request->isMethod('post')) {
         if ($request->getPostParameter('csrf_token') != $csrf_token) {
             return $this->ajax()->alert('CSRF Attack detected, please relogin.', 'Error', '#contact_delete_modal .modal-body')->render();
         }
         $id = $contact->getId();
         $contact->delete();
         return $this->ajax()->remove('#contact_' . $id)->modal('#contact_delete_modal', 'hide')->render();
     }
     return $this->ajax()->appendPartial('body', 'delete', array('id' => $contact->getId(), 'name' => $contact->getFullname(), 'csrf_token' => $csrf_token))->modal('#contact_delete_modal')->render();
 }
 public function getChoices(Petition $petition, $first, $active_pledge_item_ids = false)
 {
     $ts = $petition->getTargetSelectors();
     $choices = array();
     $query = $this->createQuery('ml')->where('ml.id = ?', $petition->getMailingListId());
     $fix_field = false;
     $direct_contact = false;
     if (count($ts) > 1) {
         $second = $ts[1]['id'];
         if (is_numeric($second)) {
             $query->leftJoin('ml.MailingListMeta mlm2')->andWhere('mlm2.id = ?', $second)->leftJoin('mlm2.MailingListMetaChoice mlmc2')->leftJoin('mlmc2.ContactMeta cm2')->leftJoin('cm2.Contact c')->select('DISTINCT ml.id, mlm2.id, mlmc2.*');
         } else {
             $fix_field = true;
             $col = $ts[1]['id'];
             $query->leftJoin('ml.Contact c')->groupBy("c.{$col}")->select("DISTINCT ml.id, c.id, c.{$col}");
         }
     } else {
         $direct_contact = true;
         $query->leftJoin('ml.Contact c')->select('DISTINCT ml.id, c.firstname, c.lastname, c.country');
     }
     if (is_numeric($ts[0]['id'])) {
         $query->leftJoin('c.ContactMeta cm1');
         if (array_key_exists('kind', $ts[0]) && $ts[0]['kind'] == MailingListMeta::KIND_MAPPING) {
             $query->andWhere('cm1.mailing_list_meta_choice_id IN (SELECT mlmc1.id FROM MailingListMetaChoice mlmc1 WHERE mlmc1.mailing_list_meta_id = ? AND mlmc1.choice = ?)', array($ts[0]['meta_id'], $first));
         } else {
             $query->andWhere('cm1.mailing_list_meta_choice_id = ?', $first);
         }
     } else {
         $col = $ts[0]['id'];
         $query->andWhere("c.{$col} = ?", $first);
         // should be secure
     }
     $list = $query->execute();
     $pledges = array();
     $infos = array();
     $pledge_table = PledgeTable::getInstance();
     $pledge_info_columns = $petition->getPledgeInfoColumnsArray();
     if ($list) {
         if ($direct_contact) {
             foreach ($list[0]['Contact'] as $choice) {
                 /* @var $choice Contact */
                 $choices[$choice['id']] = $choice['firstname'] . ' ' . $choice['lastname'];
             }
             $pledges = $pledge_table->getPledgesForContacts($list[0]['Contact'], $active_pledge_item_ids);
             $infos = ContactTable::getInstance()->getPledgeInfoColumns($list[0]['Contact'], $pledge_info_columns);
         } else {
             if ($fix_field) {
                 $col = $ts[1]['id'];
                 foreach ($list[0]['Contact'] as $choice) {
                     $choices[$choice[$col]] = $choice[$col];
                 }
             } else {
                 foreach ($list[0]['MailingListMeta'][0]['MailingListMetaChoice'] as $choice) {
                     $choices[$choice['id']] = $choice['choice'];
                 }
             }
         }
     }
     return array('choices' => $choices, 'pledges' => $direct_contact && $active_pledge_item_ids !== false ? $pledges : false, 'infos' => $infos);
 }
 function filter(Doctrine_Query $query)
 {
     return ContactTable::getInstance()->filter($query, $this);
 }
 protected function execute($arguments = array(), $options = array())
 {
     $context = sfContext::createInstance($this->configuration);
     $i18n = $context->getI18N();
     // initialize the database connection
     $databaseManager = new sfDatabaseManager($this->configuration);
     $connection = $databaseManager->getDatabase($options['connection'])->getConnection();
     $petition_text_by_lang = array();
     $table = PetitionSigningTable::getInstance();
     $con = $table->getConnection();
     $con->beginTransaction();
     try {
         $petition_signing = $table->createQuery('ps')->addFrom('ps.PetitionSigningWave psw')->where('ps.wave_cron > 0')->andWhere('DATE_SUB(NOW(),INTERVAL 2 MINUTE) > ps.updated_at')->andWhere('psw.status = ?', PetitionSigning::STATUS_VERIFIED)->orderBy('ps.created_at DESC')->fetchOne();
         if (empty($petition_signing)) {
             echo "nothing pending. (stop)";
             $connection->rollback();
             return;
         }
         /* @var $petition_signing PetitionSigning */
         $petition = $petition_signing->getPetition();
         /* @var $petition Petition */
         $is_pledge = $petition->getKind() == Petition::KIND_PLEDGE;
         $waves_verified = array();
         foreach ($petition_signing->getPetitionSigningWave() as $wave) {
             if ($wave->getStatus() == PetitionSigning::STATUS_VERIFIED) {
                 $waves_verified[] = $wave->getWave();
                 $wave->setStatus(PetitionSigning::STATUS_SENT);
             }
         }
         $contacts = ContactTable::getInstance()->createQuery('c')->addFrom('c.PetitionSigningContact psc')->where('psc.petition_signing_id = ?', $petition_signing->getId())->andWhereIn('psc.wave', $waves_verified)->addFrom('c.ContactMeta cm')->addFrom('cm.MailingListMetaChoice mlmc')->fetchArray();
         $subst_fields = $petition_signing->getPetition()->getGeoSubstFields();
         $i = 0;
         foreach ($contacts as $contact) {
             $subst = $petition_signing->getSubst();
             foreach ($subst_fields as $pattern => $subst_field) {
                 switch ($subst_field['type']) {
                     case 'fix':
                         $subst[$pattern] = $contact[$subst_field['id']];
                         break;
                     case 'free':
                         $subst[$pattern] = '';
                         foreach ($contact['ContactMeta'] as $cm) {
                             if ($cm['mailing_list_meta_id'] == $subst_field['id']) {
                                 $subst[$pattern] = $cm['value'];
                             }
                         }
                         break;
                     case 'choice':
                         $subst[$pattern] = '';
                         foreach ($contact['ContactMeta'] as $cm) {
                             if ($cm['mailing_list_meta_id'] == $subst_field['id']) {
                                 $subst[$pattern] = $cm['MailingListMetaChoice']['choice'];
                             }
                         }
                         break;
                 }
             }
             $wave = $petition_signing->getWave($contact['PetitionSigningContact'][0]['wave']);
             $wave_lang_id = $wave->getLanguageId();
             if ($wave_lang_id) {
                 $i18n->setCulture($wave_lang_id);
             }
             if ($contact['gender'] == Contact::GENDER_FEMALE) {
                 $personal_salutation = $i18n->__('Dear Madam %F %L,', array('%F' => $contact['firstname'], '%L' => $contact['lastname']));
             } elseif ($contact['gender'] == Contact::GENDER_MALE) {
                 $personal_salutation = $i18n->__('Dear Sir %F %L,', array('%F' => $contact['firstname'], '%L' => $contact['lastname']));
             } else {
                 $personal_salutation = $i18n->__('Dear Sir/Madam %F %L,', array('%F' => $contact['firstname'], '%L' => $contact['lastname']));
             }
             $personal_salutation .= "\n\n";
             $subst[PetitionTable::KEYWORD_PERSONAL_SALUTATION] = $personal_salutation;
             if ($wave) {
                 if ($is_pledge) {
                     $petition_contact = PetitionContactTable::getInstance()->findOneByPetitionIdAndContactId($petition->getId(), $contact['id']);
                     if (!$petition_contact) {
                         $petition_contact = new PetitionContact();
                         $petition_contact->setPetitionId($petition->getId());
                         $petition_contact->setContactId($contact['id']);
                         $new_secret = '';
                         while (strlen($new_secret) < 15) {
                             $new_secret .= strtoupper(strtr(base_convert(mt_rand(), 10, 36), array('0' => '', 'o' => '')));
                         }
                         $petition_contact->setSecret(substr($new_secret, 0, 15));
                         $petition_contact->save();
                     }
                     $secret = $petition_contact->getSecret();
                     $subst['#PLEDGE-URL#'] = $this->getRouting()->generate('pledge_contact', array('petition_id' => $petition->getId(), 'contact_id' => $contact['id'], 'secret' => $secret), true);
                 }
                 if (array_key_exists($contact['language_id'], $petition_text_by_lang)) {
                     $petition_text = $petition_text_by_lang[$contact['language_id']];
                 } else {
                     $petition_text = PetitionTextTable::getInstance()->fetchByPetitionAndPrefLang($petition, $contact['language_id'], Doctrine_Core::HYDRATE_ARRAY);
                     $petition_text_by_lang[$contact['language_id']] = $petition_text;
                 }
                 if ($petition->getKind() == Petition::KIND_PLEDGE) {
                     if ($petition_text) {
                         $subject = $petition_text['email_subject'];
                         $body = $petition_text['email_body'];
                     } else {
                         $subject = $body = '';
                     }
                 } else {
                     $subject = $wave->getField(Petition::FIELD_EMAIL_SUBJECT);
                     $body = $wave->getField(Petition::FIELD_EMAIL_BODY);
                 }
                 if ($petition_text) {
                     UtilMail::appendMissingKeywords($body, $petition_text['email_body'], PetitionSigningTable::$KEYWORDS);
                 }
                 $i++;
                 try {
                     /* Email to target  */
                     UtilMail::send(null, $wave->getEmailContact($petition->getFromEmail(), true), array($contact['email'] => $contact['firstname'] . ' ' . $contact['lastname']), $subject, $body, null, $subst, null, $wave->getEmailContact());
                     /* email problem */
                 } catch (Swift_RfcComplianceException $e) {
                     // ignore invalid emails
                 }
             }
         }
         $id = $petition_signing->getId();
         $waves_sent = implode(',', $waves_verified);
         $petition_signing->setWaveSent($petition_signing->getWaveCron());
         $petition_signing->setWaveCron(0);
         $petition_signing->save();
         echo "{$i} mails sent. [{$id}:{$waves_sent}] (continue)";
         $con->commit();
     } catch (Exception $e) {
         $con->rollback();
         print $e;
         echo 'exception in transaction. (stop)';
     }
 }
 protected function doSave($con = null)
 {
     if (null === $con) {
         $con = $this->getConnection();
     }
     $signing = $this->getObject();
     $petition = $signing->getPetition();
     $geo_existing = false;
     if ($petition->isGeoKind()) {
         // EMAIL-TO-LIST ACTION (AND PLEDGE)
         $existing_signing = PetitionSigningTable::getInstance()->findByPetitionIdAndEmail($petition->getId(), $this->getValue('email'));
         if ($existing_signing) {
             $geo_existing = true;
             $existing_signing->setPetition($petition);
             $this->object = $existing_signing;
             $signing = $existing_signing;
             $this->isNew = false;
             $signing->setWavePending($signing->getWavePending() + 1);
         } else {
             $signing->setWavePending(1);
         }
         $this->contact_num = 0;
         if ($petition->getKind() == Petition::KIND_PLEDGE) {
             $targets = ContactTable::getInstance()->fetchIdsByContactIds($petition, $this->getValue('pledges'), $existing_signing);
         } else {
             $targets = ContactTable::getInstance()->fetchIdsByTargetSelector($petition, $this->getValue('ts_1'), $this->getValue('ts_2'), $existing_signing);
         }
         if ($targets) {
             foreach ((array) $targets as $target) {
                 $signing_contact = new PetitionSigningContact();
                 $signing['PetitionSigningContact'][] = $signing_contact;
                 $signing_contact->setContactId($target['id']);
                 $signing_contact->setWave($signing->getWavePending());
                 $this->contact_num++;
             }
             parent::doSave($con);
         } else {
             $this->no_mails = true;
         }
     } else {
         parent::doSave($con);
     }
     $existing_signing = PetitionSigningTable::getInstance()->findByPetitionIdAndEmail($petition->getId(), $signing->getEmail(), $signing->getId());
     if ($existing_signing) {
         if ($existing_signing->getStatus() == PetitionSigning::STATUS_PENDING && !$geo_existing) {
             $existing_signing->delete();
         } else {
             $signing->delete();
             $this->object = $existing_signing;
             $signing = $existing_signing;
             return;
         }
     }
     $validation_kind = $this->getOption('validation_kind', PetitionSigning::VALIDATION_KIND_NONE);
     switch ($validation_kind) {
         case PetitionSigning::VALIDATION_KIND_EMAIL:
             UtilEmailValidation::send($signing);
             break;
         case PetitionSigning::VALIDATION_KIND_NONE:
         default:
             break;
     }
 }
 public function executeDownload(sfWebRequest $request)
 {
     $petition = PetitionTable::getInstance()->findById($request->getParameter('id'), $this->userIsAdmin());
     /* @var $petition Petition */
     if (!$petition) {
         return $this->notFound();
     }
     if (!$petition->isEditableBy($this->getGuardUser())) {
         return $this->noAccess();
     }
     if ($petition->getKind() != Petition::KIND_PLEDGE) {
         return $this->noAccess();
     }
     $target_list = $petition->getMailingList();
     if (!$target_list) {
         return $this->notFound();
     }
     $contact_data = ContactTable::getInstance()->queryFullData($target_list, $petition)->execute(array(), Doctrine_Core::HYDRATE_ARRAY);
     $pledge_data = ContactTable::getInstance()->queryByMailingList($target_list, $petition)->execute(array(), Doctrine_Core::HYDRATE_ARRAY);
     $pledge_data_contacts = PetitionContactTable::getInstance()->queryByPetition($petition->getId())->execute(array(), Doctrine_Core::HYDRATE_ARRAY);
     $mailing_list_meta = $target_list->getMailingListMeta();
     $pledge_items = $petition->getPledgeItems();
     $head = array('email', 'gender', 'first name', 'last name', 'country', 'language');
     foreach ($mailing_list_meta as $mlm) {
         /* @var $mlm MailingListMeta */
         if ($mlm->getKind() != MailingListMeta::KIND_MAPPING) {
             $head[] = $mlm->getName();
         }
     }
     foreach ($pledge_items as $pledge_item) {
         /* @var $pledge_item PledgeItem */
         $head[] = $pledge_item->getName();
         $head[] = 'pledge date';
     }
     $head[] = 'comment';
     $out = fopen('php://temp/export', 'a+');
     foreach ($contact_data as $id => $contact) {
         $pledges = array_key_exists($id, $pledge_data) ? $pledge_data[$id]['Pledges'] : array();
         $data = array($contact['email'], array_key_exists($contact['gender'], Contact::$GENDER_SHOW) ? Contact::$GENDER_SHOW[$contact['gender']] : null, $contact['firstname'], $contact['lastname'], $contact['country'], $contact['language_id']);
         $contact_metas = array();
         foreach ($contact['ContactMeta'] as $cm) {
             $cm_id = $cm['mailing_list_meta_id'];
             if (!array_key_exists($cm_id, $contact_metas)) {
                 $contact_metas[$cm_id] = array();
             }
             if ($cm['MailingListMetaChoice']) {
                 $contact_metas[$cm_id][] = $cm['MailingListMetaChoice']['choice'];
             } else {
                 $contact_metas[$cm_id][] = $cm['value'];
             }
         }
         foreach ($mailing_list_meta as $mlm) {
             /* @var $mlm MailingListMeta */
             if ($mlm->getKind() != MailingListMeta::KIND_MAPPING) {
                 $data[] = array_key_exists($mlm->getId(), $contact_metas) ? implode('|', $contact_metas[$mlm->getId()]) : '';
             }
         }
         foreach ($pledge_items as $pledge_item) {
             /* @var $pledge_item PledgeItem */
             $pledge_status = array_key_exists($pledge_item->getId(), $pledges) ? $pledges[$pledge_item->getId()]['status'] : null;
             $data[] = array_key_exists($pledge_status, PledgeTable::$STATUS_SHOW) ? PledgeTable::$STATUS_SHOW[$pledge_status] : null;
             $data[] = array_key_exists($pledge_item->getId(), $pledges) ? $pledges[$pledge_item->getId()]['status_at'] : null;
         }
         $data[] = array_key_exists($id, $pledge_data_contacts) ? $pledge_data_contacts[$id]['comment'] : null;
         fputcsv($out, $data, ';');
     }
     header('Content-Description: File Transfer');
     header('Content-Type: application/csv');
     header('Content-Type: text/plain');
     header('Content-Disposition: attachment; filename=' . '"pledges.csv"');
     header('Content-Transfer-Encoding: binary');
     header('Expires: 0');
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
     ob_clean();
     flush();
     $stdout = fopen('php://output', 'w');
     fwrite($stdout, "");
     fputcsv($stdout, $head, ';');
     fclose($stdout);
     rewind($out);
     fpassthru($out);
     fclose($out);
     exit;
 }
 public function getTargetSelectorChoices2($first, $second)
 {
     $tagging_cache = sfCacheTaggingToolkit::getTaggingCache();
     $cache_key = 'Petition_TS2_' . $this->getId() . '_' . (is_scalar($first) && is_scalar($second) ? $first . '__' . $second : md5(json_encode(array($first, $second))));
     $cached_ret = $tagging_cache->get($cache_key, null);
     if ($cached_ret !== null) {
         return $cached_ret;
     }
     $contacts = ContactTable::getInstance()->queryByTargetSelector($this, $first, $second)->execute();
     $pledge_table = PledgeTable::getInstance();
     $choices = array();
     $active_pledge_item_ids = $this->getActivePledgeItemIds();
     $pledge_info_columns = $this->getPledgeInfoColumnsArray();
     $pledges = $pledge_table->getPledgesForContacts($contacts, $active_pledge_item_ids);
     $infos = ContactTable::getInstance()->getPledgeInfoColumns($contacts, $pledge_info_columns);
     foreach ($contacts as $contact) {
         /* @var $contact Contact */
         $choices[$contact['id']] = $contact['firstname'] . ' ' . $contact['lastname'];
     }
     $ret = array('choices' => $choices, 'pledges' => $pledges, 'infos' => $infos);
     $tags = $this->getCacheTags();
     if ($this->getMailingListId()) {
         $tags = array_merge($tags, $this->getMailingList()->getCacheTags());
     }
     $tagging_cache->set($cache_key, $ret, 24 * 3600, $tags);
     return $ret;
 }