Skip to content

Latest commit

 

History

History
1063 lines (812 loc) · 40.5 KB

UPGRADE.md

File metadata and controls

1063 lines (812 loc) · 40.5 KB

UPGRADE Guide

High Impact Changes

Medium Impact Changes

Low Impact Changes

Upgrading To v2.2.0 From v2.1.0

Note

We strive to document every potential breaking change. However, as some of these alterations occur in lesser-known sections of Bagisto, only a fraction of them may impact your application.

Updating Dependencies

Impact Probability: High

PHP 8.2.0 Required

Laravel now requires PHP 8.1.0 or greater.

curl 7.34.0 Required

Laravel's HTTP client now requires curl 7.34.0 or greater.

Composer Dependencies

There is no dependency needed to be updated at for this upgrade.

Admin

The System Configuration Updates

Impact Probability: Medium

1: The tax configuration has been relocated to the sales configuration, and the respective path for retrieving configuration values has been updated accordingly.

- core()->getConfigData('taxes.catalogue.pricing.tax_inclusive')
+ core()->getConfigData('sales.taxes.calculation.product_prices')

+ core()->getConfigData('sales.taxes.calculation.shipping_prices')

- core()->getConfigData('taxes.catalogue.default_location_calculation.country')
+ core()->getConfigData('sales.taxes.default_destination_calculation.country')

- core()->getConfigData('taxes.catalogue.default_location_calculation.state')
+ core()->getConfigData('sales.taxes.default_destination_calculation.state')

- core()->getConfigData('taxes.catalogue.default_location_calculation.postcode')
+ core()->getConfigData('sales.taxes.default_destination_calculation.postcode')

2: The repository option has been replaced with options. Now, you can use options as shown below to populate select field options from the database.

'key'    => 'sales.taxes.categories',
'name'   => 'admin::app.configuration.index.sales.taxes.categories.title',
'info'   => 'admin::app.configuration.index.sales.taxes.categories.title-info',
'sort'   => 1,
'fields' => [
    [
        'name'       => 'shipping',
        'title'      => 'admin::app.configuration.index.sales.taxes.categories.shipping',
        'type'       => 'select',
        'default'    => 0,
-       'repository' => '\Webkul\Tax\Repositories\TaxCategoryRepository@getConfigOptions',
+       'options'    => '\Webkul\Tax\Repositories\TaxCategoryRepository@getConfigOptions',
}
  1. The Inventory Stock Options configuration has been relocated to the Order Settings configuration, and the respective path for retrieving configuration values has been updated accordingly
- core()->getConfigData('catalog.inventory.stock_options.back_orders')
+ core()->getConfigData('sales.order_settings.stock_options.back_orders')

Renamed Admin API Route Names

Impact Probability: Low

  1. In the packages/Webkul/Admin/src/Routes/sales-routes.php route file, route names and controller methods have been renamed to provide clearer and more meaningful representations.
- Route::post('update-qty/{order_id}', 'updateQty')->name('admin.sales.refunds.update_qty');
+ Route::post('update-totals/{order_id}', 'updateTotals')->name('admin.sales.refunds.update_totals');

Admin Event Updates

Impact Probability: High

Admin Event Inside Head Updated

  1. The event that was previously added in Admin has now been updated in the new format. You can now directly add your own custom elements inside the tag.
+ {!! view_render_event('bagisto.admin.layout.head.before') !!}

- {!! view_render_event('bagisto.admin.layout.head') !!}
+ {!! view_render_event('bagisto.admin.layout.head.after') !!}

Renamed Admin View Render Event Names

Impact Probability: Low

  1. The View render event names have been updated for consistency in the packages/Webkul/Admin/src/Resources/views/dashboard/index.blade.php blade file.
- {!! view_render_event('bagisto.admin.dashboard.overall_detailes.before') !!}
+ {!! view_render_event('bagisto.admin.dashboard.overall_details.before') !!}

- {!! view_render_event('bagisto.admin.dashboard.overall_detailes.after') !!}
+ {!! view_render_event('bagisto.admin.dashboard.overall_details.after') !!}

- {!! view_render_event('bagisto.admin.dashboard.todays_detailes.before') !!}
+ {!! view_render_event('bagisto.admin.dashboard.todays_details.before') !!}

- {!! view_render_event('bagisto.admin.dashboard.todays_detailes.after') !!}
+ {!! view_render_event('bagisto.admin.dashboard.todays_details.after') !!}

Admin Customized Datagrid Parameters Updated

Impact Probability: Medium

  1. Previously, the data grid header was customized using parameters such as columns, records, sortPage, selectAllRecords, applied, and isLoading. However, with the latest updates, the parameter names have been revised for clarity and consistency across components.
- <template #header="{ columns, records, sortPage, selectAllRecords, applied, isLoading}">
-    <!-- Header customization code -->
- </template>
+ <template #header="{
+    isLoading,
+    available,
+    applied,
+    selectAll,
+    sort,
+    performAction
+ }">
+    <!-- Updated header customization code -->
+ </template>
  1. Previously, the data grid body was customized using parameters such as columns, records, setCurrentSelectionMode, applied, and isLoading. However, with the latest updates, the parameter names have been revised for clarity and consistency across components.
