shahruslan / production-calendar
Производственный календарь
Installs: 493
Dependents: 0
Suggesters: 0
Security: 0
Stars: 4
Watchers: 1
Forks: 1
Open Issues: 0
pkg:composer/shahruslan/production-calendar
Requires
- php: ^8.1
- php-http/client-common: ^2.7
- php-http/discovery: ^1.19
- psr/http-client: ^1.0
- psr/http-factory: ^1.0
Requires (Dev)
- ergebnis/composer-normalize: ^2.44
- friendsofphp/php-cs-fixer: ^3.64
- phpyh/coding-standard: ^2.6
- rector/rector: ^1.2
- vimeo/psalm: ^5.26
README
Описание:
Библиотека production-calendar позволяет получать данные о производственном календаре из сервиса production-calendar.ru.
Использование:
Чтобы использовать библиотеку, необходимо установить её с помощью Composer:
composer require shahruslan/production-calendar
Далее надо будет подключить какой-нибудь PSR-18 совместимый
http-client. Этот клиент подключается автоматически,
но при желании вы можете его сконфигурировать и передать в конструктор. И в заключении получаем
токен для работы с API. Чтобы его получить, достаточно указать свой email, на
который придет письмо с токеном. Затем можно использовать класс Calendar для получения данных о производственном
календаре:
use Shahruslan\ProductionCalendar\Calendar; $calendar = new Calendar('your-token'); // Получение календаря на весь год $calendarForYear = $calendar->getPeriodForYear(2024); // Получение календаря на определённый месяц $calendarForMonth = $calendar->getPeriodForMonth(2024, 1); // Получение календаря на определённый день $calendarForDay = $calendar->getPeriodForDay(new DateTime('2024-01-01'));
Методы класса Calendar
- getPeriodForYear(int $year): Period- Получение календаря на весь год;
- getPeriodForQuarter(int $year, int $quarter): Period- Получение календаря на определённый квартал;
- getPeriodForMonth(int $year, int $month): Period- Получение календаря на определённый месяц;
- getPeriodForDay(DateTimeInterface $date): Period- Получение календаря на определённый день;
- getPeriod(string $period): Period- Получение календаря на произвольный период(не более года).
Каждый метод возвращает объект класса Period, содержащий данные о производственном календаре.
Класс Period
Класс Period представляет собой объект, содержащий данные о производственном календаре. В свойстве days массив
объектов типа Day со свойствами:
- date- текущий день;
- type- тип дня(праздничный, рабочий, выходной и тд);
- weekDay- день недели;
- workingHours- количество рабочих часов.
- isProject- находится ли этот день в проекте закона и еще не утвержден.
Свойство statistic отображает ряд статистических данных для задаваемого периода:
- calendarDays– количество календарных дней в периоде;
- calendarDaysWithoutHolidays- количество календарных дней в периоде без учета праздничных дней (полезный показатель для расчета продолжительности отпуска работника);
- workDays– количество рабочих дней в периоде;
- weekends– количество выходных дней в периоде (без учета праздничных);
- holidays– количество праздничных дней в периоде;
- shortenedWorkingDays– количество сокращённых рабочих дней в периоде;
- workingHours– количество рабочего времени за период.
use Shahruslan\ProductionCalendar\Calendar; $calendar = new Calendar('your-token'); $period = $calendar->getPeriod('07.01.2024-09.01.2024', region: 23); print_r($period);
Output:
Shahruslan\ProductionCalendar\Entity\Period Object
(
    [country] => Shahruslan\ProductionCalendar\Entity\Dictionary\Country Object
        (
            [code] => ru
            [text] => Российская Федерация
        )
    [region] => Shahruslan\ProductionCalendar\Entity\Dictionary\Region Object
        (
            [number] => 23
            [text] => Краснодарский край
        )
    [dateStart] => DateTimeImmutable Object
        (
            [date] => 2024-01-07 00:00:00.000000
            [timezone_type] => 3
            [timezone] => UTC
        )
    [dateEnd] => DateTimeImmutable Object
        (
            [date] => 2024-01-09 00:00:00.000000
            [timezone_type] => 3
            [timezone] => UTC
        )
    [workWeekType] => 5-и дневная рабочая неделя
    [period] => Произвольный период
    [days] => Array
        (
            [0] => Shahruslan\ProductionCalendar\Entity\Day Object
                (
                    [date] => DateTimeImmutable Object
                        (
                            [date] => 2024-01-07 00:00:00.000000
                            [timezone_type] => 3
                            [timezone] => UTC
                        )
                    [type] => Shahruslan\ProductionCalendar\Entity\Dictionary\DayType Enum:string
                        (
                            [name] => publicHoliday
                            [value] => Государственный праздник
                        )
                    [weekDay] => Shahruslan\ProductionCalendar\Entity\Dictionary\WeekDay Enum:string
                        (
                            [name] => sunday
                            [value] => вс
                        )
                    [workingHours] => 0
                    [isProject] => 0
                )
            [1] => Shahruslan\ProductionCalendar\Entity\Day Object
                (
                    [date] => DateTimeImmutable Object
                        (
                            [date] => 2024-01-08 00:00:00.000000
                            [timezone_type] => 3
                            [timezone] => UTC
                        )
                    [type] => Shahruslan\ProductionCalendar\Entity\Dictionary\DayType Enum:string
                        (
                            [name] => publicHoliday
                            [value] => Государственный праздник
                        )
                    [weekDay] => Shahruslan\ProductionCalendar\Entity\Dictionary\WeekDay Enum:string
                        (
                            [name] => monday
                            [value] => пн
                        )
                    [workingHours] => 0
                    [isProject] => 0
                )
            [2] => Shahruslan\ProductionCalendar\Entity\Day Object
                (
                    [date] => DateTimeImmutable Object
                        (
                            [date] => 2024-01-09 00:00:00.000000
                            [timezone_type] => 3
                            [timezone] => UTC
                        )
                    [type] => Shahruslan\ProductionCalendar\Entity\Dictionary\DayType Enum:string
                        (
                            [name] => workingDay
                            [value] => Рабочий день
                        )
                    [weekDay] => Shahruslan\ProductionCalendar\Entity\Dictionary\WeekDay Enum:string
                        (
                            [name] => tuesday
                            [value] => вт
                        )
                    [workingHours] => 8
                    [isProject] => 0
                )
        )
    [statistic] => Shahruslan\ProductionCalendar\Entity\Statistic Object
        (
            [calendarDays] => 3
            [calendarDaysWithoutHolidays] => 1
            [workDays] => 1
            [weekends] => 0
            [holidays] => 2
            [shortenedWorkingDays] => 0
            [workingHours] => 8
        )
)
Дополнительные настройки
При необходимости можно получить производственный календарь для конкретного региона. Например, в Краснодарском крае 14 мая 2024 года отмечается Радоница, и этот день объявлен выходным днем:
$calendar = new Shahruslan\ProductionCalendar\Calendar('token'); $data = $calendar->isWorkingDay(new DateTimeImmutable('14.05.2024')); var_dump($data); $data = $calendar->setRegion(23)->isWorkingDay(new DateTimeImmutable('14.05.2024')); var_dump($data);
Output:
bool(true) bool(false)
Помимо региона, еще можно настроить и другие параметры:
new Calendar( 'token', isSixDayWeek: true, // включить учет по 6-ти дневной рабочей неделе isWeekendsOfSchrodinger: true, // учитывать ли так называемые нерабочие дни с сохранением заработной платы, которые начали практиковать с 2020 года (В период пандемии COVID-19) compact: true, // будут выводиться только особые дни, которые отличаются от обычного календаря );