Download OpenAPI specification:Download
Базовая спецификация Admin API. Добавляйте пути через $ref в папку paths/.
Аутентифицирует администратора по email/паролю и возвращает JWT токен для доступа к административной панели.
Особенности:
Обрабатывается: AuthController::login
| email required | string <email> <= 255 characters Email администратора для входа в систему |
| password required | string <password> Пароль администратора (без минимальной длины в валидации) |
{- "email": "admin@prohelper.com",
- "password": "AdminPassword123"
}{- "success": true,
- "message": "Вход выполнен успешно",
- "data": {
- "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwMDAvYXBpL3YxL2FkbWluL2F1dGgvbG9naW4iLCJpYXQiOjE3MjY3MzI2NDQsImV4cCI6MTcyNjczNjI0NCwibmJmIjoxNzI2NzMyNjQ0LCJqdGkiOiJkNGY4OGI4YjkzNGVhMmYwIiwic3ViIjoiMSIsInBydiI6ImE1Y2JmMjQyNGI5ODk0Mzc0MThmMzllYzEyNmYwNDYwMGQzNmFiMTQifQ.example",
- "user": {
- "id": 1,
- "name": "Иван Петров",
- "email": "admin@prohelper.com",
- "role": "admin"
}
}
}Возвращает детальную информацию о профиле аутентифицированного администратора.
Используется для:
Обрабатывается: AuthController::me
{- "success": true,
- "message": null,
- "data": {
- "user": {
- "id": 1,
- "name": "Иван Петров",
- "email": "admin@prohelper.com",
- "phone": "+79001234567",
- "position": "Администратор",
- "avatar_path": "avatars/user_1.jpg",
- "is_active": true,
- "current_organization_id": 5,
- "created_at": "2024-01-15T10:30:00.000000Z",
- "updated_at": "2024-01-20T14:45:00.000000Z"
}
}
}Обновляет JWT токен используя текущий валидный токен. Возвращает новый токен с продленным временем действия (1 час).
Рекомендуется использовать:
Обрабатывается: AuthController::refresh
{- "success": true,
- "message": "Токен успешно обновлен",
- "data": {
- "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.new_refreshed_token.example"
}
}Аннулирует JWT токен администратора и завершает сессию. После вызова токен становится недействительным и добавляется в черный список.
Рекомендуется вызывать:
Обрабатывается: AuthController::logout
{- "success": true,
- "message": "Выход выполнен успешно",
- "data": null
}{- "success": true,
- "message": "string",
- "data": [
- {
- "id": 42,
- "name": "Кирпич красный керамический",
- "code": "MTR-001",
- "description": "Кирпич керамический красный одинарный М-150",
- "category": "Строительные материалы",
- "default_price": 12.5,
- "is_active": true,
- "additional_properties": {
- "прочность": "М-150",
- "морозостойкость": "F50"
}, - "external_code": "EXT-MTR-001",
- "sbis_nomenclature_code": "00001234",
- "sbis_unit_code": "796",
- "consumption_rates": {
- "5": 100,
- "12": 50
}, - "accounting_data": {
- "центр_затрат": "10.01",
- "субконто": "Материалы"
}, - "use_in_accounting_reports": true,
- "accounting_account": "10.01",
- "measurement_unit": {
- "id": 1,
- "name": "квадратный метр",
- "code": "м²",
- "short_name": "м²",
- "type": "material",
- "description": "Единица измерения площади",
- "is_default": false,
- "is_system": false,
- "organization_id": 10,
- "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T15:30:00Z"
}, - "consumption_rates_with_work_types": [
- {
- "work_type_id": 5,
- "work_type_name": "Кладка стен",
- "rate": 100,
- "notes": "Норма расхода на 1 м³"
}
], - "organization_id": 10,
- "created_at": "2024-01-15 10:30:00",
- "updated_at": "2024-01-20 14:45:00"
}
]
}| name required | string <= 255 characters Название материала (уникальное в рамках организации) |
| code | string or null <= 50 characters Внутренний код материала |
| measurement_unit_id required | integer >= 1 ID единицы измерения (должна существовать в measurement_units) |
| description | string or null <= 1000 characters Описание материала |
| category | string or null <= 100 characters Категория материала |
| default_price | number or null <decimal> >= 0 Цена по умолчанию (не может быть отрицательной) |
| additional_properties | object or null Дополнительные свойства в формате JSON |
| is_active | boolean Default: true Активен ли материал |
| external_code | string or null <= 100 characters Внешний код для интеграции (уникальный в рамках организации) |
| sbis_nomenclature_code | string or null <= 100 characters Код номенклатуры в системе СБИС |
| sbis_unit_code | string or null <= 100 characters Код единицы измерения в системе СБИС |
object or null Нормы расхода по видам работ в формате work_type_id - количество | |
| accounting_data | object or null Дополнительные бухгалтерские данные в формате JSON |
| use_in_accounting_reports | boolean or null Default: false Использовать в бухгалтерских отчетах |
| accounting_account | string or null <= 50 characters Счет бухгалтерского учета |
{- "name": "Кирпич красный керамический",
- "code": "MTR-001",
- "measurement_unit_id": 3,
- "description": "Кирпич керамический красный одинарный М-150",
- "category": "Строительные материалы",
- "default_price": 12.5,
- "additional_properties": {
- "прочность": "М-150",
- "морозостойкость": "F50"
}, - "is_active": true,
- "external_code": "EXT-MTR-001",
- "sbis_nomenclature_code": "00001234",
- "sbis_unit_code": "796",
- "consumption_rates": {
- "5": 100,
- "12": 50
}, - "accounting_data": {
- "центр_затрат": "10.01",
- "субконто": "Материалы"
}, - "use_in_accounting_reports": true,
- "accounting_account": "10.01"
}{- "data": {
- "id": 42,
- "name": "Кирпич красный керамический",
- "code": "MTR-001",
- "description": "Кирпич керамический красный одинарный М-150",
- "category": "Строительные материалы",
- "default_price": 12.5,
- "is_active": true,
- "additional_properties": {
- "прочность": "М-150",
- "морозостойкость": "F50"
}, - "external_code": "EXT-MTR-001",
- "sbis_nomenclature_code": "00001234",
- "sbis_unit_code": "796",
- "consumption_rates": {
- "5": 100,
- "12": 50
}, - "accounting_data": {
- "центр_затрат": "10.01",
- "субконто": "Материалы"
}, - "use_in_accounting_reports": true,
- "accounting_account": "10.01",
- "measurement_unit": {
- "id": 1,
- "name": "квадратный метр",
- "code": "м²",
- "short_name": "м²",
- "type": "material",
- "description": "Единица измерения площади",
- "is_default": false,
- "is_system": false,
- "organization_id": 10,
- "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T15:30:00Z"
}, - "consumption_rates_with_work_types": [
- {
- "work_type_id": 5,
- "work_type_name": "Кладка стен",
- "rate": 100,
- "notes": "Норма расхода на 1 м³"
}
], - "organization_id": 10,
- "created_at": "2024-01-15 10:30:00",
- "updated_at": "2024-01-20 14:45:00"
}, - "success": true,
- "message": "string"
}{- "data": {
- "id": 42,
- "name": "Кирпич красный керамический",
- "code": "MTR-001",
- "description": "Кирпич керамический красный одинарный М-150",
- "category": "Строительные материалы",
- "default_price": 12.5,
- "is_active": true,
- "additional_properties": {
- "прочность": "М-150",
- "морозостойкость": "F50"
}, - "external_code": "EXT-MTR-001",
- "sbis_nomenclature_code": "00001234",
- "sbis_unit_code": "796",
- "consumption_rates": {
- "5": 100,
- "12": 50
}, - "accounting_data": {
- "центр_затрат": "10.01",
- "субконто": "Материалы"
}, - "use_in_accounting_reports": true,
- "accounting_account": "10.01",
- "measurement_unit": {
- "id": 1,
- "name": "квадратный метр",
- "code": "м²",
- "short_name": "м²",
- "type": "material",
- "description": "Единица измерения площади",
- "is_default": false,
- "is_system": false,
- "organization_id": 10,
- "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T15:30:00Z"
}, - "consumption_rates_with_work_types": [
- {
- "work_type_id": 5,
- "work_type_name": "Кладка стен",
- "rate": 100,
- "notes": "Норма расхода на 1 м³"
}
], - "organization_id": 10,
- "created_at": "2024-01-15 10:30:00",
- "updated_at": "2024-01-20 14:45:00"
}, - "success": true,
- "message": "string"
}| id required | integer |
| name required | string <= 255 characters Название материала (уникальное в рамках организации) |
| code | string or null <= 50 characters Внутренний код материала |
| measurement_unit_id required | integer >= 1 ID единицы измерения (должна существовать в measurement_units) |
| description | string or null <= 1000 characters Описание материала |
| category | string or null <= 100 characters Категория материала |
| default_price | number or null <decimal> >= 0 Цена по умолчанию (не может быть отрицательной) |
| additional_properties | object or null Дополнительные свойства в формате JSON |
| is_active | boolean Default: true Активен ли материал |
| external_code | string or null <= 100 characters Внешний код для интеграции (уникальный в рамках организации) |
| sbis_nomenclature_code | string or null <= 100 characters Код номенклатуры в системе СБИС |
| sbis_unit_code | string or null <= 100 characters Код единицы измерения в системе СБИС |
object or null Нормы расхода по видам работ в формате work_type_id - количество | |
| accounting_data | object or null Дополнительные бухгалтерские данные в формате JSON |
| use_in_accounting_reports | boolean or null Default: false Использовать в бухгалтерских отчетах |
| accounting_account | string or null <= 50 characters Счет бухгалтерского учета |
{- "name": "Кирпич красный керамический",
- "code": "MTR-001",
- "measurement_unit_id": 3,
- "description": "Кирпич керамический красный одинарный М-150",
- "category": "Строительные материалы",
- "default_price": 12.5,
- "additional_properties": {
- "прочность": "М-150",
- "морозостойкость": "F50"
}, - "is_active": true,
- "external_code": "EXT-MTR-001",
- "sbis_nomenclature_code": "00001234",
- "sbis_unit_code": "796",
- "consumption_rates": {
- "5": 100,
- "12": 50
}, - "accounting_data": {
- "центр_затрат": "10.01",
- "субконто": "Материалы"
}, - "use_in_accounting_reports": true,
- "accounting_account": "10.01"
}{- "data": {
- "id": 42,
- "name": "Кирпич красный керамический",
- "code": "MTR-001",
- "description": "Кирпич керамический красный одинарный М-150",
- "category": "Строительные материалы",
- "default_price": 12.5,
- "is_active": true,
- "additional_properties": {
- "прочность": "М-150",
- "морозостойкость": "F50"
}, - "external_code": "EXT-MTR-001",
- "sbis_nomenclature_code": "00001234",
- "sbis_unit_code": "796",
- "consumption_rates": {
- "5": 100,
- "12": 50
}, - "accounting_data": {
- "центр_затрат": "10.01",
- "субконто": "Материалы"
}, - "use_in_accounting_reports": true,
- "accounting_account": "10.01",
- "measurement_unit": {
- "id": 1,
- "name": "квадратный метр",
- "code": "м²",
- "short_name": "м²",
- "type": "material",
- "description": "Единица измерения площади",
- "is_default": false,
- "is_system": false,
- "organization_id": 10,
- "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T15:30:00Z"
}, - "consumption_rates_with_work_types": [
- {
- "work_type_id": 5,
- "work_type_name": "Кладка стен",
- "rate": 100,
- "notes": "Норма расхода на 1 м³"
}
], - "organization_id": 10,
- "created_at": "2024-01-15 10:30:00",
- "updated_at": "2024-01-20 14:45:00"
}, - "success": true,
- "message": "string"
}| date_from | string <date> Начальная дата фильтра |
| date_to | string <date> Конечная дата фильтра |
{- "success": true,
- "message": "string",
- "data": {
- "unique_materials_count": 0,
- "total_operations": 0,
- "total_received": 0,
- "total_used": 0,
- "total_received_value": 0,
- "total_used_value": 0
}
}| project_ids | string Список ID проектов через запятую |
| date_from | string <date> |
| date_to | string <date> |
{- "success": true,
- "message": "string",
- "data": [
- {
- "project_id": 0,
- "project_name": "string",
- "material_id": 0,
- "material_name": "string",
- "unit": "string",
- "total_received": 0,
- "total_used": 0,
- "operations_count": 0,
- "last_operation_date": "2019-08-24"
}
]
}| supplier_ids | string Список ID поставщиков через запятую |
| date_from | string <date> |
| date_to | string <date> |
{- "success": true,
- "message": "string",
- "data": [
- {
- "supplier_id": 0,
- "supplier_name": "string",
- "material_id": 0,
- "material_name": "string",
- "unit": "string",
- "total_received": 0,
- "total_used": 0,
- "average_price": 0,
- "operations_count": 0
}
]
}| material_ids | string Список ID материалов через запятую |
| project_ids | string Список ID проектов через запятую |
| date_from | string <date> |
| date_to | string <date> |
{- "success": true,
- "message": "string",
- "data": [
- {
- "date": "2019-08-24",
- "material_id": 0,
- "material_name": "string",
- "project_id": 0,
- "project_name": "string",
- "operation_type": "receipt",
- "quantity": 0,
- "unit_price": 0,
- "total_price": 0
}
]
}| category_ids | string ID категорий через запятую |
| supplier_ids | string |
| include_zero_balance | boolean |
| only_low_stock | boolean |
| stock_threshold | number <float> |
{- "success": true,
- "message": "string",
- "data": [
- {
- "material_id": 0,
- "material_name": "string",
- "unit": "string",
- "stock_quantity": 0,
- "category": "string",
- "supplier_name": "string"
}
]
}| material_ids | string |
| date_from | string <date> |
| date_to | string <date> |
| group_by | string Default: "month" Enum: "day" "month" |
{- "success": true,
- "message": "string",
- "data": {
- "labels": [
- "string"
], - "values": [
- 0
]
}
}Возвращает пагинированный список проектов текущей организации с поддержкой фильтрации и сортировки. Поддерживает фильтрацию по названию, статусу и архивному статусу.
Обрабатывается: ProjectController::index Метод сервиса: ProjectService::getProjectsForCurrentOrg Требует прав: admin.projects.view
| per_page | integer [ 1 .. 100 ] Default: 15 Example: per_page=20 Количество элементов на странице |
| name | string <= 255 characters Example: name=Березовая Фильтр по названию проекта (поиск по подстроке) |
| status | string Enum: "active" "completed" "paused" "cancelled" Example: status=active Фильтр по статусу проекта |
| is_archived | boolean Фильтр по архивному статусу (true/false) |
| sort_by | string Default: "created_at" Enum: "name" "status" "start_date" "end_date" "created_at" "updated_at" Example: sort_by=name Поле для сортировки |
| sort_direction | string Default: "desc" Enum: "asc" "desc" Example: sort_direction=asc Направление сортировки |
{- "data": [
- {
- "id": 25,
- "name": "Жилой комплекс Березовая роща",
- "address": "г. Москва, ул. Березовая, д. 15",
- "description": "Строительство жилого комплекса из 3 корпусов",
- "customer": "ООО Строительная Компания",
- "designer": "Архитектурное бюро ПРОЕКТ",
- "budget_amount": 15000000.5,
- "site_area_m2": 2500.75,
- "contract_number": "Д-2024/001",
- "status": "active",
- "start_date": "2024-02-01",
- "end_date": "2024-12-31",
- "is_archived": false,
- "additional_info": {
- "особенности": "проект с повышенной энергоэффективностью"
}, - "external_code": "PRJ-2024-001",
- "cost_category_id": 5,
- "accounting_data": {
- "центр_затрат": "ЦЗ-001",
- "аналитика": "А1-15"
}, - "use_in_accounting_reports": true,
- "organization_id": 10,
- "created_at": "2024-01-15T10:30:00.000000Z",
- "updated_at": "2024-01-20T14:45:00.000000Z",
- "assigned_users": [
- {
- "id": 15,
- "name": "Иван Петров",
- "email": "foreman@prohelper.com",
- "phone": "+79001234567",
- "position": "Прораб общих строительных работ",
- "avatar_path": "avatars/foreman_15.jpg",
- "is_active": true,
- "createdAt": "2024-01-15T10:30:00.000000Z",
- "updatedAt": "2024-01-20T14:45:00.000000Z"
}
], - "assigned_users_count": 3
}
], - "links": {
}, - "meta": {
- "current_page": 2,
- "from": 16,
- "last_page": 8,
- "per_page": 15,
- "to": 30,
- "total": 120
}
}Создает новый проект для текущей организации. Автоматически устанавливает organization_id и is_head=true. Поддерживает интеграцию с бухгалтерскими системами через external_code и cost_category_id.
Обрабатывается: ProjectController::store Метод сервиса: ProjectService::createProject Требует прав: admin.projects.create Миддлвары: subscription.limit:max_projects
| name required | string <= 255 characters Название проекта |
| address | string or null <= 1000 characters Адрес проекта |
| description | string or null <= 2000 characters Описание проекта |
| customer | string or null <= 255 characters Заказчик проекта |
| designer | string or null <= 255 characters Проектировщик |
| start_date | string or null <date> Дата начала проекта |
| end_date | string or null <date> Дата окончания проекта (должна быть >= start_date) |
| status required | string Enum: "active" "completed" "paused" "cancelled" Статус проекта |
| is_archived | boolean Default: false Архивный ли проект |
| additional_info | object or null Дополнительная информация в формате JSON |
| external_code | string or null <= 100 characters Внешний код проекта для интеграции с бухгалтерскими системами |
| cost_category_id | integer or null ID категории затрат (должна существовать в cost_categories) |
| accounting_data | object or null Бухгалтерские данные в формате JSON |
| use_in_accounting_reports | boolean or null Default: false Использовать в бухгалтерских отчетах |
| budget_amount | number or null <decimal> >= 0 Бюджет проекта |
| site_area_m2 | number or null <decimal> >= 0 Площадь участка в кв.м |
| contract_number | string or null <= 100 characters Номер договора |
{- "name": "Жилой комплекс Березовая роща",
- "address": "г. Москва, ул. Березовая, д. 15",
- "description": "Строительство жилого комплекса из 3 корпусов",
- "customer": "ООО Строительная Компания",
- "designer": "Архитектурное бюро ПРОЕКТ",
- "start_date": "2024-02-01",
- "end_date": "2024-12-31",
- "status": "active",
- "budget_amount": 15000000.5,
- "site_area_m2": 2500.75,
- "contract_number": "Д-2024/001",
- "cost_category_id": 5
}{- "id": 25,
- "name": "Жилой комплекс Березовая роща",
- "address": "г. Москва, ул. Березовая, д. 15",
- "description": "Строительство жилого комплекса из 3 корпусов",
- "customer": "ООО Строительная Компания",
- "designer": "Архитектурное бюро ПРОЕКТ",
- "budget_amount": 15000000.5,
- "site_area_m2": 2500.75,
- "contract_number": "Д-2024/001",
- "status": "active",
- "start_date": "2024-02-01",
- "end_date": "2024-12-31",
- "is_archived": false,
- "additional_info": {
- "особенности": "проект с повышенной энергоэффективностью"
}, - "external_code": "PRJ-2024-001",
- "cost_category_id": 5,
- "accounting_data": {
- "центр_затрат": "ЦЗ-001",
- "аналитика": "А1-15"
}, - "use_in_accounting_reports": true,
- "organization_id": 10,
- "created_at": "2024-01-15T10:30:00.000000Z",
- "updated_at": "2024-01-20T14:45:00.000000Z",
- "assigned_users": [
- {
- "id": 15,
- "name": "Иван Петров",
- "email": "foreman@prohelper.com",
- "phone": "+79001234567",
- "position": "Прораб общих строительных работ",
- "avatar_path": "avatars/foreman_15.jpg",
- "is_active": true,
- "createdAt": "2024-01-15T10:30:00.000000Z",
- "updatedAt": "2024-01-20T14:45:00.000000Z"
}
], - "assigned_users_count": 3
}Возвращает детальную информацию о конкретном проекте в рамках текущей организации. Проверяет принадлежность проекта текущей организации. Подгружает связанные данные: users, costCategory.
Обрабатывается: ProjectController::show Метод сервиса: ProjectService::findProjectByIdForCurrentOrg Требует прав: admin.projects.view
| id required | integer >= 1 Example: 25 Уникальный идентификатор проекта |
{- "id": 25,
- "name": "Жилой комплекс Березовая роща",
- "address": "г. Москва, ул. Березовая, д. 15",
- "description": "Строительство жилого комплекса из 3 корпусов",
- "customer": "ООО Строительная Компания",
- "designer": "Архитектурное бюро ПРОЕКТ",
- "budget_amount": 15000000.5,
- "site_area_m2": 2500.75,
- "contract_number": "Д-2024/001",
- "status": "active",
- "start_date": "2024-02-01",
- "end_date": "2024-12-31",
- "is_archived": false,
- "additional_info": {
- "особенности": "проект с повышенной энергоэффективностью"
}, - "external_code": "PRJ-2024-001",
- "cost_category_id": 5,
- "accounting_data": {
- "центр_затрат": "ЦЗ-001",
- "аналитика": "А1-15"
}, - "use_in_accounting_reports": true,
- "organization_id": 10,
- "created_at": "2024-01-15T10:30:00.000000Z",
- "updated_at": "2024-01-20T14:45:00.000000Z",
- "assigned_users": [
- {
- "id": 15,
- "name": "Иван Петров",
- "email": "foreman@prohelper.com",
- "phone": "+79001234567",
- "position": "Прораб общих строительных работ",
- "avatar_path": "avatars/foreman_15.jpg",
- "is_active": true,
- "createdAt": "2024-01-15T10:30:00.000000Z",
- "updatedAt": "2024-01-20T14:45:00.000000Z"
}
], - "assigned_users_count": 3
}| id required | integer |
| name required | string <= 255 characters Название проекта |
| address | string or null <= 1000 characters Адрес проекта |
| description | string or null <= 2000 characters Описание проекта |
| customer | string or null <= 255 characters Заказчик проекта |
| designer | string or null <= 255 characters Проектировщик |
| start_date | string or null <date> Дата начала проекта |
| end_date | string or null <date> Дата окончания проекта (должна быть >= start_date) |
| status required | string Enum: "active" "completed" "paused" "cancelled" Статус проекта |
| is_archived | boolean Default: false Архивный ли проект |
| additional_info | object or null Дополнительная информация в формате JSON |
| external_code | string or null <= 100 characters Внешний код проекта для интеграции с бухгалтерскими системами |
| cost_category_id | integer or null ID категории затрат (должна существовать в cost_categories) |
| accounting_data | object or null Бухгалтерские данные в формате JSON |
| use_in_accounting_reports | boolean or null Default: false Использовать в бухгалтерских отчетах |
| budget_amount | number or null <decimal> >= 0 Бюджет проекта |
| site_area_m2 | number or null <decimal> >= 0 Площадь участка в кв.м |
| contract_number | string or null <= 100 characters Номер договора |
{- "name": "Жилой комплекс Березовая роща",
- "address": "г. Москва, ул. Березовая, д. 15",
- "description": "Строительство жилого комплекса из 3 корпусов",
- "customer": "ООО Строительная Компания",
- "designer": "Архитектурное бюро ПРОЕКТ",
- "start_date": "2024-02-01",
- "end_date": "2024-12-31",
- "status": "active",
- "is_archived": false,
- "additional_info": {
- "особенности": "проект с повышенной энергоэффективностью"
}, - "external_code": "PRJ-2024-001",
- "cost_category_id": 5,
- "accounting_data": {
- "центр_затрат": "ЦЗ-001",
- "аналитика": "А1-15"
}, - "use_in_accounting_reports": true,
- "budget_amount": 15000000.5,
- "site_area_m2": 2500.75,
- "contract_number": "Д-2024/001"
}{- "data": {
- "id": 25,
- "name": "Жилой комплекс Березовая роща",
- "address": "г. Москва, ул. Березовая, д. 15",
- "description": "Строительство жилого комплекса из 3 корпусов",
- "customer": "ООО Строительная Компания",
- "designer": "Архитектурное бюро ПРОЕКТ",
- "budget_amount": 15000000.5,
- "site_area_m2": 2500.75,
- "contract_number": "Д-2024/001",
- "status": "active",
- "start_date": "2024-02-01",
- "end_date": "2024-12-31",
- "is_archived": false,
- "additional_info": {
- "особенности": "проект с повышенной энергоэффективностью"
}, - "external_code": "PRJ-2024-001",
- "cost_category_id": 5,
- "accounting_data": {
- "центр_затрат": "ЦЗ-001",
- "аналитика": "А1-15"
}, - "use_in_accounting_reports": true,
- "organization_id": 10,
- "created_at": "2024-01-15T10:30:00.000000Z",
- "updated_at": "2024-01-20T14:45:00.000000Z",
- "assigned_users": [
- {
- "id": 15,
- "name": "Иван Петров",
- "email": "foreman@prohelper.com",
- "phone": "+79001234567",
- "position": "Прораб общих строительных работ",
- "avatar_path": "avatars/foreman_15.jpg",
- "is_active": true,
- "createdAt": "2024-01-15T10:30:00.000000Z",
- "updatedAt": "2024-01-20T14:45:00.000000Z"
}
], - "assigned_users_count": 3
}, - "success": true,
- "message": "string"
}{- "success": true,
- "message": "string",
- "data": [
- {
- "id": 15,
- "name": "Строительно-монтажные работы",
- "code": "SMR",
- "external_code": "EXT-001",
- "description": "Работы по строительству и монтажу конструкций",
- "organization_id": 10,
- "parent_id": 5,
- "is_active": true,
- "sort_order": 10,
- "additional_attributes": {
- "priority": "high",
- "department": "construction"
}, - "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T15:30:00Z",
- "parent": {
- "id": 5,
- "name": "Основные работы",
- "code": "MAIN"
}, - "children": [
- { }
], - "projects_count": 12,
- "path": [
- {
- "id": 3,
- "name": "Корневая категория"
}
]
}
]
}{- "success": true,
- "message": "string",
- "data": {
- "project_id": 0,
- "project_name": "string",
- "materials": { },
- "works": { },
- "team": {
- "assigned_users_count": 0,
- "members": [
- {
- "id": 0,
- "name": "string",
- "role": "string"
}
]
}, - "performance_acts": [
- {
- "id": 0,
- "contract_id": 0,
- "act_document_number": "string",
- "act_date": "2019-08-24",
- "description": "string",
- "amount": 0,
- "is_approved": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "contract": {
- "id": 0,
- "contract_number": "string",
- "project_name": "string",
- "contractor_name": "string"
}, - "completed_works": [
- {
- "id": 1,
- "organization_id": 1,
- "project": {
- "id": 5,
- "name": "ЖК Солнечный",
- "address": "г. Москва, ул. Солнечная, д. 15",
- "status": "active"
}, - "contract": {
- "id": 1,
- "number": "ДПХ-2024/001",
- "total_amount": 2500000,
- "status": "active",
- "completion_percentage": 50,
- "contractor_name": "ООО Строймонтаж"
}, - "work_type": {
- "id": 5,
- "name": "Кладка кирпичных стен",
- "code": "KLAD-001",
- "category": "Каменные работы",
- "description": "Кладка несущих стен из керамического кирпича",
- "defaultPrice": 1250,
- "isActive": true,
- "organizationId": 10,
- "measurementUnit": {
- "id": 1,
- "name": "квадратный метр",
- "code": "м²",
- "short_name": "м²",
- "type": "material",
- "description": "Единица измерения площади",
- "is_default": false,
- "is_system": false,
- "organization_id": 10,
- "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T15:30:00Z"
}, - "createdAt": "2024-12-20 10:00:00",
- "updatedAt": "2024-12-20 15:30:00"
}, - "user": {
- "id": 12,
- "name": "Иванов Иван Иванович",
- "email": "ivanov@example.com",
- "phone": "+7 (900) 123-45-67",
- "position": "Прораб",
}, - "contractor": {
- "id": 3,
- "name": "ООО Строймонтаж",
- "inn": "7707083893",
- "contact_person": "Иванов И.И."
}, - "contractor_id": 3,
- "quantity": 150.5,
- "price": 500.25,
- "total_amount": 75187.5,
- "completion_date": "2024-02-15",
- "notes": "Работы выполнены качественно, в срок.",
- "status": "confirmed",
- "additional_info": {
- "quality_rating": 5,
- "weather_conditions": "солнечно"
}, - "materials": [
- {
- "material_id": 15,
- "material_name": "Цемент М500",
- "measurement_unit": "т",
- "quantity": 25.5,
- "unit_price": 150,
- "total_amount": 3825,
- "notes": "Высококачественный материал",
- "created_at": "2024-02-15 10:30:00",
- "updated_at": "2024-02-15 14:45:00"
}
], - "created_at": "2024-02-15 10:30:00",
- "updated_at": "2024-02-15 14:45:00"
}
]
}
], - "project_info": { }
}
}{- "success": true,
- "message": "string",
- "data": [
- {
- "id": 42,
- "name": "Кирпич красный керамический",
- "code": "MTR-001",
- "description": "Кирпич керамический красный одинарный М-150",
- "category": "Строительные материалы",
- "default_price": 12.5,
- "is_active": true,
- "additional_properties": {
- "прочность": "М-150",
- "морозостойкость": "F50"
}, - "external_code": "EXT-MTR-001",
- "sbis_nomenclature_code": "00001234",
- "sbis_unit_code": "796",
- "consumption_rates": {
- "5": 100,
- "12": 50
}, - "accounting_data": {
- "центр_затрат": "10.01",
- "субконто": "Материалы"
}, - "use_in_accounting_reports": true,
- "accounting_account": "10.01",
- "measurement_unit": {
- "id": 1,
- "name": "квадратный метр",
- "code": "м²",
- "short_name": "м²",
- "type": "material",
- "description": "Единица измерения площади",
- "is_default": false,
- "is_system": false,
- "organization_id": 10,
- "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T15:30:00Z"
}, - "consumption_rates_with_work_types": [
- {
- "work_type_id": 5,
- "work_type_name": "Кладка стен",
- "rate": 100,
- "notes": "Норма расхода на 1 м³"
}
], - "organization_id": 10,
- "created_at": "2024-01-15 10:30:00",
- "updated_at": "2024-01-20 14:45:00"
}
]
}{- "success": true,
- "message": "string",
- "data": [
- {
- "id": 5,
- "name": "Кладка кирпичных стен",
- "code": "KLAD-001",
- "category": "Каменные работы",
- "description": "Кладка несущих стен из керамического кирпича",
- "defaultPrice": 1250,
- "isActive": true,
- "organizationId": 10,
- "measurementUnit": {
- "id": 1,
- "name": "квадратный метр",
- "code": "м²",
- "short_name": "м²",
- "type": "material",
- "description": "Единица измерения площади",
- "is_default": false,
- "is_system": false,
- "organization_id": 10,
- "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T15:30:00Z"
}, - "createdAt": "2024-12-20 10:00:00",
- "updatedAt": "2024-12-20 15:30:00"
}
]
}| id required | integer |
{- "success": true,
- "message": "string",
- "data": {
- "project": {
- "id": 25,
- "name": "Жилой комплекс Березовая роща",
- "address": "г. Москва, ул. Березовая, д. 15",
- "description": "Строительство жилого комплекса из 3 корпусов",
- "customer": "ООО Строительная Компания",
- "designer": "Архитектурное бюро ПРОЕКТ",
- "budget_amount": 15000000.5,
- "site_area_m2": 2500.75,
- "contract_number": "Д-2024/001",
- "status": "active",
- "start_date": "2024-02-01",
- "end_date": "2024-12-31",
- "is_archived": false,
- "additional_info": {
- "особенности": "проект с повышенной энергоэффективностью"
}, - "external_code": "PRJ-2024-001",
- "cost_category_id": 5,
- "accounting_data": {
- "центр_затрат": "ЦЗ-001",
- "аналитика": "А1-15"
}, - "use_in_accounting_reports": true,
- "organization_id": 10,
- "created_at": "2024-01-15T10:30:00.000000Z",
- "updated_at": "2024-01-20T14:45:00.000000Z",
- "assigned_users": [
- {
- "id": 15,
- "name": "Иван Петров",
- "email": "foreman@prohelper.com",
- "phone": "+79001234567",
- "position": "Прораб общих строительных работ",
- "avatar_path": "avatars/foreman_15.jpg",
- "is_active": true,
- "createdAt": "2024-01-15T10:30:00.000000Z",
- "updatedAt": "2024-01-20T14:45:00.000000Z"
}
], - "assigned_users_count": 3
}, - "analytics": {
- "financial": {
- "contracts_total_amount": 0,
- "performed_amount_by_acts": 0,
- "received_payments_amount": 0,
- "works_total_amount": 0,
- "materials_total_amount": 0,
- "overall_cost": 0
}, - "counts": {
- "organizations": 0,
- "contracts": 0,
- "performance_acts": 0
}
}, - "organizations_stats": [
- {
- "id": 0,
- "name": "string",
- "role": "collaborator"
}
]
}
}Возвращает постраничный список выполненных работ, принадлежащих дочерним организациям,
привязанным к проекту. Доступно только пользователям головной организации с разрешением
projects.view_child_works.
| id required | integer ID проекта |
integer or Array of integers Фильтр по дочерним организациям (один ID или несколько) | |
integer or Array of integers Фильтр по видам работ | |
string or Array of strings Фильтр по статусу работы | |
| date_from | string <date> Дата начала (YYYY-MM-DD) |
| date_to | string <date> Дата окончания (YYYY-MM-DD) |
| search | string Поиск по заметкам |
| per_page | integer Default: 50 Размер страницы |
{- "success": true,
- "message": "string",
- "data": [
- {
- "id": 0,
- "project_id": 0,
- "child_organization": {
- "id": 0,
- "name": "string"
}, - "parent_organization_id": 0,
- "work_type": {
- "id": 0,
- "name": "string",
- "measurement_unit": "string"
}, - "quantity": 0,
- "price": 0,
- "total_amount": 0,
- "completion_date": "2019-08-24",
- "status": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "current_page": 0,
- "last_page": 0,
- "per_page": 0,
- "total": 0
}
}Возвращает пагинированный список выполненных работ организации с возможностью фильтрации по множественным критериям. Включает связанные данные: проект, контракт с подрядчиком, вид работ, пользователя и материалы.
| project_id | integer Example: project_id=5 Фильтр по ID проекта |
| contract_id | integer Example: contract_id=12 Фильтр по ID контракта |
| work_type_id | integer Example: work_type_id=8 Фильтр по ID вида работ |
| user_id | integer Example: user_id=15 Фильтр по ID прораба/исполнителя |
| contractor_id | integer Example: contractor_id=3 Фильтр по ID подрядчика |
| status | string Enum: "draft" "confirmed" "cancelled" Example: status=confirmed Фильтр по статусу работы |
| completion_date_from | string <date> Example: completion_date_from=2024-01-01 Дата выполнения от (включительно) |
| completion_date_to | string <date> Example: completion_date_to=2024-12-31 Дата выполнения до (включительно) |
| amount_from | number <float> Example: amount_from=1000 Минимальная сумма работы |
| amount_to | number <float> Example: amount_to=50000 Максимальная сумма работы |
| quantity_from | number <float> Example: quantity_from=10 Минимальное количество |
| quantity_to | number <float> Example: quantity_to=1000 Максимальное количество |
| with_materials | boolean Example: with_materials=true Показать только работы с материалами |
| search | string Example: search=бетонные работы Поиск по описанию/комментарию |
| sortBy | string Default: "completion_date" Example: sortBy=total_amount Поле для сортировки |
| sortDirection | string Default: "desc" Enum: "asc" "desc" Example: sortDirection=desc Направление сортировки |
| perPage | integer [ 1 .. 100 ] Default: 15 Example: perPage=25 Количество записей на страницу |
{- "success": true,
- "message": "Список выполненных работ получен успешно.",
- "data": [ ],
- "meta": {
- "current_page": 1,
- "total": 45
}
}Создает новую запись о выполненной работе с автоматическим расчетом стоимости и применением коэффициентов. Поддерживает валидацию контрактов, проверку лимитов и синхронизацию материалов.
| project_id required | integer ID проекта, к которому относится работа. Проверяется через ProjectAccessibleRule. |
| contract_id | integer or null ID договора для данной работы (опционально, проверяется принадлежность проекту). |
| contractor_id | integer or null ID подрядчика, выполнившего работу (опционально). |
| work_type_id required | integer ID вида работы из каталога организации. |
| user_id required | integer ID пользователя (прораба), зафиксировавшего выполненную работу. |
| quantity required | number <float> >= 0.001 Количество выполненной работы (обязательно, мин 0.001). |
| price | number or null <float> >= 0 Цена за единицу работы (опционально, автоматически рассчитывается из total_amount). |
| total_amount | number or null <float> >= 0 Общая стоимость работы (опционально, автоматически рассчитывается из price * quantity или материалов). |
| completion_date required | string <date> Дата выполнения работы (формат YYYY-MM-DD). |
| notes | string or null <= 65535 characters Комментарии или примечания к работе (максимум 65535 символов). |
| status required | string Enum: "draft" "confirmed" "cancelled" Статус выполненной работы. |
| additional_info | object or null Дополнительная информация в формате JSON. |
Array of objects or null Список материалов, использованных в работе (опционально). |
{- "project_id": 1,
- "work_type_id": 5,
- "user_id": 12,
- "quantity": 150.5,
- "price": 500.25,
- "completion_date": "2024-02-15",
- "status": "confirmed",
- "notes": "Работы выполнены качественно"
}{- "success": true,
- "message": "Запись о выполненной работе успешно создана.",
- "data": {
- "id": 123,
- "quantity": 150.5,
- "total_amount": 75187.5,
- "status": "confirmed"
}
}Возвращает полную информацию о выполненной работе включая связанные данные: проект, контракт, вид работ, исполнителя, подрядчика, материалы и прикрепленные файлы.
| id required | integer Example: 123 ID выполненной работы |
{- "success": true,
- "message": "Выполненная работа найдена успешно.",
- "data": {
- "id": 123,
- "quantity": 150.5,
- "total_amount": 75187.5,
- "status": "confirmed",
- "completion_date": "2024-02-15"
}
}Обновляет выполненную работу с автоматическим пересчетом стоимости и применением коэффициентов. Поддерживает частичное обновление полей и валидацию изменений контрактов.
| id required | integer Example: 123 ID выполненной работы для обновления |
| project_id | integer ID проекта, к которому относится работа. Проверяется через ProjectAccessibleRule. |
| contract_id | integer or null ID договора для данной работы (опционально, проверяется принадлежность проекту). |
| contractor_id | integer or null ID подрядчика, выполнившего работу (опционально). |
| work_type_id | integer ID вида работы из каталога организации. |
| user_id | integer ID пользователя (прораба), зафиксировавшего выполненную работу. |
| quantity | number <float> >= 0.001 Количество выполненной работы (мин 0.001). |
| price | number or null <float> >= 0 Цена за единицу работы (опционально, автоматически рассчитывается). |
| total_amount | number or null <float> >= 0 Общая стоимость работы (опционально, автоматически рассчитывается). |
| completion_date | string <date> Дата выполнения работы (формат YYYY-MM-DD). |
| notes | string or null <= 65535 characters Комментарии или примечания к работе (максимум 65535 символов). |
| status | string Enum: "draft" "confirmed" "cancelled" Статус выполненной работы. |
| additional_info | object or null Дополнительная информация в формате JSON. |
Array of objects or null Список материалов, использованных в работе (при указании заменяет существующий список). |
{- "quantity": 200.75,
- "total_amount": 95456.25,
- "notes": "Обновлены объемы работ"
}{- "success": true,
- "message": "Запись о выполненной работе успешно обновлена.",
- "data": {
- "id": 123,
- "quantity": 200.75,
- "total_amount": 95456.25
}
}Удаляет запись о выполненной работе со всеми связанными материалами. Операция необратима и доступна только владельцу организации.
| id required | integer Example: 123 ID выполненной работы для удаления |
{- "success": false,
- "message": "Не удалось удалить запись о выполненной работе."
}Полностью заменяет список материалов выполненной работы новым списком. Старые связи с материалами удаляются, создаются новые согласно переданному списку.
| id required | integer Example: 123 ID выполненной работы |
required | Array of objects Список материалов для синхронизации (заменяет существующий список материалов). |
{- "materials": [
- {
- "material_id": 22,
- "quantity": 45,
- "unit_price": 225.5,
- "total_amount": 10147.5,
- "notes": "Синхронизация после уточнения объемов"
}, - {
- "material_id": 35,
- "quantity": 12.5,
- "unit_price": 180,
- "total_amount": 2250
}
]
}{- "success": true,
- "message": "Материалы выполненной работы успешно синхронизированы.",
- "data": {
- "id": 123,
- "materials": [ ]
}
}Возвращает список материалов с нормами расхода, предустановленными для конкретного вида работ. Используется для автозаполнения материалов при создании выполненной работы.
| work_type_id required | integer Example: work_type_id=15 ID вида работы из каталога организации |
{- "success": true,
- "data": [
- {
- "material_id": 22,
- "material_name": "Цемент М500",
- "default_price": 350.5,
- "quantity": 0.5,
- "notes": "Норма расхода на 1 кв.м",
- "measurement_unit": "т"
}, - {
- "material_id": 35,
- "material_name": "Песок речной",
- "default_price": 800,
- "quantity": 1.2,
- "measurement_unit": "м³"
}
]
}Возвращает пагинированный список коэффициентов расценок с возможностью детальной фильтрации. Коэффициенты используются для автоматического расчёта стоимости работ, материалов и трудозатрат.
| name | string Example: name=Зимний Фильтр по названию коэффициента (частичное совпадение) |
| code | string Example: code=WINTER Фильтр по коду коэффициента (частичное совпадение) |
| type | string Enum: "percentage" "fixed_addition" Example: type=percentage Фильтр по типу коэффициента |
| applies_to | string Enum: "material_norms" "work_costs" "labor_hours" "general" Example: applies_to=work_costs Фильтр по назначению коэффициента |
| scope | string Enum: "global_org" "project" "work_type_category" "work_type" "material_category" "material" Example: scope=global_org Фильтр по области применения коэффициента |
| is_active | boolean Example: is_active=true Фильтр по активности коэффициента |
| sort_by | string Default: "created_at" Example: sort_by=name Поле для сортировки (name, code, value, type, applies_to, scope, is_active, valid_from, valid_to, created_at, updated_at) |
| sort_direction | string Default: "desc" Enum: "asc" "desc" Example: sort_direction=asc Направление сортировки |
| per_page | integer [ 1 .. 100 ] Default: 15 Example: per_page=25 Количество записей на страницу |
{- "data": [ ],
- "meta": {
- "current_page": 1,
- "total": 12
}
}Создает новый коэффициент расценок для организации с валидацией уникальности кода. Коэффициент может быть процентным или фиксированной надбавкой.
| name required | string <= 255 characters Название коэффициента (обязательно, максимум 255 символов). |
| code | string or null <= 100 characters Уникальный код коэффициента в рамках организации (максимум 100 символов). |
| value required | number <float> >= 0 Значение коэффициента (минимум 0, до 4 знаков после запятой). |
| type required | string Enum: "percentage" "fixed_addition" Тип коэффициента. |
| applies_to required | string Enum: "material_norms" "work_costs" "labor_hours" "general" К чему применяется коэффициент. |
| scope required | string Enum: "global_org" "project" "work_type_category" "work_type" "material_category" "material" Область применения коэффициента. |
| description | string or null <= 2000 characters Описание коэффициента (максимум 2000 символов). |
| is_active | boolean Default: true Активность коэффициента (по умолчанию true). |
| valid_from | string or null <date> Дата начала действия коэффициента (формат YYYY-MM-DD). |
| valid_to | string or null <date> Дата окончания действия коэффициента (должна быть после или равна valid_from). |
| conditions | object or null Дополнительные условия применения коэффициента в формате JSON. |
{- "name": "Зимний коэффициент",
- "code": "WINTER_2024",
- "value": 15.5,
- "type": "percentage",
- "applies_to": "work_costs",
- "scope": "global_org",
- "description": "Надбавка за работы в зимний период",
- "valid_from": "2024-12-01",
- "valid_to": "2025-03-31"
}{- "success": true,
- "message": "Коэффициент создан успешно.",
- "data": {
- "id": 15,
- "name": "Зимний коэффициент",
- "code": "WINTER_2024",
- "value": 15.5,
- "type": "percentage"
}
}Возвращает полную информацию о коэффициенте расценок включая условия применения.
| id required | integer Example: 15 ID коэффициента |
{- "success": true,
- "message": "Коэффициент найден успешно.",
- "data": {
- "id": 15,
- "name": "Зимний коэффициент",
- "code": "WINTER_2024",
- "value": 15.5,
- "type": "percentage",
- "applies_to": "work_costs",
- "scope": "global_org"
}
}Обновляет коэффициент расценок с проверкой уникальности кода и валидацией полей. Поддерживает частичное обновление полей.
| id required | integer Example: 15 ID коэффициента для обновления |
| name | string <= 255 characters Название коэффициента (максимум 255 символов). |
| code | string or null <= 100 characters Уникальный код коэффициента в рамках организации (максимум 100 символов). |
| value | number <float> >= 0 Значение коэффициента (минимум 0, до 4 знаков после запятой). |
| type | string Enum: "percentage" "fixed_addition" Тип коэффициента. |
| applies_to | string Enum: "material_norms" "work_costs" "labor_hours" "general" К чему применяется коэффициент. |
| scope | string Enum: "global_org" "project" "work_type_category" "work_type" "material_category" "material" Область применения коэффициента. |
| description | string or null <= 2000 characters Описание коэффициента (максимум 2000 символов). |
| is_active | boolean Активность коэффициента. |
| valid_from | string or null <date> Дата начала действия коэффициента (формат YYYY-MM-DD). |
| valid_to | string or null <date> Дата окончания действия коэффициента (должна быть после или равна valid_from). |
| conditions | object or null Дополнительные условия применения коэффициента в формате JSON. |
{- "value": 18.75,
- "description": "Обновленная надбавка за зимний период"
}{- "success": true,
- "message": "Коэффициент обновлен успешно.",
- "data": {
- "id": 15,
- "value": 18.75,
- "description": "Обновленная надбавка за зимний период"
}
}Удаляет коэффициент расценок. Операция необратима. Проверяется принадлежность коэффициента организации.
| id required | integer Example: 15 ID коэффициента для удаления |
{- "success": false,
- "message": "Коэффициент не найден или у вас нет прав на его удаление."
}Возвращает пагинированный список подрядчиков организации с возможностью фильтрации и сортировки. Включает как созданных вручную, так и приглашенных подрядчиков из других организаций.
| name | string Example: name=Строймонтаж Фильтр по наименованию подрядчика (частичное совпадение) |
| inn | string Example: inn=7707083893 Фильтр по ИНН подрядчика (точное совпадение) |
| sort_by | string Default: "name" Example: sort_by=name Поле для сортировки |
| sort_direction | string Default: "asc" Enum: "asc" "desc" Example: sort_direction=asc Направление сортировки |
| per_page | integer [ 1 .. 100 ] Default: 15 Example: per_page=25 Количество записей на страницу |
{- "success": true,
- "message": "Список подрядчиков получен успешно.",
- "data": [ ],
- "meta": {
- "current_page": 1,
- "total": 15
}
}Создает нового подрядчика в каталоге организации. Проверяет уникальность ИНН и email в рамках организации. Автоматически устанавливает тип "manual" для ручно созданных подрядчиков.
| name required | string <= 255 characters Наименование подрядчика (обязательно, максимум 255 символов). |
| contact_person | string or null <= 255 characters Контактное лицо подрядчика (максимум 255 символов). |
| phone | string or null <= 50 characters Телефон подрядчика (максимум 50 символов). |
string or null <email> <= 255 characters Email подрядчика для связи. | |
| legal_address | string or null <= 1000 characters Юридический адрес подрядчика (максимум 1000 символов). |
| inn | string or null <= 12 characters ^[0-9]{10,12}$ ИНН подрядчика (максимум 12 символов, валидация формата). |
| kpp | string or null <= 9 characters ^[0-9]{9}$ КПП подрядчика (максимум 9 символов, валидация формата). |
| bank_details | string or null Банковские реквизиты подрядчика. |
| notes | string or null Дополнительные примечания о подрядчике. |
{- "name": "ООО Строймонтаж",
- "contact_person": "Иванов Иван Иванович",
- "phone": "+7 (495) 123-45-67",
- "email": "contact@stroymont.ru",
- "inn": "7707083893",
- "kpp": "770701001"
}{- "success": true,
- "message": "Подрядчик создан успешно.",
- "data": {
- "id": 8,
- "name": "ООО Строймонтаж",
- "inn": "7707083893",
- "contractor_type": "manual"
}
}Возвращает полную информацию о подрядчике включая настройки синхронизации для приглашенных организаций.
| id required | integer Example: 8 ID подрядчика |
{- "success": true,
- "message": "Подрядчик найден успешно.",
- "data": {
- "id": 8,
- "name": "ООО Строймонтаж",
- "contact_person": "Иванов Иван Иванович",
- "inn": "7707083893",
- "contractor_type": "manual"
}
}Обновляет информацию о подрядчике с проверкой уникальности ИНН и email. Поддерживает частичное обновление полей.
| id required | integer Example: 8 ID подрядчика для обновления |
| name | string <= 255 characters Наименование подрядчика (максимум 255 символов). |
| contact_person | string or null <= 255 characters Контактное лицо подрядчика (максимум 255 символов). |
| phone | string or null <= 50 characters Телефон подрядчика (максимум 50 символов). |
string or null <email> <= 255 characters Email подрядчика для связи. | |
| legal_address | string or null <= 1000 characters Юридический адрес подрядчика (максимум 1000 символов). |
| inn | string or null <= 12 characters ^[0-9]{10,12}$ ИНН подрядчика (максимум 12 символов, валидация формата). |
| kpp | string or null <= 9 characters ^[0-9]{9}$ КПП подрядчика (максимум 9 символов, валидация формата). |
| bank_details | string or null Банковские реквизиты подрядчика. |
| notes | string or null Дополнительные примечания о подрядчике. |
{- "phone": "+7 (495) 987-65-43",
- "email": "new-contact@stroymont.ru"
}{- "success": true,
- "message": "Подрядчик обновлен успешно.",
- "data": {
- "id": 8,
- "name": "ООО Строймонтаж Плюс",
- "phone": "+7 (495) 987-65-43"
}
}Удаляет подрядчика из каталога организации. Операция необратима. Перед удалением проверяется наличие связанных контрактов.
| id required | integer Example: 8 ID подрядчика для удаления |
{- "message": "Не определён контекст организации",
- "error": "Failed to delete contractor"
}Возвращает настройки подотчетных средств для текущей организации. Если настройки еще не созданы, возвращает значения по умолчанию.
{- "success": true,
- "data": {
- "id": 5,
- "organization_id": 10,
- "max_single_issue_amount": 50000,
- "report_submission_deadline_days": 7,
- "require_project_for_expense": true,
- "notify_admin_on_overdue_report": true
}
}Создает новые или обновляет существующие настройки подотчетных средств для текущей организации. Поддерживает частичное обновление полей.
| max_single_issue_amount | number or null <decimal> [ 0 .. 999999999.99 ] Максимальная сумма одной транзакции на выдачу |
| report_submission_deadline_days | integer or null [ 0 .. 365 ] Срок предоставления отчета (дни) |
| dual_authorization_threshold | number or null <decimal> [ 0 .. 999999999.99 ] Порог двойной авторизации |
| require_project_for_expense | boolean Требовать проект для расходов |
| notify_admin_on_overdue_report | boolean Уведомлять администратора о просроченных отчетах |
| notify_admin_on_high_value_transaction | boolean Уведомлять администратора о крупных транзакциях |
| high_value_notification_threshold | number or null <decimal> [ 0 .. 999999999.99 ] Порог для уведомления о крупной транзакции (обязательно если notify_admin_on_high_value_transaction = true) |
| notify_user_on_transaction_approval | boolean Уведомлять пользователя об утверждении транзакции |
| notify_user_on_transaction_rejection | boolean Уведомлять пользователя об отклонении транзакции |
| send_report_reminder_days_before | integer or null [ 0 .. 90 ] Отправлять напоминание об отчете за (дни) |
{- "max_single_issue_amount": 50000,
- "report_submission_deadline_days": 7,
- "dual_authorization_threshold": 100000,
- "require_project_for_expense": true,
- "notify_admin_on_overdue_report": true,
- "notify_admin_on_high_value_transaction": true,
- "high_value_notification_threshold": 50000,
- "notify_user_on_transaction_approval": true,
- "notify_user_on_transaction_rejection": true,
- "send_report_reminder_days_before": 2
}{- "success": true,
- "message": "Advance account settings updated successfully.",
- "data": {
- "id": 5,
- "organization_id": 10,
- "max_single_issue_amount": 50000,
- "report_submission_deadline_days": 7
}
}Возвращает пагинированный список транзакций подотчетных средств организации с возможностью детальной фильтрации по пользователю, проекту, типу, статусу и периоду.
| user_id | integer Example: user_id=25 Фильтр по ID пользователя |
| project_id | integer Example: project_id=8 Фильтр по ID проекта |
| type | string Enum: "issue" "expense" "return" Example: type=issue Фильтр по типу транзакции |
| reporting_status | string Enum: "pending" "reported" "approved" Example: reporting_status=pending Фильтр по статусу отчетности |
| date_from | string <date> Example: date_from=2024-12-01 Начало периода фильтрации |
| date_to | string <date> Example: date_to=2024-12-31 Конец периода фильтрации |
| per_page | integer [ 1 .. 100 ] Default: 15 Example: per_page=25 Количество записей на страницу |
{- "data": [
- {
- "id": 125,
- "user_id": 25,
- "organization_id": 10,
- "project_id": 8,
- "type": "issue",
- "amount": 15000,
- "description": "Закупка материалов для строительства",
- "document_number": "АВ-001234",
- "document_date": "2024-12-20",
- "balance_after": 27500,
- "reporting_status": "pending",
- "reported_at": "2024-12-21T14:30:00Z",
- "approved_at": "2024-12-22T09:15:00Z",
- "created_by_user_id": 12,
- "approved_by_user_id": 12,
- "external_code": "1C_DOC_12345",
- "accounting_data": {
- "account_code": "71.01",
- "cost_center": "ЦФО-001"
}, - "attachment_ids": "15,16,17",
- "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T10:00:00Z",
- "user": {
- "id": 25,
- "name": "Иванов И.И."
}, - "project": {
- "id": 8,
- "name": "ЖК Солнечный",
- "external_code": "PRJ-001"
}, - "created_by": {
- "id": 12,
- "name": "Администратор А.А."
}, - "approved_by": {
- "id": 12,
- "name": "Администратор А.А."
}
}
], - "meta": {
- "current_page": 2,
- "from": 16,
- "last_page": 5,
- "per_page": 15,
- "to": 30,
- "total": 67
}
}Создает новую транзакцию подотчетных средств с автоматическим пересчетом баланса пользователя. Проверяет настройки организации и лимиты.
| user_id required | integer ID пользователя (прораба) для транзакции |
| project_id | integer or null ID проекта (опционально) |
| type required | string Enum: "issue" "expense" "return" Тип транзакции:
|
| amount required | number <decimal> >= 0.01 Сумма транзакции |
| description | string or null <= 255 characters Описание/назначение транзакции |
| document_number | string or null <= 100 characters Номер документа |
| document_date | string or null <date> Дата документа |
{- "user_id": 25,
- "project_id": 8,
- "type": "issue",
- "amount": 15000,
- "description": "Закупка материалов для строительства",
- "document_number": "АВ-001234",
- "document_date": "2024-12-20"
}{- "success": true,
- "message": "Transaction created successfully",
- "data": {
- "id": 125,
- "user_id": 25,
- "amount": 15000,
- "type": "issue",
- "balance_after": 27500,
- "reporting_status": "pending"
}
}Возвращает список пользователей (прорабов, руководителей участков, менеджеров проектов) организации, которым можно выдавать подотчетные средства.
| search | string Example: search=Иванов Поиск по имени или должности |
{- "data": [
- {
- "id": 25,
- "name": "Иванов Иван Иванович",
- "current_balance": 12500,
- "has_overdue_balance": false,
- "position": "Прораб",
}
]
}Возвращает список активных проектов организации. Если указан user_id, возвращает только проекты, назначенные этому пользователю.
| user_id | integer Example: user_id=25 ID пользователя для фильтрации проектов |
| search | string Example: search=Солнечный Поиск по названию, адресу или внешнему коду |
{- "data": [
- {
- "id": 8,
- "name": "ЖК Солнечный",
- "external_code": "PRJ-001",
- "status": "active",
- "address": "г. Москва, ул. Солнечная, д. 15"
}
]
}Возвращает полную информацию о транзакции включая связанные данные о пользователе, проекте, создателе и утверждающем.
| transaction required | integer Example: 125 ID транзакции |
{- "success": true,
- "data": {
- "id": 125,
- "user_id": 25,
- "amount": 15000,
- "type": "issue",
- "balance_after": 27500,
- "reporting_status": "pending",
- "user": {
- "id": 25,
- "name": "Иванов И.И."
}, - "project": {
- "id": 8,
- "name": "ЖК Солнечный",
- "external_code": "PRJ-001"
}
}
}Обновляет транзакцию подотчетных средств. Ключевые поля (сумма, тип, пользователь) можно изменять только для транзакций со статусом "pending".
| transaction required | integer Example: 125 ID транзакции для обновления |
| description | string or null <= 255 characters Описание/назначение транзакции |
| document_number | string or null <= 100 characters Номер документа |
| document_date | string or null <date> Дата документа |
| external_code | string or null <= 100 characters Внешний код для интеграции с бухгалтерией |
| accounting_data | object or null Дополнительные данные для бухгалтерской интеграции |
{- "description": "Обновленное описание закупки материалов",
- "document_number": "АВ-001234-UPD"
}{- "success": true,
- "message": "Transaction updated successfully",
- "data": {
- "id": 125,
- "description": "Обновленное описание закупки материалов",
- "document_number": "АВ-001234-UPD"
}
}Удаляет транзакцию подотчетных средств с восстановлением предыдущего баланса. Можно удалять только транзакции со статусом "pending".
| transaction required | integer Example: 125 ID транзакции для удаления |
{- "success": true,
- "message": "Transaction deleted successfully"
}Создает отчет по транзакции подотчетных средств с возможностью прикрепления файлов. Изменяет статус на "reported".
| transaction required | integer Example: 125 ID транзакции для отчета |
| description required | string <= 255 characters Описание отчета по транзакции |
| document_number required | string <= 100 characters Номер отчетного документа |
| document_date required | string <date> Дата отчетного документа |
| files | Array of strings or null <binary> Прикрепляемые файлы к отчету (максимум 10MB на файл) |
{ "description": "Отчет о закупке строительных материалов", "document_number": "ОТЧ-001234", "document_date": "2024-12-20", "files": [ "receipt1.pdf", "receipt2.jpg" ] }
{- "success": true,
- "message": "Transaction reported successfully",
- "data": {
- "id": 125,
- "reporting_status": "reported",
- "reported_at": "2024-12-21T14:30:00Z",
- "description": "Отчет о закупке строительных материалов"
}
}Утверждает отчет по транзакции подотчетных средств. Возможно только для транзакций со статусом "reported".
| transaction required | integer Example: 125 ID транзакции для утверждения |
| accounting_data | object or null Дополнительные данные для бухгалтерской обработки |
{- "accounting_data": {
- "approved_amount": 14500,
- "approval_notes": "Утверждено с замечаниями"
}
}{- "success": true,
- "message": "Transaction approved successfully",
- "data": {
- "id": 125,
- "reporting_status": "approved",
- "approved_at": "2024-12-22T09:15:00Z",
- "approved_by_user_id": 12
}
}Прикрепляет дополнительные файлы к транзакции подотчетных средств. Нельзя добавлять файлы к утвержденным транзакциям.
| transaction required | integer Example: 125 ID транзакции |
| files required | Array of strings <binary> Массив файлов для прикрепления (максимум 10MB на файл) |
{- "success": true,
- "message": "Files attached successfully",
- "data": {
- "id": 125,
- "attachment_ids": "15,16,17"
}
}Открепляет файл от транзакции подотчетных средств. Нельзя удалять файлы из утвержденных транзакций.
| transaction required | integer Example: 125 ID транзакции |
| fileId required | integer Example: 16 ID файла для открепления |
{- "success": true,
- "message": "File detached successfully",
- "data": {
- "id": 125,
- "attachment_ids": "15,17"
}
}Возвращает пагинированный список видов работ с возможностью детальной фильтрации и сортировки. Включает связанную единицу измерения.
| name | string Example: name=Кладка Фильтр по названию (частичное совпадение) |
| category | string Example: category=Каменные работы Фильтр по категории |
| is_active | boolean Example: is_active=true Фильтр по активности |
| sort_by | string Default: "name" Enum: "name" "category" "created_at" "updated_at" Example: sort_by=name Поле для сортировки |
| sort_direction | string Default: "asc" Enum: "asc" "desc" Example: sort_direction=asc Направление сортировки |
| per_page | integer [ 1 .. 100 ] Default: 15 Example: per_page=25 Количество записей на страницу |
{- "data": [
- {
- "id": 5,
- "name": "Кладка кирпичных стен",
- "category": "Каменные работы",
- "is_active": true,
- "measurement_unit": {
- "id": 3,
- "name": "квадратный метр",
- "short_name": "м²"
}
}
], - "meta": {
- "current_page": 1,
- "total": 35
}
}Создает новый вид работ для организации с проверкой уникальности названия и валидацией всех полей.
| name required | string <= 255 characters Название вида работ (уникальное в рамках организации) |
| measurement_unit_id required | integer >= 1 ID единицы измерения (должна существовать в measurement_units) |
| category | string or null <= 100 characters Категория вида работ |
| is_active | boolean Default: true Активен ли вид работ |
| code | string or null <= 100 characters Внутренний код вида работ |
| description | string or null Описание вида работ |
| default_price | number or null <decimal> >= 0 Цена по умолчанию за единицу работ (не может быть отрицательной) |
| additional_properties | object or null Дополнительные свойства в формате JSON |
{- "name": "Кладка кирпичных стен",
- "measurement_unit_id": 3,
- "category": "Каменные работы",
- "description": "Кладка несущих стен из керамического кирпича",
- "default_price": 1250
}{- "success": true,
- "message": "Work Type created successfully (raw response)",
- "data": {
- "id": 25,
- "name": "Кладка кирпичных стен",
- "category": "Каменные работы",
- "is_active": true,
- "measurement_unit": {
- "id": 3,
- "name": "квадратный метр",
- "short_name": "м²"
}
}
}Возвращает полную информацию о виде работ включая связанную единицу измерения. Проверяет принадлежность к организации.
| id required | integer Example: 25 ID вида работ |
{- "id": 25,
- "name": "Кладка кирпичных стен",
- "code": "KLAD-001",
- "category": "Каменные работы",
- "description": "Кладка несущих стен из керамического кирпича",
- "default_price": 1250,
- "is_active": true,
- "measurement_unit": {
- "id": 3,
- "name": "квадратный метр",
- "short_name": "м²"
}, - "additional_properties": {
- "complexity": "средняя",
- "tools_required": [
- "мастерок",
- "уровень",
- "отвес"
]
}, - "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T15:30:00Z"
}Обновляет вид работ с проверкой принадлежности к организации и валидацией уникальности названия (игнорируя текущую запись).
| id required | integer Example: 25 ID вида работ для обновления |
| name | string <= 255 characters Название вида работ (уникальное в рамках организации, игнорирует текущую запись) |
| measurement_unit_id | integer >= 1 ID единицы измерения (должна существовать) |
| category | string or null <= 100 characters Категория вида работ |
| is_active | boolean Активен ли вид работ |
| code | string or null <= 100 characters Внутренний код вида работ |
| description | string or null Описание вида работ |
| default_price | number or null <decimal> >= 0 Цена по умолчанию за единицу работ |
| additional_properties | object or null Дополнительные свойства в формате JSON |
{- "default_price": 1350,
- "description": "Обновленное описание кладки стен"
}{- "id": 25,
- "name": "Кладка кирпичных стен усиленная",
- "default_price": 1450,
- "description": "Кладка несущих стен с армированием"
}Удаляет вид работ (soft delete) с проверкой принадлежности к организации. Проверяет возможность удаления (не используется в других записях).
| id required | integer Example: 25 ID вида работ для удаления |
{- "success": false,
- "message": "Вид работы не найден или не принадлежит вашей организации."
}Возвращает список материалов с нормами расхода для указанного вида работ. Включает информацию о количестве по умолчанию и примечания.
| work_type required | integer Example: 25 ID вида работ |
{- "data": [
- {
- "material_id": 45,
- "material_name": "Кирпич керамический",
- "measurement_unit": "шт",
- "default_quantity": 120.5,
- "notes": "С учетом отходов 5%",
- "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T15:30:00Z"
}, - {
- "material_id": 78,
- "material_name": "Раствор цементный",
- "measurement_unit": "м³",
- "default_quantity": 0.25,
- "notes": "М150"
}
]
}Полностью синхронизирует список материалов с нормами расхода для вида работ. Старые связи будут удалены, новые добавлены, существующие обновлены.
| work_type required | integer Example: 25 ID вида работ |
required | Array of objects non-empty Массив материалов с нормами расхода |
{- "materials": [
- {
- "material_id": 45,
- "default_quantity": 120.5,
- "notes": "С учетом отходов 5%"
}, - {
- "material_id": 78,
- "default_quantity": 0.25,
- "notes": "М150"
}, - {
- "material_id": 92,
- "default_quantity": 15,
- "notes": "Арматура 12мм"
}
]
}{- "data": [
- {
- "material_id": 45,
- "material_name": "Кирпич керамический",
- "measurement_unit": "шт",
- "default_quantity": 120.5,
- "notes": "С учетом отходов 5%"
}, - {
- "material_id": 78,
- "material_name": "Раствор цементный",
- "measurement_unit": "м³",
- "default_quantity": 0.25,
- "notes": "М150"
}
]
}Удаляет связь между видом работ и материалом. Проверяет принадлежность обеих сущностей к организации.
| work_type required | integer Example: 25 ID вида работ |
| material_id required | integer Example: 45 ID материала для отвязки |
{- "success": false,
- "message": "Не удалось отвязать материал от вида работ"
}Рассчитывает количество материалов на основе норм расхода для заданного объема выполняемых работ.
| work_type required | integer Example: 25 ID вида работ |
| quantity required | number <decimal> >= 0.0001 Example: quantity=5 Объем выполняемых работ (в единицах измерения вида работ) |
{- "success": true,
- "data": [
- {
- "material_id": 45,
- "material_name": "Кирпич керамический",
- "material_code": "KIRP-001",
- "suggested_quantity": 602.5,
- "measurement_unit_short_name": "шт",
- "default_norm_per_unit": 120.5,
- "norm_notes": "С учетом отходов 5%"
}, - {
- "material_id": 78,
- "material_name": "Раствор цементный",
- "material_code": "RAST-M150",
- "suggested_quantity": 1.25,
- "measurement_unit_short_name": "м³",
- "default_norm_per_unit": 0.25,
- "norm_notes": "М150"
}
]
}Возвращает пагинированный список актов организации с возможностью детальной фильтрации и сортировки. Включает статистику по актам.
| contract_id | integer Example: contract_id=25 Фильтр по ID контракта |
| project_id | integer Example: project_id=12 Фильтр по ID проекта |
| contractor_id | integer Example: contractor_id=8 Фильтр по ID подрядчика |
| is_approved | boolean Example: is_approved=true Фильтр по статусу утверждения |
| date_from | string <date> Example: date_from=2024-12-01 Фильтр по дате акта (от) |
| date_to | string <date> Example: date_to=2024-12-31 Фильтр по дате акта (до) |
| search | string Example: search=АКТ-2024 Поиск по номеру акта, описанию или номеру контракта |
| sort_by | string Default: "act_date" Example: sort_by=act_date Поле для сортировки |
| sort_direction | string Default: "desc" Enum: "asc" "desc" Example: sort_direction=desc Направление сортировки |
| per_page | integer [ 1 .. 100 ] Default: 15 Example: per_page=15 Количество записей на страницу |
{- "data": {
- "data": [
- {
- "id": 15,
- "contract_id": 25,
- "act_document_number": "АКТ-2024-001",
- "act_date": "2024-12-20",
- "amount": 125000,
- "is_approved": true
}
], - "pagination": {
- "current_page": 1,
- "last_page": 5,
- "per_page": 15,
- "total": 68
}, - "statistics": {
- "total_acts": 68,
- "approved_acts": 45,
- "total_amount": 4250000
}
}, - "message": "Акты получены успешно"
}Создает новый акт с возможностью включения выполненных работ. Автоматически рассчитывает сумму акта на основе включенных работ.
| contract_id required | integer ID контракта (должен принадлежать организации и быть активным) |
| act_document_number required | string <= 255 characters Номер документа акта |
| act_date required | string <date> Дата акта |
| description | string or null Описание акта |
| work_ids | Array of integers or null Массив ID выполненных работ для включения в акт |
{- "contract_id": 25,
- "act_document_number": "АКТ-2024-001",
- "act_date": "2024-12-20",
- "description": "Акт выполненных работ по кладке стен 1 этажа",
- "work_ids": [
- 342,
- 343,
- 344
]
}{- "data": {
- "id": 16,
- "contract_id": 25,
- "act_document_number": "АКТ-2024-001",
- "act_date": "2024-12-20",
- "amount": 125000,
- "description": "Акт выполненных работ по кладке стен 1 этажа",
- "is_approved": false,
- "completed_works": [
- {
- "id": 342,
- "work_type_name": "Кладка кирпичных стен",
- "included_amount": 31875
}
]
}, - "message": "Акт создан успешно"
}Возвращает список активных контрактов организации, доступных для создания актов выполненных работ.
{- "data": [
- {
- "id": 25,
- "contract_number": "КТ-2024-0025",
- "project_name": "Жилой комплекс Солнечный",
- "contractor_name": "ООО СтройТех",
- "contract_date": "2024-01-15",
- "start_date": "2024-02-01",
- "end_date": "2024-12-31"
}
], - "message": "Контракты получены успешно"
}Экспортирует выбранные акты в один Excel файл с детальной информацией по всем работам и материалам.
| act_ids required | Array of integers non-empty Массив ID актов для экспорта |
{- "act_ids": [
- 25,
- 26,
- 27
]
}{- "error": "Не выбраны акты для экспорта"
}Возвращает полную информацию об акте, включая связанный контракт, проект, подрядчика и все включенные выполненные работы.
| act required | integer Example: 15 ID акта |
{- "data": {
- "id": 15,
- "contract_id": 25,
- "act_document_number": "АКТ-2024-001",
- "act_date": "2024-12-20",
- "amount": 125000,
- "description": "Акт выполненных работ по кладке стен 1 этажа",
- "is_approved": true,
- "approval_date": "2024-12-21",
- "contract": {
- "id": 25,
- "number": "КТ-2024-0025",
- "project_name": "Жилой комплекс Солнечный"
}, - "completed_works": [
- {
- "id": 342,
- "work_type_name": "Кладка кирпичных стен",
- "included_amount": 31875
}
]
}, - "message": "Акт получен успешно"
}Обновляет основную информацию акта: номер документа, дату, описание и статус утверждения. Состав работ обновляется отдельным эндпоинтом.
| act required | integer Example: 15 ID акта для обновления |
| act_document_number | string <= 255 characters Номер документа акта |
| act_date | string <date> Дата акта |
| description | string or null Описание акта |
| is_approved | boolean Статус утверждения акта |
{- "is_approved": true
}{- "data": {
- "id": 15,
- "act_document_number": "АКТ-2024-001-УТВ",
- "is_approved": true
}, - "message": "Акт обновлен успешно"
}Возвращает список подтвержденных выполненных работ по контракту, которые можно включить в акт. Показывает статус включения в другие акты.
| act required | integer Example: 15 ID акта |
{- "data": [
- {
- "id": 342,
- "work_type_name": "Кладка кирпичных стен",
- "user_name": "Иван Петров",
- "quantity": 25.5,
- "price": 1250,
- "total_amount": 31875,
- "completion_date": "2024-12-18",
- "is_included_in_approved_act": false,
- "is_included_in_current_act": true
}
], - "message": "Доступные работы получены успешно"
}Полностью заменяет состав работ в акте и пересчитывает общую сумму. Все ранее включенные работы будут исключены.
| act required | integer Example: 15 ID акта |
| work_ids required | Array of integers Массив ID выполненных работ для включения в акт |
{- "work_ids": [
- 342,
- 343,
- 344
]
}{- "data": {
- "id": 15,
- "amount": 95250,
- "completed_works": [
- {
- "id": 342,
- "work_type_name": "Кладка кирпичных стен",
- "included_amount": 31875
}, - {
- "id": 343,
- "work_type_name": "Штукатурка стен",
- "included_amount": 31687.5
}, - {
- "id": 344,
- "work_type_name": "Покраска стен",
- "included_amount": 31687.5
}
]
}, - "message": "Состав работ акта обновлен успешно"
}Генерирует PDF файл акта с детальной информацией по всем работам. Файл автоматически сохраняется в S3 и возвращается для скачивания.
| act required | integer Example: 15 ID акта для экспорта |
{- "error": "Не определена организация пользователя"
}Скачивает ранее сохраненный PDF файл акта из хранилища S3. Проверяет принадлежность файла к акту и организации.
| act required | integer Example: 15 ID акта |
| file required | integer Example: 456 ID файла |
{- "error": "Доступ запрещен"
}Генерирует Excel файл акта с детальной информацией по всем работам и материалам. Файл автоматически сохраняется в S3 и возвращается для скачивания.
| act required | integer Example: 15 ID акта для экспорта |
{- "error": "Не определена организация пользователя"
}Возвращает пагинированный список контрактов организации с возможностью фильтрации по множественным критериям. Включает связанные данные: подрядчика, проект, родительский контракт. Поддерживает поиск по подрядчикам (имя, ИНН, КПП, email), проектам, суммам и датам.
| contractor_id | integer Example: contractor_id=3 Фильтр по ID подрядчика |
| contractor_search | string Example: contractor_search=ИП Рыкунов Поиск по подрядчику (имя, ИНН, КПП, email, телефон) |
| project_id | integer Example: project_id=5 Фильтр по ID проекта |
| project_search | string Example: project_search=Торговый центр Поиск по проекту (название, адрес, код) |
string or Array of strings Example: status=active Фильтр по статусу контракта (один или несколько) | |
string or Array of strings Example: work_type_category=general_construction Фильтр по категории работ (один или несколько) | |
| number | string Example: number=ДПХ-2024 Поиск по номеру контракта |
| date_from | string <date> Example: date_from=2024-01-01 Дата заключения от (включительно) |
| date_to | string <date> Example: date_to=2024-12-31 Дата заключения до (включительно) |
| start_date_from | string <date> Example: start_date_from=2024-01-01 Дата начала работ от |
| start_date_to | string <date> Example: start_date_to=2024-12-31 Дата начала работ до |
| end_date_from | string <date> Example: end_date_from=2024-01-01 Дата окончания работ от |
| end_date_to | string <date> Example: end_date_to=2024-12-31 Дата окончания работ до |
| completion_from | number <float> Example: completion_from=50 Процент выполнения от |
| completion_to | number <float> Example: completion_to=90 Процент выполнения до |
| amount_from | number <float> Example: amount_from=1000000 Сумма контракта от |
| amount_to | number <float> Example: amount_to=5000000 Сумма контракта до |
| gp_percentage_from | number <float> Example: gp_percentage_from=10 Процент ГП от |
| gp_percentage_to | number <float> Example: gp_percentage_to=25 Процент ГП до |
| has_advance | boolean Example: has_advance=true Фильтр по наличию аванса |
| advance_paid_status | string Enum: "paid" "partial" "not_paid" Example: advance_paid_status=partial Статус выплаты аванса (paid - полностью выплачен, partial - частично, not_paid - не выплачен) |
| has_parent | boolean Фильтр по наличию родительского контракта |
| has_children | boolean Example: has_children=true Фильтр по наличию дочерних контрактов |
| requiring_attention | boolean Example: requiring_attention=true Контракты, требующие внимания |
| is_nearing_limit | boolean Example: is_nearing_limit=true Контракты, приближающиеся к лимиту (90%+) |
| is_overdue | boolean Просроченные контракты |
| search | string Example: search=строительные работы Поиск по номеру или названию |
| sort_by | string Default: "created_at" Example: sort_by=total_amount Поле для сортировки |
| sort_direction | string Default: "desc" Enum: "asc" "desc" Example: sort_direction=desc Направление сортировки |
| per_page | integer [ 1 .. 100 ] Default: 15 Example: per_page=25 Количество записей на страницу |
{- "success": true,
- "message": "Список контрактов получен успешно.",
- "data": [ ],
- "meta": {
- "current_page": 1,
- "total": 45
}
}Создает новый контракт с валидацией подрядчика, проекта и родительского контракта. Автоматически устанавливает контекст организации.
| project_id | integer or null ID проекта, к которому привязан контракт (опционально). |
| contractor_id required | integer ID подрядчика из каталога организации. |
| parent_contract_id | integer or null ID родительского контракта (для создания иерархии). Проверяется через ParentContractValid. |
| number required | string <= 255 characters Номер контракта (обязательно, максимум 255 символов). |
| date required | string <date> Дата заключения контракта (формат YYYY-MM-DD). |
| subject | string or null Предмет контракта или краткое описание. |
| work_type_category | string or null Enum: "smr" "general_construction" "finishing" "installation" "design" "consultation" "supply" "services" "rent" "other" Категория видов работ по контракту. |
| payment_terms | string or null Условия оплаты по контракту. |
| total_amount required | number <float> >= 0 Общая сумма контракта (обязательно, минимум 0). |
| gp_percentage | number or null <float> [ 0 .. 100 ] Процент генерального подряда (от 0 до 100). |
| planned_advance_amount | number or null <float> >= 0 Планируемая сумма аванса (минимум 0). |
| actual_advance_amount | number or null <float> >= 0 Фактически выплаченная сумма аванса (минимум 0). |
| status required | string Enum: "draft" "active" "completed" "terminated" "on_hold" Статус контракта. |
| start_date | string or null <date> Дата начала работ по контракту (формат YYYY-MM-DD). |
| end_date | string or null <date> Дата окончания работ по контракту (должна быть после или равна start_date). |
| notes | string or null Дополнительные примечания или комментарии к контракту. |
{- "contractor_id": 3,
- "number": "ДПХ-2024/001",
- "date": "2024-02-01",
- "total_amount": 2500000,
- "status": "active",
- "start_date": "2024-02-05",
- "end_date": "2024-08-30"
}{- "success": true,
- "message": "Контракт создан успешно.",
- "data": {
- "id": 15,
- "number": "ДПХ-2024/001",
- "total_amount": 2500000,
- "status": "active"
}
}{- "success": true,
- "message": "Контракт создан успешно.",
- "data": {
- "id": 1,
- "organization_id": 1,
- "project": {
- "id": 5,
- "name": "ЖК Солнечный",
- "address": "г. Москва, ул. Солнечная, д. 15",
- "status": "active"
}, - "contractor": {
- "id": 1,
- "organization_id": 1,
- "source_organization_id": 25,
- "name": "ООО Строймонтаж",
- "contact_person": "Иванов Иван Иванович",
- "phone": "+7 (495) 123-45-67",
- "email": "contact@stroymont.ru",
- "legal_address": "127055, г. Москва, ул. Сущевская, д. 21, стр. 1",
- "inn": "7707083893",
- "kpp": "770701001",
- "bank_details": "р/с 40702810400000000001 в ПАО Сбербанк",
- "notes": "Специализация: высотные работы",
- "contractor_type": "manual",
- "contractor_invitation_id": 10,
- "connected_at": "2024-01-15T10:00:00.000000Z",
- "sync_settings": {
- "sync_fields": [
- "name",
- "phone",
- "email"
], - "sync_interval_hours": 24
}, - "last_sync_at": "2024-02-15T08:30:00.000000Z",
- "created_at": "2024-01-15T10:00:00.000000Z",
- "updated_at": "2024-02-15T14:30:00.000000Z"
}, - "parent_contract": {
- "id": 1,
- "number": "ДПХ-2024/001",
- "total_amount": 2500000,
- "status": "active",
- "completion_percentage": 50,
- "contractor_name": "ООО Строймонтаж"
}, - "child_contracts": [
- {
- "id": 1,
- "number": "ДПХ-2024/001",
- "total_amount": 2500000,
- "status": "active",
- "completion_percentage": 50,
- "contractor_name": "ООО Строймонтаж"
}
], - "number": "ДПХ-2024/001",
- "date": "2024-02-01",
- "subject": "Выполнение строительно-монтажных работ по объекту",
- "work_type_category": "general_construction",
- "payment_terms": "Оплата в течение 10 банковских дней",
- "total_amount": 2500000,
- "gp_percentage": 15.5,
- "gp_amount": 387500,
- "total_amount_with_gp": 2887500,
- "planned_advance_amount": 500000,
- "actual_advance_amount": 250000,
- "remaining_advance_amount": 250000,
- "advance_payment_percentage": 50,
- "is_advance_fully_paid": false,
- "status": "active",
- "start_date": "2024-02-05",
- "end_date": "2024-08-30",
- "is_overdue": false,
- "notes": "Особые условия: работа в зимний период",
- "completed_works_amount": 1250000,
- "remaining_amount": 1250000,
- "completion_percentage": 50,
- "total_paid_amount": 800000,
- "total_performed_amount": 1100000,
- "created_at": "2024-02-01T10:00:00.000000Z",
- "updated_at": "2024-02-15T14:30:00.000000Z"
}
}Обновляет данные контракта. Все поля опциональны - можно отправить только те поля, которые нужно изменить. Поля, не указанные в запросе, сохранят свои текущие значения.
| id required | integer |
| project_id | integer or null ID проекта, к которому привязан контракт. |
| contractor_id | integer ID подрядчика из каталога организации. |
| parent_contract_id | integer or null ID родительского контракта. Проверяется через ParentContractValid. |
| number | string <= 255 characters Номер контракта (максимум 255 символов). |
| date | string <date> Дата заключения контракта (формат YYYY-MM-DD). |
| subject | string or null Предмет контракта или краткое описание. |
| work_type_category | string or null Enum: "smr" "general_construction" "finishing" "installation" "design" "consultation" "supply" "services" "rent" "other" Категория видов работ по контракту. |
| payment_terms | string or null Условия оплаты по контракту. |
| total_amount | number <float> >= 0 Общая сумма контракта (минимум 0). |
| gp_percentage | number or null <float> [ 0 .. 100 ] Процент генерального подряда (от 0 до 100). |
| planned_advance_amount | number or null <float> >= 0 Планируемая сумма аванса (минимум 0). |
| actual_advance_amount | number or null <float> >= 0 Фактически выплаченная сумма аванса (минимум 0). |
| status | string Enum: "draft" "active" "completed" "terminated" "on_hold" Статус контракта. |
| start_date | string or null <date> Дата начала работ по контракту (формат YYYY-MM-DD). |
| end_date | string or null <date> Дата окончания работ по контракту (должна быть после или равна start_date). |
| notes | string or null Дополнительные примечания или комментарии к контракту. |
{- "status": "completed",
- "end_date": "2025-10-12",
- "notes": "Контракт завершен досрочно"
}{- "success": true,
- "message": "Контракт создан успешно.",
- "data": {
- "id": 1,
- "organization_id": 1,
- "project": {
- "id": 5,
- "name": "ЖК Солнечный",
- "address": "г. Москва, ул. Солнечная, д. 15",
- "status": "active"
}, - "contractor": {
- "id": 1,
- "organization_id": 1,
- "source_organization_id": 25,
- "name": "ООО Строймонтаж",
- "contact_person": "Иванов Иван Иванович",
- "phone": "+7 (495) 123-45-67",
- "email": "contact@stroymont.ru",
- "legal_address": "127055, г. Москва, ул. Сущевская, д. 21, стр. 1",
- "inn": "7707083893",
- "kpp": "770701001",
- "bank_details": "р/с 40702810400000000001 в ПАО Сбербанк",
- "notes": "Специализация: высотные работы",
- "contractor_type": "manual",
- "contractor_invitation_id": 10,
- "connected_at": "2024-01-15T10:00:00.000000Z",
- "sync_settings": {
- "sync_fields": [
- "name",
- "phone",
- "email"
], - "sync_interval_hours": 24
}, - "last_sync_at": "2024-02-15T08:30:00.000000Z",
- "created_at": "2024-01-15T10:00:00.000000Z",
- "updated_at": "2024-02-15T14:30:00.000000Z"
}, - "parent_contract": {
- "id": 1,
- "number": "ДПХ-2024/001",
- "total_amount": 2500000,
- "status": "active",
- "completion_percentage": 50,
- "contractor_name": "ООО Строймонтаж"
}, - "child_contracts": [
- {
- "id": 1,
- "number": "ДПХ-2024/001",
- "total_amount": 2500000,
- "status": "active",
- "completion_percentage": 50,
- "contractor_name": "ООО Строймонтаж"
}
], - "number": "ДПХ-2024/001",
- "date": "2024-02-01",
- "subject": "Выполнение строительно-монтажных работ по объекту",
- "work_type_category": "general_construction",
- "payment_terms": "Оплата в течение 10 банковских дней",
- "total_amount": 2500000,
- "gp_percentage": 15.5,
- "gp_amount": 387500,
- "total_amount_with_gp": 2887500,
- "planned_advance_amount": 500000,
- "actual_advance_amount": 250000,
- "remaining_advance_amount": 250000,
- "advance_payment_percentage": 50,
- "is_advance_fully_paid": false,
- "status": "active",
- "start_date": "2024-02-05",
- "end_date": "2024-08-30",
- "is_overdue": false,
- "notes": "Особые условия: работа в зимний период",
- "completed_works_amount": 1250000,
- "remaining_amount": 1250000,
- "completion_percentage": 50,
- "total_paid_amount": 800000,
- "total_performed_amount": 1100000,
- "created_at": "2024-02-01T10:00:00.000000Z",
- "updated_at": "2024-02-15T14:30:00.000000Z"
}
}Возвращает полную аналитическую информацию по контракту включая: финансовые показатели, статусы, количественные данные, прогресс выполнения.
| id required | integer Example: 15 ID контракта для получения аналитики |
{- "success": true,
- "data": {
- "financial": {
- "total_amount": 2500000,
- "completion_percentage": 50,
- "remaining_amount": 1250000
}, - "status": {
- "current_status": "active",
- "is_nearing_limit": false,
- "can_add_work": true
}, - "counts": {
- "total_works": 25,
- "confirmed_works": 20
}
}
}| id required | integer |
| page | integer |
| per_page | integer |
{- "success": true,
- "message": "string",
- "data": [
- {
- "id": 1,
- "organization_id": 1,
- "project": {
- "id": 5,
- "name": "ЖК Солнечный",
- "address": "г. Москва, ул. Солнечная, д. 15",
- "status": "active"
}, - "contract": {
- "id": 1,
- "number": "ДПХ-2024/001",
- "total_amount": 2500000,
- "status": "active",
- "completion_percentage": 50,
- "contractor_name": "ООО Строймонтаж"
}, - "work_type": {
- "id": 5,
- "name": "Кладка кирпичных стен",
- "code": "KLAD-001",
- "category": "Каменные работы",
- "description": "Кладка несущих стен из керамического кирпича",
- "defaultPrice": 1250,
- "isActive": true,
- "organizationId": 10,
- "measurementUnit": {
- "id": 1,
- "name": "квадратный метр",
- "code": "м²",
- "short_name": "м²",
- "type": "material",
- "description": "Единица измерения площади",
- "is_default": false,
- "is_system": false,
- "organization_id": 10,
- "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T15:30:00Z"
}, - "createdAt": "2024-12-20 10:00:00",
- "updatedAt": "2024-12-20 15:30:00"
}, - "user": {
- "id": 12,
- "name": "Иванов Иван Иванович",
- "email": "ivanov@example.com",
- "phone": "+7 (900) 123-45-67",
- "position": "Прораб",
}, - "contractor": {
- "id": 3,
- "name": "ООО Строймонтаж",
- "inn": "7707083893",
- "contact_person": "Иванов И.И."
}, - "contractor_id": 3,
- "quantity": 150.5,
- "price": 500.25,
- "total_amount": 75187.5,
- "completion_date": "2024-02-15",
- "notes": "Работы выполнены качественно, в срок.",
- "status": "confirmed",
- "additional_info": {
- "quality_rating": 5,
- "weather_conditions": "солнечно"
}, - "materials": [
- {
- "material_id": 15,
- "material_name": "Цемент М500",
- "measurement_unit": "т",
- "quantity": 25.5,
- "unit_price": 150,
- "total_amount": 3825,
- "notes": "Высококачественный материал",
- "created_at": "2024-02-15 10:30:00",
- "updated_at": "2024-02-15 14:45:00"
}
], - "created_at": "2024-02-15 10:30:00",
- "updated_at": "2024-02-15 14:45:00"
}
]
}{- "success": true,
- "message": "Контракт создан успешно.",
- "data": {
- "id": 1,
- "organization_id": 1,
- "project": {
- "id": 5,
- "name": "ЖК Солнечный",
- "address": "г. Москва, ул. Солнечная, д. 15",
- "status": "active"
}, - "contractor": {
- "id": 1,
- "organization_id": 1,
- "source_organization_id": 25,
- "name": "ООО Строймонтаж",
- "contact_person": "Иванов Иван Иванович",
- "phone": "+7 (495) 123-45-67",
- "email": "contact@stroymont.ru",
- "legal_address": "127055, г. Москва, ул. Сущевская, д. 21, стр. 1",
- "inn": "7707083893",
- "kpp": "770701001",
- "bank_details": "р/с 40702810400000000001 в ПАО Сбербанк",
- "notes": "Специализация: высотные работы",
- "contractor_type": "manual",
- "contractor_invitation_id": 10,
- "connected_at": "2024-01-15T10:00:00.000000Z",
- "sync_settings": {
- "sync_fields": [
- "name",
- "phone",
- "email"
], - "sync_interval_hours": 24
}, - "last_sync_at": "2024-02-15T08:30:00.000000Z",
- "created_at": "2024-01-15T10:00:00.000000Z",
- "updated_at": "2024-02-15T14:30:00.000000Z"
}, - "parent_contract": {
- "id": 1,
- "number": "ДПХ-2024/001",
- "total_amount": 2500000,
- "status": "active",
- "completion_percentage": 50,
- "contractor_name": "ООО Строймонтаж"
}, - "child_contracts": [
- {
- "id": 1,
- "number": "ДПХ-2024/001",
- "total_amount": 2500000,
- "status": "active",
- "completion_percentage": 50,
- "contractor_name": "ООО Строймонтаж"
}
], - "number": "ДПХ-2024/001",
- "date": "2024-02-01",
- "subject": "Выполнение строительно-монтажных работ по объекту",
- "work_type_category": "general_construction",
- "payment_terms": "Оплата в течение 10 банковских дней",
- "total_amount": 2500000,
- "gp_percentage": 15.5,
- "gp_amount": 387500,
- "total_amount_with_gp": 2887500,
- "planned_advance_amount": 500000,
- "actual_advance_amount": 250000,
- "remaining_advance_amount": 250000,
- "advance_payment_percentage": 50,
- "is_advance_fully_paid": false,
- "status": "active",
- "start_date": "2024-02-05",
- "end_date": "2024-08-30",
- "is_overdue": false,
- "notes": "Особые условия: работа в зимний период",
- "completed_works_amount": 1250000,
- "remaining_amount": 1250000,
- "completion_percentage": 50,
- "total_paid_amount": 800000,
- "total_performed_amount": 1100000,
- "created_at": "2024-02-01T10:00:00.000000Z",
- "updated_at": "2024-02-15T14:30:00.000000Z"
}
}Возвращает общие статистические данные по основным сущностям организации: количество пользователей, проектов, материалов, поставщиков, контрактов и выполненных работ.
| organization_id | integer Example: organization_id=10 ID организации (если не указан, используется текущая организация пользователя) |
{- "success": true,
- "data": {
- "users_count": 25,
- "projects_count": 12,
- "materials_count": 345,
- "suppliers_count": 8,
- "contracts_count": 23,
- "completed_works_count": 156
}
}Возвращает данные временного ряда за последние 6 месяцев по выбранной метрике с разбивкой по месяцам.
| metric | string Default: "users" Enum: "users" "projects" "materials" "suppliers" "contracts" "completed_works" Example: metric=users Метрика для построения временного ряда |
| period | string Default: "month" Example: period=month Период группировки (пока поддерживается только month) |
| organization_id | integer Example: organization_id=10 ID организации |
{- "success": true,
- "data": {
- "labels": [
- "2024-07",
- "2024-08",
- "2024-09",
- "2024-10",
- "2024-11",
- "2024-12"
], - "values": [
- 3,
- 5,
- 2,
- 8,
- 4,
- 6
], - "metric": "users"
}
}Возвращает список топ-5 сущностей по выбранному критерию активности. Например, проекты с наибольшим количеством материалов.
| entity | string Default: "projects" Value: "projects" Example: entity=projects Тип сущности для анализа |
| period | string Default: "month" Example: period=month Период для анализа |
| organization_id | integer Example: organization_id=10 ID организации |
{- "success": true,
- "data": [
- {
- "id": 15,
- "name": "Жилой комплекс Солнечный",
- "materials_count": 45
}, - {
- "id": 23,
- "name": "Торговый центр Московский",
- "materials_count": 38
}
]
}Возвращает историю последних действий в системе (например, добавленные материалы).
| type | string Default: "materials" Value: "materials" Example: type=materials Тип истории для отображения |
| limit | integer [ 1 .. 50 ] Default: 10 Example: limit=10 Количество записей для отображения |
| organization_id | integer Example: organization_id=10 ID организации |
{- "success": true,
- "data": [
- {
- "id": 125,
- "name": "Кирпич керамический рядовой",
- "created_at": "2024-12-20T15:30:00Z"
}, - {
- "id": 124,
- "name": "Раствор цементный М150",
- "created_at": "2024-12-20T14:15:00Z"
}
]
}Возвращает информацию о лимитах текущей подписки организации и степени их заполнения.
| organization_id | integer Example: organization_id=10 ID организации |
{- "success": true,
- "data": {
- "max_users": 50,
- "current_users": 25,
- "max_projects": 20,
- "current_projects": 12
}
}Возвращает список контрактов, которые требуют внимания администратора:
Контракты отсортированы по приоритету (самые критичные первыми).
{- "success": true,
- "data": [
- {
- "id": 25,
- "number": "КТ-2024-0025",
- "project_name": "Жилой комплекс Солнечный",
- "contractor_name": "ООО СтройТех",
- "total_amount": 2500000,
- "completed_works_amount": 2350000,
- "completion_percentage": 94,
- "remaining_amount": 150000,
- "status": "active",
- "end_date": "2024-12-31",
- "is_nearing_limit": true,
- "is_overdue": false,
- "is_completed": false,
- "attention_reason": [
- "Приближение к лимиту (94%)"
], - "priority": 119
}
]
}Возвращает общую статистику по контрактам и выполненным работам организации: количество контрактов по статусам, суммы, статистику работ.
{- "success": true,
- "data": {
- "contracts": {
- "total": 23,
- "active": 18,
- "completed": 4,
- "draft": 1,
- "requiring_attention": 3,
- "total_amount": 45600000,
- "avg_amount": 1982608.7
}, - "completed_works": {
- "total": 156,
- "confirmed": 142,
- "confirmed_amount": 38450000
}
}
}Возвращает список топ контрактов организации, отсортированных по общей сумме в убывающем порядке.
| limit | integer [ 1 .. 20 ] Default: 5 Example: limit=5 Количество контрактов для отображения |
{- "success": true,
- "data": [
- {
- "id": 25,
- "number": "КТ-2024-0025",
- "project_name": "Жилой комплекс Солнечный",
- "contractor_name": "ООО СтройТех",
- "total_amount": 2500000,
- "completed_works_amount": 2350000,
- "completion_percentage": 94,
- "status": "active"
}
]
}Возвращает список последних выполненных работ за указанный период с информацией о проектах, контрактах, пользователях и суммах.
| days | integer [ 1 .. 365 ] Default: 30 Example: days=30 Количество дней для анализа активности |
{- "success": true,
- "data": [
- {
- "id": 342,
- "project_name": "Жилой комплекс Солнечный",
- "contract_number": "КТ-2024-0025",
- "work_type_name": "Кладка кирпичных стен",
- "user_name": "Иван Петров",
- "quantity": 25.5,
- "total_amount": 31875,
- "status": "confirmed",
- "completion_date": "2024-12-20",
- "created_at": "2024-12-20T15:30:00Z"
}
]
}Возвращает статистическую информацию по заявкам с сайта организации, включая заявки на персонал и другие типы запросов.
{- "success": true,
- "data": {
- "total_requests": 45,
- "pending_requests": 12,
- "processed_requests": 33,
- "personnel_requests": 8
}
}Возвращает реестр всех доступных виджетов дашборда с учетом ролей пользователя. Виджеты фильтруются по ролям пользователя в указанной организации.
| org_id | integer Example: org_id=10 ID организации (если не указан, используется текущая организация) |
{- "success": true,
- "data": {
- "version": 1,
- "widgets": [
- {
- "id": "contracts_statistics",
- "title": "Статистика контрактов",
- "description": "Общая статистика по контрактам организации",
- "component": "ContractsStatisticsWidget",
- "default_enabled": true,
- "default_size": {
- "xs": 12,
- "md": 6,
- "lg": 4
}, - "roles": [
- "admin",
- "manager"
]
}
]
}
}Возвращает персональные настройки дашборда для текущего пользователя в указанной организации. Настройки автоматически синхронизируются с реестром виджетов.
| org_id | integer Example: org_id=10 ID организации |
{- "success": true,
- "data": {
- "version": 1,
- "layout_mode": "simple",
- "items": [
- {
- "id": "contracts_statistics",
- "enabled": true,
- "order": 10,
- "size": {
- "xs": 12,
- "md": 6,
- "lg": 4
}
}
], - "updated_at": "2024-12-20T15:30:00Z"
}
}Сохраняет персональные настройки дашборда пользователя. Настройки валидируются против текущего реестра виджетов.
| org_id | integer Example: org_id=10 ID организации |
| version required | integer >= 1 Версия настроек (должна соответствовать текущей версии реестра) |
| layout_mode | string or null <= 50 characters Режим макета дашборда |
required | Array of objects <= 50 items Настройки виджетов (максимум 50 виджетов) |
{- "version": 1,
- "layout_mode": "simple",
- "items": [
- {
- "id": "contracts_statistics",
- "enabled": true,
- "order": 10,
- "size": {
- "xs": 12,
- "md": 6,
- "lg": 4
}
}, - {
- "id": "recent_activity",
- "enabled": true,
- "order": 20,
- "size": {
- "xs": 12,
- "md": 6,
- "lg": 8
}
}
]
}{- "success": true,
- "data": {
- "version": 1,
- "layout_mode": "simple",
- "items": [
- {
- "id": "contracts_statistics",
- "enabled": true,
- "order": 10
}
]
}
}Удаляет персональные настройки дашборда пользователя, возвращая к настройкам по умолчанию из реестра виджетов.
| org_id | integer Example: org_id=10 ID организации |
{- "success": true,
- "message": "reset"
}Возвращает настройки дашборда по умолчанию, построенные на основе реестра виджетов с учетом ролей пользователя в организации.
| org_id | integer Example: org_id=10 ID организации |
{- "success": true,
- "data": {
- "version": 1,
- "layout_mode": "simple",
- "items": [
- {
- "id": "contracts_statistics",
- "enabled": true,
- "order": 10,
- "size": {
- "xs": 12,
- "md": 6,
- "lg": 4
}
}
], - "updated_at": "2024-12-20T15:30:00Z"
}
}Возвращает пагинированный список приглашений подрядчиков для организации. Поддерживает фильтрацию по статусу и типу приглашений (отправленные/полученные).
| type | string Default: "sent" Enum: "sent" "received" Example: type=sent Тип приглашений (отправленные или полученные) |
| status | string Enum: "pending" "accepted" "declined" "expired" Example: status=pending Фильтр по статусу приглашения |
| date_from | string <date> Example: date_from=2024-01-01 Начальная дата фильтрации (включительно) |
| date_to | string <date> Example: date_to=2024-12-31 Конечная дата фильтрации (включительно) |
| per_page | integer [ 1 .. 50 ] Default: 15 Example: per_page=15 Количество записей на странице |
{- "success": true,
- "data": {
- "data": [
- {
- "id": 123,
- "status": "pending",
- "invitation_message": "Приглашаем к сотрудничеству",
- "expires_at": "2024-02-01T12:00:00Z",
- "created_at": "2024-01-25T10:00:00Z",
- "accepted_at": null,
- "is_expired": false,
- "can_be_accepted": true,
- "invited_organization": {
- "id": 456,
- "name": "Строительная компания",
- "legal_name": "ООО 'Строительная компания'",
- "city": "Москва",
- "is_verified": true
}
}
], - "meta": {
- "current_page": 1,
- "per_page": 15,
- "total": 1
}
}, - "meta": {
- "type": "sent",
- "filters": { }
}
}Отправляет приглашение указанной организации стать подрядчиком. Создается уникальный токен для принятия приглашения.
| invited_organization_id required | integer ID организации для приглашения |
| message | string or null <= 1000 characters Персональное сообщение приглашения |
object or null <= 10 properties Дополнительные метаданные приглашения |
{- "invited_organization_id": 456,
- "message": "Приглашаем к сотрудничеству в рамках строительных проектов",
- "metadata": {
- "source": "manual",
- "priority": "high"
}
}{- "success": true,
- "message": "Приглашение успешно отправлено",
- "data": {
- "id": 123,
- "status": "pending",
- "invitation_message": "Приглашаем к сотрудничеству в рамках строительных проектов",
- "expires_at": "2024-02-01T12:00:00Z",
- "created_at": "2024-01-25T10:00:00Z",
- "is_expired": false,
- "can_be_accepted": true,
- "invited_organization": {
- "id": 456,
- "name": "Строительная компания",
- "legal_name": "ООО 'Строительная компания'",
- "city": "Москва",
- "is_verified": true
}
}
}Возвращает агрегированную статистику по приглашениям подрядчиков для текущей организации.
{- "success": true,
- "data": {
- "sent": {
- "total": 25,
- "pending": 10,
- "accepted": 12,
- "declined": 2,
- "expired": 1
}, - "received": {
- "total": 8,
- "pending": 3,
- "accepted": 4,
- "declined": 1,
- "expired": 0
}
}
}Возвращает подробную информацию о конкретном приглашении подрядчика.
| id required | integer Example: 123 ID приглашения |
{- "success": true,
- "data": {
- "id": 123,
- "status": "pending",
- "invitation_message": "Приглашаем к сотрудничеству",
- "expires_at": "2024-02-01T12:00:00Z",
- "created_at": "2024-01-25T10:00:00Z",
- "accepted_at": null,
- "is_expired": false,
- "can_be_accepted": true,
- "organization": {
- "id": 789,
- "name": "Наша организация",
- "legal_name": "ООО 'Наша организация'",
- "city": "Москва",
- "is_verified": true
}, - "invited_organization": {
- "id": 456,
- "name": "Строительная компания",
- "legal_name": "ООО 'Строительная компания'",
- "city": "Москва",
- "is_verified": true
}, - "invited_by": {
- "id": 1,
- "name": "Иван Иванов",
- "email": "admin@company.com"
}
}
}Отменяет ранее отправленное приглашение подрядчика. Возможна отмена только приглашений в статусе "pending".
| id required | integer Example: 123 ID приглашения |
{- "success": true,
- "message": "Приглашение отменено",
- "data": {
- "id": 123,
- "status": "declined",
- "invitation_message": "Приглашаем к сотрудничеству",
- "expires_at": "2024-02-01T12:00:00Z",
- "created_at": "2024-01-25T10:00:00Z",
- "accepted_at": null,
- "is_expired": false,
- "can_be_accepted": false
}
}Поиск организаций в системе для отправки приглашений на сотрудничество. Поддерживает фильтрацию по различным критериям и исключение уже приглашенных.
| search | string <= 255 characters Example: search=Строительная Поисковый запрос по названию организации |
| city | string <= 100 characters Example: city=Москва Фильтр по городу |
| country | string <= 100 characters Example: country=Россия Фильтр по стране |
| verified | boolean Example: verified=true Фильтр по статусу верификации |
| exclude_invited | boolean Default: true Example: exclude_invited=true Исключить уже приглашенные организации |
| exclude_existing_contractors | boolean Default: true Example: exclude_existing_contractors=true Исключить организации, которые уже являются подрядчиками |
| sort_by | string Default: "relevance" Enum: "relevance" "name" "city" "connections" "verified" Example: sort_by=relevance Поле для сортировки результатов |
| per_page | integer [ 1 .. 50 ] Default: 20 Example: per_page=20 Количество результатов на странице |
{- "success": true,
- "data": {
- "data": [
- {
- "id": 456,
- "name": "Строительная компания Альфа",
- "legal_name": "ООО 'Строительная компания Альфа'",
- "city": "Москва",
- "country": "Россия",
- "is_verified": true,
- "connections_count": 15,
- "last_activity_at": "2024-01-20T15:30:00Z",
- "relevance_score": 85.5,
- "already_invited": false,
- "is_contractor": false
}, - {
- "id": 789,
- "name": "Строймонтаж Сервис",
- "legal_name": "ИП Строймонтаж Сервис",
- "city": "Санкт-Петербург",
- "country": "Россия",
- "is_verified": false,
- "connections_count": 8,
- "last_activity_at": "2024-01-15T09:15:00Z",
- "relevance_score": 72.3,
- "already_invited": false,
- "is_contractor": false
}
], - "meta": {
- "current_page": 1,
- "per_page": 20,
- "total": 2,
- "total_pages": 1,
- "has_next_page": false
}
}, - "meta": {
- "search_query": "Строительная",
- "filters_applied": {
- "verified": true,
- "exclude_invited": true
}, - "sort_by": "relevance"
}
}Возвращает список рекомендуемых организаций для приглашения на основе анализа деятельности и связей.
| limit | integer [ 1 .. 20 ] Default: 10 Example: limit=10 Максимальное количество предложений |
{- "success": true,
- "data": [
- {
- "id": 456,
- "name": "Строительная компания Альфа",
- "legal_name": "ООО 'Строительная компания Альфа'",
- "city": "Москва",
- "is_verified": true,
- "connections_count": 15,
- "suggestion_reason": "Активно работает в вашем регионе",
- "compatibility_score": 92.5
}, - {
- "id": 789,
- "name": "Проектно-строительная группа",
- "legal_name": "ООО 'ПСГ'",
- "city": "Москва",
- "is_verified": true,
- "connections_count": 23,
- "suggestion_reason": "Имеет опыт в похожих проектах",
- "compatibility_score": 87.3
}
]
}Возвращает персонализированные рекомендации организаций на основе истории взаимодействий и предпочтений пользователя.
| limit | integer [ 1 .. 15 ] Default: 8 Example: limit=8 Максимальное количество рекомендаций |
| category | string Enum: "similar_projects" "geographic" "industry_leaders" "new_market" Example: category=similar_projects Категория рекомендаций |
{- "success": true,
- "data": {
- "recommendations": [
- {
- "id": 456,
- "name": "Строительная компания Альфа",
- "legal_name": "ООО 'Строительная компания Альфа'",
- "city": "Москва",
- "is_verified": true,
- "connections_count": 15,
- "recommendation_type": "similar_projects",
- "confidence_score": 95.2,
- "match_reasons": [
- "Работает с аналогичными проектами",
- "Высокий рейтинг надежности",
- "Географическая близость"
]
}
], - "algorithm_version": "v2.1",
- "generated_at": "2024-01-25T10:30:00Z"
}
}Проверяет возможность отправки приглашения указанной организации. Проверяет существующие приглашения, статус подрядчика и другие ограничения.
| id required | integer Example: 456 ID организации |
{- "success": true,
- "data": {
- "organization_id": 456,
- "available_for_invitation": true,
- "status": "available",
- "existing_invitation": null,
- "existing_contractor": null,
- "message": "Организация доступна для отправки приглашения",
- "recommendations": [
- "Рекомендуется отправить персонализированное приглашение",
- "Укажите конкретные проекты для сотрудничества"
]
}
}Возвращает данные для построения фильтров на странице контрактов. Включает доступные статусы, типы контрактов, проекты и подрядчиков для текущей организации пользователя.
{- "success": true,
- "data": {
- "statuses": [
- {
- "value": "draft",
- "label": "Черновик"
}, - {
- "value": "active",
- "label": "Активный"
}, - {
- "value": "completed",
- "label": "Завершен"
}, - {
- "value": "on_hold",
- "label": "На паузе"
}, - {
- "value": "terminated",
- "label": "Расторгнут"
}
], - "types": [
- {
- "value": "contract",
- "label": "Контракт"
}, - {
- "value": "agreement",
- "label": "Соглашение"
}, - {
- "value": "specification",
- "label": "Спецификация"
}
], - "projects": [
- {
- "value": 25,
- "label": "Жилой комплекс Солнечный"
}, - {
- "value": 48,
- "label": "Офисный центр Премиум"
}, - {
- "value": 73,
- "label": "Реконструкция здания"
}
], - "contractors": [
- {
- "value": 12,
- "label": "ООО Стройсервис"
}, - {
- "value": 34,
- "label": "ИП Петров С.А."
}, - {
- "value": 56,
- "label": "ЗАО Профстрой"
}
]
}
}Возвращает данные для построения фильтров на странице выполненных работ. Включает доступные статусы работ, проекты, контракты, виды работ, пользователей (прорабов) и подрядчиков для текущей организации.
{- "success": true,
- "data": {
- "statuses": [
- {
- "value": "pending",
- "label": "Ожидает подтверждения"
}, - {
- "value": "confirmed",
- "label": "Подтверждено"
}, - {
- "value": "rejected",
- "label": "Отклонено"
}
], - "projects": [
- {
- "value": 25,
- "label": "Жилой комплекс Солнечный"
}, - {
- "value": 48,
- "label": "Офисный центр Премиум"
}
], - "contracts": [
- {
- "value": 87,
- "label": "КТР-2024-001 (Жилой комплекс Солнечный)"
}, - {
- "value": 102,
- "label": "КТР-2024-015 (Офисный центр Премиум)"
}
], - "work_types": [
- {
- "value": 15,
- "label": "Кирпичная кладка"
}, - {
- "value": 28,
- "label": "Штукатурные работы"
}, - {
- "value": 45,
- "label": "Электромонтажные работы"
}
], - "users": [
- {
- "value": 15,
- "label": "Иванов Иван Иванович"
}, - {
- "value": 28,
- "label": "Петров Петр Петрович"
}, - {
- "value": 42,
- "label": "Сидоров Сидор Сидорович"
}
], - "contractors": [
- {
- "value": 12,
- "label": "ООО Стройсервис"
}, - {
- "value": 34,
- "label": "ИП Петров С.А."
}
]
}
}Возвращает агрегированную статистику по контрактам и выполненным работам для отображения на дашборде и в быстрых фильтрах. Данные группируются по статусам с подсчетом количества и общих сумм.
{- "success": true,
- "data": {
- "contracts": {
- "draft": {
- "count": 5,
- "amount": 125000.5
}, - "active": {
- "count": 12,
- "amount": 1850000.75
}, - "completed": {
- "count": 8,
- "amount": 950000
}, - "on_hold": {
- "count": 2,
- "amount": 300000
}, - "terminated": {
- "count": 1,
- "amount": 75000
}
}, - "completed_works": {
- "pending": {
- "count": 15,
- "amount": 85000.25
}, - "confirmed": {
- "count": 48,
- "amount": 520000.8
}, - "rejected": {
- "count": 3,
- "amount": 12000
}
}
}
}Возвращает пагинированный список логов операций с материалами (приемка и списание) для текущей организации администратора. Поддерживает фильтрацию по проектам, материалам, пользователям, датам и типам операций.
| project_id | integer Example: project_id=25 Фильтр по проекту |
| material_id | integer Example: material_id=45 Фильтр по материалу |
| user_id | integer Example: user_id=15 Фильтр по пользователю (прорабу) |
| operation_type | string Enum: "receipt" "write_off" Example: operation_type=write_off Фильтр по типу операции |
| date_from | string <date> Example: date_from=2024-12-01 Фильтр по дате начала периода |
| date_to | string <date> Example: date_to=2024-12-31 Фильтр по дате окончания периода |
| per_page | integer [ 1 .. 100 ] Default: 15 Example: per_page=15 Количество записей на страницу |
| sort_by | string Default: "created_at" Example: sort_by=usage_date Поле для сортировки |
| sort_direction | string Default: "desc" Enum: "asc" "desc" Example: sort_direction=desc Направление сортировки |
{- "data": [
- {
- "id": 245,
- "organization_id": 10,
- "project_id": 25,
- "project_name": "Жилой комплекс Солнечный",
- "material_id": 45,
- "material_name": "Кирпич керамический рядовой",
- "user_id": 15,
- "user_name": "Иванов Иван Иванович",
- "operation_type": "write_off",
- "operation_type_readable": "Списание",
- "quantity": 150.5,
- "unit_symbol": "шт",
- "unit_price": 25.5,
- "total_price": 3837.75,
- "work_type_id": 28,
- "work_type_name": "Кирпичная кладка стен",
- "usage_date": "2024-12-20",
- "notes": "Материал использован для кладки несущих стен",
- "created_at": "2024-12-20T14:30:00Z"
}
], - "links": {
- "prev": null,
}, - "meta": {
- "current_page": 1,
- "per_page": 15,
- "total": 112
}
}Возвращает пагинированный список логов выполненных работ для текущей организации администратора. Поддерживает фильтрацию по проектам, видам работ, пользователям и датам выполнения.
| project_id | integer Example: project_id=25 Фильтр по проекту |
| work_type_id | integer Example: work_type_id=28 Фильтр по виду работ |
| user_id | integer Example: user_id=15 Фильтр по пользователю (прорабу) |
| date_from | string <date> Example: date_from=2024-12-01 Фильтр по дате начала периода выполнения |
| date_to | string <date> Example: date_to=2024-12-31 Фильтр по дате окончания периода выполнения |
| per_page | integer [ 1 .. 100 ] Default: 15 Example: per_page=15 Количество записей на страницу |
| sort_by | string Default: "created_at" Example: sort_by=completion_date Поле для сортировки |
| sort_direction | string Default: "desc" Enum: "asc" "desc" Example: sort_direction=desc Направление сортировки |
{- "data": [
- {
- "id": 185,
- "organization_id": 10,
- "project_id": 25,
- "project_name": "Жилой комплекс Солнечный",
- "work_type_id": 28,
- "work_type_name": "Кирпичная кладка стен",
- "user_id": 15,
- "user_name": "Иванов Иван Иванович",
- "quantity": 45.25,
- "unit_symbol": "м²",
- "unit_price": 850,
- "total_price": 38462.5,
- "completion_date": "2024-12-20",
- "performers_description": "Бригада каменщиков: Петров П.П., Сидоров С.С.",
- "notes": "Кладка выполнена согласно проекту",
- "created_at": "2024-12-20T16:45:00Z"
}
], - "links": {
- "prev": null,
}, - "meta": {
- "current_page": 1,
- "per_page": 15,
- "total": 89
}
}Возвращает полную информацию о профиле текущего аутентифицированного пользователя административной панели.
{- "success": true,
- "data": {
- "id": 15,
- "name": "Иванов Иван Иванович",
- "email": "ivanov@example.com",
- "phone": "+7 (999) 123-45-67",
- "position": "Главный прораб",
- "is_active": true,
- "current_organization_id": 10,
- "last_login_at": "2024-12-20T14:30:00Z",
- "created_at": "2024-01-15T09:00:00Z",
- "updated_at": "2024-12-20T16:45:00Z"
}
}Частично обновляет профиль текущего пользователя. Поддерживает обновление основных данных, смену пароля, загрузку/удаление аватара. При смене email сбрасывается статус верификации.
| name | string <= 255 characters Полное имя пользователя |
string <email> <= 255 characters Email адрес (должен быть уникальным, проверяется DNS) | |
| phone | string or null <= 20 characters Номер телефона |
| avatar | string <binary> Изображение аватара (JPEG, PNG, JPG, GIF до 2MB) |
| remove_avatar | boolean Флаг для удаления текущего аватара |
| password | string >= 8 characters Новый пароль (минимум 8 символов, требуется подтверждение) |
| password_confirmation | string Подтверждение нового пароля (должно совпадать с password) |
{ "name": "Иванов Иван Петрович", "phone": "+7 (999) 987-65-43", "position": "Старший прораб" }
{- "success": true,
- "message": "Профиль успешно обновлен.",
- "data": {
- "id": 15,
- "name": "Иванов Иван Петрович",
- "email": "ivan.ivanov@newcompany.com",
- "phone": "+7 (999) 987-65-43",
- "position": "Старший прораб",
- "is_active": true,
- "current_organization_id": 10,
- "last_login_at": "2024-12-20T14:30:00Z",
- "updated_at": "2024-12-20T17:15:00Z"
}
}Полностью обновляет профиль текущего пользователя. Функционал идентичен PATCH методу, предоставлен для совместимости с различными фронтенд-реализациями.
| name | string <= 255 characters Полное имя пользователя |
string <email> <= 255 characters Email адрес (должен быть уникальным, проверяется DNS) | |
| phone | string or null <= 20 characters Номер телефона |
| avatar | string <binary> Изображение аватара (JPEG, PNG, JPG, GIF до 2MB) |
| remove_avatar | boolean Флаг для удаления текущего аватара |
| password | string >= 8 characters Новый пароль (минимум 8 символов, требуется подтверждение) |
| password_confirmation | string Подтверждение нового пароля (должно совпадать с password) |
{- "success": true,
- "message": "Профиль успешно обновлен.",
- "data": {
- "id": 15,
- "name": "Иванов Иван Иванович",
- "email": "ivanov@example.com",
- "phone": "+7 (999) 123-45-67",
- "position": "Главный прораб",
- "is_active": true,
- "current_organization_id": 10,
- "last_login_at": "2024-12-20T14:30:00Z",
- "created_at": "2024-01-15T09:00:00Z",
- "updated_at": "2024-12-20T16:45:00Z"
}
}Альтернативный endpoint для получения данных профиля. Предоставлен для совместимости с фронтенд-приложениями. Функционал полностью идентичен GET /profile.
{- "success": true,
- "message": "Профиль успешно обновлен.",
- "data": {
- "id": 15,
- "name": "Иванов Иван Иванович",
- "email": "ivanov@example.com",
- "phone": "+7 (999) 123-45-67",
- "position": "Главный прораб",
- "is_active": true,
- "current_organization_id": 10,
- "last_login_at": "2024-12-20T14:30:00Z",
- "created_at": "2024-01-15T09:00:00Z",
- "updated_at": "2024-12-20T16:45:00Z"
}
}Альтернативный endpoint для обновления профиля (PATCH). Предоставлен для совместимости с фронтенд-приложениями. Функционал полностью идентичен PATCH /profile.
| name | string <= 255 characters Полное имя пользователя |
string <email> <= 255 characters Email адрес (должен быть уникальным, проверяется DNS) | |
| phone | string or null <= 20 characters Номер телефона |
| avatar | string <binary> Изображение аватара (JPEG, PNG, JPG, GIF до 2MB) |
| remove_avatar | boolean Флаг для удаления текущего аватара |
| password | string >= 8 characters Новый пароль (минимум 8 символов, требуется подтверждение) |
| password_confirmation | string Подтверждение нового пароля (должно совпадать с password) |
{- "success": true,
- "message": "Профиль успешно обновлен.",
- "data": {
- "id": 15,
- "name": "Иванов Иван Иванович",
- "email": "ivanov@example.com",
- "phone": "+7 (999) 123-45-67",
- "position": "Главный прораб",
- "is_active": true,
- "current_organization_id": 10,
- "last_login_at": "2024-12-20T14:30:00Z",
- "created_at": "2024-01-15T09:00:00Z",
- "updated_at": "2024-12-20T16:45:00Z"
}
}Альтернативный endpoint для обновления профиля (PUT). Предоставлен для совместимости с фронтенд-приложениями. Функционал полностью идентичен PUT /profile.
| name | string <= 255 characters Полное имя пользователя |
string <email> <= 255 characters Email адрес (должен быть уникальным, проверяется DNS) | |
| phone | string or null <= 20 characters Номер телефона |
| avatar | string <binary> Изображение аватара (JPEG, PNG, JPG, GIF до 2MB) |
| remove_avatar | boolean Флаг для удаления текущего аватара |
| password | string >= 8 characters Новый пароль (минимум 8 символов, требуется подтверждение) |
| password_confirmation | string Подтверждение нового пароля (должно совпадать с password) |
{- "success": true,
- "message": "Профиль успешно обновлен.",
- "data": {
- "id": 15,
- "name": "Иванов Иван Иванович",
- "email": "ivanov@example.com",
- "phone": "+7 (999) 123-45-67",
- "position": "Главный прораб",
- "is_active": true,
- "current_organization_id": 10,
- "last_login_at": "2024-12-20T14:30:00Z",
- "created_at": "2024-01-15T09:00:00Z",
- "updated_at": "2024-12-20T16:45:00Z"
}
}Возвращает пагинированный список шаблонов отчетов для текущей организации. Поддерживает пагинацию с настраиваемым размером страницы.
| per_page | integer [ 1 .. 100 ] Default: 15 Example: per_page=15 Количество элементов на странице |
| page | integer >= 1 Default: 1 Example: page=1 Номер страницы |
{- "data": [
- {
- "id": 15,
- "name": "Детальный отчет по материалам",
- "report_type": "material_usage",
- "organization_id": 10,
- "user_id": 25,
- "columns_config": [
- {
- "header": "Название материала",
- "data_key": "material.name",
- "order": 1,
- "format_options": null
}, - {
- "header": "Количество",
- "data_key": "quantity",
- "order": 2,
- "format_options": {
- "number_format": "decimal"
}
}
], - "is_default": true,
- "created_at": "2024-01-15T09:00:00Z",
- "updated_at": "2024-12-20T16:45:00Z"
}, - {
- "id": 16,
- "name": "Стандартный отчет по работам",
- "report_type": "work_completion",
- "organization_id": 10,
- "user_id": 25,
- "columns_config": [
- {
- "header": "Тип работы",
- "data_key": "work_type.name",
- "order": 1,
- "format_options": null
}
], - "is_default": false,
- "created_at": "2024-02-10T10:00:00Z",
- "updated_at": "2024-02-10T10:00:00Z"
}
], - "links": {
- "prev": null,
}, - "meta": {
- "current_page": 1,
- "from": 1,
- "last_page": 2,
- "per_page": 15,
- "to": 15,
- "total": 18
}
}Создает новый шаблон отчета для текущей организации. Автоматически устанавливает organization_id и user_id из контекста. При установке is_default=true автоматически сбрасывает флаг у других шаблонов этого типа.
| name required | string <= 255 characters Название шаблона отчета |
| report_type required | string Enum: "material_usage" "work_completion" "foreman_activity" "project_status_summary" Тип отчета для которого создается шаблон:
|
required | Array of objects non-empty Конфигурация колонок для отчета (массив объектов с настройками колонок) |
| is_default | boolean Установить ли данный шаблон как шаблон по умолчанию для типа отчета |
{- "name": "Детальный отчет по расходу материалов",
- "report_type": "material_usage",
- "columns_config": [
- {
- "header": "Название материала",
- "data_key": "material.name",
- "order": 1,
- "format_options": null
}, - {
- "header": "Количество",
- "data_key": "quantity",
- "order": 2,
- "format_options": {
- "number_format": "decimal"
}
}, - {
- "header": "Единица измерения",
- "data_key": "material.unit",
- "order": 3,
- "format_options": null
}, - {
- "header": "Стоимость",
- "data_key": "total_cost",
- "order": 4,
- "format_options": {
- "number_format": "currency",
- "currency": "RUB"
}
}
], - "is_default": true
}{- "id": 20,
- "name": "Детальный отчет по расходу материалов",
- "report_type": "material_usage",
- "organization_id": 10,
- "user_id": 25,
- "columns_config": [
- {
- "header": "Название материала",
- "data_key": "material.name",
- "order": 1,
- "format_options": null
}, - {
- "header": "Количество",
- "data_key": "quantity",
- "order": 2,
- "format_options": {
- "number_format": "decimal"
}
}
], - "is_default": true,
- "created_at": "2024-12-20T17:30:00Z",
- "updated_at": "2024-12-20T17:30:00Z"
}Возвращает подробную информацию о конкретном шаблоне отчета. Доступны только шаблоны текущей организации.
| template_id required | integer Example: 15 ID шаблона отчета |
{- "id": 15,
- "name": "Детальный отчет по материалам",
- "report_type": "material_usage",
- "organization_id": 10,
- "user_id": 25,
- "columns_config": [
- {
- "header": "Название материала",
- "data_key": "material.name",
- "order": 1,
- "format_options": null
}, - {
- "header": "Количество",
- "data_key": "quantity",
- "order": 2,
- "format_options": {
- "number_format": "decimal"
}
}
], - "is_default": true,
- "created_at": "2024-01-15T09:00:00Z",
- "updated_at": "2024-12-20T16:45:00Z"
}Полностью обновляет шаблон отчета. Доступны только шаблоны текущей организации. При установке is_default=true автоматически сбрасывает флаг у других шаблонов этого типа.
| template_id required | integer Example: 15 ID шаблона отчета |
| name | string <= 255 characters Название шаблона отчета |
| report_type | string Enum: "material_usage" "work_completion" "foreman_activity" "project_status_summary" Тип отчета для которого создается шаблон:
|
Array of objects non-empty Конфигурация колонок для отчета (массив объектов с настройками колонок) | |
| is_default | boolean Установить ли данный шаблон как шаблон по умолчанию для типа отчета |
{- "name": "Обновленный детальный отчет по материалам",
- "columns_config": [
- {
- "header": "Название материала",
- "data_key": "material.name",
- "order": 1,
- "format_options": null
}, - {
- "header": "Код материала",
- "data_key": "material.code",
- "order": 2,
- "format_options": null
}, - {
- "header": "Количество",
- "data_key": "quantity",
- "order": 3,
- "format_options": {
- "number_format": "decimal"
}
}
], - "is_default": true
}{- "id": 15,
- "name": "Детальный отчет по материалам",
- "report_type": "material_usage",
- "organization_id": 10,
- "user_id": 25,
- "columns_config": [
- {
- "header": "Название материала",
- "data_key": "material.name",
- "order": 1,
- "format_options": null
}, - {
- "header": "Количество",
- "data_key": "quantity",
- "order": 2,
- "format_options": {
- "number_format": "decimal"
}
}, - {
- "header": "Стоимость",
- "data_key": "total_cost",
- "order": 3,
- "format_options": {
- "number_format": "currency",
- "currency": "RUB"
}
}
], - "is_default": true,
- "created_at": "2024-01-15T09:00:00Z",
- "updated_at": "2024-12-20T16:45:00Z"
}Частично обновляет шаблон отчета. Доступны только шаблоны текущей организации. Функционал идентичен PUT методу. При установке is_default=true автоматически сбрасывает флаг у других шаблонов этого типа.
| template_id required | integer Example: 15 ID шаблона отчета |
| name | string <= 255 characters Название шаблона отчета |
| report_type | string Enum: "material_usage" "work_completion" "foreman_activity" "project_status_summary" Тип отчета для которого создается шаблон:
|
Array of objects non-empty Конфигурация колонок для отчета (массив объектов с настройками колонок) | |
| is_default | boolean Установить ли данный шаблон как шаблон по умолчанию для типа отчета |
{- "name": "Обновленный шаблон отчета по материалам",
- "report_type": "material_usage",
- "columns_config": [
- {
- "header": "Обновленное название материала",
- "data_key": "material.name",
- "order": 1,
- "format_options": null
}, - {
- "header": "Новая колонка - Единица измерения",
- "data_key": "material.unit",
- "order": 2,
- "format_options": null
}, - {
- "header": "Количество",
- "data_key": "quantity",
- "order": 3,
- "format_options": {
- "number_format": "decimal"
}
}
], - "is_default": true
}{- "id": 15,
- "name": "Детальный отчет по материалам",
- "report_type": "material_usage",
- "organization_id": 10,
- "user_id": 25,
- "columns_config": [
- {
- "header": "Название материала",
- "data_key": "material.name",
- "order": 1,
- "format_options": null
}, - {
- "header": "Количество",
- "data_key": "quantity",
- "order": 2,
- "format_options": {
- "number_format": "decimal"
}
}, - {
- "header": "Стоимость",
- "data_key": "total_cost",
- "order": 3,
- "format_options": {
- "number_format": "currency",
- "currency": "RUB"
}
}
], - "is_default": true,
- "created_at": "2024-01-15T09:00:00Z",
- "updated_at": "2024-12-20T16:45:00Z"
}Удаляет шаблон отчета (soft delete). Доступны только шаблоны текущей организации. Удаленный шаблон перестает отображаться в списках, но данные сохраняются в БД.
| template_id required | integer Example: 15 ID шаблона отчета |
{- "success": true,
- "message": "Шаблон отчета успешно удален."
}Устанавливает указанный шаблон как шаблон по умолчанию для его типа отчета. Автоматически сбрасывает флаг is_default у других шаблонов того же типа в организации. Доступны только шаблоны текущей организации.
| template_id required | integer Example: 15 ID шаблона отчета |
{- "id": 15,
- "name": "Детальный отчет по материалам",
- "report_type": "material_usage",
- "organization_id": 10,
- "user_id": 25,
- "columns_config": [
- {
- "header": "Название материала",
- "data_key": "material.name",
- "order": 1,
- "format_options": null
}
], - "is_default": true,
- "created_at": "2024-01-15T09:00:00Z",
- "updated_at": "2024-12-20T17:45:00Z"
}Генерирует отчет по расходу материалов на объектах с возможностью фильтрации по проекту, материалу, пользователю и периоду. Поддерживает экспорт в CSV/XLSX и использование пользовательских шаблонов для настройки колонок.
Требования: Доступ к модулю "basic_reports"
| project_id | integer Example: project_id=25 ID проекта для фильтрации |
| material_id | integer Example: material_id=150 ID материала для фильтрации |
| user_id | integer Example: user_id=35 ID прораба для фильтрации |
| date_from | string <date> Example: date_from=2024-01-01 Дата начала периода |
| date_to | string <date> Example: date_to=2024-12-31 Дата окончания периода |
| template_id | integer Example: template_id=15 ID шаблона отчета для кастомизации колонок |
| format | string Default: "json" Enum: "json" "csv" "xlsx" Example: format=json Формат вывода отчета |
| per_page | integer [ 1 .. 100 ] Default: 15 Количество элементов на странице (только для JSON) |
| sort_by | string Default: "usage_date" Поле для сортировки |
| sort_direction | string Default: "desc" Enum: "asc" "desc" Направление сортировки |
{- "title": "Отчет по расходу материалов",
- "filters": {
- "project_id": 25,
- "date_from": "2024-01-01T00:00:00.000000Z",
- "date_to": "2024-12-31T23:59:59.000000Z"
}, - "data": [
- {
- "material_name": "Цемент М400",
- "total_quantity": 125.5,
- "total_amount": 15687.5,
- "operations_count": 8,
- "unit_name": "тонна"
}, - {
- "material_name": "Песок строительный",
- "total_quantity": 450,
- "total_amount": 22500,
- "operations_count": 12,
- "unit_name": "кубометр"
}
], - "pagination": {
- "total": 156,
- "per_page": 15,
- "current_page": 1,
- "last_page": 11
}, - "generated_at": "2024-12-20T18:30:00Z"
}Генерирует отчет по выполненным работам с возможностью фильтрации по проекту, виду работ, пользователю и периоду. Поддерживает экспорт в CSV/XLSX и использование пользовательских шаблонов.
Требования: Доступ к модулю "basic_reports"
| project_id | integer ID проекта для фильтрации |
| work_type_id | integer ID вида работ для фильтрации |
| user_id | integer ID прораба для фильтрации |
| date_from | string <date> Дата начала периода |
| date_to | string <date> Дата окончания периода |
| template_id | integer ID шаблона отчета |
| format | string Default: "json" Enum: "json" "csv" "xlsx" Формат вывода отчета |
| per_page | integer [ 1 .. 100 ] Default: 15 Количество элементов на странице |
{- "title": "Отчет по расходу материалов",
- "filters": {
- "project_id": 25,
- "date_from": "2024-01-01T00:00:00.000000Z",
- "date_to": "2024-12-31T23:59:59.000000Z",
- "material_id": 150
}, - "data": [
- {
- "material_name": "Цемент М400",
- "total_quantity": 125.5,
- "total_amount": 15687.5,
- "operations_count": 8
}, - {
- "material_name": "Песок строительный",
- "total_quantity": 450,
- "total_amount": 22500,
- "operations_count": 12
}
], - "pagination": {
- "total": 156,
- "per_page": 15,
- "current_page": 1,
- "last_page": 11
}, - "generated_at": "2024-12-20T18:30:00Z"
}Генерирует детальный отчет по активности прорабов с анализом выполненных работ, времени работы и эффективности. Включает метрики производительности.
Требования: Доступ к модулю "advanced_reports"
| project_id | integer ID проекта для фильтрации |
| user_id | integer ID конкретного пользователя |
| date_from | string <date> Дата начала периода |
| date_to | string <date> Дата окончания периода |
| template_id | integer ID шаблона отчета |
| format | string Default: "json" Enum: "json" "csv" "xlsx" Формат вывода отчета |
{- "title": "Отчет по расходу материалов",
- "filters": {
- "project_id": 25,
- "date_from": "2024-01-01T00:00:00.000000Z",
- "date_to": "2024-12-31T23:59:59.000000Z",
- "material_id": 150
}, - "data": [
- {
- "material_name": "Цемент М400",
- "total_quantity": 125.5,
- "total_amount": 15687.5,
- "operations_count": 8
}, - {
- "material_name": "Песок строительный",
- "total_quantity": 450,
- "total_amount": 22500,
- "operations_count": 12
}
], - "pagination": {
- "total": 156,
- "per_page": 15,
- "current_page": 1,
- "last_page": 11
}, - "generated_at": "2024-12-20T18:30:00Z"
}Генерирует сводный отчет по статусам проектов организации с возможностью фильтрации по статусу и архивности. Показывает общую статистику по проектам.
Требования: Доступ к модулю "basic_reports"
| status | string Enum: "active" "completed" "planned" "on_hold" Фильтр по статусу проектов |
| is_archived | boolean Включать ли архивные проекты |
| template_id | integer ID шаблона отчета |
| format | string Default: "json" Enum: "json" "csv" "xlsx" Формат вывода отчета |
{- "title": "Отчет по расходу материалов",
- "filters": {
- "project_id": 25,
- "date_from": "2024-01-01T00:00:00.000000Z",
- "date_to": "2024-12-31T23:59:59.000000Z",
- "material_id": 150
}, - "data": [
- {
- "material_name": "Цемент М400",
- "total_quantity": 125.5,
- "total_amount": 15687.5,
- "operations_count": 8
}, - {
- "material_name": "Песок строительный",
- "total_quantity": 450,
- "total_amount": 22500,
- "operations_count": 12
}
], - "pagination": {
- "total": 156,
- "per_page": 15,
- "current_page": 1,
- "last_page": 11
}, - "generated_at": "2024-12-20T18:30:00Z"
}Генерирует официальный отчет об использовании материалов, переданных заказчиком, с детальной отчетностью по документообороту и фотофиксации. Подходит для предоставления заказчикам и контролирующим органам.
Требования: Доступ к модулю "advanced_reports"
| project_id required | integer ID проекта (обязательный параметр) |
| date_from required | string <date> Дата начала периода (обязательный параметр) |
| date_to required | string <date> Дата окончания периода (обязательный параметр) |
| report_number | integer >= 1 Номер отчета |
| material_id | integer ID материала для фильтрации |
| material_name | string Название материала для поиска |
| operation_type | string Enum: "receipt" "write_off" Тип операции с материалом |
| supplier_id | integer ID поставщика |
| work_type_id | integer ID вида работ |
| user_id | integer ID пользователя |
| has_photo | boolean Фильтр по наличию фотодокументации |
| min_quantity | number >= 0 Минимальное количество |
| max_quantity | number >= 0 Максимальное количество |
| format | string Default: "json" Enum: "json" "xlsx" "csv" Формат вывода отчета |
{- "title": "Отчет по расходу материалов",
- "filters": {
- "project_id": 25,
- "date_from": "2024-01-01T00:00:00.000000Z",
- "date_to": "2024-12-31T23:59:59.000000Z",
- "material_id": 150
}, - "data": [
- {
- "material_name": "Цемент М400",
- "total_quantity": 125.5,
- "total_amount": 15687.5,
- "operations_count": 8
}, - {
- "material_name": "Песок строительный",
- "total_quantity": 450,
- "total_amount": 22500,
- "operations_count": 12
}
], - "pagination": {
- "total": 156,
- "per_page": 15,
- "current_page": 1,
- "last_page": 11
}, - "generated_at": "2024-12-20T18:30:00Z"
}Получить сводный отчет по всем подрядчикам для выбранного проекта с итоговыми суммами контрактов, выполненных работ и платежей
| project_id required | integer <int64> ID проекта для отчета |
| date_from | string <date> Дата начала периода (для фильтрации выполненных работ и платежей) |
| date_to | string <date> Дата окончания периода (для фильтрации выполненных работ и платежей) |
| contractor_ids | Array of integers <int64> [ items <int64 > ] Массив ID подрядчиков для фильтрации |
| contract_status | string Enum: "active" "completed" "cancelled" "draft" Статус контрактов для фильтрации |
| include_completed_works | boolean Default: true Включать ли данные о выполненных работах |
| include_payments | boolean Default: true Включать ли данные о платежах |
| include_materials | boolean Default: false Включать ли данные о материалах |
| sort_by | string Default: "total_amount" Enum: "contractor_name" "total_amount" "completed_amount" "payment_amount" Поле для сортировки |
| sort_direction | string Default: "desc" Enum: "asc" "desc" Направление сортировки |
| export_format | string Default: "json" Enum: "json" "csv" "excel" Формат экспорта отчета |
{- "title": "Отчет по подрядчикам",
- "project": {
- "id": 1,
- "name": "Строительство жилого комплекса",
- "address": "г. Москва, ул. Примерная, д. 1"
}, - "period": {
- "from": "2024-01-01",
- "to": "2024-12-31"
}, - "filters": {
- "contract_status": "active",
- "contractor_ids": [
- 0
], - "include_completed_works": true,
- "include_payments": true,
- "include_materials": false
}, - "summary": {
- "total_contractors": 5,
- "total_contract_amount": 15000000,
- "total_completed_amount": 12000000,
- "total_payment_amount": 10000000,
- "total_remaining_amount": 5000000
}, - "contractors": [
- {
- "contractor_id": 1,
- "contractor_name": "ООО Строительная компания",
- "contact_person": "Иванов Иван Иванович",
- "phone": "+7 (495) 123-45-67",
- "email": "info@stroyka.ru",
- "contractor_type": "manual",
- "contracts_count": 2,
- "total_contract_amount": 5000000,
- "total_completed_amount": 4000000,
- "total_payment_amount": 3500000,
- "remaining_to_complete": 1000000,
- "remaining_amount": 1500000,
- "completion_percentage": 80,
- "payment_percentage": 70
}
], - "generated_at": "2024-01-15T10:30:00Z"
}Получить детальный отчет по конкретному подрядчику в рамках проекта с разбивкой по контрактам, выполненным работам и платежам
| contractorId required | integer <int64> ID подрядчика |
| project_id required | integer <int64> ID проекта для отчета |
| date_from | string <date> Дата начала периода |
| date_to | string <date> Дата окончания периода |
| export_format | string Default: "json" Enum: "json" "csv" "excel" Формат экспорта отчета |
{- "title": "Детальный отчет по подрядчику",
- "contractor": {
- "id": 1,
- "name": "ООО Строительная компания",
- "contact_person": "Иванов Иван Иванович",
- "phone": "+7 (495) 123-45-67",
- "email": "info@stroyka.ru",
- "contractor_type": "manual"
}, - "project": {
- "id": 1,
- "name": "Строительство жилого комплекса",
- "address": "г. Москва, ул. Примерная, д. 1"
}, - "period": {
- "from": "2024-01-01",
- "to": "2024-12-31"
}, - "summary": {
- "total_contracts": 2,
- "total_contract_amount": 5000000,
- "total_completed_amount": 4000000,
- "total_payment_amount": 3500000
}, - "contracts": [
- {
- "contract_id": 1,
- "contract_number": "Д-001/2024",
- "contract_date": "2024-01-15",
- "status": "active",
- "total_amount": 2500000,
- "completed_amount": 2000000,
- "payment_amount": 1750000,
- "remaining_amount": 750000,
- "completion_percentage": 80,
- "payment_percentage": 70,
- "completed_works": [
- {
- "id": 1,
- "work_type": "Кладочные работы",
- "quantity": 100.5,
- "price": 1500,
- "total_amount": 150750,
- "completion_date": "2024-01-20",
- "notes": "Работы выполнены в срок"
}
], - "payments": [
- {
- "id": 1,
- "amount": 875000,
- "payment_date": "2024-01-25",
- "payment_type": "advance",
- "notes": "Авансовый платеж"
}
]
}
], - "generated_at": "2024-01-15T10:30:00Z"
}Возвращает список всех кастомных отчетов текущей организации. Пользователь видит свои отчеты и общие отчеты организации (is_shared=true).
Требования: Доступ к модулю "advanced-reports"
| category | string Enum: "core" "finances" "materials" "works" "staff" Example: category=finances Фильтр по категории отчета |
| is_favorite | boolean Example: is_favorite=true Только избранные отчеты |
| is_shared | boolean Только общие отчеты организации |
| per_page | integer [ 1 .. 100 ] Default: 15 Количество элементов на странице |
| page | integer >= 1 Default: 1 Номер страницы |
{- "success": true,
- "data": [
- {
- "id": 5,
- "name": "Финансы по проектам",
- "description": "Суммы контрактов по каждому проекту",
- "organization_id": 1,
- "user_id": 3,
- "report_category": "finances",
- "data_sources": {
- "primary": "projects",
- "joins": [
- {
- "table": "contracts",
- "type": "left",
- "on": [
- "projects.id",
- "contracts.project_id"
]
}
]
}, - "query_config": {
- "where": [
- {
- "field": "projects.status",
- "operator": "=",
- "value": "active"
}
], - "where_logic": "and"
}, - "columns_config": [
- {
- "field": "projects.name",
- "label": "Название проекта",
- "order": 1,
- "format": "text",
- "aggregation": "sum"
}
], - "filters_config": [
- {
- "field": "projects.status",
- "label": "Статус проекта",
- "type": "select",
- "options": [
- "active",
- "completed",
- "on_hold"
], - "required": false,
- "default": null
}
], - "aggregations_config": {
- "group_by": [
- "projects.id",
- "projects.name"
], - "aggregations": [
- {
- "field": "contracts.total_amount",
- "function": "sum",
- "alias": "total_amount"
}
], - "having": [
- {
- "field": "total_amount",
- "operator": ">",
- "value": 100000
}
]
}, - "sorting_config": [
- {
- "field": "total_amount",
- "direction": "desc"
}
], - "visualization_config": {
- "enabled": true,
- "chart_type": "bar",
- "x_axis": "projects.name",
- "y_axis": "total_amount",
- "colors": [
- "#3b82f6",
- "#10b981"
]
}, - "is_shared": true,
- "is_favorite": true,
- "is_scheduled": true,
- "execution_count": 45,
- "last_executed_at": "2025-10-03T10:30:00.000000Z",
- "created_at": "2025-09-01T08:00:00.000000Z",
- "updated_at": "2025-10-03T10:30:00.000000Z",
- "user": {
- "id": 1,
- "name": "Иван Петров",
- "email": "user@prohelper.com",
- "role": "foreman",
- "created_at": "2024-01-15T10:30:00Z"
}
}
], - "meta": {
- "current_page": 1,
- "per_page": 15,
- "total": 42,
- "last_page": 3
}
}Создает новый кастомный отчет с заданной конфигурацией. Перед созданием автоматически валидируется конфигурация.
Требования: Доступ к модулю "advanced-reports"
| name required | string <= 255 characters Название отчета (обязательное) |
| description | string or null <= 1000 characters Описание отчета (опционально) |
| report_category required | string Enum: "core" "finances" "materials" "works" "staff" Категория отчета (обязательное) |
required | object Конфигурация источников данных (обязательное) |
object or null Конфигурация WHERE условий (опционально) | |
required | Array of objects non-empty Конфигурация колонок отчета (обязательное, минимум 1) |
Array of objects or null Конфигурация пользовательских фильтров (опционально) | |
object or null Конфигурация агрегаций (опционально) | |
Array of objects or null Конфигурация сортировки (опционально) | |
object or null Конфигурация визуализации (опционально) | |
| is_shared | boolean or null Default: false Сделать ли отчет общим для организации |
{- "name": "Финансы по проектам",
- "description": "Суммы контрактов по каждому проекту",
- "report_category": "finances",
- "data_sources": {
- "primary": "projects",
- "joins": [
- {
- "table": "contracts",
- "type": "left",
- "on": [
- "projects.id",
- "contracts.project_id"
]
}
]
}, - "query_config": {
- "where": [
- {
- "field": "projects.status",
- "operator": "=",
- "value": "active"
}
], - "where_logic": "and"
}, - "columns_config": [
- {
- "field": "projects.name",
- "label": "Название проекта",
- "order": 1,
- "format": "text",
- "aggregation": "sum"
}
], - "filters_config": [
- {
- "field": "projects.status",
- "label": "Статус проекта",
- "type": "select",
- "options": [
- "active",
- "completed",
- "on_hold"
], - "required": false,
- "default": null
}
], - "aggregations_config": {
- "group_by": [
- "projects.id",
- "projects.name"
], - "aggregations": [
- {
- "field": "contracts.total_amount",
- "function": "sum",
- "alias": "total_amount"
}
], - "having": [
- {
- "field": "string",
- "operator": "string",
- "value": "string"
}
]
}, - "sorting_config": [
- {
- "field": "created_at",
- "direction": "desc"
}
], - "visualization_config": {
- "enabled": true,
- "chart_type": "bar",
- "x_axis": "projects.name",
- "y_axis": "total_amount",
- "colors": [
- "#3b82f6",
- "#10b981"
]
}, - "is_shared": false
}{- "success": true,
- "message": "Отчет успешно создан",
- "data": {
- "id": 5,
- "name": "Финансы по проектам",
- "description": "Суммы контрактов по каждому проекту",
- "organization_id": 1,
- "user_id": 3,
- "report_category": "finances",
- "data_sources": {
- "primary": "projects",
- "joins": [
- {
- "table": "contracts",
- "type": "left",
- "on": [
- "projects.id",
- "contracts.project_id"
]
}
]
}, - "query_config": {
- "where": [
- {
- "field": "projects.status",
- "operator": "=",
- "value": "active"
}
], - "where_logic": "and"
}, - "columns_config": [
- {
- "field": "projects.name",
- "label": "Название проекта",
- "order": 1,
- "format": "text",
- "aggregation": "sum"
}
], - "filters_config": [
- {
- "field": "projects.status",
- "label": "Статус проекта",
- "type": "select",
- "options": [
- "active",
- "completed",
- "on_hold"
], - "required": false,
- "default": null
}
], - "aggregations_config": {
- "group_by": [
- "projects.id",
- "projects.name"
], - "aggregations": [
- {
- "field": "contracts.total_amount",
- "function": "sum",
- "alias": "total_amount"
}
], - "having": [
- {
- "field": "total_amount",
- "operator": ">",
- "value": 100000
}
]
}, - "sorting_config": [
- {
- "field": "total_amount",
- "direction": "desc"
}
], - "visualization_config": {
- "enabled": true,
- "chart_type": "bar",
- "x_axis": "projects.name",
- "y_axis": "total_amount",
- "colors": [
- "#3b82f6",
- "#10b981"
]
}, - "is_shared": true,
- "is_favorite": true,
- "is_scheduled": true,
- "execution_count": 45,
- "last_executed_at": "2025-10-03T10:30:00.000000Z",
- "created_at": "2025-09-01T08:00:00.000000Z",
- "updated_at": "2025-10-03T10:30:00.000000Z",
- "user": {
- "id": 1,
- "name": "Иван Петров",
- "email": "user@prohelper.com",
- "role": "foreman",
- "created_at": "2024-01-15T10:30:00Z"
}
}
}Возвращает полную информацию о кастомном отчете включая конфигурацию и последние 10 выполнений.
Требования: Доступ к модулю "advanced-reports"
| id required | integer Example: 5 ID отчета |
{- "success": true,
- "data": {
- "id": 5,
- "name": "Финансы по проектам",
- "description": "Суммы контрактов по каждому проекту",
- "organization_id": 1,
- "user_id": 3,
- "report_category": "finances",
- "data_sources": {
- "primary": "projects",
- "joins": [
- {
- "table": "contracts",
- "type": "left",
- "on": [
- "projects.id",
- "contracts.project_id"
]
}
]
}, - "query_config": {
- "where": [
- {
- "field": "projects.status",
- "operator": "=",
- "value": "active"
}
], - "where_logic": "and"
}, - "columns_config": [
- {
- "field": "projects.name",
- "label": "Название проекта",
- "order": 1,
- "format": "text",
- "aggregation": "sum"
}
], - "filters_config": [
- {
- "field": "projects.status",
- "label": "Статус проекта",
- "type": "select",
- "options": [
- "active",
- "completed",
- "on_hold"
], - "required": false,
- "default": null
}
], - "aggregations_config": {
- "group_by": [
- "projects.id",
- "projects.name"
], - "aggregations": [
- {
- "field": "contracts.total_amount",
- "function": "sum",
- "alias": "total_amount"
}
], - "having": [
- {
- "field": "total_amount",
- "operator": ">",
- "value": 100000
}
]
}, - "sorting_config": [
- {
- "field": "total_amount",
- "direction": "desc"
}
], - "visualization_config": {
- "enabled": true,
- "chart_type": "bar",
- "x_axis": "projects.name",
- "y_axis": "total_amount",
- "colors": [
- "#3b82f6",
- "#10b981"
]
}, - "is_shared": true,
- "is_favorite": true,
- "is_scheduled": true,
- "execution_count": 45,
- "last_executed_at": "2025-10-03T10:30:00.000000Z",
- "created_at": "2025-09-01T08:00:00.000000Z",
- "updated_at": "2025-10-03T10:30:00.000000Z",
- "user": {
- "id": 1,
- "name": "Иван Петров",
- "email": "user@prohelper.com",
- "role": "foreman",
- "created_at": "2024-01-15T10:30:00Z"
}, - "executions": [
- {
- "id": 125,
- "custom_report_id": 5,
- "user_id": 3,
- "organization_id": 1,
- "applied_filters": {
- "projects.status": "active",
- "projects.start_date": {
- "from": "2024-01-01",
- "to": "2024-12-31"
}
}, - "execution_time_ms": 89,
- "result_rows_count": 24,
- "export_format": null,
- "export_file_id": null,
- "status": "completed",
- "error_message": null,
- "created_at": "2025-10-03T12:30:00.000000Z",
- "completed_at": "2025-10-03T12:30:00.000000Z",
- "user": {
- "id": 1,
- "name": "Иван Петров",
- "email": "user@prohelper.com",
- "role": "foreman",
- "created_at": "2024-01-15T10:30:00Z"
}
}
]
}
}Обновляет конфигурацию существующего кастомного отчета. Редактировать можно только свои отчеты.
Требования: Доступ к модулю "advanced-reports"
| id required | integer Example: 5 ID отчета |
| name | string <= 255 characters Название отчета |
| description | string or null <= 1000 characters Описание отчета |
| report_category | string Enum: "core" "finances" "materials" "works" "staff" Категория отчета |
object Конфигурация источников данных | |
object or null Конфигурация WHERE условий | |
Array of objects non-empty Конфигурация колонок | |
| filters_config | Array of objects or null Конфигурация пользовательских фильтров |
| aggregations_config | object or null Конфигурация агрегаций |
| sorting_config | Array of objects or null Конфигурация сортировки |
| visualization_config | object or null Конфигурация визуализации |
| is_shared | boolean or null Сделать ли отчет общим для организации |
{- "name": "Финансы по проектам (обновлено)",
- "description": "Обновленное описание",
- "report_category": "finances",
- "data_sources": {
- "primary": "projects",
- "joins": [
- {
- "table": "string",
- "type": "left",
- "on": [
- "string",
- "string"
]
}
]
}, - "query_config": {
- "where": [
- { }
], - "where_logic": "and"
}, - "columns_config": [
- {
- "field": "string",
- "label": "string",
- "order": 0,
- "format": "string",
- "aggregation": "string"
}
], - "filters_config": [
- { }
], - "aggregations_config": { },
- "sorting_config": [
- { }
], - "visualization_config": { },
- "is_shared": true
}{- "success": true,
- "message": "Отчет успешно создан",
- "data": {
- "id": 5,
- "name": "Финансы по проектам",
- "description": "Суммы контрактов по каждому проекту",
- "organization_id": 1,
- "user_id": 3,
- "report_category": "finances",
- "data_sources": {
- "primary": "projects",
- "joins": [
- {
- "table": "contracts",
- "type": "left",
- "on": [
- "projects.id",
- "contracts.project_id"
]
}
]
}, - "query_config": {
- "where": [
- {
- "field": "projects.status",
- "operator": "=",
- "value": "active"
}
], - "where_logic": "and"
}, - "columns_config": [
- {
- "field": "projects.name",
- "label": "Название проекта",
- "order": 1,
- "format": "text",
- "aggregation": "sum"
}
], - "filters_config": [
- {
- "field": "projects.status",
- "label": "Статус проекта",
- "type": "select",
- "options": [
- "active",
- "completed",
- "on_hold"
], - "required": false,
- "default": null
}
], - "aggregations_config": {
- "group_by": [
- "projects.id",
- "projects.name"
], - "aggregations": [
- {
- "field": "contracts.total_amount",
- "function": "sum",
- "alias": "total_amount"
}
], - "having": [
- {
- "field": "total_amount",
- "operator": ">",
- "value": 100000
}
]
}, - "sorting_config": [
- {
- "field": "total_amount",
- "direction": "desc"
}
], - "visualization_config": {
- "enabled": true,
- "chart_type": "bar",
- "x_axis": "projects.name",
- "y_axis": "total_amount",
- "colors": [
- "#3b82f6",
- "#10b981"
]
}, - "is_shared": true,
- "is_favorite": true,
- "is_scheduled": true,
- "execution_count": 45,
- "last_executed_at": "2025-10-03T10:30:00.000000Z",
- "created_at": "2025-09-01T08:00:00.000000Z",
- "updated_at": "2025-10-03T10:30:00.000000Z",
- "user": {
- "id": 1,
- "name": "Иван Петров",
- "email": "user@prohelper.com",
- "role": "foreman",
- "created_at": "2024-01-15T10:30:00Z"
}
}
}Удаляет кастомный отчет (soft delete). Удалять можно только свои отчеты.
Требования: Доступ к модулю "advanced-reports"
| id required | integer Example: 5 ID отчета |
{- "success": true,
- "message": "Отчет успешно удален"
}Создает копию существующего отчета с возможностью изменить название. Клонировать можно как свои, так и общие отчеты организации.
Требования: Доступ к модулю "advanced-reports"
| id required | integer Example: 5 ID отчета для клонирования |
| name | string Новое название отчета (опционально) |
{- "name": "Копия отчета - Финансы по проектам"
}{- "success": true,
- "message": "Отчет успешно создан",
- "data": {
- "id": 5,
- "name": "Финансы по проектам",
- "description": "Суммы контрактов по каждому проекту",
- "organization_id": 1,
- "user_id": 3,
- "report_category": "finances",
- "data_sources": {
- "primary": "projects",
- "joins": [
- {
- "table": "contracts",
- "type": "left",
- "on": [
- "projects.id",
- "contracts.project_id"
]
}
]
}, - "query_config": {
- "where": [
- {
- "field": "projects.status",
- "operator": "=",
- "value": "active"
}
], - "where_logic": "and"
}, - "columns_config": [
- {
- "field": "projects.name",
- "label": "Название проекта",
- "order": 1,
- "format": "text",
- "aggregation": "sum"
}
], - "filters_config": [
- {
- "field": "projects.status",
- "label": "Статус проекта",
- "type": "select",
- "options": [
- "active",
- "completed",
- "on_hold"
], - "required": false,
- "default": null
}
], - "aggregations_config": {
- "group_by": [
- "projects.id",
- "projects.name"
], - "aggregations": [
- {
- "field": "contracts.total_amount",
- "function": "sum",
- "alias": "total_amount"
}
], - "having": [
- {
- "field": "total_amount",
- "operator": ">",
- "value": 100000
}
]
}, - "sorting_config": [
- {
- "field": "total_amount",
- "direction": "desc"
}
], - "visualization_config": {
- "enabled": true,
- "chart_type": "bar",
- "x_axis": "projects.name",
- "y_axis": "total_amount",
- "colors": [
- "#3b82f6",
- "#10b981"
]
}, - "is_shared": true,
- "is_favorite": true,
- "is_scheduled": true,
- "execution_count": 45,
- "last_executed_at": "2025-10-03T10:30:00.000000Z",
- "created_at": "2025-09-01T08:00:00.000000Z",
- "updated_at": "2025-10-03T10:30:00.000000Z",
- "user": {
- "id": 1,
- "name": "Иван Петров",
- "email": "user@prohelper.com",
- "role": "foreman",
- "created_at": "2024-01-15T10:30:00Z"
}
}
}Переключает статус отчета в избранном. Изменять статус избранного можно только для своих отчетов.
Требования: Доступ к модулю "advanced-reports"
| id required | integer Example: 5 ID отчета |
{- "success": true,
- "data": {
- "is_favorite": true
}
}Выполняет кастомный отчет с применением фильтров. Поддерживает экспорт в различные форматы (CSV, Excel, PDF).
Требования: Доступ к модулю "advanced-reports"
| id required | integer Example: 5 ID отчета |
| export | string Enum: "csv" "excel" "pdf" Example: export=excel Формат экспорта (если указан, возвращает файл) |
object or null Применяемые пользователем фильтры | |
| limit | integer or null [ 1 .. 10000 ] Лимит строк результата (максимум 10000) |
{- "filters": {
- "projects.status": "active",
- "projects.start_date": {
- "from": "2024-01-01",
- "to": "2024-12-31"
}
}, - "limit": 100
}{- "success": true,
- "data": {
- "execution_id": 125,
- "columns": [
- {
- "field": "name",
- "label": "Название проекта",
- "format": "text"
}
], - "rows": [
- {
- "name": "Проект А",
- "budget_amount": "1500000.00",
- "start_date": "2024-03-15"
}
], - "total_rows": 24,
- "execution_time_ms": 89,
- "applied_filters": {
- "projects.status": "active",
- "projects.start_date": {
- "from": "2024-01-01",
- "to": "2024-12-31"
}
}
}
}Возвращает историю выполнений отчета с информацией о статусе, примененных фильтрах и времени выполнения.
Требования: Доступ к модулю "advanced-reports"
| id required | integer Example: 5 ID отчета |
| limit | integer [ 1 .. 100 ] Default: 50 Количество записей в истории |
{- "success": true,
- "data": [
- {
- "id": 125,
- "custom_report_id": 5,
- "user_id": 3,
- "organization_id": 1,
- "applied_filters": {
- "projects.status": "active",
- "projects.start_date": {
- "from": "2024-01-01",
- "to": "2024-12-31"
}
}, - "execution_time_ms": 89,
- "result_rows_count": 24,
- "export_format": null,
- "export_file_id": null,
- "status": "completed",
- "error_message": null,
- "created_at": "2025-10-03T12:30:00.000000Z",
- "completed_at": "2025-10-03T12:30:00.000000Z",
- "user": {
- "id": 1,
- "name": "Иван Петров",
- "email": "user@prohelper.com",
- "role": "foreman",
- "created_at": "2024-01-15T10:30:00Z"
}
}
]
}Возвращает список всех доступных источников данных для построения отчетов. Источники данных - это таблицы БД (projects, contracts, materials и т.д.).
Требования: Доступ к модулю "advanced-reports"
{- "success": true,
- "data": [
- {
- "key": "projects",
- "label": "Проекты",
- "category": "core",
- "table": "projects"
}
]
}Возвращает список доступных полей для указанного источника данных с информацией о типе, возможности фильтрации, сортировки и агрегации.
Требования: Доступ к модулю "advanced-reports"
| dataSource required | string Example: projects Ключ источника данных (например, "projects", "contracts") |
{- "success": true,
- "data": [
- {
- "key": "id",
- "label": "ID",
- "type": "integer",
- "filterable": true,
- "sortable": true,
- "aggregatable": false,
- "format": "currency"
}
]
}Возвращает доступные связи (для JOIN'ов) для указанного источника данных. Связи описывают отношения между таблицами.
Требования: Доступ к модулю "advanced-reports"
| dataSource required | string Example: projects Ключ источника данных |
{- "success": true,
- "data": [
- {
- "name": "contracts",
- "label": "Контракты",
- "type": "hasMany",
- "related_source": "contracts",
- "foreign_key": "project_id",
- "local_key": "id"
}
]
}Возвращает список всех доступных операторов для построения фильтров (равно, больше, меньше, содержит и т.д.).
Требования: Доступ к модулю "advanced-reports"
{- "success": true,
- "data": [
- {
- "key": "=",
- "label": "Равно"
}
]
}Возвращает список всех доступных агрегатных функций (SUM, AVG, COUNT, MIN, MAX, COUNT DISTINCT).
Требования: Доступ к модулю "advanced-reports"
{- "success": true,
- "data": [
- {
- "key": "sum",
- "label": "Сумма"
}
]
}Возвращает список категорий для классификации отчетов (основные, финансы, материалы, работы, персонал).
Требования: Доступ к модулю "advanced-reports"
{- "success": true,
- "data": [
- {
- "key": "core",
- "label": "Основные"
}
]
}Проверяет корректность конфигурации отчета перед сохранением. Валидирует источники данных, поля, операторы и структуру.
Требования: Доступ к модулю "advanced-reports"
object Конфигурация источников данных | |
| query_config | object or null Конфигурация WHERE условий |
| columns_config | Array of objects Конфигурация колонок |
| aggregations_config | object or null Конфигурация агрегаций |
| sorting_config | Array of arrays or null or null Конфигурация сортировки |
{- "data_sources": {
- "primary": "projects",
- "joins": [
- { }
]
}, - "query_config": { },
- "columns_config": [
- { }
], - "aggregations_config": { },
- "sorting_config": [ ]
}{- "success": true,
- "message": "Конфигурация валидна"
}Выполняет тестовый запрос с конфигурацией отчета и возвращает первые 20 строк результата для предпросмотра.
Требования: Доступ к модулю "advanced-reports"
object | |
Array of objects non-empty | |
object or null | |
| filters | object or null Дополнительные фильтры для предпросмотра |
{- "data_sources": {
- "primary": "projects",
- "joins": [
- { }
]
}, - "columns_config": [
- {
- "field": "projects.name",
- "label": "Название",
- "order": 1,
- "format": "text"
}
], - "query_config": {
- "where": [
- { }
]
}, - "filters": {
- "projects.status": "active"
}
}{- "success": true,
- "data": {
- "columns": [
- {
- "field": "name",
- "label": "Название",
- "format": "text"
}
], - "rows": [
- {
- "name": "Проект А",
- "budget_amount": "1500000.00"
}
], - "preview": true,
- "total_rows": 3,
- "execution_time_ms": 45
}
}Возвращает все расписания автоматической генерации и отправки для указанного отчета.
Требования: Доступ к модулю "advanced-reports"
| id required | integer Example: 5 ID отчета |
{- "success": true,
- "data": [
- {
- "id": 10,
- "custom_report_id": 5,
- "organization_id": 1,
- "user_id": 3,
- "schedule_type": "daily",
- "schedule_config": {
- "time": "09:00",
- "day_of_week": 1,
- "day_of_month": 1
}, - "filters_preset": {
- "projects.status": "active"
}, - "recipient_emails": [
- "manager@example.com",
- "director@example.com"
], - "export_format": "excel",
- "is_active": true,
- "last_run_at": "2025-10-03T09:00:00.000000Z",
- "next_run_at": "2025-10-04T09:00:00.000000Z",
- "last_execution_id": 124,
- "created_at": "2025-09-01T10:00:00.000000Z",
- "updated_at": "2025-10-03T10:00:00.000000Z"
}
]
}Создает новое расписание автоматической генерации и отправки отчета. Поддерживает ежедневную, еженедельную и ежемесячную отправку.
Требования: Доступ к модулю "advanced-reports"
| id required | integer Example: 5 ID отчета |
| schedule_type required | string Enum: "daily" "weekly" "monthly" Тип расписания (обязательное) |
required | object Конфигурация расписания (обязательное) |
| filters_preset | object or null Предустановленные фильтры для автозапуска |
| recipient_emails required | Array of strings <email> non-empty Список email для отправки (обязательное, минимум 1) |
| export_format required | string Enum: "csv" "excel" "pdf" Формат экспорта (обязательное) |
{- "schedule_type": "daily",
- "schedule_config": {
- "time": "09:00",
- "day_of_week": 1,
- "day_of_month": 1
}, - "filters_preset": {
- "projects.status": "active"
}, - "recipient_emails": [
- "manager@example.com",
- "director@example.com"
], - "export_format": "excel"
}{- "success": true,
- "message": "Расписание успешно создано",
- "data": {
- "id": 10,
- "custom_report_id": 5,
- "organization_id": 1,
- "user_id": 3,
- "schedule_type": "daily",
- "schedule_config": {
- "time": "09:00",
- "day_of_week": 1,
- "day_of_month": 1
}, - "filters_preset": {
- "projects.status": "active"
}, - "recipient_emails": [
- "manager@example.com",
- "director@example.com"
], - "export_format": "excel",
- "is_active": true,
- "last_run_at": "2025-10-03T09:00:00.000000Z",
- "next_run_at": "2025-10-04T09:00:00.000000Z",
- "last_execution_id": 124,
- "created_at": "2025-09-01T10:00:00.000000Z",
- "updated_at": "2025-10-03T10:00:00.000000Z"
}
}Возвращает детальную информацию о расписании отчета.
Требования: Доступ к модулю "advanced-reports"
| id required | integer Example: 5 ID отчета |
| scheduleId required | integer Example: 10 ID расписания |
{- "success": true,
- "data": {
- "id": 10,
- "custom_report_id": 5,
- "organization_id": 1,
- "user_id": 3,
- "schedule_type": "daily",
- "schedule_config": {
- "time": "09:00",
- "day_of_week": 1,
- "day_of_month": 1
}, - "filters_preset": {
- "projects.status": "active"
}, - "recipient_emails": [
- "manager@example.com",
- "director@example.com"
], - "export_format": "excel",
- "is_active": true,
- "last_run_at": "2025-10-03T09:00:00.000000Z",
- "next_run_at": "2025-10-04T09:00:00.000000Z",
- "last_execution_id": 124,
- "created_at": "2025-09-01T10:00:00.000000Z",
- "updated_at": "2025-10-03T10:00:00.000000Z"
}
}Обновляет конфигурацию расписания отчета.
Требования: Доступ к модулю "advanced-reports"
| id required | integer Example: 5 ID отчета |
| scheduleId required | integer Example: 10 ID расписания |
| schedule_type | string Enum: "daily" "weekly" "monthly" Тип расписания |
object Конфигурация расписания | |
| filters_preset | object or null Предустановленные фильтры |
| recipient_emails | Array of strings <email> non-empty Список email для отправки |
| export_format | string Enum: "csv" "excel" "pdf" Формат экспорта |
| is_active | boolean Активировать/деактивировать расписание |
{- "schedule_type": "weekly",
- "schedule_config": {
- "time": "10:00",
- "day_of_week": 1,
- "day_of_month": 1
}, - "filters_preset": { },
- "recipient_emails": [
- "new@example.com"
], - "export_format": "pdf",
- "is_active": true
}{- "success": true,
- "message": "Расписание успешно создано",
- "data": {
- "id": 10,
- "custom_report_id": 5,
- "organization_id": 1,
- "user_id": 3,
- "schedule_type": "daily",
- "schedule_config": {
- "time": "09:00",
- "day_of_week": 1,
- "day_of_month": 1
}, - "filters_preset": {
- "projects.status": "active"
}, - "recipient_emails": [
- "manager@example.com",
- "director@example.com"
], - "export_format": "excel",
- "is_active": true,
- "last_run_at": "2025-10-03T09:00:00.000000Z",
- "next_run_at": "2025-10-04T09:00:00.000000Z",
- "last_execution_id": 124,
- "created_at": "2025-09-01T10:00:00.000000Z",
- "updated_at": "2025-10-03T10:00:00.000000Z"
}
}Удаляет расписание отчета.
Требования: Доступ к модулю "advanced-reports"
| id required | integer Example: 5 ID отчета |
| scheduleId required | integer Example: 10 ID расписания |
{- "success": true,
- "message": "Расписание успешно удалено"
}Переключает активность расписания отчета.
Требования: Доступ к модулю "advanced-reports"
| id required | integer Example: 5 ID отчета |
| scheduleId required | integer Example: 10 ID расписания |
{- "success": true,
- "message": "Расписание отключено",
- "data": {
- "is_active": false
}
}Принудительно запускает выполнение отчета и отправку на email без ожидания следующего времени по расписанию.
Требования: Доступ к модулю "advanced-reports"
| id required | integer Example: 5 ID отчета |
| scheduleId required | integer Example: 10 ID расписания |
{- "success": true,
- "message": "Отчет выполнен и отправлен",
- "data": {
- "execution_id": 126,
- "sent_to": [
- "manager@example.com",
- "director@example.com"
], - "execution_time_ms": 95
}
}Возвращает пагинированный список прорабов текущей организации. Поддерживает фильтрацию по имени и статусу активности, а также сортировку.
Обрабатывается: UserManagementController::index Метод сервиса: UserService::getForemenForCurrentOrg Требует прав: admin.users.view
| per_page | integer [ 1 .. 100 ] Default: 15 Example: per_page=20 Количество элементов на странице |
| name | string <= 255 characters Example: name=Иван Фильтр по имени прораба (поиск по подстроке) |
| is_active | boolean Example: is_active=true Фильтр по статусу активности |
| sort_by | string Default: "created_at" Enum: "created_at" "updated_at" "name" "email" Example: sort_by=name Поле для сортировки |
| sort_direction | string Default: "desc" Enum: "asc" "desc" Example: sort_direction=asc Направление сортировки |
{- "data": [
- {
- "id": 15,
- "name": "Иван Петров",
- "email": "foreman@prohelper.com",
- "phone": "+79001234567",
- "position": "Прораб общих строительных работ",
- "avatar_path": "avatars/foreman_15.jpg",
- "is_active": true,
- "createdAt": "2024-01-15T10:30:00.000000Z",
- "updatedAt": "2024-01-20T14:45:00.000000Z"
}
], - "links": {
}, - "meta": {
- "current_page": 2,
- "from": 16,
- "last_page": 10,
- "per_page": 15,
- "to": 30,
- "total": 147
}
}Создает нового прораба для текущей организации. Если пользователь с таким email уже существует, то он будет добавлен в организацию с ролью foreman. Поддерживает загрузку аватара.
Обрабатывается: UserManagementController::store Метод сервиса: UserService::createForeman Требует прав: admin.users.create Миддлвары: subscription.limit:max_users
| name required | string <= 255 characters Полное имя нового прораба |
| email required | string <email> <= 255 characters Уникальный email адрес (проверяется unique:users,email) |
| password required | string <password> Пароль (используется Password::defaults() - мин 8 симв, смешанные регистры, символы) |
| password_confirmation required | string <password> Подтверждение пароля (должно совпадать с password) |
| phone | string or null^\+?[0-9\s\-\(\)]{7,20}$ Контактный номер телефона (опционально, regex pattern) |
| position | string or null <= 255 characters Должность или специализация прораба (опционально) |
| avatar | string or null <binary> Файл аватара прораба (изображение JPEG, PNG, JPG, макс 2MB) |
{ "name": "Александр Сидоров", "email": "alexander.sidorov@prohelper.com", "password": "SecurePass123!", "password_confirmation": "SecurePass123!", "phone": "+7 (900) 123-45-67", "position": "Прораб строительных работ", "avatar": "(binary file)" }
{- "id": 15,
- "name": "Александр Сидоров",
- "email": "alexander.sidorov@prohelper.com",
- "phone": "+7 (900) 123-45-67",
- "position": "Прораб строительных работ",
- "avatar_path": "avatars/foreman_15.jpg",
- "is_active": true,
- "createdAt": "2024-01-15T10:30:00.000000Z",
- "updatedAt": "2024-01-20T14:45:00.000000Z"
}Возвращает детальную информацию о конкретном прорабе в рамках текущей организации. Проверяет, что пользователь действительно является прорабом в этой организации.
Обрабатывается: UserManagementController::show Метод сервиса: UserService::findForemanById Требует прав: admin.users.view
| id required | integer >= 1 Example: 15 Уникальный идентификатор прораба |
{- "id": 15,
- "name": "Александр Сидоров",
- "email": "alexander.sidorov@prohelper.com",
- "phone": "+7 (900) 123-45-67",
- "position": "Прораб строительных работ",
- "avatar_path": "avatars/foreman_15.jpg",
- "is_active": true,
- "createdAt": "2024-01-15T10:30:00.000000Z",
- "updatedAt": "2024-01-20T14:45:00.000000Z"
}| id required | integer |
| name | string <= 255 characters Обновленное полное имя прораба (правило валидации sometimes|required) |
| password | string or null <password> Новый пароль (опционально, используется Password defaults + confirmed) |
| password_confirmation | string or null <password> Подтверждение нового пароля (обязательно если password указан) |
| phone | string or null^\+?[0-9\s\-\(\)]{7,20}$ Обновленный номер телефона (правило sometimes|nullable|regex) |
| position | string or null <= 255 characters Обновленная должность (правило sometimes|nullable) |
| avatar | string or null <binary> Новый файл аватара (sometimes|nullable|file|mimetypes image/jpeg,png,jpg|max 2048) |
| remove_avatar | boolean Default: false Удалить текущий аватар (правило sometimes|boolean) |
{ "name": "Иван Иванов", "password": "Password123!", "password_confirmation": "Password123!", "phone": "+79998887766", "position": "Прораб", "avatar": "(binary)", "remove_avatar": false }
{- "id": 15,
- "name": "Александр Сидоров",
- "email": "alexander.sidorov@prohelper.com",
- "phone": "+7 (900) 123-45-67",
- "position": "Прораб строительных работ",
- "avatar_path": "avatars/foreman_15.jpg",
- "is_active": true,
- "createdAt": "2024-01-15T10:30:00.000000Z",
- "updatedAt": "2024-01-20T14:45:00.000000Z"
}| id required | integer |
| name | string <= 255 characters Обновленное полное имя прораба (правило валидации sometimes|required) |
| password | string or null <password> Новый пароль (опционально, используется Password defaults + confirmed) |
| password_confirmation | string or null <password> Подтверждение нового пароля (обязательно если password указан) |
| phone | string or null^\+?[0-9\s\-\(\)]{7,20}$ Обновленный номер телефона (правило sometimes|nullable|regex) |
| position | string or null <= 255 characters Обновленная должность (правило sometimes|nullable) |
| avatar | string or null <binary> Новый файл аватара (sometimes|nullable|file|mimetypes image/jpeg,png,jpg|max 2048) |
| remove_avatar | boolean Default: false Удалить текущий аватар (правило sometimes|boolean) |
{ "phone": "+79998887766", "position": "Старший прораб", "avatar": "(binary)" }
{- "id": 15,
- "name": "Александр Сидоров",
- "email": "alexander.sidorov@prohelper.com",
- "phone": "+7 (900) 123-45-67",
- "position": "Прораб строительных работ",
- "avatar_path": "avatars/foreman_15.jpg",
- "is_active": true,
- "createdAt": "2024-01-15T10:30:00.000000Z",
- "updatedAt": "2024-01-20T14:45:00.000000Z"
}{- "success": true,
- "message": "string",
- "data": {
- "user_id": 0,
- "name": "string",
- "current_balance": 0,
- "total_issued": 0,
- "total_reported": 0,
- "has_overdue_balance": true,
- "last_transaction_at": "string"
}
}{- "success": true,
- "message": "string",
- "data": [
- {
- "id": 125,
- "user_id": 25,
- "organization_id": 10,
- "project_id": 8,
- "type": "issue",
- "amount": 15000,
- "description": "Закупка материалов для строительства",
- "document_number": "АВ-001234",
- "document_date": "2024-12-20",
- "balance_after": 27500,
- "reporting_status": "pending",
- "reported_at": "2024-12-21T14:30:00Z",
- "approved_at": "2024-12-22T09:15:00Z",
- "created_by_user_id": 12,
- "approved_by_user_id": 12,
- "external_code": "1C_DOC_12345",
- "accounting_data": {
- "account_code": "71.01",
- "cost_center": "ЦФО-001"
}, - "attachment_ids": "15,16,17",
- "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T10:00:00Z",
- "user": {
- "id": 25,
- "name": "Иванов И.И."
}, - "project": {
- "id": 8,
- "name": "ЖК Солнечный",
- "external_code": "PRJ-001"
}, - "created_by": {
- "id": 12,
- "name": "Администратор А.А."
}, - "approved_by": {
- "id": 12,
- "name": "Администратор А.А."
}
}
]
}| id required | integer |
| amount required | number <float> |
| project_id | integer or null |
| description | string or null |
| document_number | string or null |
| document_date | string or null <date> |
{- "amount": 0,
- "project_id": 0,
- "description": "string",
- "document_number": "string",
- "document_date": "2019-08-24"
}{- "success": true,
- "message": "string",
- "data": { }
}| id required | integer |
| amount required | number <float> |
| project_id | integer or null |
| description | string or null |
| document_number | string or null |
| document_date | string or null <date> |
{- "amount": 0,
- "project_id": 0,
- "description": "string",
- "document_number": "string",
- "document_date": "2019-08-24"
}{- "success": true,
- "message": "string",
- "data": { }
}Возвращает пагинированный список поставщиков организации с возможностью фильтрации и сортировки.
| name | string Example: name=СтройМат Фильтр по названию поставщика (поиск по подстроке) |
| is_active | boolean Example: is_active=true Фильтр по активности поставщика |
| sort_by | string Default: "name" Enum: "name" "created_at" "updated_at" Example: sort_by=name Поле для сортировки |
| sort_direction | string Default: "asc" Enum: "asc" "desc" Example: sort_direction=asc Направление сортировки |
| per_page | integer [ 1 .. 100 ] Default: 15 Example: per_page=15 Количество записей на страницу |
{- "data": [
- {
- "id": 15,
- "name": "ООО СтройМатериалы",
- "contactPerson": "Иванов Иван Иванович",
- "phone": "+7 (495) 123-45-67",
- "email": "info@stroymat.ru",
- "isActive": true,
- "organizationId": 10
}
], - "links": {
- "prev": null,
}, - "meta": {
- "current_page": 1,
- "per_page": 15,
- "total": 68
}
}Создает нового поставщика для организации с проверкой уникальности названия в рамках организации.
| name required | string <= 255 characters Название поставщика (уникальное в рамках организации) |
| contact_person | string or null <= 255 characters Контактное лицо |
| phone | string or null <= 50 characters Контактный телефон |
string or null <email> <= 255 characters Контактный email | |
| address | string or null <= 1000 characters Адрес поставщика |
| is_active | boolean Default: true Активность поставщика |
{- "name": "ООО СтройМатериалы",
- "contact_person": "Иванов Иван Иванович",
- "phone": "+7 (495) 123-45-67",
- "email": "info@stroymat.ru",
- "address": "г. Москва, ул. Стройтельная, д. 15"
}{- "data": {
- "id": 15,
- "name": "ООО СтройМатериалы",
- "contactPerson": "Иванов Иван Иванович",
- "phone": "+7 (495) 123-45-67",
- "email": "info@stroymat.ru",
- "address": "г. Москва, ул. Стройтельная, д. 15",
- "isActive": true,
- "organizationId": 10,
- "createdAt": "2024-12-20 10:00:00",
- "updatedAt": "2024-12-20 10:00:00"
}
}Возвращает полную информацию о поставщике с проверкой принадлежности к организации.
| id required | integer Example: 15 ID поставщика |
{- "data": {
- "id": 15,
- "name": "ООО СтройМатериалы",
- "code": "SUP-001",
- "contactPerson": "Иванов Иван Иванович",
- "phone": "+7 (495) 123-45-67",
- "email": "info@stroymat.ru",
- "address": "г. Москва, ул. Стройтельная, д. 15",
- "tax_number": "7701234567",
- "description": "Крупный поставщик строительных материалов",
- "isActive": true,
- "additional_info": {
- "specialization": "ceramics",
- "rating": 4.5
}, - "organizationId": 10,
- "createdAt": "2024-12-20 10:00:00",
- "updatedAt": "2024-12-20 15:30:00"
}
}Обновляет поставщика с проверками:
| id required | integer Example: 15 ID поставщика для обновления |
| name | string <= 255 characters Название поставщика (уникальное в рамках организации, игнорирует текущую запись) |
| contact_person | string or null <= 255 characters Контактное лицо |
| phone | string or null <= 50 characters Контактный телефон |
string or null <email> <= 255 characters Контактный email | |
| address | string or null <= 1000 characters Адрес поставщика |
| is_active | boolean Активность поставщика |
{- "phone": "+7 (495) 987-65-43",
- "email": "new-email@stroymat.ru"
}{- "data": {
- "id": 15,
- "name": "ООО СтройМатериалы Плюс",
- "contactPerson": "Петров Петр Петрович",
- "phone": "+7 (495) 987-65-43",
- "email": "contact@stroymat-plus.ru",
- "isActive": false
}
}Удаляет поставщика с проверками:
| id required | integer Example: 15 ID поставщика для удаления |
{- "message": "This action is unauthorized."
}Возвращает пагинированный список записей времени для текущей организации. Поддерживает фильтрацию по пользователю, проекту, статусу и дате.
Возможные статусы записей:
draft - черновикsubmitted - отправлено на утверждениеapproved - утвержденоrejected - отклонено| user_id | integer Example: user_id=15 Фильтр по пользователю |
| project_id | integer Example: project_id=8 Фильтр по проекту |
| status | string Enum: "draft" "submitted" "approved" "rejected" Example: status=approved Фильтр по статусу |
| start_date | string <date> Example: start_date=2024-01-01 Дата начала периода (включительно) |
| end_date | string <date> Example: end_date=2024-01-31 Дата окончания периода (включительно) |
| billable | boolean Example: billable=true Фильтр по оплачиваемости времени |
| per_page | integer [ 1 .. 100 ] Default: 15 Example: per_page=20 Количество записей на страницу |
{- "success": true,
- "data": [
- {
- "id": 123,
- "organization_id": 5,
- "user_id": 15,
- "project_id": 8,
- "work_type_id": 3,
- "task_id": 45,
- "work_date": "2024-01-15",
- "start_time": "09:00:00",
- "end_time": "17:30:00",
- "hours_worked": 8.5,
- "break_time": 1,
- "title": "Разработка модуля авторизации",
- "description": "Реализованы методы входа через email и телефон, добавлена двухфакторная аутентификация",
- "status": "approved",
- "approved_by_user_id": 12,
- "approved_at": "2024-01-16T10:30:00Z",
- "rejection_reason": "Неточное описание выполненной работы",
- "is_billable": true,
- "hourly_rate": 1500,
- "location": "Офис, переговорная комната 2",
- "custom_fields": {
- "equipment_used": "Laptop Dell, Монитор Samsung",
- "weather_conditions": "sunny"
}, - "notes": "Потребовалось больше времени из-за изменений в требованиях",
- "created_at": "2024-01-15T09:00:00Z",
- "updated_at": "2024-01-15T18:00:00Z",
- "total_cost": 12750,
- "is_active_timer": false,
- "duration_formatted": "8ч 30м",
- "user": {
- "id": 15,
- "name": "Иванов Иван Иванович",
- "email": "ivan.ivanov@example.com"
}, - "project": {
- "id": 8,
- "name": "Проект Alpha",
- "code": "ALPHA-2024"
}, - "work_type": {
- "id": 3,
- "name": "Разработка",
- "category": "Backend"
}, - "task": {
- "id": 45,
- "name": "Реализация авторизации",
- "description": "Модуль авторизации с поддержкой разных провайдеров"
}, - "approved_by": {
- "id": 12,
- "name": "Петров Петр Петрович",
- "email": "petr.petrov@example.com"
}
}
], - "meta": {
- "current_page": 1,
- "last_page": 5,
- "per_page": 15,
- "total": 67
}
}Создает новую запись времени. По умолчанию запись создается в статусе draft.
Обязательные поля:
organization_id - ID организацииuser_id - ID пользователяproject_id - ID проектаwork_date - дата работыstart_time - время началаtitle - название/описание работы| organization_id required | integer ID организации |
| user_id required | integer ID пользователя, который выполнял работу |
| project_id required | integer ID проекта, в рамках которого выполнялась работа |
| work_type_id | integer or null ID типа работы (опционально) |
| task_id | integer or null ID задачи из календарного плана (опционально) |
| work_date required | string <date> Дата выполнения работы (не может быть в будущем) |
| start_time required | string <time> Время начала работы в формате HH:MM:SS |
| end_time | string or null <time> Время окончания работы в формате HH:MM:SS (должно быть позже start_time) |
| break_time | number or null <float> [ 0 .. 24 ] Время перерыва в часах (от 0 до 24) |
| title required | string <= 255 characters Название/краткое описание выполненной работы |
| description | string or null <= 1000 characters Подробное описание выполненной работы |
| status | string Default: "draft" Enum: "draft" "submitted" "approved" "rejected" Статус записи времени (по умолчанию "draft"):
|
| is_billable | boolean Default: true Является ли время оплачиваемым (по умолчанию true) |
| hourly_rate | number or null <float> >= 0 Почасовая ставка в рублях (должна быть неотрицательной) |
| location | string or null <= 255 characters Место выполнения работы |
object or null Дополнительные пользовательские поля | |
| notes | string or null <= 1000 characters Дополнительные заметки |
{- "organization_id": 5,
- "user_id": 15,
- "project_id": 8,
- "work_type_id": 3,
- "work_date": "2024-01-15",
- "start_time": "09:00:00",
- "end_time": "17:30:00",
- "break_time": 1,
- "title": "Разработка модуля авторизации",
- "description": "Реализованы методы входа через email и телефон, добавлена двухфакторная аутентификация",
- "status": "draft",
- "is_billable": true,
- "hourly_rate": 1500,
- "location": "Офис, переговорная комната 2",
- "notes": "Потребовалось больше времени из-за изменений в требованиях"
}{- "success": true,
- "message": "Запись времени успешно создана",
- "data": {
- "id": 123,
- "organization_id": 5,
- "user_id": 15,
- "project_id": 8,
- "work_type_id": 3,
- "task_id": 45,
- "work_date": "2024-01-15",
- "start_time": "09:00:00",
- "end_time": "17:30:00",
- "hours_worked": 8.5,
- "break_time": 1,
- "title": "Разработка модуля авторизации",
- "description": "Реализованы методы входа через email и телефон, добавлена двухфакторная аутентификация",
- "status": "approved",
- "approved_by_user_id": 12,
- "approved_at": "2024-01-16T10:30:00Z",
- "rejection_reason": "Неточное описание выполненной работы",
- "is_billable": true,
- "hourly_rate": 1500,
- "location": "Офис, переговорная комната 2",
- "custom_fields": {
- "equipment_used": "Laptop Dell, Монитор Samsung",
- "weather_conditions": "sunny"
}, - "notes": "Потребовалось больше времени из-за изменений в требованиях",
- "created_at": "2024-01-15T09:00:00Z",
- "updated_at": "2024-01-15T18:00:00Z",
- "total_cost": 12750,
- "is_active_timer": false,
- "duration_formatted": "8ч 30м",
- "user": {
- "id": 15,
- "name": "Иванов Иван Иванович",
- "email": "ivan.ivanov@example.com"
}, - "project": {
- "id": 8,
- "name": "Проект Alpha",
- "code": "ALPHA-2024"
}, - "work_type": {
- "id": 3,
- "name": "Разработка",
- "category": "Backend"
}, - "task": {
- "id": 45,
- "name": "Реализация авторизации",
- "description": "Модуль авторизации с поддержкой разных провайдеров"
}, - "approved_by": {
- "id": 12,
- "name": "Петров Петр Петрович",
- "email": "petr.petrov@example.com"
}
}
}Возвращает детальную информацию о записи времени включая связанные данные
| id required | integer Example: 123 Идентификатор записи времени |
{- "success": true,
- "data": {
- "id": 123,
- "organization_id": 5,
- "user_id": 15,
- "project_id": 8,
- "work_type_id": 3,
- "task_id": 45,
- "work_date": "2024-01-15",
- "start_time": "09:00:00",
- "end_time": "17:30:00",
- "hours_worked": 8.5,
- "break_time": 1,
- "title": "Разработка модуля авторизации",
- "description": "Реализованы методы входа через email и телефон, добавлена двухфакторная аутентификация",
- "status": "approved",
- "approved_by_user_id": 12,
- "approved_at": "2024-01-16T10:30:00Z",
- "rejection_reason": "Неточное описание выполненной работы",
- "is_billable": true,
- "hourly_rate": 1500,
- "location": "Офис, переговорная комната 2",
- "custom_fields": {
- "equipment_used": "Laptop Dell, Монитор Samsung",
- "weather_conditions": "sunny"
}, - "notes": "Потребовалось больше времени из-за изменений в требованиях",
- "created_at": "2024-01-15T09:00:00Z",
- "updated_at": "2024-01-15T18:00:00Z",
- "total_cost": 12750,
- "is_active_timer": false,
- "duration_formatted": "8ч 30м",
- "user": {
- "id": 15,
- "name": "Иванов Иван Иванович",
- "email": "ivan.ivanov@example.com"
}, - "project": {
- "id": 8,
- "name": "Проект Alpha",
- "code": "ALPHA-2024"
}, - "work_type": {
- "id": 3,
- "name": "Разработка",
- "category": "Backend"
}, - "task": {
- "id": 45,
- "name": "Реализация авторизации",
- "description": "Модуль авторизации с поддержкой разных провайдеров"
}, - "approved_by": {
- "id": 12,
- "name": "Петров Петр Петрович",
- "email": "petr.petrov@example.com"
}
}
}Обновляет существующую запись времени.
Можно обновлять только записи в статусе draft или rejected.
| id required | integer Example: 123 Идентификатор записи времени |
| user_id | integer ID пользователя, который выполнял работу |
| project_id | integer ID проекта, в рамках которого выполнялась работа |
| work_type_id | integer or null ID типа работы (опционально) |
| task_id | integer or null ID задачи из календарного плана (опционально) |
| work_date | string <date> Дата выполнения работы (не может быть в будущем) |
| start_time | string <time> Время начала работы в формате HH:MM:SS |
| end_time | string or null <time> Время окончания работы в формате HH:MM:SS (должно быть позже start_time) |
| break_time | number or null <float> [ 0 .. 24 ] Время перерыва в часах (от 0 до 24) |
| title | string <= 255 characters Название/краткое описание выполненной работы |
| description | string or null <= 1000 characters Подробное описание выполненной работы |
| status | string Enum: "draft" "submitted" "approved" "rejected" Статус записи времени:
|
| is_billable | boolean Является ли время оплачиваемым |
| hourly_rate | number or null <float> >= 0 Почасовая ставка в рублях (должна быть неотрицательной) |
| location | string or null <= 255 characters Место выполнения работы |
object or null Дополнительные пользовательские поля | |
| notes | string or null <= 1000 characters Дополнительные заметки |
{- "title": "Разработка модуля авторизации (обновлено)",
- "description": "Реализованы методы входа через email и телефон, добавлена двухфакторная аутентификация, исправлены замечания",
- "status": "submitted",
- "end_time": "18:00:00",
- "notes": "Доработана валидация email адресов"
}{- "success": true,
- "message": "Запись времени успешно обновлена",
- "data": {
- "id": 123,
- "organization_id": 5,
- "user_id": 15,
- "project_id": 8,
- "work_type_id": 3,
- "task_id": 45,
- "work_date": "2024-01-15",
- "start_time": "09:00:00",
- "end_time": "17:30:00",
- "hours_worked": 8.5,
- "break_time": 1,
- "title": "Разработка модуля авторизации",
- "description": "Реализованы методы входа через email и телефон, добавлена двухфакторная аутентификация",
- "status": "approved",
- "approved_by_user_id": 12,
- "approved_at": "2024-01-16T10:30:00Z",
- "rejection_reason": "Неточное описание выполненной работы",
- "is_billable": true,
- "hourly_rate": 1500,
- "location": "Офис, переговорная комната 2",
- "custom_fields": {
- "equipment_used": "Laptop Dell, Монитор Samsung",
- "weather_conditions": "sunny"
}, - "notes": "Потребовалось больше времени из-за изменений в требованиях",
- "created_at": "2024-01-15T09:00:00Z",
- "updated_at": "2024-01-15T18:00:00Z",
- "total_cost": 12750,
- "is_active_timer": false,
- "duration_formatted": "8ч 30м",
- "user": {
- "id": 15,
- "name": "Иванов Иван Иванович",
- "email": "ivan.ivanov@example.com"
}, - "project": {
- "id": 8,
- "name": "Проект Alpha",
- "code": "ALPHA-2024"
}, - "work_type": {
- "id": 3,
- "name": "Разработка",
- "category": "Backend"
}, - "task": {
- "id": 45,
- "name": "Реализация авторизации",
- "description": "Модуль авторизации с поддержкой разных провайдеров"
}, - "approved_by": {
- "id": 12,
- "name": "Петров Петр Петрович",
- "email": "petr.petrov@example.com"
}
}
}Удаляет запись времени.
Можно удалять только записи в статусе draft или rejected.
| id required | integer Example: 123 Идентификатор записи времени |
{- "success": true,
- "message": "Запись времени успешно удалена"
}Утверждает запись времени. Запись должна быть в статусе submitted.
После утверждения статус изменяется на approved.
| id required | integer Example: 123 Идентификатор записи времени |
| reason | string <= 500 characters Дополнительный комментарий к утверждению |
{- "reason": "Работа выполнена качественно"
}{- "success": true,
- "message": "Запись времени успешно утверждена"
}Отклоняет запись времени. Запись должна быть в статусе submitted.
После отклонения статус изменяется на rejected.
Обязательно указание причины отклонения.
| id required | integer Example: 123 Идентификатор записи времени |
| reason required | string <= 500 characters Причина отклонения (обязательно) |
{- "reason": "Неточное описание выполненной работы"
}{- "success": true,
- "message": "Запись времени отклонена"
}Отправляет запись времени на утверждение. Запись должна быть в статусе draft.
После отправки статус изменяется на submitted.
| id required | integer Example: 123 Идентификатор записи времени |
{- "success": true,
- "message": "Запись времени отправлена на утверждение"
}Возвращает агрегированную статистику по записям времени для текущей организации. Включает общее время, количество записей, распределение по статусам и проектам.
| user_id | integer Example: user_id=15 Фильтр по пользователю |
| project_id | integer Example: project_id=8 Фильтр по проекту |
| start_date | string <date> Example: start_date=2024-01-01 Дата начала периода |
| end_date | string <date> Example: end_date=2024-01-31 Дата окончания периода |
{- "success": true,
- "data": {
- "total_hours": 168.5,
- "billable_hours": 152,
- "total_entries": 45,
- "status_breakdown": {
- "draft": 5,
- "submitted": 8,
- "approved": 30,
- "rejected": 2
}, - "project_breakdown": [
- {
- "project_id": 8,
- "project_name": "Проект Alpha",
- "hours": 85.5,
- "entries_count": 23
}
], - "user_breakdown": [
- {
- "user_id": 15,
- "user_name": "Иванов Иван",
- "hours": 42.5,
- "entries_count": 12
}
]
}
}Возвращает записи времени, сгруппированные по дням для отображения в календаре. По умолчанию возвращает данные за текущий месяц.
| user_id | integer Example: user_id=15 Фильтр по пользователю |
| project_id | integer Example: project_id=8 Фильтр по проекту |
| start_date | string <date> Example: start_date=2024-01-01 Дата начала периода (по умолчанию - начало текущего месяца) |
| end_date | string <date> Example: end_date=2024-01-31 Дата окончания периода (по умолчанию - конец текущего месяца) |
{- "success": true,
- "data": {
- "property1": {
- "date": "2024-01-15",
- "total_hours": 8.5,
- "entries_count": 3,
- "entries": [
- {
- "id": 123,
- "organization_id": 5,
- "user_id": 15,
- "project_id": 8,
- "work_type_id": 3,
- "task_id": 45,
- "work_date": "2024-01-15",
- "start_time": "09:00:00",
- "end_time": "17:30:00",
- "hours_worked": 8.5,
- "break_time": 1,
- "title": "Разработка модуля авторизации",
- "description": "Реализованы методы входа через email и телефон, добавлена двухфакторная аутентификация",
- "status": "approved",
- "approved_by_user_id": 12,
- "approved_at": "2024-01-16T10:30:00Z",
- "rejection_reason": "Неточное описание выполненной работы",
- "is_billable": true,
- "hourly_rate": 1500,
- "location": "Офис, переговорная комната 2",
- "custom_fields": {
- "equipment_used": "Laptop Dell, Монитор Samsung",
- "weather_conditions": "sunny"
}, - "notes": "Потребовалось больше времени из-за изменений в требованиях",
- "created_at": "2024-01-15T09:00:00Z",
- "updated_at": "2024-01-15T18:00:00Z",
- "total_cost": 12750,
- "is_active_timer": false,
- "duration_formatted": "8ч 30м",
- "user": {
- "id": 15,
- "name": "Иванов Иван Иванович",
- "email": "ivan.ivanov@example.com"
}, - "project": {
- "id": 8,
- "name": "Проект Alpha",
- "code": "ALPHA-2024"
}, - "work_type": {
- "id": 3,
- "name": "Разработка",
- "category": "Backend"
}, - "task": {
- "id": 45,
- "name": "Реализация авторизации",
- "description": "Модуль авторизации с поддержкой разных провайдеров"
}, - "approved_by": {
- "id": 12,
- "name": "Петров Петр Петрович",
- "email": "petr.petrov@example.com"
}
}
]
}, - "property2": {
- "date": "2024-01-15",
- "total_hours": 8.5,
- "entries_count": 3,
- "entries": [
- {
- "id": 123,
- "organization_id": 5,
- "user_id": 15,
- "project_id": 8,
- "work_type_id": 3,
- "task_id": 45,
- "work_date": "2024-01-15",
- "start_time": "09:00:00",
- "end_time": "17:30:00",
- "hours_worked": 8.5,
- "break_time": 1,
- "title": "Разработка модуля авторизации",
- "description": "Реализованы методы входа через email и телефон, добавлена двухфакторная аутентификация",
- "status": "approved",
- "approved_by_user_id": 12,
- "approved_at": "2024-01-16T10:30:00Z",
- "rejection_reason": "Неточное описание выполненной работы",
- "is_billable": true,
- "hourly_rate": 1500,
- "location": "Офис, переговорная комната 2",
- "custom_fields": {
- "equipment_used": "Laptop Dell, Монитор Samsung",
- "weather_conditions": "sunny"
}, - "notes": "Потребовалось больше времени из-за изменений в требованиях",
- "created_at": "2024-01-15T09:00:00Z",
- "updated_at": "2024-01-15T18:00:00Z",
- "total_cost": 12750,
- "is_active_timer": false,
- "duration_formatted": "8ч 30м",
- "user": {
- "id": 15,
- "name": "Иванов Иван Иванович",
- "email": "ivan.ivanov@example.com"
}, - "project": {
- "id": 8,
- "name": "Проект Alpha",
- "code": "ALPHA-2024"
}, - "work_type": {
- "id": 3,
- "name": "Разработка",
- "category": "Backend"
}, - "task": {
- "id": 45,
- "name": "Реализация авторизации",
- "description": "Модуль авторизации с поддержкой разных провайдеров"
}, - "approved_by": {
- "id": 12,
- "name": "Петров Петр Петрович",
- "email": "petr.petrov@example.com"
}
}
]
}
}
}Генерирует детальный отчет по записям времени с возможностью группировки. По умолчанию группирует данные по пользователям за текущий месяц.
| user_id | integer Example: user_id=15 Фильтр по пользователю |
| project_id | integer Example: project_id=8 Фильтр по проекту |
| start_date | string <date> Example: start_date=2024-01-01 Дата начала периода (по умолчанию - начало текущего месяца) |
| end_date | string <date> Example: end_date=2024-01-31 Дата окончания периода (по умолчанию - конец текущего месяца) |
| group_by | string Default: "user" Enum: "user" "project" "work_type" "date" Example: group_by=project Способ группировки данных в отчете |
{- "success": true,
- "data": {
- "summary": {
- "total_hours": 168.5,
- "billable_hours": 152,
- "total_cost": 45600,
- "entries_count": 45
}, - "groups": [
- {
- "group_key": "Иванов Иван",
- "group_id": 15,
- "hours": 42.5,
- "billable_hours": 40,
- "total_cost": 12000,
- "entries_count": 12,
- "entries": [
- {
- "id": 123,
- "organization_id": 5,
- "user_id": 15,
- "project_id": 8,
- "work_type_id": 3,
- "task_id": 45,
- "work_date": "2024-01-15",
- "start_time": "09:00:00",
- "end_time": "17:30:00",
- "hours_worked": 8.5,
- "break_time": 1,
- "title": "Разработка модуля авторизации",
- "description": "Реализованы методы входа через email и телефон, добавлена двухфакторная аутентификация",
- "status": "approved",
- "approved_by_user_id": 12,
- "approved_at": "2024-01-16T10:30:00Z",
- "rejection_reason": "Неточное описание выполненной работы",
- "is_billable": true,
- "hourly_rate": 1500,
- "location": "Офис, переговорная комната 2",
- "custom_fields": {
- "equipment_used": "Laptop Dell, Монитор Samsung",
- "weather_conditions": "sunny"
}, - "notes": "Потребовалось больше времени из-за изменений в требованиях",
- "created_at": "2024-01-15T09:00:00Z",
- "updated_at": "2024-01-15T18:00:00Z",
- "total_cost": 12750,
- "is_active_timer": false,
- "duration_formatted": "8ч 30м",
- "user": {
- "id": 15,
- "name": "Иванов Иван Иванович",
- "email": "ivan.ivanov@example.com"
}, - "project": {
- "id": 8,
- "name": "Проект Alpha",
- "code": "ALPHA-2024"
}, - "work_type": {
- "id": 3,
- "name": "Разработка",
- "category": "Backend"
}, - "task": {
- "id": 45,
- "name": "Реализация авторизации",
- "description": "Модуль авторизации с поддержкой разных провайдеров"
}, - "approved_by": {
- "id": 12,
- "name": "Петров Петр Петрович",
- "email": "petr.petrov@example.com"
}
}
]
}
]
}
}Возвращает пагинированный список единиц измерения организации с возможностью фильтрации по типу.
| type | string Enum: "material" "work" "other" Example: type=material Фильтр по типу единиц измерения |
| page | integer >= 1 Default: 1 Example: page=1 Номер страницы |
| per_page | integer [ 1 .. 100 ] Default: 15 Example: per_page=15 Количество записей на страницу |
{- "data": [
- {
- "id": 1,
- "name": "квадратный метр",
- "code": "м²",
- "type": "material",
- "is_default": true,
- "is_system": false
}, - {
- "id": 2,
- "name": "кубический метр",
- "code": "м³",
- "type": "material",
- "is_default": false,
- "is_system": false
}
], - "links": {
- "prev": null,
}, - "meta": {
- "current_page": 1,
- "from": 1,
- "last_page": 3,
- "per_page": 15,
- "to": 15,
- "total": 45
}
}Создает новую единицу измерения для организации с проверкой уникальности названия и автоматической обработкой флага по умолчанию.
| name required | string <= 255 characters Название единицы измерения (уникальное в рамках организации) |
| short_name required | string <= 50 characters Краткое обозначение единицы измерения |
| type | string Default: "material" Enum: "material" "work" "other" Тип единицы измерения |
| description | string or null Описание единицы измерения |
| is_default | boolean Default: false Является ли единица измерения по умолчанию для данного типа |
{- "name": "квадратный метр",
- "short_name": "м²",
- "type": "material",
- "description": "Единица измерения площади"
}{- "data": {
- "id": 15,
- "name": "квадратный метр",
- "code": "м²",
- "type": "material",
- "description": "Единица измерения площади",
- "is_default": false,
- "is_system": false,
- "organization_id": 10,
- "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T10:00:00Z"
}
}Возвращает полную информацию о единице измерения с проверкой принадлежности к организации.
| id required | integer Example: 15 ID единицы измерения |
{- "data": {
- "id": 15,
- "name": "квадратный метр",
- "code": "м²",
- "type": "material",
- "description": "Единица измерения площади",
- "is_default": false,
- "is_system": false,
- "organization_id": 10,
- "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T15:30:00Z"
}
}Обновляет единицу измерения с проверками:
| id required | integer Example: 15 ID единицы измерения для обновления |
| name | string <= 255 characters Название единицы измерения (уникальное в рамках организации, игнорирует текущую запись) |
| short_name | string <= 50 characters Краткое обозначение единицы измерения |
| type | string Enum: "material" "work" "other" Тип единицы измерения (нельзя изменить, если единица уже используется) |
| description | string or null Описание единицы измерения |
| is_default | boolean Является ли единица измерения по умолчанию для данного типа |
{- "description": "Обновленное описание единицы измерения"
}{- "data": {
- "id": 15,
- "name": "метр квадратный",
- "code": "кв.м",
- "type": "material",
- "description": "Альтернативное название для площади",
- "is_default": false,
- "is_system": false
}
}Удаляет единицу измерения с проверками:
| id required | integer Example: 15 ID единицы измерения для удаления |
{- "message": "Organization ID not found in context."
}Возвращает список единиц измерения, специфичных для материалов организации. Это упрощенный эндпоинт для использования в селекторах при создании/редактировании материалов.
{- "data": [
- {
- "id": 1,
- "name": "квадратный метр",
- "code": "м²",
- "type": "material",
- "is_default": true,
- "is_system": false
}, - {
- "id": 2,
- "name": "кубический метр",
- "code": "м³",
- "type": "material",
- "is_default": false,
- "is_system": false
}, - {
- "id": 3,
- "name": "штука",
- "code": "шт",
- "type": "material",
- "is_default": false,
- "is_system": true
}
]
}Возвращает пагинированный список категорий затрат организации с возможностью фильтрации, поиска и построения иерархии. Поддерживает загрузку связанных данных.
| search | string Example: search=строительн Поиск по названию, коду или внешнему коду |
| is_active | boolean Example: is_active=true Фильтр по активности категории |
| parent_id | string Example: parent_id=5 Фильтр по родительской категории (null или 0 для корневых) |
| sort_by | string Default: "sort_order" Enum: "sort_order" "name" "created_at" "updated_at" Example: sort_by=sort_order Поле для сортировки |
| sort_direction | string Default: "asc" Enum: "asc" "desc" Example: sort_direction=asc Направление сортировки |
| per_page | integer [ 1 .. 100 ] Default: 15 Example: per_page=15 Количество записей на страницу |
{- "data": [
- {
- "id": 15,
- "name": "Строительно-монтажные работы",
- "code": "SMR",
- "external_code": "EXT-001",
- "is_active": true,
- "parent_id": 5,
- "parent": {
- "id": 5,
- "name": "Основные работы",
- "code": "MAIN"
}, - "projects_count": 12
}
], - "links": {
- "prev": null,
}, - "meta": {
- "current_page": 1,
- "per_page": 15,
- "total": 42
}
}Создает новую категорию затрат для организации с проверкой уникальности кодов и валидацией иерархических связей.
| name required | string <= 255 characters Название категории затрат |
| code | string or null <= 100 characters Код категории (уникальный в рамках организации) |
| external_code | string or null <= 100 characters Внешний код категории для интеграции с учетными системами |
| description | string or null Описание категории затрат |
| parent_id | integer or null ID родительской категории для создания иерархии |
| is_active | boolean Default: true Активность категории |
| sort_order | integer or null Порядок сортировки для отображения |
| additional_attributes | object or null Дополнительные атрибуты в виде JSON |
{- "name": "Основные работы",
- "code": "MAIN",
- "external_code": "EXT-MAIN",
- "description": "Категория для основных строительных работ",
- "is_active": true,
- "sort_order": 10
}{- "data": {
- "id": 15,
- "name": "Строительно-монтажные работы",
- "code": "SMR",
- "external_code": "EXT-001",
- "description": "Работы по строительству и монтажу конструкций",
- "organization_id": 10,
- "parent_id": 5,
- "is_active": true,
- "sort_order": 10,
- "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T10:00:00Z",
- "parent": {
- "id": 5,
- "name": "Основные работы",
- "code": "MAIN"
}
}
}Возвращает полную информацию о категории затрат включая иерархические связи (родитель, дочерние категории) и количество связанных проектов.
| id required | integer Example: 15 ID категории затрат |
{- "data": {
- "id": 15,
- "name": "Строительно-монтажные работы",
- "code": "SMR",
- "external_code": "EXT-001",
- "description": "Работы по строительству и монтажу конструкций",
- "organization_id": 10,
- "parent_id": 5,
- "is_active": true,
- "sort_order": 10,
- "additional_attributes": {
- "priority": "high",
- "department": "construction"
}, - "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T15:30:00Z",
- "parent": {
- "id": 5,
- "name": "Основные работы",
- "code": "MAIN"
}, - "children": [
- {
- "id": 25,
- "name": "Кирпичная кладка",
- "code": "BRICK"
}
], - "projects_count": 12,
- "path": [
- {
- "id": 1,
- "name": "Корневая категория"
}, - {
- "id": 5,
- "name": "Основные работы"
}
]
}
}Обновляет категорию затрат с проверками:
| id required | integer Example: 15 ID категории затрат для обновления |
| name | string <= 255 characters Название категории затрат |
| code | string or null <= 100 characters Код категории (уникальный в рамках организации, игнорирует текущую запись) |
| external_code | string or null <= 100 characters Внешний код категории для интеграции с учетными системами |
| description | string or null Описание категории затрат |
| parent_id | integer or null ID родительской категории (не может быть равен собственному ID) |
| is_active | boolean Активность категории |
| sort_order | integer or null Порядок сортировки для отображения |
| additional_attributes | object or null Дополнительные атрибуты в виде JSON |
{- "description": "Обновленное описание категории",
- "is_active": false
}{- "data": {
- "id": 15,
- "name": "Строительно-монтажные работы (расширенные)",
- "code": "SMR-EXT",
- "is_active": true,
- "sort_order": 15,
- "parent": {
- "id": 3,
- "name": "Новая родительская категория",
- "code": "NEW-PARENT"
}
}
}Удаляет категорию затрат с проверками:
| id required | integer Example: 15 ID категории затрат для удаления |
{- "success": true,
- "message": "Категория затрат успешно удалена."
}Импортирует категории затрат из Excel/CSV файла с поддержкой различных форматов данных и автоматическим созданием иерархических связей.
| file required | string <binary> Файл для импорта (Excel, CSV) |
| format | string Default: "simple" Enum: "simple" "sbis" "onec" Формат данных в файле |
{ "format": "simple" }
{- "success": true,
- "imported": 25,
- "updated": 5,
- "errors": [ ]
}Импортирует данные сотрудников из внешней бухгалтерской системы. Обновляет существующих пользователей по external_code или employee_id. Если пользователь не найден в системе, запись пропускается.
Поля обновления:
{- "success": true,
- "message": "Импорт пользователей завершен",
- "stats": {
- "total": 25,
- "created": 0,
- "updated": 23,
- "skipped": 2,
- "errors": 0
}
}Импортирует данные проектов из внешней бухгалтерской системы. Создает новые проекты или обновляет существующие по external_code. Автоматически импортирует и связывает категории затрат.
Поля создания/обновления:
{- "success": true,
- "message": "Импорт проектов завершен",
- "stats": {
- "total": 12,
- "created": 5,
- "updated": 7,
- "skipped": 0,
- "errors": 0
}
}Импортирует данные материалов из внешней бухгалтерской системы. Обновляет существующие материалы по external_code или sbis_nomenclature_code. Если материал не найден в системе, запись пропускается.
Поддерживаемые системы:
Поля обновления:
{- "success": true,
- "message": "Импорт материалов завершен",
- "stats": {
- "total": 150,
- "created": 0,
- "updated": 145,
- "skipped": 5,
- "errors": 0
}
}Экспортирует утвержденные транзакции подотчетных средств во внешнюю бухгалтерскую систему. Экспортируются только транзакции без external_code (еще не экспортированные) со статусом 'approved'.
Критерии экспорта:
Данные экспорта:
После успешного экспорта транзакции помечаются external_code из ответа API.
| start_date | string or null <date> Дата начала периода для экспорта (формат YYYY-MM-DD). Если не указана, используется 30 дней назад. |
| end_date | string or null <date> Дата окончания периода для экспорта (формат YYYY-MM-DD). Если не указана, используется текущая дата. |
{- "start_date": "2024-01-01",
- "end_date": "2024-12-31"
}{- "success": true,
- "message": "Экспорт транзакций завершен",
- "stats": {
- "total": 15,
- "exported": 14,
- "errors": 1
}
}Возвращает информацию о состоянии синхронизации с внешней бухгалтерской системой. Показывает статус последней синхронизации по каждому типу данных: пользователи, проекты, материалы, транзакции.
Примечание: Данный endpoint в настоящее время возвращает заглушку с актуальной датой и статусом "completed" для всех типов данных. В будущем планируется реализация реального мониторинга статуса.
{- "success": true,
- "message": "Синхронизация работает нормально",
- "last_sync": {
- "timestamp": "2024-12-20 18:30:15",
- "status": "completed",
- "users_synced": true,
- "projects_synced": true,
- "materials_synced": true,
- "transactions_synced": true
}
}{- "success": true,
- "message": "string",
- "data": {
- "id": 0,
- "contract_id": 0,
- "act_document_number": "string",
- "act_date": "2019-08-24",
- "description": "string",
- "amount": 0,
- "is_approved": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "contract": {
- "id": 0,
- "contract_number": "string",
- "project_name": "string",
- "contractor_name": "string"
}, - "completed_works": [
- {
- "id": 1,
- "organization_id": 1,
- "project": {
- "id": 5,
- "name": "ЖК Солнечный",
- "address": "г. Москва, ул. Солнечная, д. 15",
- "status": "active"
}, - "contract": {
- "id": 1,
- "number": "ДПХ-2024/001",
- "total_amount": 2500000,
- "status": "active",
- "completion_percentage": 50,
- "contractor_name": "ООО Строймонтаж"
}, - "work_type": {
- "id": 5,
- "name": "Кладка кирпичных стен",
- "code": "KLAD-001",
- "category": "Каменные работы",
- "description": "Кладка несущих стен из керамического кирпича",
- "defaultPrice": 1250,
- "isActive": true,
- "organizationId": 10,
- "measurementUnit": {
- "id": 1,
- "name": "квадратный метр",
- "code": "м²",
- "short_name": "м²",
- "type": "material",
- "description": "Единица измерения площади",
- "is_default": false,
- "is_system": false,
- "organization_id": 10,
- "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T15:30:00Z"
}, - "createdAt": "2024-12-20 10:00:00",
- "updatedAt": "2024-12-20 15:30:00"
}, - "user": {
- "id": 12,
- "name": "Иванов Иван Иванович",
- "email": "ivanov@example.com",
- "phone": "+7 (900) 123-45-67",
- "position": "Прораб",
}, - "contractor": {
- "id": 3,
- "name": "ООО Строймонтаж",
- "inn": "7707083893",
- "contact_person": "Иванов И.И."
}, - "contractor_id": 3,
- "quantity": 150.5,
- "price": 500.25,
- "total_amount": 75187.5,
- "completion_date": "2024-02-15",
- "notes": "Работы выполнены качественно, в срок.",
- "status": "confirmed",
- "additional_info": {
- "quality_rating": 5,
- "weather_conditions": "солнечно"
}, - "materials": [
- {
- "material_id": 15,
- "material_name": "Цемент М500",
- "measurement_unit": "т",
- "quantity": 25.5,
- "unit_price": 150,
- "total_amount": 3825,
- "notes": "Высококачественный материал",
- "created_at": "2024-02-15 10:30:00",
- "updated_at": "2024-02-15 14:45:00"
}
], - "created_at": "2024-02-15 10:30:00",
- "updated_at": "2024-02-15 14:45:00"
}
]
}
}| performance_act required | integer |
| act_document_number | string <= 255 characters |
| act_date | string <date> |
| description | string or null |
| is_approved | boolean |
{- "act_document_number": "string",
- "act_date": "2019-08-24",
- "description": "string",
- "is_approved": true
}{- "success": true,
- "message": "string",
- "data": {
- "id": 0,
- "contract_id": 0,
- "act_document_number": "string",
- "act_date": "2019-08-24",
- "description": "string",
- "amount": 0,
- "is_approved": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "contract": {
- "id": 0,
- "contract_number": "string",
- "project_name": "string",
- "contractor_name": "string"
}, - "completed_works": [
- {
- "id": 1,
- "organization_id": 1,
- "project": {
- "id": 5,
- "name": "ЖК Солнечный",
- "address": "г. Москва, ул. Солнечная, д. 15",
- "status": "active"
}, - "contract": {
- "id": 1,
- "number": "ДПХ-2024/001",
- "total_amount": 2500000,
- "status": "active",
- "completion_percentage": 50,
- "contractor_name": "ООО Строймонтаж"
}, - "work_type": {
- "id": 5,
- "name": "Кладка кирпичных стен",
- "code": "KLAD-001",
- "category": "Каменные работы",
- "description": "Кладка несущих стен из керамического кирпича",
- "defaultPrice": 1250,
- "isActive": true,
- "organizationId": 10,
- "measurementUnit": {
- "id": 1,
- "name": "квадратный метр",
- "code": "м²",
- "short_name": "м²",
- "type": "material",
- "description": "Единица измерения площади",
- "is_default": false,
- "is_system": false,
- "organization_id": 10,
- "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T15:30:00Z"
}, - "createdAt": "2024-12-20 10:00:00",
- "updatedAt": "2024-12-20 15:30:00"
}, - "user": {
- "id": 12,
- "name": "Иванов Иван Иванович",
- "email": "ivanov@example.com",
- "phone": "+7 (900) 123-45-67",
- "position": "Прораб",
}, - "contractor": {
- "id": 3,
- "name": "ООО Строймонтаж",
- "inn": "7707083893",
- "contact_person": "Иванов И.И."
}, - "contractor_id": 3,
- "quantity": 150.5,
- "price": 500.25,
- "total_amount": 75187.5,
- "completion_date": "2024-02-15",
- "notes": "Работы выполнены качественно, в срок.",
- "status": "confirmed",
- "additional_info": {
- "quality_rating": 5,
- "weather_conditions": "солнечно"
}, - "materials": [
- {
- "material_id": 15,
- "material_name": "Цемент М500",
- "measurement_unit": "т",
- "quantity": 25.5,
- "unit_price": 150,
- "total_amount": 3825,
- "notes": "Высококачественный материал",
- "created_at": "2024-02-15 10:30:00",
- "updated_at": "2024-02-15 14:45:00"
}
], - "created_at": "2024-02-15 10:30:00",
- "updated_at": "2024-02-15 14:45:00"
}
]
}
}Возвращает детальную информацию о конкретном платеже по его идентификатору.
Особенности:
| payment required | integer Example: 1 Идентификатор платежа |
{- "data": {
- "id": 1,
- "contract_id": 15,
- "payment_date": "2024-01-15",
- "amount": 150000,
- "payment_type": "advance",
- "payment_type_label": "Авансовый платеж",
- "reference_document_number": "СЧ-2024-001",
- "description": "Авансовый платеж за январь по договору на общестроительные работы",
- "created_at": "2024-01-15T10:30:00Z",
- "updated_at": "2024-01-15T10:30:00Z"
}
}Обновляет существующий платеж по его идентификатору.
Особенности:
| payment required | integer Example: 1 Идентификатор платежа |
| payment_date | string <date> Дата платежа в формате YYYY-MM-DD |
| amount | number <decimal> >= 0 Сумма платежа в рублях |
| payment_type | string Enum: "advance" "fact_payment" "deferred_payment" "other" Тип платежа:
|
| reference_document_number | string or null <= 255 characters Номер документа-основания для платежа (счет, акт, КС) |
| description | string or null Описание или комментарий к платежу |
{- "amount": 175000,
- "payment_type": "fact_payment",
- "description": "Изменен тип платежа на оплату по факту"
}{- "data": {
- "id": 1,
- "contract_id": 15,
- "payment_date": "2024-01-15",
- "amount": 175000,
- "payment_type": "fact_payment",
- "payment_type_label": "Оплата по факту",
- "reference_document_number": "СЧ-2024-001",
- "description": "Изменен тип платежа на оплату по факту",
- "created_at": "2024-01-15T10:30:00Z",
- "updated_at": "2024-01-16T14:20:00Z"
}
}Удаляет платеж по его идентификатору.
Особенности:
| payment required | integer Example: 1 Идентификатор платежа |
{- "message": "Failed to delete payment",
- "error": "Payment not found or does not belong to the specified contract."
}Возвращает пагинированный список файлов отчетов, созданных системой. Поддерживает фильтрацию по типу, дате создания и имени файла. Для каждого файла генерируется временная ссылка для скачивания (действует 5 минут).
Особенности:
| type | string Example: type=reports Тип отчета для фильтрации |
| date_from | string <date> Example: date_from=2024-01-01 Дата начала периода создания файлов |
| date_to | string <date> Example: date_to=2024-12-31 Дата окончания периода создания файлов |
| filename | string Example: filename=материалы Поиск по имени файла (регистронезависимый) |
| sort_by | string Default: "created_at" Enum: "created_at" "size" "filename" Поле для сортировки |
| sort_dir | string Default: "desc" Enum: "asc" "desc" Направление сортировки |
| per_page | integer [ 1 .. 100 ] Default: 15 Количество элементов на странице |
{- "data": [
- {
- "id": "cmVwb3J0cy9tYXRlcmlhbC11c2FnZS8yMDI0LzAxLzE1L3JlcG9ydC54bHN4",
- "path": "reports/material-usage/2024/01/15/report.xlsx",
- "filename": "material_usage_report_20240115.xlsx",
- "name": "Отчет по материалам за январь",
- "type": "reports",
- "size": 2048576,
- "created_at": "2024-01-15T09:30:00Z",
- "expires_at": "2025-01-15T09:30:00Z",
}, - {
- "id": "Y29udHJhY3Rvci9zdW1tYXJ5LzIwMjQvMDEvMTAvcmVwb3J0LnBkZg",
- "path": "contractor/summary/2024/01/10/report.pdf",
- "filename": "contractor_summary_20240110.pdf",
- "name": null,
- "type": "contractor",
- "size": 1024000,
- "created_at": "2024-01-10T14:20:00Z",
- "expires_at": "2025-01-10T14:20:00Z",
}
], - "links": {
- "prev": null,
}, - "meta": {
- "current_page": 1,
- "from": 1,
- "last_page": 3,
- "per_page": 15,
- "to": 15,
- "total": 42
}
}Обновляет читаемое название файла отчета. Позволяет присвоить более понятное название вместо автоматически сгенерированного имени файла.
Особенности:
| key required | string Example: cmVwb3J0cy9tYXRlcmlhbC11c2FnZS8yMDI0LzAxLzE1L3JlcG9ydC54bHN4 Закодированный идентификатор файла (base64url от path) |
| name required | string <= 255 characters Новое читаемое название файла |
{- "name": "Отчет по расходу материалов за январь 2024"
}{- "message": "Name updated."
}Удаляет файл отчета из S3 хранилища и записи из базы данных. Операция необратима - восстановление файла невозможно.
Особенности:
| key required | string Example: cmVwb3J0cy9tYXRlcmlhbC11c2FnZS8yMDI0LzAxLzE1L3JlcG9ydC54bHN4 Закодированный идентификатор файла (base64url от path) |
{- "message": "File deleted."
}Возвращает список файлов и папок в личном хранилище текущего пользователя. Поддерживает навигацию по папкам через параметр path. Для файлов генерируются временные ссылки для скачивания (действуют 30 минут).
Особенности:
| path | string Default: "" Examples:
Путь к папке относительно корня пользователя (пустая строка = корень) |
[- {
- "id": "01JFJK8HDNPZ8QAJ2YQF6SW6JH",
- "path": "123/Документы/",
- "filename": "Документы",
- "size": 0,
- "is_folder": true,
- "download_url": null
}, - {
- "id": "01JFJK8HDNPZ8QAJ2YQF6SW6JI",
- "path": "123/report.pdf",
- "filename": "report.pdf",
- "size": 2048576,
- "is_folder": false,
}, - {
- "id": "01JFJK8HDNPZ8QAJ2YQF6SW6JJ",
- "path": "123/photo.jpg",
- "filename": "photo.jpg",
- "size": 1024000,
- "is_folder": false,
}
]Создает новую папку в личном хранилище пользователя. Папка создается как объект нулевого размера в S3 хранилище.
Особенности:
| name required | string <= 255 characters Название папки (без слешей в начале и конце) |
| parent_path | string or null Путь к родительской папке (относительно корня пользователя) |
{- "name": "Мои документы"
}{- "message": "Folder created."
}Загружает файл в личное хранилище пользователя. Поддерживает файлы до 10 MB через multipart/form-data.
Особенности:
| file required | string <binary> Файл для загрузки (максимум 10 MB) |
| parent_path | string or null Путь к родительской папке (относительно корня пользователя) |
{ "file": "(binary file data)" }
{- "message": "File uploaded."
}Удаляет файл или папку из личного хранилища пользователя. При удалении папки удаляются все вложенные файлы и подпапки.
Особенности:
| id required | string Example: 01JFJK8HDNPZ8QAJ2YQF6SW6JH Уникальный идентификатор файла или папки (ULID) |
{- "message": "Deleted."
}Создает новое дополнительное соглашение к указанному контракту.
Особенности:
| contract_id required | integer Идентификатор контракта, к которому создается дополнительное соглашение |
| number required | string <= 255 characters Номер дополнительного соглашения |
| agreement_date required | string <date> Дата подписания дополнительного соглашения в формате YYYY-MM-DD |
| change_amount | number or null <decimal> Изменение суммы контракта (может быть положительным или отрицательным). Не обязательно, если ДС создается для изменения неценовых условий (сроки, спецификация, реквизиты, график платежей и т.д.) |
| supersede_agreement_ids | Array of integers or null Массив ID предыдущих дополнительных соглашений для аннулирования. Используется когда текущее ДС отменяет/заменяет предыдущие ДС. |
| subject_changes required | Array of strings Массив изменений предмета договора или условий контракта. Обязательное поле - любое ДС должно содержать описание изменений. |
| subcontract_changes | Array of arrays or null or null Изменения в субподрядных работах |
| gp_changes | Array of arrays or null or null Изменения условий ГП (генподряда) |
| advance_changes | Array of arrays or null or null Изменения авансовых платежей |
{- "contract_id": 15,
- "number": "ДС-1",
- "agreement_date": "2024-02-15",
- "change_amount": 50000,
- "subject_changes": [
- "Увеличение объема работ по отделке",
- "Изменение сроков выполнения работ",
- "Корректировка материалов"
]
}{- "id": 1,
- "contract_id": 15,
- "number": "ДС-1",
- "agreement_date": "2024-02-15",
- "change_amount": 50000,
- "subject_changes": [
- "Увеличение объема работ по отделке",
- "Изменение сроков выполнения работ",
- "Корректировка материалов"
], - "created_at": "2024-02-15T14:30:00Z",
- "updated_at": "2024-02-15T14:30:00Z"
}Возвращает детальную информацию о конкретном дополнительном соглашении.
Особенности:
| agreement required | integer Example: 1 Идентификатор дополнительного соглашения |
{- "id": 1,
- "contract_id": 15,
- "number": "ДС-1",
- "agreement_date": "2024-02-15",
- "change_amount": 50000,
- "subject_changes": [
- "Увеличение объема работ по отделке",
- "Изменение сроков выполнения работ",
- "Корректировка материалов"
], - "created_at": "2024-02-15T14:30:00Z",
- "updated_at": "2024-02-15T14:30:00Z"
}Обновляет существующее дополнительное соглашение.
Особенности:
| agreement required | integer Example: 1 Идентификатор дополнительного соглашения |
| number | string <= 255 characters Номер дополнительного соглашения |
| agreement_date | string <date> Дата подписания дополнительного соглашения в формате YYYY-MM-DD |
| change_amount | number or null <decimal> Изменение суммы контракта (может быть положительным или отрицательным). Не обязательно, если ДС создается для изменения неценовых условий (сроки, спецификация, реквизиты, график платежей и т.д.) |
| supersede_agreement_ids | Array of integers or null Массив ID предыдущих дополнительных соглашений для аннулирования. Используется когда текущее ДС отменяет/заменяет предыдущие ДС. |
| subject_changes | Array of strings Массив изменений предмета договора или условий контракта. Любое ДС должно содержать описание изменений. |
| subcontract_changes | Array of arrays or null or null Изменения в субподрядных работах |
| gp_changes | Array of arrays or null or null Изменения условий ГП (генподряда) |
| advance_changes | Array of arrays or null or null Изменения авансовых платежей |
{- "number": "ДС-1/И",
- "change_amount": 75000,
- "subject_changes": [
- "Увеличение объема работ по отделке",
- "Изменение сроков выполнения работ",
- "Корректировка материалов",
- "Дополнительные работы по благоустройству"
]
}{- "id": 1,
- "contract_id": 15,
- "number": "ДС-1/И",
- "agreement_date": "2024-02-15",
- "change_amount": 75000,
- "subject_changes": [
- "Увеличение объема работ по отделке",
- "Изменение сроков выполнения работ",
- "Корректировка материалов",
- "Дополнительные работы по благоустройству"
], - "created_at": "2024-02-15T14:30:00Z",
- "updated_at": "2024-02-16T10:15:00Z"
}Удаляет дополнительное соглашение (soft delete).
Особенности:
| agreement required | integer Example: 1 Идентификатор дополнительного соглашения |
{- "message": "Unauthenticated.",
- "success": false
}Возвращает пагинированный список всех дополнительных соглашений для указанного контракта. Соглашения сортируются по дате соглашения в убывающем порядке (новые сначала).
Особенности:
| contract required | integer Example: 15 Идентификатор контракта |
| per_page | integer [ 1 .. 100 ] Default: 15 Example: per_page=20 Количество элементов на странице |
{- "data": [
- {
- "id": 1,
- "contract_id": 15,
- "number": "ДС-1",
- "agreement_date": "2024-02-15",
- "change_amount": 50000,
- "subject_changes": [
- "Увеличение объема работ по отделке",
- "Изменение сроков выполнения работ"
], - "created_at": "2024-02-15T14:30:00Z",
- "updated_at": "2024-02-15T14:30:00Z"
}, - {
- "id": 2,
- "contract_id": 15,
- "number": "ДС-2",
- "agreement_date": "2024-03-01",
- "change_amount": -10000,
- "subject_changes": [
- "Корректировка объема работ"
], - "created_at": "2024-03-01T16:45:00Z",
- "updated_at": "2024-03-01T16:45:00Z"
}
], - "links": {
- "prev": null,
- "next": null
}, - "meta": {
- "current_page": 1,
- "from": 1,
- "last_page": 1,
- "per_page": 15,
- "to": 2,
- "total": 2
}
}Возвращает пагинированный список всех спецификаций в системе. Спецификации содержат детализацию работ и услуг с общей стоимостью.
| per_page | integer [ 1 .. 100 ] Default: 15 Example: per_page=15 Количество записей на страницу |
{- "data": [
- {
- "id": 25,
- "number": "SPEC-2024-001",
- "spec_date": "2024-12-20",
- "total_amount": 150000.5,
- "status": "approved",
- "scope_items": [
- "Кирпичная кладка стен 1-го этажа",
- "Устройство монолитного перекрытия"
], - "created_at": "2024-12-15T09:30:00Z"
}
], - "links": {
- "prev": null,
}, - "meta": {
- "current_page": 1,
- "per_page": 15,
- "total": 52
}
}Создает новую спецификацию с уникальным номером, детализацией работ и общей стоимостью.
| number required | string <= 255 characters Уникальный номер спецификации |
| spec_date required | string <date> Дата спецификации в формате Y-m-d |
| total_amount required | number <decimal> Общая сумма спецификации |
| scope_items required | Array of strings non-empty Перечень работ/услуг в спецификации |
| status | string Default: "draft" Enum: "draft" "approved" "archived" Статус спецификации |
{- "number": "SPEC-2024-001",
- "spec_date": "2024-12-20",
- "total_amount": 150000.5,
- "scope_items": [
- "Кирпичная кладка стен 1-го этажа",
- "Устройство монолитного перекрытия",
- "Штукатурные работы внутренние"
], - "status": "draft"
}{- "id": 25,
- "number": "SPEC-2024-001",
- "spec_date": "2024-12-20",
- "total_amount": 150000.5,
- "status": "draft",
- "scope_items": [
- "Кирпичная кладка стен 1-го этажа",
- "Устройство монолитного перекрытия",
- "Штукатурные работы внутренние"
], - "created_at": "2024-12-20T10:00:00Z",
- "updated_at": "2024-12-20T10:00:00Z"
}Возвращает полную информацию о спецификации включая все детали работ и связанные данные.
| id required | integer Example: 25 ID спецификации |
{- "id": 25,
- "number": "SPEC-2024-001",
- "spec_date": "2024-12-20",
- "total_amount": 150000.5,
- "status": "approved",
- "scope_items": [
- "Кирпичная кладка стен 1-го этажа",
- "Устройство монолитного перекрытия",
- "Штукатурные работы внутренние",
- "Электромонтажные работы"
], - "attached_at": null,
- "created_at": "2024-12-15T09:30:00Z",
- "updated_at": "2024-12-20T14:15:00Z"
}Обновляет спецификацию с проверкой уникальности номера (игнорирует текущую запись). Позволяет частичное обновление.
| id required | integer Example: 25 ID спецификации для обновления |
| number | string <= 255 characters Уникальный номер спецификации (игнорирует текущую запись при проверке уникальности) |
| spec_date | string <date> Дата спецификации в формате Y-m-d |
| total_amount | number <decimal> Общая сумма спецификации |
| scope_items | Array of strings Перечень работ/услуг в спецификации |
| status | string Enum: "draft" "approved" "archived" Статус спецификации |
{- "status": "approved"
}{- "id": 25,
- "number": "SPEC-2024-001-REV2",
- "spec_date": "2024-12-22",
- "total_amount": 185000,
- "status": "approved",
- "scope_items": [
- "Кирпичная кладка стен (исправленный объем)",
- "Устройство монолитного перекрытия",
- "Штукатурные работы внутренние и внешние"
], - "updated_at": "2024-12-22T16:45:00Z"
}Удаляет спецификацию из системы (soft delete). Удаленная спецификация не будет отображаться в списках, но сохранится в базе данных для целостности данных.
| id required | integer Example: 25 ID спецификации для удаления |
{- "message": "Спецификация не найдена"
}