- <template #body="{ columns, records, setCurrentSelectionMode, applied, isLoading }">
-    <!-- Updated body customization code -->
- </template>
+ <template #body="{
+    isLoading,
+    available,
+    applied,
+    selectAll,
+    sort,
+    performAction
+ }">
+    <!-- Updated body customization code -->
+ </template>

Checkout

The Checkout Tables Schema Updates

Impact Probability: Medium

1: New columns related to managing inclusive tax have been added to the cart table.

+ Schema::table('cart', function (Blueprint $table) {
+     $table->decimal('shipping_amount', 12, 4)->default(0)->after('base_discount_amount');
+     $table->decimal('base_shipping_amount', 12, 4)->default(0)->after('shipping_amount');
+ 
+     $table->decimal('shipping_amount_incl_tax', 12, 4)->default(0)->after('base_shipping_amount');
+     $table->decimal('base_shipping_amount_incl_tax', 12, 4)->default(0)->after('shipping_amount_incl_tax');
+ 
+     $table->decimal('sub_total_incl_tax', 12, 4)->default(0)->after('base_shipping_amount_incl_tax');
+     $table->decimal('base_sub_total_incl_tax', 12, 4)->default(0)->after('sub_total_incl_tax');
+ });

2: New columns related to managing inclusive tax have been added to the cart_items table.

+ Schema::table('cart_items', function (Blueprint $table) {
+     $table->decimal('price_incl_tax', 12, 4)->default(0)->after('base_discount_amount');
+     $table->decimal('base_price_incl_tax', 12, 4)->default(0)->after('price_incl_tax');
+ 
+     $table->decimal('total_incl_tax', 12, 4)->default(0)->after('base_price_incl_tax');
+     $table->decimal('base_total_incl_tax', 12, 4)->default(0)->after('total_incl_tax');
+ 
+     $table->string('applied_tax_rate')->nullable()->after('base_total_incl_tax');
+ });

3: New columns related to managing inclusive shipping tax have been added to the cart_shipping_rates table.

+ Schema::table('cart_shipping_rates', function (Blueprint $table) {
+     $table->decimal('tax_percent', 12, 4)->default(0)->after('base_discount_amount');
+     $table->decimal('tax_amount', 12, 4)->default(0)->after('tax_percent');
+     $table->decimal('base_tax_amount', 12, 4)->default(0)->after('tax_amount');
+ 
+     $table->decimal('price_incl_tax', 12, 4)->default(0)->after('base_tax_amount');
+     $table->decimal('base_price_incl_tax', 12, 4)->default(0)->after('price_incl_tax');
+ 
+     $table->string('applied_tax_rate')->nullable()->after('base_price_incl_tax');
+ });

The Webkul\Checkout\Models\Cart model

Impact Probability: Medium

  1. The addresses method has been removed. It was previously utilized in the billing_address and shipping_address methods. We have now revised both the billing_address and shipping_address relationships, rendering the addresses method unnecessary.
- public function addresses(): \Illuminate\Database\Eloquent\Relations\HasMany
- {
-     return $this->hasMany(CartAddressProxy::modelClass());
- }
  1. We have revised the billing_address method to return a HasOne object instead of a HasMany object. Additionally, we have removed the getBillingAddressAttribute accessor, as the billing_address method now methods identically to it.
- public function billing_address(): \Illuminate\Database\Eloquent\Relations\HasMany
- {
-     return $this->addresses()
-         ->where('address_type', CartAddress::ADDRESS_TYPE_BILLING);
- }
+ public function billing_address(): \Illuminate\Database\Eloquent\Relations\HasOne
+ {
+     return $this->hasOne(CartAddressProxy::modelClass())->where('address_type', CartAddress::ADDRESS_TYPE_BILLING);
+ }

- public function getBillingAddressAttribute()
- {
-     return $this->billing_address()->first();
- }
  1. We have revised the shipping_address method to return a HasOne object instead of a HasMany object. Additionally, we have removed the getShippingAddressAttribute accessor, as the shipping_address method now methods identically to it.
