Merge branch '4.6' into 'master'
[civicrm-core.git] / CRM / Contribute / Form / Task / Invoice.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.6 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2015 |
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-2015
32 */
33
34 /**
35 * This class provides the functionality to email a group of
36 * contacts.
37 */
38 class CRM_Contribute_Form_Task_Invoice extends CRM_Contribute_Form_Task {
39 /**
40 * Are we operating in "single mode", i.e. updating the task of only
41 * one specific contribution?
42 *
43 * @var boolean
44 */
45 public $_single = FALSE;
46
47 /**
48 * Gives all the statues for conribution.
49 */
50 public $_contributionStatusId;
51
52 /**
53 * Gives the HTML template of PDF Invoice.
54 */
55 public $_messageInvoice;
56
57 /**
58 * This variable is used to assign parameters for HTML template of PDF Invoice.
59 */
60 public $_invoiceTemplate;
61
62 /**
63 * Selected output.
64 */
65 public $_selectedOutput;
66
67 /**
68 * Build all the data structures needed to build the form.
69 *
70 * @return void
71 */
72 public function preProcess() {
73 $id = CRM_Utils_Request::retrieve('id', 'Positive', $this, FALSE);
74 if ($id) {
75 $this->_contributionIds = array($id);
76 $this->_componentClause = " civicrm_contribution.id IN ( $id ) ";
77 $this->_single = TRUE;
78 $this->assign('totalSelectedContributions', 1);
79
80 // set the redirection after actions
81 $contactId = CRM_Utils_Request::retrieve('cid', 'Positive', $this, FALSE);
82 $url = CRM_Utils_System::url('civicrm/contact/view/contribution',
83 "action=view&reset=1&id={$id}&cid={$contactId}&context=contribution&selectedChild=contribute"
84 );
85
86 CRM_Core_Session::singleton()->pushUserContext($url);
87 }
88 else {
89 parent::preProcess();
90 }
91
92 // check that all the contribution ids have status Completed, Pending, Refunded.
93 $this->_contributionStatusId = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
94 $status = array('Completed', 'Pending', 'Refunded');
95 $statusId = array();
96 foreach ($this->_contributionStatusId as $key => $value) {
97 if (in_array($value, $status)) {
98 $statusId[] = $key;
99 }
100 }
101 $Id = implode(",", $statusId);
102 $query = "SELECT count(*) FROM civicrm_contribution WHERE contribution_status_id NOT IN ($Id) AND {$this->_componentClause}";
103 $count = CRM_Core_DAO::singleValueQuery($query);
104 if ($count != 0) {
105 CRM_Core_Error::statusBounce(ts('Please select only contributions with Completed, Pending, Refunded status.'));
106 }
107
108 // we have all the contribution ids, so now we get the contact ids
109 parent::setContactIDs();
110 $this->assign('single', $this->_single);
111
112 $qfKey = CRM_Utils_Request::retrieve('qfKey', 'String', $this);
113 $urlParams = 'force=1';
114 if (CRM_Utils_Rule::qfKey($qfKey)) {
115 $urlParams .= "&qfKey=$qfKey";
116 }
117
118 $url = CRM_Utils_System::url('civicrm/contribute/search', $urlParams);
119 $breadCrumb = array(
120 array(
121 'url' => $url,
122 'title' => ts('Search Results'),
123 ),
124 );
125
126 CRM_Utils_System::appendBreadCrumb($breadCrumb);
127
128 $this->_selectedOutput = CRM_Utils_Request::retrieve('select', 'String', $this);
129 $this->assign('selectedOutput', $this->_selectedOutput);
130
131 if ($this->_selectedOutput == 'email') {
132 CRM_Utils_System::setTitle(ts('Email Invoice'));
133 }
134 else {
135 CRM_Utils_System::setTitle(ts('Print Contribution Invoice'));
136 }
137 }
138
139 /**
140 * Build the form object.
141 *
142 *
143 * @return void
144 */
145 public function buildQuickForm() {
146 $session = CRM_Core_Session::singleton();
147 if (CRM_Core_Permission::check('administer CiviCRM')) {
148 $this->assign('isAdmin', 1);
149 }
150 $contactID = $session->get('userID');
151 $contactEmails = CRM_Core_BAO_Email::allEmails($contactID);
152 $emails = array();
153 $fromDisplayName = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact',
154 $contactID, 'display_name'
155 );
156 foreach ($contactEmails as $emailId => $item) {
157 $email = $item['email'];
158 if ($email) {
159 $emails[$emailId] = '"' . $fromDisplayName . '" <' . $email . '> ';
160 }
161 if (isset($emails[$emailId])) {
162 $emails[$emailId] .= $item['locationType'];
163 if ($item['is_primary']) {
164 $emails[$emailId] .= ' ' . ts('(preferred)');
165 }
166 $emails[$emailId] = htmlspecialchars($emails[$emailId]);
167 }
168 }
169 $fromEmailAddress = CRM_Core_OptionGroup::values('from_email_address');
170 foreach ($fromEmailAddress as $key => $email) {
171 $fromEmailAddress[$key] = htmlspecialchars($fromEmailAddress[$key]);
172 }
173 $fromEmail = CRM_Utils_Array::crmArrayMerge($emails, $fromEmailAddress);
174 $this->add('select', 'from_email_address', ts('From Email Address'), array('' => '- select -') + $fromEmail);
175 if ($this->_selectedOutput != 'email') {
176 $this->addElement('radio', 'output', NULL, ts('Email Invoice'), 'email_invoice');
177 $this->addElement('radio', 'output', NULL, ts('PDF Invoice'), 'pdf_invoice');
178 $this->addRule('output', ts('Selection required'), 'required');
179 $this->addFormRule(array('CRM_Contribute_Form_Task_Invoice', 'formRule'));
180 }
181 else {
182 $this->addRule('from_email_address', ts('From Email Address is required'), 'required');
183 }
184
185 $this->add('wysiwyg', 'email_comment', ts('If you would like to add personal message to email please add it here. (If sending to more then one receipient the same message will be sent to each contact.)'), array(
186 'rows' => 2,
187 'cols' => 40,
188 ));
189
190 $this->addButtons(array(
191 array(
192 'type' => 'upload',
193 'name' => $this->_selectedOutput == 'email' ? ts('Send Email') : ts('Process Invoice(s)'),
194 'isDefault' => TRUE,
195 ),
196 array(
197 'type' => 'cancel',
198 'name' => ts('Cancel'),
199 ),
200 )
201 );
202 }
203
204 /**
205 * Global validation rules for the form.
206 *
207 * @param array $values
208 *
209 * @return array
210 * list of errors to be posted back to the form
211 */
212 public static function formRule($values) {
213 $errors = array();
214
215 if ($values['output'] == 'email_invoice' && empty($values['from_email_address'])) {
216 $errors['from_email_address'] = ts("From Email Address is required");
217 }
218
219 return $errors;
220 }
221
222 /**
223 * Process the form after the input has been submitted and validated.
224 *
225 *
226 * @return void
227 */
228 public function postProcess() {
229 $params = $this->controller->exportValues($this->_name);
230 $this->printPDF($this->_contributionIds, $params, $this->_contactIds, $this);
231 }
232
233 /**
234 * Process the PDf and email with activity and attachment.
235 * on click of Print Invoices
236 *
237 * @param array $contribIDs
238 * Contribution Id.
239 * @param array $params
240 * Associated array of submitted values.
241 * @param array $contactIds
242 * Contact Id.
243 * @param CRM_Core_Form $form
244 * Form object.
245 */
246 public static function printPDF($contribIDs, &$params, $contactIds, &$form) {
247 // get all the details needed to generate a invoice
248 $messageInvoice = array();
249 $invoiceTemplate = CRM_Core_Smarty::singleton();
250 $invoiceElements = CRM_Contribute_Form_Task_PDF::getElements($contribIDs, $params, $contactIds);
251
252 // gives the status id when contribution status is 'Refunded'
253 $contributionStatusID = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
254 $refundedStatusId = CRM_Utils_Array::key('Refunded', $contributionStatusID);
255
256 // getting data from admin page
257 $prefixValue = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::CONTRIBUTE_PREFERENCES_NAME, 'contribution_invoice_settings');
258
259 foreach ($invoiceElements['details'] as $contribID => $detail) {
260 $input = $ids = $objects = array();
261 if (in_array($detail['contact'], $invoiceElements['excludeContactIds'])) {
262 continue;
263 }
264
265 $input['component'] = $detail['component'];
266
267 $ids['contact'] = $detail['contact'];
268 $ids['contribution'] = $contribID;
269 $ids['contributionRecur'] = NULL;
270 $ids['contributionPage'] = NULL;
271 $ids['membership'] = CRM_Utils_Array::value('membership', $detail);
272 $ids['participant'] = CRM_Utils_Array::value('participant', $detail);
273 $ids['event'] = CRM_Utils_Array::value('event', $detail);
274
275 if (!$invoiceElements['baseIPN']->validateData($input, $ids, $objects, FALSE)) {
276 CRM_Core_Error::fatal();
277 }
278
279 $contribution = &$objects['contribution'];
280
281 $input['amount'] = $contribution->total_amount;
282 $input['invoice_id'] = $contribution->invoice_id;
283 $input['receive_date'] = $contribution->receive_date;
284 $input['contribution_status_id'] = $contribution->contribution_status_id;
285 $input['organization_name'] = $contribution->_relatedObjects['contact']->organization_name;
286
287 $objects['contribution']->receive_date = CRM_Utils_Date::isoToMysql($objects['contribution']->receive_date);
288
289 $addressParams = array('contact_id' => $contribution->contact_id);
290 $addressDetails = CRM_Core_BAO_Address::getValues($addressParams);
291
292 // to get billing address if present
293 $billingAddress = array();
294 foreach ($addressDetails as $key => $address) {
295 if ((isset($address['is_billing']) && $address['is_billing'] == 1) && (isset($address['is_primary']) && $address['is_primary'] == 1) && $address['contact_id'] == $contribution->contact_id) {
296 $billingAddress[$address['contact_id']] = $address;
297 break;
298 }
299 elseif (($address['is_billing'] == 0 && $address['is_primary'] == 1) || (isset($address['is_billing']) && $address['is_billing'] == 1) && $address['contact_id'] == $contribution->contact_id) {
300 $billingAddress[$address['contact_id']] = $address;
301 }
302 }
303
304 if (!empty($billingAddress[$contribution->contact_id]['state_province_id'])) {
305 $stateProvinceAbbreviation = CRM_Core_PseudoConstant::stateProvinceAbbreviation($billingAddress[$contribution->contact_id]['state_province_id']);
306 }
307 else {
308 $stateProvinceAbbreviation = '';
309 }
310
311 if ($contribution->contribution_status_id == $refundedStatusId) {
312 $creditNoteId = CRM_Utils_Array::value('credit_notes_prefix', $prefixValue) . "" . $contribution->id;
313 }
314 $invoiceId = CRM_Utils_Array::value('invoice_prefix', $prefixValue) . "" . $contribution->id;
315
316 //to obtain due date for PDF invoice
317 $contributionReceiveDate = date('F j,Y', strtotime(date($input['receive_date'])));
318 $invoiceDate = date("F j, Y");
319 $dueDate = date('F j ,Y', strtotime($contributionReceiveDate . "+" . $prefixValue['due_date'] . "" . $prefixValue['due_date_period']));
320
321 if ($input['component'] == 'contribute') {
322 $eid = $contribID;
323 $etable = 'contribution';
324 $lineItem = CRM_Price_BAO_LineItem::getLineItems($eid, $etable, NULL, TRUE, TRUE);
325 }
326 else {
327 $eid = $contribution->_relatedObjects['participant']->id;
328 $etable = 'participant';
329 $lineItem = CRM_Price_BAO_LineItem::getLineItems($eid, $etable, NULL, TRUE, FALSE, '', TRUE);
330 }
331
332 //TO DO: Need to do changes for partially paid to display amount due on PDF invoice
333 $amountDue = ($input['amount'] - $input['amount']);
334
335 // retreiving the subtotal and sum of same tax_rate
336 $dataArray = array();
337 $subTotal = 0;
338 foreach ($lineItem as $entity_id => $taxRate) {
339 if (isset($dataArray[(string) $taxRate['tax_rate']])) {
340 $dataArray[(string) $taxRate['tax_rate']] = $dataArray[(string) $taxRate['tax_rate']] + CRM_Utils_Array::value('tax_amount', $taxRate);
341 }
342 else {
343 $dataArray[(string) $taxRate['tax_rate']] = CRM_Utils_Array::value('tax_amount', $taxRate);
344 }
345 $subTotal += CRM_Utils_Array::value('subTotal', $taxRate);
346 }
347
348 // to email the invoice
349 $mailDetails = array();
350 $values = array();
351 if ($contribution->_component == 'event') {
352 $daoName = 'CRM_Event_DAO_Event';
353 $pageId = $contribution->_relatedObjects['event']->id;
354 $mailElements = array(
355 'title',
356 'confirm_from_name',
357 'confirm_from_email',
358 'cc_confirm',
359 'bcc_confirm',
360 );
361 CRM_Core_DAO::commonRetrieveAll($daoName, 'id', $pageId, $mailDetails, $mailElements);
362 $values['title'] = CRM_Utils_Array::value('title', $mailDetails[$contribution->_relatedObjects['event']->id]);
363 $values['confirm_from_name'] = CRM_Utils_Array::value('confirm_from_name', $mailDetails[$contribution->_relatedObjects['event']->id]);
364 $values['confirm_from_email'] = CRM_Utils_Array::value('confirm_from_email', $mailDetails[$contribution->_relatedObjects['event']->id]);
365 $values['cc_confirm'] = CRM_Utils_Array::value('cc_confirm', $mailDetails[$contribution->_relatedObjects['event']->id]);
366 $values['bcc_confirm'] = CRM_Utils_Array::value('bcc_confirm', $mailDetails[$contribution->_relatedObjects['event']->id]);
367
368 $title = CRM_Utils_Array::value('title', $mailDetails[$contribution->_relatedObjects['event']->id]);
369 }
370 elseif ($contribution->_component == 'contribute') {
371 $daoName = 'CRM_Contribute_DAO_ContributionPage';
372 $pageId = $contribution->contribution_page_id;
373 $mailElements = array(
374 'title',
375 'receipt_from_name',
376 'receipt_from_email',
377 'cc_receipt',
378 'bcc_receipt',
379 );
380 CRM_Core_DAO::commonRetrieveAll($daoName, 'id', $pageId, $mailDetails, $mailElements);
381
382 $values['title'] = CRM_Utils_Array::value('title', CRM_Utils_Array::value($contribution->contribution_page_id, $mailDetails));
383 $values['receipt_from_name'] = CRM_Utils_Array::value('receipt_from_name', CRM_Utils_Array::value($contribution->contribution_page_id, $mailDetails));
384 $values['receipt_from_email'] = CRM_Utils_Array::value('receipt_from_email', CRM_Utils_Array::value($contribution->contribution_page_id, $mailDetails));
385 $values['cc_receipt'] = CRM_Utils_Array::value('cc_receipt', CRM_Utils_Array::value($contribution->contribution_page_id, $mailDetails));
386 $values['bcc_receipt'] = CRM_Utils_Array::value('bcc_receipt', CRM_Utils_Array::value($contribution->contribution_page_id, $mailDetails));
387
388 $title = CRM_Utils_Array::value('title', CRM_Utils_Array::value($contribution->contribution_page_id, $mailDetails));
389 }
390 $source = $contribution->source;
391
392 $config = CRM_Core_Config::singleton();
393 if (!isset($params['forPage'])) {
394 $config->doNotAttachPDFReceipt = 1;
395 }
396
397 // get organization address
398 $domain = CRM_Core_BAO_Domain::getDomain();
399 $locParams = array('contact_id' => $domain->id);
400 $locationDefaults = CRM_Core_BAO_Location::getValues($locParams);
401 if (isset($locationDefaults['address'][1]['state_province_id'])) {
402 $stateProvinceAbbreviationDomain = CRM_Core_PseudoConstant::stateProvinceAbbreviation($locationDefaults['address'][1]['state_province_id']);
403 }
404 else {
405 $stateProvinceAbbreviationDomain = '';
406 }
407 if (isset($locationDefaults['address'][1]['country_id'])) {
408 $countryDomain = CRM_Core_PseudoConstant::country($locationDefaults['address'][1]['country_id']);
409 }
410 else {
411 $countryDomain = '';
412 }
413
414 // parameters to be assign for template
415 $tplParams = array(
416 'title' => $title,
417 'component' => $input['component'],
418 'id' => $contribution->id,
419 'source' => $source,
420 'invoice_id' => $invoiceId,
421 'resourceBase' => $config->userFrameworkResourceURL,
422 'defaultCurrency' => $config->defaultCurrency,
423 'amount' => $contribution->total_amount,
424 'amountDue' => $amountDue,
425 'invoice_date' => $invoiceDate,
426 'dueDate' => $dueDate,
427 'notes' => CRM_Utils_Array::value('notes', $prefixValue),
428 'display_name' => $contribution->_relatedObjects['contact']->display_name,
429 'lineItem' => $lineItem,
430 'dataArray' => $dataArray,
431 'refundedStatusId' => $refundedStatusId,
432 'contribution_status_id' => $contribution->contribution_status_id,
433 'subTotal' => $subTotal,
434 'street_address' => CRM_Utils_Array::value('street_address', CRM_Utils_Array::value($contribution->contact_id, $billingAddress)),
435 'supplemental_address_1' => CRM_Utils_Array::value('supplemental_address_1', CRM_Utils_Array::value($contribution->contact_id, $billingAddress)),
436 'supplemental_address_2' => CRM_Utils_Array::value('supplemental_address_2', CRM_Utils_Array::value($contribution->contact_id, $billingAddress)),
437 'city' => CRM_Utils_Array::value('city', CRM_Utils_Array::value($contribution->contact_id, $billingAddress)),
438 'stateProvinceAbbreviation' => $stateProvinceAbbreviation,
439 'postal_code' => CRM_Utils_Array::value('postal_code', CRM_Utils_Array::value($contribution->contact_id, $billingAddress)),
440 'is_pay_later' => $contribution->is_pay_later,
441 'organization_name' => $contribution->_relatedObjects['contact']->organization_name,
442 'domain_organization' => $domain->name,
443 'domain_street_address' => CRM_Utils_Array::value('street_address', CRM_Utils_Array::value('1', $locationDefaults['address'])),
444 'domain_supplemental_address_1' => CRM_Utils_Array::value('supplemental_address_1', CRM_Utils_Array::value('1', $locationDefaults['address'])),
445 'domain_supplemental_address_2' => CRM_Utils_Array::value('supplemental_address_2', CRM_Utils_Array::value('1', $locationDefaults['address'])),
446 'domain_city' => CRM_Utils_Array::value('city', CRM_Utils_Array::value('1', $locationDefaults['address'])),
447 'domain_postal_code' => CRM_Utils_Array::value('postal_code', CRM_Utils_Array::value('1', $locationDefaults['address'])),
448 'domain_state' => $stateProvinceAbbreviationDomain,
449 'domain_country' => $countryDomain,
450 'domain_email' => CRM_Utils_Array::value('email', CRM_Utils_Array::value('1', $locationDefaults['email'])),
451 'domain_phone' => CRM_Utils_Array::value('phone', CRM_Utils_Array::value('1', $locationDefaults['phone'])),
452 );
453
454 if (isset($creditNoteId)) {
455 $tplParams['creditnote_id'] = $creditNoteId;
456 }
457
458 $sendTemplateParams = array(
459 'groupName' => 'msg_tpl_workflow_contribution',
460 'valueName' => 'contribution_invoice_receipt',
461 'contactId' => $contribution->contact_id,
462 'tplParams' => $tplParams,
463 'PDFFilename' => 'Invoice.pdf',
464 );
465 $session = CRM_Core_Session::singleton();
466 $contactID = $session->get('userID');
467 //CRM-16319 - we dont store in userID in case the user is doing multiple
468 //transactions etc
469 if (empty($contactID)) {
470 $contactID = $session->get('transaction.userID');
471 }
472 $contactEmails = CRM_Core_BAO_Email::allEmails($contactID);
473 $emails = array();
474 $fromDisplayName = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact',
475 $contactID, 'display_name'
476 );
477
478 foreach ($contactEmails as $emailId => $item) {
479 $email = $item['email'];
480 if ($email) {
481 $emails[$emailId] = '"' . $fromDisplayName . '" <' . $email . '> ';
482 }
483 }
484 $fromEmail = CRM_Utils_Array::crmArrayMerge($emails, CRM_Core_OptionGroup::values('from_email_address'));
485
486 // from email address
487 if (isset($params['from_email_address'])) {
488 $fromEmailAddress = CRM_Utils_Array::value($params['from_email_address'], $fromEmail);
489 }
490 // condition to check for download PDF Invoice or email Invoice
491 if ($invoiceElements['createPdf']) {
492 list($sent, $subject, $message, $html) = CRM_Core_BAO_MessageTemplate::sendTemplate($sendTemplateParams);
493 if (isset($params['forPage'])) {
494 return $html;
495 }
496 else {
497 $mail = array(
498 'subject' => $subject,
499 'body' => $message,
500 'html' => $html,
501 );
502 if ($mail['html']) {
503 $messageInvoice[] = $mail['html'];
504 }
505 else {
506 $messageInvoice[] = nl2br($mail['body']);
507 }
508 }
509 }
510 elseif ($contribution->_component == 'contribute') {
511 $email = CRM_Contact_BAO_Contact::getPrimaryEmail($contribution->contact_id);
512
513 $sendTemplateParams['tplParams'] = array_merge($tplParams, array('email_comment' => $invoiceElements['params']['email_comment']));
514 $sendTemplateParams['from'] = $fromEmailAddress;
515 $sendTemplateParams['toEmail'] = $email;
516 $sendTemplateParams['cc'] = CRM_Utils_Array::value('cc_receipt', $values);
517 $sendTemplateParams['bcc'] = CRM_Utils_Array::value('bcc_receipt', $values);
518
519 list($sent, $subject, $message, $html) = CRM_Core_BAO_MessageTemplate::sendTemplate($sendTemplateParams);
520 // functions call for adding activity with attachment
521 $fileName = self::putFile($html);
522 self::addActivities($subject, $contribution->contact_id, $fileName, $params);
523 }
524 elseif ($contribution->_component == 'event') {
525 $email = CRM_Contact_BAO_Contact::getPrimaryEmail($contribution->contact_id);
526
527 $sendTemplateParams['tplParams'] = array_merge($tplParams, array('email_comment' => $invoiceElements['params']['email_comment']));
528 $sendTemplateParams['from'] = $fromEmailAddress;
529 $sendTemplateParams['toEmail'] = $email;
530 $sendTemplateParams['cc'] = CRM_Utils_Array::value('cc_confirm', $values);
531 $sendTemplateParams['bcc'] = CRM_Utils_Array::value('bcc_confirm', $values);
532
533 list($sent, $subject, $message, $html) = CRM_Core_BAO_MessageTemplate::sendTemplate($sendTemplateParams);
534 // functions call for adding activity with attachment
535 $fileName = self::putFile($html);
536 self::addActivities($subject, $contribution->contact_id, $fileName, $params);
537 }
538
539 CRM_Core_DAO::setFieldValue('CRM_Contribute_DAO_Contribution', $contribution->id, 'invoice_id', $invoiceId);
540 if ($contribution->contribution_status_id == $refundedStatusId) {
541 CRM_Core_DAO::setFieldValue('CRM_Contribute_DAO_Contribution', $contribution->id, 'creditnote_id', $creditNoteId);
542 }
543 $invoiceTemplate->clearTemplateVars();
544 }
545
546 if ($invoiceElements['createPdf']) {
547 if (isset($params['forPage'])) {
548 return $html;
549 }
550 else {
551 CRM_Utils_PDF_Utils::html2pdf($messageInvoice, 'Invoice.pdf', FALSE, array(
552 'margin_top' => 10,
553 'margin_left' => 65,
554 'metric' => 'px',
555 ));
556 // functions call for adding activity with attachment
557 $fileName = self::putFile($html);
558 self::addActivities($subject, $contactIds, $fileName, $params);
559
560 CRM_Utils_System::civiExit();
561 }
562 }
563 else {
564 if ($invoiceElements['suppressedEmails']) {
565 $status = ts('Email was NOT sent to %1 contacts (no email address on file, or communication preferences specify DO NOT EMAIL, or contact is deceased).', array(1 => $invoiceElements['suppressedEmails']));
566 $msgTitle = ts('Email Error');
567 $msgType = 'error';
568 }
569 else {
570 $status = ts('Your mail has been sent.');
571 $msgTitle = ts('Sent');
572 $msgType = 'success';
573 }
574 CRM_Core_Session::setStatus($status, $msgTitle, $msgType);
575 }
576 }
577
578 /**
579 * Add activity for Email Invoice and the PDF Invoice.
580 *
581 * @param string $subject
582 * Activity subject.
583 * @param array $contactIds
584 * Contact Id.
585 * @param string $fileName
586 * Gives the location with name of the file.
587 * @param array $params
588 * For invoices.
589 *
590 */
591 static public function addActivities($subject, $contactIds, $fileName, $params) {
592 $session = CRM_Core_Session::singleton();
593 $userID = $session->get('userID');
594 $config = CRM_Core_Config::singleton();
595 $config->doNotAttachPDFReceipt = 1;
596
597 if (!empty($params['output']) && $params['output'] == 'pdf_invoice') {
598 $activityTypeID = CRM_Core_OptionGroup::getValue('activity_type',
599 'Downloaded Invoice',
600 'name'
601 );
602 }
603 else {
604 $activityTypeID = CRM_Core_OptionGroup::getValue('activity_type',
605 'Emailed Invoice',
606 'name'
607 );
608 }
609
610 $activityParams = array(
611 'subject' => $subject,
612 'source_contact_id' => $userID,
613 'target_contact_id' => $contactIds,
614 'activity_type_id' => $activityTypeID,
615 'activity_date_time' => date('YmdHis'),
616 'attachFile_1' => array(
617 'uri' => $fileName,
618 'type' => 'application/pdf',
619 'location' => $fileName,
620 'upload_date' => date('YmdHis'),
621 ),
622 );
623 CRM_Activity_BAO_Activity::create($activityParams);
624 }
625
626 /**
627 * Create the Invoice file in upload folder for attachment.
628 *
629 * @param string $html
630 * Content for pdf in html format.
631 *
632 * @return string
633 * Name of file which is in pdf format
634 */
635 static public function putFile($html) {
636 require_once "packages/dompdf/dompdf_config.inc.php";
637 spl_autoload_register('DOMPDF_autoload');
638 $doc = new DOMPDF();
639 $doc->load_html($html);
640 $doc->render();
641 $html = $doc->output();
642 $config = CRM_Core_Config::singleton();
643 $fileName = $config->uploadDir . 'Invoice.pdf';
644 file_put_contents($fileName, $html);
645 return $fileName;
646 }
647
648 /**
649 * Callback to perform action on Print Invoice button.
650 */
651 public static function getPrintPDF() {
652 $contributionId = CRM_Utils_Request::retrieve('id', 'Positive', CRM_Core_DAO::$_nullObject, FALSE);
653 $contributionIDs = array($contributionId);
654 $contactId = CRM_Utils_Request::retrieve('cid', 'Positive', CRM_Core_DAO::$_nullObject, FALSE);
655 $params = array('output' => 'pdf_invoice');
656 CRM_Contribute_Form_Task_Invoice::printPDF($contributionIDs, $params, $contactId, CRM_Core_DAO::$_nullObject);
657 }
658
659 }