/** * Takes an associative array and creates a contribution object. * * @param array $params * (reference ) an assoc array of name/value pairs. * @param array $ids * The array that holds all the db ids. * * @return CRM_Contribute_BAO_Contribution */ public static function create(&$params, $ids = array()) { $dateFields = array('receive_date', 'cancel_date', 'receipt_date', 'thankyou_date'); foreach ($dateFields as $df) { if (isset($params[$df])) { $params[$df] = CRM_Utils_Date::isoToMysql($params[$df]); } } $transaction = new CRM_Core_Transaction(); $contribution = self::add($params, $ids); if (is_a($contribution, 'CRM_Core_Error')) { $transaction->rollback(); return $contribution; } $params['contribution_id'] = $contribution->id; if (!empty($params['custom']) && is_array($params['custom'])) { CRM_Core_BAO_CustomValueTable::store($params['custom'], 'civicrm_contribution', $contribution->id); } $session = CRM_Core_Session::singleton(); if (!empty($params['note'])) { $noteParams = array('entity_table' => 'civicrm_contribution', 'note' => $params['note'], 'entity_id' => $contribution->id, 'contact_id' => $session->get('userID'), 'modified_date' => date('Ymd')); if (!$noteParams['contact_id']) { $noteParams['contact_id'] = $params['contact_id']; } CRM_Core_BAO_Note::add($noteParams); } // make entry in batch entity batch table if (!empty($params['batch_id'])) { // in some update cases we need to get extra fields - ie an update that doesn't pass in all these params $titleFields = array('contact_id', 'total_amount', 'currency', 'financial_type_id'); $retrieveRequired = 0; foreach ($titleFields as $titleField) { if (!isset($contribution->{$titleField})) { $retrieveRequired = 1; break; } } if ($retrieveRequired == 1) { $contribution->find(TRUE); } } // Handle soft credit and / or link to personal campaign page $softIDs = CRM_Contribute_BAO_ContributionSoft::getSoftCreditIds($contribution->id); $pcpId = CRM_Contribute_BAO_ContributionSoft::getSoftCreditIds($contribution->id, TRUE); if ($pcp = CRM_Utils_Array::value('pcp', $params)) { $softParams = array(); $softParams['id'] = $pcpId ? $pcpId : NULL; $softParams['contribution_id'] = $contribution->id; $softParams['pcp_id'] = $pcp['pcp_made_through_id']; $softParams['contact_id'] = CRM_Core_DAO::getFieldValue('CRM_PCP_DAO_PCP', $pcp['pcp_made_through_id'], 'contact_id'); $softParams['currency'] = $contribution->currency; $softParams['amount'] = $contribution->total_amount; $softParams['pcp_display_in_roll'] = CRM_Utils_Array::value('pcp_display_in_roll', $pcp); $softParams['pcp_roll_nickname'] = CRM_Utils_Array::value('pcp_roll_nickname', $pcp); $softParams['pcp_personal_note'] = CRM_Utils_Array::value('pcp_personal_note', $pcp); $softParams['soft_credit_type_id'] = CRM_Core_OptionGroup::getValue('soft_credit_type', 'pcp', 'name'); $contributionSoft = CRM_Contribute_BAO_ContributionSoft::add($softParams); //Send notification to owner for PCP if ($contributionSoft->pcp_id && empty($pcpId)) { CRM_Contribute_Form_Contribution_Confirm::pcpNotifyOwner($contribution, $contributionSoft); } } elseif (array_key_exists('pcp', $params) && $pcpId) { $deleteParams = array('id' => $pcpId); CRM_Contribute_BAO_ContributionSoft::del($deleteParams); } if (isset($params['soft_credit'])) { $softParams = $params['soft_credit']; foreach ($softParams as $softParam) { if (!empty($softIDs)) { $key = key($softIDs); $softParam['id'] = $softIDs[$key]; unset($softIDs[$key]); } $softParam['contribution_id'] = $contribution->id; $softParam['currency'] = $contribution->currency; //case during Contribution Import when we assign soft contribution amount as contribution's total_amount by default if (empty($softParam['amount'])) { $softParam['amount'] = $contribution->total_amount; } CRM_Contribute_BAO_ContributionSoft::add($softParam); } if (!empty($softIDs)) { foreach ($softIDs as $softID) { if (!in_array($softID, $params['soft_credit_ids'])) { $deleteParams = array('id' => $softID); CRM_Contribute_BAO_ContributionSoft::del($deleteParams); } } } } $transaction->commit(); // check if activity record exist for this contribution, if // not add activity $activity = new CRM_Activity_DAO_Activity(); $activity->source_record_id = $contribution->id; $activity->activity_type_id = CRM_Core_OptionGroup::getValue('activity_type', 'Contribution', 'name'); if (!$activity->find(TRUE)) { if (empty($contribution->contact_id)) { $contribution->find(TRUE); } CRM_Activity_BAO_Activity::addActivity($contribution, 'Offline'); } else { // CRM-13237 : if activity record found, update it with campaign id of contribution CRM_Core_DAO::setFieldValue('CRM_Activity_BAO_Activity', $activity->id, 'campaign_id', $contribution->campaign_id); } // do not add to recent items for import, CRM-4399 if (empty($params['skipRecentView'])) { $url = CRM_Utils_System::url('civicrm/contact/view/contribution', "action=view&reset=1&id={$contribution->id}&cid={$contribution->contact_id}&context=home"); // in some update cases we need to get extra fields - ie an update that doesn't pass in all these params $titleFields = array('contact_id', 'total_amount', 'currency', 'financial_type_id'); $retrieveRequired = 0; foreach ($titleFields as $titleField) { if (!isset($contribution->{$titleField})) { $retrieveRequired = 1; break; } } if ($retrieveRequired == 1) { $contribution->find(TRUE); } $contributionTypes = CRM_Contribute_PseudoConstant::financialType(); $title = CRM_Contact_BAO_Contact::displayName($contribution->contact_id) . ' - (' . CRM_Utils_Money::format($contribution->total_amount, $contribution->currency) . ' ' . ' - ' . $contributionTypes[$contribution->financial_type_id] . ')'; $recentOther = array(); if (CRM_Core_Permission::checkActionPermission('CiviContribute', CRM_Core_Action::UPDATE)) { $recentOther['editUrl'] = CRM_Utils_System::url('civicrm/contact/view/contribution', "action=update&reset=1&id={$contribution->id}&cid={$contribution->contact_id}&context=home"); } if (CRM_Core_Permission::checkActionPermission('CiviContribute', CRM_Core_Action::DELETE)) { $recentOther['deleteUrl'] = CRM_Utils_System::url('civicrm/contact/view/contribution', "action=delete&reset=1&id={$contribution->id}&cid={$contribution->contact_id}&context=home"); } // add the recently created Contribution CRM_Utils_Recent::add($title, $url, $contribution->id, 'Contribution', $contribution->contact_id, NULL, $recentOther); } return $contribution; }