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
35 class CRM_Member_BAO_MembershipStatus
extends CRM_Member_DAO_MembershipStatus
{
38 * Static holder for the default LT
40 static $_defaultMembershipStatus = NULL;
45 public function __construct() {
46 parent
::__construct();
50 * Fetch object based on array of properties
52 * @param array $params
53 * (reference ) an assoc array of name/value pairs.
54 * @param array $defaults
55 * (reference ) an assoc array to hold the flattened values.
57 * @return CRM_Member_BAO_MembershipStatus object
60 public static function retrieve(&$params, &$defaults) {
61 $membershipStatus = new CRM_Member_DAO_MembershipStatus();
62 $membershipStatus->copyValues($params);
63 if ($membershipStatus->find(TRUE)) {
64 CRM_Core_DAO
::storeValues($membershipStatus, $defaults);
65 return $membershipStatus;
71 * Update the is_active flag in the db
74 * Id of the database record.
75 * @param bool $is_active
76 * Value we want to set the is_active field.
78 * @return Object DAO object on sucess, null otherwise
81 public static function setIsActive($id, $is_active) {
82 return CRM_Core_DAO
::setFieldValue('CRM_Member_DAO_MembershipStatus', $id, 'is_active', $is_active);
86 * Takes an associative array and creates a membership Status object
87 * See http://wiki.civicrm.org/confluence/display/CRM/Database+layer
89 * @param array $params
90 * (reference ) an assoc array of name/value pairs.
93 * @return CRM_Member_BAO_MembershipStatus object
96 public static function create($params){
98 if(!empty($params['id'])){
99 $ids['membershipStatus'] = $params['id'];
102 //don't allow duplicate names - if id not set
103 $status = new CRM_Member_DAO_MembershipStatus();
104 $status->name
= $params['name'];
105 if ($status->find(TRUE)) {
106 throw new Exception('A membership status with this name already exists.');
109 $membershipStatusBAO = CRM_Member_BAO_MembershipStatus
::add($params, $ids);
110 return $membershipStatusBAO;
113 * Add the membership types
115 * @param array $params
116 * Reference array contains the values submitted by the form.
118 * Array contains the id - this param is deprecated.
124 public static function add(&$params, $ids = array()) {
125 $id = CRM_Utils_Array
::value('id', $params, CRM_Utils_Array
::value('membershipStatus', $ids));
127 CRM_Core_DAO
::setCreateDefaults($params, self
::getDefaults());
128 //copy name to label when not passed.
129 if (empty($params['label']) && !empty($params['name'])) {
130 $params['label'] = $params['name'];
133 if (empty($params['name']) && !empty($params['label'])) {
134 $params['name'] = $params['label'];
138 // set all other defaults to false.
139 if (!empty($params['is_default'])) {
140 $query = "UPDATE civicrm_membership_status SET is_default = 0";
141 CRM_Core_DAO
::executeQuery($query,
142 CRM_Core_DAO
::$_nullArray
146 // action is taken depending upon the mode
147 $membershipStatus = new CRM_Member_DAO_MembershipStatus();
148 $membershipStatus->copyValues($params);
150 $membershipStatus->id
= $id;
152 $membershipStatus->save();
153 return $membershipStatus;
157 * Get defaults for new entity
160 public static function getDefaults() {
162 'is_active' => FALSE,
163 'is_current_member' => FALSE,
165 'is_default' => FALSE,
170 * Get membership status
172 * @param int $membershipStatusId
177 public static function getMembershipStatus($membershipStatusId) {
178 $statusDetails = array();
179 $membershipStatus = new CRM_Member_DAO_MembershipStatus();
180 $membershipStatus->id
= $membershipStatusId;
181 if ($membershipStatus->find(TRUE)) {
182 CRM_Core_DAO
::storeValues($membershipStatus, $statusDetails);
184 return $statusDetails;
188 * Delete membership Types
190 * @param int $membershipStatusId
192 * @throws CRM_Core_Exception
195 public static function del($membershipStatusId) {
197 //checking if membership status is present in some other table
200 $dependancy = array('Membership', 'MembershipLog');
201 foreach ($dependancy as $name) {
202 $baoString = 'CRM_Member_BAO_' . $name;
203 $dao = new $baoString();
204 $dao->status_id
= $membershipStatusId;
205 if ($dao->find(TRUE)) {
206 throw new CRM_Core_Exception(ts('This membership status cannot be deleted as memberships exist with this status'));
209 CRM_Utils_Weight
::delWeight('CRM_Member_DAO_MembershipStatus', $membershipStatusId);
210 //delete from membership Type table
211 $membershipStatus = new CRM_Member_DAO_MembershipStatus();
212 $membershipStatus->id
= $membershipStatusId;
213 $membershipStatus->delete();
214 $membershipStatus->free();
218 * Find the membership status based on start date, end date, join date & status date.
220 * @param string $startDate
221 * Start date of the member whose membership status is to be calculated.
222 * @param string $endDate
223 * End date of the member whose membership status is to be calculated.
224 * @param string $joinDate
225 * Join date of the member whose membership status is to be calculated.
226 * @param \date|string $statusDate status date of the member whose membership status is to be calculated.
227 * @param bool $excludeIsAdminExclude the statuses those having is_admin = 1.
228 * Exclude the statuses those having is_admin = 1.
229 * @param int $membershipTypeID
230 * @param array $membership
231 * Membership params as available to calling function - passed to the hook.
236 static function getMembershipStatusByDate(
237 $startDate, $endDate, $joinDate,
238 $statusDate = 'today', $excludeIsAdmin = FALSE, $membershipTypeID, $membership = array()
240 $membershipDetails = array();
242 if (!$statusDate ||
$statusDate == 'today') {
243 $statusDate = getdate();
244 $statusDate = date('Ymd',
245 mktime($statusDate['hours'],
246 $statusDate['minutes'],
247 $statusDate['seconds'],
255 $statusDate = CRM_Utils_Date
::customFormat($statusDate, '%Y%m%d');
258 $dates = array('start', 'end', 'join');
259 $events = array('start', 'end');
261 foreach ($dates as $dat) {
262 if ($
{$dat . 'Date'} && $
{$dat . 'Date'} != "null") {
263 $
{$dat . 'Date'} = CRM_Utils_Date
::customFormat($
{$dat . 'Date'}, '%Y%m%d');
265 $
{$dat . 'Year'} = substr($
{$dat . 'Date'}, 0, 4);
267 $
{$dat . 'Month'} = substr($
{$dat . 'Date'}, 4, 2);
269 $
{$dat . 'Day'} = substr($
{$dat . 'Date'}, 6, 2);
272 $
{$dat . 'Date'} = '';
276 //fix for CRM-3570, if we have statuses with is_admin=1,
277 //exclude these statuses from calculatation during import.
278 $where = "is_active = 1";
279 if ($excludeIsAdmin) {
280 $where .= " AND is_admin != 1";
285 FROM civicrm_membership_status
287 ORDER BY weight ASC";
289 $membershipStatus = CRM_Core_DAO
::executeQuery($query, CRM_Core_DAO
::$_nullArray);
290 $hour = $minute = $second = 0;
292 while ($membershipStatus->fetch()) {
295 foreach ($events as $eve) {
296 foreach ($dates as $dat) {
297 // calculate start-event/date and end-event/date
298 if (($membershipStatus->{$eve . '_event'} == $dat . '_date') &&
301 if ($membershipStatus->{$eve . '_event_adjust_unit'} &&
302 $membershipStatus->{$eve . '_event_adjust_interval'}
305 if ($membershipStatus->{$eve . '_event_adjust_unit'} == 'month') {
306 $
{$eve . 'Event'} = date('Ymd', mktime($hour, $minute, $second,
307 $
{$dat . 'Month'} +
$membershipStatus->{$eve . '_event_adjust_interval'},
313 if ($membershipStatus->{$eve . '_event_adjust_unit'} == 'day') {
314 $
{$eve . 'Event'} = date('Ymd', mktime($hour, $minute, $second,
316 $
{$dat . 'Day'} +
$membershipStatus->{$eve . '_event_adjust_interval'},
321 if ($membershipStatus->{$eve . '_event_adjust_unit'} == 'year') {
322 $
{$eve . 'Event'} = date('Ymd', mktime($hour, $minute, $second,
325 $
{$dat . 'Year'} +
$membershipStatus->{$eve . '_event_adjust_interval'}
328 // if no interval and unit, present
331 $
{$eve . 'Event'} = $
{$dat . 'Date'};
337 // check if statusDate is in the range of start & end events.
338 if ($startEvent && $endEvent) {
339 if (($statusDate >= $startEvent) && ($statusDate <= $endEvent)) {
340 $membershipDetails['id'] = $membershipStatus->id
;
341 $membershipDetails['name'] = $membershipStatus->name
;
344 elseif ($startEvent) {
345 if ($statusDate >= $startEvent) {
346 $membershipDetails['id'] = $membershipStatus->id
;
347 $membershipDetails['name'] = $membershipStatus->name
;
351 if ($statusDate <= $endEvent) {
352 $membershipDetails['id'] = $membershipStatus->id
;
353 $membershipDetails['name'] = $membershipStatus->name
;
357 // returns FIRST status record for which status_date is in range.
358 if ($membershipDetails) {
364 $membershipStatus->free();
366 //we bundle the arguments into an array as we can't pass 8 variables to the hook otherwise
367 // the membership array might contain the pre-altered settings so we don't want to merge this
369 'start_date' => $startDate,
370 'end_date' => $endDate,
371 'join_date' => $joinDate,
372 'status_date' => $statusDate,
373 'exclude_is_admin' => $endDate,
374 'membership_type_id' => $membershipTypeID,
375 'start_event' => $startEvent,
376 'end_event' => $endEvent,
378 CRM_Utils_Hook
::alterCalculatedMembershipStatus($membershipDetails, $arguments, $membership);
379 return $membershipDetails;
383 * Function that return the status ids whose is_current_member is set
388 public static function getMembershipStatusCurrent() {
389 $statusIds = array();
390 $membershipStatus = new CRM_Member_DAO_MembershipStatus();
391 $membershipStatus->is_current_member
= 1;
392 $membershipStatus->find();
393 $membershipStatus->selectAdd();
394 $membershipStatus->selectAdd('id');
395 while ($membershipStatus->fetch()) {
396 $statusIds[] = $membershipStatus->id
;
398 $membershipStatus->free();