channels()->sync($data['channels']); $cartRule->customer_groups()->sync($data['customer_groups']); if ( $data['coupon_type'] && ! $data['use_auto_generation'] ) { $this->cartRuleCouponRepository->create([ 'cart_rule_id' => $cartRule->id, 'code' => $data['coupon_code'], 'usage_limit' => $data['uses_per_coupon'] ?? 0, 'usage_per_customer' => $data['usage_per_customer'] ?? 0, 'is_primary' => 1, 'expired_at' => $data['ends_till'] ?: null, ]); } return $cartRule; } /** * @param array $data * @param int $id * @param string $attribute * @return \Webkul\CartRule\Contracts\CartRule */ public function update(array $data, $id, $attribute = 'id') { $data = array_merge($data, [ 'starts_from' => $data['starts_from'] ?: null, 'ends_till' => $data['ends_till'] ?: null, 'status' => isset($data['status']), 'conditions' => $data['conditions'] ?? [], ]); $cartRule = $this->find($id); parent::update($data, $id, $attribute); $cartRule->channels()->sync($data['channels']); $cartRule->customer_groups()->sync($data['customer_groups']); if ($data['coupon_type']) { if (! $data['use_auto_generation']) { $cartRuleCoupon = $this->cartRuleCouponRepository->findOneWhere([ 'is_primary' => 1, 'cart_rule_id' => $cartRule->id, ]); if ($cartRuleCoupon) { $this->cartRuleCouponRepository->update([ 'code' => $data['coupon_code'], 'usage_limit' => $data['uses_per_coupon'] ?? 0, 'usage_per_customer' => $data['usage_per_customer'] ?? 0, 'expired_at' => $data['ends_till'] ?: null, ], $cartRuleCoupon->id); } else { $this->cartRuleCouponRepository->create([ 'cart_rule_id' => $cartRule->id, 'code' => $data['coupon_code'], 'usage_limit' => $data['uses_per_coupon'] ?? 0, 'usage_per_customer' => $data['usage_per_customer'] ?? 0, 'is_primary' => 1, 'expired_at' => $data['ends_till'] ?: null, ]); } } else { $this->cartRuleCouponRepository->deleteWhere([ 'is_primary' => 1, 'cart_rule_id' => $cartRule->id, ]); $this->cartRuleCouponRepository->getModel()->where('cart_rule_id', $cartRule->id)->update([ 'usage_limit' => $data['uses_per_coupon'] ?? 0, 'usage_per_customer' => $data['usage_per_customer'] ?? 0, 'expired_at' => $data['ends_till'] ?: null, ]); } } else { $cartRuleCoupon = $this->cartRuleCouponRepository->deleteWhere(['is_primary' => 1, 'cart_rule_id' => $cartRule->id]); } return $cartRule; } /** * Returns attributes for cart rule conditions. * * @return array */ public function getConditionAttributes() { $attributes = [ [ 'key' => 'cart', 'label' => trans('admin::app.promotions.cart-rules.cart-attribute'), 'children' => [ [ 'key' => 'cart|base_sub_total', 'type' => 'price', 'label' => trans('admin::app.promotions.cart-rules.subtotal'), ], [ 'key' => 'cart|items_qty', 'type' => 'integer', 'label' => trans('admin::app.promotions.cart-rules.total-items-qty'), ], [ 'key' => 'cart|payment_method', 'type' => 'select', 'options' => $this->getPaymentMethods(), 'label' => trans('admin::app.promotions.cart-rules.payment-method'), ], [ 'key' => 'cart|shipping_method', 'type' => 'select', 'options' => $this->getShippingMethods(), 'label' => trans('admin::app.promotions.cart-rules.shipping-method'), ], [ 'key' => 'cart|postcode', 'type' => 'text', 'label' => trans('admin::app.promotions.cart-rules.shipping-postcode'), ], [ 'key' => 'cart|state', 'type' => 'select', 'options' => $this->groupedStatesByCountries(), 'label' => trans('admin::app.promotions.cart-rules.shipping-state'), ], [ 'key' => 'cart|country', 'type' => 'select', 'options' => $this->getCountries(), 'label' => trans('admin::app.promotions.cart-rules.shipping-country'), ], ], ], [ 'key' => 'cart_item', 'label' => trans('admin::app.promotions.cart-rules.cart-item-attribute'), 'children' => [ [ 'key' => 'cart_item|base_price', 'type' => 'price', 'label' => trans('admin::app.promotions.cart-rules.price-in-cart'), ], [ 'key' => 'cart_item|quantity', 'type' => 'integer', 'label' => trans('admin::app.promotions.cart-rules.qty-in-cart'), ], [ 'key' => 'cart_item|base_total_weight', 'type' => 'decimal', 'label' => trans('admin::app.promotions.cart-rules.total-weight'), ], [ 'key' => 'cart_item|base_total', 'type' => 'price', 'label' => trans('admin::app.promotions.cart-rules.subtotal'), ], [ 'key' => 'cart_item|additional', 'type' => 'text', 'label' => trans('admin::app.promotions.cart-rules.additional'), ], ], ], [ 'key' => 'product', 'label' => trans('admin::app.promotions.cart-rules.product-attribute'), 'children' => [ [ 'key' => 'product|category_ids', 'type' => 'multiselect', 'label' => trans('admin::app.promotions.cart-rules.categories'), 'options' => $categories = $this->categoryRepository->getCategoryTree(), ], [ 'key' => 'product|children::category_ids', 'type' => 'multiselect', 'label' => trans('admin::app.promotions.cart-rules.children-categories'), 'options' => $categories, ], [ 'key' => 'product|parent::category_ids', 'type' => 'multiselect', 'label' => trans('admin::app.promotions.cart-rules.parent-categories'), 'options' => $categories, ], [ 'key' => 'product|attribute_family_id', 'type' => 'select', 'label' => trans('admin::app.promotions.cart-rules.attribute_family'), 'options' => $this->getAttributeFamilies(), ], ], ], ]; foreach ($this->attributeRepository->findWhereNotIn('type', ['textarea', 'image', 'file']) as $attribute) { $attributeType = $attribute->type; if ($attribute->code == 'tax_category_id') { $options = $this->getTaxCategories(); } else { $options = $attribute->options; } if ($attribute->validation == 'decimal') { $attributeType = 'decimal'; } elseif ($attribute->validation == 'numeric') { $attributeType = 'integer'; } $attributes[2]['children'][] = [ 'key' => 'product|' . $attribute->code, 'type' => $attribute->type, 'label' => $attribute->name, 'options' => $options, ]; $attributes[2]['children'][] = [ 'key' => 'product|children::' . $attribute->code, 'type' => $attribute->type, 'label' => trans('admin::app.promotions.cart-rules.attribute-name-children-only', ['attribute_name' => $attribute->name]), 'options' => $options, ]; $attributes[2]['children'][] = [ 'key' => 'product|parent::' . $attribute->code, 'type' => $attribute->type, 'label' => trans('admin::app.promotions.cart-rules.attribute-name-parent-only', ['attribute_name' => $attribute->name]), 'options' => $options, ]; } return $attributes; } /** * Returns all payment methods. * * @return array */ public function getPaymentMethods() { $methods = []; foreach (config('paymentmethods') as $paymentMethod) { $object = app($paymentMethod['class']); $methods[] = [ 'id' => $object->getCode(), 'admin_name' => $object->getTitle(), ]; } return $methods; } /** * Returns all shipping methods. * * @return array */ public function getShippingMethods() { $methods = []; foreach (config('carriers') as $shippingMethod) { $object = app($shippingMethod['class']); $methods[] = [ 'id' => $object->getCode(), 'admin_name' => $object->getTitle(), ]; } return $methods; } /** * Returns all countries. * * @return array */ public function getTaxCategories() { $taxCategories = []; foreach ($this->taxCategoryRepository->all() as $taxCategory) { $taxCategories[] = [ 'id' => $taxCategory->id, 'admin_name' => $taxCategory->name, ]; } return $taxCategories; } /** * Returns all attribute families. * * @return array */ public function getAttributeFamilies() { $attributeFamilies = []; foreach ($this->attributeFamilyRepository->all() as $attributeFamily) { $attributeFamilies[] = [ 'id' => $attributeFamily->id, 'admin_name' => $attributeFamily->name, ]; } return $attributeFamilies; } /** * Returns all countries. * * @return array */ public function getCountries() { $countries = []; foreach ($this->countryRepository->all() as $country) { $countries[] = [ 'id' => $country->code, 'admin_name' => $country->name, ]; } return $countries; } /** * Retrieve all grouped states by country code. * * @return array */ public function groupedStatesByCountries() { $collection = []; foreach ($this->countryRepository->all() as $country) { $countryStates = $this->countryStateRepository->findWhere( ['country_id' => $country->id], ['code', 'default_name as admin_name'] )->toArray(); if (! count($countryStates)) { continue; } $collection[] = [ 'id' => $country->code, 'admin_name' => $country->name, 'states' => $countryStates, ]; } return $collection; } }