inquid / laravel-stock
Keep stock for Eloquent models
Fund package maintenance!
Patreon
Requires
- php: ^8.0
Requires (Dev)
- orchestra/testbench: ^7.17
- phpunit/phpunit: ^9.5
README
Keep stock for Eloquent models. This package will track stock mutations for your models. You can increase, decrease, clear and set stock. It's also possible to check if a model is in stock (on a certain date/time).
Installation
You can install the package via composer:
composer require inquid/laravel-stock
By running php artisan vendor:publish --provider="Inquid\Stock\StockServiceProvider"
in your project all files for this package will be published. Run php artisan migrate
to migrate the table. There will now be a stock_mutations
table in your database.
The configuration file looks this:
<?php return [ /* |-------------------------------------------------------------------------- | Default table name |-------------------------------------------------------------------------- | | Table name to use to store mutations. | */ 'table' => 'stock_mutations', 'stock_mutation_model' => Inquid\Stock\StockMutation::class, //'special_date_class' => \MongoDB\BSON\UTCDateTime::class, ];
Usage
Adding the HasStock
trait will enable stock functionality on the Model.
Note: If you need to use a custom Model for example for MongoDB you can update the model to use in the config file
stock.php
.
use Inquid\Stock\HasStock; class Book extends Model { use HasStock; }
Basic mutations
$book->increaseStock(10); $book->decreaseStock(10); $book->mutateStock(10); $book->mutateStock(-10);
With warehouse support
$book->increaseStock(10, ['warehouse' => $warehouse_first]); $book->decreaseStock(10, ['warehouse' => $warehouse_first]); $book->mutateStock(10, ['warehouse' => $warehouse_first]); $book->mutateStock(-10, ['warehouse' => $warehouse_first]);
Clearing stock
It's also possible to clear the stock and directly setting a new value.
$book->clearStock(); $book->clearStock(10); // With warehouse $book->clearStock(10, ['warehouse' => $warehouse_first]);
Setting stock
It is possible to set stock. This will create a new mutation with the difference between the old and new value.
$book->setStock(10);
Check if model is in stock
It's also possible to check if a product is in stock (with a minimal value).
$book->inStock(); $book->inStock(10);
With warehouse
$book->inStock(); // anywhere $book->inStock(10); $book->inStock(10, ['warehouse' => $warehouse_first]);
Current stock
Get the current stock value (on a certain date).
$book->stock; $book->stock(Carbon::now()->subDays(10));
Note: If you are using MongoDb you need to set the date class in the config file.
'special_date_class' => \MongoDB\BSON\UTCDateTime::class,
Current stock in specific warehouse
Get the current stock value (on a certain date) in specific warehouse.
$book->stock(null, ['warehouse' =>$warehouse_first]); $book->stock(Carbon::now()->subDays(10), ['warehouse' =>$warehouse_first]);
Move between warehouses
Move amount from source warehouse to destination warehouse.
$book->moveBetweenStocks(5,$warehouse_first, $warehouse_second);
Stock arguments
Add a description and/or reference model to de StockMutation.
$book->increaseStock(10, [ 'description' => 'This is a description', 'reference' => $otherModel, ]);
With warehouse
$book->setStock(10, ['warehouse' => $warehouse_first]);
Query Scopes
It is also possible to query based on stock.
Book::whereInStock()->get(); Book::whereOutOfStock()->get();
Testing
composer test
Contributing
Contributions are welcome, thanks to y'all :)
About Appstract (Original Author)
Appstract is a small team from The Netherlands. We create (open source) tools for Web Developers and write about related subjects on Medium. You can follow us on Twitter, buy us a beer or support us on Patreon.
License
The MIT License (MIT). Please see License File for more information.