- public function shipping_address(): \Illuminate\Database\Eloquent\Relations\HasMany
- {
-     return $this->addresses()
-         ->where('address_type', CartAddress::ADDRESS_TYPE_SHIPPING);
- }
+ public function shipping_address(): \Illuminate\Database\Eloquent\Relations\HasOne
+ {
+     return $this->hasOne(CartAddressProxy::modelClass())->where('address_type', CartAddress::ADDRESS_TYPE_SHIPPING);
+ }

- public function getShippingAddressAttribute()
- {
-     return $this->shipping_address()->first();
- }
  1. We have updated the shipping_rates method to return a HasMany object instead of a HasManyThrough object, as shipping rates are now directly associated with the cart.
- public function shipping_rates(): \Illuminate\Database\Eloquent\Relations\HasManyThrough
- {
-     return $this->hasManyThrough(CartShippingRateProxy::modelClass(), CartAddressProxy::modelClass(), 'cart_id', 'cart_address_id');
- }
+ public function shipping_rates(): \Illuminate\Database\Eloquent\Relations\HasMany
+ {
+     return $this->hasMany(CartShippingRateProxy::modelClass());
+ }

Removed Cart Traits

Impact Probability: Low

All methods from the following traits have been relocated to the Webkul\Checkout\Cart class, and the traits have been removed.

  • Webkul\Checkout\Traits\CartCoupons trait
  • Webkul\Checkout\Traits\CartTools trait
  • Webkul\Checkout\Traits\CartValidators trait

The Webkul\Checkout\Cart class

Impact Probability: High

  1. The initCart method now accepts an optional Webkul\Customer\Models\Customer model instance and initializes the cart based on this parameter.
- public function initCart()
+ public function initCart(?CustomerContract $customer = null): void
  1. The getCart method now exclusively returns the cart itself, meaning it will no longer retrieve the current cart.

  2. We have updated the addProduct method to accept the Webkul\Product\Models\Product model instance as the first parameter instead of the product ID.

- public function addProduct($productId, $data)
+ public function addProduct(ProductContract $product, array $data): Contracts\Cart|\Exception
  1. We've renamed the create method to createCart
- public function create($data)
+ public function createCart(array $data): ?Contracts\Cart
  1. The emptyCart method has been renamed to removeCart, and it now accepts a cart model instance.
- public function emptyCart()
+ public function removeCart(Contracts\Cart $cart): void
  1. We have introduced a new method called refreshCart. This method retrieves a refreshed cart instance from the database.
+ public function refreshCart(): void
  1. The putCart method previously found in CartTools has been eliminated. It is now managed within the setCart method in the Webkul\Checkout\Cart class.
- public function putCart($cart)
  1. We've enhanced the mergeCart method to now accept an instance of the Webkul\Customer\Models\Customer model. Previously, we merged the guest cart with the logged-in customer's cart by fetching the current customer within this method. However, it now directly accepts the Webkul\Customer\Models\Customer model instance.
- public function mergeCart(): void
+ public function mergeCart(CustomerContract $customer): void
  1. The saveCustomerDetails method has been renamed to setCustomerPersonnelDetails
- public function saveCustomerDetails(): void
+ public function setCustomerPersonnelDetails(): void
  1. We have removed the following methods and relocated the cart data transformation to a separate resource class named Webkul\Sales\Transformers\OrderResource.
- public function prepareDataForOrder(): array

- public function prepareDataForOrderItem(): array

- public function toArray(): array
  1. The collectTotals method now returns a self instance instead of void, allowing for chaining multiple methods with the Cart facade.
- public function collectTotals(): void
+ public function collectTotals(): self

DataGrid

The Webkul\DataGrid\DataGrid Class

Impact Probability: Medium

  1. We have made some of the methods in this class private. Here are the methods, please have a look.
- public function validatedRequest(): array
+ private function validatedRequest(): array

- public function processRequestedFilters(array $requestedFilters)
+ private function processRequestedFilters(array $requestedFilters)

- public function processRequestedSorting($requestedSort)
+ private function processRequestedSorting($requestedSort)

- public function processRequestedPagination($requestedPagination): LengthAwarePaginator
+ private function processRequestedPagination($requestedPagination): LengthAwarePaginator

- public function processRequest(): void
+ private function processRequest(): void

- public function sanitizeRow($row): \stdClass
+ private function sanitizeRow($row): \stdClass

- public function formatData(): array
+ private function formatData(): array

