-
-
Notifications
You must be signed in to change notification settings - Fork 814
/
PriceFieldValue.php
261 lines (239 loc) · 7.79 KB
/
PriceFieldValue.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
<?php
/*
+--------------------------------------------------------------------+
| Copyright CiviCRM LLC. All rights reserved. |
| |
| This work is published under the GNU AGPLv3 license with some |
| permitted exceptions and without any warranty. For full license |
| and copyright information, see https://civicrm.org/licensing |
+--------------------------------------------------------------------+
*/
/**
*
* @package CRM
* @copyright CiviCRM LLC https://civicrm.org/licensing
*/
/**
* Business objects for managing price fields values.
*
*/
class CRM_Price_BAO_PriceFieldValue extends CRM_Price_DAO_PriceFieldValue {
/**
* Insert/update a new entry in the database.
*
* @param array $params
*
* @return CRM_Price_DAO_PriceFieldValue
*/
public static function add($params) {
$fieldValueBAO = self::writeRecord($params);
if (!empty($params['is_default'])) {
$priceFieldID = $params['price_field_id'] ?? CRM_Core_DAO::getFieldValue('CRM_Price_BAO_PriceFieldValue', $fieldValueBAO->id, 'price_field_id');
$query = 'UPDATE civicrm_price_field_value SET is_default = 0 WHERE price_field_id = %1 and id != %2';
$p = [1 => [$priceFieldID, 'Integer'], 2 => [$fieldValueBAO->id, 'Integer']];
CRM_Core_DAO::executeQuery($query, $p);
}
// Reset the cached values in this function.
CRM_Price_BAO_PriceField::getOptions(CRM_Utils_Array::value('price_field_id', $params), FALSE, TRUE);
return $fieldValueBAO;
}
/**
* Creates a new entry in the database.
*
* @param array $params
* (reference), array $ids.
*
* @param $ids
*
* @return CRM_Price_DAO_PriceFieldValue
*
* @throws \CRM_Core_Exception
*/
public static function create(&$params, $ids = []) {
$id = $params['id'] ?? $ids['id'] ?? NULL;
if (!is_array($params) || empty($params)) {
return NULL;
}
if (!$id && empty($params['name'])) {
$params['name'] = strtolower(CRM_Utils_String::munge(($params['label'] ?? '_'), '_', 242));
}
if ($id && !empty($params['weight'])) {
if (isset($params['name'])) {
unset($params['name']);
}
$oldWeight = NULL;
if ($id) {
$oldWeight = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $id, 'weight', 'id');
}
$fieldValues = ['price_field_id' => $params['price_field_id'] ?? 0];
$params['weight'] = CRM_Utils_Weight::updateOtherWeights('CRM_Price_DAO_PriceFieldValue', $oldWeight, $params['weight'], $fieldValues);
}
elseif (!$id) {
CRM_Core_DAO::setCreateDefaults($params, self::getDefaults());
}
$financialType = $params['financial_type_id'] ?? NULL;
if (!$financialType && $id) {
$financialType = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $id, 'financial_type_id', 'id');
}
CRM_Financial_BAO_FinancialType::getAvailableFinancialTypes($financialTypes);
if (!empty($financialType) && !array_key_exists($financialType, $financialTypes) && $params['is_active']) {
throw new CRM_Core_Exception("Financial Type for Price Field Option is either disabled or does not exist");
}
$params['id'] = $id;
return self::add($params);
}
/**
* Get defaults for new entity.
* @return array
*/
public static function getDefaults() {
return [
'is_active' => 1,
'weight' => 1,
];
}
/**
* @deprecated
* @param array $params
* @param array $defaults
* @return self|null
*/
public static function retrieve($params, &$defaults) {
return self::commonRetrieve(self::class, $params, $defaults);
}
/**
* Retrieve all values for given field id.
*
* @param int $fieldId
* Price_field_id.
* @param array $values
* (reference ) to hold the values.
* @param string $orderBy
* For order by, default weight.
* @param bool|int $isActive is_active, default false
* @param bool $admin is this loading it for use on an admin page.
*
* @return array
*
*/
public static function getValues($fieldId, &$values, $orderBy = 'weight', $isActive = FALSE, $admin = FALSE) {
$sql = "SELECT cs.id FROM civicrm_price_set cs INNER JOIN civicrm_price_field cp ON cp.price_set_id = cs.id
WHERE cs.name IN ('default_contribution_amount', 'default_membership_type_amount') AND cp.id = {$fieldId} ";
$setId = CRM_Core_DAO::singleValueQuery($sql);
$fieldValueDAO = new CRM_Price_DAO_PriceFieldValue();
$fieldValueDAO->price_field_id = $fieldId;
$addWhere = '';
if (!$setId) {
CRM_Financial_BAO_FinancialType::getAvailableFinancialTypes($financialTypes);
if (!$admin) {
$addWhere = "financial_type_id IN (0)";
}
if (!empty($financialTypes) && !$admin) {
$addWhere = "financial_type_id IN (" . implode(',', array_keys($financialTypes)) . ")";
}
if (!empty($addWhere)) {
$fieldValueDAO->whereAdd($addWhere);
}
}
$fieldValueDAO->orderBy($orderBy, 'label');
if ($isActive) {
$fieldValueDAO->is_active = 1;
}
$fieldValueDAO->find();
while ($fieldValueDAO->fetch()) {
CRM_Core_DAO::storeValues($fieldValueDAO, $values[$fieldValueDAO->id]);
}
return $values;
}
/**
* Get the price field option label.
*
* @param int $id
* Id of field option.
*
* @return string
* name
*
*/
public static function getOptionLabel($id) {
return CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $id, 'label');
}
/**
* @deprecated - this bypasses hooks.
* @param int $id
* @param bool $is_active
* @return bool
*/
public static function setIsActive($id, $is_active) {
return CRM_Core_DAO::setFieldValue('CRM_Price_DAO_PriceFieldValue', $id, 'is_active', $is_active);
}
/**
* Delete all values of the given field id.
*
* @param int $fieldId
* Price field id.
*
*
*/
public static function deleteValues($fieldId) {
if (!$fieldId) {
return;
}
$fieldValueDAO = new CRM_Price_DAO_PriceFieldValue();
$fieldValueDAO->price_field_id = $fieldId;
$fieldValueDAO->delete();
}
/**
* Delete the value.
*
* @param int $id
*
* @deprecated
* @return bool
*/
public static function del($id) {
CRM_Core_Error::deprecatedFunctionWarning('deleteRecord');
return (bool) self::deleteRecord(['id' => $id]);
}
/**
* Update civicrm_price_field_value.financial_type_id
* when financial_type_id of contribution_page or event is changed
*
* @param int $entityId
* Id.
* @param string $entityTable table.
* Entity table.
* @param string $financialTypeID type id.
* Financial type id.
*
*/
public static function updateFinancialType($entityId, $entityTable, $financialTypeID) {
if (!$entityId || !$entityTable || !$financialTypeID) {
return;
}
$params = [
1 => [$entityId, 'Integer'],
2 => [$entityTable, 'String'],
3 => [$financialTypeID, 'Integer'],
];
// for event discount
$join = $where = '';
if ($entityTable == 'civicrm_event') {
$join = " LEFT JOIN civicrm_discount cd ON cd.price_set_id = cps.id AND cd.entity_id = %1 AND cd.entity_table = %2 ";
$where = ' OR cd.id IS NOT NULL ';
}
$sql = "UPDATE civicrm_price_set cps
LEFT JOIN civicrm_price_set_entity cpse ON cpse.price_set_id = cps.id AND cpse.entity_id = %1 AND cpse.entity_table = %2
LEFT JOIN civicrm_price_field cpf ON cpf.price_set_id = cps.id
LEFT JOIN civicrm_price_field_value cpfv ON cpf.id = cpfv.price_field_id
{$join}
SET cpfv.financial_type_id = CASE
WHEN cpfv.membership_type_id IS NOT NULL
THEN cpfv.financial_type_id
ELSE %3
END,
cps.financial_type_id = %3
WHERE cpse.id IS NOT NULL {$where}";
CRM_Core_DAO::executeQuery($sql, $params);
}
}