diff --git a/packages/Webkul/Admin/src/Resources/views/tax/tax-categories/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/tax/tax-categories/edit.blade.php
index 178246b22..3a30a0425 100755
--- a/packages/Webkul/Admin/src/Resources/views/tax/tax-categories/edit.blade.php
+++ b/packages/Webkul/Admin/src/Resources/views/tax/tax-categories/edit.blade.php
@@ -27,22 +27,6 @@
@csrf()
@method('PUT')
-
-
-
-
-
- @{{ errors.first('channel') }}
-
-
diff --git a/packages/Webkul/BookingProduct/src/Providers/EventServiceProvider.php b/packages/Webkul/BookingProduct/src/Providers/EventServiceProvider.php
index 8b113d8a5..d568e9426 100644
--- a/packages/Webkul/BookingProduct/src/Providers/EventServiceProvider.php
+++ b/packages/Webkul/BookingProduct/src/Providers/EventServiceProvider.php
@@ -2,8 +2,10 @@
namespace Webkul\BookingProduct\Providers;
+use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Event;
+use Webkul\Theme\ViewRenderEventManager;
class EventServiceProvider extends ServiceProvider
{
@@ -14,8 +16,10 @@ class EventServiceProvider extends ServiceProvider
*/
public function boot()
{
- Event::listen('bagisto.shop.products.view.short_description.after', function($viewRenderEventManager) {
- $viewRenderEventManager->addTemplate('bookingproduct::shop.products.view.booking');
+ Event::listen('bagisto.shop.products.view.short_description.after', static function(ViewRenderEventManager $viewRenderEventManager) {
+ if (View::exists('bookingproduct::shop.' . core()->getCurrentChannel()->theme . '.products.view.booking')) {
+ $viewRenderEventManager->addTemplate('bookingproduct::shop.' . core()->getCurrentChannel()->theme . '.products.view.booking');
+ }
});
Event::listen('checkout.order.save.after', 'Webkul\BookingProduct\Listeners\Order@afterPlaceOrder');
diff --git a/packages/Webkul/CartRule/src/Helpers/CartRule.php b/packages/Webkul/CartRule/src/Helpers/CartRule.php
index 08c6b05b4..2ea493156 100644
--- a/packages/Webkul/CartRule/src/Helpers/CartRule.php
+++ b/packages/Webkul/CartRule/src/Helpers/CartRule.php
@@ -134,11 +134,14 @@ class CartRule
*/
public function getCartRules()
{
- static $cartRules;
-
- if ($cartRules) {
- return $cartRules;
+ $staticCartRules = new class() {
+ public static $cartRules;
+ public static $cartID;
+ };
+ if ($staticCartRules::$cartID === cart()->getCart()->id && $staticCartRules::$cartRules) {
+ return $staticCartRules::$cartRules;
}
+ $staticCartRules::$cartID = cart()->getCart()->id;
$customerGroupId = null;
@@ -166,6 +169,7 @@ class CartRule
->orderBy('sort_order', 'asc');
})->findWhere(['status' => 1]);
+ $staticCartRules::$cartRules = $cartRules;
return $cartRules;
}
@@ -246,6 +250,10 @@ class CartRule
continue;
}
+ if ($rule->coupon_code) {
+ $item->coupon_code = $rule->coupon_code;
+ }
+
$quantity = $rule->discount_quantity ? min($item->quantity, $rule->discount_quantity) : $item->quantity;
$discountAmount = $baseDiscountAmount = 0;
@@ -254,9 +262,9 @@ class CartRule
case 'by_percent':
$rulePercent = min(100, $rule->discount_amount);
- $discountAmount = ($quantity * $item->price - $item->discount_amount) * ($rulePercent / 100);
+ $discountAmount = ($quantity * $item->price + $item->tax_amount - $item->discount_amount) * ($rulePercent / 100);
- $baseDiscountAmount = ($quantity * $item->base_price - $item->base_discount_amount) * ($rulePercent / 100);
+ $baseDiscountAmount = ($quantity * $item->base_price + $item->base_tax_amount - $item->base_discount_amount) * ($rulePercent / 100);
if (! $rule->discount_quantity || $rule->discount_quantity > $quantity) {
$discountPercent = min(100, $item->discount_percent + $rulePercent);
@@ -316,8 +324,16 @@ class CartRule
break;
}
- $item->discount_amount = min($item->discount_amount + $discountAmount, $item->price * $quantity + $item->tax_amount);
- $item->base_discount_amount = min($item->base_discount_amount + $baseDiscountAmount, $item->base_price * $quantity + $item->base_tax_amount);
+ $item->discount_amount = round(
+ min(
+ $item->discount_amount + $discountAmount,
+ $item->price * $quantity + $item->tax_amount
+ ),2);
+ $item->base_discount_amount = round(
+ min(
+ $item->base_discount_amount + $baseDiscountAmount,
+ $item->base_price * $quantity + $item->base_tax_amount
+ ), 2);
$appliedRuleIds[$rule->id] = $rule->id;
diff --git a/packages/Webkul/CartRule/src/Listeners/Order.php b/packages/Webkul/CartRule/src/Listeners/Order.php
index e51b8e0fa..b52e1e8b0 100755
--- a/packages/Webkul/CartRule/src/Listeners/Order.php
+++ b/packages/Webkul/CartRule/src/Listeners/Order.php
@@ -19,14 +19,14 @@ class Order
/**
* CartRuleCustomerRepository object
*
- * @var Webkul\CartRule\Repositories\\CartRuleCustomerRepository
+ * @var \Webkul\CartRule\Repositories\CartRuleCustomerRepository
*/
protected $cartRuleCustomerRepository;
/**
* CartRuleCouponRepository object
*
- * @var Webkul\CartRule\Repositories\\CartRuleCouponRepository
+ * @var \Webkul\CartRule\Repositories\CartRuleCouponRepository
*/
protected $cartRuleCouponRepository;
@@ -64,7 +64,7 @@ class Order
/**
* Save cart rule and cart rule coupon properties after place order
- *
+ *
* @param \Webkul\Sales\Contracts\Order $order
* @return void
*/
@@ -112,7 +112,7 @@ class Order
}
$coupon = $this->cartRuleCouponRepository->findOneByField('code', $order->coupon_code);
-
+
if ($coupon) {
$this->cartRuleCouponRepository->update(['times_used' => $coupon->times_used + 1], $coupon->id);
diff --git a/packages/Webkul/CartRule/src/Repositories/CartRuleRepository.php b/packages/Webkul/CartRule/src/Repositories/CartRuleRepository.php
index 0f277afcb..cd7507a5d 100755
--- a/packages/Webkul/CartRule/src/Repositories/CartRuleRepository.php
+++ b/packages/Webkul/CartRule/src/Repositories/CartRuleRepository.php
@@ -37,7 +37,7 @@ class CartRuleRepository extends Repository
/**
* CartRuleCouponRepository object
*
- * @var Webkul\CartRule\Repositories\CartRuleCouponRepository
+ * @var \Webkul\CartRule\Repositories\CartRuleCouponRepository
*/
protected $cartRuleCouponRepository;
diff --git a/packages/Webkul/Checkout/src/Cart.php b/packages/Webkul/Checkout/src/Cart.php
index cae96aadf..2f770abe0 100755
--- a/packages/Webkul/Checkout/src/Cart.php
+++ b/packages/Webkul/Checkout/src/Cart.php
@@ -436,20 +436,19 @@ class Cart
*
* @return \Webkul\Checkout\Contracts\Cart|null
*/
- public function getCart()
+ public function getCart(): ?\Webkul\Checkout\Contracts\Cart
{
- $cart = null;
-
if ($this->getCurrentCustomer()->check()) {
- $cart = $this->cartRepository->findOneWhere([
+ return $this->cartRepository->findOneWhere([
'customer_id' => $this->getCurrentCustomer()->user()->id,
'is_active' => 1,
]);
+
} elseif (session()->has('cart')) {
- $cart = $this->cartRepository->find(session()->get('cart')->id);
+ return $this->cartRepository->find(session()->get('cart')->id);
}
- return $cart && $cart->is_active ? $cart : null;
+ return null;
}
/**
@@ -483,7 +482,8 @@ class Cart
*
* @param array $data
*
- * @return void is the cart valid
+ * @return bool
+ * @throws \Prettus\Validator\Exceptions\ValidatorException
*/
public function saveCustomerAddress($data): bool
{
@@ -498,7 +498,7 @@ class Cart
$this->saveAddressesWhenRequested($data, $billingAddressData, $shippingAddressData);
$this->linkAddresses($cart, $billingAddressData, $shippingAddressData);
-
+
$this->assignCustomerFields($cart);
$cart->save();
@@ -633,6 +633,7 @@ class Cart
} else {
foreach ($cart->items as $item) {
$response = $item->product->getTypeInstance()->validateCartItem($item);
+ // ToDo: refactoring of all validateCartItem functions, at the moment they return nothing
if ($response) {
return;
@@ -662,7 +663,7 @@ class Cart
if (! $cart = $this->getCart()) {
return;
}
-
+
Event::dispatch('checkout.cart.calculate.items.tax.before', $cart);
foreach ($cart->items()->get() as $item) {
@@ -741,7 +742,7 @@ class Cart
* @param \Webkul\Checkout\Contracts\CartItem $item
* @return \Webkul\Checkout\Contracts\CartItem
*/
- protected function setItemTaxToZero(CartItem $item): CartItem
+ protected function setItemTaxToZero(\Webkul\Checkout\Contracts\CartItem $item): \Webkul\Checkout\Contracts\CartItem
{
$item->tax_percent = 0;
$item->tax_amount = 0;
@@ -755,7 +756,7 @@ class Cart
*
* @return bool
*/
- public function hasError()
+ public function hasError(): bool
{
if (! $this->getCart()) {
return true;
@@ -773,7 +774,7 @@ class Cart
*
* @return bool
*/
- public function isItemsHaveSufficientQuantity()
+ public function isItemsHaveSufficientQuantity(): bool
{
foreach ($this->getCart()->items as $item) {
if (! $this->isItemHaveQuantity($item)) {
@@ -790,7 +791,7 @@ class Cart
* @param \Webkul\Checkout\Contracts\CartItem $item
* @return bool
*/
- public function isItemHaveQuantity($item)
+ public function isItemHaveQuantity($item): bool
{
return $item->product->getTypeInstance()->isItemHaveQuantity($item);
}
@@ -800,7 +801,7 @@ class Cart
*
* @return void
*/
- public function deActivateCart()
+ public function deActivateCart(): void
{
if ($cart = $this->getCart()) {
$this->cartRepository->update(['is_active' => false], $cart->id);
@@ -816,7 +817,7 @@ class Cart
*
* @return array
*/
- public function prepareDataForOrder()
+ public function prepareDataForOrder(): array
{
$data = $this->toArray();
@@ -875,7 +876,7 @@ class Cart
* @param array $data
* @return array
*/
- public function prepareDataForOrderItem($data)
+ public function prepareDataForOrderItem($data): array
{
$finalData = [
'product' => $this->productRepository->find($data['product_id']),
@@ -1033,9 +1034,9 @@ class Cart
* When logged in as guest or the customer profile is not complete, we use the
* billing address to fill the order customer_ data.
*
- * @param \Webkul\Checkout\Models\Cart $cart
+ * @param \Webkul\Checkout\Contracts\Cart $cart
*/
- private function assignCustomerFields(\Webkul\Checkout\Models\Cart $cart): void
+ private function assignCustomerFields(\Webkul\Checkout\Contracts\Cart $cart): void
{
if ($this->getCurrentCustomer()->check()
&& ($user = $this->getCurrentCustomer()->user())
@@ -1190,34 +1191,37 @@ class Cart
{
$billingAddressModel = $cart->billing_address;
if ($billingAddressModel) {
+ $billingAddressData['address_type'] = CartAddress::ADDRESS_TYPE_BILLING;
$this->cartAddressRepository->update($billingAddressData, $billingAddressModel->id);
if ($cart->haveStockableItems()) {
$shippingAddressModel = $cart->shipping_address;
if ($shippingAddressModel) {
if (isset($billingAddressData['use_for_shipping']) && $billingAddressData['use_for_shipping']) {
+ $billingAddressData['address_type'] = CartAddress::ADDRESS_TYPE_SHIPPING;
$this->cartAddressRepository->update($billingAddressData, $shippingAddressModel->id);
} else {
+ $shippingAddressData['address_type'] = CartAddress::ADDRESS_TYPE_SHIPPING;
$this->cartAddressRepository->update($shippingAddressData, $shippingAddressModel->id);
}
} else {
if (isset($billingAddressData['use_for_shipping']) && $billingAddressData['use_for_shipping']) {
$this->cartAddressRepository->create(array_merge($billingAddressData,
- ['address_type' => 'shipping']));
+ ['address_type' => CartAddress::ADDRESS_TYPE_SHIPPING]));
} else {
$this->cartAddressRepository->create(array_merge($shippingAddressData,
- ['address_type' => 'shipping']));
+ ['address_type' => CartAddress::ADDRESS_TYPE_SHIPPING]));
}
}
}
} else {
- $this->cartAddressRepository->create(array_merge($billingAddressData, ['address_type' => 'billing']));
+ $this->cartAddressRepository->create(array_merge($billingAddressData, ['address_type' => CartAddress::ADDRESS_TYPE_BILLING]));
if ($cart->haveStockableItems()) {
if (isset($billingAddressData['use_for_shipping']) && $billingAddressData['use_for_shipping']) {
- $this->cartAddressRepository->create(array_merge($billingAddressData, ['address_type' => 'shipping']));
+ $this->cartAddressRepository->create(array_merge($billingAddressData, ['address_type' => CartAddress::ADDRESS_TYPE_SHIPPING]));
} else {
- $this->cartAddressRepository->create(array_merge($shippingAddressData, ['address_type' => 'shipping']));
+ $this->cartAddressRepository->create(array_merge($shippingAddressData, ['address_type' => CartAddress::ADDRESS_TYPE_SHIPPING]));
}
}
}
diff --git a/packages/Webkul/Checkout/src/Database/Factories/CartAddressFactory.php b/packages/Webkul/Checkout/src/Database/Factories/CartAddressFactory.php
index 53e389de0..c78b813e7 100644
--- a/packages/Webkul/Checkout/src/Database/Factories/CartAddressFactory.php
+++ b/packages/Webkul/Checkout/src/Database/Factories/CartAddressFactory.php
@@ -6,14 +6,10 @@ use Faker\Generator as Faker;
use Webkul\Checkout\Models\CartAddress;
$factory->define(CartAddress::class, function (Faker $faker) {
- $now = date("Y-m-d H:i:s");
-
return [
'first_name' => $faker->firstName(),
'last_name' => $faker->lastName,
'email' => $faker->email,
- 'created_at' => $now,
- 'updated_at' => $now,
- 'address_type' => 'billing',
+ 'address_type' => CartAddress::ADDRESS_TYPE_BILLING,
];
});
diff --git a/packages/Webkul/Checkout/src/Models/Cart.php b/packages/Webkul/Checkout/src/Models/Cart.php
index 05ff14562..dbc924c63 100755
--- a/packages/Webkul/Checkout/src/Models/Cart.php
+++ b/packages/Webkul/Checkout/src/Models/Cart.php
@@ -48,7 +48,7 @@ class Cart extends Model implements CartContract
*/
public function billing_address()
{
- return $this->addresses()->where('address_type', 'billing');
+ return $this->addresses()->where('address_type', CartAddress::ADDRESS_TYPE_BILLING);
}
/**
@@ -64,7 +64,7 @@ class Cart extends Model implements CartContract
*/
public function shipping_address()
{
- return $this->addresses()->where('address_type', 'shipping');
+ return $this->addresses()->where('address_type', CartAddress::ADDRESS_TYPE_SHIPPING);
}
/**
diff --git a/packages/Webkul/Checkout/src/Models/CartAddress.php b/packages/Webkul/Checkout/src/Models/CartAddress.php
index 307526c9a..88cb4ec29 100755
--- a/packages/Webkul/Checkout/src/Models/CartAddress.php
+++ b/packages/Webkul/Checkout/src/Models/CartAddress.php
@@ -2,30 +2,47 @@
namespace Webkul\Checkout\Models;
-use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Builder;
use Webkul\Checkout\Contracts\CartAddress as CartAddressContract;
+use Webkul\Core\Models\Address;
-class CartAddress extends Model implements CartAddressContract
+/**
+ * Class CartAddress
+ * @package Webkul\Checkout\Models
+ *
+ * @property integer $cart_id
+ * @property Cart $cart
+ *
+ */
+class CartAddress extends Address implements CartAddressContract
{
- protected $table = 'cart_address';
+ public const ADDRESS_TYPE_SHIPPING = 'cart_shipping';
+ public const ADDRESS_TYPE_BILLING = 'cart_billing';
- protected $fillable = [
- 'first_name',
- 'last_name',
- 'email',
- 'company_name',
- 'vat_id',
- 'address1',
- 'city',
- 'state',
- 'postcode',
- 'country',
- 'phone',
- 'address_type',
- 'cart_id',
- 'customer_id',
+ /**
+ * @var array default values
+ */
+ protected $attributes = [
+ 'address_type' => self::ADDRESS_TYPE_BILLING,
];
+ /**
+ * The "booted" method of the model.
+ *
+ * @return void
+ */
+ protected static function boot()
+ {
+ static::addGlobalScope('address_type', static function (Builder $builder) {
+ $builder->whereIn('address_type', [
+ self::ADDRESS_TYPE_BILLING,
+ self::ADDRESS_TYPE_SHIPPING
+ ]);
+ });
+
+ parent::boot();
+ }
+
/**
* Get the shipping rates for the cart address.
*/
@@ -35,10 +52,10 @@ class CartAddress extends Model implements CartAddressContract
}
/**
- * Get all of the attributes for the attribute groups.
+ * Get the cart record associated with the address.
*/
- public function getNameAttribute()
+ public function cart()
{
- return $this->first_name . ' ' . $this->last_name;
+ return $this->belongsTo(Cart::class);
}
}
\ No newline at end of file
diff --git a/packages/Webkul/Checkout/src/Models/CartShippingRate.php b/packages/Webkul/Checkout/src/Models/CartShippingRate.php
index e3c8d41a3..a4b4bbe17 100755
--- a/packages/Webkul/Checkout/src/Models/CartShippingRate.php
+++ b/packages/Webkul/Checkout/src/Models/CartShippingRate.php
@@ -24,6 +24,7 @@ class CartShippingRate extends Model implements CartShippingRateContract
*/
public function shipping_address()
{
- return $this->belongsTo(CartAddressProxy::modelClass());
+ return $this->belongsTo(CartAddressProxy::modelClass(), 'cart_address_id')
+ ->where('address_type', CartAddress::ADDRESS_TYPE_SHIPPING);
}
}
\ No newline at end of file
diff --git a/packages/Webkul/Core/src/Contracts/Address.php b/packages/Webkul/Core/src/Contracts/Address.php
new file mode 100644
index 000000000..40a6f3c7f
--- /dev/null
+++ b/packages/Webkul/Core/src/Contracts/Address.php
@@ -0,0 +1,7 @@
+localeRepository = $localeRepository;
+ $this->customerGroupRepository = $customerGroupRepository;
+
$this->coreConfigRepository = $coreConfigRepository;
}
@@ -247,6 +259,22 @@ class Core
return $locale;
}
+ /**
+ * Returns all Customer Groups
+ *
+ * @return \Illuminate\Support\Collection
+ */
+ public function getAllCustomerGroups()
+ {
+ static $customerGroups;
+
+ if ($customerGroups) {
+ return $customerGroups;
+ }
+
+ return $customerGroups = $this->customerGroupRepository->all();
+ }
+
/**
* Returns all currencies
*
@@ -376,9 +404,10 @@ class Core
/**
* Converts price
*
- * @param float $amount
- * @param string $targetCurrencyCode
- * @param string $orderCurrencyCode
+ * @param float $amount
+ * @param string $targetCurrencyCode
+ * @param string $orderCurrencyCode
+ *
* @return string
*/
public function convertPrice($amount, $targetCurrencyCode = null, $orderCurrencyCode = null)
@@ -394,16 +423,16 @@ class Core
if (($targetCurrencyCode != $this->lastOrderCode)
&& ($targetCurrencyCode != $orderCurrencyCode)
- && ($orderCurrencyCode != $this->getBaseCurrencyCode())
- && ($orderCurrencyCode != $this->lastCurrencyCode)
+ && ($orderCurrencyCode != $this->getBaseCurrencyCode())
+ && ($orderCurrencyCode != $this->lastCurrencyCode)
) {
$amount = $this->convertToBasePrice($amount, $orderCurrencyCode);
}
}
$targetCurrency = ! $targetCurrencyCode
- ? $this->getCurrentCurrency()
- : $this->currencyRepository->findOneByField('code', $targetCurrencyCode);
+ ? $this->getCurrentCurrency()
+ : $this->currencyRepository->findOneByField('code', $targetCurrencyCode);
if (! $targetCurrency) {
return $amount;
@@ -429,15 +458,16 @@ class Core
/**
* Converts to base price
*
- * @param float $amount
- * @param string $targetCurrencyCode
+ * @param float $amount
+ * @param string $targetCurrencyCode
+ *
* @return string
*/
public function convertToBasePrice($amount, $targetCurrencyCode = null)
{
$targetCurrency = ! $targetCurrencyCode
- ? $this->getCurrentCurrency()
- : $this->currencyRepository->findOneByField('code', $targetCurrencyCode);
+ ? $this->getCurrentCurrency()
+ : $this->currencyRepository->findOneByField('code', $targetCurrencyCode);
if (! $targetCurrency) {
return $amount;
@@ -457,7 +487,8 @@ class Core
/**
* Format and convert price with currency symbol
*
- * @param float $price
+ * @param float $price
+ *
* @return string
*/
public function currency($amount = 0)
@@ -472,7 +503,8 @@ class Core
/**
* Return currency symbol from currency code
*
- * @param float $price
+ * @param float $price
+ *
* @return string
*/
public function currencySymbol($code)
@@ -483,17 +515,18 @@ class Core
}
/**
- * Format and convert price with currency symbol
- *
- * @param float $price
- * @return string
- */
+ * Format and convert price with currency symbol
+ *
+ * @param float $price
+ *
+ * @return string
+ */
public function formatPrice($price, $currencyCode)
{
if (is_null($price))
$price = 0;
- $formatter = new \NumberFormatter( app()->getLocale(), \NumberFormatter::CURRENCY );
+ $formatter = new \NumberFormatter(app()->getLocale(), \NumberFormatter::CURRENCY);
return $formatter->formatCurrency($price, $currencyCode);
}
@@ -523,7 +556,8 @@ class Core
/**
* Format price with base currency symbol
*
- * @param float $price
+ * @param float $price
+ *
* @return string
*/
public function formatBasePrice($price)
@@ -551,8 +585,9 @@ class Core
* Checks if current date of the given channel (in the channel timezone) is within the range
*
* @param int|string|\Webkul\Core\Contracts\Channel $channel
- * @param string|null $dateFrom
- * @param string|null $dateTo
+ * @param string|null $dateFrom
+ * @param string|null $dateTo
+ *
* @return bool
*/
public function isChannelDateInInterval($dateFrom = null, $dateTo = null)
@@ -583,7 +618,8 @@ class Core
/**
* Get channel timestamp, timstamp will be builded with channel timezone settings
*
- * @param \Webkul\Core\Contracts\Channel $channel
+ * @param \Webkul\Core\Contracts\Channel $channel
+ *
* @return int
*/
public function channelTimeStamp($channel)
@@ -604,7 +640,8 @@ class Core
/**
* Check whether sql date is empty
*
- * @param string $date
+ * @param string $date
+ *
* @return bool
*/
function is_empty_date($date)
@@ -615,8 +652,8 @@ class Core
/**
* Format date using current channel.
*
- * @param \Illuminate\Support\Carbon|null $date
- * @param string $format
+ * @param \Illuminate\Support\Carbon|null $date
+ * @param string $format
*
* @return string
*/
@@ -636,9 +673,9 @@ class Core
/**
* Retrieve information from payment configuration
*
- * @param string $field
- * @param int|string|null $channelId
- * @param string|null $locale
+ * @param string $field
+ * @param int|string|null $channelId
+ * @param string|null $locale
*
* @return mixed
*/
@@ -707,7 +744,8 @@ class Core
/**
* Retrieve a group of information from the core config table
*
- * @param mixed $criteria
+ * @param mixed $criteria
+ *
* @return mixed
*/
public function retrieveGroupConfig($criteria)
@@ -728,7 +766,8 @@ class Core
/**
* Returns country name by code
*
- * @param string $code
+ * @param string $code
+ *
* @return string
*/
public function country_name($code)
@@ -741,7 +780,8 @@ class Core
/**
* Retrieve all country states
*
- * @param string $countryCode
+ * @param string $countryCode
+ *
* @return \Illuminate\Support\Collection
*/
public function states($countryCode)
@@ -786,8 +826,9 @@ class Core
/**
* Returns time intervals
*
- * @param \Illuminate\Support\Carbon $startDate
- * @param \Illuminate\Support\Carbon $endDate
+ * @param \Illuminate\Support\Carbon $startDate
+ * @param \Illuminate\Support\Carbon $endDate
+ *
* @return array
*/
public function getTimeInterval($startDate, $endDate)
@@ -808,8 +849,8 @@ class Core
$start = Carbon::createFromTimeString($date->format('Y-m-d') . ' 00:00:01');
$end = $totalMonths - 1 == $i
- ? $endDate
- : Carbon::createFromTimeString($date->format('Y-m-d') . ' 23:59:59');
+ ? $endDate
+ : Carbon::createFromTimeString($date->format('Y-m-d') . ' 23:59:59');
$timeIntervals[] = ['start' => $start, 'end' => $end, 'formatedDate' => $date->format('M')];
}
@@ -819,11 +860,11 @@ class Core
$date->addWeeks($i);
$start = $i == 0
- ? $startDate
- : Carbon::createFromTimeString($this->xWeekRange($date, 0) . ' 00:00:01');
+ ? $startDate
+ : Carbon::createFromTimeString($this->xWeekRange($date, 0) . ' 00:00:01');
$end = $totalWeeks - 1 == $i
- ? $endDate
- : Carbon::createFromTimeString($this->xWeekRange($date, 1) . ' 23:59:59');
+ ? $endDate
+ : Carbon::createFromTimeString($this->xWeekRange($date, 1) . ' 23:59:59');
$timeIntervals[] = ['start' => $start, 'end' => $end, 'formatedDate' => $date->format('d M')];
}
@@ -844,8 +885,9 @@ class Core
/**
*
- * @param string $date
- * @param int $day
+ * @param string $date
+ * @param int $day
+ *
* @return string
*/
public function xWeekRange($date, $day)
@@ -866,7 +908,8 @@ class Core
/**
* Method to sort through the acl items and put them in order
*
- * @param array $items
+ * @param array $items
+ *
* @return array
*/
public function sortItems($items)
@@ -889,7 +932,8 @@ class Core
}
/**
- * @param string $fieldName
+ * @param string $fieldName
+ *
* @return array
*/
public function getConfigField($fieldName)
@@ -908,7 +952,8 @@ class Core
}
/**
- * @param array $items
+ * @param array $items
+ *
* @return array
*/
public function convertToAssociativeArray($items)
@@ -941,9 +986,10 @@ class Core
}
/**
- * @param array $items
- * @param string $key
- * @param string|int|float $value
+ * @param array $items
+ * @param string $key
+ * @param string|int|float $value
+ *
* @return array
*/
public function array_set(&$array, $key, $value)
@@ -977,8 +1023,9 @@ class Core
}
/**
- * @param array $array1
- * @param array $array2
+ * @param array $array1
+ * @param array $array2
+ *
* @return array
*/
protected function arrayMerge(array &$array1, array &$array2)
@@ -997,7 +1044,8 @@ class Core
}
/**
- * @param array $array1
+ * @param array $array1
+ *
* @return array
*/
public function convertEmptyStringsToNull($array)
@@ -1014,7 +1062,8 @@ class Core
/**
* Create singletom object through single facade
*
- * @param string $className
+ * @param string $className
+ *
* @return object
*/
public function getSingletonInstance($className)
@@ -1031,7 +1080,8 @@ class Core
/**
* Returns a string as selector part for identifying elements in views
*
- * @param float $taxRate
+ * @param float $taxRate
+ *
* @return string
*/
public static function taxRateAsIdentifier(float $taxRate): string
@@ -1051,8 +1101,8 @@ class Core
$sender_email = core()->getConfigData('general.general.email_settings.shop_email_from') ? core()->getConfigData('general.general.email_settings.shop_email_from') : config('mail.from.address');
return [
- 'name' => $sender_name,
- 'email' => $sender_email,
+ 'name' => $sender_name,
+ 'email' => $sender_email,
];
}
@@ -1068,8 +1118,8 @@ class Core
$admin_email = core()->getConfigData('general.general.email_settings.admin_email') ? core()->getConfigData('general.general.email_settings.admin_email') : config('mail.admin.address');
return [
- 'name' => $admin_name,
- 'email' => $admin_email,
+ 'name' => $admin_name,
+ 'email' => $admin_email,
];
}
}
\ No newline at end of file
diff --git a/packages/Webkul/Core/src/Database/Factories/CartRuleFactory.php b/packages/Webkul/Core/src/Database/Factories/CartRuleFactory.php
new file mode 100644
index 000000000..330c3caa6
--- /dev/null
+++ b/packages/Webkul/Core/src/Database/Factories/CartRuleFactory.php
@@ -0,0 +1,30 @@
+define(CartRule::class, function (Faker $faker) {
+ return [
+ 'name' => $faker->uuid,
+ 'description' => $faker->sentence(),
+ 'starts_from' => null,
+ 'ends_till' => null,
+ 'coupon_type' => '1',
+ 'use_auto_generation' => '0',
+ 'usage_per_customer' => '100',
+ 'uses_per_coupon' => '100',
+ 'times_used' => '0',
+ 'condition_type' => '2',
+ 'end_other_rules' => '0',
+ 'uses_attribute_conditions' => '0',
+ 'discount_quantity' => '0',
+ 'discount_step' => '0',
+ 'apply_to_shipping' => '0',
+ 'free_shipping' => '0',
+ 'sort_order' => '0',
+ 'status' => '1',
+ 'conditions' => null,
+ ];
+});
\ No newline at end of file
diff --git a/packages/Webkul/Core/src/Database/Factories/ChannelFactory.php b/packages/Webkul/Core/src/Database/Factories/ChannelFactory.php
new file mode 100644
index 000000000..80f04d976
--- /dev/null
+++ b/packages/Webkul/Core/src/Database/Factories/ChannelFactory.php
@@ -0,0 +1,39 @@
+define(Channel::class, function (Faker $faker, array $attributes) {
+
+ $seoTitle = $attributes['seo_title'] ?? $faker->word;
+ $seoDescription = $attributes['seo_description'] ?? $faker->words(10, true);
+ $seoKeywords = $attributes['seo_keywords'] ?? $faker->words(3, true);
+
+ $seoData = [
+ 'meta_title' => $seoTitle,
+ 'meta_description' => $seoDescription,
+ 'meta_keywords' => $seoKeywords,
+ ];
+
+ unset($attributes['seo_title'], $attributes['seo_description'], $attributes['seo_keywords']);
+
+
+ return [
+ 'code' => $faker->unique()->word,
+ 'name' => $faker->word,
+ 'default_locale_id' => function () {
+ return factory(Locale::class)->create()->id;
+ },
+ 'base_currency_id' => function () {
+ return factory(Currency::class)->create()->id;
+ },
+ 'root_category_id' => function () {
+ return factory(Category::class)->create()->id;
+ },
+ 'home_seo' => json_encode($seoData),
+ ];
+});
diff --git a/packages/Webkul/Core/src/Database/Factories/ChannelInventorySourceFactory.php b/packages/Webkul/Core/src/Database/Factories/ChannelInventorySourceFactory.php
new file mode 100644
index 000000000..4b8c272c5
--- /dev/null
+++ b/packages/Webkul/Core/src/Database/Factories/ChannelInventorySourceFactory.php
@@ -0,0 +1,10 @@
+define('channel_inventory_sources', function () {
+ return [
+ 'channel_id' => core()->getCurrentChannel()->id,
+ 'inventory_source_id' => 1,
+ ];
+});
\ No newline at end of file
diff --git a/packages/Webkul/Core/src/Database/Migrations/2020_04_16_185147_add_table_addresses.php b/packages/Webkul/Core/src/Database/Migrations/2020_04_16_185147_add_table_addresses.php
new file mode 100644
index 000000000..9288127c2
--- /dev/null
+++ b/packages/Webkul/Core/src/Database/Migrations/2020_04_16_185147_add_table_addresses.php
@@ -0,0 +1,294 @@
+increments('id');
+ $table->string('address_type');
+ $table->unsignedInteger('customer_id')->nullable()->comment('null if guest checkout');
+ $table->unsignedInteger('cart_id')->nullable()->comment('only for cart_addresses');
+ $table->unsignedInteger('order_id')->nullable()->comment('only for order_addresses');
+
+ $table->string('first_name');
+ $table->string('last_name');
+ $table->string('gender')->nullable();
+ $table->string('company_name')->nullable();
+ $table->string('address1');
+ $table->string('address2')->nullable();
+ $table->string('postcode');
+ $table->string('city');
+ $table->string('state');
+ $table->string('country');
+ $table->string('email')->nullable();
+ $table->string('phone')->nullable();
+
+ $table->string('vat_id')->nullable();
+ $table->boolean('default_address')
+ ->default(false)
+ ->comment('only for customer_addresses');
+
+ $table->json('additional')->nullable();
+
+ $table->timestamps();
+
+ $table->foreign(['customer_id'])->references('id')->on('customers')->onDelete('cascade');
+ $table->foreign(['cart_id'])->references('id')->on('cart')->onDelete('cascade');
+ $table->foreign(['order_id'])->references('id')->on('orders')->onDelete('cascade');
+ });
+
+ Schema::disableForeignKeyConstraints();
+
+ $this->migrateCustomerAddresses();
+ $this->migrateCartAddresses();
+ $this->migrateOrderAddresses();
+
+ $this->migrateForeignKeys();
+
+ Schema::drop('customer_addresses');
+ Schema::drop('cart_address');
+ Schema::drop('order_address');
+
+ Schema::enableForeignKeyConstraints();
+
+ DB::commit();
+ } catch (Exception $e) {
+ DB::rollBack();
+ throw $e;
+ }
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ throw new Exception('you cannot revert this migration: data would be lost');
+ }
+
+ private function migrateCustomerAddresses(): void
+ {
+ $dbPrefix = DB::getTablePrefix();
+
+ $insertCustomerAddresses = <<< SQL
+ INSERT INTO ${dbPrefix}addresses(
+ address_type,
+ customer_id,
+ first_name,
+ last_name,
+ gender,
+ company_name,
+ address1,
+ address2,
+ postcode,
+ city,
+ state,
+ country,
+ email,
+ phone,
+ default_address,
+ additional,
+ created_at,
+ updated_at
+ )
+ SELECT
+ "customer",
+ customer_id,
+ first_name,
+ last_name,
+ (SELECT gender FROM customers c WHERE c.id=ca.customer_id),
+ company_name,
+ address1,
+ address2,
+ postcode,
+ city,
+ state,
+ country,
+ null,
+ phone,
+ default_address,
+ JSON_INSERT('{}', '$.old_customer_address_id', id),
+ created_at,
+ updated_at
+ FROM customer_addresses ca;
+SQL;
+
+ DB::unprepared($insertCustomerAddresses);
+ }
+
+ private function migrateCartAddresses(): void
+ {
+ $dbPrefix = DB::getTablePrefix();
+
+ $insertCustomerAddresses = <<< SQL
+ INSERT INTO ${dbPrefix}addresses(
+ address_type,
+ customer_id,
+ cart_id,
+ first_name,
+ last_name,
+ gender,
+ company_name,
+ address1,
+ address2,
+ postcode,
+ city,
+ state,
+ country,
+ email,
+ phone,
+ additional,
+ created_at,
+ updated_at
+ )
+ SELECT
+ (CASE WHEN ca.address_type='billing' THEN "cart_billing" ELSE "cart_shipping" END),
+ customer_id,
+ cart_id,
+ first_name,
+ last_name,
+ (SELECT gender FROM customers c WHERE c.id=ca.customer_id),
+ company_name,
+ address1,
+ address2,
+ postcode,
+ city,
+ state,
+ country,
+ email,
+ phone,
+ JSON_INSERT('{}', '$.old_cart_address_id', id),
+ created_at,
+ updated_at
+ FROM cart_address ca;
+SQL;
+
+ DB::unprepared($insertCustomerAddresses);
+ }
+
+ private function migrateOrderAddresses(): void
+ {
+ $dbPrefix = DB::getTablePrefix();
+
+ $insertCustomerAddresses = <<< SQL
+ INSERT INTO ${dbPrefix}addresses(
+ address_type,
+ customer_id,
+ order_id,
+ first_name,
+ last_name,
+ gender,
+ company_name,
+ address1,
+ address2,
+ postcode,
+ city,
+ state,
+ country,
+ email,
+ phone,
+ additional,
+ created_at,
+ updated_at
+ )
+ SELECT
+ (CASE WHEN oa.address_type='billing' THEN "order_billing" ELSE "order_shipping" END),
+ customer_id,
+ order_id,
+ first_name,
+ last_name,
+ (SELECT gender FROM customers c WHERE c.id=oa.customer_id),
+ company_name,
+ address1,
+ address2,
+ postcode,
+ city,
+ state,
+ country,
+ email,
+ phone,
+ JSON_INSERT('{}', '$.old_order_address_id', id),
+ created_at,
+ updated_at
+ FROM order_address oa;
+SQL;
+
+ DB::unprepared($insertCustomerAddresses);
+ }
+
+ private function migrateForeignKeys(): void
+ {
+ Schema::table('cart_shipping_rates', static function (Blueprint $table) {
+ $table->dropForeign(['cart_address_id']);
+
+ CartAddress::query()
+ ->orderBy('id', 'asc') // for some reason each() needs an orderBy in before
+ ->each(static function ($row) {
+ CartShippingRate::query()
+ ->where('cart_address_id', $row->additional['old_cart_address_id'])
+ ->update(['cart_address_id' => $row->id]);
+ });
+
+ $table->foreign(['cart_address_id'])
+ ->references('id')
+ ->on('addresses')
+ ->onDelete('cascade');
+ });
+
+ Schema::table('invoices', static function (Blueprint $table) {
+ $table->dropForeign(['order_address_id']);
+
+ OrderAddress::query()
+ ->orderBy('id', 'asc') // for some reason each() needs an orderBy in before
+ ->each(static function ($row) {
+ Invoice::query()
+ ->where('order_address_id', $row->additional['old_order_address_id'])
+ ->update(['order_address_id' => $row->id]);
+ });
+
+ $table->foreign(['order_address_id'])
+ ->references('id')
+ ->on('addresses')
+ ->onDelete('cascade');
+ });
+
+ Schema::table('shipments', static function (Blueprint $table) {
+ $table->dropForeign(['order_address_id']);
+
+ OrderAddress::query()
+ ->orderBy('id', 'asc') // for some reason each() needs an orderBy in before
+ ->each(static function ($row) {
+ Shipment::query()
+ ->where('order_address_id', $row->additional['old_order_address_id'])
+ ->update(['order_address_id' => $row->id]);
+ });
+
+ $table->foreign(['order_address_id'])
+ ->references('id')
+ ->on('addresses')
+ ->onDelete('cascade');
+ });
+ }
+}
diff --git a/packages/Webkul/Core/src/Eloquent/Repository.php b/packages/Webkul/Core/src/Eloquent/Repository.php
index a843ec976..0249dd76f 100755
--- a/packages/Webkul/Core/src/Eloquent/Repository.php
+++ b/packages/Webkul/Core/src/Eloquent/Repository.php
@@ -2,11 +2,16 @@
namespace Webkul\Core\Eloquent;
+use Prettus\Repository\Contracts\CacheableInterface;
use Prettus\Repository\Eloquent\BaseRepository;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Container\Container as App;
+use Prettus\Repository\Traits\CacheableRepository;
-abstract class Repository extends BaseRepository {
+
+abstract class Repository extends BaseRepository implements CacheableInterface {
+
+ use CacheableRepository;
/**
* Find data by field and value
@@ -18,7 +23,7 @@ abstract class Repository extends BaseRepository {
*/
public function findOneByField($field, $value = null, $columns = ['*'])
{
- $model = parent::findByField($field, $value, $columns = ['*']);
+ $model = $this->findByField($field, $value, $columns = ['*']);
return $model->first();
}
@@ -33,7 +38,7 @@ abstract class Repository extends BaseRepository {
*/
public function findOneWhere(array $where, $columns = ['*'])
{
- $model = parent::findWhere($where, $columns);
+ $model = $this->findWhere($where, $columns);
return $model->first();
}
@@ -132,4 +137,4 @@ abstract class Repository extends BaseRepository {
{
return $this->model;
}
-}
\ No newline at end of file
+}
diff --git a/packages/Webkul/Core/src/Helpers/Laravel5Helper.php b/packages/Webkul/Core/src/Helpers/Laravel5Helper.php
index c1889cc06..31d7476ef 100644
--- a/packages/Webkul/Core/src/Helpers/Laravel5Helper.php
+++ b/packages/Webkul/Core/src/Helpers/Laravel5Helper.php
@@ -312,7 +312,7 @@ class Laravel5Helper extends Laravel5
'special_price_from' => null,
'special_price_to' => null,
'special_price' => null,
- 'price' => $faker->randomFloat(4, 1, 1000),
+ 'price' => $faker->randomFloat(2, 1, 1000),
'weight' => '1.00', // necessary for shipping
'brand' => AttributeOption::firstWhere('attribute_id', $brand->id)->id,
];
diff --git a/packages/Webkul/Core/src/Models/Address.php b/packages/Webkul/Core/src/Models/Address.php
new file mode 100644
index 000000000..fcbb7a3e6
--- /dev/null
+++ b/packages/Webkul/Core/src/Models/Address.php
@@ -0,0 +1,92 @@
+ 'array',
+ ];
+
+ /**
+ * Get all of the attributes for the attribute groups.
+ */
+ public function getNameAttribute(): string
+ {
+ return $this->first_name . ' ' . $this->last_name;
+ }
+
+ /**
+ * Get the customer record associated with the address.
+ */
+ public function customer(): BelongsTo
+ {
+ return $this->belongsTo(Customer::class);
+ }
+}
diff --git a/packages/Webkul/Core/src/Models/AddressProxy.php b/packages/Webkul/Core/src/Models/AddressProxy.php
new file mode 100644
index 000000000..6e10ca416
--- /dev/null
+++ b/packages/Webkul/Core/src/Models/AddressProxy.php
@@ -0,0 +1,10 @@
+define(CustomerAddress::class, function (Faker $faker) {
- $now = date("Y-m-d H:i:s");
-
// use an locale from a country in europe so the vat id can be generated
$fakerIt = \Faker\Factory::create('it_IT');
@@ -27,8 +25,7 @@ $factory->define(CustomerAddress::class, function (Faker $faker) {
'postcode' => $faker->postcode,
'phone' => $faker->e164PhoneNumber,
'default_address' => array_random([0, 1]),
- 'created_at' => $now,
- 'updated_at' => $now,
+ 'address_type' => CustomerAddress::ADDRESS_TYPE,
];
});
diff --git a/packages/Webkul/Customer/src/Http/Controllers/CustomerController.php b/packages/Webkul/Customer/src/Http/Controllers/CustomerController.php
index 5088e528c..bd917284b 100755
--- a/packages/Webkul/Customer/src/Http/Controllers/CustomerController.php
+++ b/packages/Webkul/Customer/src/Http/Controllers/CustomerController.php
@@ -3,6 +3,7 @@
namespace Webkul\Customer\Http\Controllers;
use Hash;
+use Illuminate\Support\Facades\Event;
use Webkul\Customer\Repositories\CustomerRepository;
use Webkul\Product\Repositories\ProductReviewRepository;
@@ -114,7 +115,12 @@ class CustomerController extends Controller
}
}
- if ($this->customerRepository->update($data, $id)) {
+ Event::dispatch('customer.update.before');
+
+ if ($customer = $this->customerRepository->update($data, $id)) {
+
+ Event::dispatch('customer.update.after', $customer);
+
Session()->flash('success', trans('shop::app.customer.account.profile.edit-success'));
return redirect()->route($this->_config['redirect']);
diff --git a/packages/Webkul/Customer/src/Models/CustomerAddress.php b/packages/Webkul/Customer/src/Models/CustomerAddress.php
index 389857a53..89cecb4cb 100755
--- a/packages/Webkul/Customer/src/Models/CustomerAddress.php
+++ b/packages/Webkul/Customer/src/Models/CustomerAddress.php
@@ -2,34 +2,32 @@
namespace Webkul\Customer\Models;
-use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Builder;
+use Webkul\Core\Models\Address;
use Webkul\Customer\Contracts\CustomerAddress as CustomerAddressContract;
-class CustomerAddress extends Model implements CustomerAddressContract
+class CustomerAddress extends Address implements CustomerAddressContract
{
- protected $table = 'customer_addresses';
+ public const ADDRESS_TYPE = 'customer';
- protected $fillable = [
- 'customer_id',
- 'company_name',
- 'vat_id',
- 'address1',
- 'address2',
- 'country',
- 'state',
- 'city',
- 'postcode',
- 'phone',
- 'default_address',
- 'first_name',
- 'last_name',
+ /**
+ * @var array default values
+ */
+ protected $attributes = [
+ 'address_type' => self::ADDRESS_TYPE,
];
/**
- * Get the customer address full name.
+ * The "booted" method of the model.
+ *
+ * @return void
*/
- public function getNameAttribute()
+ protected static function boot()
{
- return $this->first_name . ' ' . $this->last_name;
+ static::addGlobalScope('address_type', static function (Builder $builder) {
+ $builder->where('address_type', self::ADDRESS_TYPE);
+ });
+
+ parent::boot();
}
}
diff --git a/packages/Webkul/Product/src/Repositories/ProductRepository.php b/packages/Webkul/Product/src/Repositories/ProductRepository.php
index 4a9acacaf..711207976 100755
--- a/packages/Webkul/Product/src/Repositories/ProductRepository.php
+++ b/packages/Webkul/Product/src/Repositories/ProductRepository.php
@@ -145,14 +145,16 @@ class ProductRepository extends Repository
if (isset($params['sort'])) {
$attribute = $this->attributeRepository->findOneByField('code', $params['sort']);
- if ($params['sort'] == 'price') {
- if ($attribute->code == 'price') {
- $qb->orderBy('min_price', $params['order']);
+ if ($attribute) {
+ if ($params['sort'] == 'price') {
+ if ($attribute->code == 'price') {
+ $qb->orderBy('min_price', $params['order']);
+ } else {
+ $qb->orderBy($attribute->code, $params['order']);
+ }
} else {
- $qb->orderBy($attribute->code, $params['order']);
+ $qb->orderBy($params['sort'] == 'created_at' ? 'product_flat.created_at' : $attribute->code, $params['order']);
}
- } else {
- $qb->orderBy($params['sort'] == 'created_at' ? 'product_flat.created_at' : $attribute->code, $params['order']);
}
}
@@ -262,7 +264,7 @@ class ProductRepository extends Repository
->where('product_flat.new', 1)
->where('product_flat.channel', $channel)
->where('product_flat.locale', $locale)
- ->orderBy('product_id', 'desc');
+ ->inRandomOrder();
})->paginate(4);
return $results;
@@ -287,7 +289,7 @@ class ProductRepository extends Repository
->where('product_flat.featured', 1)
->where('product_flat.channel', $channel)
->where('product_flat.locale', $locale)
- ->orderBy('product_id', 'desc');
+ ->inRandomOrder();
})->paginate(4);
return $results;
diff --git a/packages/Webkul/Product/src/Type/Configurable.php b/packages/Webkul/Product/src/Type/Configurable.php
index 49293fb7d..bd19a33f2 100644
--- a/packages/Webkul/Product/src/Type/Configurable.php
+++ b/packages/Webkul/Product/src/Type/Configurable.php
@@ -397,6 +397,7 @@ class Configurable extends AbstractType
public function getPriceHtml()
{
return '' . trans('shop::app.products.price-label') . ''
+ . ' '
. '' . core()->currency($this->getMinimalPrice()) . '';
}
@@ -523,7 +524,11 @@ class Configurable extends AbstractType
$product = $item->product;
}
} else {
- $product = $item->child->product;
+ if ($item instanceof \Webkul\Customer\Contracts\CartItem) {
+ $product = $item->child->product;
+ } else {
+ $product = $item->product;
+ }
}
return $this->productImageHelper->getProductBaseImage($product);
diff --git a/packages/Webkul/Product/src/Type/Grouped.php b/packages/Webkul/Product/src/Type/Grouped.php
index b170f688a..aba9c455f 100644
--- a/packages/Webkul/Product/src/Type/Grouped.php
+++ b/packages/Webkul/Product/src/Type/Grouped.php
@@ -147,6 +147,7 @@ class Grouped extends AbstractType
public function getPriceHtml()
{
return '' . trans('shop::app.products.starting-at') . ''
+ . ' '
. '' . core()->currency($this->getMinimalPrice()) . '';
}
diff --git a/packages/Webkul/Sales/src/Database/Factories/OrderAddressFactory.php b/packages/Webkul/Sales/src/Database/Factories/OrderAddressFactory.php
index 12f1004f6..d8b44c4bc 100644
--- a/packages/Webkul/Sales/src/Database/Factories/OrderAddressFactory.php
+++ b/packages/Webkul/Sales/src/Database/Factories/OrderAddressFactory.php
@@ -10,7 +10,7 @@ use Webkul\Sales\Models\OrderAddress;
$factory->define(OrderAddress::class, function (Faker $faker) {
$customer = factory(Customer::class)->create();
- $customerAddress = factory(CustomerAddress::class)->create();
+ $customerAddress = factory(CustomerAddress::class)->make();
return [
'first_name' => $customer->first_name,
@@ -22,7 +22,7 @@ $factory->define(OrderAddress::class, function (Faker $faker) {
'city' => $customerAddress->city,
'postcode' => $customerAddress->postcode,
'phone' => $customerAddress->phone,
- 'address_type' => 'billing',
+ 'address_type' => OrderAddress::ADDRESS_TYPE_BILLING,
'order_id' => function () {
return factory(Order::class)->create()->id;
},
@@ -30,5 +30,5 @@ $factory->define(OrderAddress::class, function (Faker $faker) {
});
$factory->state(OrderAddress::class, 'shipping', [
- 'address_type' => 'shipping',
+ 'address_type' => OrderAddress::ADDRESS_TYPE_SHIPPING,
]);
\ No newline at end of file
diff --git a/packages/Webkul/Sales/src/Database/Factories/OrderItemFactory.php b/packages/Webkul/Sales/src/Database/Factories/OrderItemFactory.php
index 3aa99c33f..104f95831 100644
--- a/packages/Webkul/Sales/src/Database/Factories/OrderItemFactory.php
+++ b/packages/Webkul/Sales/src/Database/Factories/OrderItemFactory.php
@@ -7,10 +7,14 @@ use Webkul\Product\Models\Product;
use Webkul\Sales\Models\Order;
use Webkul\Sales\Models\OrderItem;
-$factory->define(OrderItem::class, function (Faker $faker) {
+$factory->define(OrderItem::class, function (Faker $faker, array $attributes) {
$now = date("Y-m-d H:i:s");
- $product = factory(Product::class, 'simple')->create();
+ if (isset($attributes['product_id'])) {
+ $product = Product::where('id', $attributes['product_id'])->first();
+ } else {
+ $product = factory(Product::class)->create();
+ }
return [
'sku' => $product->sku,
diff --git a/packages/Webkul/Sales/src/Models/Invoice.php b/packages/Webkul/Sales/src/Models/Invoice.php
index 127ddfaf4..65d9a850a 100755
--- a/packages/Webkul/Sales/src/Models/Invoice.php
+++ b/packages/Webkul/Sales/src/Models/Invoice.php
@@ -34,7 +34,8 @@ class Invoice extends Model implements InvoiceContract
/**
* Get the invoice items record associated with the invoice.
*/
- public function items() {
+ public function items()
+ {
return $this->hasMany(InvoiceItemProxy::modelClass())->whereNull('parent_id');
}
@@ -55,10 +56,11 @@ class Invoice extends Model implements InvoiceContract
}
/**
- * Get the addresses for the shipment.
+ * Get the address for the invoice.
*/
public function address()
{
- return $this->belongsTo(OrderAddressProxy::modelClass(), 'order_address_id');
+ return $this->belongsTo(OrderAddressProxy::modelClass(), 'order_address_id')
+ ->where('address_type', OrderAddress::ADDRESS_TYPE_BILLING);
}
}
\ No newline at end of file
diff --git a/packages/Webkul/Sales/src/Models/Order.php b/packages/Webkul/Sales/src/Models/Order.php
index 436c179d3..32df169f6 100755
--- a/packages/Webkul/Sales/src/Models/Order.php
+++ b/packages/Webkul/Sales/src/Models/Order.php
@@ -8,6 +8,14 @@ use Webkul\Sales\Contracts\Order as OrderContract;
class Order extends Model implements OrderContract
{
+ public const STATUS_PENDING = 'pending';
+ public const STATUS_PENDING_PAYMENT = 'pending_payment';
+ public const STATUS_PROCESSING = 'processing';
+ public const STATUS_COMPLETED = 'completed';
+ public const STATUS_CANCELED = 'canceled';
+ public const STATUS_CLOSED = 'closed';
+ public const STATUS_FRAUD = 'fraud';
+
protected $guarded = [
'id',
'items',
@@ -21,13 +29,13 @@ class Order extends Model implements OrderContract
];
protected $statusLabel = [
- 'pending' => 'Pending',
- 'pending_payment' => 'Pending Payment',
- 'processing' => 'Processing',
- 'completed' => 'Completed',
- 'canceled' => 'Canceled',
- 'closed' => 'Closed',
- 'fraud' => 'Fraud',
+ self::STATUS_PENDING => 'Pending',
+ self::STATUS_PENDING_PAYMENT => 'Pending Payment',
+ self::STATUS_PROCESSING => 'Processing',
+ self::STATUS_COMPLETED => 'Completed',
+ self::STATUS_CANCELED => 'Canceled',
+ self::STATUS_CLOSED => 'Closed',
+ self::STATUS_FRAUD => 'Fraud',
];
/**
@@ -147,7 +155,7 @@ class Order extends Model implements OrderContract
*/
public function billing_address()
{
- return $this->addresses()->where('address_type', 'billing');
+ return $this->addresses()->where('address_type', OrderAddress::ADDRESS_TYPE_BILLING);
}
/**
@@ -163,7 +171,7 @@ class Order extends Model implements OrderContract
*/
public function shipping_address()
{
- return $this->addresses()->where('address_type', 'shipping');
+ return $this->addresses()->where('address_type', OrderAddress::ADDRESS_TYPE_SHIPPING);
}
/**
@@ -187,7 +195,7 @@ class Order extends Model implements OrderContract
*
* @return boolean
*/
- public function haveStockableItems()
+ public function haveStockableItems(): bool
{
foreach ($this->items as $item) {
if ($item->getTypeInstance()->isStockable()) {
@@ -200,10 +208,12 @@ class Order extends Model implements OrderContract
/**
* Checks if new shipment is allow or not
+ *
+ * @return bool
*/
- public function canShip()
+ public function canShip(): bool
{
- if ($this->status == 'fraud') {
+ if ($this->status === self::STATUS_FRAUD) {
return false;
}
@@ -218,10 +228,12 @@ class Order extends Model implements OrderContract
/**
* Checks if new invoice is allow or not
+ *
+ * @return bool
*/
- public function canInvoice()
+ public function canInvoice(): bool
{
- if ($this->status == 'fraud') {
+ if ($this->status === self::STATUS_FRAUD) {
return false;
}
@@ -236,10 +248,12 @@ class Order extends Model implements OrderContract
/**
* Checks if order can be canceled or not
+ *
+ * @return bool
*/
- public function canCancel()
+ public function canCancel(): bool
{
- if ($this->status == 'fraud') {
+ if ($this->status === self::STATUS_FRAUD) {
return false;
}
@@ -254,10 +268,12 @@ class Order extends Model implements OrderContract
/**
* Checks if order can be refunded or not
+ *
+ * @return bool
*/
- public function canRefund()
+ public function canRefund(): bool
{
- if ($this->status == 'fraud') {
+ if ($this->status === self::STATUS_FRAUD) {
return false;
}
diff --git a/packages/Webkul/Sales/src/Models/OrderAddress.php b/packages/Webkul/Sales/src/Models/OrderAddress.php
index d1bcddc62..a8a63f700 100755
--- a/packages/Webkul/Sales/src/Models/OrderAddress.php
+++ b/packages/Webkul/Sales/src/Models/OrderAddress.php
@@ -2,47 +2,64 @@
namespace Webkul\Sales\Models;
-use Illuminate\Database\Eloquent\Model;
-use Webkul\Customer\Models\Customer;
+use Webkul\Checkout\Models\CartAddress;
+use Webkul\Core\Models\Address;
use Webkul\Sales\Contracts\OrderAddress as OrderAddressContract;
+use Illuminate\Database\Eloquent\Builder;
-class OrderAddress extends Model implements OrderAddressContract
+/**
+ * Class OrderAddress
+ * @package Webkul\Sales\Models
+ *
+ * @property integer $order_id
+ * @property Order $order
+ *
+ */
+class OrderAddress extends Address implements OrderAddressContract
{
- protected $table = 'order_address';
+ public const ADDRESS_TYPE_SHIPPING = 'order_shipping';
+ public const ADDRESS_TYPE_BILLING = 'order_billing';
- protected $guarded = ['id', 'created_at', 'updated_at'];
-
- protected $fillable = [
- 'first_name',
- 'last_name',
- 'email',
- 'company_name',
- 'vat_id',
- 'address1',
- 'address2',
- 'city',
- 'state',
- 'postcode',
- 'country',
- 'phone',
- 'address_type',
- 'cart_id',
- 'customer_id',
+ /**
+ * @var array default values
+ */
+ protected $attributes = [
+ 'address_type' => self::ADDRESS_TYPE_BILLING,
];
/**
- * Get of the customer fullname.
+ * The "booted" method of the model.
+ *
+ * @return void
*/
- public function getNameAttribute()
+ protected static function boot()
{
- return $this->first_name . ' ' . $this->last_name;
+ static::addGlobalScope('address_type', function (Builder $builder) {
+ $builder->whereIn('address_type', [
+ self::ADDRESS_TYPE_BILLING,
+ self::ADDRESS_TYPE_SHIPPING
+ ]);
+ });
+
+ static::creating(static function ($address) {
+ switch ($address->address_type) {
+ case CartAddress::ADDRESS_TYPE_BILLING:
+ $address->address_type = self::ADDRESS_TYPE_BILLING;
+ break;
+ case CartAddress::ADDRESS_TYPE_SHIPPING:
+ $address->address_type = self::ADDRESS_TYPE_SHIPPING;
+ break;
+ }
+ });
+
+ parent::boot();
}
/**
- * Get the customer record associated with the order.
+ * Get the order record associated with the address.
*/
- public function customer()
+ public function order()
{
- return $this->belongsTo(Customer::class);
+ return $this->belongsTo(Order::class);
}
}
\ No newline at end of file
diff --git a/packages/Webkul/Sales/src/Models/Shipment.php b/packages/Webkul/Sales/src/Models/Shipment.php
index 1627100a5..8dc2cbb87 100755
--- a/packages/Webkul/Sales/src/Models/Shipment.php
+++ b/packages/Webkul/Sales/src/Models/Shipment.php
@@ -47,10 +47,11 @@ class Shipment extends Model implements ShipmentContract
}
/**
- * Get the addresses for the shipment.
+ * Get the address for the shipment.
*/
public function address()
{
- return $this->belongsTo(OrderAddressProxy::modelClass(), 'order_address_id');
+ return $this->belongsTo(OrderAddressProxy::modelClass(), 'order_address_id')
+ ->where('address_type', OrderAddress::ADDRESS_TYPE_SHIPPING);
}
}
\ No newline at end of file
diff --git a/packages/Webkul/Shipping/src/Carriers/FlatRate.php b/packages/Webkul/Shipping/src/Carriers/FlatRate.php
index 5cbf59083..6170bce6b 100755
--- a/packages/Webkul/Shipping/src/Carriers/FlatRate.php
+++ b/packages/Webkul/Shipping/src/Carriers/FlatRate.php
@@ -23,7 +23,7 @@ class FlatRate extends AbstractShipping
/**
* Returns rate for flatrate
*
- * @return array
+ * @return CartShippingRate|false
*/
public function calculate()
{
diff --git a/packages/Webkul/Shipping/src/Carriers/Free.php b/packages/Webkul/Shipping/src/Carriers/Free.php
index f03247c94..c3c0e0ec5 100755
--- a/packages/Webkul/Shipping/src/Carriers/Free.php
+++ b/packages/Webkul/Shipping/src/Carriers/Free.php
@@ -22,7 +22,7 @@ class Free extends AbstractShipping
/**
* Returns rate for flatrate
*
- * @return array
+ * @return CartShippingRate|false
*/
public function calculate()
{
diff --git a/packages/Webkul/Shop/src/Http/Controllers/OnepageController.php b/packages/Webkul/Shop/src/Http/Controllers/OnepageController.php
index 51964b6d4..bab8b0b40 100755
--- a/packages/Webkul/Shop/src/Http/Controllers/OnepageController.php
+++ b/packages/Webkul/Shop/src/Http/Controllers/OnepageController.php
@@ -2,6 +2,7 @@
namespace Webkul\Shop\Http\Controllers;
+use Illuminate\Support\Facades\Event;
use Webkul\Shop\Http\Controllers\Controller;
use Webkul\Checkout\Facades\Cart;
use Webkul\Shipping\Facades\Shipping;
@@ -21,7 +22,7 @@ class OnepageController extends Controller
/**
* customerRepository instance object
- *
+ *
* @var \Webkul\Customer\Repositories\CustomerRepository
*/
protected $customerRepository;
@@ -52,6 +53,8 @@ class OnepageController extends Controller
*/
public function index()
{
+ Event::dispatch('checkout.load.index');
+
if (! auth()->guard('customer')->check()
&& ! core()->getConfigData('catalog.products.guest-checkout.allow-guest-checkout')) {
return redirect()->route('customer.session.index');
diff --git a/packages/Webkul/Shop/src/Resources/lang/ja/app.php b/packages/Webkul/Shop/src/Resources/lang/ja/app.php
new file mode 100644
index 000000000..990e7c22f
--- /dev/null
+++ b/packages/Webkul/Shop/src/Resources/lang/ja/app.php
@@ -0,0 +1,616 @@
+ 'セキュリティの警告',
+ 'nothing-to-delete' => '削除するアイテムはありません',
+
+ 'layouts' => [
+ 'my-account' => 'マイアカウント',
+ 'profile' => 'プロフィール',
+ 'address' => 'アドレス',
+ 'reviews' => 'レビュー',
+ 'wishlist' => 'お気に入り',
+ 'orders' => '注文',
+ 'downloadable-products' => 'ダウンロードアイテム'
+ ],
+
+ 'common' => [
+ 'error' => 'エラーが発生しました。しばらく待ってから、再度アクセスしてください。'
+ ],
+
+ 'home' => [
+ 'page-title' => config('app.name') . ' - ホーム',
+ 'featured-products' => 'おすすめ',
+ 'new-products' => 'New',
+ 'verify-email' => 'メールアドレスを確認します',
+ 'resend-verify-email' => '確認メールを再送信'
+ ],
+
+ 'header' => [
+ 'title' => 'アカウント',
+ 'dropdown-text' => 'カート、注文、お気に入りの管理',
+ 'sign-in' => 'ログイン',
+ 'sign-up' => 'アカウント登録',
+ 'account' => 'アカウント',
+ 'cart' => 'カート',
+ 'profile' => 'プロフィール',
+ 'wishlist' => 'お気に入り',
+ 'logout' => 'ログアウト',
+ 'search-text' => 'アイテムを探す'
+ ],
+
+ 'minicart' => [
+ 'view-cart' => 'カートを見る',
+ 'checkout' => 'レジへ進む',
+ 'cart' => 'カート',
+ 'zero' => '0'
+ ],
+
+ 'footer' => [
+ 'subscribe-newsletter' => 'メルマガ登録',
+ 'subscribe' => '登録',
+ 'locale' => '言語',
+ 'currency' => '通貨',
+ ],
+
+ 'subscription' => [
+ 'unsubscribe' => '退会',
+ 'subscribe' => '登録',
+ 'subscribed' => 'メルマガ登録が完了しました',
+ 'not-subscribed' => 'メルマガ登録ができません。しばらく待ってから、再度お試しください。',
+ 'already' => '既にメルマガ登録済です',
+ 'unsubscribed' => '退会しました',
+ 'already-unsub' => '既に退会済です',
+ 'not-subscribed' => 'メールを送信できませんでした。しばらくしてから再度お試しください。'
+ ],
+
+ 'search' => [
+ 'no-results' => 'お探しの条件に合う検索結果が見つかりませんでした。',
+ 'page-title' => '検索',
+ 'found-results' => '検索結果',
+ 'found-result' => '検索結果'
+ ],
+
+ 'reviews' => [
+ 'title' => 'レビュー',
+ 'add-review-page-title' => 'レビューを書く',
+ 'write-review' => 'レビューを書く',
+ 'review-title' => 'タイトル',
+ 'product-review-page-title' => 'アイテムのレビュー',
+ 'rating-reviews' => '評価と意見',
+ 'submit' => '送信',
+ 'delete-all' => '全て削除します',
+ 'ratingreviews' => ':rating 評価 & :review レビュー',
+ 'star' => '星',
+ 'percentage' => ':percentage %',
+ 'id-star' => '星',
+ 'name' => '名前'
+ ],
+
+ 'customer' => [
+ 'signup-text' => [
+ 'account_exists' => '既に登録されております',
+ 'title' => 'アカウント登録'
+ ],
+
+ 'signup-form' => [
+ 'page-title' => 'アカウント登録',
+ 'title' => 'アカウント登録',
+ 'firstname' => '名',
+ 'lastname' => '姓',
+ 'email' => 'メールアドレス',
+ 'password' => 'パスワード',
+ 'confirm_pass' => 'パスワードを確認',
+ 'button_title' => '登録',
+ 'agree' => '同意',
+ 'terms' => '規約',
+ 'conditions' => '条件',
+ 'using' => 'by using this website',
+ 'agreement' => '承諾',
+ 'success' => 'アカウントが登録されました',
+ 'success-verify' => 'アカウント登録完了の確認メールが送信されました',
+ 'success-verify-email-unsent' => 'アカウント登録が完了されましたが、確認メールが送信ができませんでした',
+ 'failed' => 'アカウント登録ができませんでした しばらくしてから、再度お試しください',
+ 'already-verified' => '既にアカウントをお持ちです 確認メールを再度送信してください',
+ 'verification-not-sent' => '確認メールの送信中に問題が発生しました しばらくしてから、再度お試しください',
+ 'verification-sent' => '確認メールが送信されました',
+ 'verified' => 'アカウント登録が完了しました ログインしてください',
+ 'verify-failed' => 'メールアドレスの確認ができませんでした',
+ 'dont-have-account' => 'アカウント登録がされていません',
+ 'customer-registration' => 'アカウント登録'
+ ],
+
+ 'login-text' => [
+ 'no_account' => 'アカウントがありません',
+ 'title' => '新規アカウント登録',
+ ],
+
+ 'login-form' => [
+ 'page-title' => 'ログイン',
+ 'title' => 'ログイン',
+ 'email' => 'メールアドレス',
+ 'password' => 'パスワード',
+ 'forgot_pass' => 'パスワードをお忘れですか',
+ 'button_title' => 'ログイン',
+ 'remember' => 'ログイン状態を保持する',
+ 'footer' => '© Copyright :year Webkul Software, All rights reserved',
+ 'invalid-creds' => 'ログイン情報を確認してください',
+ 'verify-first' => 'メールアドレスを認証してください',
+ 'not-activated' => 'このアカウントは管理者の認証が出来次第、有効になります',
+ 'resend-verification' => 'アカウント確認メールが再送信'
+ ],
+
+ 'forgot-password' => [
+ 'title' => 'パスワードの再発行',
+ 'email' => 'メールアドレス',
+ 'submit' => 'パスワード再発行メールを送信',
+ 'page_title' => 'パスワードの再発行'
+ ],
+
+ 'reset-password' => [
+ 'title' => 'パスワードを再発行',
+ 'email' => '登録メールアドレス',
+ 'password' => 'パスワード',
+ 'confirm-password' => 'パスワード確認',
+ 'back-link-title' => '戻る',
+ 'submit-btn-title' => 'パスワードをリセット'
+ ],
+
+ 'account' => [
+ 'dashboard' => 'プロフィールを編集',
+ 'menu' => 'メニュー',
+
+ 'profile' => [
+ 'index' => [
+ 'page-title' => 'プロフィール',
+ 'title' => 'プロフィール',
+ 'edit' => '編集',
+ ],
+
+ 'edit-success' => 'プロフィールが更新されました',
+ 'edit-fail' => 'プロフィールを更新できませんでした しばらくしてから再度お試しください。',
+ 'unmatch' => 'パスワードが一致しません',
+
+ 'fname' => '名',
+ 'lname' => '姓',
+ 'gender' => '性別',
+ 'other' => 'その他',
+ 'male' => '男性',
+ 'female' => '女性',
+ 'dob' => '生年月日',
+ 'phone' => '電話番号',
+ 'email' => 'メールアドレス',
+ 'opassword' => '前のパスワード',
+ 'password' => 'パスワード',
+ 'cpassword' => 'パスワード確認',
+ 'submit' => '保存する',
+
+ 'edit-profile' => [
+ 'title' => 'プロフィールの編集',
+ 'page-title' => 'プロフィールの編集'
+ ]
+ ],
+
+ 'address' => [
+ 'index' => [
+ 'page-title' => '住所',
+ 'title' => '住所',
+ 'add' => '住所を追加',
+ 'edit' => '編集',
+ 'empty' => '住所が登録されておりません 下のリンクから作成してください',
+ 'create' => '住所を作成',
+ 'delete' => '削除',
+ 'make-default' => '既定の住所に設定',
+ 'default' => '既定の住所',
+ 'contact' => '連絡先',
+ 'confirm-delete' => 'この住所を削除しますか?',
+ 'default-delete' => '既定の住所の削除ができません',
+ 'enter-password' => 'パスワードを入力してください',
+ ],
+
+ 'create' => [
+ 'page-title' => '新規住所登録',
+ 'title' => '住所を追加',
+ 'street-address' => '住所',
+ 'country' => '国',
+ 'state' => '都道府県',
+ 'select-state' => '都道府県を選択してください',
+ 'city' => '市町村',
+ 'postcode' => '郵便番号',
+ 'phone' => '電話番号',
+ 'submit' => '保存する',
+ 'success' => '住所が保存されました',
+ 'error' => '住所の保存に失敗しました。'
+ ],
+
+ 'edit' => [
+ 'page-title' => '住所を編集',
+ 'title' => '住所を編集',
+ 'street-address' => '住所',
+ 'submit' => '保存する',
+ 'success' => '住所が更新されました',
+ ],
+ 'delete' => [
+ 'success' => '住所が削除されました',
+ 'failure' => '住所の削除に失敗しました。',
+ 'wrong-password' => 'パスワードが正しくありません'
+ ]
+ ],
+
+ 'order' => [
+ 'index' => [
+ 'page-title' => '注文一覧',
+ 'title' => '注文一覧',
+ 'order_id' => '注文ID',
+ 'date' => '日時',
+ 'status' => '状況',
+ 'total' => '合計',
+ 'order_number' => '注文番号'
+ ],
+
+ 'view' => [
+ 'page-tile' => '注文 #:order_id',
+ 'info' => '詳細',
+ 'placed-on' => '日時',
+ 'products-ordered' => '注文内容',
+ 'invoices' => '領収書',
+ 'shipments' => '発送',
+ 'SKU' => 'SKU',
+ 'product-name' => 'アイテム番号',
+ 'qty' => '数',
+ 'item-status' => 'アイテム状況',
+ 'item-ordered' => '注文完了 (:qty_ordered)',
+ 'item-invoice' => '領収書発行済 (:qty_invoiced)',
+ 'item-shipped' => '発送済 (:qty_shipped)',
+ 'item-canceled' => 'キャンセル済 (:qty_canceled)',
+ 'price' => '価格',
+ 'total' => '合計',
+ 'subtotal' => '小計',
+ 'shipping-handling' => '送料',
+ 'tax' => '消費税',
+ 'discount' => '割引',
+ 'tax-percent' => '消費税割合',
+ 'tax-amount' => '消費税',
+ 'discount-amount' => '割引',
+ 'grand-total' => '合計',
+ 'total-paid' => '合計金額',
+ 'total-refunded' => '返金額',
+ 'total-due' => '合計',
+ 'shipping-address' => '送付先',
+ 'billing-address' => '領収書宛先',
+ 'shipping-method' => '配送方法',
+ 'payment-method' => '支払い方法',
+ 'individual-invoice' => '領収書 #:invoice_id',
+ 'individual-shipment' => '出荷 #:shipment_id',
+ 'print' => '印刷',
+ 'invoice-id' => '領収書番号',
+ 'order-id' => '注文番号',
+ 'order-date' => '注文日',
+ 'bill-to' => '請求先',
+ 'ship-to' => '送り先',
+ 'contact' => '連絡先',
+ 'refunds' => '返金',
+ 'individual-refund' => '返金 #:refund_id',
+ 'adjustment-refund' => '返金調整',
+ 'adjustment-fee' => '調整手数料',
+ ]
+ ],
+
+ 'wishlist' => [
+ 'page-title' => 'お気に入り',
+ 'title' => 'お気に入り',
+ 'deleteall' => '全て削除',
+ 'moveall' => '全てのアイテムをカートへ移動する',
+ 'move-to-cart' => 'カートへ移動',
+ 'error' => 'アイテムのお気に入り追加に失敗しました。しばらくしてから再度お試し下さい。',
+ 'add' => 'アイテムをお気に入りに追加',
+ 'remove' => 'アイテムをお気に入りから削除',
+ 'moved' => 'アイテムをカートへ移動しました',
+ 'move-error' => 'アイテムのお気に入り追加に失敗しました。しばらくしてから再度お試し下さい。',
+ 'success' => 'アイテムをお気に入りに追加しました',
+ 'failure' => 'アイテムのお気に入り追加に失敗しました。しばらくしてから再度お試し下さい。',
+ 'already' => 'このアイテムは既にお気に入りに追加されています。',
+ 'removed' => 'アイテムはお気に入りから削除されました。',
+ 'remove-fail' => 'アイテムをお気に入りから削除することができませんでした。しばらくしてから再度お試し下さい。',
+ 'empty' => 'お気に入りにアイテムがありません。',
+ 'remove-all-success' => '全てのアイテムがお気に入りから削除されました。',
+ ],
+
+ 'downloadable_products' => [
+ 'title' => 'ダウンロードアイテム',
+ 'order-id' => '注文番号',
+ 'date' => '日時',
+ 'name' => 'アイテム名',
+ 'status' => 'ステータス',
+ 'pending' => '処理中',
+ 'available' => 'ダウンロード可能',
+ 'expired' => '期限切れ',
+ 'remaining-downloads' => '残りのダウンロード数',
+ 'unlimited' => '無制限',
+ 'download-error' => 'ダウンロードリンクの有効期限が切れています.'
+ ],
+
+ 'review' => [
+ 'index' => [
+ 'title' => 'レビュー',
+ 'page-title' => 'レビュー'
+ ],
+
+ 'view' => [
+ 'page-tile' => 'レビュー #:id',
+ ]
+ ]
+ ]
+ ],
+
+ 'products' => [
+ 'layered-nav-title' => 'Shop By',
+ 'price-label' => 'As low as',
+ 'remove-filter-link-title' => '全て削除',
+ 'sort-by' => '並び順',
+ 'from-a-z' => 'From A-Z',
+ 'from-z-a' => 'From Z-A',
+ 'newest-first' => '新着順',
+ 'oldest-first' => '古い順',
+ 'cheapest-first' => '価格が安い順',
+ 'expensive-first' => '価格が高い順',
+ 'show' => 'Show',
+ 'pager-info' => ':showing - :total',
+ 'description' => '解説',
+ 'specification' => '仕様',
+ 'total-reviews' => ':全てのレビュー',
+ 'total-rating' => ':total_rating Ratings & :total_reviews Reviews',
+ 'by' => 'By :name',
+ 'up-sell-title' => 'お客様におすすめのアイテム',
+ 'related-product-title' => '関連アイテム',
+ 'cross-sell-title' => 'Más opciones',
+ 'reviews-title' => 'レビュー',
+ 'write-review-btn' => '評価を書いてください',
+ 'choose-option' => 'オプションを選択',
+ 'sale' => 'セール',
+ 'new' => 'new',
+ 'empty' => 'このカテゴリーにアイテムがありません。',
+ 'add-to-cart' => 'カートに追加する',
+ 'buy-now' => '今すぐ購入',
+ 'whoops' => 'すみません!',
+ 'quantity' => '数量',
+ 'in-stock' => '在庫あり',
+ 'out-of-stock' => '在庫なし',
+ 'view-all' => '全て見る',
+ 'select-above-options' => '最初に上記のオプションを選択してください.',
+ 'less-quantity' => '数量1未満は選択できません.'
+ ],
+
+ 'buynow' => [
+ 'no-options' => 'このアイテムを購入される前にオプションを選択してください'
+ ],
+
+ 'checkout' => [
+ 'cart' => [
+ 'integrity' => [
+ 'missing_fields' =>'赤くなった項目を入力してください',
+ 'missing_options' => 'Options are missing for this product.',
+ 'missing_links' => 'Downloadable links are missing for this product.',
+ 'qty_missing' => 'Atleast one product should have more than 1 quantity.',
+ 'qty_impossible' => 'Cannot add more than one of these products to cart.'
+ ],
+ 'create-error' => 'カートで問題が発生しました',
+ 'title' => 'カート',
+ 'empty' => 'カートが空です。',
+ 'update-cart' => 'カートを更新する',
+ 'continue-shopping' => '買い物を続ける',
+ 'proceed-to-checkout' => '購入手続きに進む',
+ 'remove' => '削除',
+ 'remove-link' => '削除',
+ 'move-to-wishlist' => 'お気に入りに移動する',
+ 'move-to-wishlist-success' => 'アイテムがお気に入りに追加されました。',
+ 'move-to-wishlist-error' => 'アイテムをお気に入りに追加することができませんでした。しばらくしてから再度お試し下さい。',
+ 'add-config-warning' => 'カートに追加する前にオプションを選択してください',
+ 'quantity' => [
+ 'quantity' => '数量',
+ 'success' => 'カートが更新されました。',
+ 'illegal' => '数量を1以下にすることは出来ません。',
+ 'inventory_warning' => 'ご希望の数量の在庫が現在ございません。しばらくしてから再度お試し下さい。現在在庫がございません。',
+ 'error' => 'アイテムの更新が出来ませんでした。しばらくしてから再度お試し下さい。'
+ ],
+ 'item' => [
+ 'error_remove' => 'カートに削除するアイテムがございません。',
+ 'success' => 'アイテムがカートに追加されました。',
+ 'success-remove' => 'アイテムがカートから削除されました。',
+ 'error-add' => 'アイテムをカートに追加できません。しばらくしてから再度お試し下さい。',
+ ],
+ 'quantity-error' => 'ご希望の数量の在庫が現在ございません。',
+ 'cart-subtotal' => '小計',
+ 'cart-remove-action' => '手続きを進めますか。',
+ 'partial-cart-update' => 'Only some of the product(s) were updated',
+ 'link-missing' => ''
+ ],
+
+ 'onepage' => [
+ 'title' => 'レジ',
+ 'information' => '詳細',
+ 'shipping' => '発送',
+ 'payment' => '支払い',
+ 'complete' => '完了',
+ 'billing-address' => '領収書宛先',
+ 'sign-in' => 'ログイン',
+ 'first-name' => '名',
+ 'last-name' => '姓',
+ 'email' => 'メールアドレス',
+ 'address1' => '住所',
+ 'city' => '市町村',
+ 'state' => '都道府県',
+ 'select-state' => '地域を選択 都道府県 市町村',
+ 'postcode' => '郵便番号',
+ 'phone' => '電話番号',
+ 'country' => '国',
+ 'order-summary' => '注文内容',
+ 'shipping-address' => '送付先住所',
+ 'use_for_shipping' => 'この住所に送る',
+ 'continue' => '続ける',
+ 'shipping-method' => '発送方法を選択',
+ 'payment-methods' => '支払い方法を選択',
+ 'payment-method' => '支払い方法',
+ 'summary' => '注文内容',
+ 'price' => '金額',
+ 'quantity' => '数量',
+ 'billing-address' => '領収書宛先',
+ 'shipping-address' => '送付先',
+ 'contact' => '連絡先',
+ 'place-order' => '注文を確定する',
+ 'new-address' => '新しい住所を追加する',
+ 'save_as_address' => '住所を保存',
+ 'apply-coupon' => 'クーポンを使用する',
+ 'amt-payable' => 'お支払い金額',
+ 'got' => 'Got',
+ 'free' => '無料',
+ 'coupon-used' => '使用済クーポン',
+ 'applied' => '適用されました',
+ 'back' => '戻る',
+ 'cash-desc' => '現金支払い',
+ 'money-desc' => '銀行振り込み',
+ 'paypal-desc' => 'Paypal',
+ 'free-desc' => '送料無料',
+ 'flat-desc' => '送料一律'
+ ],
+
+ 'total' => [
+ 'order-summary' => '注文を確定する',
+ 'sub-total' => 'アイテム',
+ 'grand-total' => '合計',
+ 'delivery-charges' => '送料',
+ 'tax' => '税',
+ 'discount' => '割引',
+ 'price' => '金額',
+ 'disc-amount' => '割引額',
+ 'new-grand-total' => '合計',
+ 'coupon' => 'クーポン',
+ 'coupon-applied' => '使用済みクーポン',
+ 'remove-coupon' => 'クーポンを削除',
+ 'cannot-apply-coupon' => 'クーポンを使用することができません'
+ ],
+
+ 'success' => [
+ 'title' => '注文が正しく完了しました',
+ 'thanks' => 'ご注文ありがとうございます',
+ 'order-id-info' => 'お客様の注文番号 #:order_id',
+ 'info' => 'お客様のご注文詳細と追跡情報をメールアドレスに送ります'
+ ]
+ ],
+
+ 'mail' => [
+ 'order' => [
+ 'subject' => 'ご注文ありがとうございます',
+ 'heading' => 'ご注文の受付が完了しました。',
+ 'dear' => ':customer_name様',
+ 'dear-admin' => ':admin_name様',
+ 'greeting' => 'この度は当ショップでお買い物いただきありがとうございます。 お客様注文番号 :order_id',
+ 'greeting-admin' => '注文番号 :order_id placed on :created_at',
+ 'summary' => '注文内容',
+ 'shipping-address' => '送付先住所',
+ 'billing-address' => '領収書宛先',
+ 'contact' => '連絡先',
+ 'shipping' => '配送方法',
+ 'payment' => '支払い方法',
+ 'price' => '金額',
+ 'quantity' => '数量',
+ 'subtotal' => '小計',
+ 'shipping-handling' => '送料',
+ 'tax' => '税',
+ 'discount' => '割引',
+ 'grand-total' => '合計',
+ 'final-summary' => '発送手続き完了後、お知らせメールを配信いたしますので、今しばらくお待ちください。',
+ 'help' => 'お問合せなどは下記メールアドレスへご連絡ください。:support_email',
+ 'thanks' => 'Gracias!',
+ 'cancel' => [
+ 'subject' => '注文がキャンセルされました',
+ 'heading' => '注文がキャンセルされました',
+ 'dear' => ':customer_name様',
+ 'greeting' => '注文 #:order_idはキャンセルされました。',
+ 'summary' => '注文内容',
+ 'shipping-address' => '送付先住所',
+ 'billing-address' => '領収書宛先',
+ 'contact' => '連絡先',
+ 'shipping' => '配送方法',
+ 'payment' => '支払い方法',
+ 'subtotal' => '小計',
+ 'shipping-handling' => '送料',
+ 'tax' => '税',
+ 'discount' => '割引',
+ 'grand-total' => '合計',
+ 'final-summary' => '私たちのお店にお越しいただき、ありがとうございます。',
+ 'help' => 'お問合せなどは下記メールアドレスへご連絡ください。 :support_email',
+ 'thanks' => 'Gracias!',
+ ]
+ ],
+ 'invoice' => [
+ 'heading' => '注文 #:order_idの領収書 (#:invoice_id)',
+ 'subject' => '注文 #:order_idの領収書',
+ 'summary' => '注文内容',
+ ],
+ 'shipment' => [
+ 'heading' => 'El Envío #:shipment_id ha sido generado por el pedido #:order_id',
+ 'inventory-heading' => 'Nuevo envío #:shipment_id ha sido generado por el pedido #:order_id',
+ 'subject' => 'Envío de tu pedido #:order_id',
+ 'inventory-subject' => 'Nuevo envío ha sido generado por el pedido #:order_id',
+ 'summary' => '注文内容',
+ 'carrier' => '配送業者',
+ 'tracking-number' => '追跡番号',
+ 'greeting' => 'El pedido :order_id ha sido enviado a :created_at',
+ ],
+ 'forget-password' => [
+ 'subject' => 'パスワードをリセットする',
+ 'dear' => '様 :name',
+ 'info' => 'お客様のパスワードリセットのリクエストがあったため、ご連絡致します。',
+ 'reset-password' => 'パスワードのリセット',
+ 'final-summary' => 'Si no has solicitado cambiar de contraseña, ninguna acción es requerida por tu parte.',
+ 'thanks' => 'ありがとうございます。'
+ ],
+ 'customer' => [
+ 'new' => [
+ 'dear' => '様 :customer_name',
+ 'username-email' => 'Nombre de usuario/Email',
+ 'subject' => 'Nuevo registro de cliente',
+ 'password' => 'パスワード',
+ 'summary' => 'Tu cuenta ha sido creada en Bassar.
+ Los detalles de tu cuenta puedes verlos abajo: ',
+ 'thanks' => 'ありがとうございます。',
+ ],
+
+ 'registration' => [
+ 'subject' => 'Nuevo registro de cliente',
+ 'customer-registration' => 'Cliente registrado exitosamente',
+ 'dear' => '様 :customer_name',
+ 'greeting' => '¡Bienvenido y gracias por registrarte en Bassar!',
+ 'summary' => 'Your account has now been created successfully and you can login using your email address and password credentials. Upon logging in, you will be able to access other services including reviewing past orders, wishlists and editing your account information.',
+ 'thanks' => 'ありがとうございます。',
+ ],
+
+ 'verification' => [
+ 'heading' => 'Bassar - Verificación por correo',
+ 'subject' => 'メールでの確認',
+ 'verify' => 'アカウント確認',
+ 'summary' => 'このメールは、ご本人様確認のためにお送りしています。下記のリンクからアカウント確認をお願いします。'
+ ],
+
+ 'subscription' => [
+ 'subject' => 'Subscripción mail',
+ 'greeting' => ' Bienvenido a Bassar - Subscripción por mail',
+ 'unsubscribe' => 'Darse de baja',
+ 'summary' => 'Gracias por ponernos en tu bandeja de entrada. Ha pasado un tiempo desde que leyó el último correo electrónico de Bassar, y no queremos abrumar su bandeja de entrada. Si ya no quiere recibir
+ las últimas noticias de marketing, haga clic en el botón de abajo.'
+ ]
+ ]
+ ],
+
+ 'webkul' => [
+ 'copy-right' => '© Copyright :year Webkul Software, All rights reserved',
+ ],
+
+ 'response' => [
+ 'create-success' => ':name created successfully.',
+ 'update-success' => ':name updated successfully.',
+ 'delete-success' => ':name deleted successfully.',
+ 'submit-success' => ':name submitted successfully.'
+ ],
+];
\ No newline at end of file
diff --git a/packages/Webkul/Shop/src/Resources/views/checkout/onepage/customer-info.blade.php b/packages/Webkul/Shop/src/Resources/views/checkout/onepage/customer-info.blade.php
index 5214f57c0..90fa8652c 100755
--- a/packages/Webkul/Shop/src/Resources/views/checkout/onepage/customer-info.blade.php
+++ b/packages/Webkul/Shop/src/Resources/views/checkout/onepage/customer-info.blade.php
@@ -161,6 +161,26 @@
+
+
+
+
+
+
+ @{{ errors.first('address-form.billing[country]') }}
+
+
+
-
-
-
-
-
-
- @{{ errors.first('address-form.billing[country]') }}
-
-
-
+
+
+
+
+
+
+ @{{ errors.first('address-form.shipping[country]') }}
+
+
+
-
-
-
-
-
-
- @{{ errors.first('address-form.shipping[country]') }}
-
-
-