Bagisto to HB Update (#23)

* Bump symfony/http-foundation from 4.4.5 to 4.4.7

Bumps [symfony/http-foundation](https://github.com/symfony/http-foundation) from 4.4.5 to 4.4.7.
- [Release notes](https://github.com/symfony/http-foundation/releases)
- [Changelog](https://github.com/symfony/http-foundation/blob/master/CHANGELOG.md)
- [Commits](https://github.com/symfony/http-foundation/compare/v4.4.5...v4.4.7)

Signed-off-by: dependabot[bot] <support@github.com>

* remove line

* #2808

* #2785

* checkout page margin added

* {git commit -m

* checkout page issue

* modal view update

* bundled assets

* remove irrelevant css

* #2775

* remove irrelevant xhr

* revert back changes in format price

* category call get products method

* customer options click issue resolved

* customer panel accordian view and file picker view

* customer accordian design update

* Issue #2812

* compare page update height after loading images

* api changes

* code changed for api

* #2329

* issue #2792 resolved

* margin added between wishlist icon and compare icon

* checkout page email validation

* #2834

* Issue #2713 fixed

* Issue #2851 fixed

* Issue #2847

* Issue #2851 fixed

* Issue #2768 fixed

* #2691

* Issue #2794

* #2849

* #2856

* Changelog updated

* subcategory visibility issue in responsive

* #2790

* Issue #2793

* Issue #2846 fixed

* Changelog updated

* Fixed date icon issue

* Translate mass-update for review status in admin grid

* Fix save-category btn translation for langs with noun case

* Added more view_render_events in the customer account views

* Added view_render_event to admin order view

* Created new view_render_events for admin order and invoice view

* #2866

* calculate height on change value of dropdown

* #2876

* Issue #2784 fixed

* Updated changelog

* Issue #2871 fixed

* Issue #2543 fixed

* subcategory issue resolved

* Updated changelog

* #2875

* Issue #2890

* 2875 update

* remove channel from tax category

* introduce channel and channel inventory source factories

* Issue #2895

* removed dd

* Issue #2893

* add unified address-table and handling for models

* Issue #2884

* Issue #2863 fixed

* fix address_type at many places; add tests for address relations

* Issue #2793

* Issue #2721

* fix address-constrains; fix address global scopes

* variant products images update issue resolved

* rename address types

* responsive cart count update

* #2915

* fix typo in address migration

* update

* update

* add option to OrderItemFactory to use existing product

* Added new events to customer update and checkou, fixed some view render events and pt_BR grammar

* Add Japanese translation

* Moved command to packages

* Updated composer lock file

* Bump symfony/http-foundation from 4.4.5 to 4.4.7

Bumps [symfony/http-foundation](https://github.com/symfony/http-foundation) from 4.4.5 to 4.4.7.
- [Release notes](https://github.com/symfony/http-foundation/releases)
- [Changelog](https://github.com/symfony/http-foundation/blob/master/CHANGELOG.md)
- [Commits](https://github.com/symfony/http-foundation/compare/v4.4.5...v4.4.7)

Signed-off-by: dependabot[bot] <support@github.com>

* #2908

* customer sidebar menu issue resolved

* removed layered navigation in searchproducts page

* #2919

* content header path update

* add check if view exists

* [Updated: getBaseImage() method updated for configurable product.]

* Cancel feature added in customer order

* Installer fixes

* resolved issue with product images carousel

* change file name from views to Views

* Auto exchange rate feature added

* fix category issue and change country,state order

* max price issue in category

* Updated change log file

* Updated change log file

* fix translation in add attribute button

fix add button not translated to other language.

* Issue #2954 fixed

* Removed unnecessary code from CartController

* Issue #2954 fixed

* Issue #2945 fixed

* Updated change log file

* Updated change log file

* Version updated in env files

* add CartRuleCest

* introduce channel and customer group filter for cart rule grid

* fix calulation helper in test

* Issue #2949 and #2950

* resolve issue 2964

* localization error message added in velocity theme

* type hint changed

* refactoring, variable renamed

* Issue #2942

* Issue #2942

* configuration added for favicon in admin

* Issue #2969

* #2974

* favicon for admin login

* fix randomly failing tax cest

* remove unnecessary use statements

* fix GuestCheckoutCest

* remove newline

* set price faker in Laravel5Helper to 2 decimals, fix rounding in CartTaxesCest too

* Added missing space for configurable/grouped product price.

* responsive product gallery issue resolved

* Issue #2987

* Issue #2987

* Product multiple image select feature added

* Order comment feature added

* process checkout if user not logged in

* Order comment email sent to customer

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Shubham Mehrotra <shubh0896m@gmail.com>
Co-authored-by: Jitendra Singh <39991107+jitendra-webkul@users.noreply.github.com>
Co-authored-by: rahulshukla-home <rahulcs0082@gmail.com>
Co-authored-by: Herbert Maschke <thyseus@gmail.com>
Co-authored-by: shivam kumar <shivam.kumar174@webkul.com>
Co-authored-by: Shivam kumar <50355852+shivam-webkul@users.noreply.github.com>
Co-authored-by: hexu <hexu.garfield@gmail.com>
Co-authored-by: Pranshu Tomar <pranshutomar@Pranshus-MacBook-Air.local>
Co-authored-by: VaD1ke <vl.slesarenko@gmail.com>
Co-authored-by: Carlos Augusto Gartner <contato@carlosgartner.com.br>
Co-authored-by: Florian Bosdorff <florian.bosdorff@haendlerbund.de>
Co-authored-by: José María Campaña <chemisax@gmail.com>
Co-authored-by: Vivek <viveksh047@webkul.com>
Co-authored-by: namvarii <50305913+namvarii@users.noreply.github.com>
Co-authored-by: Steffen Mahler <steffen.mahler@haendlerbund.de>
Co-authored-by: Herbert Maschke <thyseus@pm.me>
Co-authored-by: SteffenMahler <57138594+SteffenMahler@users.noreply.github.com>
Co-authored-by: Matt April <matthew.japril@gmail.com>
This commit is contained in:
Annika Wolff 2020-05-07 14:05:48 +02:00 committed by GitHub
parent 7faf5bb97f
commit 41754f4f73
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
305 changed files with 12678 additions and 5037 deletions

View File

@ -1,6 +1,6 @@
APP_NAME=Bagisto
APP_ENV=local
APP_VERSION=1.0.0
APP_VERSION=1.1.2
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost

View File

@ -1,6 +1,6 @@
APP_NAME=Laravel
APP_ENV=local
APP_VERSION=1.0.0
APP_VERSION=1.1.2
APP_KEY=base64:G4KY3tUsTaY9ONo1n/QyJvVLQZdJDgbIkSJswFK01HE=
APP_DEBUG=true
APP_URL=http://localhost

View File

@ -2,6 +2,402 @@
#### This changelog consists the bug & security fixes and new features being included in the releases listed below.
## **v1.1.2 (24th of March 2020)** - *Release*
* [feature] - Now customer can cancel order.
* [feature] - Auto and manual currency exchange rates update feature added.
* #797 [fixed] - Add new module
* #2453 [fixed] - Velocity theme is not loading on fresh instance
* #2691 [fixed] - Shipping and Payment methods automatically selected on Checkout oage
* #2752 [fixed] - Error when you create or update a new catalog under root
* #2793 [fixed] - Stock Check Incorrect for Configurable Items
* #2826 [fixed] - Not able to view cart icon
* #2869 [fixed] - Updating "Velocity meta data" throws QueryException
* #2871 [fixed] - Refund throws "Undefined index: shipping" error
* #2875 [fixed] - Deleting brands that have been assigned to products causes checkout error
* #2884 [fixed] - Undefined Index slot: when add to cart rental booking
* #2890 [fixed] - cart rule condition (price in cart) always set to equal or less than when select greater than/less than
* #2895 [fixed] - The type hint of view in this blade file is 'address' - there is no tag in any provider which loads view with this type hint.
* #2896 [fixed] - There are two fields with having same value of name attribute one is hidden and other is of its desired type - is this redundant code or its solving any purpose?
* #2897 [fixed] - Inventory status field should be passed through validation for boolean in its backend controller.
* #2898 [fixed] - error when viewing a category and then wanting to change the language of the page in mobile view
* #2899 [fixed] - showing the configured products as radio button
* #2900 [fixed] - getting different variant of a configurable product in front end
* #2901 [fixed] - Error when creating a category
* #2902 [fixed] - unify address tables
* #2908 [fixed] - A class is missing from the Velocity ProductRepositiry file
* #2914 [fixed] - Filter not showing on mobile, also sorting not working on mobile
* #2915 [fixed] - filters are missing on mobile view.
* #2919 [fixed] - Header Content not working on other languages
* #2925 [fixed] - exception for php version 7.4
* #2938 [fixed] - Extend Model Class
* #2939 [fixed] - get product description for API without html tags
* #2940 [fixed] - creating categories have error
* #2943 [fixed] - Scroll images is not working
* #2945 [fixed] - API product detail return empty array
* #2954 [fixed] - The merging cart function does not work when already added all items of product into customer cart
## **v1.1.0 (24th of March 2020)** - *Release*
* #797 [fixed] - Add new module
* #826 [fixed] - Impossible to create the root directory "".
* #2152 [fixed] - Product images are not showing
* #2329 [fixed] - Getting exception on frontend after updating meta data.
* #2354 [fixed] - possible integrate this payment
* #2543 [fixed] - Sliders Text should be translatable
* #2558 [fixed] - Sliders Text should be translatable
* #2619 [fixed] - Issue when category slug & product slug are same
* #2684 [fixed] - API checkout/cart returns null for guest user
* #2691 [fixed] - Shipping and Payment methods automatically selected on Checkout oage
* #2706 [fixed] - Getting exception on editing category for pt_BR locale in php 7.4
* #2708 [fixed] - Able to create booking product from back date.
* #2713 [fixed] - fix the invoice header in pdf
* #2726 [fixed] - is shop.js the vue framework ??
* #2752 [fixed] - Error when you create or update a new catalog under root
* #2763 [fixed] - error to add rental booking into cart
* #2764 [fixed] - fix UI when select back_date of booking product,the calendar icon is set on another place
* #2765 [fixed] - Email settings configuration values are not write in .env file
* #2768 [fixed] - Getting exception in cart when remove one ticket from event booking from backend
* #2769 [fixed] - Can't delete Exchange Rates data
* #2774 [fixed] - How to add new icon in bagisto admin panel?
* #2775 [fixed] - compare icon is missing in each product for default theme
* #2776 [fixed] - compare option in side bar menu at customer panel should be available
* #2778 [fixed] - Issue in customer profile dropdown.
* #2779 [fixed] - Issue on checkout page, email should ask first as in default theme.
* #2780 [fixed] - Sidebar layout issue.
* #2781 [fixed] - Mobile menu is not showing correct sub-menu
* #2784 [fixed] - One booking for many days slot time issue
* #2785 [fixed] - missing address details in checkout page
* #2786 [fixed] - Getting error message on adding product to compare product from search page.
* #2788 [fixed] - guest_checkout is missing from edit product
* #2790 [fixed] - Minicart disable when use new languages only velocity theme
* #2792 [fixed] - Weight Validation Inconsistencies
* #2793 [fixed] - Stock Check Incorrect for Configurable Items
* #2794 [fixed] - When allow backorder is enabled, display a message available for order rather than in stock.
* #2796 [fixed] - Try to create category in windows 10 getting exception
* #2801 [fixed] - Address with more than 2 lines is not added correctly to the cart_address table
* #2807 [fixed] - Illegal mix of collations
* #2808 [fixed] - Correct the spelling on registration page.
* #2810 [fixed] - UI issue on compare similar item page.
* #2811 [fixed] - how to change checkout proccess
* #2812 [fixed] - getting timezone error while setup
* #2813 [fixed] - Ui issue if there is only one product in compare page.
* #2814 [fixed] - variant product's name aren't update when select their options in Front
* #2818 [fixed] - Not able to view menu in velocity theme on storefront
* #2821 [fixed] - Address Line is Null in Emails
* #2825 [fixed] - PHP Notice:
* #2827 [fixed] - default local not changing in storefront in velocity theme
* #2828 [fixed] - currency change error on velocity theme
* #2829 [fixed] - changing home page content in velocity and npm
* #2832 [fixed] - Illegal mix of collations
* #2834 [fixed] - Layout issue in compare page in pt_BR locale
* #2837 [fixed] - subscription bar content source code is not visible in text editor
* #2840 [fixed] - Velocity theme is not available on fresh install
* #2845 [fixed] - Implement custom RegistrationController
* #2846 [fixed] - does not show next step
* #2847 [fixed] - Class 'Faker\Factory' not found
* #2849 [fixed] - Can not add my stylesheet to Velocity theme
* #2850 [fixed] - admin crash on save configration
* #2851 [fixed] - Fix date picker icon layout at dashboard
* #2856 [fixed] - Issue with Sort by functionality, when open any category it by defaults show Newest First but after changing sort by when again select newest first it shows different product.
* #2865 [fixed] - Save order taking so long time 30s
* #2866 [fixed] - ayout issue when customer save addresses form
* #2871 [fixed] - Refund throws "Undefined index: shipping" error
* #2876 [fixed] - Place order is disable at checkout when select shipping address
## **v1.1.0 (24th of March 2020)** - *Release*
* [feature] Added new booking type product.
* [feature] Impletment compare product feature.
* [feature] Impletment compare product feature.
* #2525 [fixed] - Add more settings to the installers
* #2541 [fixed] - Showing product's price with the price including tax
* #2552 [fixed] - error mysql 8
* #2556 [fixed] - Logo and favicon broken
* #2562 [fixed] - error catalog/categories/create
* #2563 [fixed] - error add in cart
* #2567 [fixed] - Error 404 found when click on compare product image
* #2568 [fixed] - Getting exception when update to default theme from the comparison page
* #2572 [fixed] - custom attribute values are not show in comparison product
* #2573 [fixed] - Add to wishlist icon is missing with each product in comparison page
* #2574 [fixed] - Quick view popup should be closed when click add to compare
* #2575 [fixed] - compare feature is not working from the product page for logged In customer
* #2576 [fixed] - Compare icon is missing for new products
* #2577 [fixed] - GUI installer stuck at Migration & Seed
* #2578 [fixed] - Impossible to create the root directory
* #2579 [fixed] - error menu mobile
* #2580 [fixed] - error recently viewed products in mobile
* #2581 [fixed] - admin/configuration/general/design
* #2583 [fixed] - Display 3D product preivew image
* #2584 [fixed] - Not getting root category name, in categories.
* #2585 [fixed] - Product name , description and short description gets removed on editing the product.
* #2586 [fixed] - APP_TIMEZONE and APP_LOCALE values should be available in env file.
* #2587 [fixed] - Getting some warning during installation.
* #2589 [fixed] - Getting exception on editing header content on php 7.4.
* #2596 [fixed] - Allow Email Verification field is given twice, once in Configure->Customers->Setting and in Configure->Admin->Email.Currently if field is enable from any one grid and disable from other grid, then its not working.
* #2597 [fixed] - Not getting email for "Send Inventory Source Notification E-mail".
* #2599 [fixed] - login required when add compare product from the category page
* #2601 [fixed] - all comparable product remove from list only when single product remove
* #2602 [fixed] - Catalog default image height should be equal to the original image in Velocity
* #2604 [fixed] - Not able to make product as comparable from the category page as logged In user
* #2605 [fixed] - Attribute is comparable (yes/no) option is missing when add new attribute
* #2606 [fixed] - custom attributes are not Visible on Product View Page on Front-end
* #2607 [fixed] - Getting exception on editing category for pt_BR locale in php 7.4
* #2608 [fixed] - Getting exception on creating category.
* #2609 [fixed] - product removed from comparison page when update product by name
* #2611 [fixed] - installer error
* #2612 [fixed] - available slots are not showing for current date even if slot time is not expired
* #2613 [fixed] - Propaganistas/Laravel-Intl is abandoned
* #2614 [fixed] - table booking slot time is expired still exist in cart
* #2619 [fixed] - Issue when category slug & product slug are same
* #2621 [fixed] - i create a site and it is up kind of noting works
* #2626 [fixed] - Tax rates zipcode is still required when enable zip range is disabled
* #2630 [fixed] - Error exception when add booking product
* #2634 [fixed] - console error when select slots in default booking
* #2635 [fixed] - Default Booking details remove from edit page for many booking of one day
* #2636 [fixed] - Error alert when add to cart a simple product from the home page
* #2638 [fixed] - customer status is not translated in customer list
* #2639 [fixed] - category slug field should show warning if saved blank header content
* #2643 [fixed] - Getting exception when add appointment booking
* #2645 [fixed] - Error on adding product to cart
* #2649 [fixed] - Incorrect slot time for one booking many days in product page
* #2650 [fixed] - remove slot duration from the booking product page
* #2654 [fixed] - warning should be removed once slot field is selected
* #2658 [fixed] - slot, duration, break time are not saved for appointment booking
* #2660 [fixed] - guest capacity value is not saved in table booking
* #2661 [fixed] - Charged_per drop down value is not updating for table booking
* #2284 [fixed] - Layout issue in pt_BR locale.
* #2468 [fixed] - Guest user is able to checkout if guest checkout is disabled.
* #2517 [fixed] - Product description text gets selected if click on drop down icon on product page
* #2549 [fixed] - Invoices aren't legally valid.
* #2571 [fixed] - compare icon should classify the total compare product added in the comparison page
* #2592 [fixed] - No menu for the logged in user when clicking over comparison
* #2593 [fixed] - Cannot read property 'disabled' of undefined" on filter price
* #2594 [fixed] - After refund quantity of product increases.
* #2595 [fixed] - Category image size issue in velocity theme.
* #2610 [fixed] - some of the attribute values aren't visible in comparison page
* #2616 [fixed] - Tiny Bug on Admin Pages
* #2637 [fixed] - blank admin page if username contains whitespaces in email configuration
* #2640 [fixed] - product moved to cart still showing in wishlist
* #2641 [fixed] - Issue on wishlist page for guest user
* #2644 [fixed] - Add an option to set encryption to none during installation
* #2646 [fixed] - error missing wishlist or compare icon on mobile view
* #2666 [fixed] - fix the UI for booking product in cart page
* #2667 [fixed] - By default wishlist option is selected in cart
* #2670 [fixed] - Booking product should be removed from the cart when selected slot time expired
* #2669 [fixed] - Browser compatibility issue
* #2671 [fixed] - Error on moving booking product to wishlist
* #2672 [fixed] - wrong price calculated in cart for rental booking
* #2674 [fixed] - Rental booking added to cart without selecting date in velocity
* #2677 [fixed] - error on cart when rental booking update from backend
* #2678 [fixed] - UI issue in rental booking product page
* #2693 [fixed] - Booking product page - add to cart button js error
* #2704 [fixed] - product's assigned category can't be removed
* #2707 [fixed] - Getting exception when generate invoice in appointment booking
* #2715 [fixed] - Error message should throw if "To" time is less than "From".
* #2716 [fixed] - After saving the default booking time product selected time for date range changes to 00:00:00 ,because of which not able to book appointment on frontend.
* #2717 [fixed] - Getting error message on adding rental product in cart if rental booking is not available for that day.
* #2722 [fixed] - warning showing when update event booking cart quantity from the product page
* #2723 [fixed] - Compare product icon on header showing counts of compare product but there are no product in compare list.
* #2724 [fixed] - table bookings quantity should update in existing booking added in cart for same slot/date
* #2726 [fixed] - is shop.js the vue framework ??
* #2732 [fixed] - missing product's quick view in category page
## **v1.0.0 (24th of February 2020)** - *Release*
* #2377 [fixed] - Getting exception on creating a new category under any other category.

2
app/Console/Kernel.php Executable file → Normal file
View File

@ -39,4 +39,4 @@ class Kernel extends ConsoleKernel
require base_path('routes/console.php');
}
}
}

View File

@ -33,20 +33,23 @@
"maatwebsite/excel": "3.1.18",
"nwidart/laravel-modules": "^3.2",
"prettus/l5-repository": "^2.6",
"tymon/jwt-auth": "^1.0.0"
"tymon/jwt-auth": "^1.0.0",
"barryvdh/laravel-debugbar": "^3.1",
"fzaninotto/faker": "^1.4"
},
"require-dev": {
"barryvdh/laravel-debugbar": "^3.1",
"codeception/codeception": "4.1.1",
"codeception/module-asserts": "^1.1",
"codeception/module-filesystem": "^1.0",
"codeception/module-laravel5": "^1.0",
"codeception/module-webdriver": "^1.0",
"filp/whoops": "^2.0",
"fzaninotto/faker": "^1.4",
"mockery/mockery": "^1.0",
"nunomaduro/collision": "^2.0",
"phpunit/phpunit": "^7.0",
"barryvdh/laravel-debugbar": "^3.1",
"fzaninotto/faker": "^1.4"
"phpunit/phpunit": "^7.0"
},
"replace": {

539
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "dca322023597f38ef7991bc9d9bdc50f",
"content-hash": "89956b3147bad29980a3486770493059",
"packages": [
{
"name": "astrotomic/laravel-translatable",
@ -71,6 +71,74 @@
],
"time": "2020-03-03T10:43:26+00:00"
},
{
"name": "barryvdh/laravel-debugbar",
"version": "v3.2.9",
"source": {
"type": "git",
"url": "https://github.com/barryvdh/laravel-debugbar.git",
"reference": "42d5da5379a7860093f8e4032167e4cb5ebec180"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/42d5da5379a7860093f8e4032167e4cb5ebec180",
"reference": "42d5da5379a7860093f8e4032167e4cb5ebec180",
"shasum": ""
},
"require": {
"illuminate/routing": "^5.5|^6|^7",
"illuminate/session": "^5.5|^6|^7",
"illuminate/support": "^5.5|^6|^7",
"maximebf/debugbar": "^1.15.1",
"php": ">=7.0",
"symfony/debug": "^3|^4|^5",
"symfony/finder": "^3|^4|^5"
},
"require-dev": {
"laravel/framework": "5.5.x"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.2-dev"
},
"laravel": {
"providers": [
"Barryvdh\\Debugbar\\ServiceProvider"
],
"aliases": {
"Debugbar": "Barryvdh\\Debugbar\\Facade"
}
}
},
"autoload": {
"psr-4": {
"Barryvdh\\Debugbar\\": "src/"
},
"files": [
"src/helpers.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Barry vd. Heuvel",
"email": "barryvdh@gmail.com"
}
],
"description": "PHP Debugbar integration for Laravel",
"keywords": [
"debug",
"debugbar",
"laravel",
"profiler",
"webprofiler"
],
"time": "2020-02-25T20:42:23+00:00"
},
{
"name": "barryvdh/laravel-dompdf",
"version": "v0.8.5",
@ -819,6 +887,56 @@
],
"time": "2019-07-28T22:19:29+00:00"
},
{
"name": "fzaninotto/faker",
"version": "v1.9.1",
"source": {
"type": "git",
"url": "https://github.com/fzaninotto/Faker.git",
"reference": "fc10d778e4b84d5bd315dad194661e091d307c6f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/fzaninotto/Faker/zipball/fc10d778e4b84d5bd315dad194661e091d307c6f",
"reference": "fc10d778e4b84d5bd315dad194661e091d307c6f",
"shasum": ""
},
"require": {
"php": "^5.3.3 || ^7.0"
},
"require-dev": {
"ext-intl": "*",
"phpunit/phpunit": "^4.8.35 || ^5.7",
"squizlabs/php_codesniffer": "^2.9.2"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.9-dev"
}
},
"autoload": {
"psr-4": {
"Faker\\": "src/Faker/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "François Zaninotto"
}
],
"description": "Faker is a PHP library that generates fake data for you.",
"keywords": [
"data",
"faker",
"fixtures"
],
"time": "2019-12-12T13:22:17+00:00"
},
{
"name": "guzzlehttp/guzzle",
"version": "6.5.2",
@ -1172,6 +1290,7 @@
"email": "jakub.onderka@gmail.com"
}
],
"abandoned": "php-parallel-lint/php-console-color",
"time": "2018-09-29T17:23:10+00:00"
},
{
@ -1218,6 +1337,7 @@
}
],
"description": "Highlight PHP code in terminal",
"abandoned": "php-parallel-lint/php-console-highlighter",
"time": "2018-09-29T18:48:56+00:00"
},
{
@ -1276,6 +1396,7 @@
"serialize",
"tokenizer"
],
"abandoned": "opis/closure",
"time": "2018-03-21T22:21:57+00:00"
},
{
@ -2216,6 +2337,67 @@
],
"time": "2019-10-06T11:29:25+00:00"
},
{
"name": "maximebf/debugbar",
"version": "v1.16.1",
"source": {
"type": "git",
"url": "https://github.com/maximebf/php-debugbar.git",
"reference": "58998b818c6567fac01e35b8a4b70c1a64530556"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/58998b818c6567fac01e35b8a4b70c1a64530556",
"reference": "58998b818c6567fac01e35b8a4b70c1a64530556",
"shasum": ""
},
"require": {
"php": "^7.1",
"psr/log": "^1.0",
"symfony/var-dumper": "^2.6|^3|^4|^5"
},
"require-dev": {
"phpunit/phpunit": "^5"
},
"suggest": {
"kriswallsmith/assetic": "The best way to manage assets",
"monolog/monolog": "Log using Monolog",
"predis/predis": "Redis storage"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.16-dev"
}
},
"autoload": {
"psr-4": {
"DebugBar\\": "src/DebugBar/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Maxime Bouroumeau-Fuseau",
"email": "maxime.bouroumeau@gmail.com",
"homepage": "http://maximebf.com"
},
{
"name": "Barry vd. Heuvel",
"email": "barryvdh@gmail.com"
}
],
"description": "Debug bar in the browser for php application",
"homepage": "https://github.com/maximebf/php-debugbar",
"keywords": [
"debug",
"debugbar"
],
"time": "2019-11-24T09:46:11+00:00"
},
{
"name": "monolog/monolog",
"version": "2.0.2",
@ -3914,16 +4096,16 @@
},
{
"name": "symfony/http-foundation",
"version": "v4.4.5",
"version": "v4.4.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
"reference": "7e41b4fcad4619535f45f8bfa7744c4f384e1648"
"reference": "62f92509c9abfd1f73e17b8cf1b72c0bdac6611b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/7e41b4fcad4619535f45f8bfa7744c4f384e1648",
"reference": "7e41b4fcad4619535f45f8bfa7744c4f384e1648",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/62f92509c9abfd1f73e17b8cf1b72c0bdac6611b",
"reference": "62f92509c9abfd1f73e17b8cf1b72c0bdac6611b",
"shasum": ""
},
"require": {
@ -3965,7 +4147,7 @@
],
"description": "Symfony HttpFoundation Component",
"homepage": "https://symfony.com",
"time": "2020-02-13T19:40:01+00:00"
"time": "2020-03-30T14:07:33+00:00"
},
{
"name": "symfony/http-kernel",
@ -4059,16 +4241,16 @@
},
{
"name": "symfony/mime",
"version": "v5.0.5",
"version": "v5.0.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
"reference": "9b3e5b5e58c56bbd76628c952d2b78556d305f3c"
"reference": "481b7d6da88922fb1e0d86a943987722b08f3955"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/mime/zipball/9b3e5b5e58c56bbd76628c952d2b78556d305f3c",
"reference": "9b3e5b5e58c56bbd76628c952d2b78556d305f3c",
"url": "https://api.github.com/repos/symfony/mime/zipball/481b7d6da88922fb1e0d86a943987722b08f3955",
"reference": "481b7d6da88922fb1e0d86a943987722b08f3955",
"shasum": ""
},
"require": {
@ -4117,7 +4299,7 @@
"mime",
"mime-type"
],
"time": "2020-02-04T09:41:09+00:00"
"time": "2020-03-27T16:56:45+00:00"
},
{
"name": "symfony/polyfill-ctype",
@ -4238,16 +4420,16 @@
},
{
"name": "symfony/polyfill-intl-idn",
"version": "v1.14.0",
"version": "v1.15.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git",
"reference": "6842f1a39cf7d580655688069a03dd7cd83d244a"
"reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6842f1a39cf7d580655688069a03dd7cd83d244a",
"reference": "6842f1a39cf7d580655688069a03dd7cd83d244a",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf",
"reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf",
"shasum": ""
},
"require": {
@ -4261,7 +4443,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.14-dev"
"dev-master": "1.15-dev"
}
},
"autoload": {
@ -4296,20 +4478,20 @@
"portable",
"shim"
],
"time": "2020-01-17T12:01:36+00:00"
"time": "2020-03-09T19:04:49+00:00"
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.14.0",
"version": "v1.15.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "34094cfa9abe1f0f14f48f490772db7a775559f2"
"reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/34094cfa9abe1f0f14f48f490772db7a775559f2",
"reference": "34094cfa9abe1f0f14f48f490772db7a775559f2",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/81ffd3a9c6d707be22e3012b827de1c9775fc5ac",
"reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac",
"shasum": ""
},
"require": {
@ -4321,7 +4503,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.14-dev"
"dev-master": "1.15-dev"
}
},
"autoload": {
@ -4355,7 +4537,7 @@
"portable",
"shim"
],
"time": "2020-01-13T11:15:53+00:00"
"time": "2020-03-09T19:04:49+00:00"
},
{
"name": "symfony/polyfill-php56",
@ -4415,16 +4597,16 @@
},
{
"name": "symfony/polyfill-php72",
"version": "v1.14.0",
"version": "v1.15.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php72.git",
"reference": "46ecacf4751dd0dc81e4f6bf01dbf9da1dc1dadf"
"reference": "37b0976c78b94856543260ce09b460a7bc852747"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/46ecacf4751dd0dc81e4f6bf01dbf9da1dc1dadf",
"reference": "46ecacf4751dd0dc81e4f6bf01dbf9da1dc1dadf",
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/37b0976c78b94856543260ce09b460a7bc852747",
"reference": "37b0976c78b94856543260ce09b460a7bc852747",
"shasum": ""
},
"require": {
@ -4433,7 +4615,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.14-dev"
"dev-master": "1.15-dev"
}
},
"autoload": {
@ -4466,7 +4648,7 @@
"portable",
"shim"
],
"time": "2020-01-13T11:15:53+00:00"
"time": "2020-02-27T09:26:54+00:00"
},
{
"name": "symfony/polyfill-php73",
@ -5156,74 +5338,6 @@
}
],
"packages-dev": [
{
"name": "barryvdh/laravel-debugbar",
"version": "v3.2.9",
"source": {
"type": "git",
"url": "https://github.com/barryvdh/laravel-debugbar.git",
"reference": "42d5da5379a7860093f8e4032167e4cb5ebec180"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/42d5da5379a7860093f8e4032167e4cb5ebec180",
"reference": "42d5da5379a7860093f8e4032167e4cb5ebec180",
"shasum": ""
},
"require": {
"illuminate/routing": "^5.5|^6|^7",
"illuminate/session": "^5.5|^6|^7",
"illuminate/support": "^5.5|^6|^7",
"maximebf/debugbar": "^1.15.1",
"php": ">=7.0",
"symfony/debug": "^3|^4|^5",
"symfony/finder": "^3|^4|^5"
},
"require-dev": {
"laravel/framework": "5.5.x"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.2-dev"
},
"laravel": {
"providers": [
"Barryvdh\\Debugbar\\ServiceProvider"
],
"aliases": {
"Debugbar": "Barryvdh\\Debugbar\\Facade"
}
}
},
"autoload": {
"psr-4": {
"Barryvdh\\Debugbar\\": "src/"
},
"files": [
"src/helpers.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Barry vd. Heuvel",
"email": "barryvdh@gmail.com"
}
],
"description": "PHP Debugbar integration for Laravel",
"keywords": [
"debug",
"debugbar",
"laravel",
"profiler",
"webprofiler"
],
"time": "2020-02-25T20:42:23+00:00"
},
{
"name": "behat/gherkin",
"version": "v4.6.1",
@ -5619,6 +5733,61 @@
],
"time": "2019-10-10T15:58:56+00:00"
},
{
"name": "codeception/module-webdriver",
"version": "1.0.7",
"source": {
"type": "git",
"url": "https://github.com/Codeception/module-webdriver.git",
"reference": "f05c5c25e39d10fbfb2d508779e1537df019ff9b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/f05c5c25e39d10fbfb2d508779e1537df019ff9b",
"reference": "f05c5c25e39d10fbfb2d508779e1537df019ff9b",
"shasum": ""
},
"require": {
"codeception/codeception": "^4.0",
"php": ">=5.6.0 <8.0",
"php-webdriver/webdriver": "^1.6.0"
},
"require-dev": {
"codeception/util-robohelpers": "dev-master"
},
"suggest": {
"codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests"
},
"type": "library",
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Michael Bodnarchuk"
},
{
"name": "Gintautas Miselis"
},
{
"name": "Zaahid Bateson"
}
],
"description": "WebDriver module for Codeception",
"homepage": "http://codeception.com/",
"keywords": [
"acceptance-testing",
"browser-testing",
"codeception"
],
"time": "2020-04-01T10:18:18+00:00"
},
{
"name": "codeception/phpunit-wrapper",
"version": "7.8.0",
@ -5810,56 +5979,6 @@
],
"time": "2020-01-15T10:00:00+00:00"
},
{
"name": "fzaninotto/faker",
"version": "v1.9.1",
"source": {
"type": "git",
"url": "https://github.com/fzaninotto/Faker.git",
"reference": "fc10d778e4b84d5bd315dad194661e091d307c6f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/fzaninotto/Faker/zipball/fc10d778e4b84d5bd315dad194661e091d307c6f",
"reference": "fc10d778e4b84d5bd315dad194661e091d307c6f",
"shasum": ""
},
"require": {
"php": "^5.3.3 || ^7.0"
},
"require-dev": {
"ext-intl": "*",
"phpunit/phpunit": "^4.8.35 || ^5.7",
"squizlabs/php_codesniffer": "^2.9.2"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.9-dev"
}
},
"autoload": {
"psr-4": {
"Faker\\": "src/Faker/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "François Zaninotto"
}
],
"description": "Faker is a PHP library that generates fake data for you.",
"keywords": [
"data",
"faker",
"fixtures"
],
"time": "2019-12-12T13:22:17+00:00"
},
{
"name": "hamcrest/hamcrest-php",
"version": "v2.0.0",
@ -5908,67 +6027,6 @@
],
"time": "2016-01-20T08:20:44+00:00"
},
{
"name": "maximebf/debugbar",
"version": "v1.16.1",
"source": {
"type": "git",
"url": "https://github.com/maximebf/php-debugbar.git",
"reference": "58998b818c6567fac01e35b8a4b70c1a64530556"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/58998b818c6567fac01e35b8a4b70c1a64530556",
"reference": "58998b818c6567fac01e35b8a4b70c1a64530556",
"shasum": ""
},
"require": {
"php": "^7.1",
"psr/log": "^1.0",
"symfony/var-dumper": "^2.6|^3|^4|^5"
},
"require-dev": {
"phpunit/phpunit": "^5"
},
"suggest": {
"kriswallsmith/assetic": "The best way to manage assets",
"monolog/monolog": "Log using Monolog",
"predis/predis": "Redis storage"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.16-dev"
}
},
"autoload": {
"psr-4": {
"DebugBar\\": "src/DebugBar/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Maxime Bouroumeau-Fuseau",
"email": "maxime.bouroumeau@gmail.com",
"homepage": "http://maximebf.com"
},
{
"name": "Barry vd. Heuvel",
"email": "barryvdh@gmail.com"
}
],
"description": "Debug bar in the browser for php application",
"homepage": "https://github.com/maximebf/php-debugbar",
"keywords": [
"debug",
"debugbar"
],
"time": "2019-11-24T09:46:11+00:00"
},
{
"name": "mockery/mockery",
"version": "1.3.1",
@ -6248,6 +6306,71 @@
"description": "Library for handling version information and constraints",
"time": "2018-07-08T19:19:57+00:00"
},
{
"name": "php-webdriver/webdriver",
"version": "1.8.2",
"source": {
"type": "git",
"url": "https://github.com/php-webdriver/php-webdriver.git",
"reference": "3308a70be084d6d7fd1ee5787b4c2e6eb4b70aab"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/3308a70be084d6d7fd1ee5787b4c2e6eb4b70aab",
"reference": "3308a70be084d6d7fd1ee5787b4c2e6eb4b70aab",
"shasum": ""
},
"require": {
"ext-curl": "*",
"ext-json": "*",
"ext-zip": "*",
"php": "^5.6 || ~7.0",
"symfony/polyfill-mbstring": "^1.12",
"symfony/process": "^2.8 || ^3.1 || ^4.0 || ^5.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^2.0",
"jakub-onderka/php-parallel-lint": "^1.0",
"php-coveralls/php-coveralls": "^2.0",
"php-mock/php-mock-phpunit": "^1.1",
"phpunit/phpunit": "^5.7",
"sebastian/environment": "^1.3.4 || ^2.0 || ^3.0",
"sminnee/phpunit-mock-objects": "^3.4",
"squizlabs/php_codesniffer": "^3.5",
"symfony/var-dumper": "^3.3 || ^4.0 || ^5.0"
},
"suggest": {
"ext-SimpleXML": "For Firefox profile creation"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.8.x-dev"
}
},
"autoload": {
"psr-4": {
"Facebook\\WebDriver\\": "lib/"
},
"files": [
"lib/Exception/TimeoutException.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "A PHP client for Selenium WebDriver. Previously facebook/webdriver.",
"homepage": "https://github.com/php-webdriver/php-webdriver",
"keywords": [
"Chromedriver",
"geckodriver",
"php",
"selenium",
"webdriver"
],
"time": "2020-03-04T14:40:12+00:00"
},
{
"name": "phpdocumentor/reflection-common",
"version": "2.0.0",

View File

@ -153,7 +153,7 @@ return [
/*
Application Version
*/
'version' => env('APP_VERSION', '0.1.6'),
'version' => env('APP_VERSION'),
/**
* Blacklisting attributes while debugging

View File

@ -30,12 +30,16 @@ return [
],
'exchange-api' => [
'default' => 'fixer',
'default' => 'exchange_rates',
'fixer' => [
'paid_account' => false,
'key' => env('fixer_api_key'),
'class' => 'Webkul\Core\Helpers\Exchange\FixerExchange'
]
],
'exchange_rates' => [
'class' => 'Webkul\Core\Helpers\Exchange\ExchangeRates'
],
],
'stripe' => [

View File

@ -14,6 +14,8 @@ use Webkul\Checkout\Http\Requests\CustomerAddressForm;
use Webkul\Sales\Repositories\OrderRepository;
use Illuminate\Support\Str;
use Cart;
use Exception;
use Webkul\Shop\Http\Controllers\OnepageController;
class CheckoutController extends Controller
{
@ -197,26 +199,10 @@ class CheckoutController extends Controller
/**
* Validate order before creation
*
* @return mixed
* @throws Exception
*/
public function validateOrder()
public function validateOrder(): void
{
$cart = Cart::getCart();
if (! $cart->shipping_address) {
throw new \Exception(trans('Please check shipping address.'));
}
if (! $cart->billing_address) {
throw new \Exception(trans('Please check billing address.'));
}
if (! $cart->selected_shipping_rate) {
throw new \Exception(trans('Please specify shipping method.'));
}
if (! $cart->payment) {
throw new \Exception(trans('Please specify payment method.'));
}
app(OnepageController::class)->validateOrder();
}
}

View File

@ -16,6 +16,9 @@ class CustomerAddress extends JsonResource
{
return [
'id' => $this->id,
'first_name' => $this->first_name,
'last_name' => $this->last_name,
'company_name' => $this->company_name,
'address1' => explode(PHP_EOL, $this->address1),
'country' => $this->country,
'country_name' => core()->country_name($this->country),
@ -27,4 +30,4 @@ class CustomerAddress extends JsonResource
'updated_at' => $this->updated_at,
];
}
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
{
"/js/admin.js": "/js/admin.js?id=c7c2ef0a298910b82304",
"/css/admin.css": "/css/admin.css?id=f2c6fe51889bca1fb79d"
"/js/admin.js": "/js/admin.js?id=2701b1627d73faa941d6",
"/css/admin.css": "/css/admin.css?id=1676f6fcbbb2a7b25767"
}

View File

@ -30,6 +30,37 @@ return [
'channel_based' => true,
],
],
], [
'key' => 'general.general.email_settings',
'name' => 'admin::app.admin.system.email-settings',
'sort' => 1,
'fields' => [
[
'name' => 'sender_name',
'title' => 'admin::app.admin.system.email-sender-name',
'type' => 'text',
'validation' => 'required|max:50',
'channel_based' => true,
], [
'name' => 'shop_email_from',
'title' => 'admin::app.admin.system.shop-email-from',
'type' => 'text',
'validation' => 'required|email',
'channel_based' => true,
], [
'name' => 'admin_name',
'title' => 'admin::app.admin.system.admin-name',
'type' => 'text',
'validation' => 'required|max:50',
'channel_based' => true,
], [
'name' => 'admin_email',
'title' => 'admin::app.admin.system.admin-email',
'type' => 'text',
'validation' => 'required|email',
'channel_based' => true,
],
],
], [
'key' => 'general.content',
'name' => 'admin::app.admin.system.content',
@ -68,6 +99,12 @@ return [
'type' => 'image',
'channel_based' => true,
'validation' => 'mimes:jpeg,bmp,png,jpg',
], [
'name' => 'favicon',
'title' => 'admin::app.admin.system.favicon',
'type' => 'image',
'channel_based' => true,
'validation' => 'mimes:jpeg,bmp,png,jpg',
],
],
], [

View File

@ -3,6 +3,7 @@
namespace Webkul\Admin\DataGrids;
use Illuminate\Support\Facades\DB;
use Webkul\Customer\Models\CustomerAddress;
use Webkul\Ui\DataGrid\DataGrid;
use Webkul\Customer\Repositories\CustomerRepository;
@ -13,6 +14,7 @@ class AddressDataGrid extends DataGrid
*/
public $index = 'address_id';
/**
* @var string
*/
@ -42,10 +44,11 @@ class AddressDataGrid extends DataGrid
{
$customer = $this->customerRepository->find(request('id'));
$queryBuilder = DB::table('customer_addresses as ca')
$queryBuilder = DB::table('addresses as ca')
->leftJoin('countries', 'ca.country', '=', 'countries.code')
->leftJoin('customers as c', 'ca.customer_id', '=', 'c.id')
->addSelect('ca.id as address_id', 'ca.company_name', 'ca.address1', 'ca.country', DB::raw('' . DB::getTablePrefix() . 'countries.name as country_name'), 'ca.state', 'ca.city', 'ca.postcode', 'ca.phone', 'ca.default_address')
->where('ca.address_type', CustomerAddress::ADDRESS_TYPE)
->where('c.id', $customer->id);
$queryBuilder = $queryBuilder->leftJoin('country_states', function($qb) {
@ -168,4 +171,4 @@ class AddressDataGrid extends DataGrid
'method' => 'DELETE',
]);
}
}
}

