Помощник (Хелпер) - Календарь

#
Помощник (Хелпер) - Календарь
Доброго времени суток всем!

Не пинайте сильно, если это уже где-то есть. Просто, значит, не нашел и написал своё для решения простейшей задачи - выяснения по дате рабочий это день или нет и поиска первого рабочего дня после даты. Ниже привожу код основного класса, а также ссылки на архивы с кодом и с дампом таблицы с производственными календарями на 2013-2014 годы.

И так... Все коды можно найти по ссылке - http://innovint.ru/download/core_calendar/core_calendar.zip
Содержимое архива необходимо положить в папку /modules/core/

Пример использования Хелпера:

<?php
echo "Статус для даты 2013-11-14 - ".Core_Calendar::getDateStatus('2013-11-14')."<br/>";
echo "Первый рабочий день после 2013-12-31 - ".Core_Calendar::getFirstWorkingDayAfterDate('2013-12-31')."<br/>";
echo "Первый рабочий день после текущей даты - ".Core_Calendar::getFirstWorkingDayAfterUnixDate(time(),'Y-m-d');
?>


Вот код основного класса:

<?php

defined('HOSTCMS') || exit('HostCMS: access denied.');

/**
* Calendar helper
*
* @package HostCMS 6\Core
* @version 6.x
* @author InnovInt CJSC
* @copyright © 2013 ЗАО "ИнновИнт", http://innovint.ru
*/
class Core_Calendar {
   
   //
   // Core_Calendar::getFirstWorkingDayAfterDate($date,$format="Y-m-d")
   //
   // Метод возвращает первый рабочий день после указанной даты в запрошенном формате $format (по умолчанию - Y-m-d)
   // $date - дата в формате Y-m-d
   //
   // Результат: дата в запрошенном формате или false, если такую дату найти не удалось
   //
   public static function getFirstWorkingDayAfterDate($date,$format="Y-m-d") {
      $oDay = Core_Entity::factory('Core_Calendar_Day');
      $oDay->queryBuilder()->where('date', '>', $date)->where('workday','=',1)->orderBy('date')->limit(1);
      $aDay = $oDay->findAll();
      $result = false;
      if (count($aDay)>0) {
         $time = DateTime::createFromFormat('Y-m-d', $aDay[0]->date);
         $result = $time->format($format);
      }
      return $result;
   }
   
   //
   // Core_Calendar::getFirstWorkingDayAfterUnixDate($date,$format="U")
   //
   // Метод возвращает первый рабочий день после указанной даты в запрошенном формате $format (по умолчанию - U)
   // $date - дата в формате UnixTimeStamp
   //
   // Результат: дата в запрошенном формате или false, если такую дату найти не удалось
   //
   public static function getFirstWorkingDayAfterUnixDate($date,$format="U") {
      return self::getFirstWorkingDayAfterDate(date('Y-m-d',$date),$format);
   }
   
   //
   // Core_Calendar::getDateStatus($date)
   //
   // Метод возвращает cтатус запрошенной даты
   // $date - дата в формате Y-m-d
   //
   // Результат: 1 - рабочий день, 0 - выходной день или праздник
   //
   public static function getDateStatus($date) {
      $result = false;
      $oDay = Core_Entity::factory('Core_Calendar_Day');
      $oDay->queryBuilder()->where('date', '=', $date);
      $aDay = $oDay->findAll();
      if (count($aDay) > 0) {
         $result = $aDay[0]->workday;
      }
      return $result;
   }
   
   //
   // Core_Calendar::getUnixDateStatus($date)
   //
   // Метод возвращает cтатус запрошенной даты
   // $date - дата в формате U (UnixTimeStamp)
   //
   // Результат: 1 - рабочий день, 0 - выходной день или праздник
   //
   public static function getUnixDateStatus($date) {
      return self::getDateStatus(date('Y-m-d',$date));
   }
}


По следующей ссылке архив с дампом таблицы. В ней производственные календари на 2013-2014 годы. SQL можно выполнить или через  Системные функции->SQL-запросы или через phpMyAdmin или любым другим удобным вам способом. http://innovint.ru/download/core_calendar/calendar_days.sql.zip

Если есть пожелания по включению какой-либо ещё полезной информации в календарь,   то пишите тут, подумаем. Добавим.

Для тех, кому надо отредактировать выходные дни - ищите таблицу calendar_days. В ней все банально просто
ИнновИнт
Авторизация