3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.6 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2014 |
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-2014
36 class CRM_Financial_BAO_FinancialItem
extends CRM_Financial_DAO_FinancialItem
{
41 function __construct( ) {
42 parent
::__construct( );
46 * Fetch object based on array of properties
48 * @param array $params (reference ) an assoc array of name/value pairs
49 * @param array $defaults (reference ) an assoc array to hold the flattened values
51 * @return CRM_Contribute_BAO_FinancialItem object
55 static function retrieve(&$params, &$defaults) {
56 $financialItem = new CRM_Financial_DAO_FinancialItem();
57 $financialItem->copyValues($params);
58 if ($financialItem->find(TRUE)) {
59 CRM_Core_DAO
::storeValues($financialItem, $defaults);
60 return $financialItem;
66 * Add the financial items and financial trxn
68 * @param object $lineItem line item object
69 * @param object $contribution contribution object
70 * @param boolean $taxTrxnID
76 static function add($lineItem, $contribution, $taxTrxnID = FALSE) {
77 $contributionStatuses = CRM_Contribute_PseudoConstant
::contributionStatus(NULL, 'name');
78 $financialItemStatus = CRM_Core_PseudoConstant
::get('CRM_Financial_DAO_FinancialItem', 'status_id');
80 if ($contribution->contribution_status_id
== array_search('Completed', $contributionStatuses)
81 ||
$contribution->contribution_status_id
== array_search('Pending refund', $contributionStatuses)) {
82 $itemStatus = array_search('Paid', $financialItemStatus);
84 elseif ($contribution->contribution_status_id
== array_search('Pending', $contributionStatuses)
85 ||
$contribution->contribution_status_id
== array_search('In Progress', $contributionStatuses)) {
86 $itemStatus = array_search('Unpaid', $financialItemStatus);
88 elseif ($contribution->contribution_status_id
== array_search('Partially paid', $contributionStatuses)) {
89 $itemStatus = array_search('Partially paid', $financialItemStatus);
92 'transaction_date' => CRM_Utils_Date
::isoToMysql($contribution->receive_date
),
93 'contact_id' => $contribution->contact_id
,
94 'amount' => $lineItem->line_total
,
95 'currency' => $contribution->currency
,
96 'entity_table' => 'civicrm_line_item',
97 'entity_id' => $lineItem->id
,
98 'description' => ( $lineItem->qty
!= 1 ?
$lineItem->qty
. ' of ' : ''). ' ' . $lineItem->label
,
99 'status_id' => $itemStatus,
103 $invoiceSettings = CRM_Core_BAO_Setting
::getItem(CRM_Core_BAO_Setting
::CONTRIBUTE_PREFERENCES_NAME
, 'contribution_invoice_settings');
104 $taxTerm = CRM_Utils_Array
::value('tax_term', $invoiceSettings);
105 $params['amount'] = $lineItem->tax_amount
;
106 $params['description'] = $taxTerm;
107 $accountRel = key(CRM_Core_PseudoConstant
::accountOptionValues('account_relationship', NULL, " AND v.name LIKE 'Sales Tax Account is' "));
110 $accountRel = key(CRM_Core_PseudoConstant
::accountOptionValues('account_relationship', NULL, " AND v.name LIKE 'Income Account is' "));
112 if ($lineItem->financial_type_id
) {
113 $searchParams = array(
114 'entity_table' => 'civicrm_financial_type',
115 'entity_id' => $lineItem->financial_type_id
,
116 'account_relationship' => $accountRel,
120 CRM_Financial_BAO_FinancialTypeAccount
::retrieve( $searchParams, $result );
121 $params['financial_account_id'] = CRM_Utils_Array
::value( 'financial_account_id', $result );
123 $trxn = CRM_Core_BAO_FinancialTrxn
::getFinancialTrxnId($contribution->id
, 'ASC', TRUE);
124 $trxnId['id'] = $trxn['financialTrxnId'];
126 return self
::create($params, NULL, $trxnId);
130 * Create the financial Items and financial enity trxn
132 * @param array $params associated array to create financial items
133 * @param array $ids financial item ids
134 * @param array $trxnIds financial item ids
140 static function create(&$params, $ids = NULL, $trxnIds = NULL) {
141 $financialItem = new CRM_Financial_DAO_FinancialItem();
142 $financialItem->copyValues($params);
143 if (!empty($ids['id'])) {
144 $financialItem->id
= $ids['id'];
147 $financialItem->save();
148 if (!empty($trxnIds['id'])) {
149 $entity_financial_trxn_params = array(
150 'entity_table' => "civicrm_financial_item",
151 'entity_id' => $financialItem->id
,
152 'financial_trxn_id' => $trxnIds['id'],
153 'amount' => $params['amount'],
156 $entity_trxn = new CRM_Financial_DAO_EntityFinancialTrxn();
157 $entity_trxn->copyValues($entity_financial_trxn_params);
158 if (!empty($ids['entityFinancialTrxnId'])) {
159 $entity_trxn->id
= $ids['entityFinancialTrxnId'];
161 $entity_trxn->save();
163 return $financialItem;
167 * Takes an associative array and creates a entity financial transaction object
169 * @param array $params (reference ) an assoc array of name/value pairs
171 * @return CRM_Core_BAO_FinancialTrxn object
175 static function createEntityTrxn($params) {
176 $entity_trxn = new CRM_Financial_DAO_EntityFinancialTrxn();
177 $entity_trxn->copyValues($params);
178 $entity_trxn->save();
183 * Retrive entity financial trxn details
185 * @param array $params (reference ) an assoc array of name/value pairs
186 * @param bool $maxId to retrive max id
192 static function retrieveEntityFinancialTrxn($params, $maxId = FALSE) {
193 $financialItem = new CRM_Financial_DAO_EntityFinancialTrxn();
194 $financialItem->copyValues($params);
195 //retrieve last entry from civicrm_entity_financial_trxn
197 $financialItem->orderBy('id DESC');
198 $financialItem->limit(1);
200 $financialItem->find();
201 while ($financialItem->fetch()) {
202 $financialItems[$financialItem->id
] = array(
203 'id' => $financialItem->id
,
204 'entity_table' => $financialItem->entity_table
,
205 'entity_id' => $financialItem->entity_id
,
206 'financial_trxn_id' => $financialItem->financial_trxn_id
,
207 'amount' => $financialItem->amount
,
210 if (!empty($financialItems)) {
211 return $financialItems;
219 * Check if contact is present in financial_item table
223 * @param array $contactIds an array contact id's
225 * @param array $error error to display
231 static function checkContactPresent($contactIds, &$error) {
232 if (empty($contactIds)) {
236 $allowPermDelete = CRM_Core_BAO_Setting
::getItem(CRM_Core_BAO_Setting
::SYSTEM_PREFERENCES_NAME
, 'allowPermDeleteFinancial');
238 if (!$allowPermDelete) {
239 $sql = 'SELECT DISTINCT(cc.id), cc.display_name FROM civicrm_contact cc
240 INNER JOIN civicrm_contribution con ON con.contact_id = cc.id
241 WHERE cc.id IN (' . implode (',', $contactIds) . ') AND con.is_test = 0';
242 $dao = CRM_Core_DAO
::executeQuery($sql);
244 while ($dao->fetch()) {
245 $url = CRM_Utils_System
::url('civicrm/contact/view', "reset=1&cid=$dao->id");
246 $not_deleted[$dao->id
] = "<a href='$url'>$dao->display_name</a>";
250 if (is_array($error)) {
251 $errorStatus = '<ul><li>' . implode('</li><li>', $not_deleted) . '</li></ul>';
254 $error['_qf_default'] = $errorStatus . ts('This contact(s) can not be permanently deleted because the contact record is linked to one or more live financial transactions. Deleting this contact would result in the loss of financial data.');