/** * Submit a payment using Advanced Integration Method * * @param array $params assoc array of input parameters for this transaction * @return array the result in a nice formatted array (or an error object) * @public */ function doDirectPayment(&$params) { // Invoke hook_civicrm_paymentProcessor // In Dummy's case, there is no translation of parameters into // the back-end's canonical set of parameters. But if a processor // does this, it needs to invoke this hook after it has done translation, // but before it actually starts talking to its proprietary back-end. $cookedParams = $params; // no translation in Dummy processor CRM_Utils_Hook::alterPaymentProcessorParams($this, $params, $cookedParams); //end of hook invokation if ($this->_mode == 'test') { $query = "SELECT MAX(trxn_id) FROM civicrm_contribution WHERE trxn_id LIKE 'test\\_%'"; $p = array(); $trxn_id = strval(CRM_Core_Dao::singleValueQuery($query, $p)); $trxn_id = str_replace('test_', '', $trxn_id); $trxn_id = intval($trxn_id) + 1; $params['trxn_id'] = sprintf('test_%08d', $trxn_id); } else { $query = "SELECT MAX(trxn_id) FROM civicrm_contribution WHERE trxn_id LIKE 'live_%'"; $p = array(); $trxn_id = strval(CRM_Core_Dao::singleValueQuery($query, $p)); $trxn_id = str_replace('live_', '', $trxn_id); $trxn_id = intval($trxn_id) + 1; $params['trxn_id'] = sprintf('live_%08d', $trxn_id); } $params['gross_amount'] = $params['amount']; return $params; }
/** * Function to build the form * * @return None * @access public */ public function buildQuickForm() { parent::buildQuickForm(); if ($this->_action & CRM_Core_Action::DELETE) { return; } $attributes = CRM_Core_DAO::getAttribute('CRM_Core_DAO_PreferencesDate'); $this->applyFilter('__ALL__', 'trim'); $name =& $this->add('text', 'name', ts('Name'), $attributes['name'], true); $name->freeze(); $this->add('text', 'description', ts('Description'), $attributes['description'], false); $this->add('text', 'start', ts('Start Offset'), $attributes['start'], true); $this->add('text', 'end', ts('End Offset'), $attributes['end'], true); $formatType = CRM_Core_Dao::getFieldValue('CRM_Core_DAO_PreferencesDate', $this->_id, 'name'); if ($formatType == 'creditCard') { $this->add('text', 'date_format', ts('Format'), $attributes['date_format'], true); } else { $this->add('select', 'date_format', ts('Format'), array('' => ts('- default input format -')) + CRM_Core_SelectValues::getDatePluginInputFormats()); $this->add('select', 'time_format', ts('Time'), array('' => ts('- none -')) + CRM_Core_SelectValues::getTimeFormats()); } $this->addRule('start', ts('Value should be a positive number'), 'positiveInteger'); $this->addRule('end', ts('Value should be a positive number'), 'positiveInteger'); // add a form rule $this->addFormRule(array('CRM_Admin_Form_PreferencesDate', 'formRule')); }
function civicrm_api3_pcpteams_getTeamRequestInfo($params) { $result = CRM_Core_DAO::$_nullArray; //check the hasPermission to view details $permParams = array('team_pcp_id' => $params['team_pcp_id']); if (!_civicrm_pcpteams_permission_check($permParams, CRM_Core_Permission::VIEW)) { return civicrm_api3_create_error('insufficient permission to view this record'); } $query = " \n SELECT crs.pcp_a_b, cc.display_name, cp.page_id, cr.id FROM civicrm_value_pcp_relationship_set crs\n INNER JOIN civicrm_relationship cr ON (cr.id = crs.entity_id AND cr.is_active = 0)\n INNER JOIN civicrm_pcp cp ON (cp.id = crs.pcp_a_b)\n INNER JOIN civicrm_contact cc ON (cr.contact_id_a = cc.id AND cc.is_deleted = 0)\n WHERE crs.pcp_b_a = %1"; $queryParams = array(1 => array($params['team_pcp_id'], 'Integer')); $dao = CRM_Core_Dao::executeQuery($query, $queryParams); while ($dao->fetch()) { $memberPcpResult = civicrm_api('Pcpteams', 'get', array('version' => 3, 'sequential' => 1, 'pcp_id' => $dao->pcp_a_b, 'team_pcp_id' => $params['team_pcp_id'])); $getAllDonations = civicrm_api3_pcpteams_getAllDonations(array('page_id' => $dao->page_id, 'pcp_id' => $dao->pcp_a_b, 'team_pcp_id' => $params['team_pcp_id'])); $result[$dao->pcp_a_b] = array('display_name' => $dao->display_name, 'pcp_id' => $dao->pcp_a_b, 'amount_raised' => $memberPcpResult['values'][0]['amount_raised'], 'donations_count' => $getAllDonations['count'], 'image_url' => $memberPcpResult['values'][0]['image_url'] ? $memberPcpResult['values'][0]['image_url'] : CRM_Pcpteams_Constant::C_DEFAULT_PROFILE_PIC, 'image_id' => $memberPcpResult['values'][0]['image_id'], 'team_pcp_id' => $params['team_pcp_id'], 'relationship_id' => $dao->id); } return civicrm_api3_create_success($result, $params); }
/** * This function sends request and receives response from * the processor * @param array $params * @return array|object * @throws Exception */ public function doDirectPayment(&$params) { if (isset($params['is_recur']) && $params['is_recur'] == TRUE) { CRM_Core_Error::fatal(ts('Elavon - recurring payments not implemented')); } if (!defined('CURLOPT_SSLCERT')) { CRM_Core_Error::fatal(ts('Elavon / Nova Virtual Merchant Gateway requires curl with SSL support')); } //Create the array of variables to be sent to the processor from the $params array // passed into this function $requestFields = self::mapProcessorFieldstoParams($params); // define variables for connecting with the gateway $requestFields['ssl_merchant_id'] = $this->_paymentProcessor['user_name']; $requestFields['ssl_user_id'] = $this->_paymentProcessor['password']; $requestFields['ssl_pin'] = $this->_paymentProcessor['signature']; $host = $this->_paymentProcessor['url_site']; if ($this->_mode == "test") { $requestFields['ssl_test_mode'] = "TRUE"; } // Allow further manipulation of the arguments via custom hooks .. CRM_Utils_Hook::alterPaymentProcessorParams($this, $params, $requestFields); // Check to see if we have a duplicate before we send if ($this->checkDupe($params['invoiceID'], CRM_Utils_Array::value('contributionID', $params))) { return self::errorExit(9003, 'It appears that this transaction is a duplicate. Have you already submitted the form once? If so there may have been a connection problem. Check your email for a receipt. If you do not receive a receipt within 2 hours you can try your transaction again. If you continue to have problems please contact the site administrator.'); } // Convert to XML using function below $xml = self::buildXML($requestFields); // Send to the payment processor using cURL $chHost = $host . '?xmldata=' . $xml; $ch = curl_init($chHost); if (!$ch) { return self::errorExit(9004, 'Could not initiate connection to payment gateway'); } curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, Civi::settings()->get('verifySSL') ? 2 : 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, Civi::settings()->get('verifySSL')); // return the result on success, FALSE on failure curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 36000); // set this for debugging -look for output in apache error log //curl_setopt ($ch,CURLOPT_VERBOSE,1 ); // ensures any Location headers are followed if (ini_get('open_basedir') == '' && ini_get('safe_mode') == 'Off') { curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); } // Send the data out over the wire $responseData = curl_exec($ch); // See if we had a curl error - if so tell 'em and bail out // NOTE: curl_error does not return a logical value (see its documentation), but // a string, which is empty when there was no error. if (curl_errno($ch) > 0 || strlen(curl_error($ch)) > 0) { curl_close($ch); $errorNum = curl_errno($ch); $errorDesc = curl_error($ch); // Paranoia - in the unlikley event that 'curl' errno fails if ($errorNum == 0) { $errorNum = 9005; } // Paranoia - in the unlikley event that 'curl' error fails if (strlen($errorDesc) == 0) { $errorDesc = "Connection to payment gateway failed"; } if ($errorNum = 60) { return self::errorExit($errorNum, "Curl error - " . $errorDesc . " Try this link for more information http://curl.haxx.se/docs/sslcerts.html"); } return self::errorExit($errorNum, "Curl error - " . $errorDesc . " your key is located at " . $key . " the url is " . $host . " xml is " . $requestxml . " processor response = " . $processorResponse); } // If null data returned - tell 'em and bail out // NOTE: You will not necessarily get a string back, if the request failed for // any reason, the return value will be the boolean false. if ($responseData === FALSE || strlen($responseData) == 0) { curl_close($ch); return self::errorExit(9006, "Error: Connection to payment gateway failed - no data returned."); } // If gateway returned no data - tell 'em and bail out if (empty($responseData)) { curl_close($ch); return self::errorExit(9007, "Error: No data returned from payment gateway."); } // Success so far - close the curl and check the data curl_close($ch); // Payment successfully sent to gateway - process the response now $processorResponse = self::decodeXMLResponse($responseData); // success in test mode returns response "APPROVED" // test mode always returns trxn_id = 0 // fix for CRM-2566 if ($processorResponse['errorCode']) { return self::errorExit(9010, "Error: [" . $processorResponse['errorCode'] . " " . $processorResponse['errorName'] . " " . $processorResponse['errorMessage'] . "] - from payment processor"); } if ($processorResponse['ssl_result_message'] == "APPROVED") { if ($this->_mode == 'test') { $query = "SELECT MAX(trxn_id) FROM civicrm_contribution WHERE trxn_id LIKE 'test%'"; $p = array(); $trxn_id = strval(CRM_Core_Dao::singleValueQuery($query, $p)); $trxn_id = str_replace('test', '', $trxn_id); $trxn_id = intval($trxn_id) + 1; $params['trxn_id'] = sprintf('test%08d', $trxn_id); return $params; } else { return self::errorExit(9099, "Error: [approval code related to test transaction but mode was " . $this->_mode); } } // transaction failed, print the reason if ($processorResponse['ssl_result_message'] != "APPROVAL") { return self::errorExit(9009, "Error: [" . $processorResponse['ssl_result_message'] . " " . $processorResponse['ssl_result'] . "] - from payment processor"); } else { // Success ! if ($this->_mode != 'test') { // 'trxn_id' is varchar(255) field. returned value is length 37 $params['trxn_id'] = $processorResponse['ssl_txn_id']; } $params['trxn_result_code'] = $processorResponse['ssl_approval_code'] . "-Cvv2:" . $processorResponse['ssl_cvv2_response'] . "-avs:" . $processorResponse['ssl_avs_response']; return $params; } }
/** * Get rows for the event browser * * @param int $mailing_id ID of the mailing * @param int $job_id optional ID of the job * @param boolean $is_distinct Group by queue id? * @param int $offset Offset * @param int $rowCount Number of rows * @param array $sort sort array * * @return array Result set * @access public * @static */ public static function &getRows($mailing_id, $job_id = NULL, $is_distinct = FALSE, $offset = NULL, $rowCount = NULL, $sort = NULL) { $dao = new CRM_Core_Dao(); $bounce = self::getTableName(); $bounceType = CRM_Mailing_DAO_BounceType::getTableName(); $queue = CRM_Mailing_Event_BAO_Queue::getTableName(); $mailing = CRM_Mailing_BAO_Mailing::getTableName(); $job = CRM_Mailing_BAO_MailingJob::getTableName(); $contact = CRM_Contact_BAO_Contact::getTableName(); $email = CRM_Core_BAO_Email::getTableName(); $query = "\n SELECT {$contact}.display_name as display_name,\n {$contact}.id as contact_id,\n {$email}.email as email,\n {$bounce}.time_stamp as date,\n {$bounce}.bounce_reason as reason,\n {$bounceType}.name as bounce_type\n FROM {$contact}\n INNER JOIN {$queue}\n ON {$queue}.contact_id = {$contact}.id\n INNER JOIN {$email}\n ON {$queue}.email_id = {$email}.id\n INNER JOIN {$bounce}\n ON {$bounce}.event_queue_id = {$queue}.id\n LEFT JOIN {$bounceType}\n ON {$bounce}.bounce_type_id = {$bounceType}.id\n INNER JOIN {$job}\n ON {$queue}.job_id = {$job}.id\n AND {$job}.is_test = 0\n INNER JOIN {$mailing}\n ON {$job}.mailing_id = {$mailing}.id\n WHERE {$mailing}.id = " . CRM_Utils_Type::escape($mailing_id, 'Integer'); if (!empty($job_id)) { $query .= " AND {$job}.id = " . CRM_Utils_Type::escape($job_id, 'Integer'); } if ($is_distinct) { $query .= " GROUP BY {$queue}.id "; } $orderBy = "sort_name ASC, {$bounce}.time_stamp DESC"; if ($sort) { if (is_string($sort)) { $sort = CRM_Utils_Type::escape($sort, 'String'); $orderBy = $sort; } else { $orderBy = trim($sort->orderBy()); } } $query .= " ORDER BY {$orderBy} "; if ($offset || $rowCount) { //Added "||$rowCount" to avoid displaying all records on first page $query .= ' LIMIT ' . CRM_Utils_Type::escape($offset, 'Integer') . ', ' . CRM_Utils_Type::escape($rowCount, 'Integer'); } $dao->query($query); $results = array(); while ($dao->fetch()) { $url = CRM_Utils_System::url('civicrm/contact/view', "reset=1&cid={$dao->contact_id}"); $results[] = array('name' => "<a href=\"{$url}\">{$dao->display_name}</a>", 'email' => $dao->email, 'type' => empty($dao->bounce_type) ? ts('Unknown') : $dao->bounce_type, 'reason' => $dao->reason, 'date' => CRM_Utils_Date::customFormat($dao->date)); } return $results; }
/** * Submit a payment using Advanced Integration Method. * * @param array $params * Assoc array of input parameters for this transaction. * * @return array * the result in a nice formatted array (or an error object) */ public function doDirectPayment(&$params) { // Invoke hook_civicrm_paymentProcessor // In Dummy's case, there is no translation of parameters into // the back-end's canonical set of parameters. But if a processor // does this, it needs to invoke this hook after it has done translation, // but before it actually starts talking to its proprietary back-end. // no translation in Dummy processor $cookedParams = $params; CRM_Utils_Hook::alterPaymentProcessorParams($this, $params, $cookedParams); //end of hook invocation if (!empty($this->_doDirectPaymentResult)) { $result = $this->_doDirectPaymentResult; $result['trxn_id'] = array_shift($this->_doDirectPaymentResult['trxn_id']); return $result; } if ($this->_mode == 'test') { $query = "SELECT MAX(trxn_id) FROM civicrm_contribution WHERE trxn_id LIKE 'test\\_%'"; $p = array(); $trxn_id = strval(CRM_Core_Dao::singleValueQuery($query, $p)); $trxn_id = str_replace('test_', '', $trxn_id); $trxn_id = intval($trxn_id) + 1; $params['trxn_id'] = sprintf('test_%08d', $trxn_id); } else { $query = "SELECT MAX(trxn_id) FROM civicrm_contribution WHERE trxn_id LIKE 'live_%'"; $p = array(); $trxn_id = strval(CRM_Core_Dao::singleValueQuery($query, $p)); $trxn_id = str_replace('live_', '', $trxn_id); $trxn_id = intval($trxn_id) + 1; $params['trxn_id'] = sprintf('live_%08d', $trxn_id); } $params['gross_amount'] = $params['amount']; // Add a fee_amount so we can make sure fees are handled properly in underlying classes. $params['fee_amount'] = 1.5; $params['net_amount'] = $params['gross_amount'] - $params['fee_amount']; return $params; }
/** * Get rows for the event browser. * * @param int $mailing_id * ID of the mailing. * @param int $job_id * Optional ID of the job. * @param bool $is_distinct * Group by queue id?. * @param int $offset * Offset. * @param int $rowCount * Number of rows. * @param array $sort * Sort array. * * @param null $org_unsubscribe * @return array * Result set */ public static function &getRows($mailing_id, $job_id = NULL, $is_distinct = FALSE, $offset = NULL, $rowCount = NULL, $sort = NULL, $org_unsubscribe = NULL) { $dao = new CRM_Core_Dao(); $unsub = self::$_tableName; $queueObject = new CRM_Mailing_Event_BAO_Queue(); $queue = $queueObject->getTableName(); $mailingObject = new CRM_Mailing_BAO_Mailing(); $mailing = $mailingObject->getTableName(); $jobObject = new CRM_Mailing_BAO_MailingJob(); $job = $jobObject->getTableName(); $contactObject = new CRM_Contact_BAO_Contact(); $contact = $contactObject->getTableName(); $emailObject = new CRM_Core_BAO_Email(); $email = $emailObject->getTableName(); $query = "\n SELECT {$contact}.display_name as display_name,\n {$contact}.id as contact_id,\n {$email}.email as email,\n {$unsub}.time_stamp as date,\n {$unsub}.org_unsubscribe as org_unsubscribe\n FROM {$contact}\n INNER JOIN {$queue}\n ON {$queue}.contact_id = {$contact}.id\n INNER JOIN {$email}\n ON {$queue}.email_id = {$email}.id\n INNER JOIN {$unsub}\n ON {$unsub}.event_queue_id = {$queue}.id\n INNER JOIN {$job}\n ON {$queue}.job_id = {$job}.id\n INNER JOIN {$mailing}\n ON {$job}.mailing_id = {$mailing}.id\n AND {$job}.is_test = 0\n WHERE {$mailing}.id = " . CRM_Utils_Type::escape($mailing_id, 'Integer'); if (!empty($job_id)) { $query .= " AND {$job}.id = " . CRM_Utils_Type::escape($job_id, 'Integer'); } if ($org_unsubscribe !== NULL) { $query .= " AND {$unsub}.org_unsubscribe = " . ($org_unsubscribe ? 0 : 1); } if ($is_distinct) { $query .= " GROUP BY {$queue}.id "; } $orderBy = "sort_name ASC, {$unsub}.time_stamp DESC"; if ($sort) { if (is_string($sort)) { $sort = CRM_Utils_Type::escape($sort, 'String'); $orderBy = $sort; } else { $orderBy = trim($sort->orderBy()); } } $query .= " ORDER BY {$orderBy} "; if ($offset || $rowCount) { //Added "||$rowCount" to avoid displaying all records on first page $query .= ' LIMIT ' . CRM_Utils_Type::escape($offset, 'Integer') . ', ' . CRM_Utils_Type::escape($rowCount, 'Integer'); } $dao->query($query); $results = array(); while ($dao->fetch()) { $url = CRM_Utils_System::url('civicrm/contact/view', "reset=1&cid={$dao->contact_id}"); $results[] = array('name' => "<a href=\"{$url}\">{$dao->display_name}</a>", 'email' => $dao->email, 'unsubOrOptout' => ts('Yes'), 'date' => CRM_Utils_Date::customFormat($dao->date)); } return $results; }
/** * Lookup the admin page at which a field's option list can be edited * @param $fieldSpec * @return string|null */ static function getOptionEditUrl($fieldSpec) { // If it's an option group, that's easy if (!empty($fieldSpec['pseudoconstant']['optionGroupName'])) { return 'civicrm/admin/options/' . $fieldSpec['pseudoconstant']['optionGroupName']; } elseif (!empty($fieldSpec['pseudoconstant']['table'])) { $daoName = CRM_Core_DAO_AllCoreTables::getClassForTable($fieldSpec['pseudoconstant']['table']); if (!$daoName) { return NULL; } // We don't have good mapping so have to do a bit of guesswork from the menu list(, $parent, , $child) = explode('_', $daoName); $sql = "SELECT path FROM civicrm_menu\n WHERE page_callback LIKE '%CRM_Admin_Page_{$child}%' OR page_callback LIKE '%CRM_{$parent}_Page_{$child}%'\n ORDER BY page_callback\n LIMIT 1"; return CRM_Core_Dao::singleValueQuery($sql); } return NULL; }
/** * Submit a payment using Advanced Integration Method. * * @param array $params * Assoc array of input parameters for this transaction. * * @return array * the result in a nice formatted array (or an error object) */ public function doDirectPayment(&$params) { // Invoke hook_civicrm_paymentProcessor // In Dummy's case, there is no translation of parameters into // the back-end's canonical set of parameters. But if a processor // does this, it needs to invoke this hook after it has done translation, // but before it actually starts talking to its proprietary back-end. // no translation in Dummy processor $cookedParams = $params; CRM_Utils_Hook::alterPaymentProcessorParams($this, $params, $cookedParams); // This means we can test failing transactions by setting a past year in expiry. A full expiry check would // be more complete. if (!empty($params['credit_card_exp_date']['Y']) && date('Y') > CRM_Core_Payment_Form::getCreditCardExpirationYear($params)) { $error = new CRM_Core_Error(ts('transaction failed')); return $error; } //end of hook invocation if (!empty($this->_doDirectPaymentResult)) { $result = $this->_doDirectPaymentResult; $result['trxn_id'] = array_shift($this->_doDirectPaymentResult['trxn_id']); return $result; } if ($this->_mode == 'test') { $query = "SELECT MAX(trxn_id) FROM civicrm_contribution WHERE trxn_id LIKE 'test\\_%'"; $p = array(); $trxn_id = strval(CRM_Core_Dao::singleValueQuery($query, $p)); $trxn_id = str_replace('test_', '', $trxn_id); $trxn_id = intval($trxn_id) + 1; $params['trxn_id'] = 'test_' . $trxn_id . '_' . uniqid(); } else { $query = "SELECT MAX(trxn_id) FROM civicrm_contribution WHERE trxn_id LIKE 'live_%'"; $p = array(); $trxn_id = strval(CRM_Core_Dao::singleValueQuery($query, $p)); $trxn_id = str_replace('live_', '', $trxn_id); $trxn_id = intval($trxn_id) + 1; $params['trxn_id'] = 'live_' . $trxn_id . '_' . uniqid(); } $params['gross_amount'] = $params['amount']; // Add a fee_amount so we can make sure fees are handled properly in underlying classes. $params['fee_amount'] = 1.5; $params['net_amount'] = $params['gross_amount'] - $params['fee_amount']; return $params; }
/** * Submit a payment using Advanced Integration Method * * @param array $params assoc array of input parameters for this transaction * * @return array the result in a nice formatted array (or an error object) * @public */ function doDirectPayment(&$params) { if (!defined('CURLOPT_SSLCERT')) { return self::error(9001, 'Authorize.Net requires curl with SSL support'); } /* * recurpayment function does not compile an array & then proces it - * - the tpl does the transformation so adding call to hook here * & giving it a change to act on the params array */ $newParams = $params; if (CRM_Utils_Array::value('is_recur', $params) && $params['contributionRecurID']) { CRM_Utils_Hook::alterPaymentProcessorParams($this, $params, $newParams); } foreach ($newParams as $field => $value) { $this->_setParam($field, $value); } if (CRM_Utils_Array::value('is_recur', $params) && $params['contributionRecurID']) { $result = $this->doRecurPayment(); if (is_a($result, 'CRM_Core_Error')) { return $result; } return $params; } $postFields = array(); $authorizeNetFields = $this->_getAuthorizeNetFields(); // Set up our call for hook_civicrm_paymentProcessor, // since we now have our parameters as assigned for the AIM back end. CRM_Utils_Hook::alterPaymentProcessorParams($this, $params, $authorizeNetFields); foreach ($authorizeNetFields as $field => $value) { // CRM-7419, since double quote is used as enclosure while doing csv parsing $value = $field == 'x_description' ? str_replace('"', "'", $value) : $value; $postFields[] = $field . '=' . urlencode($value); } // Authorize.Net will not refuse duplicates, so we should check if the user already submitted this transaction if ($this->_checkDupe($authorizeNetFields['x_invoice_num'])) { return self::error(9004, 'It appears that this transaction is a duplicate. Have you already submitted the form once? If so there may have been a connection problem. Check your email for a receipt from Authorize.net. If you do not receive a receipt within 2 hours you can try your transaction again. If you continue to have problems please contact the site administrator.'); } $submit = curl_init($this->_paymentProcessor['url_site']); if (!$submit) { return self::error(9002, 'Could not initiate connection to payment gateway'); } curl_setopt($submit, CURLOPT_POST, TRUE); curl_setopt($submit, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($submit, CURLOPT_POSTFIELDS, implode('&', $postFields)); curl_setopt($submit, CURLOPT_SSL_VERIFYPEER, CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'verifySSL')); $response = curl_exec($submit); if (!$response) { return self::error(curl_errno($submit), curl_error($submit)); } curl_close($submit); $response_fields = $this->explode_csv($response); // check gateway MD5 response if (!$this->checkMD5($response_fields[37], $response_fields[6], $response_fields[9])) { return self::error(9003, 'MD5 Verification failed'); } // check for application errors // TODO: // AVS, CVV2, CAVV, and other verification results if ($response_fields[0] != self::AUTH_APPROVED) { $errormsg = $response_fields[2] . ' ' . $response_fields[3]; return self::error($response_fields[1], $errormsg); } // Success // test mode always returns trxn_id = 0 // also live mode in CiviCRM with test mode set in // Authorize.Net return $response_fields[6] = 0 // hence treat that also as test mode transaction // fix for CRM-2566 if ($this->_mode == 'test' || $response_fields[6] == 0) { $query = "SELECT MAX(trxn_id) FROM civicrm_contribution WHERE trxn_id LIKE 'test%'"; $p = array(); $trxn_id = strval(CRM_Core_Dao::singleValueQuery($query, $p)); $trxn_id = str_replace('test', '', $trxn_id); $trxn_id = intval($trxn_id) + 1; $params['trxn_id'] = sprintf('test%08d', $trxn_id); } else { $params['trxn_id'] = $response_fields[6]; } $params['gross_amount'] = $response_fields[9]; // TODO: include authorization code? return $params; }
/** * Function get date format * @param string $formatType Date name e.g. birth * * @return string $format */ static function getDateFormat($formatType = null) { $format = null; if ($formatType) { $format = CRM_Core_Dao::getFieldValue('CRM_Core_DAO_PreferencesDate', $formatType, 'date_format', 'name'); } if (!$format) { $config = CRM_Core_Config::singleton(); $format = $config->dateInputFormat; } return $format; }
/** * check the validity of the birth date (in qf format) * note that only a year is valid, or a mon-year or day-month is * also valid in addition to day-mon-year * * @param array $date * * @return bool true if valid date * @static * @access public */ static function qfBirthDate($date) { //if birth format is not set then execute qfDate function if (!CRM_Core_Dao::getFieldValue('CRM_Core_DAO_PreferencesDate', 'birth', 'format', 'name')) { return self::qfDate($date); } $config =& CRM_Core_Config::singleton(); $d = CRM_Utils_Array::value('d', $date); $m = CRM_Utils_Array::value($config->dateformatMonthVar, $date); $y = CRM_Utils_Array::value('Y', $date); if (!$d && !$m && !$y) { return true; } if (in_array('', $date)) { return false; } $day = $mon = 1; $year = 1000; if ($d) { $day = $d; } if ($m) { $mon = $m; } if ($y) { $year = $y; } if (!empty($day) || !empty($mon) || !empty($year)) { return checkdate($mon, $day, $year); } return false; }
/** * Function is used to format the individual contact values * * @param array $params (reference ) an assoc array of name/value pairs * @param array $contact contact object * * @return object CRM_Contact_BAO_Contact object * @access public * @static */ static function format(&$params, &$contact) { if (!self::dataExists($params)) { return; } $sortName = ""; $firstName = CRM_Utils_Array::value('first_name', $params, ''); $middleName = CRM_Utils_Array::value('middle_name', $params, ''); $lastName = CRM_Utils_Array::value('last_name', $params, ''); $prefix_id = CRM_Utils_Array::value('prefix_id', $params, ''); $suffix_id = CRM_Utils_Array::value('suffix_id', $params, ''); // get prefix and suffix names $prefixes = CRM_Core_PseudoConstant::individualPrefix(); $suffixes = CRM_Core_PseudoConstant::individualSuffix(); $prefix = $suffix = null; if ($prefix_id) { $prefix = $prefixes[$prefix_id]; } if ($suffix_id) { $suffix = $suffixes[$suffix_id]; } $params['is_deceased'] = CRM_Utils_Array::value('is_deceased', $params, false); if ($contact->id) { $individual =& new CRM_Contact_BAO_Contact(); $individual->id = $contact->id; if ($individual->find(true)) { //lets allow to update single name field though preserveDBName //but if db having null value and params contain value, CRM-4330. $useDBNames = array(); foreach (array('last', 'middle', 'first') as $name) { $dbName = "{$name}_name"; $value = $individual->{$dbName}; // the db has name values if ($value && CRM_Utils_Array::value('preserveDBName', $params)) { $useDBNames[] = $name; } } foreach (array('prefix', 'suffix') as $name) { $dbName = "{$name}_id"; $value = $individual->{$dbName}; if ($value && CRM_Utils_Array::value('preserveDBName', $params)) { $useDBNames[] = $name; } } // CRM-4430 //1. preserve db name if want //2. lets get value from param if exists. //3. if not in params, lets get from db. foreach (array('last', 'middle', 'first') as $name) { $phpName = "{$name}Name"; $dbName = "{$name}_name"; $value = $individual->{$dbName}; if (in_array($name, $useDBNames)) { $params[$dbName] = $value; $contact->{$dbName} = $value; ${$phpName} = $value; } else { if (array_key_exists($dbName, $params)) { ${$phpName} = $params[$dbName]; } else { if ($value) { ${$phpName} = $value; } } } } foreach (array('prefix', 'suffix') as $name) { $phpName = $name; $dbName = "{$name}_id"; $vals = "{$name}es"; $value = $individual->{$dbName}; if (in_array($name, $useDBNames)) { $params[$dbName] = $value; $contact->{$dbName} = $value; if ($value) { $temp = ${$vals}; ${$phpName} = $temp[$value]; } else { ${$phpName} = null; } } else { if (array_key_exists($dbName, $params)) { $temp = ${$vals}; // CRM-5278 if (!empty($params[$dbName])) { ${$phpName} = CRM_Utils_Array::value($params[$dbName], $temp); } } else { if ($value) { $temp = ${$vals}; ${$phpName} = $temp[$value]; } } } } } } if ($lastName || $firstName || $middleName) { if ($lastName && $firstName) { $contact->sort_name = trim("{$lastName}, {$firstName}"); } else { $contact->sort_name = trim("{$lastName} {$firstName}"); } $display_name = trim("{$prefix} {$firstName} {$middleName} {$lastName} {$suffix}"); $display_name = str_replace(' ', ' ', $display_name); } if (isset($display_name) && trim($display_name)) { $contact->display_name = trim($display_name); } if (CRM_Utils_Array::value('email', $params) && is_array($params['email'])) { foreach ($params['email'] as $emailBlock) { if (isset($emailBlock['is_primary'])) { $email = $emailBlock['email']; break; } } } $uniqId = CRM_Utils_Array::value('user_unique_id', $params); if (empty($contact->display_name)) { if (isset($email)) { $contact->display_name = $email; } else { if (isset($uniqId)) { $contact->display_name = $uniqId; } } } if (empty($contact->sort_name)) { if (isset($email)) { $contact->sort_name = $email; } else { if (isset($uniqId)) { $contact->sort_name = $uniqId; } } } $format = CRM_Core_Dao::getFieldValue('CRM_Core_DAO_PreferencesDate', 'birth', 'date_format', 'name'); if ($date = CRM_Utils_Array::value('birth_date', $params)) { if (in_array($format, array('dd/mm', 'mm/dd'))) { $date = "{$date}/1902"; } $contact->birth_date = CRM_Utils_Date::processDate($date); //$contact->birth_date = preg_replace('/[^0-9]/', '', $date); } else { if ($contact->birth_date) { $contact->birth_date = CRM_Utils_Date::isoToMysql($contact->birth_date); } } if ($date = CRM_Utils_Array::value('deceased_date', $params)) { if (in_array($format, array('dd/mm', 'mm/dd'))) { $date = "{$date}/1902"; } $contact->deceased_date = CRM_Utils_Date::processDate($date); } else { if ($contact->deceased_date) { $contact->deceased_date = CRM_Utils_Date::isoToMysql($contact->deceased_date); } } if ($middle_name = CRM_Utils_Array::value('middle_name', $params)) { $contact->middle_name = $middle_name; } return $contact; }
/** * Get rows for the event browser * * @param int $mailing_id ID of the mailing * @param int $job_id optional ID of the job * @param int $offset Offset * @param int $rowCount Number of rows * @param array $sort sort array * @return array Result set * @access public * @static */ public static function &getRows($mailing_id, $job_id = null, $offset = null, $rowCount = null, $sort = null) { $dao = new CRM_Core_Dao(); $queue = self::getTableName(); $mailing = CRM_Mailing_BAO_Mailing::getTableName(); $job = CRM_Mailing_BAO_Job::getTableName(); $contact = CRM_Contact_BAO_Contact::getTableName(); $email = CRM_Core_BAO_Email::getTableName(); $orderBy = "sort_name ASC, {$job}.start_date DESC"; if ($sort) { if (is_string($sort)) { $orderBy = $sort; } else { $orderBy = trim($sort->orderBy()); } } $query = "\n SELECT {$contact}.display_name as display_name,\n {$contact}.id as contact_id,\n {$email}.email as email,\n {$job}.start_date as date\n FROM {$contact}\n INNER JOIN {$queue}\n ON {$queue}.contact_id = {$contact}.id\n INNER JOIN {$email}\n ON {$queue}.email_id = {$email}.id\n INNER JOIN {$job}\n ON {$queue}.job_id = {$job}.id\n INNER JOIN {$mailing}\n ON {$job}.mailing_id = {$mailing}.id\n AND {$job}.is_test = 0\n WHERE {$mailing}.id = " . CRM_Utils_Type::escape($mailing_id, 'Integer'); if (!empty($job_id)) { $query .= " AND {$job}.id = " . CRM_Utils_Type::escape($job_id, 'Integer'); } $query .= " ORDER BY {$orderBy} "; if ($offset || $rowCount) { //Added "||$rowCount" to avoid displaying all records on first page $query .= ' LIMIT ' . CRM_Utils_Type::escape($offset, 'Integer') . ', ' . CRM_Utils_Type::escape($rowCount, 'Integer'); } $dao->query($query); $results = array(); while ($dao->fetch()) { $url = CRM_Utils_System::url('civicrm/contact/view', "reset=1&cid={$dao->contact_id}"); $results[] = array('name' => "<a href=\"{$url}\">{$dao->display_name}</a>", 'email' => $dao->email, 'date' => CRM_Utils_Date::customFormat($dao->date)); } return $results; }
static function hasPermission($pcpId = NULL, $contactId = NULL, $action = CRM_Core_Permission::EDIT, $teamPcpId = NULL) { if (empty($pcpId)) { if ($contactId) { if ($action == CRM_Core_Permission::VIEW) { // since get api is open now, we allow viewing member details return TRUE; } else { return $contactId == CRM_Pcpteams_Utils::getloggedInUserId() ? true : CRM_Contact_BAO_Contact_Permission::allow($contactId, $action); } } return FALSE; } $pcpOwnerContactId = CRM_Core_DAO::getFieldValue('CRM_PCP_DAO_PCP', $pcpId, 'contact_id'); $hasPermission = FALSE; if (empty($contactId)) { $contactId = CRM_Pcpteams_Utils::getloggedInUserId(); } // Check the pcp page which he is looking is the owner of pcp, then allow 'edit' permission if ($pcpOwnerContactId == $contactId) { return TRUE; } else { if ($action == CRM_Core_Permission::VIEW) { // Since PCP get api is opened, as long as pcpId is available then allow view permission if ($pcpId) { return TRUE; } //CASE 1: IF logged in user is trying to view team member's pcp page //CASE 1A: get all team pcps for logged in user $getUserTeamQuery = "\n SELECT cps.team_pcp_id FROM civicrm_value_pcp_custom_set cps \n INNER JOIN civicrm_pcp cp ON (cp.id = cps.entity_id)\n WHERE cp.contact_id = %1 AND cps.team_pcp_id IS NOT NULL\n "; $getUserTeamPcpDAO = CRM_Core_DAO::executeQuery($getUserTeamQuery, array(1 => array($contactId, 'Integer'))); $userTeamPcps = array(); while ($getUserTeamPcpDAO->fetch()) { //CASE 2: IF logged in user is admin OR member of pcp being viewed if ($getUserTeamPcpDAO->team_pcp_id == $pcpId) { return TRUE; } $userTeamPcps[] = $getUserTeamPcpDAO->team_pcp_id; } //CASE 1B: IF pcp being viewed is related to team-pcp via custom teamp-pcp-id OR under approval relationship if (!empty($userTeamPcps)) { $userTeamPcpIds = implode(', ', $userTeamPcps); $memberQuery = "\n SELECT cp.id\n FROM civicrm_pcp cp\n LEFT JOIN civicrm_value_pcp_custom_set cpcs ON (cp.id = cpcs.entity_id)\n LEFT JOIN civicrm_value_pcp_relationship_set crcs ON (cp.id = crcs.pcp_a_b)\n WHERE (cpcs.entity_id = %1 AND cpcs.team_pcp_id IN ({$userTeamPcpIds})) OR ( crcs.pcp_a_b = %1 AND crcs.pcp_b_a IN ({$userTeamPcpIds}))\n "; $memberPcp = CRM_Core_DAO::singleValueQuery($memberQuery, array(1 => array($pcpId, 'Integer'))); if ($memberPcp) { return TRUE; } } //CASE 3: IF pcp being viewed has been requested to be joined by logged in user (under approval) $relQuery = "\n SELECT cr.id \n FROM civicrm_relationship cr\n INNER JOIN civicrm_value_pcp_relationship_set crcs ON (cr.id = crcs.entity_id) \n WHERE cr.contact_id_a = %1 AND cr.contact_id_b = %2 AND cr.relationship_type_id = %3 AND crcs.pcp_b_a = %4\n "; $relTypeId = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_RelationshipType', CRM_Pcpteams_Constant::C_TEAM_RELATIONSHIP_TYPE, 'id', 'name_a_b'); $relQueryParams = array(1 => array($contactId, 'Integer'), 2 => array($pcpOwnerContactId, 'Integer'), 3 => array($relTypeId, 'Integer'), 4 => array($pcpId, 'Integer')); if (CRM_Core_DAO::singleValueQuery($relQuery, $relQueryParams)) { return TRUE; } //CASE 4: if admin is trying to view the pcp if (CRM_Contact_BAO_Contact_Permission::allow($pcpOwnerContactId, CRM_Core_Permission::VIEW)) { return TRUE; } } else { if ($action == CRM_Pcpteams_Constant::C_PERMISSION_MEMBER) { if ($pcpId && $teamPcpId) { //check pcp custom set $queryParams = array(1 => array($pcpId, 'Integer'), 2 => array($teamPcpId, 'Integer')); $query = "\n SELECT id FROM civicrm_value_pcp_custom_set \n WHERE entity_id = %1 AND team_pcp_id = %2\n "; $teamMemberExists = CRM_Core_Dao::singleValueQuery($query, $queryParams); if ($teamMemberExists) { return TRUE; } //check pcp relationship custom set $query = "\n SELECT id FROM civicrm_value_pcp_relationship_set\n WHERE pcp_a_b = %1 AND pcp_b_a = %2\n "; $teamMemberExists = CRM_Core_Dao::singleValueQuery($query, $queryParams); if ($teamMemberExists) { return TRUE; } } else { if ($pcpId && $contactId) { $query = "\n SELECT cs.id FROM civicrm_value_pcp_custom_set cs\n INNER JOIN civicrm_pcp cp ON cp.id = cs.entity_id \n INNER JOIN civicrm_contact cc ON cc.id = cp.contact_id\n WHERE cs.team_pcp_id = %1 AND cc.id = %2\n "; $queryParams = array(1 => array($pcpId, 'Integer'), 2 => array($contactId, 'Integer')); $teamMemberExists = CRM_Core_Dao::executeQuery($query, $queryParams); if ($teamMemberExists->fetch()) { return TRUE; } } } return FALSE; } else { if ($action == CRM_Pcpteams_Constant::C_PERMISSION_TEAM_ADMIN) { if ($pcpId && $contactId) { $query = "\n SELECT cs.id FROM civicrm_value_pcp_custom_set cs\n INNER JOIN civicrm_pcp mp ON mp.id = cs.entity_id\n INNER JOIN civicrm_pcp tp ON tp.id = cs.team_pcp_id\n INNER JOIN civicrm_contact tc ON tc.id = tp.contact_id\n INNER JOIN civicrm_relationship cr ON cr.contact_id_b = tc.id\n INNER JOIN civicrm_relationship_type crt on crt.id = cr.relationship_type_id\n WHERE cs.entity_id = %1 AND cr.contact_id_a = %2 AND crt.name_a_b = %3"; $queryParams = array(1 => array($pcpId, 'Integer'), 2 => array($contactId, 'Integer'), 3 => array(CRM_Pcpteams_Constant::C_TEAM_ADMIN_REL_TYPE, 'String')); if (CRM_Core_DAO::singleValueQuery($query, $queryParams)) { return TRUE; } if (CRM_Contact_BAO_Contact_Permission::allow($contactId, CRM_Core_Permission::EDIT)) { return TRUE; } } } else { if ($action == CRM_Core_Permission::EDIT) { // A. if logged in user ($contactId) is owner of pcp ($pcpId) it should have returned true in the beginning. // B. at this point we checking if logged in user ($contactId) is admin for team-contact ($pcpOwnerContactId) of pcp ($pcpId) $query = "\n SELECT cr.id FROM civicrm_relationship cr\n INNER JOIN civicrm_relationship_type crt ON (crt.id = cr.relationship_type_id)\n WHERE cr.contact_id_a = %1 AND cr.contact_id_b = %2 AND cr.is_active = %3 AND crt.name_a_b = %4"; $queryParams = array(1 => array($contactId, 'Integer'), 2 => array($pcpOwnerContactId, 'Integer'), 3 => array(1, 'Integer'), 4 => array(CRM_Pcpteams_Constant::C_TEAM_ADMIN_REL_TYPE, 'String')); if (CRM_Core_DAO::singleValueQuery($query, $queryParams)) { return TRUE; } if (CRM_Contact_BAO_Contact_Permission::allow($pcpOwnerContactId, CRM_Core_Permission::EDIT)) { return TRUE; } } } } } } return FALSE; }
/** * Function to convert mysql to date plugin format * * @param string $mysqlDate date string * * @return array $date and time */ static function setDateDefaults($mysqlDate = null, $formatType = null, $format = null, $timeFormat = null) { // if date is not passed assume it as today if (!$mysqlDate) { $mysqlDate = date('Y-m-d G:i:s'); } $config =& CRM_Core_Config::singleton(); if ($formatType) { $format = CRM_Core_Dao::getFieldValue('CRM_Core_DAO_PreferencesDate', $formatType, 'format', 'name'); } if (!$format) { $format = $config->dateInputFormat; } // get actual format $actualPHPFormats = CRM_Core_SelectValues::datePluginToPHPFormats(); $dateFormat = $actualPHPFormats[$format]; $date = date($dateFormat, strtotime($mysqlDate)); if (!$timeFormat) { $timeFormat = $config->timeInputFormat; } $actualTimeFormat = "g:iA"; $appendZeroLength = 7; if ($timeFormat > 1) { $actualTimeFormat = "G:i"; $appendZeroLength = 5; } $time = date($actualTimeFormat, strtotime($mysqlDate)); // need to append zero for hours < 10 if (strlen($time) < $appendZeroLength) { $time = '0' . $time; } return array($date, $time); }