justbetter / laravel-magento-stock
This packages facilitates a generic way to push stock to Magento.
Installs: 9 287
Dependents: 1
Suggesters: 0
Security: 0
Stars: 5
Watchers: 5
Forks: 0
Open Issues: 0
Type:package
Requires
- php: ^8.2
- justbetter/laravel-magento-async: ^1.0
- justbetter/laravel-magento-client: ^2.6.1
- justbetter/laravel-magento-products: ^1.4
- laravel/framework: 11.*
- spatie/laravel-activitylog: ^4.7
Requires (Dev)
- doctrine/dbal: ^3.4
- larastan/larastan: ^2.9
- laravel/pint: ^1.6
- orchestra/testbench: 9.*
- pestphp/pest: ^2.0
- phpstan/phpstan-mockery: ^1.1
- phpunit/phpunit: ^10.0
README
Laravel Magento Stock
This packages facilitates a way to push stock to Magento from a configurable source. Both simple stock and MSI are supported.
Features
This package provides all the logic of pushing stock to Magento. It only requires an implementation for retrieving the stock.
Features:
- Retrieve stock from any source
- MSI support
- Only update stock when there are modifications
- Automatically stop syncing when there are too many errors (configurable)
- Compare stock between Magento and this package
- Supports Magento 2 async bulk requests for updating stock using Laravel Magento Async
- Logs activities using Spatie activitylog
- Checks if Magento products exist using JustBetter Magento Products
Also check out our other Laravel Magento packages! We also have a Magento Client to easily connect Laravel to Magento!
Installation
Require this package: composer require justbetter/laravel-magento-stock
Publish the config
php artisan vendor:publish --provider="JustBetter\MagentoStock\ServiceProvider" --tag="config"
Publish the activity log's migrations:
php artisan vendor:publish --provider="Spatie\Activitylog\ActivitylogServiceProvider" --tag="activitylog-migrations"
Run migrations.
php artisan migrate
TIP: All actions in this package are run via jobs, we recommend Laravel Horizon or another queueing system to run these
Add the following commands to your scheduler.
protected function schedule(Schedule $schedule): void { // Process stocks marked for retrieval / update $schedule->command(\JustBetter\MagentoStock\Commands\ProcessStocksCommand::class)->everyMinute(); // Retrieve all stock daily $schedule->command(\JustBetter\MagentoStock\Commands\Retrieval\RetrieveAllStockCommand::class)->dailyAt('05:00'); // Retrieve modified stock every fifteen minutes, with a small overlap $schedule->command(\JustBetter\MagentoStock\Commands\Retrieval\RetrieveAllStockCommand::class, ['from' => 'now -1 hour'])->everyFifteenMinutes(); }
Laravel Nova
We have a Laravel Nova integration for this package.
Setup
This package requires you to implement a stock repository which is responsible for retrieving stock.
Retrieving stock
Implement the retrieve
method and return a StockData
object that contains the stock fields.
<?php namespace App\Integrations\MagentoStock; use JustBetter\MagentoStock\Repositories\Repository; use JustBetter\MagentoStock\Data\StockData; use JustBetter\MagentoStock\Enums\Backorders; class MyStockRepository extends Repository { public function retrieve(string $sku): ?StockData { // Retrieve stock from your source return StockData::of([ 'sku' => $sku, 'quantity' => 10, 'in_stock' => true, 'backorders' => Backorders::BackordersNotify, ]); } }
Retrieving SKU's
By default the Repository
that you are extending will retrieve the SKU's from justbetter/laravel-magento-products.
If you wish to use this you have to add the commands to your scheduler to automatically import products.
If you have another source for your SKU's you may implement the skus
method yourself.
It accepts an optional carbon instance to only retrieve modified stock.
<?php namespace App\Integrations\MagentoStock; use JustBetter\MagentoStock\Repositories\Repository; use Illuminate\Support\Carbon; use Illuminate\Support\Enumerable; class MyStockRepository extends Repository { public function skus(?Carbon $from = null): ?Enumerable { return collect(['sku_1', 'sku_2']); } }
Configuring the repository
The repository class has a couple of settings that you can adjust:
class BaseRepository { protected string $name = 'Repository'; // How many stocks may be retrieved at once when the process job runs protected int $retrieveLimit = 250; // How many stocks may be updated at once when the process job runs protected int $updateLimit = 250; // How many times an update to Magento may fail before it stops trying protected int $failLimit = 3; // If MSI is enabled protected bool $msi = false; // Enable if the package should update backorders protected bool $backorders = false; }
After you've created and configured the repository you have to set it in your configuration file:
<?php return [ 'repository' => \App\Integrations\MagentoStock\MyStockRepository::class, ];
Usage
To retrieve stock you can use the following commands.
Processing stocks that are marked for retrieval/update
php artisan magento-stock:process
Each stock record has two flags, retrieve
and update
.
This command will dispatch the jobs to run those actions.
It is primarily used for updates, but you can implement the retrieve flag in your application to slow down retrievals.
Retrieving stock for a single SKU
php artisan magento-stock:retrieve {sku}
This will directly pass the SKU to your repository and process the result. If the stock has been modified it will set the update flag.
Retrieving stock for all or modified SKU's
php artisan magento-stock:retrieve-all {from?}
This will call the skus
method on your repository and dispatch retrieval jobs for all the SKU's that are returned from your repository.
Updating stock for a single SKU
php artisan magento-stock:update {sku}
Updating all stock
php artisan magento-stock:update-all
Comparing stock
php artisan magento-stock:compare
This will compare the stock in Magento and the database table. If it differs it will force an update to Magento.
Magento MSI
If you have Magento MSI enabled you have to return the quantity and status of each source in the repository.
NOTE: Be sure to set the
msi
setting in the repository totrue
!
For example:
<?php namespace App\Integrations\MagentoStock; use JustBetter\MagentoStock\Repositories\Repository; use JustBetter\MagentoStock\Data\StockData; use JustBetter\MagentoStock\Enums\Backorders; class MyStockRepository extends Repository { public function retrieve(string $sku): ?StockData { return StockData::of([ 'sku' => $sku, 'backorders' => Backorders::BackordersNotify, 'msi_status' => [ 'A' => true, // Source A is in stock 'B' => false, // Source B is out of stock ], 'msi_quantity' => [ 'A' => 10, // Source A has qty of 10 'B' => 0, // Source B has qty of 0 ], ]); } }
Comparisons
This feature requires job batching
This package provides a way to compare stock quantities in Magento with those in the Laravel database. If a difference is detected it will start an update for that product.
An event is dispatched when a difference is detected \JustBetter\MagentoStock\Events\DifferenceDetectedEvent
.
Handling failures
When an update fails it will try again. A fail counter is stored with the model which is increased at each failure.
In the repository you can specify how many times the update may be attempted.
You can restart the updates for a product by setting the sync
field in the DB to true.
Quality
To ensure the quality of this package, run the following command:
composer quality
This will execute three tasks:
- Makes sure all tests are passed
- Checks for any issues using static code analysis
- Checks if the code is correctly formatted
Contributing
Please see CONTRIBUTING for details.
Security Vulnerabilities
Please review our security policy on how to report security vulnerabilities.
Credits
License
The MIT License (MIT). Please see License File for more information.