PHPackages                             kosmosafive/production-calendar - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. kosmosafive/production-calendar

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

kosmosafive/production-calendar
===============================

Производственный календарь

1.0.0(1w ago)051MITPHPPHP ^8.4

Since May 29Pushed 1w agoCompare

[ Source](https://github.com/kosmosafive/production-calendar)[ Packagist](https://packagist.org/packages/kosmosafive/production-calendar)[ Docs](https://github.com/kosmosafive/production-calendar)[ RSS](/packages/kosmosafive-production-calendar/feed)WikiDiscussions develop Synced 1w ago

READMEChangelogDependencies (14)Versions (3)Used By (1)

PHP Production Calendar
=======================

[](#php-production-calendar)

Гибкий инструмент для работы с производственным календарем. Позволяет рассчитывать рабочие дни, учитывать государственные праздники и переносы, используя данные из API или локальных файлов.

Особенности
-----------

[](#особенности)

- Поддержка PSR-17/18 (любой HTTP-клиент: Guzzle, Symfony и т.д.).
- Поддержка PSR-16 для кеширования данных.
- Гибкая система провайдеров (API, локальный JSON, замыкания).
- Расчет интервалов и добавление рабочих дней.
- Итераторы для эффективной обработки периодов без загрузки всех данных в память.
- Поддержка нескольких стран через ISO-код (например, `by`, `ru`).

Установка
---------

[](#установка)

```
composer require kosmosafive/production-calendar
```

Быстрый старт
-------------

[](#быстрый-старт)

```
use Kosmosafive\ProductionCalendar\ProductionCalendar;
use Kosmosafive\ProductionCalendar\Provider\XmlCalendarProvider;
use Kosmosafive\ProductionCalendar\Provider\CachedProvider;

// 1. Настройка провайдера (с использованием вашего HTTP-клиента)
$apiProvider = new XmlCalendarProvider($httpClient, $requestFactory);

// 2. Добавляем кеширование (любой PSR-16 драйвер)
$provider = new CachedProvider($apiProvider, $cache);

// 3. Инициализация календаря
$calendar = new ProductionCalendar($provider, 'ru');

// Проверка дня
$calendar->isWorkday(new DateTime('2026-01-01')); // false (Новый год)

// Расчет количества рабочих дней
$workdaysCount = $calendar->countWorkdays(
    new DateTime('2026-05-01'),
    new DateTime('2026-05-31')
);

// Прибавление 10 рабочих дней
$deadline = $calendar->addWorkdays(new DateTime('now'), 10);
```

API календаря
-------------

[](#api-календаря)

### Основные методы

[](#основные-методы)

#### `isWorkday(DateTimeInterface $date): bool`

[](#isworkdaydatetimeinterface-date-bool)

Проверяет, является ли дата рабочим днем. Учитывает праздники, переносы и выходные.

#### `countWorkdays(DateTimeInterface $start, DateTimeInterface $end): int`

[](#countworkdaysdatetimeinterface-start-datetimeinterface-end-int)

Подсчитывает количество рабочих дней в указанном диапазоне (включая границы).

#### `addWorkdays(DateTimeInterface $date, int $days): DateTimeImmutable`

[](#addworkdaysdatetimeinterface-date-int-days-datetimeimmutable)

Прибавляет указанное количество рабочих дней к дате. Отрицательное значение позволяет вычитать дни.

#### `subtractWorkdays(DateTimeInterface $date, int $days): DateTimeImmutable`

[](#subtractworkdaysdatetimeinterface-date-int-days-datetimeimmutable)

Вычитает указанное количество рабочих дней из даты (алиас для `addWorkdays` с отрицательным значением).

#### `getClosestWorkday(DateTimeInterface $date, bool $forward = true): DateTimeImmutable`

[](#getclosestworkdaydatetimeinterface-date-bool-forward--true-datetimeimmutable)

Находит ближайший рабочий день. Параметр `$forward` определяет направление поиска: вперед (`true`) или назад (`false`).

### Итераторы

[](#итераторы)

#### `getWorkdaysIterator(DateTimeInterface $start, DateTimeInterface $end): Generator`

[](#getworkdaysiteratordatetimeinterface-start-datetimeinterface-end-generatordatetimeimmutable)

Возвращает генератор рабочих дней в диапазоне. Экономит память при обработке больших периодов.

#### `getFullCalendarIterator(DateTimeInterface $start, DateTimeInterface $end): Generator`

[](#getfullcalendariteratordatetimeinterface-start-datetimeinterface-end-generatorcalendarday)

Возвращает полную информацию о каждом дне периода, включая тип дня, название праздника и информацию о переносах.

#### `hasHolidays(DateTimeInterface $start, DateTimeInterface $end): bool`

[](#hasholidaysdatetimeinterface-start-datetimeinterface-end-bool)

Проверяет наличие праздничных дней в указанном диапазоне.

Продвинутая конфигурация
------------------------

[](#продвинутая-конфигурация)

### Composite Provider (Приоритеты)

[](#composite-provider-приоритеты)

Вы можете использовать CompositeProvider, чтобы сначала проверять локальные исключения, а затем обращаться к API:

```
use Kosmosafive\ProductionCalendar\Provider\CompositeProvider;
use Kosmosafive\ProductionCalendar\Provider\JsonProvider;

$composite = new CompositeProvider(
    new JsonProvider(__DIR__ . '/config/holidays'), // Сначала ищем тут
    new XmlCalendarProvider($client, $factory)          // Если файла нет, идем в API
);
```

### Closure Provider (Кастомная логика)

[](#closure-provider-кастомная-логика)

Для особых случаев можно использовать ClosureProvider:

```
use Kosmosafive\ProductionCalendar\Provider\ClosureProvider;

$closureProvider = new ClosureProvider(function (string $country, int $year) {
    // Ваша логика получения данных
    return [
        '2026-01-01' => new Day(new DateTimeImmutable('2026-01-01'), Type::Holiday, 'New Year'),
    ];
});
```

### Структура JSON файла (для локального провайдера)

[](#структура-json-файла-для-локального-провайдера)

Файлы должны называться по шаблону `{country}_{year}.json` (например, `ru_2026.json`) и соответствовать формату xmlcalendar.ru:

```
{
  "months": [
    {
      "month": 1,
      "days": "1,2,3,4,5,6,7,8,9+,10,11,17,18,24,25,31"
    }
  ],
  "transitions": [
    {"from": "01.03", "to": "01.09"}
  ]
}
```

Выходные дни не обязательно добавлять в конфигурацию.

Специальные символы в конце дня месяца:

- символ `+` (например, `9+`) означает перенос рабочего дня
- символ `*` (например, `31*`) означает сокращенный рабочий день

Типы дней
---------

[](#типы-дней)

Библиотека использует следующие типы дней:

ТипОписание`Type::Working`Обычный рабочий день`Type::Weekend`Выходной день (суббота/воскресенье)`Type::Holiday`Праздничный день`Type::PreHoliday`Предпраздничный (сокращенный) день`Type::Transferred`Перенесенный рабочий деньПримеры использования
---------------------

[](#примеры-использования)

### Расчет срока выполнения задачи

[](#расчет-срока-выполнения-задачи)

```
$startDate = new DateTime('2026-01-15');
$workDaysNeeded = 20;
$deadline = $calendar->addWorkdays($startDate, $workDaysNeeded);
echo "Дедлайн: " . $deadline->format('Y-m-d');
```

### Поиск последнего рабочего дня месяца

[](#поиск-последнего-рабочего-дня-месяца)

```
$lastDayOfMonth = new DateTime('2026-01-31');
$lastWorkday = $calendar->getClosestWorkday($lastDayOfMonth, forward: false);
echo "Последний рабочий день: " . $lastWorkday->format('Y-m-d');
```

### Анализ квартала

[](#анализ-квартала)

```
$start = new DateTime('2026-01-01');
$end = new DateTime('2026-03-31');

$workDaysCount = $calendar->countWorkdays($start, $end);
$hasHolidays = $calendar->hasHolidays($start, $end);

echo "Рабочих дней в Q1: $workDaysCount\n";
echo "Есть праздники: " . ($hasHolidays ? 'да' : 'нет') . "\n";
```

Требования
----------

[](#требования)

- PHP 8.4+
- PSR-17 (HTTP Factory) — для XML API провайдера
- PSR-18 (HTTP Client) — для XML API провайдера
- PSR-16 (Cache) — опционально, для кеширования

Лицензия
--------

[](#лицензия)

MIT License. См. файл [LICENSE](LICENSE) для подробностей.

###  Health Score

43

—

FairBetter than 89% of packages

Maintenance98

Actively maintained with recent releases

Popularity5

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity52

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

11d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/4149bcfcdcc947ad42afa006615812c8ea743bf76e0e10ef44ffb3d5ae2796f0?d=identicon)[kosmosafive](/maintainers/kosmosafive)

---

Top Contributors

[![kosmosafive](https://avatars.githubusercontent.com/u/14090839?v=4)](https://github.com/kosmosafive "kosmosafive (24 commits)")

---

Tags

schedulecalendarholidayproductionworkingworking-calendarproduction-calendarproduction scheduleholiday calendar

###  Code Quality

TestsPest

Static AnalysisPHPStan, Rector

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/kosmosafive-production-calendar/health.svg)

```
[![Health](https://phpackages.com/badges/kosmosafive-production-calendar/health.svg)](https://phpackages.com/packages/kosmosafive-production-calendar)
```

###  Alternatives

[cakephp/cakephp

The CakePHP framework

8.8k19.1M1.7k](/packages/cakephp-cakephp)[craftcms/cms

Craft CMS

3.6k3.6M2.9k](/packages/craftcms-cms)[tempest/framework

The PHP framework that gets out of your way.

2.2k31.1k11](/packages/tempest-framework)[flow-php/flow

PHP ETL - Extract Transform Load - Data processing framework

84735.1k](/packages/flow-php-flow)[civicrm/civicrm-core

Open source constituent relationship management for non-profits, NGOs and advocacy organizations.

744284.3k34](/packages/civicrm-civicrm-core)[fusonic/opengraph

PHP library for consuming and publishing Open Graph resources.

105391.1k5](/packages/fusonic-opengraph)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
