public function testProfileChecksum() { $this->webtestLogin('admin'); // Profile fields. $fields = array('first_name' => array('type' => 'Individual', 'label' => 'First Name', 'default_value' => substr(sha1(rand()), 0, 7), 'update_value' => substr(sha1(rand()), 0, 7), 'element_name' => 'first_name'), 'last_name' => array('type' => 'Individual', 'label' => 'Last Name', 'default_value' => substr(sha1(rand()), 0, 7), 'update_value' => substr(sha1(rand()), 0, 7), 'element_name' => 'last_name'), 'email' => array('type' => 'Contact', 'label' => 'Email', 'location' => 0, 'default_value' => substr(sha1(rand()), 0, 5) . '@example.com', 'update_value' => substr(sha1(rand()), 0, 7) . '@example.com', 'element_name' => 'email-Primary'), 'city' => array('type' => 'Contact', 'label' => 'City', 'location' => 0, 'default_value' => substr(sha1(rand()), 0, 7), 'update_value' => substr(sha1(rand()), 0, 7), 'element_name' => 'city-Primary'), 'country' => array('type' => 'Contact', 'label' => 'Country', 'location' => 0, 'default_value' => '1228', 'update_value' => '1228', 'update_value_label' => 'UNITED STATES', 'element_name' => 'country-Primary', 'html_type' => 'select'), 'state_province' => array('type' => 'Contact', 'label' => 'State', 'location' => 0, 'default_value' => '1004', 'update_value' => '1031', 'update_value_label' => 'NY', 'element_name' => 'state_province-Primary', 'html_type' => 'select')); // Create a contact. $this->webtestAddContact($fields['first_name']['default_value'], $fields['last_name']['default_value'], $fields['email']['default_value']); // Get contact id from url. $contactId = $this->urlArg('cid'); // Create profile for contact $profileName = "Profile_" . substr(sha1(rand()), 0, 7); $profileId = $this->_testCreateContactProfile($fields, $profileName); // Check for profile create/edit permissions. $permission = array('edit-1-profile-edit', 'edit-1-profile-create', 'edit-1-access-all-custom-data', 'edit-1-edit-all-contacts'); $this->changePermissions($permission); // Get checksum of the newly created contact. $cs = CRM_Contact_BAO_Contact_Utils::generateChecksum($contactId); // logout. $this->webtestLogout(); // Go to edit profile page of the created contact. $this->openCiviPage("profile/edit", "id={$contactId}&gid={$profileId}&reset=1&cs={$cs}", NULL); $this->waitForTextPresent($profileName); // Check all profile fields, update their values. foreach ($fields as $field) { $this->assertTrue($this->isElementPresent($field['element_name']), "Missing Field: {$field['label']}."); if (isset($field['html_type']) && $field['html_type'] == 'select') { $this->waitForElementPresent($field['element_name']); $this->select($field['element_name'], "value={$field['update_value']}"); } else { $this->type($field['element_name'], $field['update_value']); } } // Save profile. $this->click("_qf_Edit_next"); $this->waitForPageToLoad(2 * $this->getTimeoutMsec()); // Check profile view page. $this->waitForTextPresent($profileName); // Check updated values of all fields. $checkFieldValues = array(); foreach ($fields as $field) { $checkFieldValues[] = isset($field['update_value_label']) ? $field['update_value_label'] : $field['update_value']; } $this->assertStringsPresent($checkFieldValues); }
/** * Send mail and create activity * when participant status changed. * * @param int $participantId * Participant id. * @param array $participantValues * Participant detail values. status id for participants. * @param array $eventDetails * Required event details. * @param array $contactDetails * Required contact details. * @param array $domainValues * Required domain values. * @param string $mailType * (eg 'approval', 'confirm', 'expired' ). * * @return bool */ public static function sendTransitionParticipantMail($participantId, $participantValues, $eventDetails, $contactDetails, &$domainValues, $mailType) { //send emails. $mailSent = FALSE; //don't send confirmation mail to additional //since only primary able to confirm registration. if (!empty($participantValues['registered_by_id']) && $mailType == 'Confirm') { return $mailSent; } $toEmail = CRM_Utils_Array::value('email', $contactDetails); if ($toEmail) { $contactId = $participantValues['contact_id']; $participantName = $contactDetails['display_name']; //calculate the checksum value. $checksumValue = NULL; if ($mailType == 'Confirm' && !$participantValues['registered_by_id']) { $checksumLife = 'inf'; $endDate = CRM_Utils_Array::value('end_date', $eventDetails); if ($endDate) { $checksumLife = (CRM_Utils_Date::unixTime($endDate) - time()) / (60 * 60); } $checksumValue = CRM_Contact_BAO_Contact_Utils::generateChecksum($contactId, NULL, $checksumLife); } //take a receipt from as event else domain. $receiptFrom = $domainValues['name'] . ' <' . $domainValues['email'] . '>'; if (!empty($eventDetails['confirm_from_name']) && !empty($eventDetails['confirm_from_email'])) { $receiptFrom = $eventDetails['confirm_from_name'] . ' <' . $eventDetails['confirm_from_email'] . '>'; } list($mailSent, $subject, $message, $html) = CRM_Core_BAO_MessageTemplate::sendTemplate(array('groupName' => 'msg_tpl_workflow_event', 'valueName' => 'participant_' . strtolower($mailType), 'contactId' => $contactId, 'tplParams' => array('contact' => $contactDetails, 'domain' => $domainValues, 'participant' => $participantValues, 'event' => $eventDetails, 'paidEvent' => CRM_Utils_Array::value('is_monetary', $eventDetails), 'isShowLocation' => CRM_Utils_Array::value('is_show_location', $eventDetails), 'isAdditional' => $participantValues['registered_by_id'], 'isExpired' => $mailType == 'Expired', 'isConfirm' => $mailType == 'Confirm', 'checksumValue' => $checksumValue), 'from' => $receiptFrom, 'toName' => $participantName, 'toEmail' => $toEmail, 'cc' => CRM_Utils_Array::value('cc_confirm', $eventDetails), 'bcc' => CRM_Utils_Array::value('bcc_confirm', $eventDetails))); // 3. create activity record. if ($mailSent) { $now = date('YmdHis'); $activityType = 'Event Registration'; $activityParams = array('subject' => $subject, 'source_contact_id' => $contactId, 'source_record_id' => $participantId, 'activity_type_id' => CRM_Core_OptionGroup::getValue('activity_type', $activityType, 'name'), 'activity_date_time' => CRM_Utils_Date::isoToMysql($now), 'due_date_time' => CRM_Utils_Date::isoToMysql($participantValues['register_date']), 'is_test' => $participantValues['is_test'], 'status_id' => 2); if (is_a(CRM_Activity_BAO_Activity::create($activityParams), 'CRM_Core_Error')) { CRM_Core_Error::fatal('Failed creating Activity for expiration mail'); } } } return $mailSent; }
/** * @param $token * @param $contact * @param bool $html * @param bool $returnBlankToken * @param bool $escapeSmarty * * @return bool|mixed|null|string */ public static function getContactTokenReplacement($token, &$contact, $html = FALSE, $returnBlankToken = FALSE, $escapeSmarty = FALSE) { if (self::$_tokens['contact'] == NULL) { /* This should come from UF */ self::$_tokens['contact'] = array_merge(array_keys(CRM_Contact_BAO_Contact::exportableFields('All')), array('checksum', 'contact_id')); } // Construct value from $token and $contact $value = NULL; $noReplace = FALSE; // Support legacy tokens $token = CRM_Utils_Array::value($token, self::legacyContactTokens(), $token); // check if the token we were passed is valid // we have to do this because this function is // called only when we find a token in the string if (!in_array($token, self::$_tokens['contact'])) { $noReplace = TRUE; } elseif ($token == 'checksum') { $hash = CRM_Utils_Array::value('hash', $contact); $contactID = CRM_Utils_Array::retrieveValueRecursive($contact, 'contact_id'); $cs = CRM_Contact_BAO_Contact_Utils::generateChecksum($contactID, NULL, NULL, $hash); $value = "cs={$cs}"; } else { $value = CRM_Utils_Array::retrieveValueRecursive($contact, $token); // FIXME: for some pseudoconstants we get array ( 0 => id, 1 => label ) if (is_array($value)) { $value = $value[1]; } elseif ($value && is_numeric($value)) { $allFields = CRM_Contact_BAO_Contact::exportableFields('All'); if (!empty($allFields[$token]['pseudoconstant'])) { $value = CRM_Core_PseudoConstant::getLabel('CRM_Contact_BAO_Contact', $token, $value); } } } if (!$html) { $value = str_replace('&', '&', $value); } // if null then return actual token if ($returnBlankToken && !$value) { $noReplace = TRUE; } if ($noReplace) { $value = "{contact.{$token}}"; } if ($escapeSmarty && !($returnBlankToken && $noReplace)) { // $returnBlankToken means the caller wants to do further attempts at // processing unreplaced tokens -- so don't escape them yet in this case. $value = self::tokenEscapeSmarty($value); } return $value; }
/** * Get the subscription URL. * * @param int $entityID * @param null $entity * @param string $action * * @return string */ public function subscriptionURL($entityID = NULL, $entity = NULL, $action = 'cancel') { $url = parent::subscriptionURL($entityID, $entity, $action); if (!isset($url)) { return NULL; } if (stristr($url, '&cs=')) { return $url; } $user_id = CRM_Core_Session::singleton()->get('userID'); $contact_id = $this->getContactID($entity, $entityID); if ($contact_id && $user_id != $contact_id) { return $url . '&cs=' . CRM_Contact_BAO_Contact_Utils::generateChecksum($contact_id, NULL, 'inf'); } return $url; }
public static function updatePledgeStatus($params) { $returnMessages = array(); $sendReminders = CRM_Utils_Array::value('send_reminders', $params, FALSE); $allStatus = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name'); //unset statues that we never use for pledges foreach (array('Completed', 'Cancelled', 'Failed') as $statusKey) { if ($key = CRM_Utils_Array::key($statusKey, $allStatus)) { unset($allStatus[$key]); } } $statusIds = implode(',', array_keys($allStatus)); $updateCnt = 0; $query = "\nSELECT pledge.contact_id as contact_id,\n pledge.id as pledge_id,\n pledge.amount as amount,\n payment.scheduled_date as scheduled_date,\n pledge.create_date as create_date,\n payment.id as payment_id,\n pledge.currency as currency,\n pledge.contribution_page_id as contribution_page_id,\n payment.reminder_count as reminder_count,\n pledge.max_reminders as max_reminders,\n payment.reminder_date as reminder_date,\n pledge.initial_reminder_day as initial_reminder_day,\n pledge.additional_reminder_day as additional_reminder_day,\n pledge.status_id as pledge_status,\n payment.status_id as payment_status,\n pledge.is_test as is_test,\n pledge.campaign_id as campaign_id,\n SUM(payment.scheduled_amount) as amount_due,\n ( SELECT sum(civicrm_pledge_payment.actual_amount)\n FROM civicrm_pledge_payment\n WHERE civicrm_pledge_payment.status_id = 1\n AND civicrm_pledge_payment.pledge_id = pledge.id\n ) as amount_paid\n FROM civicrm_pledge pledge, civicrm_pledge_payment payment\n WHERE pledge.id = payment.pledge_id\n AND payment.status_id IN ( {$statusIds} ) AND pledge.status_id IN ( {$statusIds} )\n GROUP By payment.id\n "; $dao = CRM_Core_DAO::executeQuery($query); $now = date('Ymd'); $pledgeDetails = $contactIds = $pledgePayments = $pledgeStatus = array(); while ($dao->fetch()) { $checksumValue = CRM_Contact_BAO_Contact_Utils::generateChecksum($dao->contact_id); $pledgeDetails[$dao->payment_id] = array('scheduled_date' => $dao->scheduled_date, 'amount_due' => $dao->amount_due, 'amount' => $dao->amount, 'amount_paid' => $dao->amount_paid, 'create_date' => $dao->create_date, 'contact_id' => $dao->contact_id, 'pledge_id' => $dao->pledge_id, 'checksumValue' => $checksumValue, 'contribution_page_id' => $dao->contribution_page_id, 'reminder_count' => $dao->reminder_count, 'max_reminders' => $dao->max_reminders, 'reminder_date' => $dao->reminder_date, 'initial_reminder_day' => $dao->initial_reminder_day, 'additional_reminder_day' => $dao->additional_reminder_day, 'pledge_status' => $dao->pledge_status, 'payment_status' => $dao->payment_status, 'is_test' => $dao->is_test, 'currency' => $dao->currency, 'campaign_id' => $dao->campaign_id); $contactIds[$dao->contact_id] = $dao->contact_id; $pledgeStatus[$dao->pledge_id] = $dao->pledge_status; if (CRM_Utils_Date::overdue(CRM_Utils_Date::customFormat($dao->scheduled_date, '%Y%m%d'), $now) && $dao->payment_status != array_search('Overdue', $allStatus)) { $pledgePayments[$dao->pledge_id][$dao->payment_id] = $dao->payment_id; } } // process the updating script... foreach ($pledgePayments as $pledgeId => $paymentIds) { // 1. update the pledge /pledge payment status. returns new status when an update happens $returnMessages[] = "Checking if status update is needed for Pledge Id: {$pledgeId} (current status is {$allStatus[$pledgeStatus[$pledgeId]]})"; $newStatus = CRM_Pledge_BAO_PledgePayment::updatePledgePaymentStatus($pledgeId, $paymentIds, array_search('Overdue', $allStatus), NULL, 0, FALSE, TRUE); if ($newStatus != $pledgeStatus[$pledgeId]) { $returnMessages[] = "- status updated to: {$allStatus[$newStatus]}"; $updateCnt += 1; } } if ($sendReminders) { // retrieve domain tokens $domain = CRM_Core_BAO_Domain::getDomain(); $tokens = array('domain' => array('name', 'phone', 'address', 'email'), 'contact' => CRM_Core_SelectValues::contactTokens()); $domainValues = array(); foreach ($tokens['domain'] as $token) { $domainValues[$token] = CRM_Utils_Token::getDomainTokenReplacement($token, $domain); } //get the domain email address, since we don't carry w/ object. $domainValue = CRM_Core_BAO_Domain::getNameAndEmail(); $domainValues['email'] = $domainValue[1]; // retrieve contact tokens // this function does NOT return Deceased contacts since we don't want to send them email list($contactDetails) = CRM_Utils_Token::getTokenDetails($contactIds, NULL, FALSE, FALSE, NULL, $tokens, 'CRM_UpdatePledgeRecord'); // assign domain values to template $template = CRM_Core_Smarty::singleton(); $template->assign('domain', $domainValues); //set receipt from $receiptFrom = '"' . $domainValues['name'] . '" <' . $domainValues['email'] . '>'; foreach ($pledgeDetails as $paymentId => $details) { if (array_key_exists($details['contact_id'], $contactDetails)) { $contactId = $details['contact_id']; $pledgerName = $contactDetails[$contactId]['display_name']; } else { continue; } if (empty($details['reminder_date'])) { $nextReminderDate = new DateTime($details['scheduled_date']); $nextReminderDate->modify("-" . $details['initial_reminder_day'] . "day"); $nextReminderDate = $nextReminderDate->format("Ymd"); } else { $nextReminderDate = new DateTime($details['reminder_date']); $nextReminderDate->modify("+" . $details['additional_reminder_day'] . "day"); $nextReminderDate = $nextReminderDate->format("Ymd"); } if ($details['reminder_count'] < $details['max_reminders'] && $nextReminderDate <= $now) { $toEmail = $doNotEmail = $onHold = NULL; if (!empty($contactDetails[$contactId]['email'])) { $toEmail = $contactDetails[$contactId]['email']; } if (!empty($contactDetails[$contactId]['do_not_email'])) { $doNotEmail = $contactDetails[$contactId]['do_not_email']; } if (!empty($contactDetails[$contactId]['on_hold'])) { $onHold = $contactDetails[$contactId]['on_hold']; } // 2. send acknowledgement mail if ($toEmail && !($doNotEmail || $onHold)) { //assign value to template $template->assign('amount_paid', $details['amount_paid'] ? $details['amount_paid'] : 0); $template->assign('contact', $contactDetails[$contactId]); $template->assign('next_payment', $details['scheduled_date']); $template->assign('amount_due', $details['amount_due']); $template->assign('checksumValue', $details['checksumValue']); $template->assign('contribution_page_id', $details['contribution_page_id']); $template->assign('pledge_id', $details['pledge_id']); $template->assign('scheduled_payment_date', $details['scheduled_date']); $template->assign('amount', $details['amount']); $template->assign('create_date', $details['create_date']); $template->assign('currency', $details['currency']); list($mailSent, $subject, $message, $html) = CRM_Core_BAO_MessageTemplate::sendTemplate(array('groupName' => 'msg_tpl_workflow_pledge', 'valueName' => 'pledge_reminder', 'contactId' => $contactId, 'from' => $receiptFrom, 'toName' => $pledgerName, 'toEmail' => $toEmail)); // 3. update pledge payment details if ($mailSent) { CRM_Pledge_BAO_PledgePayment::updateReminderDetails($paymentId); $activityType = 'Pledge Reminder'; $activityParams = array('subject' => $subject, 'source_contact_id' => $contactId, 'source_record_id' => $paymentId, 'assignee_contact_id' => $contactId, 'activity_type_id' => CRM_Core_OptionGroup::getValue('activity_type', $activityType, 'name'), 'activity_date_time' => CRM_Utils_Date::isoToMysql($now), 'due_date_time' => CRM_Utils_Date::isoToMysql($details['scheduled_date']), 'is_test' => $details['is_test'], 'status_id' => 2, 'campaign_id' => $details['campaign_id']); if (is_a(civicrm_api('activity', 'create', $activityParams), 'CRM_Core_Error')) { $returnMessages[] = "Failed creating Activity for acknowledgment"; return array('is_error' => 1, 'message' => $returnMessages); } $returnMessages[] = "Payment reminder sent to: {$pledgerName} - {$toEmail}"; } } } } // end foreach on $pledgeDetails } // end if ( $sendReminders ) $returnMessages[] = "{$updateCnt} records updated."; return array('is_error' => 0, 'messages' => implode("\n\r", $returnMessages)); }
/** * Construct a new mailing object, along with job and mailing_group * objects, from the form values of the create mailing wizard. * * This function is a bit evil. It not only merges $params and saves * the mailing -- it also schedules the mailing and chooses the recipients. * Since it merges $params, it's also the only place to correctly trigger * multi-field validation. It should be broken up. * * In the mean time, use-cases which break under the weight of this * evil may find reprieve in these extra evil params: * * - _skip_evil_bao_auto_recipients_: bool * - _skip_evil_bao_auto_schedule_: bool * - _evil_bao_validator_: string|callable * * </twowrongsmakesaright> * * @params array $params * Form values. * * @param array $params * @param array $ids * * @return object * $mailing The new mailing object * @throws \Exception */ public static function create(&$params, $ids = array()) { // WTH $ids if (empty($ids) && isset($params['id'])) { $ids['mailing_id'] = $ids['id'] = $params['id']; } // CRM-12430 // Do the below only for an insert // for an update, we should not set the defaults if (!isset($ids['id']) && !isset($ids['mailing_id'])) { // Retrieve domain email and name for default sender $domain = civicrm_api('Domain', 'getsingle', array('version' => 3, 'current_domain' => 1, 'sequential' => 1)); if (isset($domain['from_email'])) { $domain_email = $domain['from_email']; $domain_name = $domain['from_name']; } else { $domain_email = '*****@*****.**'; $domain_name = 'EXAMPLE.ORG'; } if (!isset($params['created_id'])) { $session =& CRM_Core_Session::singleton(); $params['created_id'] = $session->get('userID'); } $defaults = array('override_verp' => TRUE, 'forward_replies' => FALSE, 'open_tracking' => TRUE, 'url_tracking' => TRUE, 'visibility' => 'Public Pages', 'replyto_email' => $domain_email, 'header_id' => CRM_Mailing_PseudoConstant::defaultComponent('header_id', ''), 'footer_id' => CRM_Mailing_PseudoConstant::defaultComponent('footer_id', ''), 'from_email' => $domain_email, 'from_name' => $domain_name, 'msg_template_id' => NULL, 'created_id' => $params['created_id'], 'approver_id' => NULL, 'auto_responder' => 0, 'created_date' => date('YmdHis'), 'scheduled_date' => NULL, 'approval_date' => NULL); // Get the default from email address, if not provided. if (empty($defaults['from_email'])) { $defaultAddress = CRM_Core_OptionGroup::values('from_email_address', NULL, NULL, NULL, ' AND is_default = 1'); foreach ($defaultAddress as $id => $value) { if (preg_match('/"(.*)" <(.*)>/', $value, $match)) { $defaults['from_email'] = $match[2]; $defaults['from_name'] = $match[1]; } } } $params = array_merge($defaults, $params); } /** * Could check and warn for the following cases: * * - groups OR mailings should be populated. * - body html OR body text should be populated. */ $transaction = new CRM_Core_Transaction(); $mailing = self::add($params, $ids); if (is_a($mailing, 'CRM_Core_Error')) { $transaction->rollback(); return $mailing; } // update mailings with hash values CRM_Contact_BAO_Contact_Utils::generateChecksum($mailing->id, NULL, NULL, NULL, 'mailing', 16); $groupTableName = CRM_Contact_BAO_Group::getTableName(); $mailingTableName = CRM_Mailing_BAO_Mailing::getTableName(); /* Create the mailing group record */ $mg = new CRM_Mailing_DAO_MailingGroup(); $groupTypes = array('include' => 'Include', 'exclude' => 'Exclude', 'base' => 'Base'); foreach (array('groups', 'mailings') as $entity) { foreach (array('include', 'exclude', 'base') as $type) { if (isset($params[$entity][$type])) { self::replaceGroups($mailing->id, $groupTypes[$type], $entity, $params[$entity][$type]); } } } if (!empty($params['search_id']) && !empty($params['group_id'])) { $mg->reset(); $mg->mailing_id = $mailing->id; $mg->entity_table = $groupTableName; $mg->entity_id = $params['group_id']; $mg->search_id = $params['search_id']; $mg->search_args = $params['search_args']; $mg->group_type = 'Include'; $mg->save(); } // check and attach and files as needed CRM_Core_BAO_File::processAttachment($params, 'civicrm_mailing', $mailing->id); // If we're going to autosend, then check validity before saving. if (!empty($params['scheduled_date']) && $params['scheduled_date'] != 'null' && !empty($params['_evil_bao_validator_'])) { $cb = Civi\Core\Resolver::singleton()->get($params['_evil_bao_validator_']); $errors = call_user_func($cb, $mailing); if (!empty($errors)) { $fields = implode(',', array_keys($errors)); throw new CRM_Core_Exception("Mailing cannot be sent. There are missing or invalid fields ({$fields}).", 'cannot-send', $errors); } } $transaction->commit(); // Create parent job if not yet created. // Condition on the existence of a scheduled date. if (!empty($params['scheduled_date']) && $params['scheduled_date'] != 'null' && empty($params['_skip_evil_bao_auto_schedule_'])) { $job = new CRM_Mailing_BAO_MailingJob(); $job->mailing_id = $mailing->id; $job->status = 'Scheduled'; $job->is_test = 0; if (!$job->find(TRUE)) { $job->scheduled_date = $params['scheduled_date']; $job->save(); } // Populate the recipients. if (empty($params['_skip_evil_bao_auto_recipients_'])) { self::getRecipients($job->id, $mailing->id, TRUE, $mailing->dedupe_email); } } return $mailing; }
/** * Get url for users to manage this recurring contribution for this processor. * * @param int $entityID * @param null $entity * @param string $action * * @return string */ public function subscriptionURL($entityID = NULL, $entity = NULL, $action = 'cancel') { // Set URL switch ($action) { case 'cancel': $url = 'civicrm/contribute/unsubscribe'; break; case 'billing': //in notify mode don't return the update billing url if (!$this->isSupported('updateSubscriptionBillingInfo')) { return NULL; } $url = 'civicrm/contribute/updatebilling'; break; case 'update': $url = 'civicrm/contribute/updaterecur'; break; } $session = CRM_Core_Session::singleton(); $userId = $session->get('userID'); $contactID = 0; $checksumValue = ''; $entityArg = ''; // Find related Contact if ($entityID) { switch ($entity) { case 'membership': $contactID = CRM_Core_DAO::getFieldValue("CRM_Member_DAO_Membership", $entityID, "contact_id"); $entityArg = 'mid'; break; case 'contribution': $contactID = CRM_Core_DAO::getFieldValue("CRM_Contribute_DAO_Contribution", $entityID, "contact_id"); $entityArg = 'coid'; break; case 'recur': $sql = "\n SELECT con.contact_id\n FROM civicrm_contribution_recur rec\nINNER JOIN civicrm_contribution con ON ( con.contribution_recur_id = rec.id )\n WHERE rec.id = %1\n GROUP BY rec.id"; $contactID = CRM_Core_DAO::singleValueQuery($sql, array(1 => array($entityID, 'Integer'))); $entityArg = 'crid'; break; } } // Add entity arguments if ($entityArg != '') { // Add checksum argument if ($contactID != 0 && $userId != $contactID) { $checksumValue = '&cs=' . CRM_Contact_BAO_Contact_Utils::generateChecksum($contactID, NULL, 'inf'); } return CRM_Utils_System::url($url, "reset=1&{$entityArg}={$entityID}{$checksumValue}", TRUE, NULL, FALSE, TRUE); } // Else login URL if ($this->isSupported('accountLoginURL')) { return $this->accountLoginURL(); } // Else default return isset($this->_paymentProcessor['url_recur']) ? $this->_paymentProcessor['url_recur'] : ''; }
/** * Process the user submitted custom data values. * * * @return void */ public function postProcess() { parent::postProcess(); $displayName = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $this->_id, 'display_name'); $sortName = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $this->_id, 'sort_name'); $this->ajaxResponse['label'] = $sortName; // When saving (not deleting) and not in an ajax popup if (empty($_POST[$this->_deleteButtonName]) && $this->_context != 'dialog') { CRM_Core_Session::setStatus(ts('Your information has been saved.'), ts('Thank you.'), 'success'); } $session = CRM_Core_Session::singleton(); // only replace user context if we do not have a postURL if (!$this->_postURL) { $gidString = $this->_gid; if (!empty($this->_profileIds)) { $gidString = implode(',', $this->_profileIds); } $urlParams = "reset=1&id={$this->_id}&gid={$gidString}"; if ($this->_isContactActivityProfile && $this->_activityId) { $urlParams .= "&aid={$this->_activityId}"; } // Get checksum if present if ($this->get('cs')) { $urlParams .= "&cs=" . $this->get('cs'); } elseif (!CRM_Contact_BAO_Contact_Permission::allow($this->_id)) { $urlParams .= "&cs=" . CRM_Contact_BAO_Contact_Utils::generateChecksum($this->_id); } $url = CRM_Utils_System::url('civicrm/profile/view', $urlParams); } else { // Replace tokens from post URL $contactParams = array('contact_id' => $this->_id, 'version' => 3); $contact = civicrm_api('contact', 'get', $contactParams); $contact = reset($contact['values']); $dummyMail = new CRM_Mailing_BAO_Mailing(); $dummyMail->body_text = $this->_postURL; $tokens = $dummyMail->getTokens(); $url = CRM_Utils_Token::replaceContactTokens($this->_postURL, $contact, FALSE, CRM_Utils_Array::value('text', $tokens)); } $session->replaceUserContext($url); }
public function getContactTokenReplacement($token, &$contact, $html = false, $returnBlankToken = false) { if (self::$_tokens['contact'] == null) { /* This should come from UF */ self::$_tokens['contact'] = array_merge(array_keys(CRM_Contact_BAO_Contact::exportableFields('All')), array('checksum', 'contact_id')); } /* Construct value from $token and $contact */ $value = null; // check if the token we were passed is valid // we have to do this because this function is // called only when we find a token in the string if (!in_array($token, self::$_tokens['contact'])) { $value = "{contact.{$token}}"; } else { if ($token == 'checksum') { require_once 'CRM/Contact/BAO/Contact/Utils.php'; $cs = CRM_Contact_BAO_Contact_Utils::generateChecksum($contact['contact_id']); $value = "cs={$cs}"; } else { $value = CRM_Utils_Array::retrieveValueRecursive($contact, $token); } } if (!$html) { $value = str_replace('&', '&', $value); } // if null then return actual token if ($returnBlankToken && !$value) { $value = "{contact.{$token}}"; } return $value; }
function subscriptionURL($entityID = NULL, $entity = NULL, $action = 'cancel') { if ($action == 'cancel') { $url = 'civicrm/contribute/unsubscribe'; } elseif ($action == 'billing') { //in notify mode don't return the update billing url if ($this->_paymentProcessor['billing_mode'] == self::BILLING_MODE_NOTIFY) { return NULL; } $url = 'civicrm/contribute/updatebilling'; } elseif ($action == 'update') { $url = 'civicrm/contribute/updaterecur'; } $session = CRM_Core_Session::singleton(); $userId = $session->get('userID'); $checksumValue = ""; if ($entityID && $entity == 'membership') { if (!$userId) { $contactID = CRM_Core_DAO::getFieldValue("CRM_Member_DAO_Membership", $entityID, "contact_id"); $checksumValue = CRM_Contact_BAO_Contact_Utils::generateChecksum($contactID, NULL, 'inf'); $checksumValue = "&cs={$checksumValue}"; } return CRM_Utils_System::url($url, "reset=1&mid={$entityID}{$checksumValue}", TRUE, NULL, FALSE, TRUE); } if ($entityID && $entity == 'contribution') { if (!$userId) { $contactID = CRM_Core_DAO::getFieldValue("CRM_Contribute_DAO_Contribution", $entityID, "contact_id"); $checksumValue = CRM_Contact_BAO_Contact_Utils::generateChecksum($contactID, NULL, 'inf'); $checksumValue = "&cs={$checksumValue}"; } return CRM_Utils_System::url($url, "reset=1&coid={$entityID}{$checksumValue}", TRUE, NULL, FALSE, TRUE); } if ($entityID && $entity == 'recur') { if (!$userId) { $sql = "\n SELECT con.contact_id\n FROM civicrm_contribution_recur rec\nINNER JOIN civicrm_contribution con ON ( con.contribution_recur_id = rec.id )\n WHERE rec.id = %1\n GROUP BY rec.id"; $contactID = CRM_Core_DAO::singleValueQuery($sql, array(1 => array($entityID, 'Integer'))); $checksumValue = CRM_Contact_BAO_Contact_Utils::generateChecksum($contactID, NULL, 'inf'); $checksumValue = "&cs={$checksumValue}"; } return CRM_Utils_System::url($url, "reset=1&crid={$entityID}{$checksumValue}", TRUE, NULL, FALSE, TRUE); } if ($this->isSupported('accountLoginURL')) { return $this->accountLoginURL(); } return $this->_paymentProcessor['url_recur']; }
/** * Process the user submitted custom data values. * * @access public * * @return void */ public function postProcess() { parent::postProcess(); // this is special case when we create contact using Dialog box if ($this->_context == 'dialog') { $displayName = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $this->_id, 'display_name'); $sortName = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $this->_id, 'sort_name'); $returnArray = array('contactID' => $this->_id, 'displayName' => $displayName, 'sortName' => $sortName, 'newContactSuccess' => TRUE); echo json_encode($returnArray); CRM_Utils_System::civiExit(); } //for delete record handling if (!CRM_Utils_Array::value($this->_deleteButtonName, $_POST)) { CRM_Core_Session::setStatus(ts('Your information has been saved.'), ts('Thank you.'), 'success'); } $session = CRM_Core_Session::singleton(); // only replace user context if we do not have a postURL if (!$this->_postURL) { $gidString = $this->_gid; if (!empty($this->_profileIds)) { $gidString = implode(',', $this->_profileIds); } $urlParams = "reset=1&id={$this->_id}&gid={$gidString}"; if ($this->_isContactActivityProfile && $this->_activityId) { $urlParams .= "&aid={$this->_activityId}"; } // Get checksum if present if ($this->get('cs')) { $urlParams .= "&cs=" . $this->get('cs'); } elseif (!CRM_Contact_BAO_Contact_Permission::allow($this->_id)) { $urlParams .= "&cs=" . CRM_Contact_BAO_Contact_Utils::generateChecksum($this->_id); } $url = CRM_Utils_System::url('civicrm/profile/view', $urlParams); } else { // Replace tokens from post URL $contactParams = array('contact_id' => $this->_id, 'version' => 3); $contact = civicrm_api('contact', 'get', $contactParams); $contact = reset($contact['values']); $dummyMail = new CRM_Mailing_BAO_Mailing(); $dummyMail->body_text = $this->_postURL; $tokens = $dummyMail->getTokens(); $url = CRM_Utils_Token::replaceContactTokens($this->_postURL, $contact, FALSE, CRM_Utils_Array::value('text', $tokens)); } $session->replaceUserContext($url); }
/** * CRM-16761: Self service view, update and cancel for CiviEvent */ public function testAllowSelfService() { $this->webtestLogin('admin'); // Create Individual $contact1 = substr(sha1(rand()), 0, 7); $this->webtestAddContact($contact1, "Anderson", "{$contact1}@example.com"); // Add event $this->openCiviPage("event/add", "reset=1&action=add"); $eventTitle = 'My Conference - ' . substr(sha1(rand()), 0, 7); $eventDescription = "Here is a description for this conference."; $registerIntro = "Fill in all the fields below and click Continue."; $multipleRegistrations = TRUE; $allowSelfService = TRUE; $this->_testAddEventInfo($eventTitle, $eventDescription); $streetAddress = "100 Main Street"; $this->_testAddLocation($streetAddress); $this->_testAddFees(FALSE, FALSE, "Test Processor", FALSE, TRUE); $this->_testAddOnlineRegistration($registerIntro, FALSE, $allowSelfService); // Register participant $id = $this->urlArg('id'); $this->openCiviPage("event/register", "reset=1&id={$id}&action=preview", '_qf_Register_upload-bottom'); $this->waitForElementPresent("xpath=//div[@id='crm-event-register-different']/a"); $this->click("xpath=//div[@id='crm-event-register-different']/a"); $this->waitForAjaxcontent(); $this->select2("select_contact_id", "{$contact1}"); // Fill card details $this->select("credit_card_type", "value=Visa"); $this->type("credit_card_number", "4111111111111111"); $this->type("cvv2", "000"); $this->select("credit_card_exp_date[M]", "value=1"); $this->select("credit_card_exp_date[Y]", "value=2020"); // Add billing Address $this->webtestAddBillingDetails($contact1, NULL, 'Anderson'); $this->click("_qf_Register_upload-bottom"); $this->waitForPageToLoad($this->getTimeoutMsec()); $this->waitForElementPresent("_qf_Confirm_next-top"); $this->click("_qf_Confirm_next-top"); // Find Participant. $this->openCiviPage("event/search", "reset=1"); $this->waitForElementPresent("_qf_Search_refresh"); $this->type('sort_name', "Anderson, {$contact1}"); $this->click("_qf_Search_refresh"); $this->waitForElementPresent("xpath=//div[@id='participantSearch']"); // Get the id of primary participant $primaryParticipantId = $this->urlArg('id', $this->getAttribute("xpath=//div[@id='participantSearch']/table/tbody/tr/td[3]/a[text()='Anderson, {$contact1}']/../../td[11]/span/a[1][text()='View']@href")); // Get the contact id of primary participant $primaryParticipantContactid = $this->urlArg('cid', $this->getAttribute("xpath=//div[@id='participantSearch']/table/tbody/tr/td[3]/a[text()='Anderson, {$contact1}']/../../td[11]/span/a[1][text()='View']@href")); // Generate checksum for primary participant $checkSum = CRM_Contact_BAO_Contact_Utils::generateChecksum($primaryParticipantContactid); $this->open($this->sboxPath . "admin/people/permissions/roles"); $permissions = array("edit-1-access-civicrm", "edit-1-access-civievent", "edit-1-edit-all-events"); $this->webtestLogout(); // Transfer event registration. $this->openCiviPage("event/selfsvcupdate", "reset=1&pid={$primaryParticipantId}&cs={$checkSum}"); $this->waitForElementPresent("xpath=//table[@class='crm-selfsvcupdate-form-details']"); $this->verifyText("xpath=//table[@class='crm-selfsvcupdate-form-details']/tbody/tr/td[1]", preg_quote("Anderson, {$contact1}")); $this->verifyText("xpath=//table[@class='crm-selfsvcupdate-form-details']/tbody/tr/td[2]", preg_quote("{$eventTitle}")); $this->select("action", "value=1"); $this->click("_qf_SelfSvcUpdate_submit-bottom"); $this->waitForElementPresent("_qf_SelfSvcTransfer_submit-bottom"); $newParticipantFirstName = substr(sha1(rand()), 0, 5); $newParticipantLastName = "Smith"; $newParticipantEmail = "{$newParticipantFirstName}@example.com"; $this->type('email', $newParticipantEmail); $this->type('last_name', $newParticipantLastName); $this->type('first_name', $newParticipantFirstName); $this->click("_qf_SelfSvcTransfer_submit-bottom"); // Cancel event registration. $this->webtestLogin('admin'); $this->openCiviPage("event/search", "reset=1"); $this->type('sort_name', "Smith, {$newParticipantFirstName}"); $this->click("_qf_Search_refresh"); $this->waitForElementPresent("xpath=//div[@id='participantSearch']/table/tbody/tr/td[3]/a[text()='Smith, {$newParticipantFirstName}']/../../td[11]/span/a[1][text()='View']"); // Get the id of new participant $newParticipantId = $this->urlArg('id', $this->getAttribute("xpath=//div[@id='participantSearch']/table/tbody/tr/td[3]/a[text()='Smith, {$newParticipantFirstName}']/../../td[11]/span/a[1][text()='View']@href")); // Get the contact id of new participant $newParticipantContactId = $this->urlArg('cid', $this->getAttribute("xpath=//div[@id='participantSearch']/table/tbody/tr/td[3]/a[text()='Smith, {$newParticipantFirstName}']/../../td[11]/span/a[1][text()='View']@href")); // Generate checksum for new participant $newParticipantcheckSum = CRM_Contact_BAO_Contact_Utils::generateChecksum($newParticipantContactId); $this->webtestLogout(); $this->openCiviPage("event/selfsvcupdate", "reset=1&pid={$newParticipantId}&cs={$newParticipantcheckSum}"); $this->verifyText("xpath=//table[@class='crm-selfsvcupdate-form-details']/tbody/tr/td[1]", preg_quote("Smith, {$newParticipantFirstName}")); $this->verifyText("xpath=//table[@class='crm-selfsvcupdate-form-details']/tbody/tr/td[2]", preg_quote("{$eventTitle}")); $this->select("action", "value=2"); $this->click("_qf_SelfSvcUpdate_submit-bottom"); // Check the status of participant $this->webtestLogin('admin'); $this->openCiviPage("event/search", "reset=1"); $this->waitForElementPresent('_qf_Search_refresh'); $this->select2("event_id", $eventTitle); $this->click("xpath=//div[@id='searchForm']/table/tbody/tr[9]/td[1]/label[text()='No']"); $this->click("_qf_Search_refresh"); $this->waitForElementPresent("xpath=//div[@id='participantSearch']/table/tbody"); $this->assertElementContainsText("xpath=//div[@id='participantSearch']/table/tbody/tr[@id='rowid{$primaryParticipantId}']/td[9]", "Transferred"); $this->assertElementContainsText("xpath=//div[@id='participantSearch']/table/tbody/tr[@id='rowid{$newParticipantId}']/td[9]", "Cancelled"); }
function civiqrcode_civicrm_tokenValues(&$values, $cids, $job = null, $tokens = array(), $context = null) { if (array_key_exists('contact', $tokens)) { $config = CRM_Core_Config::singleton(); $imageUploadDir = $config->imageUploadDir; $extensionDir = dirname(__FILE__) . DIRECTORY_SEPARATOR; $qrlibFile = $extensionDir . '/lib/phpqrcode/phpqrcode.php'; $tableName = QRCODE_SETTING_DB_TABLENAME; $qrToken = QRCODE_SETTING_DB_COLUMN_QRCODE_TOKEN; $qrTarget = QRCODE_SETTING_DB_COLUMN_QRCODE_TARGET; $argExt = QRCODE_SETTING_DB_COLUMN_QRCODE_ARG_EXT; $argCs = QRCODE_SETTING_DB_COLUMN_QRCODE_ARG_CS; $getAllQrCodeTokenDAO = CRM_Core_DAO::executeQuery("SELECT * FROM {$tableName}"); foreach ($cids as $id) { while ($getAllQrCodeTokenDAO->fetch()) { $filename = $getAllQrCodeTokenDAO->{$qrToken} . '_' . $id . date('dmy') . '.png'; $pngAbsoluteFilePath = $imageUploadDir . $filename; //delete if the filename exists if (file_exists($pngAbsoluteFilePath)) { unlink($pngAbsoluteFilePath); } $urlParams = array(); $urlParams['cid'] = $id; $urlParams['reset'] = 1; if ($getAllQrCodeTokenDAO->{$argExt}) { $urlParams['mid'] = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $id, 'external_identifier', 'id'); } if ($getAllQrCodeTokenDAO->{$argCs}) { $urlParams['cs'] = CRM_Contact_BAO_Contact_Utils::generateChecksum($id); } $url = CRM_Utils_System::url($getAllQrCodeTokenDAO->{$qrTarget}, $urlParams, TRUE); require_once $qrlibFile; QRcode::png($url, $pngAbsoluteFilePath, 'L', 4, 2); $values[$id]['civiqrcode.' . $getAllQrCodeTokenDAO->{$qrToken}] = realpath($pngAbsoluteFilePath); } //end while } //end foreach } //end if }
public static function getContactTokenReplacement($token, &$contact, $html = FALSE, $returnBlankToken = FALSE, $escapeSmarty = FALSE) { if (self::$_tokens['contact'] == NULL) { /* This should come from UF */ self::$_tokens['contact'] = array_merge(array_keys(CRM_Contact_BAO_Contact::exportableFields('All')), array('checksum', 'contact_id')); } /* Construct value from $token and $contact */ $value = NULL; // check if the token we were passed is valid // we have to do this because this function is // called only when we find a token in the string if (!in_array($token, self::$_tokens['contact'])) { $value = "{contact.{$token}}"; } elseif ($token == 'checksum') { $hash = CRM_Utils_Array::value('hash', $contact); $contactID = CRM_Utils_Array::retrieveValueRecursive($contact, 'contact_id'); $cs = CRM_Contact_BAO_Contact_Utils::generateChecksum($contactID, NULL, NULL, $hash); $value = "cs={$cs}"; } else { $value = CRM_Utils_Array::retrieveValueRecursive($contact, $token); } if (!$html) { $value = str_replace('&', '&', $value); } // if null then return actual token if ($returnBlankToken && !$value) { $value = "{contact.{$token}}"; } if ($escapeSmarty) { $value = self::tokenEscapeSmarty($value); } return $value; }
function cancelSubscriptionURL($entityID = null, $entity = null) { if ($entityID && $entity == 'membership') { require_once 'CRM/Contact/BAO/Contact/Utils.php'; $contactID = CRM_Core_DAO::getFieldValue("CRM_Member_DAO_Membership", $entityID, "contact_id"); $checksumValue = CRM_Contact_BAO_Contact_Utils::generateChecksum($contactID, null, 'inf'); return CRM_Utils_System::url('civicrm/contribute/unsubscribe', "reset=1&mid={$entityID}&cs={$checksumValue}", true, null, false, false); } return $this->_mode == 'test' ? 'https://test.authorize.net' : 'https://authorize.net'; }