View File

@ -11,18 +11,51 @@ class CartRuleDataGrid extends DataGrid
protected $sortOrder = 'desc';
protected $customer_group = 'all';
protected $channel = 'all';
public function __construct()
{
parent::__construct();
$this->customer_group = request()->get('customer_group') ?? 'all';
$this->channel = request()->get('channel') ?? 'all';
}
public function prepareQueryBuilder()
{
$queryBuilder = DB::table('cart_rules')
->leftJoin('cart_rule_coupons', function($leftJoin) {
->leftJoin('cart_rule_coupons', function ($leftJoin) {
$leftJoin->on('cart_rule_coupons.cart_rule_id', '=', 'cart_rules.id')
->where('cart_rule_coupons.is_primary', 1);
->where('cart_rule_coupons.is_primary', 1);
})
->addSelect('cart_rules.id', 'name', 'cart_rule_coupons.code as coupon_code', 'status', 'starts_from', 'ends_till', 'sort_order');
->addSelect('cart_rules.id', 'name', 'cart_rule_coupons.code as coupon_code',
'status', 'starts_from', 'ends_till', 'sort_order');
$this->addFilter('id', 'cart_rules.id');
$this->addFilter('coupon_code', 'cart_rule_coupons.code');
if ($this->customer_group !== 'all') {
$queryBuilder->leftJoin(
'cart_rule_customer_groups',
'cart_rule_customer_groups.cart_rule_id',
'=',
'cart_rules.id'
);
$queryBuilder->where('cart_rule_customer_groups.customer_group_id', $this->customer_group);
}
if ($this->channel !== 'all') {
$queryBuilder->leftJoin(
'cart_rule_channels',
'cart_rule_channels.cart_rule_id',
'=',
'cart_rules.id');
$queryBuilder->where('cart_rule_channels.channel_id', $this->channel);
}
$this->setQueryBuilder($queryBuilder);
}
@ -80,7 +113,7 @@ class CartRuleDataGrid extends DataGrid
'searchable' => true,
'sortable' => true,
'filterable' => true,
'wrapper' => function($value) {
'wrapper' => function ($value) {
if ($value->status == 1) {
return trans('admin::app.datagrid.active');
} else {

View File

@ -117,9 +117,9 @@ class CustomerReviewDataGrid extends DataGrid
'action' => route('admin.customer.review.massupdate'),
'method' => 'PUT',
'options' => [
'Pending' => 0,
'Approve' => 1,
'Disapprove' => 2,
trans('admin::app.customers.reviews.pending') => 0,
trans('admin::app.customers.reviews.approved') => 1,
trans('admin::app.customers.reviews.disapproved') => 2,
],
]);
}

View File

@ -3,6 +3,7 @@
namespace Webkul\Admin\DataGrids;
use Illuminate\Support\Facades\DB;
use Webkul\Sales\Models\OrderAddress;
use Webkul\Ui\DataGrid\DataGrid;
class OrderDataGrid extends DataGrid
@ -14,13 +15,13 @@ class OrderDataGrid extends DataGrid
public function prepareQueryBuilder()
{
$queryBuilder = DB::table('orders')
->leftJoin('order_address as order_address_shipping', function($leftJoin) {
->leftJoin('addresses as order_address_shipping', function($leftJoin) {
$leftJoin->on('order_address_shipping.order_id', '=', 'orders.id')
->where('order_address_shipping.address_type', 'shipping');
->where('order_address_shipping.address_type', OrderAddress::ADDRESS_TYPE_SHIPPING);
})
->leftJoin('order_address as order_address_billing', function($leftJoin) {
->leftJoin('addresses as order_address_billing', function($leftJoin) {
$leftJoin->on('order_address_billing.order_id', '=', 'orders.id')
->where('order_address_billing.address_type', 'billing');
->where('order_address_billing.address_type', OrderAddress::ADDRESS_TYPE_BILLING);
})
->addSelect('orders.id','orders.increment_id', 'orders.base_sub_total', 'orders.base_grand_total', 'orders.created_at', 'channel_name', 'status')
->addSelect(DB::raw('CONCAT(' . DB::getTablePrefix() . 'order_address_billing.first_name, " ", ' . DB::getTablePrefix() . 'order_address_billing.last_name) as billed_to'))

View File

@ -3,6 +3,7 @@
namespace Webkul\Admin\DataGrids;
use Illuminate\Support\Facades\DB;
use Webkul\Sales\Models\OrderAddress;
use Webkul\Ui\DataGrid\DataGrid;
class OrderRefundDataGrid extends DataGrid
@ -16,9 +17,9 @@ class OrderRefundDataGrid extends DataGrid
$queryBuilder = DB::table('refunds')
->select('refunds.id', 'orders.increment_id', 'refunds.state', 'refunds.base_grand_total', 'refunds.created_at')
->leftJoin('orders', 'refunds.order_id', '=', 'orders.id')
->leftJoin('order_address as order_address_billing', function($leftJoin) {
->leftJoin('addresses as order_address_billing', function($leftJoin) {
$leftJoin->on('order_address_billing.order_id', '=', 'orders.id')
->where('order_address_billing.address_type', 'billing');
->where('order_address_billing.address_type', OrderAddress::ADDRESS_TYPE_BILLING);
})
->addSelect(DB::raw('CONCAT(' . DB::getTablePrefix() . 'order_address_billing.first_name, " ", ' . DB::getTablePrefix() . 'order_address_billing.last_name) as billed_to'));

View File

@ -3,6 +3,7 @@
namespace Webkul\Admin\DataGrids;
use Illuminate\Support\Facades\DB;
use Webkul\Sales\Models\OrderAddress;
use Webkul\Ui\DataGrid\DataGrid;
class OrderShipmentsDataGrid extends DataGrid
@ -14,9 +15,9 @@ class OrderShipmentsDataGrid extends DataGrid
public function prepareQueryBuilder()
{
$queryBuilder = DB::table('shipments')
->leftJoin('order_address as order_address_shipping', function($leftJoin) {
->leftJoin('addresses as order_address_shipping', function($leftJoin) {
$leftJoin->on('order_address_shipping.order_id', '=', 'shipments.order_id')
->where('order_address_shipping.address_type', 'shipping');
->where('order_address_shipping.address_type', OrderAddress::ADDRESS_TYPE_SHIPPING);
})
->leftJoin('orders as ors', 'shipments.order_id', '=', 'ors.id')
->leftJoin('inventory_sources as is', 'shipments.inventory_source_id', '=', 'is.id')

View File

@ -22,7 +22,7 @@ class ProductDataGrid extends DataGrid
parent::__construct();
$this->locale = request()->get('locale') ?? 'all';
$this->channel = request()->get('channel') ?? 'all';
}
@ -119,7 +119,7 @@ class ProductDataGrid extends DataGrid
'sortable' => true,
'searchable' => false,
'filterable' => true,
'wrapper' => function($value) {
'wrapper' => function ($value) {
if ($value->status == 1) {
return trans('admin::app.datagrid.active');
} else {
@ -144,7 +144,7 @@ class ProductDataGrid extends DataGrid
'sortable' => true,
'searchable' => false,
'filterable' => false,
'wrapper' => function($value) {
'wrapper' => function ($value) {
if (is_null($value->quantity)) {
return 0;
} else {
@ -161,7 +161,7 @@ class ProductDataGrid extends DataGrid
'method' => 'GET',
'route' => 'admin.catalog.products.edit',
'icon' => 'icon pencil-lg-icon',
'condition' => function() {
'condition' => function () {
return true;
},
]);

View File

@ -11,11 +11,31 @@ class SliderDataGrid extends DataGrid
protected $sortOrder = 'desc';
protected $locale = 'all';
protected $channel = 'all';
public function __construct()
{
parent::__construct();
$this->locale = request()->get('locale') ?? 'all';
$this->channel = request()->get('channel') ?? 'all';
}
public function prepareQueryBuilder()
{
$queryBuilder = DB::table('sliders as sl')
->addSelect('sl.id as slider_id', 'sl.title', 'ch.name')
->leftJoin('channels as ch', 'sl.channel_id', '=', 'ch.id');
->addSelect('sl.id as slider_id', 'sl.title', 'sl.locale', 'ch.name', 'ch.code')
->leftJoin('channels as ch', 'sl.channel_id', '=', 'ch.id');
if ($this->locale !== 'all') {
$queryBuilder->where('locale', $this->locale);
}
if ($this->channel !== 'all') {
$queryBuilder->where('ch.code', $this->channel);
}
$this->addFilter('slider_id', 'sl.id');
$this->addFilter('channel_name', 'ch.name');
@ -51,6 +71,15 @@ class SliderDataGrid extends DataGrid
'sortable' => true,
'filterable' => true,
]);
$this->addColumn([
'index' => 'locale',
'label' => trans('admin::app.datagrid.locale'),
'type' => 'string',
'searchable' => true,
'sortable' => true,
'filterable' => true
]);
}
public function prepareActions()

View File

@ -2,6 +2,7 @@
namespace Webkul\Admin\Http\Controllers\Customer;
use Illuminate\Support\Facades\Event;
use Webkul\Admin\Http\Controllers\Controller;
use Webkul\Customer\Repositories\CustomerRepository;
use Webkul\Customer\Repositories\CustomerGroupRepository;
@ -111,8 +112,12 @@ class CustomerController extends Controller
$data['is_verified'] = 1;
Event::dispatch('customer.registration.before');
$customer = $this->customerRepository->create($data);
Event::dispatch('customer.registration.after', $customer);
try {
$configKey = 'emails.general.notifications.emails.general.notifications.customer';
if (core()->getConfigData($configKey)) {
@ -164,7 +169,11 @@ class CustomerController extends Controller
$data['status'] = ! isset($data['status']) ? 0 : 1;
$this->customerRepository->update($data, $id);
Event::dispatch('customer.update.before');
$customer = $this->customerRepository->update($data, $id);
Event::dispatch('customer.update.after', $customer);
session()->flash('success', trans('admin::app.response.update-success', ['name' => 'Customer']));

View File

@ -2,8 +2,10 @@
namespace Webkul\Admin\Http\Controllers\Sales;
use Illuminate\Support\Facades\Event;
use Webkul\Admin\Http\Controllers\Controller;
use Webkul\Sales\Repositories\OrderRepository;
use \Webkul\Sales\Repositories\OrderCommentRepository;
class OrderController extends Controller
{
@ -21,19 +23,32 @@ class OrderController extends Controller
*/
protected $orderRepository;
/**
* OrderCommentRepository object
*
* @var \Webkul\Sales\Repositories\OrderCommentRepository
*/
protected $orderCommentRepository;
/**
* Create a new controller instance.
*
* @param \Webkul\Sales\Repositories\OrderRepository $orderRepository
* @param \Webkul\Sales\Repositories\OrderCommentRepository $orderCommentRepository
* @return void
*/
public function __construct(OrderRepository $orderRepository)
public function __construct(
OrderRepository $orderRepository,
OrderCommentRepository $orderCommentRepository
)
{
$this->middleware('admin');
$this->_config = request('_config');
$this->orderRepository = $orderRepository;
$this->orderCommentRepository = $orderCommentRepository;
}
/**
@ -77,4 +92,29 @@ class OrderController extends Controller
return redirect()->back();
}
/**
* Add comment to the order
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function comment($id)
{
$data = array_merge(request()->all(), [
'order_id' => $id,
]);
$data['customer_notified'] = isset($data['customer_notified']) ? 1 : 0;
Event::dispatch('sales.order.comment.create.before', $data);
$comment = $this->orderCommentRepository->create($data);
Event::dispatch('sales.order.comment.create.after', $comment);
session()->flash('success', trans('admin::app.sales.orders.comment-added-success'));
return redirect()->back();
}
}

View File

@ -107,6 +107,10 @@ class RefundController extends Controller
$data = request()->all();
if (! $data['refund']['shipping']) {
$data['refund']['shipping'] = 0;
}
$totals = $this->refundRepository->getOrderItemsRefundSummary($data['refund']['items'], $orderId);
$maxRefundAmount = $totals['grand_total']['price'] - $order->refunds()->sum('base_adjustment_refund');

View File

@ -187,6 +187,8 @@ Route::group(['middleware' => ['web']], function () {
'view' => 'admin::sales.orders.cancel'
])->name('admin.sales.orders.cancel');
Route::post('/orders/create/{order_id}', 'Webkul\Admin\Http\Controllers\Sales\OrderController@comment')->name('admin.sales.orders.comment');
// Sales Invoices Routes
Route::get('/invoices', 'Webkul\Admin\Http\Controllers\Sales\InvoiceController@index')->defaults('_config', [
@ -507,7 +509,7 @@ Route::group(['middleware' => ['web']], function () {
'view' => 'admin::settings.exchange_rates.edit'
])->name('admin.exchange_rates.edit');
Route::get('/exchange_rates/update-rates/{service}', 'Webkul\Core\Http\Controllers\ExchangeRateController@updateRates')->name('admin.exchange_rates.update-rates');
Route::get('/exchange_rates/update-rates', 'Webkul\Core\Http\Controllers\ExchangeRateController@updateRates')->name('admin.exchange_rates.update_rates');
Route::put('/exchange_rates/edit/{id}', 'Webkul\Core\Http\Controllers\ExchangeRateController@update')->defaults('_config', [
'redirect' => 'admin.exchange_rates.index'

View File

@ -10,6 +10,7 @@ use Webkul\Admin\Mail\NewShipmentNotification;
use Webkul\Admin\Mail\NewInventorySourceNotification;
use Webkul\Admin\Mail\CancelOrderNotification;
use Webkul\Admin\Mail\NewRefundNotification;
use Webkul\Admin\Mail\OrderCommentNotification;
class Order
{
@ -124,4 +125,21 @@ class Order
report($e);
}
}
/**
* @param \Webkul\Sales\Contracts\OrderComment $comment
* @return void
*/
public function sendOrderCommentMail($comment)
{
if (! $comment->customer_notified) {
return;
}
try {
Mail::queue(new OrderCommentNotification($comment));
} catch (\Exception $e) {
report($e);
}
}
}

View File

@ -27,7 +27,8 @@ class CancelOrderNotification extends Mailable
public function build()
{
return $this->to($this->order->customer_email, $this->order->customer_full_name)
return $this->from(core()->getSenderEmailDetails()['email'], core()->getSenderEmailDetails()['name'])
->to($this->order->customer_email, $this->order->customer_full_name)
->subject(trans('shop::app.mail.order.cancel.subject'))
->view('shop::emails.sales.order-cancel');
}

View File

@ -36,7 +36,8 @@ class NewAdminNotification extends Mailable
*/
public function build()
{
return $this->to(config('mail.admin.address'))
return $this->from(core()->getSenderEmailDetails()['email'], core()->getSenderEmailDetails()['name'])
->to(core()->getAdminEmailDetails()['email'])
->subject(trans('shop::app.mail.order.subject'))
->view('shop::emails.sales.new-admin-order');
}

View File

@ -49,7 +49,8 @@ class NewCustomerNotification extends Mailable
*/
public function build()
{
return $this->to($this->customer->email)
return $this->from(core()->getSenderEmailDetails()['email'], core()->getSenderEmailDetails()['name'])
->to($this->customer->email)
->subject(trans('shop::app.mail.customer.new.subject'))
->view('shop::emails.customer.new-customer')->with(['customer' => $this->customer, 'password' => $this->password]);
}

View File

@ -40,7 +40,8 @@ class NewInventorySourceNotification extends Mailable
$inventory = $this->shipment->inventory_source;
return $this->to($inventory->contact_email, $inventory->name)
return $this->from(core()->getSenderEmailDetails()['email'], core()->getSenderEmailDetails()['name'])
->to($inventory->contact_email, $inventory->name)
->subject(trans('shop::app.mail.shipment.subject', ['order_id' => $order->increment_id]))
->view('shop::emails.sales.new-inventorysource-shipment');
}

View File

@ -38,7 +38,8 @@ class NewInvoiceNotification extends Mailable
{
$order = $this->invoice->order;
return $this->to($order->customer_email, $order->customer_full_name)
return $this->from(core()->getSenderEmailDetails()['email'], core()->getSenderEmailDetails()['name'])
->to($order->customer_email, $order->customer_full_name)
->subject(trans('shop::app.mail.invoice.subject', ['order_id' => $order->increment_id]))
->view('shop::emails.sales.new-invoice');
}

View File

@ -36,7 +36,8 @@ class NewOrderNotification extends Mailable
*/
public function build()
{
return $this->to($this->order->customer_email, $this->order->customer_full_name)
return $this->from(core()->getSenderEmailDetails()['email'], core()->getSenderEmailDetails()['name'])
->to($this->order->customer_email, $this->order->customer_full_name)
->subject(trans('shop::app.mail.order.subject'))
->view('shop::emails.sales.new-order');
}

View File

@ -38,7 +38,8 @@ class NewRefundNotification extends Mailable
{
$order = $this->refund->order;
return $this->to($order->customer_email, $order->customer_full_name)
return $this->from(core()->getSenderEmailDetails()['email'], core()->getSenderEmailDetails()['name'])
->to($order->customer_email, $order->customer_full_name)
->subject(trans('shop::app.mail.refund.subject', ['order_id' => $order->increment_id]))
->view('shop::emails.sales.new-refund');
}

View File

@ -38,7 +38,8 @@ class NewShipmentNotification extends Mailable
{
$order = $this->shipment->order;
return $this->to($order->customer_email, $order->customer_full_name)
return $this->from(core()->getSenderEmailDetails()['email'], core()->getSenderEmailDetails()['name'])
->to($order->customer_email, $order->customer_full_name)
->subject(trans('shop::app.mail.shipment.subject', ['order_id' => $order->increment_id]))
->view('shop::emails.sales.new-shipment');
}

View File

@ -0,0 +1,44 @@
<?php
namespace Webkul\Admin\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class OrderCommentNotification extends Mailable
{
use Queueable, SerializesModels;
/**
* The order comment instance.
*
* @var \Webkul\Sales\Contracts\OrderComment $comment
*/
public $comment;
/**
* Create a new message instance.
*
* @param \Webkul\Sales\Contracts\OrderComment $comment
* @return void
*/
public function __construct($comment)
{
$this->comment = $comment;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->from(core()->getSenderEmailDetails()['email'], core()->getSenderEmailDetails()['name'])
->to($this->comment->order->customer_email, $this->comment->order->customer_full_name)
->subject(trans('shop::app.mail.order.comment.subject'))
->view('shop::emails.sales.new-order-comment');
}
}

View File

@ -23,5 +23,7 @@ class EventServiceProvider extends ServiceProvider
Event::listen('sales.order.cancel.after','Webkul\Admin\Listeners\Order@sendCancelOrderMail');
Event::listen('sales.refund.save.after','Webkul\Admin\Listeners\Order@sendNewRefundMail');
Event::listen('sales.order.comment.create.after','Webkul\Admin\Listeners\Order@sendOrderCommentMail');
}
}

View File

@ -3,6 +3,17 @@
margin-bottom: 0 !important;
padding-bottom: 15px;
border-bottom: 1px solid $border-color;
.control-group {
span {
width: 100%;
}
&.date::after {
margin-top: -13px;
left: 100%;
}
}
}
.page-content {

View File

@ -48,8 +48,33 @@
}
}
.summary-comment-container {
.comment-container {
margin-top: 20px;
float: left;
.comment-list {
margin-top: 40px;
li {
margin-bottom: 20px;
&:last-child {
margin-bottom: 0;
}
p {
margin: 0;
margin-top: 5px;
color: #8e8e8e;
}
}
}
}
}
.sale-summary {
margin-top: 2%;
margin-top: 20px;
height: 130px;
float: right;

File diff suppressed because it is too large Load Diff

View File

@ -370,7 +370,13 @@ return [
'total-due' => 'Total Due',
'cancel-confirm-msg' => 'Are you sure you want to cancel this order ?',
'refund-btn-title' => 'Refund',
'refunds' => 'Refunds'
'refunds' => 'Refunds',
'comment-added-success' => 'Comment addded successfully.',
'comment' => 'Comment',
'submit-comment' => 'Submit Comment',
'notify-customer' => 'Notify Customer',
'customer-notified' => ':date | Customer <b>Notified</b>',
'customer-not-notified' => ':date | Customer <b>Not Notified</b>'
],
'invoices' => [
@ -409,6 +415,7 @@ return [
'add-title' => 'Create Shipment',
'save-btn-title' => 'Save Shipment',
'qty-ordered' => 'Qty Ordered',
'qty-invoiced' => 'Qty Invoiced',
'qty-to-ship' => 'Qty to Ship',
'available-sources' => 'Available Sources',
'source' => 'Source',
@ -728,7 +735,7 @@ return [
'target_currency' => 'Target Currency',
'rate' => 'Rate',
'exchange-class-not-found' => ':service exchange rate class not found',
'update-rates' => 'Update rates using :service',
'update-rates' => 'Update Rates',
'create-success' => 'Exchange Rate created successfully.',
'update-success' => 'Exchange Rate updated successfully.',
'delete-success' => 'Exchange Rate deleted successfully.',
@ -1286,6 +1293,11 @@ return [
'footer-toggle' => 'Toggle footer',
'locale-options' => 'Unit Options',
'weight-unit' => 'Weight Unit',
'email-settings' => 'Email Settings',
'email-sender-name' => 'Email Sender Name',
'shop-email-from' => 'Shop Email Address [For sending emails]',
'admin-name' => 'Admin Name',
'admin-email' => 'Admin Email',
'admin-page-limit' => 'Default Items Per Page (Admin)',
'design' => 'Design',
'admin-logo' => 'Admin Logo',
@ -1300,10 +1312,12 @@ return [
'order-number-suffix' => 'Order Number Suffix',
'default' => 'Default',
'sandbox' => 'Sandbox',
'all-channels' => 'All',
'all-locales' => 'All',
'all-channels' => 'All Channels',
'all-locales' => 'All Locales',
'all-customer-groups' => 'All Customer groups',
'invoice-slip-design' => 'Invoice Slip Design',
'logo' => 'logo'
'logo' => 'logo',
'favicon' => 'Favicon'
]
]
];

View File

@ -1,8 +1,40 @@
<?php
return [
'save' => 'صرفه جویی',
'create' => 'ايجاد كردن',
'update' => 'به روز رسانی',
'delete' => 'حذف',
'failed' => 'ناموفق',
'store' => 'فروشگاه',
'image' => 'تصویر',
'no result' => 'نتیجه ای نداره',
'product' => 'تولید - محصول',
'attribute' => 'صفت',
'actions' => 'اقدامات',
'id' => 'ID',
'action' => 'عمل',
'yes' => 'آره',
'no' => 'نه',
'true' => 'درست است، واقعی',
'false' => 'غلط',
'apply' => 'درخواست دادن',
'action' => 'عمل',
'label' => 'برچسب',
'name' => 'نام',
'title' => 'عنوان',
'code' => 'کد',
'type' => 'تایپ کنید',
'required' => 'ضروری',
'unique' => 'منحصر بفرد',
'locale-based' => 'محلی مبتنی بر',
'channel-based' => 'مبتنی بر کانال',
'status' => 'وضعیت',
'select-option' => 'گزینه را انتخاب کنید',
'category' => 'دسته بندی',
'common' => [
'no-result-found' => 'We could not find any records.',
'no-result-found' => 'ما هیچ سابقه ای پیدا نکردیم.',
'country' => 'کشور',
'state' => 'استان',
'true' => 'صحیح',
@ -42,7 +74,8 @@ return [
'tax-categories' => 'دسته بندی مالیات',
'tax-rates' => 'نرخ مالیات',
'promotion' => 'تبلیغات',
'discount' => 'تخفیف'
'discount' => 'تخفیف',
'cms' => 'CMS'
],
'acl' => [
@ -77,7 +110,8 @@ return [
'create' => 'افزودن',
'delete' => 'حذف',
'promotion' => 'تبلیغات',
'cart-rules' => 'قوانین سبد خرید'
'cart-rules' => 'قوانین سبد خرید',
'catalog-rules' => 'قوانین فهرست',
],
'dashboard' => [
@ -92,22 +126,23 @@ return [
'decreased' => ':progress%',
'sales' => 'فروش ها',
'top-performing-categories' => 'دسته بندی های برتر',
'product-count' => ':count تا محصول',
'product-count' => 'تا محصول :count',
'top-selling-products' => 'محصولات فروش بالا',
'sale-count' => ':count تا فروش',
'sale-count' => ' تا فروش :count',
'customer-with-most-sales' => 'مشتری با بیش‌ترین فروش',
'order-count' => ':count تا سفارش',
'revenue' => 'درآمد :total',
'order-count' => 'سفارش :count',
'revenue' => ':total درآمد',
'stock-threshold' => 'تعداد کالای موجود',
'qty-left' => ':qty موجود',
'qty-left' => ':qty سمت چپ',
],
'datagrid' => [
'mass-ops' => [
'method-error' => 'خطا! روش اشتباه تشخیص داده شد، لطفاً پیکربندی کنش جمعی را بررسی کنید',
'delete-success' => 'مورد انتخاب شده :resource با موفقیت حذف شد',
'partial-action' => 'برخی از اقدامات به دلیل محدودیت های سیستم انجام نشد :resource',
'update-success' => 'مورد انتخاب شده :با موفقیت به روزرسانی شد updated',
'delete-success' => 'با موفقیت حذف شد :resource انتخاب',
'partial-action' => ' انجام نشده است :resource برخی از اقدامات به دلیل محدودیت سیستم محدود در',
'update-success' => 'با موفقیت به روز شد :resource انتخاب',
'no-resource' => 'این منبع برای عملکرد کافی نبوده است'
],
'id' => 'شناسه',
@ -116,6 +151,7 @@ return [
'admin-name' => 'نام',
'name' => 'نام',
'fullname' => 'نام کامل',
'direction' => 'جهت',
'type' => 'نوع',
'required' => 'ضروری',
'unique' => 'یکتا',
@ -126,7 +162,11 @@ return [
'hostname' => 'نام میزبان',
'email' => 'پست الکترونیک',
'group' => 'گروه',
'phone' => 'تلفن',
'gender' => 'جنسیت',
'title' => 'عنوان',
'layout' => 'چیدمان',
'url-key' => 'کلید URL',
'comment' => 'نظر',
'product-name' => 'محصول',
'currency-name' => 'نام ارز',
@ -156,34 +196,34 @@ return [
'role' => 'نقش',
'sub-total' => 'زیر مجموع',
'no-of-products' => 'تعداد محصولات',
'attribute-family' => 'Attribute Family',
'starts-from' => 'Starts From',
'ends-till' => 'Ends Till',
'per-cust' => 'Per Customer',
'usage-throttle' => 'Usage Times',
'for-guest' => 'For Guest',
'order_number' => 'Order Number',
'refund-date' => 'Refund Date',
'refunded' => 'Refunded',
'start' => 'Start',
'end' => 'End',
'active' => 'Active',
'inactive' => 'Inactive',
'true' => 'True',
'false' => 'False',
'approved' => 'Approved',
'pending' => 'Pending',
'disapproved' => 'Disapproved',
'coupon-code' => 'Coupon Code',
'times-used' => 'Times Used',
'created-date' => 'Created Date',
'expiration-date' => 'Expiration Date',
'edit' => 'Edit',
'delete' => 'Delete',
'view' => 'View',
'attribute-family' => 'خانواده ویژگی',
'starts-from' => 'از شروع می شود',
'ends-till' => 'تا پایان می یابد',
'per-cust' => 'به ازای هر مشتری',
'usage-throttle' => 'بار استفاده',
'for-guest' => 'برای مهمان',
'order_number' => 'شماره سفارش',
'refund-date' => 'تاریخ بازپرداخت',
'refunded' => 'بازپرداخت',
'start' => 'شروع کنید',
'end' => 'پایان',
'active' => 'فعال',
'inactive' => 'غیر فعال',
'true' => 'واقعی',
'false' => 'غلط',
'approved' => 'تایید شده',
'pending' => 'در انتظار',
'disapproved' => 'رد شد',
'coupon-code' => 'کد کوپن',
'times-used' => 'بار استفاده شده است',
'created-date' => 'تاریخ ایجاد شده',
'expiration-date' => 'تاریخ ایجاد شده',
'edit' => 'ویرایش کنید',
'delete' => 'حذف',
'view' => 'چشم انداز',
'rtl' => 'RTL',
'ltr' => 'LTR',
'update-status' => 'Update Status'
'update-status' => 'وضعیت به روز رسانی'
],
'account' => [
@ -271,7 +311,7 @@ return [
'sales' => [
'orders' => [
'title' => 'سفارشات',
'view-title' => 'سفارش #:order_id',
'view-title' => '#:order_id سفارش',
'cancel-btn-title' => 'لغو',
'shipment-btn-title' => 'کشتی',
'invoice-btn-title' => 'صورت حساب',
@ -282,6 +322,13 @@ return [
'order-info' => 'اطلاعات سفارش',
'order-date' => 'تاریخ سفارش',
'order-status' => 'وضعیت سفارش',
'order-status-canceled' => 'لغو شد',
'order-status-closed' => 'بسته شد',
'order-status-fraud' => 'تقلب',
'order-status-pending' => 'در انتظار',
'order-status-pending-payment' => 'در انتظار پرداخت',
'order-status-processing' => 'در حال پردازش',
'order-status-success' => 'تکمیل شد',
'channel' => 'کانال',
'customer-name' => 'نام مشتری',
'email' => 'پست الکترونیگ',
@ -302,11 +349,11 @@ return [
'product-name' => 'نام محصول',
'qty' => 'مقدار',
'item-status' => 'وضعیت مورد',
'item-ordered' => 'سفارش (:qty_ordered)',
'item-invoice' => 'صورت حساب (:qty_invoiced)',
'item-shipped' => 'حمل شده (:qty_shipped)',
'item-canceled' => 'لغو شده (:qty_canceled)',
'item-refunded' => 'Refunded (:qty_refunded)',
'item-ordered' => '(:qty_ordered) سفارش',
'item-invoice' => '(:qty_invoiced) صورت حساب',
'item-shipped' => '(:qty_shipped) حمل شده',
'item-canceled' => '(:qty_canceled) لغو شده',
'item-refunded' => '(:qty_refunded) بازپرداخت',
'price' => 'قیمت',
'total' => 'کل',
'subtotal' => 'فرعی',
@ -321,8 +368,13 @@ return [
'total-refunded' => 'بازپرداخت کل',
'total-due' => 'بدهی کل',
'cancel-confirm-msg' => 'مطمئن هستید که می خواهید این سفارش را لغو کنید ؟',
'refunds' => 'Refunds',
'refunded' => 'Refunded'
'refunds' => 'بازپرداخت',
'refund-btn-title' => 'بازپرداخت',
'refunded' => 'بازپرداخت',
'comment-added-success' => 'Comment addded successfully.',
'comment' => 'Comment',
'submit-comment' => 'Submit Comment',
'notify-customer' => 'Notify Customer',
],
'invoices' => [
@ -340,7 +392,7 @@ return [
'qty' => 'مقدار',
'qty-ordered' => 'سفارش داده شده',
'qty-to-invoice' => 'مقدار به فاکتور',
'view-title' => 'صورت حساب #:invoice_id',
'view-title' => '#:invoice_id صورت حساب',
'bill-to' => 'صورت حساب به',
'ship-to' => 'حمل به',
'print' => 'چاپ',
@ -361,6 +413,7 @@ return [
'add-title' => 'ایجاد حمل و نقل',
'save-btn-title' => 'ذخیره حمل و نقل',
'qty-ordered' => 'سفارش داده شده',
'qty-invoiced' => 'Qty Invoiced',
'qty-to-ship' => 'مقدار به کشتی',
'available-sources' => 'منابع موجود',
'source' => 'منابع',
@ -369,33 +422,34 @@ return [
'inventory-source' => 'منبع موجودی',
'carrier-title' => 'عنوان حامل',
'tracking-number' => 'شماره پیگیری',
'view-title' => 'حمل و نقل #:shipment_id',
'view-title' => '#:shipment_id حمل و نقل',
'creation-error' => 'حمل و نقل برای این سفارش ایجاد نمی شود.',
'order-error' => 'ایجاد محموله سفارش مجاز نیست.',
'quantity-invalid' => 'مقدار درخواستی نامعتبر است یا در دسترس نیست.',
],
'refunds' => [
'title' => 'Refunds',
'title' => 'بازپرداخت',
'id' => 'Id',
'add-title' => 'Create Refund',
'save-btn-title' => 'Refund',
'order-id' => 'Order Id',
'qty-ordered' => 'Qty Ordered',
'qty-to-refund' => 'Qty To Refund',
'refund-shipping' => 'Refund Shipping',
'adjustment-refund' => 'Adjustment Refund',
'adjustment-fee' => 'Adjustment Fee',
'update-qty' => 'Update Quantities',
'invalid-qty' => 'Found invalid quantity for return items.',
'refund-limit-error' => 'The most money available to refund is :amount.',
'refunded' => 'Refunded',
'date' => 'Refund Date',
'customer-name' => 'Customer Name',
'status' => 'Status',
'action' => 'Action',
'view-title' => 'Refund #:refund_id',
'invalid-refund-amount-error' => 'Refund amount should be non zero.'
'add-title' => 'بازپرداخت ایجاد کنید',
'save-btn-title' => 'بازپرداخت',
'order-id' => 'شماره سفارش',
'qty-ordered' => 'تعداد سفارشات',
'qty-to-refund' => 'مقدار برای بازپرداخت',
'refund-shipping' => 'ارسال بازپرداخت',
'adjustment-refund' => 'بازپرداخت تنظیم',
'adjustment-fee' => 'هزینه تنظیم',
'update-qty' => 'مقادیر را به روز کنید',
'invalid-qty' => 'مقدار نامعتبر برای موارد برگشتی یافت شد',
'refund-limit-error' => ' دلار است :amount بیشترین پول برای بازپرداخت ',
'refunded' => 'بازپرداخت',
'date' => 'تاریخ بازپرداخت',
'customer-name' => 'نام مشتری',
'status' => 'وضعیت',
'action' => 'عمل',
'view-title' => ' #:refund_id بازپرداخت',
'invalid-refund-amount-error' => 'مبلغ بازپرداخت باید صفر نباشد.'
]
],
@ -425,6 +479,8 @@ return [
'price' => 'قیمت',
'weight' => 'وزن',
'status' => 'وضعیت',
'enabled' => 'فعال شده است',
'disabled' => 'معلول',
'add-variant-title' => 'افزودن نوع',
'variant-already-exist-message' => 'گزینه های مختلف با همان ویژگی های موجود در حال حاضر وجود دارد.',
'add-image-btn-title' => 'افزودن تصویثر',
@ -435,6 +491,18 @@ return [
'images' => 'تصاویر',
'inventories' => 'موجودی ها',
'variations' => 'تغییرات',
'downloadable' => 'اطلاعات قابل بارگیری',
'links' => 'پیوندها',
'add-link-btn-title' => 'پیوند را اضافه کنید',
'samples' => 'نمونه ها',
'add-sample-btn-title' => 'نمونه را اضافه کنید',
'downloads' => 'بارگیری مجاز',
'file' => 'فایل',
'sample' => 'نمونه',
'upload-file' => 'آپلود فایل',
'url' => 'Url',
'sort-order' => 'ترتیب مرتب سازی',
'browse-file' => 'پرونده را مرور کنید',
'product-link' => 'محصولات مرتبط',
'cross-selling' => 'فروش متقابل',
'up-selling' => 'فروش بالا',
@ -442,9 +510,13 @@ return [
'product-search-hint' => 'شروع به تایپ نام محصول کنید',
'no-result-found' => 'محصولاتی با همین نام یافت نشد',
'searching' => 'جست و جو ...',
'bundle-items' => 'Bundle Items',
'add-option-btn-title' => 'Add Option',
'option-title' => 'Option Title',
'grouped-products' => 'محصولات گروه بندی شده',
'search-products' => 'جستجوی محصولات',
'no-result-found' => 'محصولاتی با همین نام یافت نشد',
'channel' => 'کانالها',
'bundle-items' => 'موارد بسته بندی',
'add-option-btn-title' => 'گزینه را اضافه کنید',
'option-title' => 'عنوان گزینه',
'input-type' => 'Input Type',
'is-required' => 'Is Required',
'select' => 'Select',
@ -471,25 +543,26 @@ return [
'multiselect' => 'Multiselect',
'datetime' => 'Datetime',
'date' => 'Date',
'label' => 'Label',
'admin' => 'Admin',
'options' => 'Options',
'label' => 'برچسب',
'admin' => 'مدیر',
'options' => 'گزینه ها',
'position' => 'موقعیت',
'add-option-btn-title' => 'افزودن گزینه',
'validations' => 'اعتبار سنجی ها',
'input_validation' => 'اعتبار سنجی ورودی',
'is_required' => 'Is Required',
'is_unique' => 'Is Unique',
'number' => 'Number',
'decimal' => 'Decimal',
'email' => 'Email',
'is_required' => 'مورد نیاز است',
'is_unique' => 'منحصر به فرد است',
'number' => 'عدد',
'decimal' => 'اعشار',
'email' => 'پست الکترونیک',
'url' => 'URL',
'configuration' => 'Configuration',
'status' => 'Status',
'configuration' => 'پیکربندی',
'status' => 'وضعیت',
'yes' => 'بله',
'no' => 'خیر',
'value_per_locale' => 'مقدار در هر ممحل',
'value_per_channel' => 'مقدار در هر کانال',
'value_per_channel' => 'مقدار در هر کانال',
'is_filterable' => 'استفاده در Navigation Layered',
'is_configurable' => 'برای ایجاد یک محصول قابل تنظیم استفاده کنید',
'admin_name' => 'نام مدیر',
@ -501,7 +574,11 @@ return [
'text-swatch' => 'متن Swatch',
'swatch' => 'Swatch',
'image' => 'تصویر',
'file' => 'فایل'
'file' => 'فایل',
'checkbox' => 'Checkbox',
'use_in_flat' => "در جدول تخت محصول ایجاد کنید",
'is_comparable' => "ویژگی قابل مقایسه است",
'default_null_option' => 'گزینه پیش فرض خالی ایجاد کنید',
],
'families' => [
'title' => 'خانواده ها',
@ -545,6 +622,8 @@ return [
'meta_description' => 'توضیحات متا',
'meta_keywords' => 'کلیدواژه ها متا',
'image' => 'تصویر',
'filterable-attributes' => 'ویژگی های فیلتر',
'attributes' => 'ویژگی های',
]
],
@ -592,6 +671,7 @@ return [
'edit-button-title' => 'ویرایش نرخ'
],
'zip_code' => 'کد پستی',
'is_zip' => 'محدوده Zip را فعال کنید',
],
'sales' => [
@ -610,10 +690,12 @@ return [
'title' => 'محل ها',
'add-title' => 'افزودن محل',
'edit-title' => 'ویرایش محل',
'add-title' => 'محل را اضافه کنید',
'save-btn-title' => 'ذخیره محل',
'general' => 'عمومی',
'code' => 'کد',
'name' => 'نام',
'direction' => 'جهت',
'create-success' => 'محل با موفقیت ایجاد شد',
'update-success' => 'محل با موفقیت به روز شد.',
'delete-success' => 'محل با موفقیت حذف شد.',
@ -650,6 +732,8 @@ return [
'source_currency' => 'منبع ارز',
'target_currency' => 'هدف ارز',
'rate' => 'نرخ',
'exchange-class-not-found' => 'کلاس نرخ ارز :service یافت نشد',
'update-rates' => 'نرخ ها را به روز کنید',
'create-success' => 'نرخ ارز با موفقیت ایجاد شد.',
'update-success' => 'نرخ ارز با موفقیت به روز شد.',
'delete-success' => 'نرخ ارز با موفقیت حذف شد.',
@ -712,10 +796,16 @@ return [
'update-success' => 'کانال با موفقیت به روز شد.',
'delete-success' => 'کانال با موفقیت حذف شد.',
'last-delete-error' => 'حداقل یک کانال مورد نیاز است.',
'seo' => 'SEO صفحه اصلی',
'seo-title' => 'عنوان Meta',
'seo-description' => 'شرح Meta',
'seo-keywords' => 'کلید واژه ها Meta',
],
'sliders' => [
'title' => 'عنوان',
'name' => 'Name',
'name' => 'نام',
'add-title' => 'افزودن اسلاید',
'edit-title' => 'ویرایش اسلایدر',
'save-btn-title' => 'ذخیره اسلایدر',
@ -730,6 +820,7 @@ return [
'delete-success' => 'آخرین اسلایدر حذف نمی شود',
'delete-fail' => 'اسلایدر با موفقیت حذف شد'
],
'tax-categories' => [
'title' => 'دسته بندی های مالیات',
'add-title' => 'افزودن دسته بندی مالیات',
@ -752,6 +843,7 @@ return [
'atleast-one' => 'آخرین دسته مالیاتی را نمی توان حذف کرد',
'delete' => 'دسته بندی مالیات با موفقیت حذف شد'
],
'tax-rates' => [
'title' => 'نرخ مالیات',
'add-title' => 'افزودن نرخ مالیات',
@ -771,6 +863,7 @@ return [
'edit-button-title' => 'ویرایش نرخ'
],
'zip_code' => 'کد پستی',
'is_zip' => ' را فعال کنید Zip محدوده',
'create-success' => 'نرخ مالیات با موفقیت ایجاد شد',
'create-error' => 'نمی توان نرخ مالیات ایجاد کرد',
'update-success' => 'نرخ مالیات با موفقیت به روز شد',
@ -789,12 +882,43 @@ return [
'edit-title' => 'ویرایش گروه',
'save-btn-title' => 'ذخیره گروه',
'title' => 'گروه ها',
'save-btn-title' => 'ذخیره گروه',
'code' => 'کد',
'name' => 'نام',
'is_user_defined' => 'تعریف شده توسط کاربر',
'yes' => 'بله'
],
'addresses' => [
'title' => ':customer_name لیست آدرس های ',
'vat_id' => 'id وات',
'create-title' => 'آدرس مشتری را ایجاد کنید',
'edit-title' => 'آدرس مشتری را به روز کنید',
'title-orders' => ':customer_name لیست سفارشات ',
'address-list' => 'لیست آدرس',
'order-list' => 'لیست سفارشات',
'address-id' => 'ID نشانی',
'address-1' => 'آدرس 1',
'city' => 'شهر',
'state-name' => 'دولت',
'country-name' => 'کشور',
'postcode' => 'کد پستی',
'default-address' => 'آدرس پیش فرض',
'yes' => 'آره',
'not-approved' => 'مورد تایید نیست',
'no' => 'نه',
'dash' => '-',
'delete' => 'حذف',
'create-btn-title' => 'اضافه کردن آدرس',
'save-btn-title' => 'ذخیره آدرس',
'general' => 'عمومی',
'success-create' => 'آدرس مشتری با موفقیت ایجاد شد Success:',
'success-update' => 'آدرس مشتری با موفقیت به روز شد Success:',
'success-delete' => 'آدرس مشتری با موفقیت حذف شد Success:',
'success-mass-delete' => 'آدرس های انتخاب شده با موفقیت حذف شدند Success:',
'error-create' => 'آدرس مشتری ایجاد نشده است Error:',
],
'note' => [
'title' => 'افزودن یادداشت',
'save-note' => 'ذخیره یادداشت',
@ -818,13 +942,14 @@ return [
'state' => 'استان',
'select-state' => 'یک منطقه ، ایالت یا استان را انتخاب کنید.',
'country' => 'کشور',
'other' => 'Other',
'other' => 'دیگر',
'male' => 'مرد',
'female' => 'زن',
'phone' => 'تلفن',
'group-default' => 'نمی توان گروه پیش فرض را حذف کرد.',
'edit-help-title' => 'ویرایش مشتری',
'delete-help-title' => 'حذف مشتری',
'addresses' => 'Addresses',
'addresses' => 'آدرس ها',
'mass-destroy-success' => 'مشتریان با موفقیت حذف شدند',
'mass-update-success' => 'مشتریان با موفقیت به روز شدند',
'status' => 'وضعیت',
@ -857,91 +982,137 @@ return [
],
'promotion' => [
'catalog-rule' => 'قوانین کاتالوگ',
'cart-rule' => 'قوانین سبد خرید',
'add-catalog-rule' => 'افزودن قانون کاتالوگ',
'add-cart-rule' => 'افزودن قانون سبد خرید',
'edit-cart-rule' => 'ویرایش قانون کاتالوگ',
'edit-catalog-rule' => 'ویرایش قانون سبد خرید',
'create-catalog-rule' => 'ایجاد قانون کاتالوگ',
'create-cart-rule' => 'ایجاد قانون سبد خرید',
'save-btn-title' => 'ایجاد',
'edit-btn-title' => 'ویرایش',
'save' => 'ذخیره',
'select-attr' => 'انتخاب ویژگی',
'select-attr-fam' => 'انتخاب خانواده ویژگی',
'select-cart-attr' => 'انتخاب ویژگی سبد خرید',
'add_condition' => 'افزودن شرط',
'global_labels' => 'برچسب های جهانی',
'general-info' => [
'name' => 'نام نقش',
'description' => 'توضیحات',
'starts-from' => 'شروع',
'ends-till' => 'پایان',
'channels' => 'کانال ها',
'channels-req' => 'کانال ها',
'cust-groups' => 'گروه های مشتری',
'priority' => 'اولویت',
'add-condition' => 'افزودن شرایط',
'disc_amt' => 'مقدار تخفیف',
'disc_percent' => 'درصد تخفیف',
'is-coupon' => 'از کوپن استفاده کنید',
'is-coupon-yes' => 'بله',
'is-coupon-no' => 'خیر',
'uses-per-cust' => 'استفاده می شود برای هر مشتری',
'all' => 'همه',
'any' => 'هیچ',
'end-other-rules' => 'پایان قوانین دیگر',
'status' => 'فعال است',
'all-conditions-true' => 'به فرض همه شرایط صحیح است',
'assuming' => 'با فرض اینکه',
'conditions' => 'شرایط',
'apply' => 'درخواست دادن',
'are' => 'هستند',
'true' => 'صحیح',
'false' => 'غلط',
'limit' => 'محدودیت استفاده',
'specific-coupon' => 'کوپن خاص (چک) / خودکار تولید شده (بررسی نشده)',
'free-shipping' => 'ارسال رایگان',
'is-guest' => 'برای مهمانان',
'disc_qty' => 'حداکثر. مقدار مجاز برای تخفیف',
'test-mode' => 'انتخاب کنید چگونه شرایط را آزمایش کنیم',
'labels' => 'برچسب',
'information' => 'اطلاعات',
'actions' => 'عملیات',
'coupons' => 'کوپن ها'
],
'status' => [
'success' => 'موفقیت! قانون ایجاد شده است',
'success-coupon' => 'موفقیت! قانون به همراه کوپن ایجاد شده است',
'failed' => 'خطا! نتوانست قانون را ایجاد کند',
'update-success' => 'موفقیت! قانون به روز شد',
'update-coupon-success' => 'موفقیت! قانون به همراه کوپن به روز شد',
'update-failed' => 'خطا! نمی توان بروزرسانی کرد',
'delete-success' => 'موفق! قانون حذف شد',
'delete-failed' => 'خطا! حذف نمی شود',
'coupon-applied' => 'کوپن مورد استفاده',
'coupon-failed' => 'کوپن نتوانست اعمال شود',
'no-coupon' => '* کوپن قابل استفاده نیست',
'coupon-removed' => 'کوپن با موفقیت حذف شد',
'coupon-remove-failed' => 'حذف کوپن انجام نشد',
'duplicate-coupon' => 'کوپن قبلاً وجود دارد ، لطفاً با یک کوپن دیگر دوباره امتحان کنید'
],
'catalog' => [
'cart-rules' => [
'title' => 'قوانین سبد خرید',
'add-title' => 'قانون سبد خرید را اضافه کنید',
'edit-title' => 'تنظیم قانون سبد خرید',
'save-btn-title' => 'صرفه جویی در قانون سبد خرید',
'rule-information' => 'اطلاعات قانون',
'name' => 'نام',
'description' => 'توضیحات',
'apply-percent' => 'به عنوان درصد اعمال شود',
'apply-fixed' => 'به عنوان مقدار ثابت اعمال شود',
'adjust-to-percent' => 'تنظیم به درصد',
'adjust-to-value' => 'مقدار تخفیف را تنظیم کنید',
'condition-missing' => 'لطفا شرایط را بررسی کنید ، برخی از مقادیر ممکن است وجود نداشته باشد'
'description' => 'شرح',
'status' => 'وضعیت',
'is-active' => 'قاعده سبد خرید فعال است',
'channels' => 'کانالها',
'customer-groups' => 'گروه های مشتری',
'coupon-type' => 'نوع کوپن',
'no-coupon' => 'بدون کوپن',
'specific-coupon' => 'کوپن خاص',
'auto-generate-coupon' => 'تولید کوپن خودکار',
'no' => 'نه',
'yes' => 'آره',
'coupon-code' => 'کد کوپن',
'uses-per-coupon' => 'از هر کوپن استفاده می کند',
'uses-per-customer' => 'از هر مشتری استفاده می کند',
'uses-per-customer-control-info' => 'فقط برای ورود به سیستم در مشتریان استفاده می شود',
'from' => 'از جانب',
'to' => 'به',
'priority' => 'اولویت',
'conditions' => 'شرایط',
'condition-type' => 'نوع وضعیت',
'all-conditions-true' => 'همه شرایط صحیح است',
'any-condition-true' => 'هر شرایطی درست است',
'add-condition' => 'شرط را اضافه کنید',
'choose-condition-to-add' => 'شرطی را برای اضافه کردن انتخاب کنید',
'cart-attribute' => 'ویژگی سبد خرید',
'subtotal' => 'فرعی',
'total-items-qty' => 'تعداد کل موارد',
'total-weight' => 'وزن کل',
'payment-method' => 'روش پرداخت',
'shipping-method' => 'روش حمل و نقل',
'shipping-postcode' => 'حمل و نقل پستی / کد پستی',
'shipping-state' => 'کشور حمل و نقل',
'shipping-country' => 'کشور حمل و نقل',
'cart-item-attribute' => 'ویژگی مورد سبد خرید',
'price-in-cart' => 'قیمت در سبد خرید',
'qty-in-cart' => 'کمیت در سبد خرید',
'product-attribute' => 'ویژگی محصول',
'attribute-name-children-only' => '(فقط کودکان) :attribute_name',
'attribute-name-parent-only' => '(فقط والدین) :attribute_name' ,
'is-equal-to' => 'برابر است با',
'is-not-equal-to' => 'مساوی نیست',
'equals-or-greater-than' => 'برابر یا بیشتر از',
'equals-or-less-than' => 'برابر یا کمتر از',
'greater-than' => 'بزرگتر از',
'less-than' => 'کمتر از',
'contain' => 'حاوی',
'contains' => 'حاوی',
'does-not-contain' => 'شامل نمی شود',
'actions' => 'اقدامات',
'action-type' => 'نوع عمل',
'percentage-product-price' => 'درصد قیمت محصول',
'fixed-amount' => 'مقدار ثابت',
'fixed-amount-whole-cart' => 'مقدار ثابت به سبد خرید',
'buy-x-get-y-free' => 'خرید X دریافت Y رایگان',
'discount-amount' => 'مقدار تخفیف',
'discount-quantity' => 'حداکثر مقدار مجاز برای تخفیف',
'discount-step' => 'مقدار X را بخرید',
'free-shipping' => 'ارسال رایگان',
'apply-to-shipping' => 'ارسال به حمل و نقل',
'coupon-codes' => 'کدهای کوپن',
'coupon-qty' => 'QTY کوپن',
'code-length' => 'طول کد',
'code-format' => 'قالب کد',
'alphanumeric' => 'الفبایی',
'alphabetical' => 'الفبایی',
'numeric' => 'عددی',
'code-prefix' => 'پیشوند کد',
'code-suffix' => 'کد سوفیکس',
'generate' => 'تولید می کنند',
'cart-rule-not-defind-error' => 'قانون سبد خرید تعریف نشده است',
'mass-delete-success' => 'همه کوپن های انتخاب شده با موفقیت حذف شدند.',
'end-other-rules' => 'قوانین دیگر را پایان دهید',
'children-categories' => '(دسته بندی ها (فقط کودکان',
'parent-categories' => '(دسته ها (فقط والدین',
'categories' => 'دسته بندی ها',
'attribute_family' => 'خانواده ویژگی'
],
'cart' => [
'buy-atleast' => 'حداقل بخرید',
'apply-to-shipping' => 'درخواست حمل و نقل'
'catalog-rules' => [
'title' => 'قوانین فهرست',
'add-title' => 'قانون کاتالوگ را اضافه کنید',
'edit-title' => 'تنظیم قانون کاتالوگ',
'save-btn-title' => 'ذخیره قانون کاتالوگ',
'rule-information' => 'اطلاعات قانون',
'name' => 'نام',
'description' => 'شرح',
'status' => 'وضعیت',
'is-active' => 'قانون کاتالوگ فعال است',
'channels' => 'کانالها',
'customer-groups' => 'گروه های مشتری',
'no' => 'نه',
'yes' => 'آره',
'from' => 'از جانب',
'to' => 'به',
'priority' => 'اولویت',
'conditions' => 'شرایط',
'condition-type' => 'نوع وضعیت',
'all-conditions-true' => 'همه شرایط صحیح است',
'any-condition-true' => 'هر شرایطی درست است',
'add-condition' => 'شرط را اضافه کنید',
'choose-condition-to-add' => 'شرطی را برای اضافه کردن انتخاب کنید',
'product-attribute' => 'ویژگی محصول',
'attribute-name-children-only' => ' (فقط کودکان) :attribute_name',
'attribute-name-parent-only' => '(فقط والدین) :attribute_name',
'is-equal-to' => 'برابر است با',
'is-not-equal-to' => 'مساوی نیست',
'equals-or-greater-than' => 'برابر یا بیشتر از',
'equals-or-less-than' => 'برابر یا کمتر از',
'greater-than' => 'بزرگتر از',
'less-than' => 'کمتر از',
'contain' => 'حاوی',
'contains' => 'حاوی',
'does-not-contain' => 'شامل نمی شود',
'actions' => 'اقدامات',
'action-type' => 'نوع عمل',
'percentage-product-price' => 'درصد قیمت محصول',
'fixed-amount' => 'مقدار ثابت',
'fixed-amount-whole-cart' => 'مقدار ثابت به فهرست کامل',
'buy-x-get-y-free' => 'خرید X دریافت Y رایگان',
'discount-amount' => 'مقدار تخفیف',
'mass-delete-success' => 'همه فهرست انتخابی کوپن ها با موفقیت حذف شدند',
'end-other-rules' => 'قوانین دیگر را پایان دهید',
'categories' => 'دسته بندی ها',
'attribute_family' => 'خانواده ویژگی'
]
],
@ -985,7 +1156,7 @@ return [
'csv' => 'CSV',
'xls' => 'XLS',
'file' => 'File',
'upload-error' => 'پرونده باید یک نوع از نوع ها باشد: xls, xlsx, csv.',
'upload-error' => ':xls, xlsx, csv. پرونده باید یک نوع از نوع ها باشد',
'duplicate-error' => 'شناسه باید شناسه منحصر به فرد ، شناسه تکراری :identifier در سطر :position.',
'enough-row-error' => 'ردیف پرونده کافی نیست',
'allowed-type' => 'نوع مجاز :',
@ -994,25 +1165,60 @@ return [
'illegal-format' => 'خطا! این نوع قالب یا پشتیبانی نمی شود یا فرمت غیرقانونی آن است'
],
'cms' => [
'pages' => [
'general' => 'عمومی',
'seo' => 'SEO',
'pages' => 'صفحات',
'title' => 'صفحات',
'add-title' => 'اضافه کردن صفحه',
'content' => 'محتوا',
'url-key' => 'کلید URL',
'channel' => 'کانالها',
'locale' => 'محل های محلی',
'create-btn-title' => 'صفحه را ذخیره کن',
'edit-title' => 'ویرایش صفحه',
'edit-btn-title' => 'صفحه را ذخیره کن',
'create-success' => 'صفحه با موفقیت ایجاد شد',
'create-partial' => 'برخی از صفحات درخواست شده در حال حاضر وجود دارد',
'create-failure' => 'تمام صفحات درخواست شده در حال حاضر وجود دارد',
'update-success' => 'صفحه با موفقیت به روز شد',
'update-failure' => 'صفحه نمی تواند به روز شود',
'page-title' => 'عنوان صفحه',
'layout' => 'چیدمان',
'meta_keywords' => 'کلید واژه ها Meta',
'meta_description' => 'شرح Meta',
'meta_title' => 'عنوان Meta',
'delete-success' => 'صفحه CMS با موفقیت حذف شد',
'delete-failure' => 'صفحه CMS حذف نمی شود',
'preview' => 'پیش نمایش',
'one-col' => '<div class="mt-10">Use class: <b>"static-container one-column"</b> برای یک طرح ستون</div>',
'two-col' => '<div class="mt-10">Use class: <b>"static-container two-column"</b> برای طرح دو ستون</div>',
'three-col' => '<div class="mt-10">Use class: <b>"static-container three-column"</b> برای طرح سه ستون</div>',
'helper-classes' => 'کلاسهای یاور'
]
],
'response' => [
'being-used' => 'این منبع :name استفاده می شود در منبع :source',
'being-used' => ' مورد استفاده قرار می گیرد :source در :name این منبع',
'cannot-delete-default' => 'کانال پیش فرض حذف نمی شود',
'create-success' => ':name با موفقیت ایجاد شد',
'update-success' => ':name با موفقیت به روز شد.',
'delete-success' => ':name با موفقیت حذف شد',
'create-success' => ' با موفقیت ایجاد شد :name',
'update-success' => ' با موفقیت به روز شد :name',
'delete-success' => 'با موفقیت حذف شد :name',
'delete-failed' => 'هنگام حذف :name خطایی روی داد.',
'last-delete-error' => 'حداقل یک :name لازم است.',
'user-define-error' => 'نمی توان :name سیستم را حذف کرد.',
'attribute-error' => ':name در محصولات قابل تنظیم استفاده می شود.',
'attribute-product-error' => ':name در محصولات استفاده می شود.',
'customer-associate' => ':name نمی توان حذف کرد زیرا مشتری با این گروه در ارتباط است.',
'attribute-error' => 'در محصولات قابل تنظیم استفاده می شود :name ' ,
'attribute-product-error' => ' در محصولات استفاده می شود :name',
'customer-associate' => ' نمی توان حذف کرد زیرا مشتری با این گروه در ارتباط است :name',
'currency-delete-error' => 'این ارز به عنوان ارز پایه کانال تنظیم شده است بنابراین نمی توان آن را حذف کرد.',
'upload-success' => ':name با موفقیت بارگذاری شد.',
'upload-success' => ' با موفقیت بارگذاری شد :name',
'delete-category-root' => 'نمی توان دسته اصلی را حذف کرد',
'create-root-failure' => 'طبقه بندی با ریشه نام در حال حاضر وجود دارد',
'cancel-success' => ':name با موفقیت لغو شد.',
'cancel-error' => ':name قابل لغو نیست.',
'already-taken' => ':name قبلا گرفته شده.'
'cancel-success' => ' با موفقیت لغو شد :name',
'cancel-error' => ' قابل لغو نیست :name',
'already-taken' => ' قبلا گرفته شده :name',
'order-pending' => 'حساب حذف نمی شود زیرا برخی از سفارش ها حالت معلق یا در حال پردازش هستند'
],
'footer' => [
@ -1020,9 +1226,29 @@ return [
],
'admin' => [
'emails' => [
'email' => 'پست الکترونیک',
'notification_label' => 'اطلاعیه',
'notifications' => [
'verification' => 'خدمات ارائه شده بفرست',
'registration' => 'ثبت نام از طریق ایمیل',
'customer' => 'ارسال ایمیل به مشتری',
'new-order' => 'ارسال تأییدیه سفارش ایمیل',
'new-admin' => 'ارسال ایمیل دعوت نامه به مدیر',
'new-invoice' => 'ارسال نامه الکترونیکی برای تأیید فاکتور',
'new-refund' => 'ارسال نامه الکترونیکی اعلان بازپرداخت',
'new-shipment' => 'ارسال نامه الکترونیکی اعلان حمل و نقل',
'new-inventory-source' => 'ارسال نامه الکترونیکی اعلان منبع موجودی',
'cancel-order' => 'ارسال نامه لغو اعلان سفارش پست الکترونیکی',
],
],
'system' => [
'catalog' => 'کاتالوگ',
'products' => 'محصولات',
'guest-checkout' => 'وارسی میهمان',
'allow-guest-checkout' => 'مجاز به پرداخت مهمان',
'allow-guest-checkout-hint' => 'نکته: در صورت روشن بودن ، این گزینه به طور خاص برای هر محصول قابل تنظیم است',
'review' => 'بررسی',
'allow-guest-review' => 'اجازه دادن به کاربر مهمان برای بررسی',
'inventory' => 'موجودی',
@ -1062,17 +1288,34 @@ return [
'footer' => 'فوتر',
'content' => 'محتوا',
'footer-content' => 'متن فوتر',
'footer-toggle' => 'پایین صفحه را تغییر دهید',
'locale-options' => 'گزینه های واحد',
'weight-unit' => 'واحد وزن',
'admin-page-limit' => 'موارد پیش فرض در هر صفحه (مدیر)',
'email-settings' => 'Email Settings',
'email-sender-name' => 'Email Sender Name',
'shop-email-from' => 'Shop Email Address [For sending emails]',
'admin-name' => 'Admin Name',
'admin-email' => 'Admin Email',
'design' => 'طراحی',
'admin-logo' => 'لوگو مدیر',
'logo-image' => 'تصویر لوگو',
'credit-max' => 'اعتبار مشتری حداکثر',
'credit-max-value' => 'حداکثر میزان اعتبار',
'use-credit-max' => 'استفاده از حداکثر اعتبار',
'order-settings' => 'تنظیمات سفارش دهید',
'orderNumber' => 'تنظیمات شماره سفارش دهید',
'order-number-prefix' => 'پیش شماره شماره سفارش',
'order-number-length' => 'طول شماره سفارش',
'order-number-suffix' => 'تعداد کافی شماره سفارش',
'default' => 'پیش فرض',
'sandbox' => 'Sandbox',
'all-channels' => 'همه',
'all-locales' => 'همه',
'sandbox' => 'Sandbox',
'invoice-slip-design' => 'Invoice Slip Design',
'logo' => 'logo'
'logo' => 'logo',
'favicon' => 'Favicon'
]
]
];

View File

@ -370,7 +370,11 @@ return [
'total-due' => 'Total Due',
'cancel-confirm-msg' => 'Weet u zeker dat u deze bestelling wilt annuleren ?',
'refund-btn-title' => 'Terugbetaling',
'refunds' => 'Terugbetalingen'
'refunds' => 'Terugbetalingen',
'comment-added-success' => 'Comment addded successfully.',
'comment' => 'Comment',
'submit-comment' => 'Submit Comment',
'notify-customer' => 'Notify Customer',
],
'invoices' => [
@ -409,6 +413,7 @@ return [
'add-title' => 'Zending maken',
'save-btn-title' => 'Zending opslaan',
'qty-ordered' => 'Besteld aantal',
'qty-invoiced' => 'Qty Invoiced',
'qty-to-ship' => 'Te verzenden',
'available-sources' => 'Beschikbare bronnen',
'source' => 'Bron',
@ -426,24 +431,24 @@ return [
'refunds' => [
'title' => 'Terugbetalingen',
'id' => 'Id',
'add-title' => 'Create Refund',
'add-title' => 'Maak een terugbetaling',
'save-btn-title' => 'Opslaan',
'order-id' => 'Order Id',
'qty-ordered' => 'Qty Ordered',
'qty-to-refund' => 'Qty To Refund',
'refund-shipping' => 'Refund Shipping',
'adjustment-refund' => 'Adjustment Refund',
'adjustment-fee' => 'Adjustment Fee',
'update-qty' => 'Update Quantities',
'invalid-qty' => 'We found an invalid quantity to refund items.',
'refund-limit-error' => 'The most money available to refund is :amount.',
'order-id' => 'Bestellen Id',
'qty-ordered' => 'Hoeveelheid besteld',
'qty-to-refund' => 'Te restitueren hoeveelheid',
'refund-shipping' => 'Verzending terugbetalen',
'adjustment-refund' => 'Aanpassing restitutie',
'adjustment-fee' => 'Aanpassingskosten',
'update-qty' => 'Hoeveelheden bijwerken',
'invalid-qty' => 'We hebben een ongeldige hoeveelheid gevonden om artikelen terug te betalen.',
'refund-limit-error' => 'Het meeste geld dat terugbetaald kan worden is :amount.',
'refunded' => 'Teruggestort',
'date' => 'Refund Date',
'customer-name' => 'Customer Name',
'status' => 'Status',
'customer-name' => 'klantnaam',
'status' => 'Toestand',
'action' => 'Actie',
'view-title' => 'Refund #:refund_id',
'invalid-refund-amount-error' => 'Refund amount should be non zero.'
'view-title' => 'Terugbetaling #:refund_id',
'invalid-refund-amount-error' => 'Het restitutiebedrag mag niet nul zijn.'
]
],
@ -572,6 +577,7 @@ return [
'file' => 'Bestand',
'checkbox' => 'Checkbox',
'use_in_flat' => "Create in Product Flat Table",
'is_comparable' => "Attribuut is vergelijkbaar ",
'default_null_option' => 'Create default empty option',
],
'families' => [
@ -595,29 +601,29 @@ return [
'categories' => [
'title' => 'Categorieën',
'add-title' => 'Categorie toevoegen',
'edit-title' => 'Edit Category',
'save-btn-title' => 'Save Category',
'edit-title' => 'Categorie bewerken',
'save-btn-title' => 'Categorie opslaan',
'general' => 'Algemeen',
'name' => 'Naam',
'visible-in-menu' => 'Visible In Menu',
'visible-in-menu' => 'Zichtbaar in menu',
'yes' => 'Ja',
'no' => 'Nee',
'position' => 'Position',
'display-mode' => 'Display Mode',
'products-and-description' => 'Products and Description',
'products-only' => 'Products Only',
'description-only' => 'Description Only',
'description-and-images' => 'Description and Images',
'description' => 'Description',
'parent-category' => 'Parent Category',
'seo' => 'Search Engine Optimization',
'position' => 'Positie',
'display-mode' => 'Weergavemodus',
'products-and-description' => 'Producten en beschrijving',
'products-only' => 'Alleen producten',
'description-only' => 'Alleen beschrijving',
'description-and-images' => 'Beschrijving en afbeeldingen',
'description' => 'Beschrijving',
'parent-category' => 'Bovenliggende categorie',
'seo' => 'zoek machine optimalisatie',
'slug' => 'Slug',
'meta_title' => 'Meta Title',
'meta_description' => 'Meta Description',
'meta_title' => 'Metatitel',
'meta_description' => 'Meta omschrijving',
'meta_keywords' => 'Meta trefwoorden',
'image' => 'Afbeelding',
'filterable-attributes' => 'Filterable Attributes',
'attributes' => 'Attributes',
'filterable-attributes' => 'Filtreerbare kenmerken',
'attributes' => 'Attributen',
]
],
@ -649,32 +655,32 @@ return [
'tax-rates' => [
'title' => 'BTW-tarieven',
'add-title' => 'BTW toevoegen',
'edit-title' => 'Edit Tax Rate',
'save-btn-title' => 'Save Tax Rate',
'general' => 'Tax Rate',
'identifier' => 'Identifier',
'is_zip' => 'Enable Zip Range',
'zip_from' => 'Zip From',
'edit-title' => 'Btw-tarief bewerken',
'save-btn-title' => 'Belastingtarief opslaan',
'general' => 'Belastingtarief',
'identifier' => 'Identificatie',
'is_zip' => 'Zip-bereik inschakelen',
'zip_from' => 'Zip van',
'zip_to' => 'Zip To',
'state' => 'Staat/Provincie',
'select-state' => 'Select a region, state or province.',
'select-state' => 'Selecteer een regio, staat of provincie.',
'country' => 'Land',
'tax_rate' => 'Rate',
'tax_rate' => 'Tarief',
'edit' => [
'title' => 'Edit Tax Rate',
'edit-button-title' => 'Edit Rate'
'title' => 'Btw-tarief bewerken',
'edit-button-title' => 'Tarief bewerken'
],
'zip_code' => 'Zip Code',
'is_zip' => 'Enable Zip Range',
'zip_code' => 'Postcode',
'is_zip' => 'Zip-bereik inschakelen',
],
'sales' => [
'shipping-method' => [
'title' => 'Shipping Methods',
'title' => 'Verzendmethoden',
'save-btn-title' => 'Opslaan',
'description' => 'Description',
'active' => 'Actief',
'status' => 'Status'
'status' => 'Toestand'
]
]
],
@ -684,6 +690,7 @@ return [
'title' => 'Landinstellingen',
'add-title' => 'Landinstelling toevoegen',
'edit-title' => 'Landinstelling wijzigen',
'add-title' => 'Landinstelling toevoegen',
'save-btn-title' => 'Landinstelling opslaan',
'general' => 'Algemeen',
'code' => 'Code',
@ -725,8 +732,8 @@ return [
'source_currency' => 'Valuta bron',
'target_currency' => 'Valuta doel',
'rate' => 'Tarief',
'exchange-class-not-found' => ':service exchange rate class not found',
'update-rates' => 'Update rates using :service',
'exchange-class-not-found' => ':service wisselkoersklasse niet gevonden',
'update-rates' => 'Tarieven bijwerken',
'create-success' => 'Wisselkoers succesvol aangemaakt.',
'update-success' => 'Wisselkoers succesvol bijgewerkt.',
'delete-success' => 'Wisselkoers succesvol verwijderd.',
@ -741,8 +748,8 @@ return [
'code' => 'Code',
'name' => 'Naam',
'description' => 'Omschrijving',
'source-is-active' => 'Source is Active',
'contact-info' => 'Contact Information',
'source-is-active' => 'Bron is actief',
'contact-info' => 'Contactgegevens',
'contact_name' => 'Naam',
'contact_email' => 'Email',
'contact_number' => 'Contact nummer',
@ -757,10 +764,10 @@ return [
'latitude' => 'Latitude',
'longitude' => 'Longitude',
'status' => 'Status',
'create-success' => 'Inventory source created successfully.',
'update-success' => 'Inventory source updated successfully.',
'delete-success' => 'Inventory source deleted successfully.',
'last-delete-error' => 'At least one Inventory source is required.',
'create-success' => 'Voorraadbron succesvol aangemaakt.',
'update-success' => 'Voorraadbron succesvol bijgewerkt.',
'delete-success' => 'Voorraadbron verwijderd.',
'last-delete-error' => 'Er is ten minste één voorraadbron vereist.',
],
'channels' => [
'title' => 'Kanalen',
@ -772,16 +779,16 @@ return [
'name' => 'Naam',
'description' => 'Omschrijving',
'hostname' => 'Hostnaam',
'currencies-and-locales' => 'Currencies and Locales',
'currencies-and-locales' => 'Valuta en landinstellingen',
'locales' => 'Landinstellingen',
'default-locale' => 'Default Locale',
'default-locale' => 'Standaardlocale',
'currencies' => 'Valuta\'s',
'base-currency' => 'Standaard valuta',
'root-category' => 'Hoofdcategorie',
'inventory_sources' => 'Standaard bron',
'design' => 'Design',
'design' => 'Ontwerp',
'theme' => 'Thema',
'home_page_content' => 'Home Page Content',
'home_page_content' => 'Startpagina-inhoud',
'footer_content' => 'Onderschrift inhoud',
'logo' => 'Logo',
'favicon' => 'Favicon',
@ -806,12 +813,12 @@ return [
'image' => 'Afbeelding',
'content' => 'Inhoud',
'channels' => 'Kanaal',
'created-success' => 'Slider item created successfully',
'created-fault' => 'Error in creating slider item',
'update-success' => 'Slider item successfully updated',
'update-fail' => 'Slider cannot be updated',
'delete-success' => 'Cannot delete last llider item',
'delete-fail' => 'Slider item successfully deleted'
'created-success' => 'Slideritem met succes gemaakt',
'created-fault' => 'Fout bij het maken van een schuifitem',
'update-success' => 'Schuifitem is bijgewerkt',
'update-fail' => 'Schuifregelaar kan niet worden bijgewerkt',
'delete-success' => 'Kan laatste llider-item niet verwijderen',
'delete-fail' => 'Schuifitem is verwijderd'
],
'tax-categories' => [
@ -824,45 +831,45 @@ return [
'name' => 'Naam',
'code' => 'Code',
'description' => 'Omschrijving',
'select-taxrates' => 'Select Tax Rates',
'select-taxrates' => 'Selecteer Belastingtarieven',
'edit' => [
'title' => 'Edit Tax Category',
'edit-button-title' => 'Edit Tax Category'
'title' => 'Belastingcategorie bewerken',
'edit-button-title' => 'Belastingcategorie bewerken'
],
'create-success' => 'New Tax Category Created',
'create-error' => 'Error, While Creating Tax Category',
'update-success' => 'Successfully Updated Tax Category',
'update-error' => 'Error While Updating Tax Category',
'atleast-one' => 'Cannot Delete The Last Tax Category',
'delete' => 'Tax Category Successfully Deleted'
'create-success' => 'Nieuwe belastingcategorie gemaakt',
'create-error' => 'Fout bij het maken van belastingcategorie',
'update-success' => 'Belastingcategorie is bijgewerkt',
'update-error' => 'Fout bij bijwerken van belastingcategorie',
'atleast-one' => 'Kan de laatste belastingcategorie niet verwijderen',
'delete' => 'Belastingcategorie is verwijderd'
],
'tax-rates' => [
'title' => 'BTW-tarieven',
'add-title' => 'Create Tax Rate',
'edit-title' => 'Edit Tax Rate',
'save-btn-title' => 'Save Tax Rate',
'general' => 'Tax Rate',
'identifier' => 'Identifier',
'is_zip' => 'Enable Zip Range',
'zip_from' => 'Zip From',
'add-title' => 'Maak belastingtarief',
'edit-title' => 'Btw-tarief bewerken',
'save-btn-title' => 'Belastingtarief opslaan',
'general' => 'Belastingtarief',
'identifier' => 'Identificatie',
'is_zip' => 'Zip-bereik inschakelen',
'zip_from' => 'Zip van',
'zip_to' => 'Zip To',
'state' => 'Staat/Provincie',
'select-state' => 'Select a region, state or province.',
'select-state' => 'Selecteer een regio, staat of provincie.',
'country' => 'Land',
'tax_rate' => 'Rate',
'tax_rate' => 'Tarief',
'edit' => [
'title' => 'Edit Tax Rate',
'edit-button-title' => 'Edit Rate'
'title' => 'Btw-tarief bewerken',
'edit-button-title' => 'Tarief bewerken'
],
'zip_code' => 'Postcode',
'is_zip' => 'Enable Zip Range',
'is_zip' => 'Zip-bereik inschakelen',
'create-success' => 'Belastingtarief succesvol aangemaakt',
'create-error' => 'Cannot Create Tax Rate',
'update-success' => 'Tax Rate Updated Successfully',
'update-error' => 'Error! Tax Rate Cannot Be Updated',
'create-error' => 'Kan geen belastingtarief maken',
'update-success' => 'Belastingtarief succesvol bijgewerkt',
'update-error' => 'Fout! Belastingtarief kan niet worden bijgewerkt',
'delete' => 'Het BTW-tarief is verwijderd',
'atleast-one' => 'Cannot Delete Last Tax Rate'
'atleast-one' => 'Kan laatste belastingtarief niet verwijderen'
],
'development' => [
'title' => 'Ontwikkeling',
@ -873,9 +880,9 @@ return [
'groups' =>[
'add-title' => 'Groep toevoegen',
'edit-title' => 'Groep wijzigen',
'save-btn-title' => 'Save Group',
'save-btn-title' => 'Groep opslaan',
'title' => 'Groepen',
'save-btn-title' => 'Save Group',
'save-btn-title' => 'Groep opslaan',
'code' => 'Code',
'name' => 'Naam',
'is_user_defined' => 'Door de gebruiker gedefinieerd',
@ -885,13 +892,13 @@ return [
'addresses' => [
'title' => ':customer_name\'s Addresses List',
'vat_id' => 'BTW nummer',
'create-title' => 'Create Customer\'s Address',
'edit-title' => 'Update Customer\'s Address',
'title-orders' => ':customer_name\'s Orders List',
'address-list' => 'Address\'s List',
'order-list' => 'Order\'s List',
'address-id' => 'Address ID',
'address-1' => 'Address 1',
'create-title' => 'Maak het adres van de klant',
'edit-title' => 'Werk het adres van de klant bij',
'title-orders' => ':customer_name van de klant',
'address-list' => 'Adreslijst',
'order-list' => 'Lijst van de bestelling',
'address-id' => 'Adres ID',
'address-1' => 'Adres 1',
'city' => 'Woonplaats',
'state-name' => 'Staat',
'country-name' => 'Land',
@ -905,18 +912,18 @@ return [
'create-btn-title' => 'Adres toevoegen',
'save-btn-title' => 'Bewaar adres',
'general' => 'Algemeen',
'success-create' => 'Success: Customer address created successfully.',
'success-update' => 'Success: Customer address updated successfully.',
'success-delete' => 'Success: Customer address deleted successfully.',
'success-mass-delete' => 'Success: selected addresses deleted successfully.',
'error-create' => 'Error: Customer address not created.',
'success-create' => 'Success: Klantadres succesvol aangemaakt.',
'success-update' => 'Success: Klantadres succesvol bijgewerkt.',
'success-delete' => 'Success: Klantadres succesvol verwijderd.',
'success-mass-delete' => 'Success: geselecteerde adressen zijn succesvol verwijderd.',
'error-create' => 'Error: Klantadres niet aangemaakt.',
],
'note' => [
'title' => 'Add Note',
'save-note' => 'Save Note',
'enter-note' => 'Enter Note',
'help-title' => 'Add Note On This Customer'
'title' => 'Notitie toevoegen',
'save-note' => 'Notitie opslaan',
'enter-note' => 'Notitie invoeren',
'help-title' => 'Opmerking over deze klant toevoegen'
],
'customers' => [
@ -938,26 +945,27 @@ return [
'other' => 'Anders',
'male' => 'Man',
'female' => 'Vrouw',
'group-default' => 'Cannot delete the default group.',
'phone' => 'Telefoon',
'group-default' => 'Kan de standaardgroep niet verwijderen.',
'edit-help-title' => 'Wijzig klant',
'delete-help-title' => 'Klant verwijderen',
'addresses' => 'Addresses',
'mass-destroy-success' => 'Customers deleted successfully',
'mass-update-success' => 'Customers updated successfully',
'status' => 'Status',
'mass-destroy-success' => 'Klanten zijn succesvol verwijderd',
'mass-update-success' => 'Klanten succesvol bijgewerkt',
'status' => 'Toestand',
'active' => 'Actief',
'inactive' => 'Niet geactiveerd'
],
'reviews' => [
'title' => 'Reviews',
'edit-title' => 'Edit Review',
'rating' => 'Rating',
'status' => 'Status',
'comment' => 'Comment',
'pending' => 'Pending',
'approved' => 'Approve',
'disapproved' => 'Disapprove'
'title' => 'Recensies',
'edit-title' => 'Review bewerken',
'rating' => 'Beoordeling',
'status' => 'Toestand',
'comment' => 'Commentaar',
'pending' => 'In afwachting',
'approved' => 'Goedkeuren',
'disapproved' => 'Afkeuren'
],
'subscribers' => [
@ -975,167 +983,167 @@ return [
'promotions' => [
'cart-rules' => [
'title' => 'Cart Rules',
'add-title' => 'Add Cart Rule',
'edit-title' => 'Edit Cart Rule',
'save-btn-title' => 'Save Cart Rule',
'rule-information' => 'Rule Information',
'title' => 'Winkelwagenregels',
'add-title' => 'Winkelwagenregel toevoegen',
'edit-title' => 'Winkelwagenregel bewerken',
'save-btn-title' => 'Bewaar winkelwagen regel',
'rule-information' => 'Regelinformatie',
'name' => 'Naam',
'description' => 'Description',
'status' => 'Status',
'is-active' => 'Cart Rule is Active',
'description' => 'Beschrijving',
'status' => 'Toestand',
'is-active' => 'Winkelwagenregel is actief',
'channels' => 'Kanalen',
'customer-groups' => 'Customer Groups',
'coupon-type' => 'Coupon Type',
'no-coupon' => 'No Coupon',
'specific-coupon' => 'Specific Coupon',
'auto-generate-coupon' => 'Auto Generate Coupon',
'customer-groups' => 'Klantengroepen',
'coupon-type' => 'Coupontype',
'no-coupon' => 'Geen coupon',
'specific-coupon' => 'Specifieke coupon',
'auto-generate-coupon' => 'Coupon automatisch genereren',
'no' => 'Nee',
'yes' => 'Ja',
'coupon-code' => 'Coupon Code',
'uses-per-coupon' => 'Uses Per Coupon',
'uses-per-customer' => 'Uses Per Customer',
'uses-per-customer-control-info' => 'Will be used for logged in customers only.',
'from' => 'From',
'to' => 'To',
'priority' => 'Priority',
'conditions' => 'Conditions',
'condition-type' => 'Condition Type',
'all-conditions-true' => 'All Conditions are True',
'any-condition-true' => 'Any Condition is True',
'add-condition' => 'Add Condition',
'choose-condition-to-add' => 'Choose a condition to add',
'cart-attribute' => 'Cart Attribute',
'coupon-code' => 'coupon code',
'uses-per-coupon' => 'Gebruikt per coupon',
'uses-per-customer' => 'Gebruik per klant',
'uses-per-customer-control-info' => 'Wordt alleen gebruikt voor ingelogde klanten.',
'from' => 'Van',
'to' => 'Naar',
'priority' => 'Prioriteit',
'conditions' => 'Voorwaarden',
'condition-type' => 'Conditietype',
'all-conditions-true' => 'Alle voorwaarden zijn waar',
'any-condition-true' => 'Elke voorwaarde is waar',
'add-condition' => 'Conditie toevoegen',
'choose-condition-to-add' => 'Conditie toevoegen',
'cart-attribute' => 'Winkelwagenattribuut',
'subtotal' => 'Subtotaal',
'total-items-qty' => 'Total Items Qty',
'total-weight' => 'Total Weight',
'total-items-qty' => 'Totaal aantal artikelen',
'total-weight' => 'Totale gewicht',
'payment-method' => 'Betaalmethode',
'shipping-method' => 'Shipping Method',
'shipping-postcode' => 'Shipping Zip/Postcode',
'shipping-state' => 'Shipping State',
'shipping-country' => 'Shipping Country',
'cart-item-attribute' => 'Cart Item Attribute',
'price-in-cart' => 'Price in Cart',
'qty-in-cart' => 'Qty in Cart',
'product-attribute' => 'Product Attribute',
'attribute-name-children-only' => ':attribute_name (Children Only)',
'attribute-name-parent-only' => ':attribute_name (Parent Only)',
'is-equal-to' => 'Is equal to',
'is-not-equal-to' => 'Is not equal to',
'equals-or-greater-than' => 'Equals or greater than',
'equals-or-less-than' => 'Equals or less than',
'greater-than' => 'Greater than',
'less-than' => 'Less than',
'contain' => 'Contain',
'contains' => 'Contains',
'does-not-contain' => 'Does not contain',
'shipping-method' => 'Verzendmethode',
'shipping-postcode' => 'Verzenden Zip / Postcode',
'shipping-state' => 'Verzenden Zip / Postcode',
'shipping-country' => 'Land van verzending',
'cart-item-attribute' => 'Land van verzending',
'price-in-cart' => 'Prijs in winkelwagen',
'qty-in-cart' => 'Aantal in winkelwagen',
'product-attribute' => 'Productkenmerk',
'attribute-name-children-only' => ':attribute_name (alleen kinderen)',
'attribute-name-parent-only' => ':attribute_name (alleen voor ouders)',
'is-equal-to' => 'Is gelijk aan',
'is-not-equal-to' => 'Is niet gelijk aan',
'equals-or-greater-than' => 'Is gelijk aan of groter dan',
'equals-or-less-than' => 'Is gelijk aan of kleiner dan',
'greater-than' => 'Groter dan',
'less-than' => 'Minder dan',
'contain' => 'Bevatten',
'contains' => 'Bevat',
'does-not-contain' => 'Bevat geen',
'actions' => 'Acties',
'action-type' => 'Action Type',
'percentage-product-price' => 'Percentage of Product Price',
'fixed-amount' => 'Fixed Amount',
'fixed-amount-whole-cart' => 'Fixed Amount to Whole Cart',
'buy-x-get-y-free' => 'Buy X Get Y Free',
'discount-amount' => 'Discount Amount',
'discount-quantity' => 'Maximum Quantity Allowed to be Discounted',
'discount-step' => 'Buy X Quantity',
'free-shipping' => 'Free Shipping',
'apply-to-shipping' => 'Apply to Shipping',
'coupon-codes' => 'Coupon Codes',
'coupon-qty' => 'Coupon Qty',
'code-length' => 'Code Length',
'code-format' => 'Code Format',
'alphanumeric' => 'Alphanumeric',
'alphabetical' => 'Alphabetical',
'numeric' => 'Numeric',
'code-prefix' => 'Code Prefix',
'code-suffix' => 'Code Suffix',
'generate' => 'Generate',
'cart-rule-not-defind-error' => 'Cart rule is not defined',
'mass-delete-success' => 'All the selected coupons have been deleted successfully.',
'end-other-rules' => 'End Other Rules',
'children-categories' => 'Categories (Children Only)',
'parent-categories' => 'Categories (Parent Only)',
'action-type' => 'actie type',
'percentage-product-price' => 'Percentage van productprijs',
'fixed-amount' => 'Vaste hoeveelheid',
'fixed-amount-whole-cart' => 'Vast bedrag voor hele winkelwagen',
'buy-x-get-y-free' => 'Koop X Krijg Y gratis',
'discount-amount' => 'Korting hoeveelheid',
'discount-quantity' => 'Maximaal toegestane hoeveelheid',
'discount-step' => 'Koop X hoeveelheid',
'free-shipping' => 'Geen verzendkosten',
'apply-to-shipping' => 'Toepassen op verzending',
'coupon-codes' => 'Kortingscodes',
'coupon-qty' => 'Aantal coupons',
'code-length' => 'Code Lengte',
'code-format' => 'Code formaat',
'alphanumeric' => 'Alfanumeriek',
'alphabetical' => 'Alfabetisch',
'numeric' => 'Numeriek',
'code-prefix' => 'Codevoorvoegsel',
'code-suffix' => 'Code achtervoegsel',
'generate' => 'Genereer',
'cart-rule-not-defind-error' => 'De winkelwagenregel is niet gedefinieerd',
'mass-delete-success' => 'Alle geselecteerde coupons zijn succesvol verwijderd.',
'end-other-rules' => 'Beëindig andere regels',
'children-categories' => 'Categorieën (Alleen kinderen)',
'parent-categories' => 'Categorieën (Alleen ouder)',
'categories' => 'Categorieën',
'attribute_family' => 'Attribute Family'
'attribute_family' => 'Kenmerk Familie'
],
'catalog-rules' => [
'title' => 'Catalog Rules',
'add-title' => 'Add Catalog Rule',
'edit-title' => 'Edit Catalog Rule',
'save-btn-title' => 'Save Catalog Rule',
'rule-information' => 'Rule Information',
'title' => 'Catalogusregels',
'add-title' => 'Catalogusregel toevoegen',
'edit-title' => 'Catalogusregel bewerken',
'save-btn-title' => 'Bewaar catalogusregel',
'rule-information' => 'Regelinformatie',
'name' => 'Naam',
'description' => 'Description',
'status' => 'Status',
'is-active' => 'Catalog Rule is Active',
'description' => 'Beschrijving',
'status' => 'Toestand',
'is-active' => 'Catalogusregel is actief',
'channels' => 'Kanalen',
'customer-groups' => 'Customer Groups',
'customer-groups' => 'Klantengroepen',
'no' => 'Nee',
'yes' => 'Ja',
'from' => 'From',
'to' => 'To',
'priority' => 'Priority',
'conditions' => 'Conditions',
'condition-type' => 'Condition Type',
'all-conditions-true' => 'All Conditions are True',
'any-condition-true' => 'Any Condition is True',
'add-condition' => 'Add Condition',
'choose-condition-to-add' => 'Choose a condition to add',
'product-attribute' => 'Product Attribute',
'attribute-name-children-only' => ':attribute_name (Children Only)',
'attribute-name-parent-only' => ':attribute_name (Parent Only)',
'is-equal-to' => 'Is equal to',
'is-not-equal-to' => 'Is not equal to',
'equals-or-greater-than' => 'Equals or greater than',
'equals-or-less-than' => 'Equals or less than',
'greater-than' => 'Greater than',
'less-than' => 'Less than',
'contain' => 'Contain',
'contains' => 'Contains',
'does-not-contain' => 'Does not contain',
'from' => 'Van',
'to' => 'Naar',
'priority' => 'Prioriteit',
'conditions' => 'Voorwaarden',
'condition-type' => 'Conditietype',
'all-conditions-true' => 'Alle voorwaarden zijn waar',
'any-condition-true' => 'Elke voorwaarde is waar',
'add-condition' => 'Conditie toevoegen',
'choose-condition-to-add' => 'Kies een voorwaarde om toe te voegen',
'product-attribute' => 'Productkenmerk',
'attribute-name-children-only' => ':attribute_name (Alleen kinderen)',
'attribute-name-parent-only' => ':attribute_name (Alleen ouder)',
'is-equal-to' => 'Is gelijk aan',
'is-not-equal-to' => 'Is niet gelijk aan',
'equals-or-greater-than' => 'Is gelijk aan of groter dan',
'equals-or-less-than' => 'Is gelijk aan of kleiner dan',
'greater-than' => 'Groter dan',
'less-than' => 'Minder dan',
'contain' => 'Minder dan',
'contains' => 'Bevat',
'does-not-contain' => 'Bevat geen',
'actions' => 'Acties',
'action-type' => 'Action Type',
'percentage-product-price' => 'Percentage of Product Price',
'fixed-amount' => 'Fixed Amount',
'fixed-amount-whole-cart' => 'Fixed Amount to Whole Catalog',
'buy-x-get-y-free' => 'Buy X Get Y Free',
'discount-amount' => 'Discount Amount',
'mass-delete-success' => 'All the selected index of coupons have been deleted successfully.',
'end-other-rules' => 'End Other Rules',
'action-type' => 'actie type',
'percentage-product-price' => 'Percentage van productprijs',
'fixed-amount' => 'Vaste hoeveelheid',
'fixed-amount-whole-cart' => 'Vast bedrag voor hele catalogus',
'buy-x-get-y-free' => 'Koop X Krijg Y gratis',
'discount-amount' => 'Korting hoeveelheid',
'mass-delete-success' => 'Alle geselecteerde indexcoupons zijn met succes verwijderd.',
'end-other-rules' => 'Beëindig andere regels',
'categories' => 'Categorieën',
'attribute_family' => 'Attribute Family'
'attribute_family' => 'Kenmerk Familie'
]
],
'error' => [
'go-to-home' => 'GO TO HOME',
'in-maitainace' => 'In Maintenance',
'right-back' => 'Be Right Back',
'go-to-home' => 'GA NAAR HUIS',
'in-maitainace' => 'In onderhoud',
'right-back' => 'Ben zo terug',
'404' => [
'page-title' => '404 Page not found',
'page-title' => '404 Pagina niet gevonden',
'name' => '404',
'title' => 'Page Not found',
'message' => 'The Page you are looking for does not exist or have been moved. Navigate using sidemenu.'
'title' => 'Pagina niet gevonden',
'message' => 'De pagina die u zoekt bestaat niet of is verplaatst. Navigeer met behulp van zijmenu.'
],
'403' => [
'page-title' => '403 forbidden Error',
'page-title' => '403 verboden fout',
'name' => '403',
'title' => 'Forbidden error',
'message' => 'You do not have permission to access this page'
'title' => 'Verboden fout',
'message' => 'U heeft geen toestemming om deze pagina te openen'
],
'500' => [
'page-title' => '500 Internal Server Error',
'page-title' => '500 Interne Server Fout',
'name' => '500',
'title' => 'Internal Server Error',
'message' => 'The Server Encountered an internal error.'
'title' => 'Interne Server Fout',
'message' => 'De server heeft een interne fout aangetroffen.'
],
'401' => [
'page-title' => '401 Unauthorized Error',
'page-title' => '401 Ongeautoriseerde fout',
'name' => '401',
'title' => 'Unauthorized Error',
'message' => 'The request has not been applied because it lacks valid authentication credentials for the target resource.'
'title' => 'Ongeautoriseerde fout',
'message' => 'Het verzoek is niet toegepast omdat het geen geldige verificatiereferenties heeft voor de doelresource.'
],
],
@ -1148,73 +1156,73 @@ return [
'csv' => 'CSV',
'xls' => 'XLS',
'file' => 'File',
'upload-error' => 'The file must be a file of type: xls, xlsx, csv.',
'duplicate-error' => 'Identifier must be unique, duplicate identifier :identifier at row :position.',
'enough-row-error' => 'file has not enough rows',
'allowed-type' => 'Allowed Type :',
'upload-error' => 'Het bestand moet een bestandstype zijn: xls, xlsx, csv.',
'duplicate-error' => 'Identifier moet uniek zijn, dubbele identifier :identifier op rij :position.',
'enough-row-error' => 'bestand heeft niet genoeg rijen',
'allowed-type' => 'Toegestaan type:',
'file-type' => 'csv, xls, xlsx.',
'no-records' => 'Nothing to export',
'illegal-format' => 'Error! This type of format is either not supported or its illegal format'
'no-records' => 'Niets om te exporteren',
'illegal-format' => 'Fout! Dit type formaat wordt niet ondersteund of het is illegaal'
],
'cms' => [
'pages' => [
'general' => 'Algemeen',
'seo' => 'SEO',
'pages' => 'Pages',
'title' => 'Pages',
'pages' => 'Pagina\'s',
'title' => 'Pagina\'s',
'add-title' => 'Pagina toevoegen',
'content' => 'Content',
'url-key' => 'URL Key',
'content' => 'Inhoud',
'url-key' => 'URL Sleutel',
'channel' => 'Kanalen',
'locale' => 'Landinstelling',
'create-btn-title' => 'Pagina opslaan',
'edit-title' => 'Pagina aanpassen',
'edit-btn-title' => 'Save Page',
'edit-btn-title' => 'Sla pagina op',
'create-success' => 'Pagina succesvol aangemaakt.',
'create-partial' => 'Some of the pages requested already exists.',
'create-failure' => 'All pages requested already exists.',
'create-partial' => 'Sommige van de opgevraagde pagina\'s bestaan al.',
'create-failure' => 'Alle opgevraagde pagina\'s bestaan al.',
'update-success' => 'Pagina succesvol bijgewerkt.',
'update-failure' => 'Pagina kan niet worden bijgewerkt.',
'page-title' => 'Pagina titel',
'layout' => 'Layout',
'layout' => 'Indeling',
'meta_keywords' => 'Meta trefwoorden',
'meta_description' => 'Meta omschrijving',
'meta_title' => 'Meta Titel',
'delete-success' => 'CMS page deleted successfully',
'delete-failure' => 'CMS page cannot be deleted',
'delete-success' => 'CMS-pagina succesvol verwijderd',
'delete-failure' => 'CMS-pagina kan niet worden verwijderd',
'preview' => 'Voorbeeld',
'one-col' => '<div class="mt-10">Use class: <b>"static-container one-column"</b> for one column layout.</div>',
'two-col' => '<div class="mt-10">Use class: <b>"static-container two-column"</b> for two column layout.</div>',
'three-col' => '<div class="mt-10">Use class: <b>"static-container three-column"</b> for three column layout.</div>',
'one-col' => '<div class="mt-10">Use class: <b>"static-container one-column"</b> voor één kolomlay-out.</div>',
'two-col' => '<div class="mt-10">Use class: <b>"static-container two-column"</b> voor lay-out met twee kolommen.</div>',
'three-col' => '<div class="mt-10">Use class: <b>"static-container three-column"</b> voor lay-out met drie kolommen.</div>',
'helper-classes' => 'Helper Classes'
]
],
'response' => [
'being-used' => 'This resource :name is getting used in :source',
'cannot-delete-default' => 'Cannot delete the default channel',
'create-success' => ':name created successfully.',
'update-success' => ':name updated successfully.',
'delete-success' => ':name deleted successfully.',
'delete-failed' => 'Error encountered while deleting :name.',
'last-delete-error' => 'At least one :name is required.',
'user-define-error' => 'Can not delete system :name',
'attribute-error' => ':name is used in configurable products.',
'attribute-product-error' => ':name is used in products.',
'customer-associate' => ':name can not be deleted because customer is associated with this group.',
'currency-delete-error' => 'This currency is set as channel base currency so it can not be deleted.',
'upload-success' => ':name uploaded successfully.',
'delete-category-root' => 'Cannot delete the root category',
'create-root-failure' => 'Category with name root already exists',
'cancel-success' => ':name canceled successfully.',
'cancel-error' => ':name can not be canceled.',
'already-taken' => 'The :name has already been taken.',
'order-pending' => 'Cannot delete account because some Order(s) are pending or processing state.'
'being-used' => 'Deze bron :name is wennen :source',
'cannot-delete-default' => 'Kan het standaardkanaal niet verwijderen',
'create-success' => ':name succesvol gemaakt.',
'update-success' => ':name succesvol geupdatet.',
'delete-success' => ':name met succes verwijderd.',
'delete-failed' => 'Er is een fout opgetreden bij het verwijderen :name.',
'last-delete-error' => 'Minstens een :name Is benodigd.',
'user-define-error' => 'Kan systeem niet verwijderen :name',
'attribute-error' => ':name wordt gebruikt in configureerbare producten.',
'attribute-product-error' => ':name wordt gebruikt in producten.',
'customer-associate' => ':name kan niet worden verwijderd omdat de klant aan deze groep is gekoppeld.',
'currency-delete-error' => 'Deze valuta is ingesteld als kanaalbasisvaluta en kan dus niet worden verwijderd.',
'upload-success' => ':name succesvol geüpload.',
'delete-category-root' => 'Kan de rootcategorie niet verwijderen',
'create-root-failure' => 'Er bestaat al een categorie met de naam root',
'cancel-success' => ':name succesvol geannuleerd.',
'cancel-error' => ':name kan niet worden geannuleerd.',
'already-taken' => 'The :name is al bezet.',
'order-pending' => 'Kan account niet verwijderen omdat sommige bestelling (en) in behandeling of in behandeling zijn.'
],
'footer' => [
'copy-right' => 'Powered by <a href="https://bagisto.com/" target="_blank">Bagisto</a>, A Community Project by <a href="https://webkul.com/" target="_blank">Webkul</a>',
'copy-right' => 'Aangedreven door <a href="https://bagisto.com/" target="_blank">Bagisto</a>, Een gemeenschapsproject door <a href="https://webkul.com/" target="_blank">Webkul</a>',
],
'admin' => [
@ -1222,16 +1230,16 @@ return [
'email' => 'Email',
'notification_label' => 'Notificaties',
'notifications' => [
'verification' => 'Send verification E-mail',
'registration' => 'Send registration E-mail',
'customer' => 'Send customer E-mail',
'new-order' => 'Send Order Confirmation E-mail',
'new-admin' => 'Send Admin Invitation E-mail',
'new-invoice' => 'Send Invoice Confirmation E-mail',
'new-refund' => 'Send Refund Notification E-mail',
'new-shipment' => 'Send Shipment Notification E-mail',
'new-inventory-source' => 'Send Inventory Source Notification E-mail',
'cancel-order' => 'Send cancel Order Notification E-mail',
'verification' => 'Stuur verificatie E-mail',
'registration' => 'Verzend registratie E-mail',
'customer' => 'Stuur klant e-mail',
'new-order' => 'Stuur een e-mail ter bevestiging van de bestelling',
'new-admin' => 'Stuur een e-mail met de beheerdersuitnodiging',
'new-invoice' => 'Stuur een e-mail ter bevestiging van de factuur',
'new-refund' => 'Stuur een terugbetalingsmelding per e-mail',
'new-shipment' => 'Verzendbericht per e-mail verzenden',
'new-inventory-source' => 'E-mail met bronvermelding voor inventaris verzenden',
'cancel-order' => 'Verzenden annuleren Bestellingskennisgeving E-mail',
],
],
@ -1240,11 +1248,11 @@ return [
'products' => 'Producten',
'guest-checkout' => 'Gast afrekenen',
'allow-guest-checkout' => 'Gast afrekenen toestaan',
'allow-guest-checkout-hint' => 'Hint: If turned on, this option can be configured for each product specifically.',
'review' => 'Review',
'allow-guest-checkout-hint' => 'Tip: indien ingeschakeld, kan deze optie specifiek voor elk product worden geconfigureerd.',
'review' => 'Recensie',
'allow-guest-review' => 'Gastbeoordeling toestaan',
'inventory' => 'Voorraad',
'stock-options' => 'Stock Options',
'stock-options' => 'Aandelenopties',
'allow-backorders' => 'Backorders toestaan',
'customer' => 'Klant',
'settings' => 'Instellingen',
@ -1264,43 +1272,49 @@ return [
'title' => 'Titel',
'description' => 'Omschrijving',
'rate' => 'Tarief',
'status' => 'Status',
'status' => 'Toestand',
'type' => 'Type',
'payment-methods' => 'Betaalmethodes',
'cash-on-delivery' => 'Rembours',
'money-transfer' => 'Overschrijving',
'paypal-standard' => 'Paypal Standard',
'business-account' => 'Business Account',
'business-account' => 'Zakelijk account',
'newsletter' => 'Nieuwsbrief',
'newsletter-subscription' => 'Abonnement op Nieuwsbrief toestaan',
'email' => 'Email verificatie',
'email-verification' => 'E-mailverificatie toestaan',
'sort_order' => 'Sort Order',
'sort_order' => 'sorteervolgorde',
'general' => 'Algemeen',
'footer' => 'Footer',
'footer' => 'Voettekst',
'content' => 'Inhoud',
'footer-content' => 'Footer Text',
'footer-toggle' => 'Toggle footer',
'footer-content' => 'Voettekst',
'footer-toggle' => 'Voettekst in- / uitschakelen',
'locale-options' => 'Eenheid opties',
'weight-unit' => 'Gewichtseenheid',
'email-settings' => 'Email Settings',
'email-sender-name' => 'Email Sender Name',
'shop-email-from' => 'Shop Email Address [For sending emails]',
'admin-name' => 'Admin Name',
'admin-email' => 'Admin Email',
'admin-page-limit' => 'Standaarditems per pagina (Admin)',
'design' => 'Ontwerp',
'admin-logo' => 'Admin Logo',
'logo-image' => 'Logo Afbeelding',
'credit-max' => 'Customer Credit Max',
'credit-max-value' => 'Credit Max Value',
'use-credit-max' => 'Use Credit Max',
'credit-max' => 'Klantenkrediet Max',
'credit-max-value' => 'Maximale kredietwaarde',
'use-credit-max' => 'Gebruik krediet max',
'order-settings' => 'Bestel instellingen',
'orderNumber' => 'Order Number Settings',
'order-number-prefix' => 'Order Number Prefix',
'order-number-length' => 'Order Number Length',
'order-number-suffix' => 'Order Number Suffix',
'orderNumber' => 'Instellingen voor bestelnummers',
'order-number-prefix' => 'Bestelnummer prefix',
'order-number-length' => 'Bestelnummer Lengte',
'order-number-suffix' => 'Achtervoegsel bestelnummer',
'default' => 'Standaard',
'sandbox' => 'Sandbox',
'all-channels' => 'Alles',
'all-locales' => 'Alles',
'invoice-slip-design' => 'Invoice Slip Design',
'logo' => 'logo'
'logo' => 'logo',
'favicon' => 'Favicon'
]
]
];
];

View File

@ -1,5 +1,38 @@
<?php
return [
'save' => 'Salvar',
'create' => 'Criar',
'update' => 'Atualizar',
'delete' => 'Excluir',
'failed' => 'Falhou',
'store' => 'Loja',
'image' => 'Imagem',
'no result' => 'Nenhum resultado',
'product' => 'produtos',
'attribute' => 'Atributo',
'actions' => 'Ações',
'id' => 'ID',
'action' => 'açao',
'yes' => 'sim',
'no' => 'Não',
'true' => 'Verdade',
'false' => 'Falso',
'apply' => 'Aplique',
'action' => 'Açao',
'label' => 'Rótulo',
'name' => 'Nome',
'title' => 'Título',
'code' => 'Código',
'type' => 'Tipo',
'required' => 'Requeridos',
'unique' => 'Único',
'locale-based' => 'Com base na localidade',
'channel-based' => 'Baseado em canal',
'status' => 'Status',
'select-option' => 'Selecionar opção',
'category' => 'Categoria',
'common' => [
'no-result-found' => 'Não conseguimos encontrar nenhum registro.',
'country' => 'Pais',
@ -7,15 +40,17 @@ return [
'true' => 'Verdadeiro',
'false' => 'Falso'
],
'layouts' => [
'my-account' => 'Minha Conta',
'logout' => 'Sair',
'visit-shop' => 'Visitar Loja',
'dashboard' => 'Dashboard',
'dashboard' => 'painel de controle',
'sales' => 'Vendas',
'orders' => 'Pedido',
'shipments' => 'Envíos',
'invoices' => 'Faturas',
'refunds' => 'Reembolsos',
'catalog' => 'Catálogo',
'products' => 'Produtos',
'categories' => 'Categorias',
@ -29,7 +64,7 @@ return [
'settings' => 'Opções',
'locales' => 'Idiomas',
'currencies' => 'Moedas',
'exchange-rates' => 'Impostos de Câmbios',
'exchange-rates' => 'Taxas de Câmbios',
'inventory-sources' => 'Fontes de Inventários',
'channels' => 'Canais (Lojas)',
'users' => 'Usuários',
@ -39,8 +74,10 @@ return [
'tax-categories' => 'Categorias de Impostos',
'tax-rates' => 'Impostos de Impostos',
'promotion' => 'Promoções',
'discount' => 'Desconto'
'discount' => 'Desconto',
'cms' => 'CMS'
],
'acl' => [
'dashboard' => 'Dashboard',
'sales' => 'Vendas',
@ -56,12 +93,12 @@ return [
'groups' => 'Grupos',
'reviews' => 'Avaliações',
'newsletter-subscriptions' => 'Inscrições de Newsletter',
'configure' => 'Configure',
'configure' => 'Configurar',
'settings' => 'Configurações',
'locales' => 'Idiomas',
'currencies' => 'Moedas',
'exchange-rates' => 'Impostos de Câmbios',
'inventory-sources' => 'Fontes de Inventários',
'inventory-sources' => 'Origens de Estoque',
'channels' => 'Canais (Lojas)',
'users' => 'Usuários',
'roles' => 'Funções',
@ -73,8 +110,10 @@ return [
'create' => 'Add',
'delete' => 'Delete',
'promotions' => 'Promoções',
'cart-rules' => 'Regras do Carrinho'
'cart-rules' => 'Regras do Carrinho',
'catalog-rules' => 'Regras do Catálogo',
],
'dashboard' => [
'title' => 'Dashboard',
'from' => 'De',
@ -96,18 +135,22 @@ return [
'stock-threshold' => 'Limite de Estoque',
'qty-left' => ':qty Restante',
],
'datagrid' => [
'mass-ops' => [
'method-error' => 'Erro! Método errado detectado, por favor, verifique a configuração de ação em massa',
'delete-success' => 'O índice selecionado de :resource foi excluído com sucesso',
'partial-action' => 'Algumas ações não foram executadas devido a restrições restritas do sistema em :resource',
'update-success' => 'O índice selecionado :resource foram atualizados com sucesso',
'no-resource' => 'O recurso fornecido insuficiente para a ação'
],
'id' => 'ID',
'status' => 'Status',
'code' => 'Código',
'admin-name' => 'Nome',
'name' => 'Nome',
'direction' => 'Direção',
'fullname' => 'Nome Completo',
'type' => 'Tipo',
'required' => 'Obrigatório',
@ -116,10 +159,14 @@ return [
'per-channel' => 'Por Canal (Loja)',
'position' => 'Posição',
'locale' => 'Idioma',
'hostname' => 'Hostname',
'email' => 'Email',
'hostname' => 'nome de anfitrião',
'email' => 'O email',
'group' => 'Grupo',
'phone' => 'telefone',
'gender' => 'Gênero',
'title' => 'Título',
'layout' => 'Layout',
'url-key' => 'URL Chave',
'comment' => 'Comentário',
'product-name' => 'Produto',
'currency-name' => 'Nome da Moéda',
@ -155,29 +202,30 @@ return [
'per-cust' => 'Por cliente',
'usage-throttle' => 'Tempos de uso',
'for-guest' => 'Para convidados',
'order_number' => 'Order Number',
'refund-date' => 'Refund Date',
'refunded' => 'Refunded',
'start' => 'Start',
'end' => 'End',
'active' => 'Active',
'inactive' => 'Inactive',
'true' => 'True',
'false' => 'False',
'approved' => 'Approved',
'pending' => 'Pending',
'disapproved' => 'Disapproved',
'coupon-code' => 'Coupon Code',
'times-used' => 'Times Used',
'created-date' => 'Created Date',
'expiration-date' => 'Expiration Date',
'edit' => 'Edit',
'delete' => 'Delete',
'view' => 'View',
'order_number' => 'Número do pedido',
'refund-date' => 'Data do reembolso',
'refunded' => 'Devolveu',
'start' => 'Começar',
'end' => 'Fim',
'active' => 'Ativo',
'inactive' => 'Inativo',
'true' => 'Verdade',
'false' => 'Falso',
'approved' => 'Aprovado',
'pending' => 'Pendente',
'disapproved' => 'Reprovado',
'coupon-code' => 'Código do cupom',
'times-used' => 'Vezes Utilizado',
'created-date' => 'Data de criação',
'expiration-date' => 'Data de validade',
'edit' => 'Editar',
'delete' => 'Excluir',
'view' => 'Visão',
'rtl' => 'RTL',
'ltr' => 'LTR',
'update-status' => 'Update Status'
'update-status' => 'Atualizar o status'
],
'account' => [
'title' => 'Minha Conta',
'save-btn-title' => 'Salvar',
@ -189,6 +237,7 @@ return [
'change-password' => 'Mudar Senha da Conta',
'current-password' => 'Senha Atual'
],
'users' => [
'forget-password' => [
'title' => 'Esqueci Minha Senha',
@ -199,6 +248,7 @@ return [
'back-link-title' => 'Voltar para Login',
'submit-btn-title' => 'Link do E-mail para Recuperar Senha'
],
'reset-password' => [
'title' => 'Resetar Senha',
'email' => 'E-mail Registrado',
@ -207,6 +257,7 @@ return [
'back-link-title' => 'Voltar para Login',
'submit-btn-title' => 'Resetar Senha'
],
'roles' => [
'title' => 'Funções',
'add-role-title' => 'Add Função',
@ -220,6 +271,7 @@ return [
'custom' => 'Personalizado',
'all' => 'Tudo'
],
'users' => [
'title' => 'Usuário',
'add-user-title' => 'Add Usuário',
@ -245,6 +297,7 @@ return [
'login-error' => 'Por favor, verifique suas credenciais e tente novamente.',
'activate-warning' => 'Sua conta ainda está para ser ativada, entre em contato com o administrador.'
],
'sessions' => [
'title' => 'Entrar',
'email' => 'Email',
@ -254,6 +307,7 @@ return [
'submit-btn-title' => 'Entrar'
]
],
'sales' => [
'orders' => [
'title' => 'Pedidos',
@ -268,9 +322,16 @@ return [
'order-info' => 'Informação do Pedido',
'order-date' => 'Data do Pedido',
'order-status' => 'Status do Pedido',
'order-status-canceled' => 'Cancelado',
'order-status-closed' => 'Fechados',
'order-status-fraud' => 'Fraude',
'order-status-pending' => 'Pendente',
'order-status-pending-payment' => 'Pagamento Pendente',
'order-status-processing' => 'Em processamento',
'order-status-success' => 'Concluído',
'channel' => 'Canal (Loja)',
'customer-name' => 'Nome do Cliente',
'email' => 'Email',
'email' => 'O email',
'contact-number' => 'Número de Contato',
'account-info' => 'Informação da Conta',
'address' => 'Endereço',
@ -292,7 +353,7 @@ return [
'item-invoice' => 'Faturado(s) (:qty_invoiced)',
'item-shipped' => 'Enviado(s) (:qty_shipped)',
'item-canceled' => 'Cancelado(s) (:qty_canceled)',
'item-refunded' => 'Refunded (:qty_refunded)',
'item-refunded' => 'Devolveu (:qty_refunded)',
'price' => 'Preço',
'total' => 'Total',
'subtotal' => 'Subtotal',
@ -309,8 +370,13 @@ return [
'total-due' => 'Total Devido',
'cancel-confirm-msg' => 'Tem certeza que deseja cancelar esse pedido ?',
'refunds' => 'Refunds',
'refunded' => 'Refunded'
'refunded' => 'Refunded',
'comment-added-success' => 'Comment addded successfully.',
'comment' => 'Comment',
'submit-comment' => 'Submit Comment',
'notify-customer' => 'Notify Customer',
],
'invoices' => [
'title' => 'Faturas',
'id' => 'Id',
@ -347,6 +413,7 @@ return [
'add-title' => 'Criar Entrega',
'save-btn-title' => 'Salvar Entrega',
'qty-ordered' => 'Qtd pedido',
'qty-invoiced' => 'Qty Invoiced',
'qty-to-ship' => 'Qty para enviar',
'available-sources' => 'Fontes Disponíveis',
'source' => 'Fonte',
@ -362,28 +429,30 @@ return [
],
'refunds' => [
'title' => 'Refunds',
'title' => 'Reembolsos',
'id' => 'Id',
'add-title' => 'Create Refund',
'save-btn-title' => 'Refund',
'order-id' => 'Order Id',
'qty-ordered' => 'Qty Ordered',
'qty-to-refund' => 'Qty To Refund',
'refund-shipping' => 'Refund Shipping',
'adjustment-refund' => 'Adjustment Refund',
'adjustment-fee' => 'Adjustment Fee',
'update-qty' => 'Update Quantities',
'invalid-qty' => 'Found invalid quantity for return items.',
'refund-limit-error' => 'The most money available to refund is :amount.',
'refunded' => 'Refunded',
'date' => 'Refund Date',
'customer-name' => 'Customer Name',
'add-title' => 'Criar reembolso',
'save-btn-title' => 'Reembolso',
'order-id' => 'Ordem Id',
'qty-ordered' => 'Qty Encomendado',
'qty-to-refund' => 'Qty To Reembolso',
'refund-shipping' => 'Envio de reembolso',
'adjustment-refund' => 'Reembolso de ajuste',
'adjustment-fee' => 'Taxa de ajuste',
'update-qty' => 'Quantidades de atualização',
'invalid-qty' => 'Encontramos uma quantidade inválida para reembolsar itens.',
'refund-limit-error' => 'O máximo de dinheiro disponível para reembolso :amount.',
'refunded' => 'Devolveu',
'date' => 'Data do reembolso',
'customer-name' => 'nome do cliente',
'status' => 'Status',
'action' => 'Action',
'view-title' => 'Refund #:refund_id',
'action' => 'Açao',
'view-title' => 'Reembolso #:refund_id',
'invalid-refund-amount-error' => 'Refund amount should be non zero.'
]
],
'catalog' => [
'products' => [
'title' => 'Produtos',
@ -410,28 +479,30 @@ return [
'price' => 'Preço',
'weight' => 'Peso',
'status' => 'Status',
'enabled' => 'Ativado',
'disabled' => 'Desativado',
'add-variant-title' => 'Add Variação',
'variant-already-exist-message' => 'Variante com as mesmas opções de atributo já existe.',
'add-image-btn-title' => 'Add Imagem',
'mass-delete-success' => 'Todos os índices de produtos selecionados foram excluídos com sucesso',
'mass-update-success' => 'Todo o índice selecionado de produtos foi atualizado com sucesso',
'downloadable' => 'Downloadable Information',
'links' => 'Links',
'add-link-btn-title' => 'Add Link',
'samples' => 'Samples',
'add-sample-btn-title' => 'Add Sample',
'downloads' => 'Download Allowed',
'file' => 'File',
'sample' => 'Sample',
'upload-file' => 'Upload File',
'url' => 'Url',
'sort-order' => 'Sort Order',
'browse-file' => 'Browse File',
'configurable-error' => 'Por favor, selecione pelo menos um atributo configurável.',
'configurable-error' => 'Selecione pelo menos um atributo configurável.',
'categories' => 'Categorias',
'images' => 'Imagens',
'inventories' => 'Os inventários',
'variations' => 'Variações',
'downloadable' => 'Informações para Download',
'links' => 'Ligações',
'add-link-btn-title' => 'Adicionar Link',
'samples' => 'Amostras',
'add-sample-btn-title' => 'Adicionar amostra',
'downloads' => 'Download permitido',
'file' => 'Arquivo',
'sample' => 'Amostra',
'upload-file' => 'Subir arquivo',
'url' => 'Url',
'sort-order' => 'Ordem de classificação',
'browse-file' => 'Procurar arquivo',
'product-link' => 'Produtos Vinculados',
'cross-selling' => 'Venda cruzada',
'up-selling' => 'Acima de vender',
@ -439,12 +510,13 @@ return [
'product-search-hint' => 'Comece a digitar o nome do produto',
'no-result-found' => 'Produtos não encontrados com o mesmo nome.',
'searching' => 'Procurando ...',
'grouped-products' => 'Grouped Products',
'search-products' => 'Search Products',
'no-result-found' => 'Products not found with same name.',
'bundle-items' => 'Bundle Items',
'add-option-btn-title' => 'Add Option',
'option-title' => 'Option Title',
'grouped-products' => 'Produtos Agrupados',
'search-products' => 'procurar produtos',
'no-result-found' => 'Produtos não encontrados com o mesmo nome.',
'channel' => 'Canais',
'bundle-items' => 'Itens do pacote',
'add-option-btn-title' => 'Adicionar opção',
'option-title' => 'Título da opção',
'input-type' => 'Input Type',
'is-required' => 'Is Required',
'select' => 'Select',
@ -454,6 +526,7 @@ return [
'new-option' => 'New Option',
'is-default' => 'Is Default'
],
'attributes' => [
'title' => 'Atributos',
'add-title' => 'Add Atributo',
@ -489,6 +562,7 @@ return [
'no' => 'Não',
'value_per_locale' => 'Valor Por Idioma',
'value_per_channel' => 'Valor Por Canal (Loja)',
'value_per_channel' => 'Valor Por Canal (Loja)',
'is_filterable' => 'Usar na navegação em camadas',
'is_configurable' => 'Usar para Criar Produtos Configuráveis',
'admin_name' => 'Admin Nome',
@ -500,7 +574,11 @@ return [
'text-swatch' => 'Amostra de texto',
'swatch' => 'Swatch',
'image' => 'Imagem',
'file' => 'Arquivo'
'file' => 'Arquivo',
'checkbox' => 'Checkbox',
'use_in_flat' => "Criar na tabela plana do produto",
'is_comparable' => "O atributo é comparável",
'default_null_option' => 'Criar opção vazia padrão',
],
'families' => [
'title' => 'Famílias',
@ -531,10 +609,10 @@ return [
'yes' => 'Sim',
'no' => 'Não',
'position' => 'Posição',
'display-mode' => 'Display Mode',
'products-and-description' => 'Products and Description',
'products-only' => 'Products Only',
'description-only' => 'Description Only',
'display-mode' => 'Modo de exibição',
'products-and-description' => 'Produtos e Descrição',
'products-only' => 'Apenas produtos',
'description-only' => 'Apenas descrição',
'description-and-images' => 'Descrição e Imagens',
'description' => 'Descrição',
'parent-category' => 'Categoria Pai',
@ -544,8 +622,11 @@ return [
'meta_description' => 'Meta Descrição',
'meta_keywords' => 'Meta Keywords',
'image' => 'Imagem',
'filterable-attributes' => 'Atributos filtráveis',
'attributes' => 'Atributos',
]
],
'configuration' => [
'title' => 'Configuração',
'save-btn-title' => 'Salvar',
@ -553,6 +634,7 @@ return [
'yes' => 'Sim',
'no' => 'Não',
'delete' => 'Deletar',
'tax-categories' => [
'title' => 'Categorias de Imposto',
'add-title' => 'Add Categorias de Imposto',
@ -569,6 +651,7 @@ return [
'edit-button-title' => 'Editar Categorias de Imposto'
]
],
'tax-rates' => [
'title' => 'Taxas de Impostos',
'add-title' => 'Add Taxas de Imposto',
@ -590,6 +673,7 @@ return [
'zip_code' => 'CEP',
'is_zip' => 'Ativar intervalo de CEP'
],
'sales' => [
'shipping-method' => [
'title' => 'Método de Entregas',
@ -600,15 +684,18 @@ return [
]
]
],
'settings' => [
'locales' => [
'title' => 'Idiomas',
'add-title' => 'Add Idioma',
'edit-title' => 'Editar Idioma',
'add-title' => 'Add Idioma',
'save-btn-title' => 'Salvar Idioma',
'general' => 'Geral',
'code' => 'Código',
'name' => 'Nome',
'direction' => 'Direção',
'create-success' => 'Local criado com sucesso.',
'update-success' => 'Localidade atualizada com sucesso.',
'delete-success' => 'Locale excluído com sucesso.',
@ -645,6 +732,9 @@ return [
'source_currency' => 'Moeda de Origem',
'target_currency' => 'Moeda Alvo',
'rate' => 'Taxa',
'exchange-class-not-found' => ':service de taxa de câmbio de serviço não encontrada',
'update-rates' => 'Atualizar Tarifas',
'rate' => 'Taxa',
'create-success' => 'Taxa de Câmbio criada com sucesso.',
'update-success' => 'Taxa de Câmbio atualizada com sucesso.',
'delete-success' => 'Taxa de Câmbio excluída com sucesso.',
@ -706,8 +796,14 @@ return [
'create-success' => 'Canal criado com sucesso.',
'update-success' => 'Canal atualizado com sucesso.',
'delete-success' => 'Canal excluído com sucesso.',
'last-delete-error' => 'Pelo menos um canal é necessário.'
'last-delete-error' => 'Pelo menos um canal é necessário.',
'seo' => 'Página inicial SEO',
'seo-title' => 'Meta título',
'seo-description' => 'Meta Descrição',
'seo-keywords' => 'Meta palavras-chave',
],
'sliders' => [
'title' => 'Sliders',
'name' => 'Name',
@ -725,6 +821,7 @@ return [
'delete-success' => 'Não foi possível excluir o slider',
'delete-fail' => 'Slider excluído com sucesso'
],
'tax-categories' => [
'title' => 'Categorias de Imposto',
'add-title' => 'Criar Categoria de Imposto',
@ -747,6 +844,7 @@ return [
'atleast-one' => 'Não é possível excluir a última Categoria de Imposto',
'delete' => 'Categoria de Imposto excluída com sucesso'
],
'tax-rates' => [
'title' => 'Taxas de Impostos',
'add-title' => 'Criar Taxas de Impostos',
@ -778,6 +876,7 @@ return [
'title' => 'Desenvolvimento',
]
],
'customers' => [
'groups' =>[
'add-title' => 'Add Grupo',
@ -790,12 +889,44 @@ return [
'is_user_defined' => 'Usuário Definido',
'yes' => 'Sim'
],
'note' => [
'title' => 'Add Note',
'save-note' => 'Save Note',
'enter-note' => 'Enter Note',
'help-title' => 'Add Note On This Customer'
'addresses' => [
'title' => 'Lista de Endereços de :customer_name',
'vat_id' => 'Vat id',
'create-title' => 'Criar endereço do cliente',
'edit-title' => 'Atualizar endereço do cliente',
'title-orders' => 'Lista de pedidos :customer_name ',
'address-list' => 'Lista de Endereços',
'order-list' => 'Lista de pedidos',
'address-id' => 'Endereço ID',
'address-1' => 'Endereço 1',
'city' => 'Cidade',
'state-name' => 'Estado',
'country-name' => 'País',
'postcode' => 'Código postal',
'default-address' => 'Endereço padrão',
'yes' => 'sim',
'not-approved' => 'Não aprovado',
'no' => 'Não',
'dash' => '-',
'delete' => 'Excluir',
'create-btn-title' => 'Adicionar endereço',
'save-btn-title' => 'Salvar endereço',
'general' => 'Geral',
'success-create' => 'Success: Endereço do cliente criado com sucesso.',
'success-update' => 'Success: Endereço do cliente atualizado com sucesso.',
'success-delete' => 'Success: Endereço do cliente excluído com sucesso.',
'success-mass-delete' => 'Success: endereços selecionados excluídos com sucesso.',
'error-create' => 'Error: Endereço do cliente não criado.',
],
'note' => [
'title' => 'Adicionar nota',
'save-note' => 'Salvar nota',
'enter-note' => 'Inserir nota',
'help-title' => 'Adicionar nota sobre este cliente'
],
'customers' => [
'add-title' => 'Add Cliente',
'edit-title' => 'Editar Cliente',
@ -826,6 +957,7 @@ return [
'active' => 'Ativo (a)',
'inactive' => 'Inativo (a)'
],
'reviews' => [
'title' => 'Avaliações',
'edit-title' => 'Editar Avaliação',
@ -836,6 +968,7 @@ return [
'approved' => 'Aprovado',
'disapproved' => 'Desaprovar'
],
'subscribers' => [
'title' => 'Assinantes de Newletter',
'title-edit' => 'Editar Assinante',
@ -848,93 +981,147 @@ return [
'delete-failed' => 'Erro! Você não pode excluir a inscrição desse usuário',
]
],
'promotion' => [
'catalog-rule' => 'Regras de Catálogo',
'cart-rule' => 'Regras do Carrinho',
'add-catalog-rule' => 'Adicionar regra de catálogo',
'add-cart-rule' => 'Adicionar Regra do Carrinho',
'edit-cart-rule' => 'Editar regra do carrinho',
'edit-catalog-rule' => 'Editar regra do catálogo',
'create-catalog-rule' => 'Criar regra de catálogo',
'create-cart-rule' => 'Criar regra de carrinho',
'save-btn-title' => 'Criar',
'edit-btn-title' => 'Editar',
'save' => 'Salve',
'select-attr' => 'Selecione o atributo',
'select-attr-fam' => 'Selecione a Família de Atributos',
'select-cart-attr' => 'Selecione o atributo Carrinho',
'general-info' => [
'name' => 'Nome da regra',
'description' => 'Descrição',
'starts-from' => 'Começar',
'ends-till' => 'Fim',
'channels' => 'Canais',
'channels-req' => 'Canais',
'cust-groups' => 'Grupos de clientes',
'priority' => 'Prioridade',
'add-condition' => 'Adicionar condições',
'disc_amt' => 'Valor de desconto',
'disc_percent' => 'Porcentagem de desconto',
'is-coupon' => 'Use cupom',
'is-coupon-yes' => 'Sim',
'is-coupon-no' => 'Não',
'uses-per-cust' => 'Usos por cliente',
'all' => 'Todos (a)',
'any' => 'Qualquer',
'end-other-rules' => 'Acabar com outras regras',
'status' => 'Está ativo',
'all-conditions-true' => 'Assumindo que todas as condições sejam verdadeiras',
'assuming' => 'Assumindo',
'any' => 'Qualquer',
'all' => 'Todos (a)',
'conditions' => 'Condições',
'apply' => 'Aplique',
'are' => 'está',
'true' => 'verdade',
'false' => 'falso (a)',
'limit' => 'Limite de uso',
'specific-coupon' => 'Cupom Específico (Cheque) / Gerado Automaticamente (Desmarque)',
'free-shipping' => 'Frete grátis',
'is-guest' => 'Para os hóspedes',
'disc_qty' => 'Max. Quantidade permitida para ser descontado',
'test-mode' => 'Escolha como testar as condições',
'labels' => 'Rótulos'
],
'status' => [
'success' => 'Sucesso! regra criada',
'success-coupon' => 'Sucesso! regra criada junto com o cupom',
'failed' => 'Erro! não conseguiu criar regra',
'update-success' => 'Sucesso! regra atualizada',
'update-coupon-success' => 'Sucesso! regra atualizada junto com cupom',
'update-failed' => 'Erro! não pode atualizar',
'delete-success' => 'Sucesso! regra excluída',
'delete-failed' => 'Erro! não pode apagar',
'coupon-applied' => 'Cupom Usado',
'coupon-failed' => 'O cupom não foi aplicado',
'no-coupon' => '* Cupom não aplicável',
'coupon-removed' => 'Cupom removido com sucesso',
'coupon-remove-failed' => 'Remoção de cupons falhou',
'duplicate-coupon' => 'O cupom já existe, por favor tente novamente com um cupom diferente'
],
'catalog' => [
'cart-rules' => [
'title' => 'Regras do carrinho',
'add-title' => 'Adicionar regra de carrinho',
'edit-title' => 'Editar regra do carrinho',
'save-btn-title' => 'Regra Salvar carrinho',
'rule-information' => 'Informações sobre regras',
'name' => 'Nome',
'description' => 'Descrição',
'apply-percent' => 'Aplique como porcentagem',
'apply-fixed' => 'Aplicar como quantia fixa',
'adjust-to-percent' => 'Ajuste para porcentagem',
'adjust-to-value' => 'Ajustar ao valor de desconto',
'condition-missing' => 'Por favor, verifique condições, alguns valores podem estar faltando'
'status' => 'Status',
'is-active' => 'A regra do carrinho está ativa',
'channels' => 'Canais',
'customer-groups' => 'Grupos de Clientes',
'coupon-type' => 'Tipo de cupom',
'no-coupon' => 'Sem Cupom',
'specific-coupon' => 'Cupom específico',
'auto-generate-coupon' => 'Gerar cupom automaticamente',
'no' => 'Não',
'yes' => 'sim',
'coupon-code' => 'Código do cupom',
'uses-per-coupon' => 'Usos por cupom',
'uses-per-customer' => 'Usos por cliente',
'uses-per-customer-control-info' => 'Será usado apenas para clientes logados.',
'from' => 'A partir de',
'to' => 'Para',
'priority' => 'Prioridade',
'conditions' => 'Condições',
'condition-type' => 'Tipo de condição',
'all-conditions-true' => 'Todas as condições são verdadeiras',
'any-condition-true' => 'Qualquer condição é verdadeira',
'add-condition' => 'Adicionar Condição',
'choose-condition-to-add' => 'Escolha uma condição para adicionar',
'cart-attribute' => 'Atributo do carrinho',
'subtotal' => 'Subtotal',
'total-items-qty' => 'Quantidade total de itens',
'total-weight' => 'Peso total',
'payment-method' => 'Forma de pagamento',
'shipping-method' => 'método de envio',
'shipping-postcode' => 'CEP / código postal',
'shipping-state' => 'Estado de envio',
'shipping-country' => 'País de envio',
'cart-item-attribute' => 'Atributo do item do carrinho',
'price-in-cart' => 'Preço no carrinho',
'qty-in-cart' => 'Quantidade no carrinho',
'product-attribute' => 'Atributo do produto',
'attribute-name-children-only' => ':attribute_name (somente filhos)',
'attribute-name-parent-only' => ':attribute_name (somente pai)',
'is-equal-to' => 'É igual a',
'is-not-equal-to' => 'Não é igual a',
'equals-or-greater-than' => 'Igual ou superior a',
'equals-or-less-than' => 'Igual ou menor que',
'greater-than' => 'Maior que',
'less-than' => 'Menor que',
'contain' => 'Conter',
'contains' => 'Contém',
'does-not-contain' => 'Não contém',
'actions' => 'Ações',
'action-type' => 'Tipo de acão',
'percentage-product-price' => 'Porcentagem do preço do produto',
'fixed-amount' => 'Quantia fixa',
'fixed-amount-whole-cart' => 'Montante fixo ao carrinho inteiro',
'buy-x-get-y-free' => 'Compre o X Get Y grátis',
'discount-amount' => 'Valor do desconto',
'discount-quantity' => 'Quantidade máxima permitida para desconto',
'discount-step' => 'Comprar X Quantidade',
'free-shipping' => 'Envio Grátis',
'apply-to-shipping' => 'Aplicar ao envio',
'coupon-codes' => 'Códigos de cupom',
'coupon-qty' => 'Quantidade do Cupom',
'code-length' => 'Comprimento do código',
'code-format' => 'Formato do código',
'alphanumeric' => 'Alfanumérica',
'alphabetical' => 'Alfabética',
'numeric' => 'Numérico',
'code-prefix' => 'Prefixo do código',
'code-suffix' => 'Sufixo de código',
'generate' => 'Gerar',
'cart-rule-not-defind-error' => 'A regra do carrinho não está definida',
'mass-delete-success' => 'Todos os cupons selecionados foram excluídos com sucesso.',
'end-other-rules' => 'Terminar outras regras',
'children-categories' => 'Categorias (Somente Crianças)',
'parent-categories' => 'Categorias (somente pai)',
'categories' => 'Categorias',
'attribute_family' => 'Família de Atributos'
],
'cart' => [
'buy-atleast' => 'Compre Atleast',
'apply-to-shipping' => 'Aplicar ao envio'
'catalog-rules' => [
'title' => 'Regras do Catálogo',
'add-title' => 'Adicionar regra de catálogo',
'edit-title' => 'Editar regra do catálogo',
'save-btn-title' => 'Salvar regra de catálogo',
'rule-information' => 'Informações sobre regras',
'name' => 'Nome',
'description' => 'Descrição',
'status' => 'Status',
'is-active' => 'A regra do catálogo está ativa',
'channels' => 'Canais',
'customer-groups' => 'Grupos de Clientes',
'no' => 'Não',
'yes' => 'sim',
'from' => 'A partir de',
'to' => 'Para',
'priority' => 'Prioridade',
'conditions' => 'Condições',
'condition-type' => 'Tipo de condição',
'all-conditions-true' => 'Todas as condições são verdadeiras',
'any-condition-true' => 'Qualquer condição é verdadeira',
'add-condition' => 'Adicionar Condição',
'choose-condition-to-add' => 'Escolha uma condição para adicionar',
'product-attribute' => 'Atributo do produto',
'attribute-name-children-only' => ':attribute_name (somente filhos)',
'attribute-name-parent-only' => ': attribute_name (somente pai)',
'is-equal-to' => 'É igual a',
'is-not-equal-to' => 'Não é igual a',
'equals-or-greater-than' => 'Igual ou superior a',
'equals-or-less-than' => 'Igual ou menor que',
'greater-than' => 'Maior que',
'less-than' => 'Menor que',
'contain' => 'Conter',
'contains' => 'Contém',
'does-not-contain' => 'Não contém',
'actions' => 'Ações',
'action-type' => 'Tipo de acão',
'percentage-product-price' => 'Porcentagem do preço do produto',
'fixed-amount' => 'Quantia fixa',
'fixed-amount-whole-cart' => 'Montante fixo ao catálogo inteiro',
'buy-x-get-y-free' => 'Compre o X Get Y grátis',
'discount-amount' => 'Valor do desconto',
'mass-delete-success' => 'Todo o índice selecionado de cupons foi excluído com sucesso.',
'end-other-rules' => 'Terminar outras regras',
'categories' => 'Categorias',
'attribute_family' => 'Família de Atributos'
]
],
'error' => [
'go-to-home' => 'IR PARA PÁGINA INICIAL',
'in-maitainace' => 'In Maintenance',
'right-back' => 'Be Right Back',
'in-maitainace' => 'Em manutenção',
'right-back' => 'Volto logo',
'404' => [
'page-title' => '404 Página não Encontrada',
'name' => '404',
@ -978,12 +1165,48 @@ return [
'no-records' => 'Nada para exportar',
'illegal-format' => 'Erro! Este tipo de formato não é suportado ou seu formato ilegal'
],
'cms' => [
'pages' => [
'general' => 'Geral',
'seo' => 'SEO',
'pages' => 'Páginas',
'title' => 'Páginas',
'add-title' => 'Adicionar Página',
'content' => 'Conteúdo',
'url-key' => 'Chave de URL',
'channel' => 'Canais',
'locale' => 'Localidades',
'create-btn-title' => 'Salvar pagina',
'edit-title' => 'Editar Página',
'edit-btn-title' => 'Salvar pagina',
'create-success' => 'Página criada com sucesso',
'create-partial' => 'Algumas das páginas solicitadas já existem',
'create-failure' => 'Todas as páginas solicitadas já existem',
'update-success' => 'Página atualizada com sucesso',
'update-failure' => 'A página não pode ser atualizada',
'page-title' => 'Título da página',
'layout' => 'Layout',
'meta_keywords' => 'Meta Palavras-chave',
'meta_description' => 'Meta Descrição',
'meta_title' => 'Meta Título',
'delete-success' => 'Página CMS excluída com sucesso',
'delete-failure' => 'A página do CMS não pode ser excluída',
'preview' => 'Pré-visualização',
'one-col' => '<div class="mt-10">Use class: <b>"static-container one-column"</b> para um layout de coluna.</div>',
'two-col' => '<div class="mt-10">Use class: <b>"static-container two-column"</b> para layout de duas colunas.</div>',
'three-col' => '<div class="mt-10">Use class: <b>"static-container three-column"</b> para layout de três colunas.</div>',
'helper-classes' => 'Helper Classes'
]
],
'response' => [
'being-used' => 'Este recurso :name está sendo usado em :source',
'cannot-delete-default' => 'Não é possível excluir o canal padrão',
'create-success' => ':name criado com sucesso.',
'update-success' => ':name atualizaco com sucesso.',
'delete-success' => ':name excluído com sucesso.',
'delete-failed' => 'Erro encontrado ao excluir :name.',
'last-delete-error' => 'Ao menos um :name é obrigatório.',
'user-define-error' => 'Não pode excluir o sistema :name',
'attribute-error' => ':name é usado em produtos configuráveis.',
@ -995,7 +1218,8 @@ return [
'create-root-failure' => 'A categoria com nome root já existe',
'cancel-success' => ':name cancelado com sucesso.',
'cancel-error' => ':name não pode ser cancelado.',
'already-taken' => 'O :name já foi tomada.'
'already-taken' => 'O :name já foi tomada.',
'order-pending' => 'Não é possível excluir a conta porque alguns pedidos estão em estado pendente ou em processamento.'
],
'footer' => [
@ -1003,14 +1227,34 @@ return [
],
'admin' => [
'emails' => [
'email' => 'O email',
'notification_label' => 'Notificações',
'notifications' => [
'verification' => 'Enviar email de verificação',
'registration' => 'Enviar registro E-mail',
'customer' => 'Enviar e-mail do cliente',
'new-order' => 'Enviar E-mail de Confirmação de Pedido',
'new-admin' => 'Enviar email de convite de administrador',
'new-invoice' => 'Enviar e-mail de confirmação da fatura',
'new-refund' => 'Enviar email de notificação de reembolso',
'new-shipment' => 'Enviar email de notificação de remessa',
'new-inventory-source' => 'Enviar email de notificação de origem de inventário',
'cancel-order' => 'Enviar cancelar E-mail de notificação de pedido',
],
],
'system' => [
'catalog' => 'Catálogo',
'products' => 'Produtos',
'review' => 'Reveja',
'allow-guest-review' => 'Permitir comentário de convidado',
'guest-checkout' => 'Compras sem cadastro?',
'allow-guest-checkout' => 'Permitir compra para clientes sem cadastros?',
'allow-guest-checkout-hint' => 'Dica: se ativada, esta opção pode ser configurada para cada produto especificamente.',
'review' => 'Avaliações',
'allow-guest-review' => 'Permitir comentários sem cadastro?',
'inventory' => 'Inventário',
'stock-options' => 'Opções de ações',
'allow-backorders' => 'Permitir atrasos',
'allow-backorders' => 'Permitir Pedidos pelo Admin',
'customer' => 'Cliente',
'settings' => 'Definições',
'address' => 'Endereço',
@ -1045,22 +1289,36 @@ return [
'footer' => 'Rodapé',
'content' => 'Conteúdo',
'footer-content' => 'Texto de rodapé',
'footer-toggle' => 'Alternar rodapé',
'locale-options' => 'Opções de unidade',
'weight-unit' => 'Unidade de peso',
'admin-page-limit' => 'Itens padrão por página (administrador)',
'design' => 'Design',
'email-settings' => 'Configurações de Email',
'email-sender-name' => 'Nome do Email da Loja',
'shop-email-from' => 'Endereço de Email da Loja [Para enviar emails]',
'admin-name' => 'Admin Nome',
'admin-email' => 'Admin Email',
'admin-page-limit' => 'Quantidade Padrão de Itens por Página (Admin)',
'design' => 'Design',
'admin-logo' => 'Admin Logo',
'logo-image' => 'Logo Imagem',
'credit-max' => 'Máximo de crédito do cliente',
'credit-max-value' => 'Valor Máximo de Crédito',
'use-credit-max' => 'Use o máximo de crédito',
'order-settings' => 'Order Settings',
'orderNumber' => 'Order Number Settings',
'order-number-prefix' => 'Order Number Prefix',
'order-number-length' => 'Order Number Length',
'order-number-suffix' => 'Order Number Suffix',
'order-settings' => 'Configurações do Pedido',
'orderNumber' => 'Configuração do Número do Pedido',
'order-number-prefix' => 'Prefixo do Número do Pedido',
'order-number-length' => 'Tamanho do Número do Pedido',
'order-number-suffix' => 'Sufixo do Número de Pedido',
'default' => 'Padrão',
'sandbox' => 'Sandbox',
'invoice-slip-design' => 'Invoice Slip Design',
'logo' => 'logo'
'all-channels' => 'Todos',
'all-locales' => 'Todos',
'sandbox' => 'Sandbox',
'invoice-slip-design' => 'Design da Nota do Pedido',
'logo' => 'logo',
'favicon' => 'Favicon'
]
]
];
];

View File

@ -13,7 +13,7 @@
<div class="page-action">
<a href="{{ route('admin.catalog.attributes.create') }}" class="btn btn-lg btn-primary">
{{ __('Add Attribute') }}
{{ __('admin::app.catalog.attributes.add-title') }}
</a>
</div>
</div>
@ -28,4 +28,4 @@
{!! view_render_event('bagisto.admin.catalog.attributes.list.after') !!}
</div>
@stop
@stop

View File

@ -20,7 +20,7 @@
<div class="page-action">
<button type="submit" class="btn btn-lg btn-primary">
{{ __('admin::app.save') }} {{ __('admin::app.category') }}
{{ __('admin::app.catalog.categories.save-btn-title') }}
</button>
</div>
</div>

View File

@ -52,7 +52,7 @@
<div class="control-group" :class="[errors.has('{{$locale}}[name]') ? 'has-error' : '']">
<label for="name" class="required">{{ __('admin::app.catalog.categories.name') }}</label>
<input type="text" v-validate="'required'" class="control" id="name" name="{{$locale}}[name]" value="{{ old($locale)['name'] ?? $category->translate($locale)['name'] }}" data-vv-as="&quot;{{ __('admin::app.catalog.categories.name') }}&quot;" v-slugify-target="'slug'"/>
<input type="text" v-validate="'required'" class="control" id="name" name="{{$locale}}[name]" value="{{ old($locale)['name'] ?? ($category->translate($locale)['name'] ?? '') }}" data-vv-as="&quot;{{ __('admin::app.catalog.categories.name') }}&quot;" v-slugify-target="'slug'"/>
<span class="control-error" v-if="errors.has('{{$locale}}[name]')">@{{ errors.first('{!!$locale!!}[name]') }}</span>
</div>
@ -180,23 +180,23 @@
<div class="control-group">
<label for="meta_title">{{ __('admin::app.catalog.categories.meta_title') }}</label>
<input type="text" class="control" id="meta_title" name="{{$locale}}[meta_title]" value="{{ old($locale)['meta_title'] ?? $category->translate($locale)['meta_title'] }}"/>
<input type="text" class="control" id="meta_title" name="{{$locale}}[meta_title]" value="{{ old($locale)['meta_title'] ?? ($category->translate($locale)['meta_title'] ?? '') }}"/>
</div>
<div class="control-group" :class="[errors.has('{{$locale}}[slug]') ? 'has-error' : '']">
<label for="slug" class="required">{{ __('admin::app.catalog.categories.slug') }}</label>
<input type="text" v-validate="'required'" class="control" id="slug" name="{{$locale}}[slug]" value="{{ old($locale)['slug'] ?? $category->translate($locale)['slug'] }}" data-vv-as="&quot;{{ __('admin::app.catalog.categories.slug') }}&quot;" v-slugify/>
<input type="text" v-validate="'required'" class="control" id="slug" name="{{$locale}}[slug]" value="{{ old($locale)['slug'] ?? ($category->translate($locale)['slug'] ?? '') }}" data-vv-as="&quot;{{ __('admin::app.catalog.categories.slug') }}&quot;" v-slugify/>
<span class="control-error" v-if="errors.has('{{$locale}}[slug]')">@{{ errors.first('{!!$locale!!}[slug]') }}</span>
</div>
<div class="control-group">
<label for="meta_description">{{ __('admin::app.catalog.categories.meta_description') }}</label>
<textarea class="control" id="meta_description" name="{{$locale}}[meta_description]">{{ old($locale)['meta_description'] ?? $category->translate($locale)['meta_description'] }}</textarea>
<textarea class="control" id="meta_description" name="{{$locale}}[meta_description]">{{ old($locale)['meta_description'] ?? ($category->translate($locale)['meta_description'] ?? '') }}</textarea>
</div>
<div class="control-group">
<label for="meta_keywords">{{ __('admin::app.catalog.categories.meta_keywords') }}</label>
<textarea class="control" id="meta_keywords" name="{{$locale}}[meta_keywords]">{{ old($locale)['meta_keywords'] ?? $category->translate($locale)['meta_keywords'] }}</textarea>
<textarea class="control" id="meta_keywords" name="{{$locale}}[meta_keywords]">{{ old($locale)['meta_keywords'] ?? ($category->translate($locale)['meta_keywords'] ?? '') }}</textarea>
</div>
{!! view_render_event('bagisto.admin.catalog.category.edit_form_accordian.seo.controls.after', ['category' => $category]) !!}
@ -220,7 +220,7 @@
<div class="control-group" :class="[errors.has('{{$locale}}[description]') ? 'has-error' : '']">
<label for="description" :class="isRequired ? 'required' : ''">{{ __('admin::app.catalog.categories.description') }}</label>
<textarea v-validate="isRequired ? 'required' : ''" class="control" id="description" name="{{$locale}}[description]" data-vv-as="&quot;{{ __('admin::app.catalog.categories.description') }}&quot;">{{ old($locale)['description'] ?? $category->translate($locale)['description'] }}</textarea>
<textarea v-validate="isRequired ? 'required' : ''" class="control" id="description" name="{{$locale}}[description]" data-vv-as="&quot;{{ __('admin::app.catalog.categories.description') }}&quot;">{{ old($locale)['description'] ?? ($category->translate($locale)['description'] ?? '') }}</textarea>
<span class="control-error" v-if="errors.has('{{$locale}}[description]')">@{{ errors.first('{!!$locale!!}[description]') }}</span>
</div>

View File

@ -8,7 +8,7 @@
<div class="control-group {!! $errors->has('images.*') ? 'has-error' : '' !!}">
<label>{{ __('admin::app.catalog.categories.image') }}</label>
<image-wrapper :button-label="'{{ __('admin::app.catalog.products.add-image-btn-title') }}'" input-name="images" :images='@json($product->images)'></image-wrapper>
<product-image></product-image>
<span class="control-error" v-if="{!! $errors->has('images.*') !!}">
@php $count=1 @endphp
@ -23,4 +23,171 @@
</div>
</accordian>
{!! view_render_event('bagisto.admin.catalog.product.edit_form_accordian.images.after', ['product' => $product]) !!}
{!! view_render_event('bagisto.admin.catalog.product.edit_form_accordian.images.after', ['product' => $product]) !!}
@push('scripts')
@parent
<script type="text/x-template" id="product-image-template">
<div>
<div class="image-wrapper">
<product-image-item
v-for='(image, index) in items'
:key='image.id'
:image="image"
@onRemoveImage="removeImage($event)"
@onImageSelected="imageSelected($event)"
></product-image-item>
</div>
<label class="btn btn-lg btn-primary" style="display: inline-block; width: auto" @click="createFileType">
{{ __('admin::app.catalog.products.add-image-btn-title') }}
</label>
</div>
</script>
<script type="text/x-template" id="product-image-item-template">
<label class="image-item" v-bind:class="{ 'has-image': imageData.length > 0 }">
<input type="hidden" :name="'images[' + image.id + ']'" v-if="! new_image"/>
<input type="file" v-validate="'mimes:image/*'" accept="image/*" :name="'images[]'" ref="imageInput" :id="_uid" @change="addImageView($event)" multiple="multiple"/>
<img class="preview" :src="imageData" v-if="imageData.length > 0">
<label class="remove-image" @click="removeImage()">Remove Image</label>
</label>
</script>
<script>
Vue.component('product-image', {
template: '#product-image-template',
data: function() {
return {
images: @json($product->images),
imageCount: 0,
items: []
}
},
computed: {
finalInputName: function() {
return 'images[' + this.image.id + ']';
}
},
created: function() {
var this_this = this;
this.images.forEach(function(image) {
this_this.items.push(image)
this_this.imageCount++;
});
},
methods: {
createFileType: function() {
var this_this = this;
this.imageCount++;
this.items.push({'id': 'image_' + this.imageCount});
},
removeImage (image) {
let index = this.items.indexOf(image)
Vue.delete(this.items, index);
},
imageSelected: function(event) {
var this_this = this;
Array.from(event.files).forEach(function(image, index) {
if (index) {
this_this.imageCount++;
this_this.items.push({'id': 'image_' + this_this.imageCount, file: image});
}
});
}
}
});
Vue.component('product-image-item', {
template: '#product-image-item-template',
props: {
image: {
type: Object,
required: false,
default: null
},
},
data: function() {
return {
imageData: '',
new_image: 0
}
},
mounted () {
if (this.image.id && this.image.url) {
this.imageData = this.image.url;
} else if (this.image.id && this.image.file) {
this.readFile(this.image.file);
}
},
computed: {
finalInputName: function() {
return this.inputName + '[' + this.image.id + ']';
}
},
methods: {
addImageView: function() {
var imageInput = this.$refs.imageInput;
if (imageInput.files && imageInput.files[0]) {
if (imageInput.files[0].type.includes('image/')) {
this.readFile(imageInput.files[0])
if (imageInput.files.length > 1) {
this.$emit('onImageSelected', imageInput)
}
} else {
imageInput.value = "";
alert('Only images (.jpeg, .jpg, .png, ..) are allowed.');
}
}
},
readFile: function(image) {
var reader = new FileReader();
reader.onload = (e) => {
this.imageData = e.target.result;
}
reader.readAsDataURL(image);
this.new_image = 1;
},
removeImage: function() {
this.$emit('onRemoveImage', this.image)
}
}
});
</script>
@endpush

View File

@ -148,14 +148,14 @@
<td>
<div class="control-group" :class="[errors.has(variantInputName + '[price]') ? 'has-error' : '']">
<input type="number" v-validate="'required|min_value:0.0001'" v-model="variant.price" :name="[variantInputName + '[price]']" class="control" data-vv-as="&quot;{{ __('admin::app.catalog.products.price') }}&quot;" step="any"/>
<input type="number" v-validate="'required'" v-model="variant.price" :name="[variantInputName + '[price]']" class="control" data-vv-as="&quot;{{ __('admin::app.catalog.products.price') }}&quot;" step="any"/>
<span class="control-error" v-if="errors.has(variantInputName + '[price]')">@{{ errors.first(variantInputName + '[price]') }}</span>
</div>
</td>
<td>
<div class="control-group" :class="[errors.has(variantInputName + '[weight]') ? 'has-error' : '']">
<input type="number" v-validate="'required|min_value:0.0001'" v-model="variant.weight" :name="[variantInputName + '[weight]']" class="control" data-vv-as="&quot;{{ __('admin::app.catalog.products.weight') }}&quot;" step="any"/>
<input type="number" v-validate="'required'" v-model="variant.weight" :name="[variantInputName + '[weight]']" class="control" data-vv-as="&quot;{{ __('admin::app.catalog.products.weight') }}&quot;" step="any"/>
<span class="control-error" v-if="errors.has(variantInputName + '[weight]')">@{{ errors.first(variantInputName + '[weight]') }}</span>
</div>
</td>

View File

@ -19,7 +19,6 @@
</option>
@foreach (core()->getAllChannels() as $channelModel)
<option
value="{{ $channelModel->code }}" {{ (isset($channel) && ($channelModel->code) == $channel) ? 'selected' : '' }}>
{{ $channelModel->name }}
@ -90,6 +89,6 @@
window.location.href = url.href;
}
</script>
@endpush

View File

@ -1,4 +1,4 @@
@extends('address::admin.layouts.content')
@extends('admin::layouts.content')
@section('page_title')
{{ __('address::app.admin.addresses.title-orders', ['customer_name' => $customer->first_name . ' ' . $customer->last_name]) }}

View File

@ -31,24 +31,32 @@
<div class="form-container">
@csrf()
{!! view_render_event('bagisto.admin.customers.create.before') !!}
<div class="control-group" :class="[errors.has('first_name') ? 'has-error' : '']">
<label for="first_name" class="required">{{ __('admin::app.customers.customers.first_name') }}</label>
<input type="text" class="control" name="first_name" v-validate="'required'" value="{{ old('first_name') }}" data-vv-as="&quot;{{ __('shop::app.customer.signup-form.firstname') }}&quot;">
<span class="control-error" v-if="errors.has('first_name')">@{{ errors.first('first_name') }}</span>
</div>
{!! view_render_event('bagisto.admin.customers.create.first_name.after') !!}
<div class="control-group" :class="[errors.has('last_name') ? 'has-error' : '']">
<label for="last_name" class="required">{{ __('admin::app.customers.customers.last_name') }}</label>
<input type="text" class="control" name="last_name" v-validate="'required'" value="{{ old('last_name') }}" data-vv-as="&quot;{{ __('shop::app.customer.signup-form.lastname') }}&quot;">
<span class="control-error" v-if="errors.has('last_name')">@{{ errors.first('last_name') }}</span>
</div>
{!! view_render_event('bagisto.admin.customers.create.last_name.after') !!}
<div class="control-group" :class="[errors.has('email') ? 'has-error' : '']">
<label for="email" class="required">{{ __('shop::app.customer.signup-form.email') }}</label>
<input type="email" class="control" name="email" v-validate="'required|email'" value="{{ old('email') }}" data-vv-as="&quot;{{ __('shop::app.customer.signup-form.email') }}&quot;">
<span class="control-error" v-if="errors.has('email')">@{{ errors.first('email') }}</span>
</div>
{!! view_render_event('bagisto.admin.customers.create.email.after') !!}
<div class="control-group" :class="[errors.has('gender') ? 'has-error' : '']">
<label for="gender" class="required">{{ __('admin::app.customers.customers.gender') }}</label>
<select name="gender" class="control" v-validate="'required'" data-vv-as="&quot;{{ __('admin::app.customers.customers.gender') }}&quot;">
@ -60,18 +68,24 @@
<span class="control-error" v-if="errors.has('gender')">@{{ errors.first('gender') }}</span>
</div>
{!! view_render_event('bagisto.admin.customers.create.gender.after') !!}
<div class="control-group" :class="[errors.has('date_of_birth') ? 'has-error' : '']">
<label for="dob">{{ __('admin::app.customers.customers.date_of_birth') }}</label>
<input type="date" class="control" name="date_of_birth" v-validate="" value="{{ old('date_of_birth') }}" data-vv-as="&quot;{{ __('admin::app.customers.customers.date_of_birth') }}&quot;">
<span class="control-error" v-if="errors.has('date_of_birth')">@{{ errors.first('date_of_birth') }}</span>
</div>
{!! view_render_event('bagisto.admin.customers.create.date_of_birth.after') !!}
<div class="control-group" :class="[errors.has('phone') ? 'has-error' : '']">
<label for="phone">{{ __('admin::app.customers.customers.phone') }}</label>
<input type="text" class="control" name="phone" value="{{ old('phone') }}" data-vv-as="&quot;{{ __('admin::app.customers.customers.phone') }}&quot;">
<span class="control-error" v-if="errors.has('phone')">@{{ errors.first('phone') }}</span>
</div>
{!! view_render_event('bagisto.admin.customers.create.phone.after') !!}
<div class="control-group">
<label for="customerGroup" >{{ __('admin::app.customers.customers.customer_group') }}</label>
<select class="control" name="customer_group_id">
@ -80,6 +94,8 @@
@endforeach
</select>
</div>
{!! view_render_event('bagisto.admin.customers.create.after') !!}
</div>
</div>
</form>

View File

@ -36,6 +36,8 @@
<accordian :title="'{{ __('admin::app.account.general') }}'" :active="true">
<div slot="body">
{!! view_render_event('bagisto.admin.customer.edit.form.before', ['customer' => $customer]) !!}
<div class="control-group" :class="[errors.has('first_name') ? 'has-error' : '']">
<label for="first_name" class="required"> {{ __('admin::app.customers.customers.first_name') }}</label>
<input type="text" class="control" name="first_name" v-validate="'required'" value="{{old('first_name') ?:$customer->first_name}}"
@ -43,18 +45,24 @@
<span class="control-error" v-if="errors.has('first_name')">@{{ errors.first('first_name') }}</span>
</div>
{!! view_render_event('bagisto.admin.customer.edit.first_name.after', ['customer' => $customer]) !!}
<div class="control-group" :class="[errors.has('last_name') ? 'has-error' : '']">
<label for="last_name" class="required"> {{ __('admin::app.customers.customers.last_name') }}</label>
<input type="text" class="control" name="last_name" v-validate="'required'" value="{{old('last_name') ?:$customer->last_name}}" data-vv-as="&quot;{{ __('shop::app.customer.signup-form.lastname') }}&quot;">
<span class="control-error" v-if="errors.has('last_name')">@{{ errors.first('last_name') }}</span>
</div>
{!! view_render_event('bagisto.admin.customer.edit.last_name.after', ['customer' => $customer]) !!}
<div class="control-group" :class="[errors.has('email') ? 'has-error' : '']">
<label for="email" class="required"> {{ __('admin::app.customers.customers.email') }}</label>
<input type="email" class="control" name="email" v-validate="'required|email'" value="{{old('email') ?:$customer->email}}" data-vv-as="&quot;{{ __('shop::app.customer.signup-form.email') }}&quot;">
<span class="control-error" v-if="errors.has('email')">@{{ errors.first('email') }}</span>
</div>
{!! view_render_event('bagisto.admin.customer.edit.email.after', ['customer' => $customer]) !!}
<div class="control-group" :class="[errors.has('gender') ? 'has-error' : '']">
<label for="gender" class="required">{{ __('admin::app.customers.customers.gender') }}</label>
<select name="gender" class="control" value="{{ $customer->gender }}" v-validate="'required'" data-vv-as="&quot;{{ __('admin::app.customers.customers.gender') }}&quot;">
@ -66,6 +74,8 @@
<span class="control-error" v-if="errors.has('gender')">@{{ errors.first('gender') }}</span>
</div>
{!! view_render_event('bagisto.admin.customer.edit.gender.after', ['customer' => $customer]) !!}
<div class="control-group">
<label for="status" class="required">{{ __('admin::app.customers.customers.status') }}</label>
@ -77,18 +87,24 @@
<span class="control-error" v-if="errors.has('status')">@{{ errors.first('status') }}</span>
</div>
{!! view_render_event('bagisto.admin.customer.edit.status.after', ['customer' => $customer]) !!}
<div class="control-group" :class="[errors.has('date_of_birth') ? 'has-error' : '']">
<label for="dob">{{ __('admin::app.customers.customers.date_of_birth') }}</label>
<input type="date" class="control" name="date_of_birth" value="{{ old('date_of_birth') ?:$customer->date_of_birth }}" v-validate="" data-vv-as="&quot;{{ __('admin::app.customers.customers.date_of_birth') }}&quot;">
<span class="control-error" v-if="errors.has('date_of_birth')">@{{ errors.first('date_of_birth') }}</span>
</div>
{!! view_render_event('bagisto.admin.customer.edit.date_of_birth.after', ['customer' => $customer]) !!}
<div class="control-group" :class="[errors.has('phone') ? 'has-error' : '']">
<label for="phone">{{ __('admin::app.customers.customers.phone') }}</label>
<input type="text" class="control" name="phone" value="{{ $customer->phone }}" data-vv-as="&quot;{{ __('admin::app.customers.customers.phone') }}&quot;">
<span class="control-error" v-if="errors.has('phone')">@{{ errors.first('phone') }}</span>
</div>
{!! view_render_event('bagisto.admin.customer.edit.phone.after', ['customer' => $customer]) !!}
<div class="control-group">
<label for="customerGroup" >{{ __('admin::app.customers.customers.customer_group') }}</label>

View File

@ -7,8 +7,12 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">
<link rel="icon" sizes="16x16" href="{{ asset('vendor/webkul/ui/assets/images/favicon.ico') }}" />
@if ($favicon = core()->getConfigData('general.design.admin_logo.favicon'))
<link rel="icon" sizes="16x16" href="{{ \Illuminate\Support\Facades\Storage::url($favicon) }}" />
@else
<link rel="icon" sizes="16x16" href="{{ asset('vendor/webkul/ui/assets/images/favicon.ico') }}" />
@endif
<link rel="stylesheet" href="{{ asset('vendor/webkul/admin/assets/css/admin.css') }}">
<link rel="stylesheet" href="{{ asset('vendor/webkul/ui/assets/css/ui.css') }}">

View File

@ -6,7 +6,12 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">
<link rel="icon" sizes="16x16" href="{{ asset('vendor/webkul/ui/assets/images/favicon.ico') }}" />
@if ($favicon = core()->getConfigData('general.design.admin_logo.favicon'))
<link rel="icon" sizes="16x16" href="{{ \Illuminate\Support\Facades\Storage::url($favicon) }}" />
@else
<link rel="icon" sizes="16x16" href="{{ asset('vendor/webkul/ui/assets/images/favicon.ico') }}" />
@endif
<link rel="stylesheet" href="{{ asset('vendor/webkul/ui/assets/css/ui.css') }}">
<link rel="stylesheet" href="{{ asset('vendor/webkul/admin/assets/css/admin.css') }}">

View File

@ -447,10 +447,10 @@
'operator': '<=',
'label': '{{ __('admin::app.promotions.cart-rules.equals-or-less-than') }}'
}, {
'operator': '<=',
'operator': '>',
'label': '{{ __('admin::app.promotions.cart-rules.greater-than') }}'
}, {
'operator': '<=',
'operator': '<',
'label': '{{ __('admin::app.promotions.cart-rules.less-than') }}'
}],
'decimal': [{

View File

@ -535,10 +535,10 @@
'operator': '<=',
'label': '{{ __('admin::app.promotions.cart-rules.equals-or-less-than') }}'
}, {
'operator': '<=',
'operator': '>',
'label': '{{ __('admin::app.promotions.cart-rules.greater-than') }}'
}, {
'operator': '<=',
'operator': '<',
'label': '{{ __('admin::app.promotions.cart-rules.less-than') }}'
}],
'decimal': [{

View File

@ -5,14 +5,47 @@
@stop
@section('content')
<div class="content">
<?php $customer_group = request()->get('customer_group') ?: null; ?>
<?php $channel = request()->get('channel') ?: null; ?>
<div class="page-header">
<div class="page-title">
<h1>{{ __('admin::app.promotions.cart-rules.title') }}</h1>
</div>
<div class="page-action">
<div class="control-group">
<select class="control" id="channel-switcher" name="channel" onchange="reloadPage('channel', this.value)" >
<option value="all" {{ ! isset($channel) ? 'selected' : '' }}>
{{ __('admin::app.admin.system.all-channels') }}
</option>
@foreach (core()->getAllChannels() as $channelModel)
<option
value="{{ $channelModel->id }}" {{ (isset($channel) && ($channelModel->id) == $channel) ? 'selected' : '' }}>
{{ $channelModel->name }}
</option>
@endforeach
</select>
</div>
<div class="control-group">
<select class="control" id="customer-group-switcher" name="customer_group" onchange="reloadPage('customer_group', this.value)" >
<option value="all" {{ ! isset($locale) ? 'selected' : '' }}>
{{ __('admin::app.admin.system.all-customer-groups') }}
</option>
@foreach (core()->getAllCustomerGroups() as $customerGroupModel)
<option
value="{{ $customerGroupModel->id }}" {{ (isset($customerGroupModel) && ($customerGroupModel->id) == $customer_group) ? 'selected' : '' }}>
{{ $customerGroupModel->name }}
</option>
@endforeach
</select>
</div>
<a href="{{ route('admin.cart-rules.create') }}" class="btn btn-lg btn-primary">
{{ __('admin::app.promotions.cart-rules.add-title') }}
</a>
@ -24,4 +57,15 @@
{!! $cartRuleGrid->render() !!}
</div>
</div>
@endsection
@endsection
@push('scripts')
<script>
function reloadPage(getVar, getVal) {
let url = new URL(window.location.href);
url.searchParams.set(getVar, getVal);
window.location.href = url.href;
}
</script>
@endpush

View File

@ -87,9 +87,11 @@
<div class="container">
<div class="header">
<div class="image">
<img class="logo" src="{{ Storage::url(core()->getConfigData('sales.orderSettings.invoice_slip_design.logo')) }}"/>
</div>
@if (core()->getConfigData('sales.orderSettings.invoice_slip_design.logo'))
<div class="image">
<img class="logo" src="{{ Storage::url(core()->getConfigData('sales.orderSettings.invoice_slip_design.logo')) }}"/>
</div>
@endif
<div class="address">
<p>
<b> {{ core()->getConfigData('sales.orderSettings.invoice_slip_design.address') }} </b>

View File

@ -12,16 +12,24 @@
<div class="page-header">
<div class="page-title">
<h1>
{!! view_render_event('sales.invoice.title.before', ['order' => $order]) !!}
<i class="icon angle-left-icon back-link" onclick="history.length > 1 ? history.go(-1) : window.location = '{{ url('/admin/dashboard') }}';"></i>
{{ __('admin::app.sales.invoices.view-title', ['invoice_id' => $invoice->id]) }}
{!! view_render_event('sales.invoice.title.after', ['order' => $order]) !!}
</h1>
</div>
<div class="page-action">
{!! view_render_event('sales.invoice.page_action.before', ['order' => $order]) !!}
<a href="{{ route('admin.sales.invoices.print', $invoice->id) }}" class="btn btn-lg btn-primary">
{{ __('admin::app.sales.invoices.print') }}
</a>
{!! view_render_event('sales.invoice.page_action.after', ['order' => $order]) !!}
</div>
</div>
@ -47,6 +55,8 @@
</span>
</div>
{!! view_render_event('sales.invoice.increment_id.after', ['order' => $order]) !!}
<div class="row">
<span class="title">
{{ __('admin::app.sales.orders.order-date') }}
@ -57,6 +67,8 @@
</span>
</div>
{!! view_render_event('sales.invoice.created_at.after', ['order' => $order]) !!}
<div class="row">
<span class="title">
{{ __('admin::app.sales.orders.order-status') }}
@ -67,6 +79,8 @@
</span>
</div>
{!! view_render_event('sales.invoice.status_label.after', ['order' => $order]) !!}
<div class="row">
<span class="title">
{{ __('admin::app.sales.orders.channel') }}
@ -76,6 +90,8 @@
{{ $order->channel_name }}
</span>
</div>
{!! view_render_event('sales.invoice.channel_name.after', ['order' => $order]) !!}
</div>
</div>
@ -95,6 +111,8 @@
</span>
</div>
{!! view_render_event('sales.invoice.customer_name.after', ['order' => $order]) !!}
<div class="row">
<span class="title">
{{ __('admin::app.sales.orders.email') }}
@ -104,6 +122,8 @@
{{ $invoice->address->email }}
</span>
</div>
{!! view_render_event('sales.invoice.customer_email.after', ['order' => $order]) !!}
</div>
</div>
@ -119,9 +139,9 @@
</div>
<div class="section-content">
@include ('admin::sales.address', ['address' => $order->billing_address])
{!! view_render_event('sales.invoice.billing_address.after', ['order' => $order]) !!}
</div>
</div>
@ -132,9 +152,9 @@
</div>
<div class="section-content">
@include ('admin::sales.address', ['address' => $order->shipping_address])
{!! view_render_event('sales.invoice.shipping_address.after', ['order' => $order]) !!}
</div>
</div>
@endif
@ -170,6 +190,8 @@
{{ $order->order_currency_code }}
</span>
</div>
{!! view_render_event('sales.invoice.payment-method.after', ['order' => $order]) !!}
</div>
</div>
@ -199,6 +221,8 @@
{{ core()->formatBasePrice($order->base_shipping_amount) }}
</span>
</div>
{!! view_render_event('sales.invoice.shipping-method.after', ['order' => $order]) !!}
</div>
</div>
@endif
@ -236,7 +260,7 @@
@if (isset($item->additional['attributes']))
<div class="item-options">
@foreach ($item->additional['attributes'] as $attribute)
<b>{{ $attribute['attribute_name'] }} : </b>{{ $attribute['option_label'] }}</br>
@endforeach

View File

@ -12,13 +12,19 @@
<div class="page-title">
<h1>
{!! view_render_event('sales.order.title.before', ['order' => $order]) !!}
<i class="icon angle-left-icon back-link" onclick="history.length > 1 ? history.go(-1) : window.location = '{{ url('/admin/dashboard') }}';"></i>
{{ __('admin::app.sales.orders.view-title', ['order_id' => $order->increment_id]) }}
{!! view_render_event('sales.order.title.after', ['order' => $order]) !!}
</h1>
</div>
<div class="page-action">
{!! view_render_event('sales.order.page_action.before', ['order' => $order]) !!}
@if ($order->canCancel())
<a href="{{ route('admin.sales.orders.cancel', $order->id) }}" class="btn btn-lg btn-primary" v-alert:message="'{{ __('admin::app.sales.orders.cancel-confirm-msg') }}'">
{{ __('admin::app.sales.orders.cancel-btn-title') }}
@ -42,6 +48,8 @@
{{ __('admin::app.sales.orders.shipment-btn-title') }}
</a>
@endif
{!! view_render_event('sales.order.page_action.after', ['order' => $order]) !!}
</div>
</div>
@ -72,6 +80,8 @@
</span>
</div>
{!! view_render_event('sales.order.created_at.after', ['order' => $order]) !!}
<div class="row">
<span class="title">
{{ __('admin::app.sales.orders.order-status') }}
@ -82,6 +92,8 @@
</span>
</div>
{!! view_render_event('sales.order.status_label.after', ['order' => $order]) !!}
<div class="row">
<span class="title">
{{ __('admin::app.sales.orders.channel') }}
@ -91,6 +103,8 @@
{{ $order->channel_name }}
</span>
</div>
{!! view_render_event('sales.order.channel_name.after', ['order' => $order]) !!}
</div>
</div>
@ -110,6 +124,8 @@
</span>
</div>
{!! view_render_event('sales.order.customer_full_name.after', ['order' => $order]) !!}
<div class="row">
<span class="title">
{{ __('admin::app.sales.orders.email') }}
@ -120,6 +136,8 @@
</span>
</div>
{!! view_render_event('sales.order.customer_email.after', ['order' => $order]) !!}
@if (! is_null($order->customer))
<div class="row">
<span class="title">
@ -131,6 +149,8 @@
</span>
</div>
@endif
{!! view_render_event('sales.order.customer_group.after', ['order' => $order]) !!}
</div>
</div>
@ -146,9 +166,9 @@
</div>
<div class="section-content">
@include ('admin::sales.address', ['address' => $order->billing_address])
{!! view_render_event('sales.order.billing_address.after', ['order' => $order]) !!}
</div>
</div>
@ -159,9 +179,9 @@
</div>
<div class="section-content">
@include ('admin::sales.address', ['address' => $order->shipping_address])
{!! view_render_event('sales.order.shipping_address.after', ['order' => $order]) !!}
</div>
</div>
@endif
@ -197,6 +217,8 @@
{{ $order->order_currency_code }}
</span>
</div>
{!! view_render_event('sales.order.payment-method.after', ['order' => $order]) !!}
</div>
</div>
@ -226,6 +248,8 @@
{{ core()->formatBasePrice($order->base_shipping_amount) }}
</span>
</div>
{!! view_render_event('sales.order.shipping-method.after', ['order' => $order]) !!}
</div>
</div>
@endif
@ -315,66 +339,107 @@
</table>
</div>
<table class="sale-summary">
<tr>
<td>{{ __('admin::app.sales.orders.subtotal') }}</td>
<td>-</td>
<td>{{ core()->formatBasePrice($order->base_sub_total) }}</td>
</tr>
<div class="summary-comment-container">
<div class="comment-container">
<form action="{{ route('admin.sales.orders.comment', $order->id) }}" method="post">
@csrf()
@if ($order->haveStockableItems())
<div class="control-group" :class="[errors.has('comment') ? 'has-error' : '']">
<label for="comment" class="required">{{ __('admin::app.sales.orders.comment') }}</label>
<textarea v-validate="'required'" class="control" id="comment" name="comment" data-vv-as="&quot;{{ __('admin::app.sales.orders.comment') }}&quot;"></textarea>
<span class="control-error" v-if="errors.has('comment')">@{{ errors.first('comment') }}</span>
</div>
<div class="control-group">
<span class="checkbox">
<input type="checkbox" name="customer_notified" id="customer-notified" name="checkbox[]">
<label class="checkbox-view" for="customer-notified"></label>
{{ __('admin::app.sales.orders.notify-customer') }}
</span>
</div>
<button type="submit" class="btn btn-lg btn-primary">
{{ __('admin::app.sales.orders.submit-comment') }}
</button>
</form>
<ul class="comment-list">
@foreach ($order->comments()->orderBy('id', 'desc')->get() as $comment)
<li>
<span class="comment-info">
@if ($comment->customer_notified)
{!! __('admin::app.sales.orders.customer-notified', ['date' => $comment->created_at]) !!}
@else
{!! __('admin::app.sales.orders.customer-not-notified', ['date' => $comment->created_at]) !!}
@endif
</span>
<p>{{ $comment->comment }}</p>
</li>
@endforeach
</ul>
</div>
<table class="sale-summary">
<tr>
<td>{{ __('admin::app.sales.orders.shipping-handling') }}</td>
<td>{{ __('admin::app.sales.orders.subtotal') }}</td>
<td>-</td>
<td>{{ core()->formatBasePrice($order->base_shipping_amount) }}</td>
<td>{{ core()->formatBasePrice($order->base_sub_total) }}</td>
</tr>
@endif
@if ($order->base_discount_amount > 0)
<tr>
<td>
{{ __('admin::app.sales.orders.discount') }}
@if ($order->haveStockableItems())
<tr>
<td>{{ __('admin::app.sales.orders.shipping-handling') }}</td>
<td>-</td>
<td>{{ core()->formatBasePrice($order->base_shipping_amount) }}</td>
</tr>
@endif
@if ($order->coupon_code)
({{ $order->coupon_code }})
@endif
</td>
@if ($order->base_discount_amount > 0)
<tr>
<td>
{{ __('admin::app.sales.orders.discount') }}
@if ($order->coupon_code)
({{ $order->coupon_code }})
@endif
</td>
<td>-</td>
<td>{{ core()->formatBasePrice($order->base_discount_amount) }}</td>
</tr>
@endif
<tr class="border">
<td>{{ __('admin::app.sales.orders.tax') }}</td>
<td>-</td>
<td>{{ core()->formatBasePrice($order->base_discount_amount) }}</td>
<td>{{ core()->formatBasePrice($order->base_tax_amount) }}</td>
</tr>
@endif
<tr class="border">
<td>{{ __('admin::app.sales.orders.tax') }}</td>
<td>-</td>
<td>{{ core()->formatBasePrice($order->base_tax_amount) }}</td>
</tr>
<tr class="bold">
<td>{{ __('admin::app.sales.orders.grand-total') }}</td>
<td>-</td>
<td>{{ core()->formatBasePrice($order->base_grand_total) }}</td>
</tr>
<tr class="bold">
<td>{{ __('admin::app.sales.orders.grand-total') }}</td>
<td>-</td>
<td>{{ core()->formatBasePrice($order->base_grand_total) }}</td>
</tr>
<tr class="bold">
<td>{{ __('admin::app.sales.orders.total-paid') }}</td>
<td>-</td>
<td>{{ core()->formatBasePrice($order->base_grand_total_invoiced) }}</td>
</tr>
<tr class="bold">
<td>{{ __('admin::app.sales.orders.total-paid') }}</td>
<td>-</td>
<td>{{ core()->formatBasePrice($order->base_grand_total_invoiced) }}</td>
</tr>
<tr class="bold">
<td>{{ __('admin::app.sales.orders.total-refunded') }}</td>
<td>-</td>
<td>{{ core()->formatBasePrice($order->base_grand_total_refunded) }}</td>
</tr>
<tr class="bold">
<td>{{ __('admin::app.sales.orders.total-due') }}</td>
<td>-</td>
<td>{{ core()->formatBasePrice($order->base_total_due) }}</td>
</tr>
</table>
<tr class="bold">
<td>{{ __('admin::app.sales.orders.total-refunded') }}</td>
<td>-</td>
<td>{{ core()->formatBasePrice($order->base_grand_total_refunded) }}</td>
</tr>
<tr class="bold">
<td>{{ __('admin::app.sales.orders.total-due') }}</td>
<td>-</td>
<td>{{ core()->formatBasePrice($order->base_total_due) }}</td>
</tr>
</table>
</div>
</div>
</accordian>

View File

@ -263,6 +263,7 @@
<th>{{ __('admin::app.sales.orders.SKU') }}</th>
<th>{{ __('admin::app.sales.orders.product-name') }}</th>
<th>{{ __('admin::app.sales.shipments.qty-ordered') }}</th>
<th>{{ __('admin::app.sales.shipments.qty-invoiced') }}</th>
<th>{{ __('admin::app.sales.shipments.qty-to-ship') }}</th>
<th>{{ __('admin::app.sales.shipments.available-sources') }}</th>
</tr>
@ -288,6 +289,7 @@
@endif
</td>
<td>{{ $item->qty_ordered }}</td>
<td>{{ $item->qty_invoiced }}</td>
<td>{{ $item->qty_to_ship }}</td>
<td>
@ -324,8 +326,8 @@
<div class="control-group" :class="[errors.has('{{ $inputName }}') ? 'has-error' : '']">
<input type="text" v-validate="'required|numeric|min_value:0|max_value:{{$sourceQty}}'" class="control" id="{{ $inputName }}" name="{{ $inputName }}" value="0" data-vv-as="&quot;{{ __('admin::app.sales.shipments.qty-to-ship') }}&quot;" :disabled="source != '{{ $inventorySource->id }}'"/>
<input type="text" v-validate="'required|numeric|min_value:0|max_value:{{$sourceQty}}'" class="control" id="{{ $inputName }}" name="{{ $inputName }}" value="{{ $item->qty_invoiced }}" data-vv-as="&quot;{{ __('admin::app.sales.shipments.qty-to-ship') }}&quot;" :disabled="source != '{{ $inventorySource->id }}'"/>
<span class="control-error" v-if="errors.has('{{ $inputName }}')">
@verbatim
{{ errors.first('<?php echo $inputName; ?>') }}

View File

@ -56,7 +56,7 @@
<div class="control-group" :class="[errors.has('target_currency') ? 'has-error' : '']">
<select v-validate="'required'" class="control" name="target_currency" data-vv-as="&quot;{{ __('admin::app.settings.exchange_rates.target_currency') }}&quot;">
@foreach ($currencies as $currency)
@if (is_null($currency->CurrencyExchangeRate))
@if (is_null($currency->exchange_rate))
<option value="{{ $currency->id }}">{{ $currency->name }}</option>
@endif
@endforeach

View File

@ -12,25 +12,20 @@
</div>
<div class="page-action">
<a href="{{ route('admin.exchange_rates.update_rates') }}" class="btn btn-lg btn-primary">
{{ __('admin::app.settings.exchange_rates.update-rates') }}
</a>
<a href="{{ route('admin.exchange_rates.create') }}" class="btn btn-lg btn-primary">
{{ __('admin::app.settings.exchange_rates.add-title') }}
</a>
@php
$defaultService = config('services.exchange-api.default');
@endphp
{{-- <a href="{{ route('admin.exchange_rates.update-rates', $defaultService) }}" class="btn btn-lg btn-primary">
{{ __('admin::app.settings.exchange_rates.update-rates', [
'service' => $defaultService
]) }}
</a> --}}
</div>
</div>
<div class="page-content">
@inject('exchange_rates','Webkul\Admin\DataGrids\ExchangeRatesDataGrid')
{!! $exchange_rates->render() !!}
{!! app('Webkul\Admin\DataGrids\ExchangeRatesDataGrid')->render() !!}
</div>
</div>
@stop

View File

@ -6,7 +6,12 @@
@section('content')
<div class="content">
<form method="POST" action="{{ route('admin.sliders.create') }}" @submit.prevent="onSubmit" enctype="multipart/form-data">
<form
method="POST"
@submit.prevent="onSubmit"
enctype="multipart/form-data"
action="{{ route('admin.sliders.create') }}">
<div class="page-header">
<div class="page-title">
<h1>
@ -29,6 +34,20 @@
{!! view_render_event('bagisto.admin.settings.slider.create.before') !!}
<div class="control-group" :class="[errors.has('locale') ? 'has-error' : '']">
<label for="locale">{{ __('admin::app.datagrid.locale') }}</label>
<select class="control" id="locale" name="locale" data-vv-as="&quot;{{ __('admin::app.datagrid.locale') }}&quot;" value="" v-validate="'required'">
@foreach (core()->getAllLocales() as $localeModel)
<option value="{{ $localeModel->code }}" {{ ($localeModel->code) == $locale ? 'selected' : '' }}>
{{ $localeModel->name }}
</option>
@endforeach
</select>
</div>
<div class="control-group" :class="[errors.has('title') ? 'has-error' : '']">
<label for="title" class="required">{{ __('admin::app.settings.sliders.name') }}</label>
<input type="text" class="control" name="title" v-validate="'required'" data-vv-as="&quot;{{ __('admin::app.settings.sliders.name') }}&quot;">

View File

@ -6,6 +6,8 @@
@section('content')
<div class="content">
<?php $locale = request()->get('locale') ?: app()->getLocale(); ?>
<form method="POST" action="{{ route('admin.sliders.update', $slider->id) }}" @submit.prevent="onSubmit" enctype="multipart/form-data">
<div class="page-header">
<div class="page-title">
@ -13,6 +15,11 @@
<i class="icon angle-left-icon back-link" onclick="history.length > 1 ? history.go(-1) : window.location = '{{ url('/admin/dashboard') }}';"></i>
{{ __('admin::app.settings.sliders.edit-title') }}
@if ($slider->locale)
<span class="locale">[{{ $slider->locale }}]</span>
@endif
</h1>
</div>

View File

@ -6,11 +6,49 @@
@section('content')
<div class="content">
<?php $locale = request()->get('locale') ?: null; ?>
<?php $channel = request()->get('channel') ?: null; ?>
<div class="page-header">
<div class="page-title">
<h1>{{ __('admin::app.settings.sliders.title') }}</h1>
<div class="control-group">
<select class="control" id="channel-switcher" name="channel" onchange="reloadPage('channel', this.value)" >
<option value="all" {{ ! isset($channel) ? 'selected' : '' }}>
{{ __('admin::app.admin.system.all-channels') }}
</option>
@foreach (core()->getAllChannels() as $channelModel)
<option
value="{{ $channelModel->code }}" {{ (isset($channel) && ($channelModel->code) == $channel) ? 'selected' : '' }}>
{{ $channelModel->name }}
</option>
@endforeach
</select>
</div>
<div class="control-group">
<select class="control" id="locale-switcher" name="locale" onchange="reloadPage('locale', this.value)" >
<option value="all" {{ ! isset($locale) ? 'selected' : '' }}>
{{ __('admin::app.admin.system.all-locales') }}
</option>
@foreach (core()->getAllLocales() as $localeModel)
<option
value="{{ $localeModel->code }}" {{ (isset($locale) && ($localeModel->code) == $locale) ? 'selected' : '' }}>
{{ $localeModel->name }}
</option>
@endforeach
</select>
</div>
</div>
<div class="page-action">
@ -25,4 +63,18 @@
{!! $sliders->render() !!}
</div>
</div>
@stop
@stop
@push('scripts')
<script>
function reloadPage(getVar, getVal) {
let url = new URL(window.location.href);
url.searchParams.set(getVar, getVal);
window.location.href = url.href;
}
</script>
@endpush

View File

@ -26,22 +26,6 @@
<div class="form-container">
@csrf()
<div class="control-group" :class="[errors.has('channel') ? 'has-error' : '']">
<label for="channel" class="required">{{ __('admin::app.configuration.tax-categories.select-channel') }}</label>
<select class="control" name="channel_id">
@foreach (core()->getAllChannels() as $channelModel)
<option value="{{ $channelModel->id }}">
{{ $channelModel->name }}
</option>
@endforeach
</select>
<span class="control-error" v-if="errors.has('channel')">@{{ errors.first('channel') }}</span>
</div>
<div class="control-group" :class="[errors.has('code') ? 'has-error' : '']">
<label for="code" class="required">{{ __('admin::app.configuration.tax-categories.code') }}</label>
@ -67,7 +51,7 @@
</div>
<?php $selectedOptions = old('taxrates') ?: [] ?>
<div class="control-group" :class="[errors.has('taxrates[]') ? 'has-error' : '']">
<label for="taxrates" class="required">{{ __('admin::app.configuration.tax-categories.select-taxrates') }}</label>

View File

@ -27,22 +27,6 @@
<div class="form-container">
@csrf()
@method('PUT')
<div class="control-group" :class="[errors.has('channel') ? 'has-error' : '']">
<label for="channel" class="required">{{ __('admin::app.settings.tax-categories.select-channel') }}</label>
<select class="control" name="channel_id">
@foreach (core()->getAllChannels() as $channelModel)
<option @if ($taxCategory->channel_id == $channelModel->id) selected @endif value="{{ $channelModel->id }}">
{{ $channelModel->name }}
</option>
@endforeach
</select>
<span class="control-error" v-if="errors.has('channel')">@{{ errors.first('channel') }}</span>
</div>
<div class="control-group" :class="[errors.has('code') ? 'has-error' : '']">
<label for="code" class="required">{{ __('admin::app.settings.tax-categories.code') }}</label>

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
{
"/css/default-booking.css": "/css/default-booking.css?id=3607d6ec4cb93857b42c",
"/css/default-booking.css": "/css/default-booking.css?id=ab5abfabd8e0f6df6466",
"/css/velocity-booking.css": "/css/velocity-booking.css?id=fb0d5b9e37ed77d662d1"
}

View File

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AlterBookingProductsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('booking_products', function (Blueprint $table) {
$table->datetime('available_from')->change();
$table->datetime('available_to')->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}

View File

@ -178,7 +178,7 @@ class Booking
$availableFrom = ! $bookingProduct->available_from && $bookingProduct->available_from
? Carbon::createFromTimeString($bookingProduct->available_from)
: clone $currentTime;
: Carbon::createFromTimeString($currentTime->format('Y-m-d 00:00:00'));
$availableTo = ! $bookingProduct->available_from && $bookingProduct->available_to
? Carbon::createFromTimeString($bookingProduct->available_to)
@ -254,13 +254,13 @@ class Booking
return [];
}
$requestedDate = Carbon::createFromTimeString($date . " 00:00:00");
$currentTime = Carbon::now();
$requestedDate = Carbon::createFromTimeString($date . " 00:00:00");
$availableFrom = ! $bookingProduct->available_every_week && $bookingProduct->available_from
? Carbon::createFromTimeString($bookingProduct->available_from)
: Carbon::createFromTimeString($currentTime);
: Carbon::createFromTimeString($currentTime->format('Y-m-d 00:00:00'));
$availableTo = ! $bookingProduct->available_every_week && $bookingProduct->available_from
? Carbon::createFromTimeString($bookingProduct->available_to)
@ -270,8 +270,7 @@ class Booking
? $bookingProductSlot->slots
: ($bookingProductSlot->slots[$requestedDate->format('w')] ?? []);
if ($requestedDate < $currentTime
|| $requestedDate < $availableFrom
if ($requestedDate < $availableFrom
|| $requestedDate > $availableTo
) {
return [];

View File

@ -32,14 +32,13 @@ class DefaultSlot extends Booking
$availableFrom = $bookingProduct->available_from
? Carbon::createFromTimeString($bookingProduct->available_from)
: clone $currentTime;
: Carbon::createFromTimeString($currentTime->format('Y-m-d 00:00:00'));
$availableTo = $bookingProduct->available_to
? Carbon::createFromTimeString($bookingProduct->available_to)
: Carbon::createFromTimeString('2080-01-01 00:00:00');
if ($requestedDate < $currentTime
|| $requestedDate < $availableFrom
if ($requestedDate < $availableFrom
|| $requestedDate > $availableTo
) {
return [];
@ -63,8 +62,10 @@ class DefaultSlot extends Booking
{
$slots = [];
$dayOfWeek = $requestedDate->dayOfWeek;
foreach ($bookingProductSlot->slots as $timeDuration) {
if ($requestedDate->dayOfWeek != $timeDuration['from_day']) {
if ($dayOfWeek != $timeDuration['from_day']) {
continue;
}
@ -101,7 +102,7 @@ class DefaultSlot extends Booking
$availableFrom = $bookingProduct->available_from
? Carbon::createFromTimeString($bookingProduct->available_from)
: clone $currentTime;
: Carbon::createFromTimeString($currentTime->format('Y-m-d 00:00:00'));
$availableTo = $bookingProduct->available_to
? Carbon::createFromTimeString($bookingProduct->available_to)

View File

@ -4,6 +4,7 @@ namespace Webkul\BookingProduct\Helpers;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
use Webkul\Checkout\Facades\Cart;
class EventTicket extends Booking
{
@ -124,6 +125,12 @@ class EventTicket extends Booking
$ticket = $bookingProduct->event_tickets()->find($item->additional['booking']['ticket_id']);
if (! $ticket) {
Cart::removeItem($item->id);
return true;
}
$price += $ticket->price;
if ($price == $item->base_price) {

View File

@ -29,7 +29,7 @@ class RentalSlot extends Booking
$availableFrom = ! $bookingProduct->available_every_week && $bookingProduct->available_from
? Carbon::createFromTimeString($bookingProduct->available_from)
: Carbon::createFromTimeString($currentTime);
: Carbon::createFromTimeString($currentTime->format('Y-m-d 00:00:00'));
$availableTo = ! $bookingProduct->available_every_week && $bookingProduct->available_from
? Carbon::createFromTimeString($bookingProduct->available_to)
@ -37,10 +37,9 @@ class RentalSlot extends Booking
$timeDurations = $bookingProductSlot->same_slot_all_days
? $bookingProductSlot->slots
: $bookingProductSlot->slots[$requestedDate->format('w')];
: $bookingProductSlot->slots[$requestedDate->format('w')] ?? [];
if ($requestedDate < $currentTime
|| $requestedDate < $availableFrom
if ($requestedDate < $availableFrom
|| $requestedDate > $availableTo
) {
return [];
@ -105,7 +104,7 @@ class RentalSlot extends Booking
{
$bookingProduct = $this->bookingProductRepository->findOneByField('product_id', $data['product_id']);
$rentingType = $products[0]['additional']['booking']['renting_type'] ?? $bookingProduct->rental_slot->renting_type;
$rentingType = $data['additional']['booking']['renting_type'] ?? $bookingProduct->rental_slot->renting_type;
if ($rentingType == 'daily') {
$from = Carbon::createFromTimeString($data['additional']['booking']['date_from'] . ' 00:00:01')->getTimestamp();
@ -141,24 +140,48 @@ class RentalSlot extends Booking
public function isSlotExpired($cartItem)
{
$bookingProduct = $this->bookingProductRepository->findOneByField('product_id', $cartItem['product_id']);
$typeHelper = app($this->typeHelpers[$bookingProduct->type]);
$timeIntervals = $typeHelper->getSlotsByDate($bookingProduct, $cartItem['additional']['booking']['date']);
if (isset($cartItem['additional']['booking']['date'])) {
$timeIntervals = $this->getSlotsByDate($bookingProduct, $cartItem['additional']['booking']['date']);
$isExpired = true;
$isExpired = true;
foreach ($timeIntervals as $timeInterval) {
foreach ($timeInterval['slots'] as $slot) {
if ($slot['from_timestamp'] == $cartItem['additional']['booking']['slot']['from']
&& $slot['to_timestamp'] == $cartItem['additional']['booking']['slot']['to']
) {
$isExpired = false;
foreach ($timeIntervals as $timeInterval) {
foreach ($timeInterval['slots'] as $slot) {
if ($slot['from_timestamp'] == $cartItem['additional']['booking']['slot']['from']
&& $slot['to_timestamp'] == $cartItem['additional']['booking']['slot']['to']
) {
$isExpired = false;
}
}
}
}
return $isExpired;
return $isExpired;
} else {
$currentTime = Carbon::now();
$requestedFromDate = Carbon::createFromTimeString($cartItem['additional']['booking']['date_from'] . " 00:00:00");
$requestedToDate = Carbon::createFromTimeString($cartItem['additional']['booking']['date_to'] . " 23:59:59");
$availableFrom = ! $bookingProduct->available_every_week && $bookingProduct->available_from
? Carbon::createFromTimeString($bookingProduct->available_from->format('Y-m-d') . ' 00:00:00')
: Carbon::createFromTimeString($currentTime->format('Y-m-d 00:00:00'));
$availableTo = ! $bookingProduct->available_every_week && $bookingProduct->available_from
? Carbon::createFromTimeString($bookingProduct->available_to->format('Y-m-d') . ' 23:59:59')
: Carbon::createFromTimeString('2080-01-01 00:00:00');
if ($requestedFromDate < $availableFrom
|| $requestedFromDate > $availableTo
|| $requestedToDate < $availableFrom
|| $requestedToDate > $availableTo
) {
return true;
}
return false;
}
}
/**

View File

@ -22,7 +22,7 @@ class TableSlot extends Booking
$bookedQty *= $bookingProduct->table_slot->guest_limit;
}
if ($bookingProduct->qty - $bookedQty < $requestedQty) {
if ($bookingProduct->qty - $bookedQty < $requestedQty || $this->isSlotExpired($cartItem)) {
return false;
}

View File

@ -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');

View File

@ -174,6 +174,12 @@ class BookingProductRepository extends Repository
$to = Carbon::createFromTimeString($timeInterval['to'])->getTimestamp();
if ($from > $to) {
unset($slots[$key]);
continue;
}
$isOverLapping = false;
foreach ($tempSlots as $slot) {

View File

@ -130,9 +130,8 @@
padding-right: 5px;
&::after {
position: absolute;
top: 14px;
right: 10px;
top: 16px;
left: 100%;
}
}

View File

@ -0,0 +1,125 @@
<?php
return [
'admin' => [
'catalog' => [
'products' => [
'booking' => 'معلومات الحجز',
'booking-type' => 'نوع الحجز',
'default' => 'إفتراضي',
'appointment-booking' => 'حجز موعد',
'event-booking' => 'حجز الحدث',
'rental-booking' => 'حجز الإيجار',
'table-booking' => 'حجز طاولة',
'slot-duration' => '(مدة الفتحة (دقائق',
'break-time' => '(استراحة بين الفتحات (دقائق',
'available-every-week' => 'متوفر كل أسبوع',
'yes' => 'نعم',
'no' => 'لا',
'available-from' => 'متاح من',
'available-to' => 'متاحة لل',
'same-slot-all-days' => 'نفس الفتحة طوال الأيام',
'slot-has-quantity' => 'تحتوي الفتحة على الكمية',
'slots' => 'فتحات',
'from' => 'من عند',
'to' => 'إلى',
'qty' => 'كمية',
'add-slot' => 'أضف فتحة',
'sunday' => 'الأحد',
'monday' => 'الإثنين',
'tuesday' => 'الثلاثاء',
'wednesday' => 'الأربعاء',
'thursday' => 'الخميس',
'friday' => 'يوم الجمعة',
'saturday' => 'يوم السبت',
'renting-type' => 'نوع التأجير',
'daily' => 'الأساس اليومي',
'hourly' => 'بالساعة',
'daily-hourly' => '(كلاهما (يومي وأساس للساعة',
'daily-price' => 'السعر اليومي',
'hourly-price' => 'سعر الساعة',
'location' => 'موقعك',
'show-location' => 'إظهار الموقع',
'event-start-date' => 'تاريخ بدء الحدث',
'event-end-date' => 'تاريخ انتهاء الحدث',
'tickets' => 'التذاكر',
'add-ticket' => 'أضف تذكرة',
'name' => 'اسم',
'price' => 'السعر',
'quantity' => 'كمية',
'description' => 'وصف',
'charged-per' => 'اتهم لكل',
'guest' => 'زائر',
'table' => 'الطاولة',
'prevent-scheduling-before' => 'منع الجدولة قبل',
'guest-limit' => 'حد الضيف لكل جدول',
'guest-capacity' => 'سعة الضيف',
'type' => 'Type',
'many-bookings-for-one-day' => 'العديد من الحجوزات ليوم واحد',
'one-booking-for-many-days' => 'حجز واحد لعدة أيام',
'day' => 'يوم',
'status' => 'الحالة',
'open' => 'افتح',
'close' => 'غلق'
]
]
],
'shop' => [
'products' => [
'location' => 'موقعك',
'contact' => 'مكالمة',
'email' => 'البريد الإلكتروني',
'slot-duration' => 'مدة الفتحة',
'slot-duration-in-minutes' => 'دقائق دقائق:',
'today-availability' => 'توفر اليوم',
'slots-for-all-days' => 'إظهار لجميع الأيام',
'sunday' => 'الأحد',
'monday' => 'الإثنين',
'tuesday' => 'الثلاثاء',
'wednesday' => 'الأربعاء',
'thursday' => 'الخميس',
'friday' => 'يوم الجمعة',
'saturday' => 'يوم السبت',
'closed' => 'مغلق',
'book-an-appointment' => 'حجز موعد',
'date' => 'تاريخ',
'slot' => 'فتحة',
'rent-an-item' => 'استئجار عنصر',
'choose-rent-option' => 'اختر خيار الإيجار',
'daily-basis' => 'الأساس اليومي',
'hourly-basis' => 'بالساعة',
'select-time-slot'=> 'حدد الفترة الزمنية',
'select-slot' => 'حدد فتحة',
'select-date' => 'حدد تاريخ',
'select-rent-time' => 'حدد وقت الإيجار',
'from' => 'من عند',
'to' => 'إلى',
'book-a-table' => 'احجز طاولة',
'special-notes' => 'طلب / ملاحظات خاصة',
'event-on' => 'الحدث قيد التشغيل',
'book-your-ticket' => 'احجز تذكرتك',
'per-ticket-price' => 'سعر التذكرة:',
'number-of-tickets' => 'عدد التذاكر',
'total-tickets' => 'إجمالي التذاكر',
'base-price' => 'السعر الأساسي',
'total-price' => 'السعر الكلي',
'base-price-info' => '(سيتم تطبيق ذلك على كل نوع من أنواع التذاكر لكل كمية)'
],
'cart' => [
'renting_type' => 'نوع الإيجار',
'daily' => 'اليومي',
'hourly' => 'ساعيا',
'event-ticket' => 'تذكرة الحدث',
'event-from' => 'حدث من',
'event-till' => 'الحدث حتى',
'rent-type' => 'نوع الإيجار',
'rent-from' => 'الإيجار من',
'rent-till' => 'إيجار حتى',
'booking-from' => 'الحجز من',
'booking-till' => 'الحجز حتى',
'special-note' => 'طلب / ملاحظات خاصة',
]
]
];

View File

@ -0,0 +1,125 @@
<?php
return [
'admin' => [
'catalog' => [
'products' => [
'booking' => 'اطلاعات رزرو',
'booking-type' => 'نوع رزرو',
'default' => 'پیش فرض',
'appointment-booking' => 'رزرو قرار ملاقات',
'event-booking' => 'رزرو رویداد',
'rental-booking' => 'رزرو اجاره',
'table-booking' => 'رزرو جدول',
'slot-duration' => '(مدت زمان حافظه (دقیقه',
'break-time' => '(فاصله بین شکافها (دقیقه',
'available-every-week' => 'هر هفته در دسترس است',
'yes' => 'آره',
'no' => 'نه',
'available-from' => 'موجود از',
'available-to' => 'در دسترس است برای',
'same-slot-all-days' => 'همان شکاف همه روزها',
'slot-has-quantity' => 'اسلات مقدار زیادی دارد',
'slots' => 'شکافها',
'from' => 'از جانب',
'to' => 'به',
'qty' => 'تعداد',
'add-slot' => 'شکاف را اضافه کنید',
'sunday' => 'یکشنبه',
'monday' => 'دوشنبه',
'tuesday' => 'سهشنبه',
'wednesday' => 'چهار شنبه',
'thursday' => 'پنج شنبه',
'friday' => 'جمعه',
'saturday' => 'شنبه',
'renting-type' => 'نوع اجاره',
'daily' => 'به صورت روزانه',
'hourly' => 'مبانی ساعتی',
'daily-hourly' => '(هر دو(مبانی روزانه و ساعتی',
'daily-price' => 'قیمت روزانه',
'hourly-price' => 'قیمت ساعتی',
'location' => 'مکان',
'show-location' => 'نمایش موقعیت مکانی',
'event-start-date' => 'تاریخ شروع رویداد',
'event-end-date' => 'تاریخ پایان رویداد',
'tickets' => 'بلیط',
'add-ticket' => 'بلیط را اضافه کنید',
'name' => 'نام',
'price' => 'قیمت',
'quantity' => 'تعداد',
'description' => 'شرح',
'charged-per' => 'به اتهام در هر',
'guest' => 'مهمان',
'table' => 'جدول',
'prevent-scheduling-before' => 'قبل از برنامه ریزی جلوگیری کنید',
'guest-limit' => 'محدودیت مهمان در هر جدول',
'guest-capacity' => 'ظرفیت مهمان',
'type' => 'تایپ کنید',
'many-bookings-for-one-day' => 'بسیاری از رزروها برای یک روز',
'one-booking-for-many-days' => 'یک رزرو برای بسیاری از روزها',
'day' => 'روز',
'status' => 'وضعیت',
'open' => 'باز کن',
'close' => 'بستن'
]
]
],
'shop' => [
'products' => [
'location' => 'مکان',
'contact' => 'مخاطب',
'email' => 'پست الکترونیک',
'slot-duration' => 'مدت زمان حافظه',
'slot-duration-in-minutes' => ':minutes دقایق',
'today-availability' => 'امروز در دسترس بودن',
'slots-for-all-days' => 'نمایش برای تمام روزها',
'sunday' => 'یکشنبه',
'monday' => 'دوشنبه',
'tuesday' => 'سهشنبه',
'wednesday' => 'چهار شنبه',
'thursday' => 'پنج شنبه',
'friday' => 'جمعه',
'saturday' => 'شنبه',
'closed' => 'بسته شد',
'book-an-appointment' => 'قرار ملاقات را رزرو کنید',
'date' => 'تاریخ',
'slot' => 'اسلات',
'rent-an-item' => 'اجاره یک مورد',
'choose-rent-option' => 'گزینه اجاره را انتخاب کنید',
'daily-basis' => 'به صورت روزانه',
'hourly-basis' => 'مبانی ساعتی',
'select-time-slot'=> 'شکاف زمان را انتخاب کنید',
'select-slot' => 'شکاف را انتخاب کنید',
'select-date' => 'تاریخ را انتخاب کنید',
'select-rent-time' => 'زمان اجاره را انتخاب کنید',
'from' => 'از جانب',
'to' => 'به',
'book-a-table' => 'یک جدول رزرو کنید',
'special-notes' => 'درخواست ویژه / یادداشت',
'event-on' => 'رویداد در',
'book-your-ticket' => 'بلیط خود را رزرو کنید',
'per-ticket-price' => ':price برای هر بلیط',
'number-of-tickets' => 'تعداد بلیط ها',
'total-tickets' => 'بلیط های کل',
'base-price' => 'قیمت پایه',
'total-price' => 'قیمت کل',
'base-price-info' => '(این برای هر نوع بلیط برای هر کمیت کاربرد دارد)'
],
'cart' => [
'renting_type' => 'نوع اجاره',
'daily' => 'روزانه',
'hourly' => 'ساعتی',
'event-ticket' => 'بلیط رویداد',
'event-from' => 'رویداد از',
'event-till' => 'رویداد تا زمان',
'rent-type' => 'نوع اجاره',
'rent-from' => 'اجاره از',
'rent-till' => 'اجاره تا زمان',
'booking-from' => 'رزرو از',
'booking-till' => 'تا زمان رزرو',
'special-note' => 'درخواست ویژه / یادداشت',
]
]
];

View File

@ -0,0 +1,125 @@
<?php
return [
'admin' => [
'catalog' => [
'products' => [
'booking' => 'Boekingsinformatie',
'booking-type' => 'Boekingstype',
'default' => 'Standaard',
'appointment-booking' => 'Afspraak boeken',
'event-booking' => 'Evenement boeken',
'rental-booking' => 'Verhuur boeken',
'table-booking' => 'Tafel reserveren',
'slot-duration' => 'Slotduur (minuten)',
'break-time' => 'Break Time b/w Slots (minuten)',
'available-every-week' => 'Elke week beschikbaar',
'yes' => 'Ja',
'no' => 'Nee',
'available-from' => 'Beschikbaar van',
'available-to' => 'Beschikbaar voor',
'same-slot-all-days' => 'Zelfde slot alle dagen',
'slot-has-quantity' => 'Slot heeft hoeveelheid',
'slots' => 'Slots',
'from' => 'Van',
'to' => 'To',
'qty' => 'Qty',
'add-slot' => 'Slot toevoegen',
'sunday' => 'Slot toevoegen',
'monday' => 'maandag',
'tuesday' => 'dinsdag',
'wednesday' => 'woensdag',
'thursday' => 'donderdag',
'friday' => 'vrijdag',
'saturday' => 'zaterdag',
'renting-type' => 'Type verhuur',
'daily' => 'Dagelijks',
'hourly' => 'Uurbasis',
'daily-hourly' => 'Beide (dagelijkse en uurbasis)',
'daily-price' => 'Dagelijkse prijs',
'hourly-price' => 'Prijs per uur',
'location' => 'Plaats',
'show-location' => 'Locatie tonen',
'event-start-date' => 'Begindatum evenement',
'event-end-date' => 'Einddatum evenement',
'tickets' => 'Kaartjes',
'add-ticket' => 'Ticket toevoegen',
'name' => 'Naam',
'price' => 'Prijs',
'quantity' => 'Aantal stuks',
'description' => 'Beschrijving',
'charged-per' => 'In rekening gebracht per',
'guest' => 'Gast',
'table' => 'Tafel',
'prevent-scheduling-before' => 'Voorkom plannen voor',
'guest-limit' => 'Gastlimiet per tafel',
'guest-capacity' => 'Gastcapaciteit',
'type' => 'Type',
'many-bookings-for-one-day' => 'Veel boekingen voor één dag',
'one-booking-for-many-days' => 'Eén boeking voor vele dagen',
'day' => 'Dag',
'status' => 'Toestand',
'open' => 'Open',
'close' => 'Dichtbij'
]
]
],
'shop' => [
'products' => [
'location' => 'Plaats',
'contact' => 'Contact',
'email' => 'Email',
'slot-duration' => 'Slot Duur',
'slot-duration-in-minutes' => ':minutes Minutes',
'today-availability' => 'Beschikbaarheid vandaag',
'slots-for-all-days' => 'Show voor alle dagen',
'sunday' => 'Sunday',
'monday' => 'maandag',
'tuesday' => 'dinsdag',
'wednesday' => 'woensdag',
'thursday' => 'donderdag',
'friday' => 'vrijdag',
'saturday' => 'zaterdag',
'closed' => 'Gesloten',
'book-an-appointment' => 'Een afspraak maken',
'date' => 'Datum',
'slot' => 'Sleuf',
'rent-an-item' => 'Huur een item',
'choose-rent-option' => 'Kies Huuroptie',
'daily-basis' => 'Dagelijks',
'hourly-basis' => 'Uurbasis',
'select-time-slot'=> 'Selecteer tijdslot',
'select-slot' => 'Selecteer Slot',
'select-date' => 'Selecteer een datum',
'select-rent-time' => 'Selecteer Huurtijd',
'from' => 'Van',
'to' => 'Naar',
'book-a-table' => 'Een tafel reserveren',
'special-notes' => 'Speciaal verzoek / opmerkingen',
'event-on' => 'Evenement aan',
'book-your-ticket' => 'Boek uw ticket',
'per-ticket-price' => ':price Per Ticket',
'number-of-tickets' => 'Aantal tickets',
'total-tickets' => 'Totaal aantal tickets',
'base-price' => 'Basisprijs',
'total-price' => 'Totale prijs',
'base-price-info' => '(Dit is van toepassing op elk type ticket voor elke hoeveelheid)'
],
'cart' => [
'renting_type' => 'Huurtype',
'daily' => 'Dagelijks',
'hourly' => 'Elk uur',
'event-ticket' => 'Evenement Ticket',
'event-from' => 'Evenement van',
'event-till' => 'Evenement tot',
'rent-type' => 'Huurtype',
'rent-from' => 'Huur van',
'rent-till' => 'Huur tot',
'booking-from' => 'Boeking van',
'booking-till' => 'Boeking tot',
'special-note' => 'Speciaal verzoek / opmerkingen',
]
]
];

View File

@ -0,0 +1,125 @@
<?php
return [
'admin' => [
'catalog' => [
'products' => [
'booking' => 'Informações de reserva',
'booking-type' => 'Tipo de Reserva',
'default' => 'Padrão',
'appointment-booking' => 'Marcação de consultas',
'event-booking' => 'Reserva de Eventos',
'rental-booking' => 'Reserva de Locação',
'table-booking' => 'Reserva de mesa',
'slot-duration' => 'Duração do slot (minutos)',
'break-time' => 'Tempo de intervalo entre slots (minutos)',
'available-every-week' => 'Disponível todas as semanas',
'yes' => 'sim',
'no' => 'Não',
'available-from' => 'Disponível a partir de',
'available-to' => 'Disponível para',
'same-slot-all-days' => 'Mesmo slot todos os dias',
'slot-has-quantity' => 'O slot tem quantidade',
'slots' => 'Slots',
'from' => 'A partir de',
'to' => 'Para',
'qty' => 'Quantidade',
'add-slot' => 'Adicionar slot',
'sunday' => 'domingo',
'monday' => 'Segunda-feira',
'tuesday' => 'terça',
'wednesday' => 'Quarta-feira',
'thursday' => 'Quinta-feira',
'friday' => 'Sexta-feira',
'saturday' => 'sábado',
'renting-type' => 'Tipo de locação',
'daily' => 'Diariamente',
'hourly' => 'Base horária',
'daily-hourly' => 'Ambos (base diária e horária)',
'daily-price' => 'Preço Diário',
'hourly-price' => 'Preço por Hora',
'location' => 'Localização',
'show-location' => 'Mostrar Localização',
'event-start-date' => 'Data de início do evento',
'event-end-date' => 'Data de término do evento',
'tickets' => 'Ingressos',
'add-ticket' => 'Adicionar ticket',
'name' => 'Nome',
'price' => 'Preço',
'quantity' => 'Quantidade',
'description' => 'Descrição',
'charged-per' => 'Cobrado por',
'guest' => 'Hóspede',
'table' => 'Mesa',
'prevent-scheduling-before' => 'Impedir agendamento antes',
'guest-limit' => 'Limite de convidados por tabela',
'guest-capacity' => 'Capacidade de Convidado',
'type' => 'Tipo',
'many-bookings-for-one-day' => 'Muitas reservas para um dia',
'one-booking-for-many-days' => 'Uma reserva por muitos dias',
'day' => 'Dia',
'status' => 'Status',
'open' => 'Aberto',
'close' => 'Fechar'
]
]
],
'shop' => [
'products' => [
'location' => 'Localização',
'contact' => 'Contato',
'email' => 'O email',
'slot-duration' => 'Duração do slot',
'slot-duration-in-minutes' => ':minutes Minutos',
'today-availability' => 'Disponibilidade Hoje',
'slots-for-all-days' => 'Mostrar para todos os dias',
'sunday' => 'domingo',
'monday' => 'Segunda-feira',
'tuesday' => 'terça',
'wednesday' => 'Quarta-feira',
'thursday' => 'Quinta-feira',
'friday' => 'Sexta-feira',
'saturday' => 'sábado',
'closed' => 'Closed',
'book-an-appointment' => 'Marque uma consulta',
'date' => 'Date',
'slot' => 'Slot',
'rent-an-item' => 'Alugar um item',
'choose-rent-option' => 'Escolha a opção de aluguel',
'daily-basis' => 'Diariamente',
'hourly-basis' => 'Base horária',
'select-time-slot'=> 'Selecionar horário',
'select-slot' => 'Selecionar slot',
'select-date' => 'Selecione a data',
'select-rent-time' => 'Selecione o tempo de aluguel',
'from' => 'A partir de',
'to' => 'Para',
'book-a-table' => 'Reservar uma mesa',
'special-notes' => 'Pedido / Notas Especiais',
'event-on' => 'Evento ativado',
'book-your-ticket' => 'Reserve seu ingresso',
'per-ticket-price' => ':price Por Bilhete',
'number-of-tickets' => 'Número de Bilhetes',
'total-tickets' => 'Total de ingressos',
'base-price' => 'Preço base',
'total-price' => 'Preço total',
'base-price-info' => '(Isso será aplicado a cada tipo de ticket para cada quantidade)'
],
'cart' => [
'renting_type' => 'Tipo de Aluguel',
'daily' => 'Diariamente',
'hourly' => 'Por hora',
'event-ticket' => 'Bilhete de evento',
'event-from' => 'Evento de',
'event-till' => 'Evento Até',
'rent-type' => 'Tipo de Aluguel',
'rent-from' => 'Alugar de',
'rent-till' => 'Aluguel Até',
'booking-from' => 'Reserva de',
'booking-till' => 'Reserva até',
'special-note' => 'Pedido / Notas Especiais',
]
]
];

View File

@ -1,3 +1,25 @@
@section('css')
<style>
.slot-list .control-group.date::after {
margin-top: -13px;
left: 100%;
}
.has-control-group .control-group {
width: 50%;
float: left;
}
.has-control-group .control-group:first-child {
padding-right: 10px;
}
.has-control-group .control-group:last-child {
padding-left: 10px;
}
</style>
@stop
{!! view_render_event('bagisto.admin.catalog.product.edit_form_accordian.booking.before', ['product' => $product]) !!}
<accordian :title="'{{ __('bookingproduct::app.admin.catalog.products.booking') }}'" :active="true">
@ -57,21 +79,21 @@
</div>
<div v-if="! parseInt(booking.available_every_week)">
<div class="control-group" :class="[errors.has('booking[available_from]') ? 'has-error' : '']">
<div class="control-group date" :class="[errors.has('booking[available_from]') ? 'has-error' : '']">
<label class="required">{{ __('bookingproduct::app.admin.catalog.products.available-from') }}</label>
<datetime>
<input type="text" v-validate="'required'" name="booking[available_from]" v-model="booking.available_from" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.admin.catalog.products.available-from') }}&quot;"/>
<input type="text" v-validate="'required|date_format:yyyy-MM-dd HH:mm:ss|after:{{\Carbon\Carbon::yesterday()->format('Y-m-d 23:59:59')}}'" name="booking[available_from]" v-model="booking.available_from" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.admin.catalog.products.available-from') }}&quot;" ref="available_from"/>
</datetime>
<span class="control-error" v-if="errors.has('booking[available_from]')">@{{ errors.first('booking[available_from]') }}</span>
</div>
<div class="control-group" :class="[errors.has('booking[available_to]') ? 'has-error' : '']">
<div class="control-group date" :class="[errors.has('booking[available_to]') ? 'has-error' : '']">
<label class="required">{{ __('bookingproduct::app.admin.catalog.products.available-to') }}</label>
<datetime>
<input type="text" v-validate="'required'" name="booking[available_to]" v-model="booking.available_to" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.admin.catalog.products.available-to') }}&quot;"/>
<input type="text" v-validate="'required|date_format:yyyy-MM-dd HH:mm:ss|after:available_from'" name="booking[available_to]" v-model="booking.available_to" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.admin.catalog.products.available-to') }}&quot;" ref="available_to"/>
</datetime>
<span class="control-error" v-if="errors.has('booking[available_to]')">@{{ errors.first('booking[available_to]') }}</span>

View File

@ -165,7 +165,7 @@
<span class="control-error" v-if="errors.has(controlName + '[from_day]')">@{{ errors.first(controlName + '[from_day]') }}</span>
</div>
<div class="control-group" :class="[errors.has(controlName + '[from]') ? 'has-error' : '']">
<div class="control-group date" :class="[errors.has(controlName + '[from]') ? 'has-error' : '']">
<time-component>
<input type="text" v-validate="'required'" :name="controlName + '[from]'" v-model="slotItem.from" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.admin.catalog.products.from') }}&quot;">
</time-component>
@ -185,7 +185,7 @@
<span class="control-error" v-if="errors.has(controlName + '[to_day]')">@{{ errors.first(controlName + '[to_day]') }}</span>
</div>
<div class="control-group" :class="[errors.has(controlName + '[to]') ? 'has-error' : '']">
<div class="control-group date" :class="[errors.has(controlName + '[to]') ? 'has-error' : '']">
<time-component>
<input type="text" v-validate="'required'" :name="controlName + '[to]'" v-model="slotItem.to" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.admin.catalog.products.to') }}&quot;">
</time-component>

View File

@ -71,7 +71,7 @@
<script type="text/x-template" id="slot-item-template">
<tr>
<td>
<div class="control-group" :class="[errors.has(controlName + '[from]') ? 'has-error' : '']">
<div class="control-group date" :class="[errors.has(controlName + '[from]') ? 'has-error' : '']">
<time-component>
<input type="text" v-validate="'required'" :name="controlName + '[from]'" v-model="slotItem.from" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.admin.catalog.products.from') }}&quot;">
</time-component>
@ -83,7 +83,7 @@
</td>
<td>
<div class="control-group" :class="[errors.has(controlName + '[to]') ? 'has-error' : '']">
<div class="control-group date" :class="[errors.has(controlName + '[to]') ? 'has-error' : '']">
<time-component>
<input type="text" v-validate="'required'" :name="controlName + '[to]'" v-model="slotItem.to" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.admin.catalog.products.to') }}&quot;">
</time-component>

View File

@ -86,7 +86,7 @@
<div class="control-group-container">
<div class="control-group date" :class="[errors.has('booking[date_from]') ? 'has-error' : '']">
<date @onChange="dateSelected($event)">
<input type="text" v-validate="'required'" name="booking[date_from]" v-model="date_from" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.shop.products.from') }}&quot;" placeholder="{{ __('bookingproduct::app.shop.products.from') }}" data-min-date="today"/>
<input type="text" v-validate="'required|date_format:yyyy-MM-dd|before_or_equal:date_to'" name="booking[date_from]" v-model="date_from" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.shop.products.from') }}&quot;" placeholder="{{ __('bookingproduct::app.shop.products.from') }}" ref="date_from" data-min-date="today"/>
</date>
<span class="control-error" v-if="errors.has('booking[date_from]')">@{{ errors.first('booking[date_from]') }}</span>
@ -94,7 +94,7 @@
<div class="control-group date" :class="[errors.has('booking[date_to]') ? 'has-error' : '']">
<date @onChange="dateSelected($event)">
<input type="text" v-validate="'required'" name="booking[date_to]" v-model="date_to" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.shop.products.to') }}&quot;" placeholder="{{ __('bookingproduct::app.shop.products.to') }}"/>
<input type="text" v-validate="'required|date_format:yyyy-MM-dd|after_or_equal:date_from'" name="booking[date_to]" v-model="date_to" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.shop.products.to') }}&quot;" placeholder="{{ __('bookingproduct::app.shop.products.to') }}" ref="date_to" data-min-date="today"/>
</date>
<span class="control-error" v-if="errors.has('booking[date_to]')">@{{ errors.first('booking[date_to]') }}</span>
@ -131,6 +131,46 @@
}
},
created: function() {
var self = this;
this.$validator.extend('after_or_equal', {
getMessage(field, val) {
return 'The "To" must be equal or after "From"';
},
validate(value, field) {
if (! self.date_from) {
return true;
}
var from = new Date(self.date_from);
var to = new Date(self.date_to);
return from <= to;
}
});
this.$validator.extend('before_or_equal', {
getMessage(field, val) {
return 'The "From must be equal or before "To"';
},
validate(value, field) {
if (! self.date_to) {
return true;
}
var from = new Date(self.date_from);
var to = new Date(self.date_to);
return from <= to;
}
});
},
methods: {
dateSelected: function(date) {
var this_this = this;

View File

@ -86,7 +86,7 @@
<div class="control-group-container">
<div class="form-group date" :class="[errors.has('booking[date_from]') ? 'has-error' : '']">
<date @onChange="dateSelected($event)">
<input type="text" v-validate="'required'" name="booking[date_from]" v-model="date_from" class="form-style" data-vv-as="&quot;{{ __('bookingproduct::app.shop.products.from') }}&quot;" placeholder="{{ __('bookingproduct::app.shop.products.from') }}" data-min-date="today"/>
<input type="text" v-validate="'required|date_format:yyyy-MM-dd|before_or_equal:date_to'" name="booking[date_from]" v-model="date_from" class="form-style" data-vv-as="&quot;{{ __('bookingproduct::app.shop.products.from') }}&quot;" placeholder="{{ __('bookingproduct::app.shop.products.from') }}" ref="date_from" data-min-date="today"/>
</date>
<span class="control-error" v-if="errors.has('booking[date_from]')">@{{ errors.first('booking[date_from]') }}</span>
@ -94,7 +94,7 @@
<div class="form-group date" :class="[errors.has('booking[date_to]') ? 'has-error' : '']">
<date @onChange="dateSelected($event)">
<input type="text" v-validate="'required'" name="booking[date_to]" v-model="date_to" class="form-style" data-vv-as="&quot;{{ __('bookingproduct::app.shop.products.to') }}&quot;" placeholder="{{ __('bookingproduct::app.shop.products.to') }}"/>
<input type="text" v-validate="'required|date_format:yyyy-MM-dd|after_or_equal:date_from'" name="booking[date_to]" v-model="date_to" class="form-style" data-vv-as="&quot;{{ __('bookingproduct::app.shop.products.to') }}&quot;" placeholder="{{ __('bookingproduct::app.shop.products.to') }}" ref="date_to" data-min-date="today"/>
</date>
<span class="control-error" v-if="errors.has('booking[date_to]')">@{{ errors.first('booking[date_to]') }}</span>
@ -131,6 +131,46 @@
}
},
created: function() {
var self = this;
this.$validator.extend('after_or_equal', {
getMessage(field, val) {
return 'The "To" must be equal or after "From"';
},
validate(value, field) {
if (! self.date_from) {
return true;
}
var from = new Date(self.date_from);
var to = new Date(self.date_to);
return from <= to;
}
});
this.$validator.extend('before_or_equal', {
getMessage(field, val) {
return 'The "From must be equal or before "To"';
},
validate(value, field) {
if (! self.date_to) {
return true;
}
var from = new Date(self.date_from);
var to = new Date(self.date_to);
return from <= to;
}
});
},
methods: {
dateSelected: function(date) {
var this_this = this;

View File

@ -2,6 +2,7 @@
namespace Webkul\BookingProduct\Type;
use Illuminate\Support\Arr;
use Webkul\Attribute\Repositories\AttributeRepository;
use Webkul\Product\Repositories\ProductRepository;
use Webkul\Product\Repositories\ProductAttributeValueRepository;
@ -11,6 +12,7 @@ use Webkul\Product\Helpers\ProductImage;
use Webkul\BookingProduct\Repositories\BookingProductRepository;
use Webkul\BookingProduct\Helpers\Booking as BookingHelper;
use Webkul\Product\Type\Virtual;
use Carbon\Carbon;
class Booking extends Virtual
{
@ -128,6 +130,10 @@ class Booking extends Virtual
{
$bookingProduct = $this->getBookingProduct($this->product->id);
if (! $bookingProduct) {
return false;
}
if (in_array($bookingProduct->type, ['default', 'rental', 'table'])) {
return true;
}
@ -163,6 +169,18 @@ class Booking extends Virtual
$bookingProduct = $this->getBookingProduct($data['product_id']);
if ($bookingProduct->type == 'event') {
if (Carbon::now() > $bookingProduct->available_from && Carbon::now() > $bookingProduct->available_to) {
return trans('shop::app.checkout.cart.event.expired');
}
$filtered = Arr::where($data['booking']['qty'], function ($qty, $key) {
return $qty != 0;
});
if (! count($filtered)) {
return trans('shop::app.checkout.cart.integrity.missing_options');
}
foreach ($data['booking']['qty'] as $ticketId => $qty) {
if (! $qty) {
continue;
@ -210,7 +228,7 @@ class Booking extends Virtual
}
if (isset($options1['booking']) && isset($options2['booking'])) {
return $options1['booking'] === $options2['booking'];
return $options1['booking'] == $options2['booking'];
} elseif (! isset($options1['booking'])) {
return false;
} elseif (! isset($options2['booking'])) {

View File

@ -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;

View File

@ -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);

View File

@ -37,7 +37,7 @@ class CartRuleRepository extends Repository
/**
* CartRuleCouponRepository object
*
* @var Webkul\CartRule\Repositories\CartRuleCouponRepository
* @var \Webkul\CartRule\Repositories\CartRuleCouponRepository
*/
protected $cartRuleCouponRepository;

View File

@ -165,9 +165,9 @@ class Cart
'cart_id' => $cart->id
]));
} else {
if ($cartItem->product->getTypeInstance()->showQuantityBox() === false) {
return ['warning' => __('shop::app.checkout.cart.integrity.qty_impossible')];
}
// if ($cartItem->product->getTypeInstance()->showQuantityBox() === false) {
// return ['warning' => __('shop::app.checkout.cart.integrity.qty_impossible')];
// }
$cartItem = $this->cartItemRepository->update($cartProduct, $cartItem->id);
}
@ -368,8 +368,14 @@ class Cart
continue;
}
$found = true;
$cartItem->quantity = $newQuantity = $cartItem->quantity + $guestCartItem->quantity;
if ($cartItem->quantity > $cartItem->product->getTypeInstance()->totalQuantity()) {
$cartItem->quantity = $newQuantity = $cartItem->product->getTypeInstance()->totalQuantity();
}
if (! $this->isItemHaveQuantity($cartItem)) {
$this->cartItemRepository->delete($guestCartItem->id);
@ -387,8 +393,6 @@ class Cart
$guestCart->items->forget($key);
$this->cartItemRepository->delete($guestCartItem->id);
$found = true;
}
if (! $found) {
@ -432,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;
}
/**
@ -464,7 +467,7 @@ class Cart
if ($cart->haveStockableItems()) {
$data['shipping_address'] = $cart->shipping_address->toArray();
$data['selected_shipping_rate'] = $cart->selected_shipping_rate->toArray();
$data['selected_shipping_rate'] = $cart->selected_shipping_rate ? $cart->selected_shipping_rate->toArray() : 0.0;
}
$data['payment'] = $cart->payment->toArray();
@ -479,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
{
@ -494,7 +498,7 @@ class Cart
$this->saveAddressesWhenRequested($data, $billingAddressData, $shippingAddressData);
$this->linkAddresses($cart, $billingAddressData, $shippingAddressData);
$this->assignCustomerFields($cart);
$cart->save();
@ -567,6 +571,7 @@ class Cart
Event::dispatch('checkout.cart.collect.totals.before', $cart);
$this->calculateItemsTax();
$cart->refresh();
$cart->grand_total = $cart->base_grand_total = 0;
$cart->sub_total = $cart->base_sub_total = 0;
@ -628,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;
@ -658,6 +664,8 @@ class Cart
return;
}
Event::dispatch('checkout.cart.calculate.items.tax.before', $cart);
foreach ($cart->items()->get() as $item) {
$taxCategory = $this->taxCategoryRepository->find($item->product->tax_category_id);
@ -725,6 +733,7 @@ class Cart
$item->save();
}
Event::dispatch('checkout.cart.calculate.items.tax.after', $cart);
}
/**
@ -733,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;
@ -747,7 +756,7 @@ class Cart
*
* @return bool
*/
public function hasError()
public function hasError(): bool
{
if (! $this->getCart()) {
return true;
@ -765,7 +774,7 @@ class Cart
*
* @return bool
*/
public function isItemsHaveSufficientQuantity()
public function isItemsHaveSufficientQuantity(): bool
{
foreach ($this->getCart()->items as $item) {
if (! $this->isItemHaveQuantity($item)) {
@ -782,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);
}
@ -792,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);
@ -808,7 +817,7 @@ class Cart
*
* @return array
*/
public function prepareDataForOrder()
public function prepareDataForOrder(): array
{
$data = $this->toArray();
@ -867,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']),
@ -1025,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())
@ -1182,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]));
}
}
}

View File

@ -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,
];
});

View File

@ -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);
}
/**

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -1,6 +1,6 @@
<?php
namespace App\Console\Commands;
namespace Webkul\Core\Console\Commands;
use Illuminate\Console\Command;

View File

@ -0,0 +1,36 @@
<?php
namespace Webkul\Core\Console\Commands;
use Illuminate\Console\Command;
class ExchangeRateUpdate extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'exchange-rate:update';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Automatically updates currency exchange rates ';
/**
* Execute the console command.
*
* @return void
*/
public function handle()
{
try {
app(config('services.exchange-api.' . config('services.exchange-api.default') . '.class'))->updateRates();
} catch(\Exception $e) {
}
}
}

Some files were not shown because too many files have changed in this diff Show More