diff --git a/packages/Webkul/Admin/src/DataGrids/ProductDataGrid.php b/packages/Webkul/Admin/src/DataGrids/ProductDataGrid.php
index 8f3664cf9..d172ce65b 100644
--- a/packages/Webkul/Admin/src/DataGrids/ProductDataGrid.php
+++ b/packages/Webkul/Admin/src/DataGrids/ProductDataGrid.php
@@ -53,6 +53,10 @@ class ProductDataGrid extends DataGrid
$queryBuilder->where('channel', $this->channel);
}
+ if ($currentLocale = app()->getLocale()) {
+ $queryBuilder->where('product_flat.locale', $currentLocale);
+ }
+
$queryBuilder->groupBy('product_flat.product_id');
$this->addFilter('product_id', 'product_flat.product_id');
diff --git a/packages/Webkul/Admin/src/Resources/views/settings/channels/create.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/channels/create.blade.php
index d432a5b0f..eeb6a6727 100755
--- a/packages/Webkul/Admin/src/Resources/views/settings/channels/create.blade.php
+++ b/packages/Webkul/Admin/src/Resources/views/settings/channels/create.blade.php
@@ -53,7 +53,7 @@
@@ -26,16 +26,6 @@
-@endpush
\ No newline at end of file
+
+@endpush
diff --git a/packages/Webkul/BookingProduct/src/Resources/views/shop/default/products/view/booking/event.blade.php b/packages/Webkul/BookingProduct/src/Resources/views/shop/default/products/view/booking/event.blade.php
index a50adda53..37a1791f8 100644
--- a/packages/Webkul/BookingProduct/src/Resources/views/shop/default/products/view/booking/event.blade.php
+++ b/packages/Webkul/BookingProduct/src/Resources/views/shop/default/products/view/booking/event.blade.php
@@ -25,7 +25,11 @@
@{{ ticket.name }}
-
+
+ @{{ ticket.original_formated_price }}
+ @{{ ticket.formated_price_text }}
+
+
@{{ ticket.formated_price_text }}
@@ -62,4 +66,15 @@
+
@endpush
\ No newline at end of file
diff --git a/packages/Webkul/BookingProduct/src/Resources/views/shop/velocity/products/view/booking/event.blade.php b/packages/Webkul/BookingProduct/src/Resources/views/shop/velocity/products/view/booking/event.blade.php
index a50adda53..37a1791f8 100644
--- a/packages/Webkul/BookingProduct/src/Resources/views/shop/velocity/products/view/booking/event.blade.php
+++ b/packages/Webkul/BookingProduct/src/Resources/views/shop/velocity/products/view/booking/event.blade.php
@@ -25,7 +25,11 @@
@{{ ticket.name }}
-
+
+ @{{ ticket.original_formated_price }}
+ @{{ ticket.formated_price_text }}
+
+
@{{ ticket.formated_price_text }}
@@ -62,4 +66,15 @@
+
@endpush
\ No newline at end of file
diff --git a/packages/Webkul/Customer/src/Http/Controllers/ForgotPasswordController.php b/packages/Webkul/Customer/src/Http/Controllers/ForgotPasswordController.php
index aff8673f8..3155aae16 100755
--- a/packages/Webkul/Customer/src/Http/Controllers/ForgotPasswordController.php
+++ b/packages/Webkul/Customer/src/Http/Controllers/ForgotPasswordController.php
@@ -2,14 +2,10 @@
namespace Webkul\Customer\Http\Controllers;
-use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
use Illuminate\Support\Facades\Password;
class ForgotPasswordController extends Controller
{
-
- use SendsPasswordResetEmails;
-
/**
* Contains route related configuration
*
diff --git a/packages/Webkul/Product/src/Http/Controllers/ProductController.php b/packages/Webkul/Product/src/Http/Controllers/ProductController.php
index d3b1c2d23..8c18891e1 100755
--- a/packages/Webkul/Product/src/Http/Controllers/ProductController.php
+++ b/packages/Webkul/Product/src/Http/Controllers/ProductController.php
@@ -175,7 +175,7 @@ class ProductController extends Controller
$categories = $this->categoryRepository->getCategoryTree();
- $inventorySources = $this->inventorySourceRepository->all();
+ $inventorySources = $this->inventorySourceRepository->findWhere(['status' => 1]);
return view($this->_config['view'], compact('product', 'categories', 'inventorySources'));
}
@@ -303,7 +303,7 @@ class ProductController extends Controller
/**
* To be manually invoked when data is seeded into products
- *
+ *
* @return \Illuminate\Http\Response
*/
public function sync()
diff --git a/packages/Webkul/Velocity/src/Resources/views/shop/products/view.blade.php b/packages/Webkul/Velocity/src/Resources/views/shop/products/view.blade.php
index e8806a5a8..c7e860fad 100644
--- a/packages/Webkul/Velocity/src/Resources/views/shop/products/view.blade.php
+++ b/packages/Webkul/Velocity/src/Resources/views/shop/products/view.blade.php
@@ -23,7 +23,7 @@
@stop
@section('seo')
- meta_description : str_limit(strip_tags($product->description), 120, '') }}"/>
+ meta_description : \Illuminate\Support\Str::limit(strip_tags($product->description), 120, '') }}"/>
diff --git a/tests/acceptance.suite.yml b/tests/acceptance.suite.yml
index ba234fcea..012379ee8 100644
--- a/tests/acceptance.suite.yml
+++ b/tests/acceptance.suite.yml
@@ -20,10 +20,11 @@ modules:
connection_timeout: 60
request_timeout: 60
log_js_errors: true
- - Laravel5:
+ - Webkul\Core\Helpers\Laravel5Helper:
part: ORM
cleanup: false
environment_file: .env
database_seeder_class: DatabaseSeeder
url: http://nginx
+
step_decorators: ~
\ No newline at end of file
diff --git a/tests/acceptance/BookingProduct/BookingProductEventTicketCest.php b/tests/acceptance/BookingProduct/BookingProductEventTicketCest.php
new file mode 100644
index 000000000..be5f61de4
--- /dev/null
+++ b/tests/acceptance/BookingProduct/BookingProductEventTicketCest.php
@@ -0,0 +1,49 @@
+faker = Factory::create();
+ }
+
+ public function testSpecialPricesAreShown(AcceptanceTester $I): void
+ {
+ $product = $I->haveProduct(Laravel5Helper::VIRTUAL_PRODUCT);
+ Product::query()->where('id', $product->id)->update(['type' => 'booking']);
+
+ $bookingProduct = $I->have(BookingProduct::class, [
+ 'type' => 'event',
+ 'available_to' => Carbon::now()->addMinutes($this->faker->numberBetween(2, 59))->toDateTimeString(),
+ 'product_id' => $product->id,
+ ]);
+
+ $scenario['ticket'] = [
+ 'price' => 10,
+ 'special_price' => 5
+ ];
+
+ $ticket = $I->have(BookingProductEventTicket::class, array_merge(
+ ['booking_product_id' => $bookingProduct->id], $scenario['ticket'])
+ );
+
+ $I->amOnPage($product->url_key);
+
+ $I->see(core()->currency($ticket->price), '//span[@class="regular-price"]');
+ $I->see(__('bookingproduct::app.shop.products.per-ticket-price', ['price' => core()->currency($ticket->special_price)]),
+ '//span[@class="special-price"]');
+
+ }
+}
\ No newline at end of file
diff --git a/tests/unit/BookingProduct/BookingProductEventTicketCest.php b/tests/unit/BookingProduct/BookingProductEventTicketCest.php
new file mode 100644
index 000000000..3c7d413f7
--- /dev/null
+++ b/tests/unit/BookingProduct/BookingProductEventTicketCest.php
@@ -0,0 +1,358 @@
+typeHelper = app(EventTicket::class);
+
+ $product = $I->haveProduct(Laravel5Helper::VIRTUAL_PRODUCT);
+ Product::query()->where('id', $product->id)->update(['type' => 'booking']);
+
+ $availableTo = Carbon::now()->addMinutes($I->fake()->numberBetween(2, 59));
+
+ $this->bookingProduct = $I->have(BookingProduct::class, [
+ 'type' => 'event',
+ 'available_to' => $availableTo->toDateTimeString(),
+ 'product_id' => $product->id,
+ ]);
+ }
+
+ /**
+ * @param UnitTester $I
+ * @param Example $scenario
+ *
+ * @dataProvider getTestDataForFormatPrice
+ */
+ public function testFormatPrice(UnitTester $I, Example $scenario): void
+ {
+ $tickets[] = $I->have(BookingProductEventTicket::class, array_merge(
+ ['booking_product_id' => $this->bookingProduct->id], $scenario['ticket'])
+ );
+
+ $formattedTickets = $this->typeHelper->formatPrice($tickets);
+
+ foreach ($scenario['expectFields'] as $field) {
+ $I->assertEquals($scenario['expectFields']['converted_price'], $formattedTickets[0]['converted_price']);
+ }
+
+ }
+
+ /**
+ * @param UnitTester $I
+ * @param Example $scenario
+ *
+ * @dataProvider getTestDataForAddAdditionalPrices
+ */
+ public function testAddAdditionalPrices(UnitTester $I, Example $scenario): void
+ {
+ $ticket = $I->have(BookingProductEventTicket::class, array_merge(
+ ['booking_product_id' => $this->bookingProduct->id], $scenario['ticket'])
+ );
+
+ $inputData = $scenario['inputData'];
+ $inputData['product_id'] = $this->bookingProduct->product_id;
+ $inputData['additional']['product_id'] = $this->bookingProduct->product_id;
+ $inputData['additional']['booking']['ticket_id'] = $ticket->id;
+
+ $addTicketPrices = $this->typeHelper->addAdditionalPrices([$inputData]);
+
+ $I->assertEquals($scenario['expected']['price'], $addTicketPrices[0]['price']);
+ $I->assertEquals($scenario['expected']['base_price'], $addTicketPrices[0]['base_price']);
+ $I->assertEquals($scenario['expected']['total'], $addTicketPrices[0]['total']);
+ $I->assertEquals($scenario['expected']['base_total'], $addTicketPrices[0]['base_total']);
+ }
+
+ /**
+ * @param UnitTester $I
+ * @param Example $scenario
+ *
+ * @dataProvider getTestDataForValidateCartItem
+ */
+ public function testValidateCartItem(UnitTester $I, Example $scenario): void
+ {
+ $ticket = $I->have(BookingProductEventTicket::class, array_merge(
+ ['booking_product_id' => $this->bookingProduct->id], $scenario['ticket'])
+ );
+
+ $product = Product::query()->find($this->bookingProduct->product_id);
+
+ $data = [
+ 'is_buy_now' => 0,
+ 'product_id' => $product->id,
+ 'quantity' => $scenario['qty'],
+ "booking" => [
+ "qty" => [
+ $ticket->id => $scenario['qty'],
+ ]
+ ]
+ ];
+
+ $cart = cart()->addProduct($product->id, $data);
+ $I->assertEquals('booking', $cart->items[0]->type);
+
+ $product->getTypeInstance()->validateCartItem($cart->items[0]);
+
+ $finalPrice = $product->price + $scenario['expected'];
+ $finalTotal = ($product->price + $scenario['expected']) * $scenario['qty'];
+
+ $I->seeRecord(CartItem::class, [
+ 'id' => $cart->items[0]->id,
+ 'price' => core()->convertPrice($finalPrice),
+ 'base_price' => $finalPrice,
+ 'total' => core()->convertPrice($finalTotal),
+ 'base_total' => $finalTotal,
+ ]);
+ }
+
+ /**
+ * @param UnitTester $I
+ * @param Example $scenario
+ *
+ * @dataProvider getTestDataForHasSalePrice
+ */
+ public function testHasSalePrice(UnitTester $I, Example $scenario): void
+ {
+ $ticket = $I->have(BookingProductEventTicket::class, array_merge(
+ ['booking_product_id' => $this->bookingProduct->id], $scenario['ticket'])
+ );
+
+ $I->assertEquals($scenario['expect'], $this->typeHelper->isInSale($ticket));
+ }
+
+ /* Data Providers */
+
+ private function getTestDataForFormatPrice(): array
+ {
+ return [
+ [
+ 'ticket' => ['price' => 10],
+ 'expectFields' => [
+ 'converted_price' => 10,
+ 'formated_price' => '$10.00',
+ 'formated_price_text' => '$10.00 Per Ticket'
+ ]
+ ],
+ [
+ 'ticket' => ['price' => 20, 'special_price' => 10],
+ 'expectFields' => [
+ 'converted_price' => 10,
+ 'formated_price' => '$10.00',
+ 'formated_price_text' => '$10.00 Per Ticket',
+ 'original_converted_price' => 20,
+ 'original_formated_price' => '$20.00',
+ ]
+ ],
+ [
+ 'ticket' => [
+ 'price' => 20,
+ 'special_price' => 10,
+ 'special_price_from' => '0000-00-00 00:00:00',
+ 'special_price_to' => '0000-00-00 00:00:00',
+ ],
+ 'expectFields' => [
+ 'converted_price' => 10,
+ 'formated_price' => '$10.00',
+ 'formated_price_text' => '$10.00 Per Ticket',
+ 'original_converted_price' => 20,
+ 'original_formated_price' => '$20.00',
+ ]
+ ],
+ [
+ 'ticket' => [
+ 'price' => 10,
+ 'special_price' => 7,
+ 'special_price_from' => Carbon::yesterday(),
+ 'special_price_to' => Carbon::now(),
+ ],
+ 'expectFields' => [
+ 'converted_price' => 10,
+ 'formated_price' => '$10.00',
+ 'formated_price_text' => '$10.00 Per Ticket',
+ ]
+ ],
+ ];
+ }
+
+ private function getTestDataForAddAdditionalPrices(): array
+ {
+ return [
+ [
+ 'ticket' => ['price' => 5],
+ 'inputData' => [
+ 'quantity' => 1,
+ 'price' => 10.0,
+ 'base_price' => 10.0,
+ 'total' => 10.0,
+ 'base_total' => 10.0,
+ 'additional' => [
+ 'quantity' => 1,
+ ]
+ ],
+ 'expected' => [
+ 'price' => 15.0,
+ 'base_price' => 15.0,
+ 'total' => 15.0,
+ 'base_total' => 15.0,
+ ]
+ ],
+ [
+ 'ticket' => ['price' => 20, 'special_price' => 10],
+ 'inputData' => [
+ 'quantity' => 1,
+ 'price' => 20.0,
+ 'base_price' => 20.0,
+ 'total' => 20.0,
+ 'base_total' => 20.0,
+ 'additional' => [
+ 'quantity' => 1,
+ ]
+ ],
+ 'expected' => [
+ 'price' => 30.0,
+ 'base_price' => 30.0,
+ 'total' => 30.0,
+ 'base_total' => 30.0,
+ ]
+ ],
+ [
+ 'ticket' => ['price' => 20, 'special_price' => 10],
+ 'inputData' => [
+ 'quantity' => 2,
+ 'price' => 20.0,
+ 'base_price' => 20.0,
+ 'total' => 20.0,
+ 'base_total' => 20.0,
+ 'additional' => [
+ 'quantity' => 2,
+ ]
+ ],
+ 'expected' => [
+ 'price' => 30.0,
+ 'base_price' => 30.0,
+ 'total' => 40.0,
+ 'base_total' => 40.0,
+ ]
+ ],
+ ];
+ }
+
+ private function getTestDataForValidateCartItem(): array
+ {
+ return [
+ [
+ 'ticket' => ['price' => 10],
+ 'qty' => 1,
+ 'expected' => 10,
+ ],
+ [
+ 'ticket' => ['price' => 20, 'special_price' => 10],
+ 'qty' => 1,
+ 'expected' => 10,
+ ],
+ [
+ 'ticket' => ['price' => 20, 'special_price' => 10],
+ 'qty' => 2,
+ 'expected' => 10
+ ],
+ [
+ 'ticket' => [
+ 'price' => 20,
+ 'special_price' => 10,
+ 'special_price_from' => '0000-00-00 00:00:00',
+ 'special_price_to' => '0000-00-00 00:00:00',
+ ],
+ 'qty' => 2,
+ 'expected' => 10
+ ],
+ [
+ 'ticket' => [
+ 'price' => 10,
+ 'special_price' => 7,
+ 'special_price_from' => Carbon::yesterday(),
+ 'special_price_to' => Carbon::now(),
+ ],
+ 'qty' => 2,
+ 'expected' => 10
+ ],
+ ];
+ }
+
+ private function getTestDataForHasSalePrice(): array
+ {
+ return [
+ [
+ 'ticket' => [
+ 'price' => '10.0000',
+ 'special_price' => null
+ ],
+ 'expect' => false
+ ],
+ [
+ 'ticket' => [
+ 'price' => '10.0000',
+ 'special_price' => '5.0000'
+ ],
+ 'expect' => true
+ ],
+ [
+ 'ticket' => [
+ 'price' => '10.0000',
+ 'special_price' => '5.0000',
+ 'special_price_from' => null,
+ 'special_price_to' => null,
+ ],
+ 'expect' => true
+ ],
+ [
+ 'ticket' => [
+ 'price' => '10.0000',
+ 'special_price' => '5.0000',
+ 'special_price_from' => '0000-00-00 00:00:00',
+ 'special_price_to' => '0000-00-00 00:00:00',
+ ],
+ 'expect' => true
+ ],
+ [
+ 'ticket' => [
+ 'price' => '10.0000',
+ 'special_price' => '5.0000',
+ 'special_price_from' => Carbon::yesterday(),
+ 'special_price_to' => Carbon::tomorrow(),
+ ],
+ 'expect' => true
+ ],
+ [
+ 'ticket' => [
+ 'price' => '10.0000',
+ 'special_price' => '5.0000',
+ 'special_price_from' => Carbon::yesterday(),
+ 'special_price_to' => Carbon::now(),
+ ],
+ 'expect' => false
+ ],
+ [
+ 'ticket' => [
+ 'price' => '10.0000',
+ 'special_price' => '5.0000',
+ 'special_price_from' => Carbon::now(),
+ 'special_price_to' => Carbon::tomorrow(),
+ ],
+ 'expect' => true
+ ],
+ ];
+ }
+
+
+}