Commit | Line | Data |
---|---|---|
6a488035 TO |
1 | <?php |
2 | /* | |
3 | +--------------------------------------------------------------------+ | |
06b69b18 | 4 | | CiviCRM version 4.5 | |
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 | +--------------------------------------------------------------------+ | |
26 | */ | |
27 | ||
28 | /** | |
29 | * | |
30 | * @package CRM | |
06b69b18 | 31 | * @copyright CiviCRM LLC (c) 2004-2014 |
6a488035 TO |
32 | * $Id$ |
33 | * | |
34 | */ | |
35 | class CRM_Member_BAO_MembershipType extends CRM_Member_DAO_MembershipType { | |
36 | ||
37 | /** | |
38 | * static holder for the default LT | |
39 | */ | |
40 | static $_defaultMembershipType = NULL; | |
41 | ||
42 | static $_membershipTypeInfo = array(); | |
43 | ||
44 | /** | |
45 | * class constructor | |
46 | */ | |
47 | function __construct() { | |
48 | parent::__construct(); | |
49 | } | |
50 | ||
51 | /** | |
52 | * Takes a bunch of params that are needed to match certain criteria and | |
53 | * retrieves the relevant objects. Typically the valid params are only | |
54 | * contact_id. We'll tweak this function to be more full featured over a period | |
55 | * of time. This is the inverse function of create. It also stores all the retrieved | |
56 | * values in the default array | |
57 | * | |
58 | * @param array $params (reference ) an assoc array of name/value pairs | |
59 | * @param array $defaults (reference ) an assoc array to hold the flattened values | |
60 | * | |
61 | * @return object CRM_Member_BAO_MembershipType object | |
62 | * @access public | |
63 | * @static | |
64 | */ | |
65 | static function retrieve(&$params, &$defaults) { | |
66 | $membershipType = new CRM_Member_DAO_MembershipType(); | |
67 | $membershipType->copyValues($params); | |
68 | if ($membershipType->find(TRUE)) { | |
69 | CRM_Core_DAO::storeValues($membershipType, $defaults); | |
70 | return $membershipType; | |
71 | } | |
72 | return NULL; | |
73 | } | |
74 | ||
75 | /** | |
76 | * update the is_active flag in the db | |
77 | * | |
78 | * @param int $id id of the database record | |
79 | * @param boolean $is_active value we want to set the is_active field | |
80 | * | |
81 | * @return Object DAO object on sucess, null otherwise | |
82 | * @static | |
83 | */ | |
84 | static function setIsActive($id, $is_active) { | |
85 | return CRM_Core_DAO::setFieldValue('CRM_Member_DAO_MembershipType', $id, 'is_active', $is_active); | |
86 | } | |
87 | ||
88 | /** | |
89 | * function to add the membership types | |
90 | * | |
91 | * @param array $params reference array contains the values submitted by the form | |
36e3b794 | 92 | * @param array $ids array contains the id (deprecated) |
6a488035 TO |
93 | * |
94 | * @access public | |
95 | * @static | |
96 | * | |
97 | * @return object | |
98 | */ | |
36e3b794 EM |
99 | static function add(&$params, $ids = array()) { |
100 | $id = CRM_Utils_Array::value('id', $params, CRM_Utils_Array::value('membershipType', $ids)); | |
101 | if (!$id) { | |
102 | if (!isset($params['is_active'])) { | |
103 | // do we need this? | |
104 | $params['is_active'] = FALSE; | |
105 | } | |
106 | if (!isset($params['domain_id'])) { | |
107 | $params['domain_id'] = CRM_Core_Config::domainID(); | |
108 | } | |
109 | } | |
6a488035 TO |
110 | |
111 | // action is taken depending upon the mode | |
112 | $membershipType = new CRM_Member_DAO_MembershipType(); | |
6a488035 | 113 | $membershipType->copyValues($params); |
36e3b794 | 114 | $membershipType->id = $id; |
6a488035 | 115 | |
d9f93da9 | 116 | // $previousID is the old organization id for membership type i.e 'member_of_contact_id'. This is used when an oganization is changed. |
6a488035 TO |
117 | $previousID = NULL; |
118 | if ($membershipType->id) { | |
119 | $previousID = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_MembershipType', $membershipType->id, 'member_of_contact_id'); | |
120 | } | |
121 | ||
122 | $membershipType->save(); | |
123 | ||
124 | self::createMembershipPriceField($params, $ids, $previousID, $membershipType->id); | |
125 | // update all price field value for quick config when membership type is set CRM-11718 | |
36e3b794 EM |
126 | if ($id) { |
127 | self::updateAllPriceFieldValue($id, $params); | |
6a488035 TO |
128 | } |
129 | ||
130 | return $membershipType; | |
131 | } | |
132 | ||
133 | /** | |
134 | * Function to delete membership Types | |
135 | * | |
136 | * @param int $membershipTypeId | |
77b97be7 EM |
137 | * |
138 | * @throws CRM_Core_Exception | |
139 | * @return bool|mixed | |
6a488035 TO |
140 | * @static |
141 | */ | |
8c33a68c | 142 | static function del($membershipTypeId) { |
6a488035 TO |
143 | //check dependencies |
144 | $check = FALSE; | |
145 | $status = array(); | |
146 | $dependancy = array( | |
147 | 'Membership' => 'membership_type_id', | |
148 | 'MembershipBlock' => 'membership_type_default', | |
149 | ); | |
150 | ||
151 | foreach ($dependancy as $name => $field) { | |
4d5c2eb5 | 152 | $baoString = 'CRM_Member_BAO_' . $name; |
153 | $dao = new $baoString(); | |
6a488035 TO |
154 | $dao->$field = $membershipTypeId; |
155 | if ($dao->find(TRUE)) { | |
156 | $check = TRUE; | |
157 | $status[] = $name; | |
158 | } | |
159 | } | |
160 | if ($check) { | |
6a488035 TO |
161 | $cnt = 1; |
162 | $message = ts('This membership type cannot be deleted due to following reason(s):'); | |
163 | if (in_array('Membership', $status)) { | |
d6d6bc96 DG |
164 | $findMembersURL = CRM_Utils_System::url('civicrm/member/search', 'reset=1'); |
165 | $deleteURL = CRM_Utils_System::url('civicrm/contact/search/advanced', 'reset=1'); | |
166 | $message .= '<br/>' . ts('%3. There are some contacts who have this membership type assigned to them. Search for contacts with this membership type from <a href=\'%1\'>Find Members</a>. If you are still getting this message after deleting these memberships, there may be contacts in the Trash (deleted) with this membership type. Try using <a href="%2">Advanced Search</a> and checking "Search in Trash".', array(1 => $findMembersURL, 2 => $deleteURL, 3 => $cnt)); | |
6a488035 TO |
167 | $cnt++; |
168 | } | |
169 | ||
170 | if (in_array('MembershipBlock', $status)) { | |
171 | $deleteURL = CRM_Utils_System::url('civicrm/admin/contribute', 'reset=1'); | |
dcc4f6a7 | 172 | $message .= ts('%2. This Membership Type is used in an <a href=\'%1\'>Online Contribution page</a>. Uncheck this membership type in the Memberships tab.', array(1 => $deleteURL, 2 => $cnt)); |
173 | throw new CRM_Core_Exception($message); | |
6a488035 TO |
174 | } |
175 | } | |
dcc4f6a7 | 176 | CRM_Utils_Weight::delWeight('CRM_Member_DAO_MembershipType', $membershipTypeId); |
6a488035 TO |
177 | //delete from membership Type table |
178 | $membershipType = new CRM_Member_DAO_MembershipType(); | |
179 | $membershipType->id = $membershipTypeId; | |
180 | ||
181 | //fix for membership type delete api | |
182 | $result = FALSE; | |
183 | if ($membershipType->find(TRUE)) { | |
8c33a68c | 184 | return $membershipType->delete(); |
6a488035 TO |
185 | } |
186 | ||
187 | return $result; | |
188 | } | |
189 | ||
190 | /** | |
191 | * Function to convert membership Type's 'start day' & 'rollover day' to human readable formats. | |
192 | * | |
193 | * @param array $membershipType an array of membershipType-details. | |
194 | * @static | |
195 | */ | |
196 | static function convertDayFormat(&$membershipType) { | |
197 | $periodDays = array( | |
198 | 'fixed_period_start_day', | |
199 | 'fixed_period_rollover_day', | |
200 | ); | |
201 | foreach ($membershipType as $id => $details) { | |
202 | foreach ($periodDays as $pDay) { | |
a7488080 | 203 | if (!empty($details[$pDay])) { |
6a488035 TO |
204 | if ($details[$pDay] > 31) { |
205 | $month = substr($details[$pDay], 0, strlen($details[$pDay]) - 2); | |
206 | $day = substr($details[$pDay], -2); | |
207 | $monthMap = array( | |
208 | '1' => 'Jan', | |
209 | '2' => 'Feb', | |
210 | '3' => 'Mar', | |
211 | '4' => 'Apr', | |
212 | '5' => 'May', | |
213 | '6' => 'Jun', | |
214 | '7' => 'Jul', | |
215 | '8' => 'Aug', | |
216 | '9' => 'Sep', | |
217 | '10' => 'Oct', | |
218 | '11' => 'Nov', | |
219 | '12' => 'Dec', | |
220 | ); | |
221 | $membershipType[$id][$pDay] = $monthMap[$month] . ' ' . $day; | |
222 | } | |
223 | else { | |
224 | $membershipType[$id][$pDay] = $details[$pDay]; | |
225 | } | |
226 | } | |
227 | } | |
228 | } | |
229 | } | |
230 | ||
231 | /** | |
232 | * Function to get membership Types | |
233 | * | |
77b97be7 EM |
234 | * @param bool $public |
235 | * | |
236 | * @return array | |
237 | * @internal param int $membershipTypeId | |
6a488035 TO |
238 | * @static |
239 | */ | |
240 | static function getMembershipTypes($public = TRUE) { | |
241 | $membershipTypes = array(); | |
242 | $membershipType = new CRM_Member_DAO_MembershipType(); | |
243 | $membershipType->is_active = 1; | |
244 | if ($public) { | |
245 | $membershipType->visibility = 'Public'; | |
246 | } | |
247 | $membershipType->orderBy(' weight'); | |
248 | $membershipType->find(); | |
249 | while ($membershipType->fetch()) { | |
250 | $membershipTypes[$membershipType->id] = $membershipType->name; | |
251 | } | |
252 | $membershipType->free(); | |
253 | return $membershipTypes; | |
254 | } | |
255 | ||
256 | /** | |
257 | * Function to get membership Type Details | |
258 | * | |
259 | * @param int $membershipTypeId | |
77b97be7 EM |
260 | * |
261 | * @return array|null | |
6a488035 TO |
262 | * @static |
263 | */ | |
264 | static function getMembershipTypeDetails($membershipTypeId) { | |
265 | $membershipTypeDetails = array(); | |
266 | ||
267 | $membershipType = new CRM_Member_DAO_MembershipType(); | |
268 | $membershipType->is_active = 1; | |
269 | $membershipType->id = $membershipTypeId; | |
270 | if ($membershipType->find(TRUE)) { | |
271 | CRM_Core_DAO::storeValues($membershipType, $membershipTypeDetails); | |
272 | $membershipType->free(); | |
273 | return $membershipTypeDetails; | |
274 | } | |
275 | else { | |
276 | return NULL; | |
277 | } | |
278 | } | |
279 | ||
280 | /** | |
281 | * Function to calculate start date and end date for new membership | |
282 | * | |
da6b46f4 | 283 | * @param int $membershipTypeId membership type id |
6a488035 TO |
284 | * @param date $joinDate member since ( in mysql date format ) |
285 | * @param date $startDate start date ( in mysql date format ) | |
da6b46f4 EM |
286 | * @param null $endDate |
287 | * @param int $numRenewTerms how many membership terms are being added to end date (default is 1) | |
6a488035 TO |
288 | * |
289 | * @return array associated array with start date, end date and join date for the membership | |
290 | * @static | |
291 | */ | |
292 | public static function getDatesForMembershipType($membershipTypeId, $joinDate = NULL, $startDate = NULL, $endDate = NULL, $numRenewTerms = 1) { | |
293 | $membershipTypeDetails = self::getMembershipTypeDetails($membershipTypeId); | |
294 | ||
295 | // convert all dates to 'Y-m-d' format. | |
296 | foreach (array( | |
297 | 'joinDate', 'startDate', 'endDate') as $dateParam) { | |
298 | if (!empty($$dateParam)) { | |
299 | $$dateParam = CRM_Utils_Date::processDate($$dateParam, NULL, FALSE, 'Y-m-d'); | |
300 | } | |
301 | } | |
302 | if (!$joinDate) { | |
303 | $joinDate = date('Y-m-d'); | |
304 | } | |
305 | $actualStartDate = $joinDate; | |
306 | if ($startDate) { | |
307 | $actualStartDate = $startDate; | |
308 | } | |
309 | ||
310 | $fixed_period_rollover = FALSE; | |
311 | if (CRM_Utils_Array::value('period_type', $membershipTypeDetails) == 'rolling') { | |
312 | if (!$startDate) { | |
313 | $startDate = $joinDate; | |
314 | } | |
315 | $actualStartDate = $startDate; | |
316 | } | |
317 | elseif (CRM_Utils_Array::value('period_type', $membershipTypeDetails) == 'fixed') { | |
5ae96933 DG |
318 | // calculate start date |
319 | // if !$startDate then use $joinDate | |
320 | $toDay = explode('-', (empty($startDate) ? $joinDate : $startDate)); | |
6a488035 TO |
321 | $year = $toDay[0]; |
322 | $month = $toDay[1]; | |
f7660a39 | 323 | $day = $toDay[2]; |
6a488035 TO |
324 | |
325 | if ($membershipTypeDetails['duration_unit'] == 'year') { | |
326 | ||
327 | //get start fixed day | |
328 | $startMonth = substr($membershipTypeDetails['fixed_period_start_day'], 0, | |
329 | strlen($membershipTypeDetails['fixed_period_start_day']) - 2 | |
330 | ); | |
331 | $startDay = substr($membershipTypeDetails['fixed_period_start_day'], -2); | |
332 | ||
f7660a39 DG |
333 | if (date('Y-m-d', mktime(0, 0, 0, $startMonth, $startDay, $year)) <= date('Y-m-d', mktime(0, 0, 0, $month, $day, $year))) { |
334 | $fixedStartDate = date('Y-m-d', mktime(0, 0, 0, $startMonth, $startDay, $year)); | |
335 | } | |
336 | else { | |
337 | $fixedStartDate = date('Y-m-d', mktime(0, 0, 0, $startMonth, $startDay, $year - 1)); | |
338 | } | |
6a488035 TO |
339 | |
340 | //get start rollover day | |
341 | $rolloverMonth = substr($membershipTypeDetails['fixed_period_rollover_day'], 0, | |
342 | strlen($membershipTypeDetails['fixed_period_rollover_day']) - 2 | |
343 | ); | |
344 | $rolloverDay = substr($membershipTypeDetails['fixed_period_rollover_day'], -2); | |
345 | ||
346 | $fixedRolloverDate = date('Y-m-d', mktime(0, 0, 0, $rolloverMonth, $rolloverDay, $year)); | |
347 | ||
348 | //CRM-7825 -membership date rules are : | |
349 | //1. Membership should not be start in future. | |
350 | //2. rollover window should be subset of membership window. | |
351 | ||
352 | //store original fixed start date as per current year. | |
353 | $actualStartDate = $fixedStartDate; | |
354 | ||
355 | //store original fixed rollover date as per current year. | |
356 | $actualRolloverDate = $fixedRolloverDate; | |
357 | ||
6a488035 TO |
358 | //get the fixed end date here. |
359 | $dateParts = explode('-', $actualStartDate); | |
360 | $fixedEndDate = date('Y-m-d', mktime(0, 0, 0, | |
361 | $dateParts[1], | |
362 | $dateParts[2] - 1, | |
363 | $dateParts[0] + ($numRenewTerms * $membershipTypeDetails['duration_interval']) | |
364 | )); | |
365 | ||
366 | //make sure rollover window should be | |
367 | //subset of membership period window. | |
368 | if ($fixedEndDate < $actualRolloverDate) { | |
369 | $actualRolloverDate = date('Y-m-d', mktime(0, 0, 0, $rolloverMonth, $rolloverDay, $year - 1)); | |
370 | } | |
371 | if ($actualRolloverDate < $actualStartDate) { | |
372 | $actualRolloverDate = date('Y-m-d', mktime(0, 0, 0, $rolloverMonth, $rolloverDay, $year + 1)); | |
373 | } | |
374 | ||
375 | //do check signup is in rollover window. | |
376 | if ($actualRolloverDate <= $joinDate) { | |
377 | $fixed_period_rollover = TRUE; | |
378 | } | |
379 | ||
380 | if (!$startDate) { | |
381 | $startDate = $actualStartDate; | |
382 | } | |
383 | } | |
384 | elseif ($membershipTypeDetails['duration_unit'] == 'month') { | |
385 | // Check if we are on or after rollover day of the month - CRM-10585 | |
386 | // If so, set fixed_period_rollover TRUE so we increment end_date month below. | |
387 | $dateParts = explode('-', $actualStartDate); | |
388 | if ($dateParts[2] >= $membershipTypeDetails['fixed_period_rollover_day']){ | |
389 | $fixed_period_rollover = True; | |
390 | } | |
03e04002 | 391 | |
6a488035 TO |
392 | // Start date is always first day of actualStartDate month |
393 | if (!$startDate) { | |
394 | $actualStartDate = $startDate = $year . '-' . $month . '-01'; | |
395 | } | |
396 | } | |
397 | } | |
398 | ||
399 | //calculate end date if it is not passed by user | |
400 | if (!$endDate) { | |
401 | //end date calculation | |
402 | $date = explode('-', $actualStartDate); | |
403 | $year = $date[0]; | |
404 | $month = $date[1]; | |
405 | $day = $date[2]; | |
406 | ||
407 | switch ($membershipTypeDetails['duration_unit']) { | |
408 | case 'year': | |
409 | $year = $year + ($numRenewTerms * $membershipTypeDetails['duration_interval']); | |
410 | //extend membership date by duration interval. | |
411 | if ($fixed_period_rollover) { | |
412 | $year += 1; | |
413 | } | |
414 | break; | |
415 | ||
416 | case 'month': | |
417 | $month = $month + ($numRenewTerms * $membershipTypeDetails['duration_interval']); | |
418 | //duration interval is month | |
419 | if ($fixed_period_rollover) { | |
420 | //CRM-10585 | |
421 | $month += 1; | |
422 | } | |
423 | break; | |
424 | ||
425 | case 'day': | |
426 | $day = $day + ($numRenewTerms * $membershipTypeDetails['duration_interval']); | |
427 | ||
428 | if ($fixed_period_rollover) { | |
429 | //Fix Me: Currently we don't allow rollover if | |
430 | //duration interval is day | |
431 | } | |
432 | break; | |
433 | } | |
434 | ||
435 | if ($membershipTypeDetails['duration_unit'] == 'lifetime') { | |
436 | $endDate = NULL; | |
437 | } | |
438 | else { | |
439 | $endDate = date('Y-m-d', mktime(0, 0, 0, $month, $day - 1, $year)); | |
440 | } | |
441 | } | |
442 | ||
443 | $membershipDates = array(); | |
444 | ||
445 | $dates = array( | |
446 | 'start_date' => 'startDate', | |
447 | 'end_date' => 'endDate', | |
448 | 'join_date' => 'joinDate', | |
449 | ); | |
450 | foreach ($dates as $varName => $valName) { | |
451 | $membershipDates[$varName] = CRM_Utils_Date::customFormat($$valName, '%Y%m%d'); | |
452 | } | |
453 | ||
454 | return $membershipDates; | |
455 | } | |
456 | ||
457 | /** | |
458 | * Function to calculate start date and end date for renewal membership | |
459 | * | |
460 | * @param int $membershipId | |
461 | * @param $changeToday | |
462 | * @param int $membershipTypeID - if provided, overrides the membership type of the $membershipID membership | |
463 | * @param int $numRenewTerms how many membership terms are being added to end date (default is 1) | |
464 | * | |
465 | * CRM-7297 Membership Upsell - Added $membershipTypeID param to facilitate calculations of dates when membership type changes | |
466 | * | |
467 | * @return Array array fo the start date, end date and join date of the membership | |
468 | * @static | |
469 | */ | |
470 | public static function getRenewalDatesForMembershipType($membershipId, $changeToday = NULL, $membershipTypeID = NULL, $numRenewTerms = 1) { | |
471 | $params = array('id' => $membershipId); | |
472 | $membershipDetails = CRM_Member_BAO_Membership::getValues($params, $values); | |
473 | $statusID = $membershipDetails[$membershipId]->status_id; | |
01f6b47e CW |
474 | $membershipDates = array( |
475 | 'join_date' => CRM_Utils_Date::customFormat($membershipDetails[$membershipId]->join_date, '%Y%m%d'), | |
476 | ); | |
6a488035 TO |
477 | |
478 | $oldPeriodType = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_MembershipType', | |
479 | CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $membershipId, 'membership_type_id'), 'period_type'); | |
480 | ||
481 | // CRM-7297 Membership Upsell | |
482 | if (is_null($membershipTypeID)) { | |
483 | $membershipTypeDetails = self::getMembershipTypeDetails($membershipDetails[$membershipId]->membership_type_id); | |
484 | } | |
485 | else { | |
486 | $membershipTypeDetails = self::getMembershipTypeDetails($membershipTypeID); | |
487 | } | |
488 | $statusDetails = CRM_Member_BAO_MembershipStatus::getMembershipStatus($statusID); | |
489 | ||
490 | if ($statusDetails['is_current_member'] == 1) { | |
491 | $startDate = $membershipDetails[$membershipId]->start_date; | |
492 | // CRM=7297 Membership Upsell: we need to handle null end_date in case we are switching | |
493 | // from a lifetime to a different membership type | |
494 | if (is_null($membershipDetails[$membershipId]->end_date)) { | |
495 | $date = date('Y-m-d'); | |
496 | } | |
497 | else { | |
498 | $date = $membershipDetails[$membershipId]->end_date; | |
499 | } | |
500 | $date = explode('-', $date); | |
501 | $logStartDate = date('Y-m-d', mktime(0, 0, 0, | |
502 | (double) $date[1], | |
503 | (double)($date[2] + 1), | |
504 | (double) $date[0] | |
505 | )); | |
506 | ||
507 | $date = explode('-', $logStartDate); | |
508 | $year = $date[0]; | |
509 | $month = $date[1]; | |
510 | $day = $date[2]; | |
511 | ||
512 | switch ($membershipTypeDetails['duration_unit']) { | |
513 | case 'year': | |
514 | //need to check if the upsell is from rolling to fixed and adjust accordingly | |
515 | if ($membershipTypeDetails['period_type'] == 'fixed' && $oldPeriodType == 'rolling' ) { | |
516 | $month = substr($membershipTypeDetails['fixed_period_start_day'], 0, strlen($membershipTypeDetails['fixed_period_start_day']) - 2); | |
517 | $day = substr($membershipTypeDetails['fixed_period_start_day'], -2); | |
518 | $year += 1; | |
519 | } else { | |
520 | $year = $year + ($numRenewTerms * $membershipTypeDetails['duration_interval']); | |
521 | } | |
522 | break; | |
523 | ||
524 | case 'month': | |
525 | $month = $month + ($numRenewTerms * $membershipTypeDetails['duration_interval']); | |
526 | break; | |
527 | ||
528 | case 'day': | |
529 | $day = $day + ($numRenewTerms * $membershipTypeDetails['duration_interval']); | |
530 | break; | |
531 | } | |
532 | if ($membershipTypeDetails['duration_unit'] == 'lifetime') { | |
533 | $endDate = NULL; | |
534 | } | |
535 | else { | |
536 | $endDate = date('Y-m-d', mktime(0, 0, 0, | |
537 | $month, | |
538 | $day - 1, | |
539 | $year | |
540 | )); | |
541 | } | |
542 | $today = date('Y-m-d'); | |
6a488035 TO |
543 | $membershipDates['today'] = CRM_Utils_Date::customFormat($today, '%Y%m%d'); |
544 | $membershipDates['start_date'] = CRM_Utils_Date::customFormat($startDate, '%Y%m%d'); | |
545 | $membershipDates['end_date'] = CRM_Utils_Date::customFormat($endDate, '%Y%m%d'); | |
546 | $membershipDates['log_start_date'] = CRM_Utils_Date::customFormat($logStartDate, '%Y%m%d'); | |
547 | } | |
548 | else { | |
549 | $today = date('Y-m-d'); | |
550 | if ($changeToday) { | |
551 | $today = CRM_Utils_Date::processDate($changeToday, NULL, FALSE, 'Y-m-d'); | |
552 | } | |
553 | // Calculate new start/end dates when join date is today | |
554 | $renewalDates = self::getDatesForMembershipType($membershipTypeDetails['id'], | |
555 | $today, NULL, NULL, $numRenewTerms | |
556 | ); | |
6a488035 TO |
557 | $membershipDates['today'] = CRM_Utils_Date::customFormat($today, '%Y%m%d'); |
558 | $membershipDates['start_date'] = $renewalDates['start_date']; | |
559 | $membershipDates['end_date'] = $renewalDates['end_date']; | |
560 | $membershipDates['log_start_date'] = $renewalDates['start_date']; | |
561 | } | |
562 | ||
563 | return $membershipDates; | |
564 | } | |
565 | ||
566 | /** | |
567 | * Function to retrieve all Membership Types associated | |
568 | * with an Organization | |
569 | * | |
570 | * @param int $orgID Id of Organization | |
571 | * | |
572 | * @return Array array of the details of membership types | |
573 | * @static | |
574 | */ | |
575 | static function getMembershipTypesByOrg($orgID) { | |
576 | $membershipTypes = array(); | |
577 | $dao = new CRM_Member_DAO_MembershipType(); | |
578 | $dao->member_of_contact_id = $orgID; | |
579 | $dao->find(); | |
580 | while ($dao->fetch()) { | |
581 | $membershipTypes[$dao->id] = array(); | |
582 | CRM_Core_DAO::storeValues($dao, $membershipTypes[$dao->id]); | |
583 | } | |
584 | return $membershipTypes; | |
585 | } | |
586 | ||
587 | /** | |
588 | * Function to retrieve all Membership Types with Member of Contact id | |
589 | * | |
590 | * @param array membership types | |
591 | * | |
592 | * @return Array array of the details of membership types with Member of Contact id | |
593 | * @static | |
594 | */ | |
595 | static function getMemberOfContactByMemTypes($membershipTypes) { | |
596 | $memTypeOrgs = array(); | |
597 | if (empty($membershipTypes)) { | |
598 | return $memTypeOrgs; | |
599 | } | |
600 | ||
601 | $result = CRM_Core_DAO::executeQuery("SELECT id, member_of_contact_id FROM civicrm_membership_type WHERE id IN (" . implode(',', $membershipTypes) . ")"); | |
602 | while ($result->fetch()) { | |
603 | $memTypeOrgs[$result->id] = $result->member_of_contact_id; | |
604 | } | |
605 | ||
606 | return $memTypeOrgs; | |
607 | } | |
608 | ||
77b97be7 EM |
609 | /** |
610 | * The function returns all the Organization for all membershiptypes . | |
6a488035 | 611 | * |
77b97be7 EM |
612 | * @param null $membershipTypeId |
613 | * | |
614 | * @return array | |
615 | * @internal param array $allmembershipTypes array of allMembershipTypes | |
616 | * with organization id Key - value pairs. | |
6a488035 TO |
617 | */ |
618 | static function getMembershipTypeOrganization($membershipTypeId = NULL) { | |
619 | $allmembershipTypes = array(); | |
620 | ||
621 | $membershipType = new CRM_Member_DAO_MembershipType(); | |
622 | ||
623 | if (isset($membershipTypeId)) { | |
624 | $membershipType->id = $membershipTypeId; | |
625 | } | |
626 | $membershipType->find(); | |
627 | ||
628 | while ($membershipType->fetch()) { | |
629 | $allmembershipTypes[$membershipType->id] = $membershipType->member_of_contact_id; | |
630 | } | |
631 | return $allmembershipTypes; | |
632 | } | |
633 | ||
634 | /** | |
635 | * Funtion to retrieve organization and associated membership | |
636 | * types | |
637 | * | |
638 | * @return array arrays of organization and membership types | |
639 | * | |
640 | * @static | |
641 | * @access public | |
642 | */ | |
643 | static function getMembershipTypeInfo() { | |
644 | if (!self::$_membershipTypeInfo) { | |
645 | $orgs = $types = array(); | |
646 | ||
647 | $query = 'SELECT memType.id, memType.name, memType.member_of_contact_id, c.sort_name | |
648 | FROM civicrm_membership_type memType INNER JOIN civicrm_contact c ON c.id = memType.member_of_contact_id | |
649 | WHERE memType.is_active = 1 '; | |
650 | $dao = CRM_Core_DAO::executeQuery( $query ); | |
651 | while ($dao->fetch()) { | |
652 | $orgs[$dao->member_of_contact_id] = $dao->sort_name; | |
653 | $types[$dao->member_of_contact_id][$dao->id] = $dao->name; | |
654 | } | |
655 | ||
656 | self::$_membershipTypeInfo = array($orgs, $types); | |
657 | } | |
658 | return self::$_membershipTypeInfo; | |
659 | } | |
660 | ||
661 | ||
bb3a214a EM |
662 | /** |
663 | * @param $params | |
664 | * @param $ids | |
665 | * @param $previousID | |
666 | * @param $membershipTypeId | |
667 | */ | |
6a488035 TO |
668 | public static function createMembershipPriceField($params, $ids, $previousID, $membershipTypeId) { |
669 | ||
9da8dc8c | 670 | $priceSetId = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', 'default_membership_type_amount', 'id', 'name'); |
6a488035 | 671 | |
a7488080 | 672 | if (!empty($params['member_of_contact_id'])) { |
6a488035 TO |
673 | $fieldName = $params['member_of_contact_id']; |
674 | } | |
675 | else { | |
676 | $fieldName = $previousID; | |
677 | } | |
678 | $fieldLabel = 'Membership Amount'; | |
679 | $optionsIds = NULL; | |
680 | $fieldParams = array( | |
681 | 'price_set_id ' => $priceSetId, | |
682 | 'name' => $fieldName, | |
683 | ); | |
684 | $results = array(); | |
9da8dc8c | 685 | CRM_Price_BAO_PriceField::retrieve($fieldParams, $results); |
6a488035 TO |
686 | if (empty($results)) { |
687 | $fieldParams = array(); | |
688 | $fieldParams['label'] = $fieldLabel; | |
689 | $fieldParams['name'] = $fieldName; | |
690 | $fieldParams['price_set_id'] = $priceSetId; | |
691 | $fieldParams['html_type'] = 'Radio'; | |
692 | $fieldParams['is_display_amounts'] = $fieldParams['is_required'] = 0; | |
693 | $fieldParams['weight'] = $fieldParams['option_weight'][1] = 1; | |
694 | $fieldParams['option_label'][1] = $params['name']; | |
0e09eaf5 | 695 | $fieldParams['option_description'][1] = CRM_Utils_Array::value('description', $params); |
03e04002 | 696 | |
6a488035 TO |
697 | $fieldParams['membership_type_id'][1] = $membershipTypeId; |
698 | $fieldParams['option_amount'][1] = empty($params['minimum_fee']) ? 0 : $params['minimum_fee']; | |
699 | $fieldParams['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $params); | |
700 | ||
701 | if ($previousID) { | |
702 | CRM_Member_Form_MembershipType::checkPreviousPriceField($previousID, $priceSetId, $membershipTypeId, $optionsIds); | |
703 | $fieldParams['option_id'] = CRM_Utils_Array::value('option_id', $optionsIds); | |
704 | } | |
9da8dc8c | 705 | $priceField = CRM_Price_BAO_PriceField::create($fieldParams); |
03e04002 | 706 | } |
6a488035 TO |
707 | else { |
708 | $fieldID = $results['id']; | |
709 | $fieldValueParams = array( | |
710 | 'price_field_id' => $fieldID, | |
711 | 'membership_type_id' => $membershipTypeId, | |
712 | ); | |
713 | $results = array(); | |
9da8dc8c | 714 | CRM_Price_BAO_PriceFieldValue::retrieve($fieldValueParams, $results); |
6a488035 TO |
715 | if (!empty($results)) { |
716 | $results['label'] = $results['name'] = $params['name']; | |
717 | $results['amount'] = empty($params['minimum_fee']) ? 0 : $params['minimum_fee']; | |
718 | $optionsIds['id'] = $results['id']; | |
03e04002 | 719 | } |
6a488035 TO |
720 | else { |
721 | $results = array( | |
722 | 'price_field_id' => $fieldID, | |
723 | 'name' => $params['name'], | |
724 | 'label' => $params['name'], | |
725 | 'amount' => empty($params['minimum_fee']) ? 0 : $params['minimum_fee'], | |
726 | 'membership_type_id' => $membershipTypeId, | |
727 | 'is_active' => 1, | |
728 | ); | |
729 | } | |
730 | ||
731 | if ($previousID) { | |
732 | CRM_Member_Form_MembershipType::checkPreviousPriceField($previousID, $priceSetId, $membershipTypeId, $optionsIds); | |
a7488080 | 733 | if (!empty($optionsIds['option_id'])) { |
6a488035 TO |
734 | $optionsIds['id'] = current(CRM_Utils_Array::value('option_id', $optionsIds)); |
735 | } | |
736 | } | |
737 | $results['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $params); | |
0e09eaf5 | 738 | $results['description'] = CRM_Utils_Array::value('description', $params); |
9da8dc8c | 739 | CRM_Price_BAO_PriceFieldValue::add($results, $optionsIds); |
6a488035 TO |
740 | } |
741 | } | |
742 | ||
743 | /** This function updates all price field value for quick config | |
744 | * price set which has membership type | |
745 | * | |
03e04002 | 746 | * @param integer membership type id |
6a488035 | 747 | * |
03e04002 | 748 | * @param integer financial type id |
6a488035 | 749 | */ |
5a9c4d4a | 750 | static function updateAllPriceFieldValue($membershipTypeId, $params) { |
a7488080 | 751 | if (!empty($params['minimum_fee'])){ |
5a9c4d4a PN |
752 | $amount = $params['minimum_fee']; |
753 | } | |
754 | else { | |
755 | $amount = 0; | |
756 | } | |
0e09eaf5 PN |
757 | |
758 | $updateValues = array( | |
759 | 2 => array('financial_type_id', 'financial_type_id', 'Integer'), | |
760 | 3 => array('label', 'name', 'String'), | |
761 | 4 => array('amount', 'minimum_fee', 'Float'), | |
762 | 5 => array('description', 'description', 'String'), | |
763 | ); | |
764 | ||
765 | $queryParams = array(1 => array($membershipTypeId, 'Integer')); | |
03e04002 | 766 | foreach ($updateValues as $key => $value) { |
0e09eaf5 PN |
767 | if (array_key_exists($value[1], $params)) { |
768 | $updateFields[] = "cpfv." . $value[0] . " = %$key"; | |
769 | if ($value[1] == 'minimum_fee') { | |
770 | $fieldValue = $amount; | |
771 | } | |
772 | else { | |
773 | $fieldValue = $params[$value[1]]; | |
774 | } | |
775 | $queryParams[$key] = array($fieldValue, $value[2]); | |
776 | } | |
777 | } | |
778 | ||
6a488035 | 779 | $query = "UPDATE `civicrm_price_field_value` cpfv |
03e04002 | 780 | INNER JOIN civicrm_price_field cpf on cpf.id = cpfv.price_field_id |
6a488035 | 781 | INNER JOIN civicrm_price_set cps on cps.id = cpf.price_set_id |
03e04002 | 782 | SET " . implode(' , ', $updateFields) . " WHERE cpfv.membership_type_id = %1 |
0e09eaf5 PN |
783 | AND cps.is_quick_config = 1 AND cps.name != 'default_membership_type_amount'"; |
784 | CRM_Core_DAO::executeQuery($query, $queryParams); | |
03e04002 | 785 | } |
6a488035 TO |
786 | } |
787 |