- public function prepare(): void
+ private function prepare(): void
  1. We have deprecated the 'toJson' method. Instead of 'toJson', please use the 'process' method.
- app(AttributeDataGrid::class)->toJson();
+ datagrid(AttributeDataGrid::class)->process();

Notification

The Webkul\Notification\Repositories\NotificationRepository Repository

Impact Probability: Medium

  1. We've made revisions to the getAll method to allow for optional parameters.
- public function getAll()
+ public function getAll(array $params = [])

Product

Impact Probability: Medium

The Webkul\Product\Repositories\ElasticSearchRepository Repository

  1. We have enhanced the search method to accept two arguments. The first argument is an array containing the search parameters (e.g., category_id, etc.), while the second argument is an array containing the options.
- public function search($categoryId, $options)
+ public function search(array $params, array $options): array
  1. We've enhanced the getFilters method to now accept an array of parameters, as request parameters will originate from the search method itself.
- public function getFilters()
+ public function getFilters(array $params): array

The Webkul\Product\Repositories\ProductRepository Repository

Impact Probability: Medium

  1. We've made revisions to the getAll method to allow for optional search parameters.
- public function getAll()
+ public function getAll(array $params = [])
  1. We've made revisions to the searchFromDatabase method to allow for optional search parameters.
- public function searchFromDatabase()
+ public function searchFromDatabase(array $params = [])
  1. We've made revisions to the searchFromElastic method to allow for optional search parameters.
- public function searchFromElastic()
+ public function searchFromElastic(array $params = [])

The Product Types Classes Updates

If you've implemented your own product type or overridden existing type classes, you'll need to update the following methods to include inclusive tax management.

Impact Probability: Low

1: The evaluatePrice and getTaxInclusiveRate methods have been removed. Please update your getProductPrices method accordingly to no longer use these methods.

- public function evaluatePrice($price)

- public function getTaxInclusiveRate($totalPrice)

2: Please update your prepareForCart and validateCartItem methods to include the *_incl_tax columns for managing inclusive tax calculation for your product type. You can refer to the Webkul\Product\Type\AbstractType class and adjust your class accordingly.

The Webkul\Product\Type\Configurable Class

Impact Probability: High

  1. We've removed the following methods from the Webkul\Product\Type\Configurable class as we no longer support default configurable variants.
- public function getDefaultVariant()

- public function getDefaultVariantId()

- public function setDefaultVariantId()

- public function updateDefaultVariantId()

Sales

The Sales Tables Schema Updates

Impact Probability: Medium

1: New columns related to managing inclusive tax have been added to the orders table.

+ Schema::table('orders', function (Blueprint $table) {
+     $table->decimal('shipping_tax_amount', 12, 4)->default(0)->after('base_shipping_discount_amount');
+     $table->decimal('base_shipping_tax_amount', 12, 4)->default(0)->after('shipping_tax_amount');
+ 
+     $table->decimal('shipping_tax_refunded', 12, 4)->default(0)->after('base_shipping_tax_amount');
+     $table->decimal('base_shipping_tax_refunded', 12, 4)->default(0)->after('shipping_tax_refunded');
+ 
+     $table->decimal('sub_total_incl_tax', 12, 4)->default(0)->after('base_shipping_tax_refunded');
+     $table->decimal('base_sub_total_incl_tax', 12, 4)->default(0)->after('sub_total_incl_tax');
+ 
+     $table->decimal('shipping_amount_incl_tax', 12, 4)->default(0)->after('base_sub_total_incl_tax');
+     $table->decimal('base_shipping_amount_incl_tax', 12, 4)->default(0)->after('shipping_amount_incl_tax');
+ });

2: New columns related to managing inclusive tax have been added to the order_items table.

+ Schema::table('order_items', function (Blueprint $table) {
+     $table->decimal('price_incl_tax', 12, 4)->default(0)->after('base_tax_amount_refunded');
+     $table->decimal('base_price_incl_tax', 12, 4)->default(0)->after('price_incl_tax');
+
+     $table->decimal('total_incl_tax', 12, 4)->default(0)->after('base_price_incl_tax');
+     $table->decimal('base_total_incl_tax', 12, 4)->default(0)->after('total_incl_tax');
+ });

3: New columns related to managing inclusive tax have been added to the invoices table.

