Import from SVN (r45945, r596)
[civicrm-core.git] / CRM / Friend / BAO / Friend.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.3 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2013 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
13 | |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
18 | |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
26 */
27
28 /**
29 *
30 * @package CRM
31 * @copyright CiviCRM LLC (c) 2004-2013
32 * $Id$
33 *
34 */
35
36 /**
37 * This class contains the funtions for Friend
38 *
39 */
40 class CRM_Friend_BAO_Friend extends CRM_Friend_DAO_Friend {
41 function __construct() {
42 parent::__construct();
43 }
44
45 /**
46 * takes an associative array and creates a friend object
47 *
48 * the function extract all the params it needs to initialize the create a
49 * friend object. the params array could contain additional unused name/value
50 * pairs
51 *
52 * @param array $params (reference ) an assoc array of name/value pairs
53 *
54 * @return object CRM_Friend_BAO_Friend object
55 * @access public
56 * @static
57 */
58 static function add(&$params) {
59 $friend = CRM_Contact_BAO_Contact::createProfileContact($params, CRM_Core_DAO::$_nullArray);
60 return $friend;
61 }
62
63 /**
64 * Given the list of params in the params array, fetch the object
65 * and store the values in the values array
66 *
67 * @param array $params input parameters to find object
68 * @param array $values output values of the object
69 *
70 * @return array $values values
71 * @access public
72 * @static
73 */
74 static function retrieve(&$params, &$values) {
75 $friend = new CRM_Friend_DAO_Friend();
76
77 $friend->copyValues($params);
78
79 $friend->find(TRUE);
80
81 CRM_Core_DAO::storeValues($friend, $values);
82
83 return $values;
84 }
85
86 /**
87 * takes an associative array and creates a friend object
88 *
89 * @param array $params (reference ) an assoc array of name/value pairs
90 *
91 * @return object CRM_Contact_BAO_Contact object
92 * @access public
93 * @static
94 */
95 static function create(&$params) {
96 $transaction = new CRM_Core_Transaction();
97
98 $mailParams = array();
99 //create contact corresponding to each friend
100 foreach ($params['friend'] as $key => $details) {
101 if ($details["first_name"]) {
102 $contactParams[$key] = array(
103 'first_name' => $details["first_name"],
104 'last_name' => $details["last_name"],
105 'contact_source' => ts('Tell a Friend') . ": {$params['title']}",
106 'email-Primary' => $details["email"],
107 );
108
109 $displayName = $details["first_name"] . " " . $details["last_name"];
110 $mailParams['email'][$displayName] = $details["email"];
111 }
112 }
113
114 $frndParams = array();
115 $frndParams['entity_id'] = $params['entity_id'];
116 $frndParams['entity_table'] = $params['entity_table'];
117 self::getValues($frndParams);
118
119
120 $activityTypeId = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_OptionValue', 'Tell a Friend', 'value', 'name');
121
122 //create activity
123 $activityParams = array(
124 'source_contact_id' => $params['source_contact_id'],
125 'source_record_id' => NULL,
126 'activity_type_id' => $activityTypeId,
127 'title' => $params['title'],
128 'activity_date_time' => date("YmdHis"),
129 'subject' => ts('Tell a Friend') . ": {$params['title']}",
130 'details' => $params['suggested_message'],
131 'status_id' => 2,
132 'is_test' => $params['is_test'],
133 'campaign_id' => CRM_Utils_Array::value('campaign_id', $params),
134 );
135
136 //activity creation
137 $activity = CRM_Activity_BAO_Activity::create($activityParams);
138
139 //friend contacts creation
140 foreach ($contactParams as $key => $value) {
141
142 //create contact only if it does not exits in db
143 $value['email'] = $value['email-Primary'];
144 $value['check_permission'] = FALSE;
145 $contact = CRM_Core_BAO_UFGroup::findContact($value, NULL, 'Individual');
146
147 if (!$contact) {
148 $contact = self::add($value);
149 }
150
151 // attempt to save activity targets
152 $targetParams = array(
153 'activity_id' => $activity->id,
154 'target_contact_id' => $contact,
155 );
156 // See if it already exists
157 $activity_target = new CRM_Activity_DAO_ActivityTarget();
158 $activity_target->activity_id = $activity->id;
159 $activity_target->target_contact_id = $contact;
160 $activity_target->find(TRUE);
161 if (empty($activity_target->id)) {
162 $resultTarget = CRM_Activity_BAO_ActivityTarget::create($targetParams);
163 }
164 }
165
166 $transaction->commit();
167
168 //process sending of mails
169 $mailParams['title'] = CRM_Utils_Array::value('title', $params);
170 $mailParams['general_link'] = CRM_Utils_Array::value('general_link', $frndParams);
171 $mailParams['message'] = CRM_Utils_Array::value('suggested_message', $params);
172
173 // get domain
174 $domainDetails = CRM_Core_BAO_Domain::getNameAndEmail();
175 list($username, $mailParams['domain']) = explode('@', $domainDetails[1]);
176
177 $default = array();
178 $findProperties = array('id' => $params['entity_id']);
179
180 if ($params['entity_table'] == 'civicrm_contribution_page') {
181
182 $returnProperties = array('receipt_from_email', 'is_email_receipt');
183 CRM_Core_DAO::commonRetrieve('CRM_Contribute_DAO_ContributionPage',
184 $findProperties,
185 $default,
186 $returnProperties
187 );
188 //if is_email_receipt is set then take receipt_from_email
189 //as from_email
190 if (CRM_Utils_Array::value('is_email_receipt', $default) && CRM_Utils_Array::value('receipt_from_email', $default)) {
191 $mailParams['email_from'] = $default['receipt_from_email'];
192 }
193
194 $urlPath = 'civicrm/contribute/transact';
195 $mailParams['module'] = 'contribute';
196 }
197 elseif ($params['entity_table'] == 'civicrm_event') {
198
199 $returnProperties = array('confirm_from_email', 'is_email_confirm');
200 CRM_Core_DAO::commonRetrieve('CRM_Event_DAO_Event',
201 $findProperties,
202 $default,
203 $returnProperties
204 );
205
206 $mailParams['email_from'] = $domainDetails['1'];
207
208 //if is_email_confirm is set then take confirm_from_email
209 //as from_email
210 if (CRM_Utils_Array::value('is_email_confirm', $default) && CRM_Utils_Array::value('confirm_from_email', $default)) {
211 $mailParams['email_from'] = $default['confirm_from_email'];
212 }
213
214 $urlPath = 'civicrm/event/info';
215 $mailParams['module'] = 'event';
216 }
217 elseif ($params['entity_table'] == 'civicrm_pcp') {
218 $mailParams['email_from'] = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Email', $params['source_contact_id'],
219 'email', 'contact_id'
220 );
221 $urlPath = 'civicrm/pcp/info';
222 $mailParams['module'] = 'contribute';
223 }
224
225 $mailParams['page_url'] = CRM_Utils_System::url($urlPath, "reset=1&id={$params['entity_id']}", TRUE, NULL, FALSE, TRUE);
226
227 //send mail
228 self::sendMail($params['source_contact_id'], $mailParams);
229 }
230
231 /**
232 * Function to build the form
233 *
234 * @param object $form form object
235 *
236 * @return None
237 * @access public
238 */
239 function buildFriendForm($form) {
240 $form->addElement('checkbox', 'tf_is_active', ts('Tell a Friend enabled?'), NULL, array('onclick' => "friendBlock(this)"));
241 // name
242 $form->add('text', 'tf_title', ts('Title'), CRM_Core_DAO::getAttribute('CRM_Friend_DAO_Friend', 'title'), TRUE);
243
244 // intro-text and thank-you text
245 $form->addWysiwyg('intro', ts('Introduction'), CRM_Core_DAO::getAttribute('CRM_Friend_DAO_Friend', 'intro'), TRUE);
246
247 $form->add('textarea', 'suggested_message', ts('Suggested Message'),
248 CRM_Core_DAO::getAttribute('CRM_Friend_DAO_Friend', 'suggested_message'), FALSE
249 );
250
251 $form->add('text', 'general_link', ts('Info Page Link'), CRM_Core_DAO::getAttribute('CRM_Friend_DAO_Friend', 'general_link'));
252
253 $form->add('text', 'tf_thankyou_title', ts('Thank-you Title'), CRM_Core_DAO::getAttribute('CRM_Friend_DAO_Friend', 'thankyou_title'), TRUE);
254
255 $form->addWysiwyg('tf_thankyou_text', ts('Thank-you Message'), CRM_Core_DAO::getAttribute('CRM_Friend_DAO_Friend', 'thankyou_text'), TRUE);
256 }
257
258 /**
259 * The function sets the deafult values of the form.
260 *
261 * @param array $defaults (reference) the default values.
262 *
263 * @return booelan whether anything was found
264 */
265 static function getValues(&$defaults) {
266 if (empty($defaults)) {
267 return NULL;
268 }
269 $friend = new CRM_Friend_BAO_Friend();
270 $friend->copyValues($defaults);
271 $found = $friend->find(TRUE);
272 CRM_Core_DAO::storeValues($friend, $defaults);
273 return $found;
274 }
275
276 /**
277 * Process that send tell a friend e-mails
278 *
279 * @params int $contactId contact id
280 * @params array $values associative array of name/value pair
281 *
282 * @return void
283 * @access public
284 */
285 static function sendMail($contactID, &$values) {
286 list($fromName, $email) = CRM_Contact_BAO_Contact::getContactDetails($contactID);
287 // if no $fromName (only email collected from originating contact) - list returns single space
288 if (trim($fromName) == '') {
289 $fromName = $email;
290 }
291
292 // use contact email, CRM-4963
293 if (!CRM_Utils_Array::value('email_from', $values)) {
294 $values['email_from'] = $email;
295 }
296
297 foreach ($values['email'] as $displayName => $emailTo) {
298 if ($emailTo) {
299 // FIXME: factor the below out of the foreach loop
300 CRM_Core_BAO_MessageTemplates::sendTemplate(
301 array(
302 'groupName' => 'msg_tpl_workflow_friend',
303 'valueName' => 'friend',
304 'contactId' => $contactID,
305 'tplParams' => array(
306 $values['module'] => $values['module'],
307 'senderContactName' => $fromName,
308 'title' => $values['title'],
309 'generalLink' => $values['general_link'],
310 'pageURL' => $values['page_url'],
311 'senderMessage' => $values['message'],
312 ),
313 'from' => "$fromName (via {$values['domain']}) <{$values['email_from']}>",
314 'toName' => $displayName,
315 'toEmail' => $emailTo,
316 'replyTo' => $email,
317 )
318 );
319 }
320 }
321 }
322
323 /**
324 * takes an associative array and creates a tell a friend object
325 *
326 * the function extract all the params it needs to initialize the create/edit a
327 * friend object. the params array could contain additional unused name/value
328 * pairs
329 *
330 * @param array $params (reference ) an assoc array of name/value pairs
331 *
332 * @return object CRM_Friend_BAO_Friend object
333 * @access public
334 * @static
335 */
336 static function addTellAFriend(&$params) {
337 $friendDAO = new CRM_Friend_DAO_Friend();
338
339 $friendDAO->copyValues($params);
340 $friendDAO->is_active = CRM_Utils_Array::value('is_active', $params, FALSE);
341
342 $friendDAO->save();
343
344 return $friendDAO;
345 }
346 }
347