- Added the Promotion module with promotions, actions, rules and coupons support
- Changed the
ConfigurableModel::hasConfiguration()
trait to return false on empty arrays as well (until now, onlynull
was considered as no config). It affects the following models:Carrier
CartItem
Channel
OrderItem
PaymentMethod
Shipment
ShippingMethod
TaxRate
- Changed the product and variant Stockable logic so that the derived getters use
onStockQuantity()
andbackorderQuantity()
instead of directstock
andbackorder
field access. This makes possible to override stock logic and remain consistent in extended classes - Changed the
Channelable
trait's MorphToMany relationship definition so that the pivot definitions are explicitly declared - Added the following, v5 interface candidate methods to the Checkout implementations:
addCoupon()
removeCoupon()
hasCoupon()
getCoupons()
hasAnyCoupon()
getPromotionsAmount()
setPromotionsAmount()
- Added the following checkout events:
CouponAdded
(to checkout)CouponRemoved
(from checkout)CouponUtilized
(after a successful checkout converted to an order)PaymentMethodSelected
- Added a listener to update coupon and promo usage after a
CouponUtilized
event (Foundation) - Added a listener to recalculate shipping fees after a
PaymentMethodSelected
event (Foundation) - Added a promotion calculation listener (on CouponAdded and CouponRemoved events)
- Added the
PercentDiscount
adjuster class - Added
domain
field to the orders table - Added then automatic completion of
$order->domain
from the current request to the OrderFactory - Added the
promotions_total
attribute getter to the FoundationOrder
model - Added the search engine and inventory feature configuration wrappers
- Fixed an error when attempting to remove a product from the cart which is not in the by xujiongze in #188
- Fixed the
Channel::getCurrency()
method returning the wrong attribute by Ouail in #189 - Fixed the logic of the payment-dependent shipping fee calculator
- Added the
includeVariants()
method to the ProductSearch classβ οΈ DOES NOT WORK ON POSTGRES (YET)β οΈ - Added the
priceGreaterThan
,priceLessThan
andpriceBetween
methods to the ProductSearch class by Matima in #176 - Added the
Macroable
trait to theProductSearch
class - Added the unidirectional links feature
- Added the
isUnidirectional()
,isOmnidirectional()
andisEmpty()
methods to theLinkGroup
class - Added the
pointsTo()
method to theLinkGroupItem
class - Added the possibility to retrieve the link items directly using
linkItems()
method asGet::the($type)->linkItems()->of($model)
- Added the
link_items
helper, shortcut to Get::the()->linkItems() - Added the possibility to force new link group creation using the
new()
method of theEstablish
class - Added support for configurable decimal separator used by the
format_price()
helper function - Added the discountable shipping fee calculator
- Added the
taxes_total
,shipping_total
andtotal
attribute getters to the FoundationOrder
model - Added the follwing getters to the default Billpayer model (proxies down to the underlying address):
country_id
province_id
postalcode
city
street_address
(fetches $billpayer->address->address) - can't useaddress
since that collides with the address() relationaddress2
access_code
- Added the following content fields to the Taxon model/table:
subtitle
excerpt
description
top_content
bottom_content
- Changed the offline payment gateway's icon from a circle to a plug+x
- Fixed the possible missing configuration copy from cart_items to order_items in the OrderFactory
- Removed the Doctrine DBAL dependency
- Dropped PHP 8.0 & PHP 8.1 Support
- Dropped Laravel 9 Support
- Dropped Enum v3 Support
- Added PHP 8.3 Support
- Added Laravel 11 Support
- Changed minimum Laravel version to v10.43
- Changed minimal Enum requirement to v4.2
- Changed minimal Address module requirement to v3.3
- Upgraded to Konekt Address, Customer and User modules to v3
- Upgraded to Laravel Media Library v11
- Removed the Vanilo v2
Framework
namespace compatibility layer - Removed the throwing of
CartUpdated
event when destroying a cart (CartDeleting
andCartDeleted
remains) - Removed the deprecated
BuyableImageSpatieV7
andBuyableImageSpatieV8
traits - Added the
SimpleTaxDeduction
adjuster - Added Cart item configuration support (different configurations constitute separate cart items) to the
Cart::addItem()
method - Added the
currency
field to the orders table - Added the following fields to the Channel model/table:
currency
language
domain
- billing fields (emitter's data)
billing_zone_id
shipping_zone_id
theme
color
- Added
ProductSearch
features:- added the optional $limit parameter to the
getResults()
method - added the
orderBy()
method - added the
slugEquals()
method: it takes into account other query parameters as well, whereas the findBySlug solely queries by the given slug
- added the optional $limit parameter to the
- Added the
payment_method_id
to the orders table - Added the processing of the
payment_method_id
field to the OrderFactory (Foundation) - Added the
BillpayerChanged
checkout event - Added the
is_hidden
field to theProperty
model - Changed the behavior of assignPropertyValues/assignPropertyValue methods so that it throws an
UnknownPropertyException
when passing an inexistent property slug - Added the
withImages
andwithChannels
methods to the product search class (eager loads media) - Added the
channelables
table for being many-to-many polymorphic relationships with channels and arbitrary models - Added the
mapInto()
method to theRelationAdjustmentCollection
class, which forwards the call to the underlying Eloquent collection - Added the
Zoneable
support to the Foundation PaymentMethod class - Added the
Channelable
behavior to Foundation Product, MasterProduct, PaymentMethod, ShippingMethod and Taxonomy classes - Added and extended Foundation Channel model that contains the known relationships to the "channelable" models
- Added the
withinChannel[s]
methods to the ProductSearch class - Added the
Features
accessor class, which is a syntactic sugar for areas of the configuration - Added
isZoneRestricted()
&isNotZoneRestricted()
helper methods to theShippingMethod
class - Added the payment dependent shipping fee calculator
- Added the
units_sold
and thelast_sale_at
attributes to the master product model (SUM/MAX from variants) - Added the
Stockable
interface (Contracts) - Added the
Stockable
interface to theProduct
andMasterProductVariant
models - Added the
backorder
field to products and product variants - Added the
type
field to the TaxCategory model - Added the
Taxable
interface - Added the
Taxable
implementation to Foundation's CartItem, Product and MasterProductVariant classes - Added the extendable
TaxEngine
(facade) that can resolve tax rates from taxables, billing/shipping addresses (a place for various country-specific taxation drivers) - Added the
Merchant
interface - Added the
DefaultTaxCalculator
class - calculates simply by rate - Added the
DeductiveTaxCalculator
class similar to the default one, but it deducts the amount - Added the
CalculateTaxes
listener to cart update and shipping address change events - Added the
Merchant
DTO class, that complies with the common, v4Merchant
interface - Added the
Address
DTO class (implements theAddress
interface) - Added the
AdjusterAliases
class that for decoupling FQCNs from the database - Added automatic mapping of adjuster FQCN <-> aliases when saving an adjustment into the DB and when calling the
getAdjuster()
method - Added the
itemsPreAdjustmentTotal()
method to the Foundation's adjustable Cart model - Added the
replacePropertyValues()
andreplacePropertyValuesByScalar()
methods to theHasPropertyValues
trait - BC: Added the following methods to the
PropertyValue
interface:findByPropertyAndValue()
getByScalarPropertiesAndValues()
- BC: Added the mixed return type to the
getCastedValue
method of thePropertyValue
interface - BC: Added the
findBySku()
method to theProduct
andMasterProductVariant
interfaces - BC: The
MasterProduct
interface no longer extends theProduct
interface - BC: The
Checkout
interface now extends theArrayAccess
and theShippable
interfaces (until here, only the concrete classes have implementation it) - BC: Added cart and order item models to the Relation morph map: the
adjustable_type
field in theadjustments
table needs to be converted! - BC: Added the
?CheckoutSubject
return type to thegetCart()
method of theCheckout
interface - BC: Changed
Checkout::getShippingAddress()
return type to be nullable - BC: Added the void return type to
Checkout::setShippingAddress()
- BC: Added the following methods to the Checkout interface:
removeShippingAddress()
getShipToBillingAddress()
setShipToBillingAddress()
getShippingMethodId()
setShippingMethodId()
getPaymentMethodId()
setPaymentMethodId()
getNotes()
setNotes()
clear()
getShippingAmount()
setShippingAmount()
getTaxesAmount()
setTaxesAmount()
itemsTotal()
- BC: The unused
$config
parameter has been removed from theRequestStore
checkout driver constructor - BC: Removed the following traits from the Checkout module:
HasCart
ComputesShipToName
FillsCommonCheckoutAttributes
- BC: Added the
deleteByType()
andclear()
methods to theAdjustmentCollection
interface - BC: Added the
getAddress2()
method to theAddress
interface - BC: The
Adjustable::itemsTotal()
has been renamed topreAdjustmentTotal()
- BC: The
invalidateAdjustments()
method has been added to theAdjustable
interface - BC: The
exceptTypes()
method has been added to theAdjustmentCollection
interface - BC: The
AdjustmentType
interface extends theEnumInterface
- BC: Added the
isNotIncluded()
method to theAdjustment
interface - BC: Changed the behavior of
AdjustmentCollection::total()
:- it ignores "included" adjustments by default,
- to incorporate the "included" adjustments pass true to the method:
$adjustments->total(withIncluded: true)
- BC: Changed the
TaxRate
interface so that it extends theConfigurable
interface - BC: Added the
itemsTotal()
method to theCheckoutSubject
interface - BC: Added argument and return types to all
Cart
andCartManager
interface methods - BC: Added the
findOneByZoneAndCategory
static method to theTaxRate
interface - BC: Changed the ShippingFeeCalculator, Carrier and Shipment interfaces to Configurable & Schematized
- BC: Changed the
CheckoutSubjectItem
interface into Configurable & Schematized - BC: Added the
$hooks
and$itemHooks
parameters to theOrderFactory
interface - BC: Changed the
OrderItem
interface into Configurable - BC: Added 7 methods to the
OrderItem
interface - BC: Added the
getLanguage()
,getFulfillmentStatus()
anditemsTotal()
methods to theOrder
interface - BC: Added to float return type to the
total()
method of theOrder
interface - BC: The
OrderStatus
andFulfillmentStatus
interfaces extend theEnumInterface
- BC: Added the
getConfigurationSchema()
method to theConfigurable
interface - BC: Changed the
PaymentMethod
interface into Configurable - BC: Added the
getRemoteId()
method to thePaymentRequest
interface - BC: Added the following methods to the
Payment
interface:getSubtype()
hasRemoteId()
getRemoteId()
isOffline()
- BC: Added the
getTransactionAmount()
method to thePaymentResponse
interface - BC: Added the
transactionHandler()
method to thePaymentGateway
interface (experimental feature) - BC: Added the
svgIcon()
static method to thePaymentGateway
interface - BC: Added the following methods to the
Payable
interface:getNumber()
getPayableRemoteId()
setPayableRemoteId()
findByPayableRemoteId()
hasItems()
getItems()
- BC: The return type of the
getNumber()
method of the Order interface is no longer nullable - BC: Added the
getCalculator()
&estimate()
methods to theShippingMethod
interface - BC: The
Channel
interface extends theConfigurable
interface - BC: Added the following methods to the
Channel
interface:getLanguage()
getCurrency()
getDomain()
getMerchant()
getBillingCountries()
getShippingCountries()
- Deprecated the
PaymentMethod::getConfiguration()
in favor ofconfiguration()
- Deprecated the
PaymentResponse::getAmountPaid()
method in favor ofgetTransactionAmount()
- Added a series of experimental transaction-style interfaces. They shouldn't be used yet, but have been added so that they can be implemented during the v4.x lifecycle without breaking existing implementations
- Added the
Schematized
interface - Added the nette/schema package requirement (v1.2.5+)
- Fixed possible null return type on Billpayer::getName() when is_organization is true but the company name is null
- Fixed the remnant orphan cart adjustments in the database during cart to order transformation
- Fixed the PHP
IteratorAggregate
,ArrayAccess
andCountable
interfaces-related deprecation notices
- Fixed the hinting of
Taxon
interface in theProductSearch
class (#163) - Changed the visibility of
ProductSearch
properties fromprivate
toproteced
(#161)
- Added the
ofUser()
scope to the base Order model - Added missing Payment Status magic comparison annotations to the interface/model
- Added the
hasRemoteId()
,getRemoteId()
andisOffline()
helper methods to the Payment model (v4 interface candidates) - Added the
link_type_exists()
helper function (to be used in blade templates)
- Added the
is_master_product_variant()
helper function - Added the
ProductSearch::findBySlugOrFail()
method - Changed the
ProductSearch::findBySlug()
method to be static (it's backwards compatible)
- Added the
OrderProcessingStarted
event - Added the following order item events:
OrderItemShipped
,OrderItemPickedUp
,OrderItemsIsReadyForDelivery
,OrderItemsIsReadyForPickup
andOrderItemHasBeenPutOnHold
- Changed the visibility of the
OrderFactory::callHook
method fromprivate
toprotected
- Added the Taxes module with: Tax Categories, Tax Rates and calculators
- Added
tax_category_id
field to products/master products/variants - Added the
SimpleTax
adjuster (it calculates the tax amount based on a flat rate in %) - Added the extended
CartItem
andOrderItem
models to Foundation that areAdjustable
- Added the
fromKeyValuePairs
static factory andgetDetail()
methods to the DetailedAmount Dto class - Added the
carrier_cost
,label_url
andlabel_base64
fields to the shipments table/model - Added feature to assign shipments to order items, and vice versa (Foundation)
- Added optional hooks (callbacks) support to order items creation in the order factory class
- Added item adjustments total to the order grand total (Foundation)
- Added the
benefit
adjustment type - Added the experimental
ProductSearch
class to replace ProductFinder with a multi-model (products + masters) variant- Added the required konekt/search v1.2+ dependency
- Changed the minimal Address module requirement to v2.7.1
- Added getRemoteId to NullRequest (PaymentRequest interface v4 method candidate)
- Added testing against MySQL 8.0 (besides v5.7)
- Fixed the shipping adjustment's undesired JSON->string conversion when cloning the cart adjustment to the order
- Fixed the missing locking of shipping adjustments on orders
- Fixed the missing foreign key between
shipping_methods.zone_id
and thezones
table
- Fixed the
ConfigurableModel
trait to handle json strings and other arrayable fields in the underlying model - Fixed possibly incorrect zone member and shipping method list due to a bug in v2.5.0 of the Address module (bump to v2.5.1)
- Added Laravel 10 support
- Added the
CartCreated
,CartUpdated
,CartDeleted
andCartDeleting
events - Added master product & variant (Foundation) to the morph map
- Added the
processing
order status enum value - Added the
ready_for_pickup
fulfillment status enum value - Added the
DetailedAmount
interface (Contracts) and its Dto (Support) - Added Zone support to shipping methods (optional)
- Added the
Order::getLanguage()
method - Added the
ShippingMethodSelected
checkout event - Added Shipping fee calculator support
- Added the flat fee shipping fee calculator (Foundation)
- Added a listener (Foundation) that calculates the shipping fee on checkout shipping method change
- Added the following fields as recognized, regular fields of the checkout:
shipping_method_id
payment_method_id
ship_to_billing_address
notes
- Added
ArrayAccess
to the CheckoutManager and to the Checkout Stores - Added
Shippable
to the CheckoutManager and to the Checkout Stores - Added the
vanilo.checkout.default.weight_unit
config key which defaults to 'kg' - Added the following methods to the Checkout implementations (Manager, Stores but not the interfaces):
getShipToBillingAddress()
setShipToBillingAddress()
getShippingMethodId()
setShippingMethodId()
getPaymentMethodId()
setPaymentMethodId()
getShippingAmount()
setShippingAmount()
getTaxesAmount()
setTaxesAmount()
getNotes()
setNotes()
- Added optional hooks (callbacks) support to the
OrderFactory::createFromDataArray()
method - Added
payable_remote_id
field with getter/setter methods to the Foundation Order model - Added implementation of the
Adjustable
interface to the Foundation Order model - Added the copying of checkout/cart adjustments to the order created by the Foundation OrderFactory
- Added
int
cast to OrderItem::quantity property - Added
dimensions()
andhasDimensions()
methods to theMasterProductVariant
model Added theDimension
DTO class in the support module (provides a default implementation for the same name interface) - Added the vanilo/support ^3.6 dependency to the Product module
- Added the
subtype
field and thegetSubtype()
method to thePayment
model - Added the
DeleteCartAdjustments
listener onCartDeleting
event - Added the
CalculateShippingFees
listener connected to shipping address/method change and cart updated events - Added the
clear()
method toAdjustmentCollection
implementations - Added the
invalidateAdjustments()
method toAdjustable
implementations - Added the
shippingAdjustmentsTotal()
,taxAdjustmentsTotal()
andpromotionAdjustmentsTotal()
methods to the Adjustable Cart model in foundation - Refactored the internals of the Checkout stores (session and request)
- Changed the return value of
Product::dimension()
to be aDimension
object from the support package instead of an anonymous class object - Changed minimum Address module requirement to v2.5
- Fixed the data loss issue when using the session checkout driver with cookie session driver in Laravel
- Fixed non-standard migration name in the order module
- Added the
description
andstate
fields to the master product variants table - Added the Address comparison utility
- Added the
reference_number
field to the shipments model - Added the
shippables
many-to-many, polymorphic relationship.
It allows all the following scenarios:
a) shipping one order in one shipment
b) shipping one order in multiple shipments
c) shipping multiple orders in one shipment - Added
Shipment::orders
andOrder::shipments
to the Foundation models - Added the
FulfillmentStatus
enum to the Orders module - Added
fulfillment_status
to theorders
andorder_items
tables - Added
language
field to orders - Added
ordered_at
field to orders (defaults tocreated_at
unless explicitly specified) - Added
shippingMethod
andcustomer
fields/relations to the extended (Foundation) Order model - Changed the random number algo in
TimeHash
generator frommt_rand
torandom_int
for a decreased collision probability - Fixed the
Carrier::name()
method to overcome accessor infinite loop - Fixed the address creation with order factory when passing an explicit address type
- Fixed the missing shipment module from foundation module config
- Added the
MasterProdcutVariant::findBySku()
method - Added the
Product::findBySku()
method - Added the
ConfigurableModel
trait - Added processing of
configuration
to the order factory, if the checkout item is a configurable - Added
Configurable
to theCartItem
model (incl. implementing the interface) - Added
Configurable
to theOrderItem
model (incl. implementing the interface) - Added the
Configurable
interface - Added
Configurable
interface to thePaymentMethod
model - Added the missing
ShippingMethod
interface and proxy - Added
Configurable
interface to theCarrier
,Shipment
andShippingMethod
models - Changed the
Carrier
,Shipment
andShippingMethod
models to use theConfigurableModel
trait - Changed the
PaymentMethod
model to use theConfigurableModel
trait - Fixed missing required argument from checkout drivers using the
update()
method
- Fixed the session checkout store persistence error
- Fixed float conversion of master product variant fields (price, original price and dimensions)
- Changed the product stock field to be cast to float
- Removed the Buyable interface/trait from
Foundation\MasterProduct
- it was conceptually wrong; - Added
Buyable
toFoundation\MasterProductVariant
- Added the
Product::findBySku()
method to the base product class - Added the
MasterProdcutVariant::findBySku()
method
- Added forwarding/proxying of method calls and property getters from the Checkout manager to the underlying store
- Added
is_active
flag to shipping methods - Added
Cart::fresh()
method to the Cart facade - Added the
is_master_product()
helper function (Foundation) - Added the
MasterProduct::actives()
andinactives()
query builder scopes - Added the
Product::inactives()
query builder scope - Added an extended
MasterProduct
model (Foundation) - Changed checkout store resolution to happen via the Laravel DI instead of
new SpecificStoreClass()
- Changed both built-in checkout stores to save unknown properties as custom attributes on the
update()
method call - Changed minimum Concord version requirement to v1.12
- Fixed missing implementation parts of the checkout session store
- Added the Master Product module
- Added the Adjustments module
- Added the extended Adjustable Cart model to
Foundation
(original Cart model still there, intact) - Added
channel_id
to the extendedOrder
model in Foundation - Added Shipping methods
- Added the
getGatewayName()
method to the PaymentMethod class. It can retrieve the gateway name without instantiating it, thus gateway configuration errors don't affect it - Added the
PropertyValue::findByPropertyAndValue('color', 'red')
finder method - Added the
valueOfProperty()
,assignPropertyValue()
andassignPropertyValues()
methods to theHasPropertyValues
trait - Added the Sluggable behavior to the Channel model
- Added configuration getter and setter methods to the Channel model
- Added PHP 8.2 Support
- Added Enum 4.0 Support
- Changed minimum Laravel requirement to 9.2
- Changed minimum Konekt module requirements to:
- Address: 2.2
- Concord: 1.11
- Customer: 2.3.1
- Enum: 3.1.1
- Laravel Migration Compatibility: 1.5
- User: 2.4
- Added
actives()
andinactives()
scopes to the Carrier model - Fixed the missing
Cart
alias registration when using the entire framework
- Dropped PHP 7.4 Support
- Dropped Laravel 6-8 Support
- Added Laravel 9 Support
- Added PHP 8.1 Support
- Removed Admin from "Framework" - it is available as an optional separate package see vanilo/admin
- Changed minimum Laravel version to 9.0
- BC: Renamed Framework Module and Namespace to "Foundation"
- BC: Removed the
Vanilo\Foundation\Models\PaymentMethod
class. UseVanilo\Payment\Models\PaymentMethod
instead - BC: Renamed
vanilo.framework.*
config values tovanilo.foundation.*
- BC: Added the static
findBySlug(string $slug): ?Property;
method to the Property interface - Added the Shipment Module
- Added the Links Module
- Added
original_price
field to products - Added product dimension (
width
,height
,depth
) andweight
fields
- Upgrade to AppShell v2.2 (minimum requirement)
- Added order print page in admin
- Added payment history to order view page in admin
- Added payment method to order list in admin
- Added show/hide closed orders button to order list in admin
- Added
status_message
field to payment list on order view in admin - Fixed missing query strings in admin paginators
- Improved permission migrations to add flexibility to projects that manage permissions differently
- Improved property value form handling on admin
- Changed internal CS ruleset from PSR-2 to PSR-12
- Changed all classes to declare strict types enabled
- Bumped min Properties module to v2.1.1 to fix type mismatch at
Property::findOneByName()
when using overridden Property model.
- Added PHP 8 support
- Added Spatie Media Library v9 Support
- Added Primary Image feature (products)
- Upgrade to AppShell 2.1
- Refactored image handling
- Added images to taxonomies and taxons
- Added option to define separate image conversions per entity type (product, taxonomy, taxon)
- Added the
HasImages
interface - extracted it from Buyable - Added
Order
model that implements thePayable
- Added Payment method CRUD
- Added dispatching of order cancelled and completed events when updating their status in the admin panel
- Fixed model registration to takes into account Concord's
register_route_models
setting - Switched CI from Travis to Github Actions
- BC: Upgrade to Spatie MediaLibrary v8
- Added Laravel 8 support
- Dropped Laravel 5 support
- Dropped support for PHP 7.2 and PHP 7.3 (due to MediaLibrary)
- Minimum Laravel requirement is v6.18 (due to MediaLibrary)
- Upgrade to AppShell 2.0
- Admin and admin icons are themeable (AppShell 2.0 feature)
- Changed minimum AppShell version to 1.7
- Fixes the "taxons" vs "taxa" permission problem caused by Doctrine Inflector 1.4+
- Added Laravel 7 support
- Added PHP 7.4 support
- Dropped PHP 7.1 support
- Combination of PHP 7.4 & Laravel 5.6|5.7 is not recommended
due to improper order of
implode()
arguments in eloquent-sluggable dependency
- Fixed a bug with Category editing in Admin under Laravel 6
- Added Laravel 6 Support
- Added simple product stock
- Added ProductFinder pagination support
- Added Channel Module
- Fixed migrations fail bug when the
admin
role is not present in the target system
- Technical release: fixed inexistent version constraint (other than that same as 0.5.1)
- Complete Laravel 5.8 support
- Support for Product Properties has been added (via Properties module)
- Using AppShell v1.3
- ProductFinder has been added (supports: taxons, property values and search terms in product name)
- Improved SQLite compatibility in migrations (to fix certain testing scenarios)
- Product image upload validation has been improved
- Added Product Category Support
- Laravel 5.7 Compatibility
- PHP 7.3 Compatibility
- Product sales figures (units sold, last sale date)
- Using AppShell v1.2
- Admin UI fixes & improvements
- Vanilo Address module has been dropped
- Product Image support via Spatie Laravel Media Library v7
- Laravel 5.4 support dropped (due to Spatie Media Library v7 conflicts)
- Concord v1.2, AppShell 0.9.9
- Fixed breaking change with AppShell > v0.9.6
- Laravel 5.6 compatible
- Cart handles user associations
- Admin UI polishes
- Concord v1.1
- Fixed Billpayer related problems
- Checkout => Order works properly
- Order CRUD on admin has been added
- π Yet another E-commerce platform has born π
- π This will be a very good one π