42 const TYPE_YESTERDAY =
'Yesterday';
44 const TYPE_TODAY =
'Today';
46 const TYPE_TOMORROW =
'Tomorrow';
48 const TYPE_BEFORE =
'Before';
50 const TYPE_AFTER =
'After';
54 const TYPE_BETWEEN =
'Between';
56 const TYPE_NEXT_7_DAYS =
'Next 7 Days';
58 const TYPE_LAST_7_DAYS =
'Last 7 Days';
60 const TYPE_LAST_30_DAYS =
'Last 30 Days';
62 const TYPE_THIS_MONTH =
'This Month';
64 const TYPE_LAST_MONTH =
'Last Month';
66 const TYPE_NEXT_MONTH =
'Next Month';
68 const TYPE_BEFORE_TODAY =
'Before Today';
70 const TYPE_IS_TIME_FOR =
'Is Time For';
72 const TYPE_IS_EMPTY =
'Is Empty';
74 const TYPE_IS_NOT_EMPTY =
'Is Not Empty';
76 const TYPE_WAS_ON =
'Was On';
78 const TYPE_BECOMES_ON =
'Becomes On';
80 const TYPE_CHANGES =
'Changes';
82 const TYPE_DOES_NOT_CHANGE =
'Does Not Change';
94 if (isset($value[
'type']) && $value[
'type'] != null)
96 $validValueTypes = static::getValidValueTypes();
97 if (!in_array($value[
'type'], $validValueTypes))
101 if ($value[
'type'] == self::TYPE_TODAY || $value[
'type'] == self::TYPE_BEFORE_TODAY)
105 new DateTime(null,
new DateTimeZone(Yii::app()->timeZoneHelper->getForCurrentUser())));
107 elseif ($value[
'type'] == self::TYPE_TOMORROW)
111 new DateTime(null,
new DateTimeZone(Yii::app()->timeZoneHelper->getForCurrentUser())));
113 elseif ($value[
'type'] == self::TYPE_YESTERDAY)
117 new DateTime(null,
new DateTimeZone(Yii::app()->timeZoneHelper->getForCurrentUser())));
119 elseif ($value[
'type'] == self::TYPE_BEFORE || $value[
'type'] == self::TYPE_AFTER ||
120 $value[
'type'] == self::TYPE_ON)
122 if ($value[
"firstDate"] == null)
126 return $value[
'firstDate'];
142 if ($value[
'type'] != self::TYPE_BETWEEN)
146 if ($value[
"firstDate"] == null)
150 return $value[
'firstDate'];
159 if ($value[
'type'] != self::TYPE_BETWEEN)
163 if ($value[
"secondDate"] == null)
167 return $value[
'secondDate'];
175 return array( self::TYPE_YESTERDAY,
182 self::TYPE_NEXT_7_DAYS,
183 self::TYPE_LAST_7_DAYS,
184 self::TYPE_LAST_30_DAYS,
185 self::TYPE_THIS_MONTH,
186 self::TYPE_LAST_MONTH,
187 self::TYPE_NEXT_MONTH,
188 self::TYPE_BEFORE_TODAY,
189 self::TYPE_IS_TIME_FOR,
191 self::TYPE_IS_NOT_EMPTY,
193 self::TYPE_BECOMES_ON,
195 self::TYPE_DOES_NOT_CHANGE,
204 return array(self::TYPE_YESTERDAY => Zurmo::t(
'Core',
'Yesterday'),
205 self::TYPE_TODAY => Zurmo::t(
'Core',
'Today'),
206 self::TYPE_TOMORROW => Zurmo::t(
'Core',
'Tomorrow'),
207 self::TYPE_BEFORE => Zurmo::t(
'Core',
'Before'),
208 self::TYPE_AFTER => Zurmo::t(
'Core',
'After'),
209 self::TYPE_ON => Zurmo::t(
'Core',
'On{date}', array(
'{date}' => null)),
210 self::TYPE_BETWEEN => Zurmo::t(
'Core',
'Between'),
211 self::TYPE_NEXT_7_DAYS => Zurmo::t(
'Core',
'Next 7 Days'),
212 self::TYPE_LAST_7_DAYS => Zurmo::t(
'Core',
'Last 7 Days'),
213 self::TYPE_LAST_30_DAYS => Zurmo::t(
'Core',
'Last 30 Days'),
214 self::TYPE_THIS_MONTH => Zurmo::t(
'Core',
'This Month'),
215 self::TYPE_LAST_MONTH => Zurmo::t(
'Core',
'Last Month'),
216 self::TYPE_NEXT_MONTH => Zurmo::t(
'Core',
'Next Month'),
217 self::TYPE_BEFORE_TODAY => Zurmo::t(
'Core',
'Before Today'),
226 return array( self::TYPE_BEFORE => Zurmo::t(
'Core',
'Before'),
227 self::TYPE_AFTER => Zurmo::t(
'Core',
'After'),
228 self::TYPE_ON => Zurmo::t(
'Core',
'On{date}', array(
'{date}' => null)),
229 self::TYPE_BETWEEN => Zurmo::t(
'Core',
'Between'),
230 self::TYPE_IS_EMPTY => Zurmo::t(
'Core',
'Is Empty'),
231 self::TYPE_IS_NOT_EMPTY => Zurmo::t(
'Core',
'Is Not Empty'),
240 return array(self::TYPE_IS_TIME_FOR => Zurmo::t(
'Core',
'Is'));
248 return array(self::TYPE_BEFORE, self::TYPE_AFTER, self::TYPE_ON, self::TYPE_BETWEEN, self::TYPE_WAS_ON,
249 self::TYPE_BECOMES_ON);
257 return array(self::TYPE_BETWEEN);
265 return array( self::TYPE_BEFORE, self::TYPE_AFTER, self::TYPE_ON, self::TYPE_BETWEEN, self::TYPE_WAS_ON,
266 self::TYPE_BECOMES_ON);
274 return array(self::TYPE_BETWEEN);
285 assert(
'is_string($attributeName)');
286 assert(
'$attributeAndRelations == "resolveEntireMappingByRules"');
287 assert(
'empty($value) || $value == null || is_array($value)');
289 $parts = explode($delimiter, $attributeName);
290 if (count($parts) != 2)
294 list($realAttributeName, $type) = $parts;
295 if (isset($value[
'type']) && $value[
'type'] != null)
297 if ($value[
'type'] == self::TYPE_YESTERDAY ||
298 $value[
'type'] == self::TYPE_TODAY ||
299 $value[
'type'] == self::TYPE_TOMORROW)
301 $attributeAndRelations = array(array($realAttributeName, null,
'equals',
'resolveValueByRules'));
303 elseif ($value[
'type'] == self::TYPE_AFTER)
305 $attributeAndRelations = array(array($realAttributeName, null,
'greaterThanOrEqualTo',
'resolveValueByRules'));
307 elseif ($value[
'type'] == self::TYPE_BEFORE)
309 $attributeAndRelations = array(array($realAttributeName, null,
'lessThanOrEqualTo',
'resolveValueByRules'));
311 elseif ($value[
'type'] == self::TYPE_ON)
313 $attributeAndRelations = array(array($realAttributeName, null,
'equals',
'resolveValueByRules'));
315 elseif ($value[
'type'] == self::TYPE_BETWEEN)
317 $firstDateValue = static::resolveValueDataForBetweenIntoUsableFirstDateValue($value);
318 $secondDateValue = static::resolveValueDataForBetweenIntoUsableSecondDateValue($value);
319 $attributeAndRelations = array(array($realAttributeName, null,
'greaterThanOrEqualTo', $firstDateValue,
true),
320 array($realAttributeName, null,
'lessThanOrEqualTo', $secondDateValue,
true));
322 elseif ($value[
'type'] == self::TYPE_NEXT_7_DAYS)
324 $today = static::calculateNewDateByDaysFromNow(0);
325 $todayPlusSevenDays = static::calculateNewDateByDaysFromNow(7);
326 $attributeAndRelations = array(array($realAttributeName, null,
'greaterThanOrEqualTo', $today,
true),
327 array($realAttributeName, null,
'lessThanOrEqualTo', $todayPlusSevenDays,
true));
329 elseif ($value[
'type'] == self::TYPE_LAST_7_DAYS)
331 $today = static::calculateNewDateByDaysFromNow(0);
332 $todayMinusSevenDays = static::calculateNewDateByDaysFromNow(-7);
333 $attributeAndRelations = array(array($realAttributeName, null,
'greaterThanOrEqualTo', $todayMinusSevenDays,
true),
334 array($realAttributeName, null,
'lessThanOrEqualTo', $today,
true));
336 elseif ($value[
'type'] == self::TYPE_LAST_30_DAYS)
338 $today = static::calculateNewDateByDaysFromNow(0);
339 $todayMinusThirtyDays = static::calculateNewDateByDaysFromNow(-30);
340 $attributeAndRelations = array(array($realAttributeName, null,
'greaterThanOrEqualTo', $todayMinusThirtyDays,
true),
341 array($realAttributeName, null,
'lessThanOrEqualTo', $today,
true));
343 elseif ($value[
'type'] == self::TYPE_THIS_MONTH)
345 $firstDateValue = DateTimeUtil::getFirstDayOfAMonthDate();
346 $secondDateValue = DateTimeUtil::getLastDayOfAMonthDate();
347 $attributeAndRelations = array(array($realAttributeName, null,
'greaterThanOrEqualTo', $firstDateValue,
true),
348 array($realAttributeName, null,
'lessThanOrEqualTo', $secondDateValue,
true));
350 elseif ($value[
'type'] == self::TYPE_LAST_MONTH)
352 $firstDateValue = DateTimeUtil::getFirstDayOfLastMonthDate();
353 $secondDateValue = DateTimeUtil::getLastDayOfLastMonthDate();
354 $attributeAndRelations = array(array($realAttributeName, null,
'greaterThanOrEqualTo', $firstDateValue,
true),
355 array($realAttributeName, null,
'lessThanOrEqualTo', $secondDateValue,
true));
357 elseif ($value[
'type'] == self::TYPE_NEXT_MONTH)
359 $firstDateValue = DateTimeUtil::getFirstDayOfNextMonthDate();
360 $secondDateValue = DateTimeUtil::getLastDayOfNextMonthDate();
361 $attributeAndRelations = array(array($realAttributeName, null,
'greaterThanOrEqualTo', $firstDateValue,
true),
362 array($realAttributeName, null,
'lessThanOrEqualTo', $secondDateValue,
true));
364 elseif ($value[
'type'] == self::TYPE_BEFORE_TODAY)
366 $attributeAndRelations = array(array($realAttributeName, null,
'lessThan',
'resolveValueByRules'));
375 $attributeAndRelations = array(array($realAttributeName, null, null,
'resolveValueByRules'));
386 assert(
'is_int($daysFromNow)');
388 new DateTime(null,
new DateTimeZone(Yii::app()->timeZoneHelper->getForCurrentUser())));
static calculateNewByDaysFromNow($daysFromNow, DateTime $dateTime)
static calculateNew($calculation, DateTime $dateTime)