+ Schema::table('invoices', function (Blueprint $table) {
+     $table->decimal('shipping_tax_amount', 12, 4)->default(0)->after('base_discount_amount');
+     $table->decimal('base_shipping_tax_amount', 12, 4)->default(0)->after('shipping_tax_amount');
+ 
+     $table->decimal('sub_total_incl_tax', 12, 4)->default(0)->after('base_shipping_tax_amount');
+     $table->decimal('base_sub_total_incl_tax', 12, 4)->default(0)->after('sub_total_incl_tax');
+ 
+     $table->decimal('shipping_amount_incl_tax', 12, 4)->default(0)->after('base_sub_total_incl_tax');
+     $table->decimal('base_shipping_amount_incl_tax', 12, 4)->default(0)->after('shipping_amount_incl_tax');
+ });

4: New columns related to managing inclusive tax have been added to the invoice_items table.

+ Schema::table('invoice_items', function (Blueprint $table) {
+     $table->decimal('price_incl_tax', 12, 4)->default(0)->after('base_discount_amount');
+     $table->decimal('base_price_incl_tax', 12, 4)->default(0)->after('price_incl_tax');
+     $table->decimal('total_incl_tax', 12, 4)->default(0)->after('base_price_incl_tax');
+     $table->decimal('base_total_incl_tax', 12, 4)->default(0)->after('total_incl_tax');
+ });

5: New columns related to managing inclusive tax have been added to the refunds table.

+ Schema::table('refunds', function (Blueprint $table) {
+     $table->decimal('shipping_tax_amount', 12, 4)->default(0)->after('base_discount_amount');
+     $table->decimal('base_shipping_tax_amount', 12, 4)->default(0)->after('shipping_tax_amount');
+ 
+     $table->decimal('sub_total_incl_tax', 12, 4)->default(0)->after('base_shipping_tax_amount');
+     $table->decimal('base_sub_total_incl_tax', 12, 4)->default(0)->after('sub_total_incl_tax');
+ 
+     $table->decimal('shipping_amount_incl_tax', 12, 4)->default(0)->after('base_sub_total_incl_tax');
+     $table->decimal('base_shipping_amount_incl_tax', 12, 4)->default(0)->after('shipping_amount_incl_tax');
+ });

6: New columns related to managing inclusive tax have been added to the refund_items table.

+ Schema::table('refund_items', function (Blueprint $table) {
+     $table->decimal('price_incl_tax', 12, 4)->default(0)->after('base_discount_amount');
+     $table->decimal('base_price_incl_tax', 12, 4)->default(0)->after('price_incl_tax');
+     $table->decimal('total_incl_tax', 12, 4)->default(0)->after('base_price_incl_tax');
+     $table->decimal('base_total_incl_tax', 12, 4)->default(0)->after('total_incl_tax');
+ });

7: New columns related to managing inclusive tax have been added to the shipment_items table.

+ Schema::table('shipment_items', function (Blueprint $table) {
+     $table->decimal('price_incl_tax', 12, 4)->default(0)->after('base_total');
+     $table->decimal('base_price_incl_tax', 12, 4)->default(0)->after('price_incl_tax');
+ });

Impact Probability: Low

The Webkul\Sales\Repositories\OrderItemRepository Repository

  1. The create method has been removed. Previously, it was overridden to set product_id and product_type for the polymorphic relation between Webkul\Sales\Models\OrderItem and Webkul\Product\Models\Product. Now, this information is obtained from the cart transformer Webkul\Sales\Transformers\OrderResource.
- public function create(array $data)

Shop

Shop Customized Datagrid Parameters Updated

Impact Probability: Medium

  1. Previously, the data grid header was customized using parameters such as columns, records, sortPage, selectAllRecords, applied, and isLoading. However, with the latest updates, the parameter names have been revised for clarity and consistency across components.
- <template #header="{ columns, records, sortPage, selectAllRecords, applied, isLoading}">
-    <!-- Header customization code -->
- </template>
+ <template #header="{
+    isLoading,
+    available,
+    applied,
+    selectAll,
+    sort,
+    performAction
+ }">
+    <!-- Updated header customization code -->
+ </template>
  1. Previously, the data grid body was customized using parameters such as columns, records, setCurrentSelectionMode, applied, and isLoading. However, with the latest updates, the parameter names have been revised for clarity and consistency across components.
- <template #body="{ columns, records, setCurrentSelectionMode, applied, isLoading }">
-    <!-- Updated body customization code -->
- </template>
+ <template #body="{
+    isLoading,
+    available,
+    applied,
+    selectAll,
+    sort,
+    performAction
+ }">
+    <!-- Updated body customization code -->
+ </template>

Shop Event Updates

Impact Probability: Medium

Shop Event Parameter Updated
  1. The event data previously containing an email address has been updated to include an instance of the Webkul\Customer\Models\Customer model.
