3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.7 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2015 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
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. |
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. |
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 +--------------------------------------------------------------------+
31 * @copyright CiviCRM LLC (c) 2004-2015
35 * This class provides the functionality to email a group of
38 class CRM_Contribute_Form_Task_Invoice
extends CRM_Contribute_Form_Task
{
40 * Are we operating in "single mode", i.e. updating the task of only
41 * one specific contribution?
45 public $_single = FALSE;
48 * Gives all the statues for conribution.
50 public $_contributionStatusId;
53 * Gives the HTML template of PDF Invoice.
55 public $_messageInvoice;
58 * This variable is used to assign parameters for HTML template of PDF Invoice.
60 public $_invoiceTemplate;
65 public $_selectedOutput;
68 * Build all the data structures needed to build the form.
70 public function preProcess() {
71 $id = CRM_Utils_Request
::retrieve('id', 'Positive', $this, FALSE);
73 $this->_contributionIds
= array($id);
74 $this->_componentClause
= " civicrm_contribution.id IN ( $id ) ";
75 $this->_single
= TRUE;
76 $this->assign('totalSelectedContributions', 1);
78 // set the redirection after actions
79 $contactId = CRM_Utils_Request
::retrieve('cid', 'Positive', $this, FALSE);
80 $url = CRM_Utils_System
::url('civicrm/contact/view/contribution',
81 "action=view&reset=1&id={$id}&cid={$contactId}&context=contribution&selectedChild=contribute"
84 CRM_Core_Session
::singleton()->pushUserContext($url);
90 // check that all the contribution ids have status Completed, Pending, Refunded.
91 $this->_contributionStatusId
= CRM_Contribute_PseudoConstant
::contributionStatus(NULL, 'name');
92 $status = array('Completed', 'Pending', 'Refunded');
94 foreach ($this->_contributionStatusId
as $key => $value) {
95 if (in_array($value, $status)) {
99 $Id = implode(",", $statusId);
100 $query = "SELECT count(*) FROM civicrm_contribution WHERE contribution_status_id NOT IN ($Id) AND {$this->_componentClause}";
101 $count = CRM_Core_DAO
::singleValueQuery($query);
103 CRM_Core_Error
::statusBounce(ts('Please select only contributions with Completed, Pending, Refunded status.'));
106 // we have all the contribution ids, so now we get the contact ids
107 parent
::setContactIDs();
108 $this->assign('single', $this->_single
);
110 $qfKey = CRM_Utils_Request
::retrieve('qfKey', 'String', $this);
111 $urlParams = 'force=1';
112 if (CRM_Utils_Rule
::qfKey($qfKey)) {
113 $urlParams .= "&qfKey=$qfKey";
116 $url = CRM_Utils_System
::url('civicrm/contribute/search', $urlParams);
120 'title' => ts('Search Results'),
124 CRM_Utils_System
::appendBreadCrumb($breadCrumb);
126 $this->_selectedOutput
= CRM_Utils_Request
::retrieve('select', 'String', $this);
127 $this->assign('selectedOutput', $this->_selectedOutput
);
129 if ($this->_selectedOutput
== 'email') {
130 CRM_Utils_System
::setTitle(ts('Email Invoice'));
133 CRM_Utils_System
::setTitle(ts('Print Contribution Invoice'));
138 * Build the form object.
140 public function buildQuickForm() {
141 $session = CRM_Core_Session
::singleton();
142 $this->preventAjaxSubmit();
143 if (CRM_Core_Permission
::check('administer CiviCRM')) {
144 $this->assign('isAdmin', 1);
146 $contactID = $session->get('userID');
147 $contactEmails = CRM_Core_BAO_Email
::allEmails($contactID);
149 $fromDisplayName = CRM_Core_DAO
::getFieldValue('CRM_Contact_DAO_Contact',
150 $contactID, 'display_name'
152 foreach ($contactEmails as $emailId => $item) {
153 $email = $item['email'];
155 $emails[$emailId] = '"' . $fromDisplayName . '" <' . $email . '> ';
157 if (isset($emails[$emailId])) {
158 $emails[$emailId] .= $item['locationType'];
159 if ($item['is_primary']) {
160 $emails[$emailId] .= ' ' . ts('(preferred)');
162 $emails[$emailId] = htmlspecialchars($emails[$emailId]);
165 $fromEmailAddress = CRM_Core_OptionGroup
::values('from_email_address');
166 foreach ($fromEmailAddress as $key => $email) {
167 $fromEmailAddress[$key] = htmlspecialchars($fromEmailAddress[$key]);
169 $fromEmail = CRM_Utils_Array
::crmArrayMerge($emails, $fromEmailAddress);
170 $this->add('select', 'from_email_address', ts('From Email Address'), array('' => '- select -') +
$fromEmail);
171 if ($this->_selectedOutput
!= 'email') {
172 $this->addElement('radio', 'output', NULL, ts('Email Invoice'), 'email_invoice');
173 $this->addElement('radio', 'output', NULL, ts('PDF Invoice'), 'pdf_invoice');
174 $this->addRule('output', ts('Selection required'), 'required');
175 $this->addFormRule(array('CRM_Contribute_Form_Task_Invoice', 'formRule'));
178 $this->addRule('from_email_address', ts('From Email Address is required'), 'required');
181 $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 $this->addButtons(array(
189 'name' => $this->_selectedOutput
== 'email' ?
ts('Send Email') : ts('Process Invoice(s)'),
194 'name' => ts('Cancel'),
201 * Global validation rules for the form.
203 * @param array $values
206 * list of errors to be posted back to the form
208 public static function formRule($values) {
211 if ($values['output'] == 'email_invoice' && empty($values['from_email_address'])) {
212 $errors['from_email_address'] = ts("From Email Address is required");
219 * Process the form after the input has been submitted and validated.
221 public function postProcess() {
222 $params = $this->controller
->exportValues($this->_name
);
223 $this->printPDF($this->_contributionIds
, $params, $this->_contactIds
, $this);
227 * Process the PDf and email with activity and attachment on click of Print Invoices.
229 * @param array $contribIDs
231 * @param array $params
232 * Associated array of submitted values.
233 * @param array $contactIds
235 * @param CRM_Core_Form $form
238 public static function printPDF($contribIDs, &$params, $contactIds, &$form) {
239 // get all the details needed to generate a invoice
240 $messageInvoice = array();
241 $invoiceTemplate = CRM_Core_Smarty
::singleton();
242 $invoiceElements = CRM_Contribute_Form_Task_PDF
::getElements($contribIDs, $params, $contactIds);
244 // gives the status id when contribution status is 'Refunded'
245 $contributionStatusID = CRM_Contribute_PseudoConstant
::contributionStatus(NULL, 'name');
246 $refundedStatusId = CRM_Utils_Array
::key('Refunded', $contributionStatusID);
248 // getting data from admin page
249 $prefixValue = CRM_Core_BAO_Setting
::getItem(CRM_Core_BAO_Setting
::CONTRIBUTE_PREFERENCES_NAME
, 'contribution_invoice_settings');
251 foreach ($invoiceElements['details'] as $contribID => $detail) {
252 $input = $ids = $objects = array();
253 if (in_array($detail['contact'], $invoiceElements['excludeContactIds'])) {
257 $input['component'] = $detail['component'];
259 $ids['contact'] = $detail['contact'];
260 $ids['contribution'] = $contribID;
261 $ids['contributionRecur'] = NULL;
262 $ids['contributionPage'] = NULL;
263 $ids['membership'] = CRM_Utils_Array
::value('membership', $detail);
264 $ids['participant'] = CRM_Utils_Array
::value('participant', $detail);
265 $ids['event'] = CRM_Utils_Array
::value('event', $detail);
267 if (!$invoiceElements['baseIPN']->validateData($input, $ids, $objects, FALSE)) {
268 CRM_Core_Error
::fatal();
271 $contribution = &$objects['contribution'];
273 $input['amount'] = $contribution->total_amount
;
274 $input['invoice_id'] = $contribution->invoice_id
;
275 $input['receive_date'] = $contribution->receive_date
;
276 $input['contribution_status_id'] = $contribution->contribution_status_id
;
277 $input['organization_name'] = $contribution->_relatedObjects
['contact']->organization_name
;
279 $objects['contribution']->receive_date
= CRM_Utils_Date
::isoToMysql($objects['contribution']->receive_date
);
281 $addressParams = array('contact_id' => $contribution->contact_id
);
282 $addressDetails = CRM_Core_BAO_Address
::getValues($addressParams);
284 // to get billing address if present
285 $billingAddress = array();
286 foreach ($addressDetails as $key => $address) {
287 if ((isset($address['is_billing']) && $address['is_billing'] == 1) && (isset($address['is_primary']) && $address['is_primary'] == 1) && $address['contact_id'] == $contribution->contact_id
) {
288 $billingAddress[$address['contact_id']] = $address;
291 elseif (($address['is_billing'] == 0 && $address['is_primary'] == 1) ||
(isset($address['is_billing']) && $address['is_billing'] == 1) && $address['contact_id'] == $contribution->contact_id
) {
292 $billingAddress[$address['contact_id']] = $address;
296 if (!empty($billingAddress[$contribution->contact_id
]['state_province_id'])) {
297 $stateProvinceAbbreviation = CRM_Core_PseudoConstant
::stateProvinceAbbreviation($billingAddress[$contribution->contact_id
]['state_province_id']);
300 $stateProvinceAbbreviation = '';
303 if ($contribution->contribution_status_id
== $refundedStatusId) {
304 $creditNoteId = CRM_Utils_Array
::value('credit_notes_prefix', $prefixValue) . "" . $contribution->id
;
306 $invoiceId = CRM_Utils_Array
::value('invoice_prefix', $prefixValue) . "" . $contribution->id
;
308 //to obtain due date for PDF invoice
309 $contributionReceiveDate = date('F j,Y', strtotime(date($input['receive_date'])));
310 $invoiceDate = date("F j, Y");
311 $dueDate = date('F j ,Y', strtotime($contributionReceiveDate . "+" . $prefixValue['due_date'] . "" . $prefixValue['due_date_period']));
313 if ($input['component'] == 'contribute') {
315 $etable = 'contribution';
316 $lineItem = CRM_Price_BAO_LineItem
::getLineItems($eid, $etable, NULL, TRUE, TRUE);
319 $eid = $contribution->_relatedObjects
['participant']->id
;
320 $etable = 'participant';
321 $lineItem = CRM_Price_BAO_LineItem
::getLineItems($eid, $etable, NULL, TRUE, FALSE, '', TRUE);
324 //TO DO: Need to do changes for partially paid to display amount due on PDF invoice
325 $amountDue = ($input['amount'] - $input['amount']);
327 // retreiving the subtotal and sum of same tax_rate
328 $dataArray = array();
330 foreach ($lineItem as $entity_id => $taxRate) {
331 if (isset($dataArray[(string) $taxRate['tax_rate']])) {
332 $dataArray[(string) $taxRate['tax_rate']] = $dataArray[(string) $taxRate['tax_rate']] + CRM_Utils_Array
::value('tax_amount', $taxRate);
335 $dataArray[(string) $taxRate['tax_rate']] = CRM_Utils_Array
::value('tax_amount', $taxRate);
337 $subTotal +
= CRM_Utils_Array
::value('subTotal', $taxRate);
340 // to email the invoice
341 $mailDetails = array();
343 if ($contribution->_component
== 'event') {
344 $daoName = 'CRM_Event_DAO_Event';
345 $pageId = $contribution->_relatedObjects
['event']->id
;
346 $mailElements = array(
349 'confirm_from_email',
353 CRM_Core_DAO
::commonRetrieveAll($daoName, 'id', $pageId, $mailDetails, $mailElements);
354 $values['title'] = CRM_Utils_Array
::value('title', $mailDetails[$contribution->_relatedObjects
['event']->id
]);
355 $values['confirm_from_name'] = CRM_Utils_Array
::value('confirm_from_name', $mailDetails[$contribution->_relatedObjects
['event']->id
]);
356 $values['confirm_from_email'] = CRM_Utils_Array
::value('confirm_from_email', $mailDetails[$contribution->_relatedObjects
['event']->id
]);
357 $values['cc_confirm'] = CRM_Utils_Array
::value('cc_confirm', $mailDetails[$contribution->_relatedObjects
['event']->id
]);
358 $values['bcc_confirm'] = CRM_Utils_Array
::value('bcc_confirm', $mailDetails[$contribution->_relatedObjects
['event']->id
]);
360 $title = CRM_Utils_Array
::value('title', $mailDetails[$contribution->_relatedObjects
['event']->id
]);
362 elseif ($contribution->_component
== 'contribute') {
363 $daoName = 'CRM_Contribute_DAO_ContributionPage';
364 $pageId = $contribution->contribution_page_id
;
365 $mailElements = array(
368 'receipt_from_email',
372 CRM_Core_DAO
::commonRetrieveAll($daoName, 'id', $pageId, $mailDetails, $mailElements);
374 $values['title'] = CRM_Utils_Array
::value('title', CRM_Utils_Array
::value($contribution->contribution_page_id
, $mailDetails));
375 $values['receipt_from_name'] = CRM_Utils_Array
::value('receipt_from_name', CRM_Utils_Array
::value($contribution->contribution_page_id
, $mailDetails));
376 $values['receipt_from_email'] = CRM_Utils_Array
::value('receipt_from_email', CRM_Utils_Array
::value($contribution->contribution_page_id
, $mailDetails));
377 $values['cc_receipt'] = CRM_Utils_Array
::value('cc_receipt', CRM_Utils_Array
::value($contribution->contribution_page_id
, $mailDetails));
378 $values['bcc_receipt'] = CRM_Utils_Array
::value('bcc_receipt', CRM_Utils_Array
::value($contribution->contribution_page_id
, $mailDetails));
380 $title = CRM_Utils_Array
::value('title', CRM_Utils_Array
::value($contribution->contribution_page_id
, $mailDetails));
382 $source = $contribution->source
;
384 $config = CRM_Core_Config
::singleton();
385 if (!isset($params['forPage'])) {
386 $config->doNotAttachPDFReceipt
= 1;
389 // get organization address
390 $domain = CRM_Core_BAO_Domain
::getDomain();
391 $locParams = array('contact_id' => $domain->contact_id
);
392 $locationDefaults = CRM_Core_BAO_Location
::getValues($locParams);
393 if (isset($locationDefaults['address'][1]['state_province_id'])) {
394 $stateProvinceAbbreviationDomain = CRM_Core_PseudoConstant
::stateProvinceAbbreviation($locationDefaults['address'][1]['state_province_id']);
397 $stateProvinceAbbreviationDomain = '';
399 if (isset($locationDefaults['address'][1]['country_id'])) {
400 $countryDomain = CRM_Core_PseudoConstant
::country($locationDefaults['address'][1]['country_id']);
406 // parameters to be assign for template
409 'component' => $input['component'],
410 'id' => $contribution->id
,
412 'invoice_id' => $invoiceId,
413 'resourceBase' => $config->userFrameworkResourceURL
,
414 'defaultCurrency' => $config->defaultCurrency
,
415 'amount' => $contribution->total_amount
,
416 'amountDue' => $amountDue,
417 'invoice_date' => $invoiceDate,
418 'dueDate' => $dueDate,
419 'notes' => CRM_Utils_Array
::value('notes', $prefixValue),
420 'display_name' => $contribution->_relatedObjects
['contact']->display_name
,
421 'lineItem' => $lineItem,
422 'dataArray' => $dataArray,
423 'refundedStatusId' => $refundedStatusId,
424 'contribution_status_id' => $contribution->contribution_status_id
,
425 'subTotal' => $subTotal,
426 'street_address' => CRM_Utils_Array
::value('street_address', CRM_Utils_Array
::value($contribution->contact_id
, $billingAddress)),
427 'supplemental_address_1' => CRM_Utils_Array
::value('supplemental_address_1', CRM_Utils_Array
::value($contribution->contact_id
, $billingAddress)),
428 'supplemental_address_2' => CRM_Utils_Array
::value('supplemental_address_2', CRM_Utils_Array
::value($contribution->contact_id
, $billingAddress)),
429 'city' => CRM_Utils_Array
::value('city', CRM_Utils_Array
::value($contribution->contact_id
, $billingAddress)),
430 'stateProvinceAbbreviation' => $stateProvinceAbbreviation,
431 'postal_code' => CRM_Utils_Array
::value('postal_code', CRM_Utils_Array
::value($contribution->contact_id
, $billingAddress)),
432 'is_pay_later' => $contribution->is_pay_later
,
433 'organization_name' => $contribution->_relatedObjects
['contact']->organization_name
,
434 'domain_organization' => $domain->name
,
435 'domain_street_address' => CRM_Utils_Array
::value('street_address', CRM_Utils_Array
::value('1', $locationDefaults['address'])),
436 'domain_supplemental_address_1' => CRM_Utils_Array
::value('supplemental_address_1', CRM_Utils_Array
::value('1', $locationDefaults['address'])),
437 'domain_supplemental_address_2' => CRM_Utils_Array
::value('supplemental_address_2', CRM_Utils_Array
::value('1', $locationDefaults['address'])),
438 'domain_city' => CRM_Utils_Array
::value('city', CRM_Utils_Array
::value('1', $locationDefaults['address'])),
439 'domain_postal_code' => CRM_Utils_Array
::value('postal_code', CRM_Utils_Array
::value('1', $locationDefaults['address'])),
440 'domain_state' => $stateProvinceAbbreviationDomain,
441 'domain_country' => $countryDomain,
442 'domain_email' => CRM_Utils_Array
::value('email', CRM_Utils_Array
::value('1', $locationDefaults['email'])),
443 'domain_phone' => CRM_Utils_Array
::value('phone', CRM_Utils_Array
::value('1', $locationDefaults['phone'])),
446 if (isset($creditNoteId)) {
447 $tplParams['creditnote_id'] = $creditNoteId;
450 $pdfFileName = "{$invoiceId}.pdf";
451 $sendTemplateParams = array(
452 'groupName' => 'msg_tpl_workflow_contribution',
453 'valueName' => 'contribution_invoice_receipt',
454 'contactId' => $contribution->contact_id
,
455 'tplParams' => $tplParams,
456 'PDFFilename' => $pdfFileName,
458 $session = CRM_Core_Session
::singleton();
459 $contactID = $session->get('userID');
460 //CRM-16319 - we dont store in userID in case the user is doing multiple
462 if (empty($contactID)) {
463 $contactID = $session->get('transaction.userID');
465 $contactEmails = CRM_Core_BAO_Email
::allEmails($contactID);
467 $fromDisplayName = CRM_Core_DAO
::getFieldValue('CRM_Contact_DAO_Contact',
468 $contactID, 'display_name'
471 foreach ($contactEmails as $emailId => $item) {
472 $email = $item['email'];
474 $emails[$emailId] = '"' . $fromDisplayName . '" <' . $email . '> ';
477 $fromEmail = CRM_Utils_Array
::crmArrayMerge($emails, CRM_Core_OptionGroup
::values('from_email_address'));
479 // from email address
480 if (isset($params['from_email_address'])) {
481 $fromEmailAddress = CRM_Utils_Array
::value($params['from_email_address'], $fromEmail);
483 // condition to check for download PDF Invoice or email Invoice
484 if ($invoiceElements['createPdf']) {
485 list($sent, $subject, $message, $html) = CRM_Core_BAO_MessageTemplate
::sendTemplate($sendTemplateParams);
486 if (isset($params['forPage'])) {
491 'subject' => $subject,
496 $messageInvoice[] = $mail['html'];
499 $messageInvoice[] = nl2br($mail['body']);
503 elseif ($contribution->_component
== 'contribute') {
504 $email = CRM_Contact_BAO_Contact
::getPrimaryEmail($contribution->contact_id
);
506 $sendTemplateParams['tplParams'] = array_merge($tplParams, array('email_comment' => $invoiceElements['params']['email_comment']));
507 $sendTemplateParams['from'] = $fromEmailAddress;
508 $sendTemplateParams['toEmail'] = $email;
509 $sendTemplateParams['cc'] = CRM_Utils_Array
::value('cc_receipt', $values);
510 $sendTemplateParams['bcc'] = CRM_Utils_Array
::value('bcc_receipt', $values);
512 list($sent, $subject, $message, $html) = CRM_Core_BAO_MessageTemplate
::sendTemplate($sendTemplateParams);
513 // functions call for adding activity with attachment
514 $pdfFileName = "{$invoiceId}.pdf";
515 $fileName = self
::putFile($html, $pdfFileName);
516 self
::addActivities($subject, $contribution->contact_id
, $fileName, $params);
518 elseif ($contribution->_component
== 'event') {
519 $email = CRM_Contact_BAO_Contact
::getPrimaryEmail($contribution->contact_id
);
521 $sendTemplateParams['tplParams'] = array_merge($tplParams, array('email_comment' => $invoiceElements['params']['email_comment']));
522 $sendTemplateParams['from'] = $fromEmailAddress;
523 $sendTemplateParams['toEmail'] = $email;
524 $sendTemplateParams['cc'] = CRM_Utils_Array
::value('cc_confirm', $values);
525 $sendTemplateParams['bcc'] = CRM_Utils_Array
::value('bcc_confirm', $values);
527 list($sent, $subject, $message, $html) = CRM_Core_BAO_MessageTemplate
::sendTemplate($sendTemplateParams);
528 // functions call for adding activity with attachment
529 $pdfFileName = "{$invoiceId}.pdf";
530 $fileName = self
::putFile($html, $pdfFileName);
531 self
::addActivities($subject, $contribution->contact_id
, $fileName, $params);
534 CRM_Core_DAO
::setFieldValue('CRM_Contribute_DAO_Contribution', $contribution->id
, 'invoice_id', $invoiceId);
535 if ($contribution->contribution_status_id
== $refundedStatusId) {
536 CRM_Core_DAO
::setFieldValue('CRM_Contribute_DAO_Contribution', $contribution->id
, 'creditnote_id', $creditNoteId);
538 $invoiceTemplate->clearTemplateVars();
541 if ($invoiceElements['createPdf']) {
542 if (isset($params['forPage'])) {
546 $pdfFileName = "{$invoiceId}.pdf";
547 CRM_Utils_PDF_Utils
::html2pdf($messageInvoice, $pdfFileName, FALSE, array(
552 // functions call for adding activity with attachment
553 $fileName = self
::putFile($html, $pdfFileName);
554 self
::addActivities($subject, $contactIds, $fileName, $params);
556 CRM_Utils_System
::civiExit();
560 if ($invoiceElements['suppressedEmails']) {
561 $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']));
562 $msgTitle = ts('Email Error');
566 $status = ts('Your mail has been sent.');
567 $msgTitle = ts('Sent');
568 $msgType = 'success';
570 CRM_Core_Session
::setStatus($status, $msgTitle, $msgType);
575 * Add activity for Email Invoice and the PDF Invoice.
577 * @param string $subject
579 * @param array $contactIds
581 * @param string $fileName
582 * Gives the location with name of the file.
583 * @param array $params
587 static public function addActivities($subject, $contactIds, $fileName, $params) {
588 $session = CRM_Core_Session
::singleton();
589 $userID = $session->get('userID');
590 $config = CRM_Core_Config
::singleton();
591 $config->doNotAttachPDFReceipt
= 1;
593 if (!empty($params['output']) && $params['output'] == 'pdf_invoice') {
594 $activityTypeID = CRM_Core_OptionGroup
::getValue('activity_type',
595 'Downloaded Invoice',
600 $activityTypeID = CRM_Core_OptionGroup
::getValue('activity_type',
606 $activityParams = array(
607 'subject' => $subject,
608 'source_contact_id' => $userID,
609 'target_contact_id' => $contactIds,
610 'activity_type_id' => $activityTypeID,
611 'activity_date_time' => date('YmdHis'),
612 'attachFile_1' => array(
614 'type' => 'application/pdf',
615 'location' => $fileName,
616 'upload_date' => date('YmdHis'),
619 CRM_Activity_BAO_Activity
::create($activityParams);
623 * Create the Invoice file in upload folder for attachment.
625 * @param string $html
626 * Content for pdf in html format.
629 * Name of file which is in pdf format
631 static public function putFile($html, $name = 'Invoice.pdf') {
632 require_once "vendor/dompdf/dompdf/dompdf_config.inc.php";
634 $doc->load_html($html);
636 $html = $doc->output();
637 $config = CRM_Core_Config
::singleton();
638 $fileName = $config->uploadDir
. $name;
639 file_put_contents($fileName, $html);
644 * Callback to perform action on Print Invoice button.
646 public static function getPrintPDF() {
647 $contributionId = CRM_Utils_Request
::retrieve('id', 'Positive', CRM_Core_DAO
::$_nullObject, FALSE);
648 $contributionIDs = array($contributionId);
649 $contactId = CRM_Utils_Request
::retrieve('cid', 'Positive', CRM_Core_DAO
::$_nullObject, FALSE);
650 $params = array('output' => 'pdf_invoice');
651 CRM_Contribute_Form_Task_Invoice
::printPDF($contributionIDs, $params, $contactId, CRM_Core_DAO
::$_nullObject);