quickCleanUpFinancialEntities(); $this->revertTemplateToReservedTemplate('contribution_invoice_receipt'); CRM_Utils_Hook::singleton()->reset(); parent::tearDown(); } /** * CRM-17815 - Test due date and payment advice block in generated * invoice pdf for pending and completed contributions */ public function testInvoiceForDueDate(): void { $contactIds = []; $params = [ 'output' => 'pdf_invoice', 'forPage' => 1, ]; $this->_individualId = $this->individualCreate(); $contributionParams = [ 'contact_id' => $this->_individualId, 'total_amount' => 100, 'financial_type_id' => 'Donation', ]; $result = $this->callAPISuccess('Contribution', 'create', $contributionParams); $contributionParams['contribution_status_id'] = 2; $contributionParams['is_pay_later'] = 1; $contribution = $this->callAPISuccess('Contribution', 'create', $contributionParams); $contribution3 = $this->callAPISuccess('Contribution', 'create', $contributionParams); $this->callAPISuccess('Payment', 'create', ['total_amount' => 8, 'contribution_id' => $contribution3['id']]); $this->callAPISuccess('Contribution', 'create', ['id' => $contribution3['id'], 'is_pay_later' => 0]); $contributionIDs = [ [$result['id']], [$contribution['id']], [$contribution3['id']], ]; $contactIds[] = $this->_individualId; foreach ($contributionIDs as $contributionID) { $invoiceHTML[current($contributionID)] = CRM_Contribute_Form_Task_Invoice::printPDF($contributionID, $params, $contactIds); } $this->assertStringNotContainsString('Due Date', $invoiceHTML[$result['id']]); $this->assertStringNotContainsString('PAYMENT ADVICE', $invoiceHTML[$result['id']]); $this->assertStringContainsString('Mr. Anthony Anderson II', $invoiceHTML[$result['id']]); $this->assertStringContainsString('Due Date', $invoiceHTML[$contribution['id']]); $this->assertStringContainsString('PAYMENT ADVICE', $invoiceHTML[$contribution['id']]); $this->assertStringContainsString('AMOUNT DUE: $92.00', $invoiceHTML[$contribution3['id']]); } /** * PR 13477 - Fix incorrect display of Line Items created via API * when printing invoice (for Participants). * * @throws \CRM_Core_Exception */ public function testInvoiceForLineItems(): void { $this->enableTaxAndInvoicing(); $event = $this->eventCreatePaid([]); $individualOneId = $this->individualCreate(); $individualTwoId = $this->individualCreate(); $contactIds = [$individualOneId, $individualTwoId]; $priceSetId = CRM_Price_BAO_PriceSet::getFor('civicrm_event', $event['id']); $priceField = $this->callAPISuccess('PriceField', 'get', ['price_set_id' => $priceSetId]); $priceFieldValues = $this->callAPISuccess('PriceFieldValue', 'get', [ 'sequential' => 1, 'price_field_id' => $priceField['id'], ]); $lineItemParams = []; foreach ($priceFieldValues['values'] as $key => $priceFieldValue) { $lineItemParams[] = [ 'line_item' => [ $priceFieldValue['id'] => [ 'price_field_id' => $priceField['id'], 'label' => $priceFieldValue['label'], 'financial_type_id' => $priceFieldValue['financial_type_id'], 'price_field_value_id' => $priceFieldValue['id'], 'qty' => 1, 'field_title' => $priceFieldValue['label'], 'unit_price' => $priceFieldValue['amount'], 'line_total' => $priceFieldValue['amount'], 'entity_table' => 'civicrm_participant', ], ], // participant params 'params' => [ 'contact_id' => $contactIds[$key], 'event_id' => $event['id'], 'status_id' => 1, 'price_set_id' => $priceSetId, 'participant_fee_amount' => $priceFieldValue['amount'], 'participant_fee_level' => $priceFieldValue['label'], ], ]; } $orderParams = [ 'contact_id' => $individualOneId, 'total_amount' => array_reduce($priceFieldValues['values'], function($total, $priceFieldValue) { $total += $priceFieldValue['amount']; return $total; }), 'financial_type_id' => $priceFieldValues['values'][0]['financial_type_id'], 'currency' => 'USD', 'line_items' => $lineItemParams, ]; $order = $this->callAPISuccess('Order', 'create', $orderParams); $pdfParams = [ 'output' => 'pdf_invoice', 'forPage' => 1, ]; $invoiceHTML = CRM_Contribute_Form_Task_Invoice::printPDF([$order['id']], $pdfParams, [$individualOneId]); $lineItems = $this->callAPISuccess('LineItem', 'get', ['contribution_id' => $order['id']]); foreach ($lineItems['values'] as $lineItem) { $this->assertStringContainsString("$" . $lineItem['line_total'] . '', $invoiceHTML); } $totalAmount = $this->formatMoneyInput($order['values'][$order['id']]['total_amount']); $this->assertStringContainsString("TOTAL USD $" . $totalAmount . '', $invoiceHTML); } /** * Test invoices if payment is made with different currency. * * https://lab.civicrm.org/dev/core/issues/2269 */ public function testThatInvoiceShowsTheActualContributionCurrencyInsteadOfTheDefaultOne(): void { $this->setDefaultCurrency('USD'); $contactID = Domain::get()->addSelect('contact_id')->execute()->first()['contact_id']; Address::create()->setValues(['contact_id' => $contactID, 'city' => 'Beverley Hills', 'state_province_id:label' => 'California', 'country_id:label' => 'United States', 'postal_code' => 90210])->execute(); Civi::cache('metadata')->clear(); $this->_individualId = $this->individualCreate(); $contributionID = $this->setupContribution(); $params = [ 'output' => 'pdf_invoice', 'forPage' => 1, ]; $invoiceHTML = CRM_Contribute_Form_Task_Invoice::printPDF([$contributionID], $params, [$this->_individualId]); $this->assertStringNotContainsString('$', $invoiceHTML); $this->assertStringNotContainsString('Amount USD', $invoiceHTML); $this->assertStringNotContainsString('TOTAL USD', $invoiceHTML); $this->assertStringContainsString('£0.00', $invoiceHTML); $this->assertStringContainsString('£100.00', $invoiceHTML); $this->assertStringContainsString('Amount GBP', $invoiceHTML); $this->assertStringContainsString('TOTAL GBP', $invoiceHTML); $this->assertStringContainsString('California', $invoiceHTML); $this->assertStringContainsString('90210', $invoiceHTML); $this->assertStringContainsString('United States', $invoiceHTML); $this->assertStringContainsString('Default Domain Name', $invoiceHTML); } /** * Test invoice contact fields. */ public function testInvoiceContactFields(): void { $this->swapMessageTemplateForTestTemplate('contribution_invoice_receipt'); $contactID = $this->individualCreate([ 'postal_code' => 2345, 'street_address' => 'on my street', 'supplemental_address_1' => 'and more detail', 'supplemental_address_2' => 'and more', 'stateProvinceAbbreviation' => 'ME', 'city' => 'Baltimore', 'country' => 'US', 'external_identifier' => 2345, ]); $params = [ 'output' => 'pdf_invoice', 'forPage' => 1, ]; $invoiceHTML = CRM_Contribute_Form_Task_Invoice::printPDF([$this->setupContribution(['contact_id' => $contactID])], $params, [$contactID]); $expected = [ 'externalIdentifier (token):::2345', 'displayName (token):::Mr. Anthony Anderson II', 'currency (token):::GBP', 'currency (smarty):::GBP', ]; foreach ($expected as $string) { $this->assertStringContainsString($string, $invoiceHTML); } } /** * Set up a contribution. * * @param array $params * * @return int */ protected function setupContribution(array $params = []): int { $contributionParams = array_merge([ 'contact_id' => $this->_individualId, 'total_amount' => 100, 'currency' => 'GBP', 'financial_type_id' => 'Donation', 'contribution_status_id' => 1, ], $params); return (int) $this->callAPISuccess('Contribution', 'create', $contributionParams)['id']; } }