Merge remote-tracking branch 'upstream/4.5' into 4.5-master-2015-02-02-18-36-16
[civicrm-core.git] / CRM / Financial / BAO / FinancialItem.php
CommitLineData
6a488035 1<?php
6a488035
TO
2/*
3 +--------------------------------------------------------------------+
39de6fd5 4 | CiviCRM version 4.6 |
6a488035 5 +--------------------------------------------------------------------+
06b69b18 6 | Copyright CiviCRM LLC (c) 2004-2014 |
6a488035
TO
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 +--------------------------------------------------------------------+
d25dd0ee 26 */
6a488035
TO
27
28/**
29 *
30 * @package CRM
06b69b18 31 * @copyright CiviCRM LLC (c) 2004-2014
6a488035
TO
32 * $Id$
33 *
34 */
6a488035
TO
35class CRM_Financial_BAO_FinancialItem extends CRM_Financial_DAO_FinancialItem {
36
37 /**
100fef9d 38 * Class constructor
6a488035 39 */
045f52a3 40 public function __construct() {
481a74f4 41 parent::__construct();
6a488035
TO
42 }
43
44 /**
c490a46a 45 * Fetch object based on array of properties
6a488035 46 *
ed5dd492
TO
47 * @param array $params
48 * (reference ) an assoc array of name/value pairs.
49 * @param array $defaults
50 * (reference ) an assoc array to hold the flattened values.
6a488035 51 *
16b10e64 52 * @return CRM_Contribute_BAO_FinancialItem
6a488035 53 */
00be9182 54 public static function retrieve(&$params, &$defaults) {
6a488035
TO
55 $financialItem = new CRM_Financial_DAO_FinancialItem();
56 $financialItem->copyValues($params);
57 if ($financialItem->find(TRUE)) {
58 CRM_Core_DAO::storeValues($financialItem, $defaults);
59 return $financialItem;
60 }
61 return NULL;
62 }
63
64 /**
100fef9d 65 * Add the financial items and financial trxn
6a488035 66 *
ed5dd492
TO
67 * @param object $lineItem
68 * Line item object.
69 * @param object $contribution
70 * Contribution object.
71 * @param bool $taxTrxnID
03e04002 72 *
6a488035
TO
73 * @return void
74 */
00be9182 75 public static function add($lineItem, $contribution, $taxTrxnID = FALSE) {
6a488035 76 $contributionStatuses = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
7611ae71 77 $financialItemStatus = CRM_Core_PseudoConstant::get('CRM_Financial_DAO_FinancialItem', 'status_id');
b81ee58c 78 $itemStatus = NULL;
0bdf3091 79 if ($contribution->contribution_status_id == array_search('Completed', $contributionStatuses)
353ffa53
TO
80 || $contribution->contribution_status_id == array_search('Pending refund', $contributionStatuses)
81 ) {
6a488035 82 $itemStatus = array_search('Paid', $financialItemStatus);
03e04002 83 }
f6bae84f 84 elseif ($contribution->contribution_status_id == array_search('Pending', $contributionStatuses)
353ffa53
TO
85 || $contribution->contribution_status_id == array_search('In Progress', $contributionStatuses)
86 ) {
6a488035 87 $itemStatus = array_search('Unpaid', $financialItemStatus);
03e04002 88 }
f8325309
PJ
89 elseif ($contribution->contribution_status_id == array_search('Partially paid', $contributionStatuses)) {
90 $itemStatus = array_search('Partially paid', $financialItemStatus);
91 }
6a488035 92 $params = array(
353ffa53
TO
93 'transaction_date' => CRM_Utils_Date::isoToMysql($contribution->receive_date),
94 'contact_id' => $contribution->contact_id,
95 'amount' => $lineItem->line_total,
96 'currency' => $contribution->currency,
97 'entity_table' => 'civicrm_line_item',
98 'entity_id' => $lineItem->id,
99 'description' => ($lineItem->qty != 1 ? $lineItem->qty . ' of ' : '') . ' ' . $lineItem->label,
100 'status_id' => $itemStatus,
6a488035 101 );
03e04002 102
0b7bd9dd 103 if ($taxTrxnID) {
5a18a545 104 $invoiceSettings = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::CONTRIBUTE_PREFERENCES_NAME, 'contribution_invoice_settings');
105 $taxTerm = CRM_Utils_Array::value('tax_term', $invoiceSettings);
0b7bd9dd 106 $params['amount'] = $lineItem->tax_amount;
5a18a545 107 $params['description'] = $taxTerm;
0b7bd9dd 108 $accountRel = key(CRM_Core_PseudoConstant::accountOptionValues('account_relationship', NULL, " AND v.name LIKE 'Sales Tax Account is' "));
109 }
110 else {
111 $accountRel = key(CRM_Core_PseudoConstant::accountOptionValues('account_relationship', NULL, " AND v.name LIKE 'Income Account is' "));
112 }
6a488035 113 if ($lineItem->financial_type_id) {
03e04002 114 $searchParams = array(
353ffa53
TO
115 'entity_table' => 'civicrm_financial_type',
116 'entity_id' => $lineItem->financial_type_id,
0b7bd9dd 117 'account_relationship' => $accountRel,
6a488035
TO
118 );
119
120 $result = array();
481a74f4
TO
121 CRM_Financial_BAO_FinancialTypeAccount::retrieve($searchParams, $result);
122 $params['financial_account_id'] = CRM_Utils_Array::value('financial_account_id', $result);
6a488035 123 }
c40e1ff4 124 $trxn = CRM_Core_BAO_FinancialTrxn::getFinancialTrxnId($contribution->id, 'ASC', TRUE);
125 $trxnId['id'] = $trxn['financialTrxnId'];
6a488035 126
0aaf8fe9 127 return self::create($params, NULL, $trxnId);
03e04002 128 }
6a488035
TO
129
130 /**
100fef9d 131 * Create the financial Items and financial enity trxn
6a488035 132 *
ed5dd492
TO
133 * @param array $params
134 * Associated array to create financial items.
135 * @param array $ids
136 * Financial item ids.
137 * @param array $trxnIds
138 * Financial item ids.
03e04002 139 *
6a488035
TO
140 * @return object
141 */
00be9182 142 public static function create(&$params, $ids = NULL, $trxnIds = NULL) {
6a488035 143 $financialItem = new CRM_Financial_DAO_FinancialItem();
045f52a3 144
a9ed1dc0
PN
145 if (!empty($ids['id'])) {
146 CRM_Utils_Hook::pre('edit', 'FinancialItem', $ids['id'], $params);
147 }
148 else {
149 CRM_Utils_Hook::pre('create', 'FinancialItem', NULL, $params);
150 }
045f52a3 151
6a488035 152 $financialItem->copyValues($params);
a7488080 153 if (!empty($ids['id'])) {
03e04002 154 $financialItem->id = $ids['id'];
6a488035
TO
155 }
156
157 $financialItem->save();
a7488080 158 if (!empty($trxnIds['id'])) {
6a488035 159 $entity_financial_trxn_params = array(
353ffa53
TO
160 'entity_table' => "civicrm_financial_item",
161 'entity_id' => $financialItem->id,
6a488035 162 'financial_trxn_id' => $trxnIds['id'],
353ffa53 163 'amount' => $params['amount'],
6a488035 164 );
03e04002 165
6a488035
TO
166 $entity_trxn = new CRM_Financial_DAO_EntityFinancialTrxn();
167 $entity_trxn->copyValues($entity_financial_trxn_params);
a7488080 168 if (!empty($ids['entityFinancialTrxnId'])) {
6a488035
TO
169 $entity_trxn->id = $ids['entityFinancialTrxnId'];
170 }
171 $entity_trxn->save();
172 }
a9ed1dc0
PN
173 if (!empty($ids['id'])) {
174 CRM_Utils_Hook::post('edit', 'FinancialItem', $financialItem->id, $financialItem);
175 }
045f52a3 176 else {
a9ed1dc0
PN
177 CRM_Utils_Hook::post('create', 'FinancialItem', $financialItem->id, $financialItem);
178 }
6a488035 179 return $financialItem;
03e04002 180 }
6a488035
TO
181
182 /**
100fef9d 183 * Takes an associative array and creates a entity financial transaction object
6a488035 184 *
ed5dd492
TO
185 * @param array $params
186 * (reference ) an assoc array of name/value pairs.
6a488035 187 *
16b10e64 188 * @return CRM_Core_BAO_FinancialTrxn
6a488035 189 */
00be9182 190 public static function createEntityTrxn($params) {
6a488035
TO
191 $entity_trxn = new CRM_Financial_DAO_EntityFinancialTrxn();
192 $entity_trxn->copyValues($params);
193 $entity_trxn->save();
194 return $entity_trxn;
195 }
196
197 /**
100fef9d 198 * Retrive entity financial trxn details
6a488035 199 *
ed5dd492
TO
200 * @param array $params
201 * (reference ) an assoc array of name/value pairs.
202 * @param bool $maxId
203 * To retrive max id.
6a488035
TO
204 *
205 * @return array
6a488035 206 */
00be9182 207 public static function retrieveEntityFinancialTrxn($params, $maxId = FALSE) {
6a488035
TO
208 $financialItem = new CRM_Financial_DAO_EntityFinancialTrxn();
209 $financialItem->copyValues($params);
210 //retrieve last entry from civicrm_entity_financial_trxn
211 if ($maxId) {
212 $financialItem->orderBy('id DESC');
213 $financialItem->limit(1);
214 }
215 $financialItem->find();
216 while ($financialItem->fetch()) {
217 $financialItems[$financialItem->id] = array(
353ffa53
TO
218 'id' => $financialItem->id,
219 'entity_table' => $financialItem->entity_table,
220 'entity_id' => $financialItem->entity_id,
6a488035 221 'financial_trxn_id' => $financialItem->financial_trxn_id,
353ffa53 222 'amount' => $financialItem->amount,
6a488035 223 );
03e04002 224 }
6a488035
TO
225 if (!empty($financialItems)) {
226 return $financialItems;
227 }
228 else {
045f52a3 229 return NULL;
6a488035
TO
230 }
231 }
2efcf0c2 232
f182074e 233 /**
100fef9d 234 * Check if contact is present in financial_item table
f182074e
PN
235 *
236 * CRM-12929
237 *
ed5dd492
TO
238 * @param array $contactIds
239 * An array contact id's.
f182074e 240 *
ed5dd492
TO
241 * @param array $error
242 * Error to display.
f182074e
PN
243 *
244 * @return array
f182074e 245 */
00be9182 246 public static function checkContactPresent($contactIds, &$error) {
f182074e
PN
247 if (empty($contactIds)) {
248 return FALSE;
249 }
2efcf0c2 250
f182074e
PN
251 $allowPermDelete = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'allowPermDeleteFinancial');
252
253 if (!$allowPermDelete) {
254 $sql = 'SELECT DISTINCT(cc.id), cc.display_name FROM civicrm_contact cc
255INNER JOIN civicrm_contribution con ON con.contact_id = cc.id
045f52a3 256WHERE cc.id IN (' . implode(',', $contactIds) . ') AND con.is_test = 0';
f182074e
PN
257 $dao = CRM_Core_DAO::executeQuery($sql);
258 if ($dao->N) {
259 while ($dao->fetch()) {
260 $url = CRM_Utils_System::url('civicrm/contact/view', "reset=1&cid=$dao->id");
261 $not_deleted[$dao->id] = "<a href='$url'>$dao->display_name</a>";
262 }
2efcf0c2 263
f182074e
PN
264 $errorStatus = '';
265 if (is_array($error)) {
266 $errorStatus = '<ul><li>' . implode('</li><li>', $not_deleted) . '</li></ul>';
267 }
2efcf0c2 268
86bfa4f6 269 $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 270 return $error;
f182074e
PN
271 }
272 }
273 return FALSE;
274 }
96025800 275
6a488035 276}