- Event::dispatch('customer.after.login', $loginRequest->get('email'));
+ Event::dispatch('customer.after.login', auth()->guard()->user());
Shop Event Inside Head Updated

Impact Probability: High

  1. The event that was previously added in Shop has now been updated in the new format. You can now directly add your own custom elements inside the tag.
+ {!! view_render_event('bagisto.shop.layout.head.before') !!}

- {!! view_render_event('bagisto.shop.layout.head') !!}
+ {!! view_render_event('bagisto.shop.layout.head.after') !!}

Renamed Shop API Route Names

Impact Probability: Low

  1. The routes names have been renamed for consistency in the packages/Webkul/Shop/src/Routes/api.php route file.
- Route::get('', 'index')->name('api.shop.customers.account.addresses.index');
+ Route::get('', 'index')->name('shop.api.customers.account.addresses.index');

- Route::post('', 'store')->name('api.shop.customers.account.addresses.store');
+ Route::post('', 'store')->name('shop.api.customers.account.addresses.store');

- Route::put('edit/{id?}', 'update')->name('api.shop.customers.account.addresses.update');
+ Route::put('edit/{id?}', 'update')->name('shop.api.customers.account.addresses.update');

Renamed Shop Controller Method Names

Impact Probability: Low

  1. The controller action names for the following routes have been renamed to ensure consistency with the packages/Webkul/Shop/src/Routes/customer-routes.php route file.
- Route::get('', 'show')->name('shop.customer.session.index');
+ Route::get('', 'index')->name('shop.customer.session.index');

- Route::post('', 'create')->name('shop.customer.session.create');
+ Route::post('', 'store')->name('shop.customer.session.create');

Shop API Response Updates

Impact Probability: High

  1. The response for the Shop route shop.api.checkout.cart.index or /api/checkout/cart API has been updated. If you are consuming this API, please make the necessary changes to accommodate the updated response format.
{
    data: {
        "id": 243,
        "is_guest": 0,
        "customer_id": 1,
        "items_count": 1,
        "items_qty": 1,
-       "base_tax_amounts": [
-           "$0.00"
-       ],
+       "applied_taxes": {
+           "US-AL (10%)": "$10.00"
+       },
-       "base_tax_total": 10,
        "tax_total": 10,
        "formatted_tax_total": "$10.00",
-       "base_sub_total": 100,
        "sub_total": 100,
        "formatted_sub_total": "$100.00",
+       "sub_total_incl_tax": 110,
+       "formatted_sub_total_incl_tax": "$110.00",
        "coupon_code": null,
-       "base_discount_amount": 0,
-       "formatted_base_discount_amount": "$0.00",
        "discount_amount": 0,
        "formatted_discount_amount": "$0.00",
-       "selected_shipping_rate_method": "",
-       "selected_shipping_rate": "$0.00",
+       "shipping_method": "flatrate_flatrate",
+       "shipping_amount": 5,
+       "formatted_shipping_amount": "$5.00",
+       "shipping_amount_incl_tax": "5.0000",
+       "formatted_shipping_amount_incl_tax": "$5.00",
-       "base_grand_total": 115,
        "grand_total": 115,
        "formatted_grand_total": "$115.00",
        "have_stockable_items": true,
        "payment_method": null,
        "payment_method_title": null
        "billing_address": null,
        "shipping_address": null,
        "items": [
            {
                "id": 544,
                "quantity": 1,
                "type": "configurable",
                "name": "OmniHeat Men's Solid Hooded Puffer Jacket",
                "price": "100.0000",
                "formatted_price": "$100.00",
+               "price_incl_tax": "110.0000",
+               "formatted_price_incl_tax": "$110.00",
                "total": "100.0000",
                "formatted_total": "$100.00",
+               "total_incl_tax": "110.0000",
+               "formatted_total_incl_tax": "$110.00",
+               "discount_amount": "0.0000",
+               "formatted_discount_amount": "$0.00",
                "options": [
                    {
                        "option_id": 7,
                        "option_label": "M",
                        "attribute_name": "Size"
                    },
                    {
                        "option_id": 2,
                        "option_label": "Green",
                        "attribute_name": "Color"
                    }
                ],
                "base_image": {
                    "small_image_url": "http://localhost/laravel/bagisto/public/cache/small/product/10/CvW2Q3eP4HNUKpQCjyrMUvnwEypVQZCf1VcLAnH4.webp",
                    "medium_image_url": "http://localhost/laravel/bagisto/public/cache/medium/product/10/CvW2Q3eP4HNUKpQCjyrMUvnwEypVQZCf1VcLAnH4.webp",
                    "large_image_url": "http://localhost/laravel/bagisto/public/cache/large/product/10/CvW2Q3eP4HNUKpQCjyrMUvnwEypVQZCf1VcLAnH4.webp",
                    "original_image_url": "http://localhost/laravel/bagisto/public/cache/original/product/10/CvW2Q3eP4HNUKpQCjyrMUvnwEypVQZCf1VcLAnH4.webp"
                },
                "product_url_key": "omniheat-mens-solid-hooded-puffer-jacket"
            }
        ]
    }
}
  1. The response for the Shop route shop.api.checkout.cart.store API has been updated. If you are consuming this API, please make the necessary changes. we have refined the exception handling to provide more specific error responses and HTTP_BAD_REQUEST status code, ensuring better feedback for users.
