Merge pull request #2712 from pratik-joshi/CRM-14363
[civicrm-core.git] / CRM / Financial / BAO / FinancialItem.php
CommitLineData
6a488035 1<?php
6a488035
TO
2/*
3 +--------------------------------------------------------------------+
232624b1 4 | CiviCRM version 4.4 |
6a488035
TO
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
36class CRM_Financial_BAO_FinancialItem extends CRM_Financial_DAO_FinancialItem {
37
38 /**
39 * class constructor
40 */
41 function __construct( ) {
42 parent::__construct( );
43 }
44
45 /**
46 * Takes a bunch of params that are needed to match certain criteria and
47 * retrieves the relevant objects. Typically the valid params are only
48 * contact_id. We'll tweak this function to be more full featured over a period
49 * of time. This is the inverse function of create. It also stores all the retrieved
50 * values in the default array
51 *
52 * @param array $params (reference ) an assoc array of name/value pairs
53 * @param array $defaults (reference ) an assoc array to hold the flattened values
54 *
55 * @return object CRM_Contribute_BAO_FinancialItem object
56 * @access public
57 * @static
58 */
59 static function retrieve(&$params, &$defaults) {
60 $financialItem = new CRM_Financial_DAO_FinancialItem();
61 $financialItem->copyValues($params);
62 if ($financialItem->find(TRUE)) {
63 CRM_Core_DAO::storeValues($financialItem, $defaults);
64 return $financialItem;
65 }
66 return NULL;
67 }
68
69 /**
70 * function to add the financial items and financial trxn
71 *
72 * @param object $lineItem line item object
73 * @param object $contribution contribution object
03e04002 74 *
6a488035 75 * @access public
03e04002 76 * @static
6a488035
TO
77 * @return void
78 */
79 static function add($lineItem, $contribution) {
80 $contributionStatuses = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
7611ae71 81 $financialItemStatus = CRM_Core_PseudoConstant::get('CRM_Financial_DAO_FinancialItem', 'status_id');
b81ee58c 82 $itemStatus = NULL;
6a488035
TO
83 if ($contribution->contribution_status_id == array_search('Completed', $contributionStatuses)) {
84 $itemStatus = array_search('Paid', $financialItemStatus);
03e04002 85 }
f6bae84f 86 elseif ($contribution->contribution_status_id == array_search('Pending', $contributionStatuses)
b81ee58c 87 || $contribution->contribution_status_id == array_search('In Progress', $contributionStatuses)) {
6a488035 88 $itemStatus = array_search('Unpaid', $financialItemStatus);
03e04002 89 }
f8325309
PJ
90 elseif ($contribution->contribution_status_id == array_search('Partially paid', $contributionStatuses)) {
91 $itemStatus = array_search('Partially paid', $financialItemStatus);
92 }
6a488035
TO
93 $params = array(
94 'transaction_date' => CRM_Utils_Date::isoToMysql($contribution->receive_date),
03e04002 95 'contact_id' => $contribution->contact_id,
6a488035
TO
96 'amount' => $lineItem->line_total,
97 'currency' => $contribution->currency,
98 'entity_table' => 'civicrm_line_item',
99 'entity_id' => $lineItem->id,
100 'description' => ( $lineItem->qty != 1 ? $lineItem->qty . ' of ' : ''). ' ' . $lineItem->label,
101 'status_id' => $itemStatus,
102 );
03e04002 103
6a488035 104 if ($lineItem->financial_type_id) {
03e04002 105 $searchParams = array(
6a488035
TO
106 'entity_table' => 'civicrm_financial_type',
107 'entity_id' => $lineItem->financial_type_id,
108 'account_relationship' => 1,
109 );
110
111 $result = array();
112 CRM_Financial_BAO_FinancialTypeAccount::retrieve( $searchParams, $result );
113 $params['financial_account_id'] = CRM_Utils_Array::value( 'financial_account_id', $result );
114 }
115
116 $trxn = CRM_Core_BAO_FinancialTrxn::getFinancialTrxnId($contribution->id, 'ASC', TRUE);
117 $trxnId['id'] = $trxn['financialTrxnId'];
0aaf8fe9 118 return self::create($params, NULL, $trxnId);
03e04002 119 }
6a488035
TO
120
121 /**
122 * function to create the financial Items and financial enity trxn
123 *
124 * @param array $params associated array to create financial items
125 * @param array $ids financial item ids
126 * @param array $trxnIds financial item ids
03e04002 127 *
6a488035 128 * @access public
03e04002 129 * @static
6a488035
TO
130 * @return object
131 */
132 static function create(&$params, $ids = NULL, $trxnIds = NULL) {
133 $financialItem = new CRM_Financial_DAO_FinancialItem();
134 $financialItem->copyValues($params);
a7488080 135 if (!empty($ids['id'])) {
03e04002 136 $financialItem->id = $ids['id'];
6a488035
TO
137 }
138
139 $financialItem->save();
a7488080 140 if (!empty($trxnIds['id'])) {
6a488035
TO
141 $entity_financial_trxn_params = array(
142 'entity_table' => "civicrm_financial_item",
143 'entity_id' => $financialItem->id,
144 'financial_trxn_id' => $trxnIds['id'],
145 'amount' => $params['amount'],
146 );
03e04002 147
6a488035
TO
148 $entity_trxn = new CRM_Financial_DAO_EntityFinancialTrxn();
149 $entity_trxn->copyValues($entity_financial_trxn_params);
a7488080 150 if (!empty($ids['entityFinancialTrxnId'])) {
6a488035
TO
151 $entity_trxn->id = $ids['entityFinancialTrxnId'];
152 }
153 $entity_trxn->save();
154 }
155 return $financialItem;
03e04002 156 }
6a488035
TO
157
158 /**
159 * takes an associative array and creates a entity financial transaction object
160 *
161 * @param array $params (reference ) an assoc array of name/value pairs
162 *
163 * @return object CRM_Core_BAO_FinancialTrxn object
164 * @access public
165 * @static
166 */
167 static function createEntityTrxn($params) {
168 $entity_trxn = new CRM_Financial_DAO_EntityFinancialTrxn();
169 $entity_trxn->copyValues($params);
170 $entity_trxn->save();
171 return $entity_trxn;
172 }
173
174 /**
175 * retrive entity financial trxn details
176 *
177 * @param array $params (reference ) an assoc array of name/value pairs
178 *
03e04002 179 * @param boolean $maxID to retrive max id
6a488035
TO
180 *
181 * @return array
182 * @access public
183 * @static
184 */
185 static function retrieveEntityFinancialTrxn($params, $maxId = FALSE) {
186 $financialItem = new CRM_Financial_DAO_EntityFinancialTrxn();
187 $financialItem->copyValues($params);
188 //retrieve last entry from civicrm_entity_financial_trxn
189 if ($maxId) {
190 $financialItem->orderBy('id DESC');
191 $financialItem->limit(1);
192 }
193 $financialItem->find();
194 while ($financialItem->fetch()) {
195 $financialItems[$financialItem->id] = array(
196 'id' => $financialItem->id,
197 'entity_table' => $financialItem->entity_table,
198 'entity_id' => $financialItem->entity_id,
199 'financial_trxn_id' => $financialItem->financial_trxn_id,
200 'amount' => $financialItem->amount,
201 );
03e04002 202 }
6a488035
TO
203 if (!empty($financialItems)) {
204 return $financialItems;
205 }
206 else {
207 return null;
208 }
209 }
2efcf0c2 210
f182074e
PN
211 /**
212 * check if contact is present in financial_item table
213 *
214 * CRM-12929
215 *
216 * @param array $contactIds an array contact id's
217 *
218 * @param array $error error to display
219 *
220 * @return array
221 * @access public
222 * @static
223 */
224 static function checkContactPresent($contactIds, &$error) {
225 if (empty($contactIds)) {
226 return FALSE;
227 }
2efcf0c2 228
f182074e
PN
229 $allowPermDelete = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'allowPermDeleteFinancial');
230
231 if (!$allowPermDelete) {
232 $sql = 'SELECT DISTINCT(cc.id), cc.display_name FROM civicrm_contact cc
233INNER JOIN civicrm_contribution con ON con.contact_id = cc.id
234WHERE cc.id IN (' . implode (',', $contactIds) . ') AND con.is_test = 0';
235 $dao = CRM_Core_DAO::executeQuery($sql);
236 if ($dao->N) {
237 while ($dao->fetch()) {
238 $url = CRM_Utils_System::url('civicrm/contact/view', "reset=1&cid=$dao->id");
239 $not_deleted[$dao->id] = "<a href='$url'>$dao->display_name</a>";
240 }
2efcf0c2 241
f182074e
PN
242 $errorStatus = '';
243 if (is_array($error)) {
244 $errorStatus = '<ul><li>' . implode('</li><li>', $not_deleted) . '</li></ul>';
245 }
2efcf0c2 246
f182074e 247 $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.');
2efcf0c2 248 return $error;
f182074e
PN
249 }
250 }
251 return FALSE;
252 }
6a488035 253}