diff --git a/app/Http/Controllers/Api/ThirdPartyApiController.php b/app/Http/Controllers/Api/ThirdPartyApiController.php index d4e488ee5a..e489dd7460 100644 --- a/app/Http/Controllers/Api/ThirdPartyApiController.php +++ b/app/Http/Controllers/Api/ThirdPartyApiController.php @@ -58,7 +58,11 @@ public function saveProduct(Request $request) ] ); try { - $product_id = Product::whereRaw('LOWER(`name`) LIKE ? ', strtolower($request->input('productname')))->select('id')->first(); + $product_id = Product::whereRaw('LOWER(`name`) LIKE ? ', strtolower($request->input('productname'))) + ->orWhere('id', $request->input('product_id')) + ->select('id') + ->first(); + if ($product_id) { $this->product_upload->product_id = $product_id->id; $this->product_upload->title = $request->input('producttitle'); diff --git a/app/Http/Controllers/BaseHomeController.php b/app/Http/Controllers/BaseHomeController.php index 74f019a86a..4d969c9386 100644 --- a/app/Http/Controllers/BaseHomeController.php +++ b/app/Http/Controllers/BaseHomeController.php @@ -227,7 +227,7 @@ public function updateLatestVersion(Request $request) $existingVersion = $request->input('version'); } $cont = new \App\Http\Controllers\License\LicenseController(); - $cont->updateInstallationLogs($url, $request->input('version'), $ip); + $cont->updateInstallationLogs($url, $request->input('version'), $ip, $licenseCode); Subscription::where('order_id', $orderForLicense->first()->id)->update(['version' => $existingVersion, 'version_updated_at' => (string) \Carbon\Carbon::now()]); return ['status' => 'success', 'message' => 'version-updated-successfully']; diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index e0d63aa3e6..09d77907fc 100755 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -2,10 +2,14 @@ namespace App\Http\Controllers; +use App\ApiKey; use App\Http\Controllers\Common\CronController; use App\Http\Controllers\Order\RenewController; use App\Http\Requests\ProductRenewalRequest; use App\Model\Common\Country; +use App\Model\Configure\PluginCompatibleWithProducts; +use App\Model\Configure\ProductPluginGroup; +use App\Model\License\LicenseType; use App\Model\Order\InstallationDetail; use App\Model\Order\Order; use App\Model\Payment\Plan; @@ -16,6 +20,7 @@ use App\Model\Product\Subscription; use App\User; use Exception; +use GuzzleHttp\Client; use Illuminate\Http\Request; class HomeController extends BaseHomeController @@ -616,4 +621,79 @@ public function getGroupDatails() return response()->json(['group' => $group]); } + + public function getDetailedBillingInfo(Request $request): \Illuminate\Http\JsonResponse + { + $order = $request->input('order'); + // Fetch the order details + $user = Order::where('number', $order)->value('client'); + + $email = User::where('id', $user)->value('email'); + + if (! $email) { + return response()->json([]); + } + + return response()->json([ + 'billing_client_email' => $email, + ]); + } + + public function getDetailsForAClient(Request $request) + { + $client = $request->input('client'); + + $license = $request->input('license'); + + $product_id = $request->input('product_id'); + + $user = User::where('email', $client)->value('id'); + + $licenseType = LicenseType::where('name', 'plugin')->value('id'); + + $products = Product::where('type', $licenseType)->pluck('id')->toArray(); + + $productComp = PluginCompatibleWithProducts::where('product_id', $product_id)->pluck('plugin_id')->toArray(); + + $product = array_intersect($products, $productComp); + + $productsLinked = ProductPluginGroup::where('product_id', $product_id)->pluck('plugin_id')->toArray(); + + $uniqueElements = array_merge(array_diff($product, $productsLinked), array_diff($productsLinked, $product)); + + $uniqueElements = array_values($uniqueElements); + + $licenses = Order::where('client', $user)->whereIn('product', $uniqueElements) + ->pluck('serial_key') + ->toArray(); + + $licenses = array_merge([$license], $licenses); + + $client = new Client(); + + $licenseUrl = ApiKey::value('license_api_url'); + $response = $client->get($licenseUrl.'api/pluginLicense', [ + 'query' => ['license_code' => json_encode($licenses)], + ]); + + return json_decode($response->getBody()->getContents(), true); + } + + public function getProductRelease(Request $request) + { + $product_id = $request->input('product_id'); + + $version = $request->input('version'); + + $product_upload = ProductUpload::where('product_id', $product_id) + ->where('is_private', 0) + ->where('version', $version) + ->orderByDesc('version') // Order by version in descending order + ->select('version', 'title', 'description', 'dependencies', 'updated_at') + ->first(); // Get the first result (latest version) + + $product = Product::where('id', $product_id)->select('name', 'description', 'shoping_cart_link', 'product_description')->first(); + + return ['product' => $product, 'release' => $product_upload]; + } } diff --git a/app/Http/Controllers/License/LicenseController.php b/app/Http/Controllers/License/LicenseController.php index 4b5b4646e4..152cead8c4 100644 --- a/app/Http/Controllers/License/LicenseController.php +++ b/app/Http/Controllers/License/LicenseController.php @@ -275,6 +275,7 @@ public function createNewLicene($orderid, $product, $user_id, $licenseExpiry, $u $productId = $this->searchProductId($sku); $OauthDetails = $this->oauthAuthorization(); $token = $OauthDetails->access_token; + $addLicense = $this->postCurl($url.'api/admin/license/add', "api_key_secret=$api_key_secret&product_id=$productId&license_code=$serial_key&license_require_domain=1&license_status=1&license_order_number=$orderNo&license_domain=$domain&license_ip=$ip&license_require_domain=$requireDomain&license_limit=6&license_expire_date=$licenseExpiry&license_updates_date=$updatesExpiry&license_support_date=$supportExpiry&license_disable_ip_verification=0&license_limit=1", $token); } catch (\Exception $ex) { throw new \Exception('Please configure the valid license details in Apikey settings.'); @@ -517,6 +518,26 @@ public function licenseRedirect($orderNumber) return redirect('/orders/'.Order::where('number', $orderNumber)->value('id')); } + public function syncTheAddonForALicense($product_ids, $license_code, $options = []) + { + $url = $this->url; + $api_key_secret = $this->api_key_secret; + + $OauthDetails = $this->oauthAuthorization(); + $token = $OauthDetails->access_token; + // Convert arrays to JSON for proper request formatting + $options = json_encode($options); + + $postData = http_build_query([ + 'api_key_secret' => $api_key_secret, + 'license_code' => $license_code, + 'product_ids' => $product_ids, + 'options' => $options, + ]); + + $this->postCurl($url.'api/admin/license/syncAddonLicense', $postData, $token); + } + public function getInstallationLogsDetails($license_code) { $url = $this->url; @@ -542,14 +563,14 @@ public function getInstallationLogsDetails($license_code) return $installation_details; } - public function updateInstallationLogs($root_url, $version_number, $installation_ip) + public function updateInstallationLogs($root_url, $version_number, $installation_ip, $licenseCode) { try { $url = $this->url; $api_key_secret = $this->api_key_secret; $OauthDetails = $this->oauthAuthorization(); $token = $OauthDetails->access_token; - $details = json_decode($this->postCurl($url.'api/admin/updateInstallationLogs', "api_key_secret=$api_key_secret&root_url=$root_url&version_number=$version_number&installation_ip=$installation_ip", $token)); + $details = json_decode($this->postCurl($url.'api/admin/updateInstallationLogs', "api_key_secret=$api_key_secret&root_url=$root_url&version_number=$version_number&installation_ip=$installation_ip&license_code=$licenseCode", $token)); } catch (\Exception $ex) { throw new \Exception('Please configure the valid license details in Apikey settings.'); } diff --git a/app/Http/Controllers/Order/BaseOrderController.php b/app/Http/Controllers/Order/BaseOrderController.php index b0fbd6fecf..9c2462ea22 100644 --- a/app/Http/Controllers/Order/BaseOrderController.php +++ b/app/Http/Controllers/Order/BaseOrderController.php @@ -2,9 +2,11 @@ namespace App\Http\Controllers\Order; +use App\Http\Controllers\License\LicenseController; use App\Http\Controllers\License\LicensePermissionsController; use App\Model\Common\StatusSetting; use App\Model\Common\TemplateType; +use App\Model\Configure\ProductPluginGroup; use App\Model\Order\Order; use App\Model\Payment\Plan; use App\Model\Product\Product; @@ -121,6 +123,12 @@ public function getIfItemPresent($item, $invoiceid, $user_id, $order_status, $ad $this->addOrderInvoiceRelation($invoiceid, $order->id); if ($plan_id != 0) { $this->addSubscription($order->id, $plan_id, $version, $product, $serial_key, $admin); + + $addOnIds = implode(',', $this->product->find($product)->productPluginGroupsAsProduct->pluck('plugin_id')->toArray()); + + $options = $this->formatConfigurableOptions($product); + + (new LicenseController())->syncTheAddonForALicense($addOnIds, $serial_key, $options); } if (emailSendingStatus()) { @@ -412,4 +420,38 @@ public function downloadUrl($userid, $orderid) return $url; } + + public function formatConfigurableOptions($productId) + { + // Retrieve the product ID and related plugin IDs in one query + $productIds = ProductPluginGroup::where('product_id', $productId) + ->pluck('plugin_id') + ->prepend($productId) + ->toArray(); + + // Fetch all products with related configurations in one query + $products = $this->product->with('configOptions.configOptionValues') + ->whereIn('id', $productIds) + ->get(); + + // Check if any products were found + if ($products->isEmpty()) { + return []; + } + + // Format the configuration options + return $products->flatMap(function ($product) { + return $product->configOptions->flatMap(function ($configOption) use ($product) { + return $configOption->configOptionValues->map(function ($configOptionValue) use ($product, $configOption) { + return [ + 'product_id' => $product->id, + 'option_group' => $configOption->configGroup->config_group_name, + 'option_name' => $configOption->config_option_name, + 'key' => $configOptionValue->key, + 'value' => $configOptionValue->value, + ]; + }); + }); + }); + } } diff --git a/app/Http/Controllers/Product/ProductController.php b/app/Http/Controllers/Product/ProductController.php index e2989ae4ee..8e59a1ab7c 100755 --- a/app/Http/Controllers/Product/ProductController.php +++ b/app/Http/Controllers/Product/ProductController.php @@ -305,6 +305,7 @@ public function store(Request $request) 'name' => 'required|unique:products,name', 'type' => 'required', 'description' => 'required', + 'product_description' => 'required', 'image' => 'sometimes|mimes:jpeg,png,jpg|max:2048', 'product_sku' => 'required|unique:products,product_sku', 'group' => 'required', @@ -439,6 +440,7 @@ public function update($id, Request $request) 'name' => 'required', 'type' => 'required', 'description' => 'required', + 'product_description' => 'required', 'image' => 'sometimes|mimes:jpeg,png,jpg|max:2048', 'product_sku' => 'required', 'group' => 'required', diff --git a/app/Model/Configure/ConfigGroup.php b/app/Model/Configure/ConfigGroup.php new file mode 100644 index 0000000000..0418a633ac --- /dev/null +++ b/app/Model/Configure/ConfigGroup.php @@ -0,0 +1,21 @@ +hasMany(ConfigOption::class, 'group_id'); + } +} diff --git a/app/Model/Configure/ConfigOption.php b/app/Model/Configure/ConfigOption.php new file mode 100644 index 0000000000..2fbf1cb3ba --- /dev/null +++ b/app/Model/Configure/ConfigOption.php @@ -0,0 +1,40 @@ +belongsTo(ConfigGroup::class, 'group_id'); + } + + // Define the relationship with Plan + public function plan() + { + return $this->belongsTo(Plan::class); + } + + // Define the relationship with ConfigOptionValue + public function configOptionValues() + { + return $this->hasMany(ConfigOptionValue::class, 'option_id'); + } + + public function product() + { + return $this->belongsTo(Product::class); + } +} diff --git a/app/Model/Configure/ConfigOptionValue.php b/app/Model/Configure/ConfigOptionValue.php new file mode 100644 index 0000000000..855ccb6bf6 --- /dev/null +++ b/app/Model/Configure/ConfigOptionValue.php @@ -0,0 +1,20 @@ +belongsTo(ConfigOption::class, 'option_id'); + } +} diff --git a/app/Model/Configure/PluginCompatibleWithProducts.php b/app/Model/Configure/PluginCompatibleWithProducts.php new file mode 100644 index 0000000000..fca260ec41 --- /dev/null +++ b/app/Model/Configure/PluginCompatibleWithProducts.php @@ -0,0 +1,28 @@ +belongsTo(Product::class, 'product_id'); + } + + // Define the relationship with Product (as plugin) + public function pluginComp() + { + return $this->belongsTo(Product::class, 'plugin_id'); + } +} diff --git a/app/Model/Configure/ProductPluginGroup.php b/app/Model/Configure/ProductPluginGroup.php new file mode 100644 index 0000000000..17971a46c8 --- /dev/null +++ b/app/Model/Configure/ProductPluginGroup.php @@ -0,0 +1,28 @@ +belongsTo(Product::class, 'product_id'); + } + + // Define the relationship with Product (as plugin) + public function plugin() + { + return $this->belongsTo(Product::class, 'plugin_id'); + } +} diff --git a/app/Model/Payment/Plan.php b/app/Model/Payment/Plan.php index da947465d8..08afaddaba 100755 --- a/app/Model/Payment/Plan.php +++ b/app/Model/Payment/Plan.php @@ -3,6 +3,7 @@ namespace App\Model\Payment; use App\BaseModel; +use App\Model\Configure\ConfigOption; use Illuminate\Database\Eloquent\Factories\HasFactory; use Spatie\Activitylog\LogOptions; use Spatie\Activitylog\Traits\LogsActivity; @@ -67,4 +68,9 @@ public function getActivitylogOptions(): LogOptions { return LogOptions::defaults(); } + + public function configOptions() + { + return $this->hasMany(ConfigOption::class); + } } diff --git a/app/Model/Product/Product.php b/app/Model/Product/Product.php index d695b4835e..a4c0a6d043 100755 --- a/app/Model/Product/Product.php +++ b/app/Model/Product/Product.php @@ -4,6 +4,9 @@ use App\BaseModel; use App\Facades\Attach; +use App\Model\Configure\ConfigOption; +use App\Model\Configure\PluginCompatibleWithProducts; +use App\Model\Configure\ProductPluginGroup; use Illuminate\Database\Eloquent\Factories\HasFactory; use Spatie\Activitylog\LogOptions; use Spatie\Activitylog\Traits\LogsActivity; @@ -15,12 +18,12 @@ class Product extends BaseModel protected $table = 'products'; - protected $fillable = ['name', 'description', 'type', 'group', 'file', 'image', 'require_domain', 'category', + protected $fillable = ['id', 'name', 'description', 'type', 'group', 'file', 'image', 'require_domain', 'category', 'can_modify_agent', 'can_modify_quantity', 'show_agent', 'tax_apply', 'show_product_quantity', 'hidden', 'auto_terminate', 'setup_order_placed', 'setup_first_payment', 'setup_accept_manually', 'no_auto_setup', 'shoping_cart_link', 'process_url', 'github_owner', 'github_repository', - 'deny_after_subscription', 'version', 'parent', 'subscription', 'product_sku', 'perpetual_license', 'id']; + 'deny_after_subscription', 'version', 'parent', 'subscription', 'product_sku', 'perpetual_license', 'product_description']; protected static $logName = 'Product'; @@ -140,8 +143,31 @@ public function getActivitylogOptions(): LogOptions return LogOptions::defaults(); } - public function plans() + // Define the relationship with ProductPluginGroup (as product) + public function productPluginGroupsAsProduct() { - return $this->hasMany(\App\Model\Payment\Plan::class, 'product', 'id'); + return $this->hasMany(ProductPluginGroup::class, 'product_id'); + } + + // Define the relationship with ProductPluginGroup (as plugin) + public function productPluginGroupsAsPlugin() + { + return $this->hasMany(ProductPluginGroup::class, 'plugin_id'); + } + + public function configOptions() + { + return $this->hasMany(ConfigOption::class, 'product_id'); + } + + public function productCompWith() + { + return $this->hasMany(PluginCompatibleWithProducts::class, 'product_id'); + } + + // Define the relationship with Product (as plugin) + public function pluginCompWith() + { + return $this->hasMany(PluginCompatibleWithProducts::class, 'plugin_id'); } } diff --git a/database/migrations/2024_07_24_050427_create_config_group_table.php b/database/migrations/2024_07_24_050427_create_config_group_table.php new file mode 100644 index 0000000000..f12d366377 --- /dev/null +++ b/database/migrations/2024_07_24_050427_create_config_group_table.php @@ -0,0 +1,29 @@ +id(); + $table->string('config_group_name', 255); + $table->binary('description')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('config_group'); + } +}; diff --git a/database/migrations/2024_07_24_050435_create_config_option_table.php b/database/migrations/2024_07_24_050435_create_config_option_table.php new file mode 100644 index 0000000000..cb757d1e25 --- /dev/null +++ b/database/migrations/2024_07_24_050435_create_config_option_table.php @@ -0,0 +1,37 @@ +id(); + $table->unsignedBigInteger('group_id'); + $table->string('config_option_name', 255); + $table->binary('config_option_description')->nullable(); + $table->unsignedInteger('plan_id'); + $table->unsignedInteger('product_id')->nullable(); + + $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); + $table->foreign('plan_id')->references('id')->on('plans')->onDelete('cascade'); + $table->foreign('group_id')->references('id')->on('config_group')->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('config_option'); + } +}; diff --git a/database/migrations/2024_07_24_050450_create_config_option_values_table.php b/database/migrations/2024_07_24_050450_create_config_option_values_table.php new file mode 100644 index 0000000000..1ec10e0774 --- /dev/null +++ b/database/migrations/2024_07_24_050450_create_config_option_values_table.php @@ -0,0 +1,32 @@ +id(); + $table->unsignedBigInteger('option_id'); + $table->string('key', 255); + $table->string('value', 255); + + $table->foreign('option_id')->references('id')->on('config_option')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('config_option_values'); + } +}; diff --git a/database/migrations/2024_07_24_050527_create_product_plugin_group_table.php b/database/migrations/2024_07_24_050527_create_product_plugin_group_table.php new file mode 100644 index 0000000000..1eae7c5b88 --- /dev/null +++ b/database/migrations/2024_07_24_050527_create_product_plugin_group_table.php @@ -0,0 +1,33 @@ +id(); + $table->unsignedInteger('product_id'); + $table->unsignedInteger('plugin_id'); + + $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); + $table->foreign('plugin_id')->references('id')->on('products')->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('product_plugin_group'); + } +}; diff --git a/database/migrations/2024_07_24_060558_add_product_type_to_products_table.php b/database/migrations/2024_07_24_060558_add_product_type_to_products_table.php new file mode 100644 index 0000000000..1ec5175695 --- /dev/null +++ b/database/migrations/2024_07_24_060558_add_product_type_to_products_table.php @@ -0,0 +1,31 @@ +string('product_type', 255)->nullable(); + $table->binary('product_description'); + $table->index('product_type'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('products', function (Blueprint $table) { + $table->dropColumn('product_description'); + $table->dropColumn('product_type'); + }); + } +}; diff --git a/database/migrations/2024_07_31_054820_create_plugin_compatible_with_products_table.php b/database/migrations/2024_07_31_054820_create_plugin_compatible_with_products_table.php new file mode 100644 index 0000000000..5db633950e --- /dev/null +++ b/database/migrations/2024_07_31_054820_create_plugin_compatible_with_products_table.php @@ -0,0 +1,32 @@ +id(); + $table->unsignedInteger('plugin_id'); + $table->unsignedInteger('product_id'); + + $table->foreign('plugin_id')->references('id')->on('products')->onDelete('cascade'); + $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('plugin_compatible_with_products'); + } +}; diff --git a/lang/en/message.php b/lang/en/message.php index 2bf900db90..484355b3ed 100644 --- a/lang/en/message.php +++ b/lang/en/message.php @@ -872,4 +872,6 @@ 'max_stripe_key' => 'Stripe Key cannot exceed 200 characters', 'required_stripe_secret' => 'Please Enter Stripe Secret', 'max_stripe_secret' => 'Stripe Secret cannot exceed 200 characters', + 'product_description' => 'Product Description', + 'price_description' => 'Price Description', ]; diff --git a/resources/views/themes/default1/product/product/create.blade.php b/resources/views/themes/default1/product/product/create.blade.php index f1fd32f869..2c5d4d1b5e 100644 --- a/resources/views/themes/default1/product/product/create.blade.php +++ b/resources/views/themes/default1/product/product/create.blade.php @@ -99,18 +99,18 @@ @endif @endforeach - + - +
-
+
- + - - {!! Form::label('description',Lang::get('message.description'),['class'=>'required']) !!} - {!! Form::textarea('description',null,['class' => 'form-control','id'=>'textarea']) !!} + {!! Form::label('price_description', trans('message.price_description'), ['class' => 'required']) !!} + {!! Form::textarea('description', null, ['class' => 'form-control', 'id' => 'textarea']) !!}
@@ -175,7 +174,7 @@
- +
  • @@ -199,7 +198,7 @@ - +

    {!! Form::checkbox('hidden',1) !!} {{Lang::get('message.tick-to-hide-from-order-form')}}

    @@ -209,7 +208,7 @@ - +

    {!! Form::checkbox('highlight') !!} {{Lang::get('message.tick-to-highlight-product')}}

  • @@ -219,7 +218,7 @@ - +

    {!! Form::checkbox('add_to_contact') !!} {{Lang::get('message.tick-to-add_to_contact-product')}}

    @@ -228,8 +227,47 @@ +
    +
    + + + + + + + {!! Form::label('product_description', trans('message.product_description'), ['class' => 'required']) !!} + {!! Form::textarea('product_description', null, ['class' => 'form-control', 'id' => 'product-description']) !!} +
    +
    +
    + -
    @@ -248,7 +286,7 @@ Agents
    -
    +
    @@ -266,7 +304,7 @@ - + @@ -277,34 +315,34 @@
    - + - +
    - - + + - + - + {!! Form::close() !!} - - - + + + diff --git a/resources/views/themes/default1/product/product/edit.blade.php b/resources/views/themes/default1/product/product/edit.blade.php index 6c7457779f..92e70d3801 100644 --- a/resources/views/themes/default1/product/product/edit.blade.php +++ b/resources/views/themes/default1/product/product/edit.blade.php @@ -5,7 +5,7 @@ @section('content-header')

    Edit Product

    - +
    - - + +
    - - {!! Form::label('description',Lang::get('message.description'),['class'=>'required']) !!} + + {!! Form::label('description',Lang::get('message.price_description'),['class'=>'required']) !!} - - +
    + +
    - - + + Where do you want to retrieve your files from?
    - - - + + +
    - +
  • @@ -234,7 +236,7 @@ {!! Form::label('hidden',Lang::get('message.hidden')) !!} {!! Form::hidden('hidden', 0) !!} - hidden==1) { $value = 'true'; @@ -253,7 +255,7 @@ {!! Form::label('highlight',Lang::get('message.highlight')) !!} {!! Form::hidden('highlight', 0) !!} - highlight==1) { $value = 'true'; @@ -273,7 +275,7 @@ {!! Form::label('add_to_contact',Lang::get('Contact to sales')) !!} {!! Form::hidden('add_to_contact', 0) !!} - add_to_contact==1) { $value = 'true'; @@ -285,12 +287,20 @@
  • - +
    +
    + +
    + {!! Form::label('product_description', Lang::get('message.product_description'), ['class' => 'required']) !!} + {!! Form::textarea('product_description', $product->product_description, ['class' => 'form-control', 'id' => 'product-description']) !!} +
    +
    +
    + - @@ -301,14 +311,14 @@
    - +
    - -
    + +
    @@ -328,38 +338,38 @@ - + - + {!! Form::label('tax',Lang::get('message.taxes')) !!}
    - +
    - - - + + +
    - +
    - - + +

    Plans   @@ -396,13 +406,13 @@ @endif

    - + {!! Form::close() !!} - + @@ -412,7 +422,7 @@ - + @@ -500,7 +510,7 @@ - + - - - - + + + + @@ -819,8 +859,8 @@ function generateAlertHtml(type, response) { function name_check(){ var name = $('#productname').val(); if (name.length == ''){ - $('#namecheck').show(); - $('#namecheck').html('This field is required'); + $('#namecheck').show(); + $('#namecheck').html('This field is required'); $('#namecheck').focus(); $('#productname').css("border-color","red"); $('#namecheck').css({"color":"red","margin-top":"5px"}); @@ -862,7 +902,7 @@ function des_check(){