- catch (\Exception $exception) {
-   return new JsonResource([
-       'redirect_uri' => route('shop.product_or_category.index', $product->product->url_key),
-       'message'      => $exception->getMessage(),
-   ]);
- }

+ catch (\Exception $exception) {
+    return response()->json([
+        'redirect_uri' => route('shop.product_or_category.index', $product->url_key),
+        'message'      => $exception->getMessage(),
+    ], Response::HTTP_BAD_REQUEST);
+ }
  1. The response for the Shop route shop.api.categories.index or /api/categories API has been updated. If you are consuming this API, please make the necessary changes to accommodate the updated response format.
{
    "data": [
        {
            "id": 2,
            "parent_id": 1,
            "name": "Men",
            "slug": "men",
            "status": 1,
            "position": 1,
            "display_mode": "products_and_description",
            "description": "<p>Men</p>",
-           "images": {
-               "banner_url": null,
-               "logo_url": "https://demo.bagisto.com/bagisto-common/storage/category/2/OYsuHioryn5KrOE7p8wQ2hQ3BReXY5CSbDzhvEk8.webp"
-           },
+           "logo": {
+               "small_image_url": "http://localhost/laravel/bagisto/public/cache/small/category/2/OYsuHioryn5KrOE7p8wQ2hQ3BReXY5CSbDzhvEk8.webp",
+               "medium_image_url": "http://localhost/laravel/bagisto/public/cache/medium/category/2/OYsuHioryn5KrOE7p8wQ2hQ3BReXY5CSbDzhvEk8.webp",
+               "large_image_url": "http://localhost/laravel/bagisto/public/cache/large/category/2/OYsuHioryn5KrOE7p8wQ2hQ3BReXY5CSbDzhvEk8.webp",
+               "original_image_url": "http://localhost/laravel/bagisto/public/cache/original/category/2/OYsuHioryn5KrOE7p8wQ2hQ3BReXY5CSbDzhvEk8.webp"
+           },
+           "banner": {
+               "small_image_url": "http://localhost/laravel/bagisto/public/cache/small/category/2/OYsuHioryn5KrOE7p8wQ2hQ3BReXY5CSbDzhvEk8.webp",
+               "medium_image_url": "http://localhost/laravel/bagisto/public/cache/medium/category/2/OYsuHioryn5KrOE7p8wQ2hQ3BReXY5CSbDzhvEk8.webp",
+               "large_image_url": "http://localhost/laravel/bagisto/public/cache/large/category/2/OYsuHioryn5KrOE7p8wQ2hQ3BReXY5CSbDzhvEk8.webp",
+               "original_image_url": "http://localhost/laravel/bagisto/public/cache/original/category/2/OYsuHioryn5KrOE7p8wQ2hQ3BReXY5CSbDzhvEk8.webp"
+           },
            "meta": {
                "title": "",
                "keywords": "",
                "description": ""
            },
            "translations": [
                {
                    "id": 2,
                    "category_id": 2,
                    "name": "Men",
                    "slug": "men",
                    "url_path": "men",
                    "description": "<p>Men</p>",
                    "meta_title": "",
                    "meta_description": "",
                    "meta_keywords": "",
                    "locale_id": 1,
                    "locale": "en"
                }
            ],
            "additional": []
        }
    ]
}
  1. The response for the Shop route shop.api.products.index or /api/products API has been updated. If you are consuming this API, please make the necessary changes to accommodate the updated response format.
{
    "data": [
        {
            "id": 174,
            "sku": "COMPLETELOOKSET2023",
            "name": "All-in-One Smart Casual Outfit Set",
            "description": "All-in-One Smart Casual Outfit Set",
            "url_key": "all-in-one-smart-casual-outfit-set",
            "base_image": {
                "small_image_url": "http://localhost/laravel/bagisto/public/cache/small/product/174/6zgmyY14TQ2WqCxEEdENs8tSfI6bAJbq0bjljQOq.webp",
                "medium_image_url": "http://localhost/laravel/bagisto/public/cache/medium/product/174/6zgmyY14TQ2WqCxEEdENs8tSfI6bAJbq0bjljQOq.webp",
                "large_image_url": "http://localhost/laravel/bagisto/public/cache/large/product/174/6zgmyY14TQ2WqCxEEdENs8tSfI6bAJbq0bjljQOq.webp",
                "original_image_url": "http://localhost/laravel/bagisto/public/cache/original/product/174/6zgmyY14TQ2WqCxEEdENs8tSfI6bAJbq0bjljQOq.webp"
            },
            "images": [
                {
                    "small_image_url": "http://localhost/laravel/bagisto/public/cache/small/product/174/6zgmyY14TQ2WqCxEEdENs8tSfI6bAJbq0bjljQOq.webp",
                    "medium_image_url": "http://localhost/laravel/bagisto/public/cache/medium/product/174/6zgmyY14TQ2WqCxEEdENs8tSfI6bAJbq0bjljQOq.webp",
                    "large_image_url": "http://localhost/laravel/bagisto/public/cache/large/product/174/6zgmyY14TQ2WqCxEEdENs8tSfI6bAJbq0bjljQOq.webp",
                    "original_image_url": "http://localhost/laravel/bagisto/public/cache/original/product/174/6zgmyY14TQ2WqCxEEdENs8tSfI6bAJbq0bjljQOq.webp"
                }
            ],
            "is_new": true,
            "is_featured": true,
            "on_sale": true,
            "is_saleable": true,
            "is_wishlist": true,
            "min_price": "$168.96",
            "prices": {
                "from": {
                    "regular": {
                        "price": "176.9600",
                        "formatted_price": "$176.96"
                    },
                    "final": {
                        "price": "168.9600",
                        "formatted_price": "$168.96"
                    }
                },
                "to": {
                    "regular": {
                        "price": "176.9600",
                        "formatted_price": "$176.96"
                    },
                    "final": {
                        "price": "168.9600",
                        "formatted_price": "$168.96"
                    }
                }
            },
            "price_html": "<div class=\"grid gap-1.5\">\n<p class=\"flex items-center gap-4 max-sm:text-lg\">\n<span\nclass=\"text-zinc-500 line-through max-sm:text-base\"\n    aria-label=\"$176.96\"\n>\n$176.96\n</span>\n\n$168.96\n</p>\n\n</div>",
-           "avg_ratings": 4.5,
+           "ratings": {
+               "average": "2.0",
+               "total": 2
+           }
        }
    ]
}

