shahruslan/production-calendar

1.0.0 2024-04-13 19:51 UTC

This package is auto-updated.

Last update: 2024-09-13 22:21:22 UTC


README

描述

production-calendar 库允许从 production-calendar.ru 服务获取生产日历数据。

使用方法

为了使用此库,需要通过 Composer 安装它

composer require shahruslan/production-calendar

接下来需要连接一个 PSR-18 兼容的 http-client。这个客户端会自动连接,但如果需要,你也可以配置它并传递给构造函数。最后,我们获取用于 API 操作的 令牌。要获取令牌,只需提供你的电子邮件地址,系统会发送包含令牌的邮件。然后可以使用 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 - 工作时长。

statistic 属性显示指定期间的统计数据

  • calendarDays – 期间内的日历天数;
  • calendarDaysWithoutHolidays - 期间内的日历天数(不考虑节假日),(对于计算员工休假时长很有用);
  • workDays – 期间内的工作日数量;
  • weekends – 期间内的周末天数(不考虑节假日);
  • holidays – 期间内的节日天数;
  • workingHours – 期间的工作时长。
use Shahruslan\ProductionCalendar\Calendar;

$calendar = new Calendar('your-token');
$period = $calendar->getPeriod('08.01.2024-10.01.2024', region: 23);
print_r($period);

输出

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
                )
            [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
                )
            [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
                )
        )
    [statistic] => Shahruslan\ProductionCalendar\Entity\Statistic Object
        (
            [calendarDays] => 3
            [calendarDaysWithoutHolidays] => 1
            [workDays] => 1
            [weekends] => 0
            [holidays] => 2
            [workingHours] => 8
        )
)

额外设置

如果需要,可以获取特定地区的生产日历。例如,在2024年5月14日,克拉斯诺达尔边疆区的俄罗斯复活节纪念日,这一天被宣布为休息日。

$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);

输出

bool(true)
bool(false)

除了地区,还可以设置其他参数

new Calendar(
	'token',
	isSixDayWeek: true, // включить учет по 6-ти дневной рабочей неделе
	isWeekendsOfSchrodinger: true, // учитывать ли так называемые нерабочие дни с сохранением заработной платы, которые начали практиковать с 2020 года (В период пандемии COVID-19)
	compact: true, // будут выводиться только особые дни, которые отличаются от обычного календаря
);