geekcodev / laravel-commercejson
CommerceJSON v1.0.8 integration package for Laravel 12
dev-main
2026-04-30 12:05 UTC
Requires
- php: ^8.4
- guzzlehttp/guzzle: ^7.9
- laravel/framework: ^v13.0
- spatie/laravel-data: ^4.0
- symfony/yaml: ^8.0
Requires (Dev)
- laravel/pint: ^1.0
- orchestra/testbench: ^11.0
- phpstan/phpstan: ^1.0
- phpunit/phpunit: ^11.0
README
Пакет для интеграции с CommerceJSON API v1.0.8 в Laravel 12+. Предназначен для обмена данными с системами 1С и другими ERP-системами, поддерживающими стандарт CommerceJSON.
Оглавление
- Возможности
- Установка
- Использование
- Архитектура
- Тестирование
- Документация
- Конфигурация
- Синхронизация
- Обработка ошибок
- Очереди заданий
- Чеклист для production
- История версий
- Лицензия
- Поддержка
- Ссылки
Возможности
- HTTP-клиент с поддержкой повторных запросов, идемпотентности и пагинации
- 23 модели Eloquent с отношениями и приведением типов
- 24 миграции базы данных с оптимизированными индексами
- 49 Data-классов для валидации данных
- 6 сервисов для бизнес-логики
- 7 очередей заданий для асинхронных операций
- 7 Artisan-команд для работы через CLI
- 11 событий для интеграции
- Фабрики и сидеры для тестирования
- Полная документация
Установка
composer require geekcodev/laravel-commercejson
Публикация конфигурации и миграций
# Публикация конфигурации php artisan vendor:publish --tag=commercejson-config # Публикация миграций php artisan vendor:publish --tag=commercejson-migrations # Запуск миграций php artisan migrate
Переменные окружения
Добавьте в файл .env:
# CommerceJSON API COMMERCEJSON_BASE_URL=https://api.your-erp.com/v1 COMMERCEJSON_AUTH_TYPE=bearer COMMERCEJSON_AUTH_TOKEN=your-api-token COMMERCEJSON_TIMEOUT=30 COMMERCEJSON_RETRY_ATTEMPTS=3 # Очереди (рекомендуется для production) COMMERCEJSON_QUEUE_ENABLED=true COMMERCEJSON_QUEUE_CONNECTION=redis # Синхронизация COMMERCEJSON_SYNC_SCHEDULE=0 * * * * COMMERCEJSON_INCREMENTAL_SYNC=true # Логирование COMMERCEJSON_LOGGING=true COMMERCEJSON_LOG_CHANNEL=stack COMMERCEJSON_LOG_REQUESTS=false
Использование
Быстрый старт
use GeekCo\CommerceJson\Facades\CommerceJson; // Получить товары $products = CommerceJson::products()->getProducts( page: 1, limit: 100, categoryId: 'uuid-here' ); // Получить заказ $order = CommerceJson::orders()->getOrder($orderId); // Создать заказ $newOrder = CommerceJson::orders()->createOrder($orderData); // Импортировать предложения (цены и остатки) CommerceJson::offers()->importOffers($offerImportData);
Использование сервисов
use GeekCo\CommerceJson\Services\ProductService; use GeekCo\CommerceJson\Services\OrderService; class ProductController extends Controller { public function __construct( private ProductService $productService, private OrderService $orderService ) {} public function index() { $products = $this->productService->getProducts(); return view('products.index', compact('products')); } public function store(OrderCreateData $data) { $order = $this->orderService->createOrder($data); return response()->json($order); } }
Console-команды
# Проверка соединения php artisan commercejson:handshake # Полная синхронизация php artisan commercejson:sync --full # Инкрементальная синхронизация (изменения за последний час) php artisan commercejson:sync --incremental # Импорт товаров php artisan commercejson:import-products --queue # Импорт заказов php artisan commercejson:import-orders --updated-after=2026-01-01T00:00:00Z # Экспорт заказов в ERP php artisan commercejson:export-orders --limit=50
Архитектура
Структура пакета
src/
├── CommerceJsonServiceProvider.php
├── config/
│ └── commercejson.php
├── Http/Client/
│ └── CommerceJsonConnector.php
├── Services/
│ ├── ProductService.php
│ ├── OrderService.php
│ ├── OfferService.php
│ ├── ClassifierService.php
│ ├── WarehouseService.php
│ └── CounterpartyService.php
├── Models/ (23 модели)
├── Data/ (49 DTO-классов)
├── Enums/ (11 перечислений)
├── Jobs/ (7 очередей заданий)
├── Console/Commands/ (7 команд)
├── Events/ (11 событий)
├── Exceptions/ (6 исключений)
├── Facades/
│ └── CommerceJson.php
└── database/
├── migrations/ (24 миграции)
├── factories/ (17 фабрик)
└── seeders/ (7 сидеров)
Таблицы базы данных
24 таблицы:
categories— категории товаров (иерархия)price_types— типы цен (розница, опт, дилер)warehouses— складыproperty_definitions— свойства товаровproperty_values— значения свойствcounterparties— контрагентыcontacts— контактная информацияbank_accounts— банковские счетаrepresentatives— представителиproducts— каталог товаровproduct_variants— варианты товаровproduct_images— изображения товаровoffers— торговые предложенияoffer_prices— цены предложенийstocks— остатки на складахorders— заказы клиентовorder_items— позиции заказовorder_item_taxes— налоги позицийstatus_history_entries— история статусовcustom_attributes— пользовательские атрибутыsignatories— подписанты документовproduct_analogues— аналоги товаровproduct_components— комплектующиеorder_linked_documents— связанные документы
Тестирование
# Запуск всех тестов composer test # Unit-тесты php vendor/bin/phpunit --testsuite=Unit # Feature-тесты php vendor/bin/phpunit --testsuite=Feature # С покрытием (HTML отчёт) composer test:coverage # С покрытием (текстовый отчёт) composer test:coverage-text
После генерации HTML отчёта, откройте coverage/index.html в браузере.
Покрытие кода
Минимальные требования к покрытию:
- Services: 85%
- Models: 80%
- Jobs: 80%
- Console Commands: 75%
- Общее: 80%
См. подробную документацию в COVERAGE.md.
Документация
Доступные методы
ProductService
// Получить товары с пагинацией $products = $productService->getProducts( page: 1, limit: 100, categoryId: 'uuid', isActive: true, updatedAfter: new DateTime('2026-01-01') ); // Получить товар по ID $product = $productService->getProduct($id); // Импортировать товары $result = $productService->importProducts($productsData); // Деактивировать товар $productService->deactivateProduct($id);
OrderService
// Получить заказы $orders = $orderService->getOrders( page: 1, limit: 50, status: 'new', updatedAfter: new DateTime('2026-01-01') ); // Создать заказ $order = $orderService->createOrder($orderCreateData); // Обновить статус заказа $orderService->updateOrderStatus($orderId, 'confirmed'); // Экспортировать новые заказы $exported = $orderService->exportOrders(limit: 50);
События
use GeekCo\CommerceJson\Events\ProductsImported; use GeekCo\CommerceJson\Events\OrderImported; use GeekCo\CommerceJson\Events\SyncCompleted; Event::listen(ProductsImported::class, function ($event) { Log::info("Импортировано {$event->importedCount} товаров"); }); Event::listen(OrderImported::class, function ($event) { // Обработка нового заказа }); Event::listen(SyncCompleted::class, function ($event) { Log::info("Синхронизация завершена за {$event->durationSeconds}с"); });
Конфигурация
// config/commercejson.php return [ 'base_url' => env('COMMERCEJSON_BASE_URL'), 'auth' => [ 'type' => env('COMMERCEJSON_AUTH_TYPE', 'bearer'), 'token' => env('COMMERCEJSON_AUTH_TOKEN'), ], 'timeout' => env('COMMERCEJSON_TIMEOUT', 30), 'retry_attempts' => env('COMMERCEJSON_RETRY_ATTEMPTS', 3), 'exchange' => [ 'mode' => env('COMMERCEJSON_EXCHANGE_MODE', 'auto'), 'batch_size' => [ 'products' => 100, 'offers' => 200, 'orders' => 50, ], 'queue' => [ 'enabled' => env('COMMERCEJSON_QUEUE_ENABLED', true), 'connection' => env('COMMERCEJSON_QUEUE_CONNECTION', 'redis'), ], ], 'sync' => [ 'schedule' => env('COMMERCEJSON_SYNC_SCHEDULE', '0 * * * *'), 'incremental' => [ 'enabled' => env('COMMERCEJSON_INCREMENTAL_SYNC', true), ], ], 'logging' => [ 'enabled' => env('COMMERCEJSON_LOGGING', true), 'channel' => env('COMMERCEJSON_LOG_CHANNEL', 'stack'), ], ];
Синхронизация
Полная синхронизация
# Синхронизация всех данных
php artisan commercejson:sync --full
Инкрементальная синхронизация
# Синхронизация изменений за последний час php artisan commercejson:sync --incremental # Синхронизация изменений с указанной даты php artisan commercejson:sync --incremental --since=2026-01-01T00:00:00Z
Планирование синхронизации
Добавьте в app/Console/Kernel.php:
protected function schedule(Schedule $schedule): void { // Ежечасная инкрементальная синхронизация $schedule->command('commercejson:sync --incremental') ->hourly(); // Еженедельная полная синхронизация $schedule->command('commercejson:sync --full') ->weeklyOn(0, '2:00'); }
Обработка ошибок
use GeekCo\CommerceJson\Exceptions\AuthenticationException; use GeekCo\CommerceJson\Exceptions\ValidationException; use GeekCo\CommerceJson\Exceptions\BusinessException; use GeekCo\CommerceJson\Exceptions\RateLimitException; try { $order = CommerceJson::orders()->createOrder($data); } catch (AuthenticationException $e) { // 401, 403 - Неверные учётные данные Log::error('Ошибка авторизации: ' . $e->getMessage()); } catch (ValidationException $e) { // 400 - Неверные данные foreach ($e->errors() as $error) { Log::error($error); } } catch (BusinessException $e) { // 422 - Бизнес-ошибка Log::error('Бизнес-ошибка: ' . $e->getBusinessCode()); } catch (RateLimitException $e) { // 429 - Слишком много запросов $retryAfter = $e->retryAfter(); // секунд Log::warning("Превышен лимит запросов. Повтор через {$retryAfter}с"); }
Очереди заданий
use GeekCo\CommerceJson\Jobs\Import\ImportProductsJob; use GeekCo\CommerceJson\Jobs\Import\ImportOrdersJob; use GeekCo\CommerceJson\Jobs\Sync\SyncFullJob; // Импорт товаров асинхронно ImportProductsJob::dispatch( page: 1, limit: 100, updatedAfter: now()->subHour() ); // Цепочка заданий ImportProductsJob::dispatch()->chain([ new ImportOrdersJob(), new \GeekCo\CommerceJson\Jobs\Export\ExportOrdersJob(), ]); // Полная синхронизация SyncFullJob::dispatch();
Чеклист для production
- Опубликовать конфигурацию:
php artisan vendor:publish --tag=commercejson-config - Опубликовать миграции:
php artisan vendor:publish --tag=commercejson-migrations - Запустить миграции:
php artisan migrate - Настроить worker очередей для асинхронных операций
- Настроить планирование синхронизации в Kernel.php
- Настроить мониторинг неудачных заданий
- Настроить канал логирования
- Проверить соединение:
php artisan commercejson:handshake - Запустить начальную полную синхронизацию:
php artisan commercejson:sync --full
История версий
1.0.0 (2026-04-24)
- Начальный выпуск
- Поддержка CommerceJSON v1.0.8
- 24 миграции
- 23 модели
- 49 Data-классов
- 6 сервисов
- 7 очередей заданий
- 7 console-команд
- 11 событий
- Полное тестовое покрытие
Лицензия
Пакет распространяется под лицензией MIT.
Поддержка
- Email: geekco@yandex.ru
- Issues: GitHub Issues
- Документация: Wiki