Renamed star-rating.blade.php

Impact Probability: Low

  1. The file packages/Webkul/Shop/src/Resources/views/components/products/star-rating.blade.php has been renamed to the packages/Webkul/Shop/src/Resources/views/components/products/ratings.blade.php.

Moved coupon.blade.php

Impact Probability: Low

  1. The file packages/Webkul/Shop/src/Resources/views/checkout/cart/coupon.blade.php has been relocated to the packages/Webkul/Shop/src/Resources/views/checkout/coupon.blade.php directory. This move was made because the file is included on both the checkout and cart pages.

Tax

The Webkul\Tax\Helpers\Tax Class Moved

Impact Probability: Low

1: The Webkul\Tax\Helpers\Tax class has been replaced with Webkul\Tax\Tax. Now, the Webkul\Tax\Tax class is bound to the Webkul\Tax\Facades\Tax facade, and all static methods have been converted to normal methods. However, you can still access these methods as static methods using the Webkul\Tax\Facades\Tax facade.

- public static function isTaxInclusive(): bool
+ public function isInclusiveTaxProductPrices(): bool

- public static function getTaxRatesWithAmount(object $that, bool $asBase = false): array
+ public function getTaxRatesWithAmount(object $that, bool $asBase = false): array

- public static function getTaxTotal(object $that, bool $asBase = false): float

- public static function getDefaultAddress()
+ public function getDefaultAddress(): object

- public static function isTaxApplicableInCurrentAddress($taxCategory, $address, $operation)
+ public function isTaxApplicableInCurrentAddress($taxCategory, $address, $operation): void

2: The new class for handling shipping tax inclusion now includes two additional methods: isInclusiveTaxShippingPrices and getShippingOriginAddress.

+ public function isInclusiveTaxShippingPrices(): bool

+ public function getShippingOriginAddress(): object