diff --git a/composer.json b/composer.json index 684fd4891..0b5a05026 100755 --- a/composer.json +++ b/composer.json @@ -9,12 +9,12 @@ "type": "project", "require": { "php": "^7.1.3", + "ext-curl": "*", + "ext-mbstring": "*", "ext-openssl": "*", "ext-pdo": "*", - "ext-mbstring": "*", - "ext-tokenizer": "*", "ext-pdo_mysql": "*", - "ext-curl": "*", + "ext-tokenizer": "*", "barryvdh/laravel-dompdf": "^0.8.0@dev", "dimsav/laravel-translatable": "^9.0", "doctrine/dbal": "^2.9@dev", @@ -29,7 +29,8 @@ "maatwebsite/excel": "3.1.x-dev", "nwidart/laravel-modules": "^3.2", "prettus/l5-repository": "^2.6", - "propaganistas/laravel-intl": "^2.0" + "propaganistas/laravel-intl": "^2.0", + "tymon/jwt-auth": "dev-develop" }, "require-dev": { "barryvdh/laravel-debugbar": "^3.1", diff --git a/config/auth.php b/config/auth.php index caa89e114..6b8c92e4b 100755 --- a/config/auth.php +++ b/config/auth.php @@ -13,7 +13,7 @@ return [ ], 'api' => [ - 'driver' => 'token', + 'driver' => 'jwt', 'provider' => 'customers', ], diff --git a/config/debugbar.php b/config/debugbar.php index c7c9ceee3..0d8a281ba 100755 --- a/config/debugbar.php +++ b/config/debugbar.php @@ -9,14 +9,14 @@ return [ | | Debugbar is enabled by default, when debug is set to true in app.php. | You can override the value by setting enable to true or false instead of null. - | + | | You can provide an array of URI's that must be ignored (eg. 'api/*') | */ 'enabled' => env('DEBUGBAR_ENABLED', null), 'except' => [ - 'telescope*' + // ], /* @@ -79,7 +79,7 @@ return [ | */ 'error_handler' => false, - + /* |-------------------------------------------------------------------------- | Clockwork integration @@ -198,4 +198,4 @@ return [ | To override default domain, specify it as a non-empty value. */ 'route_domain' => null, -]; +]; \ No newline at end of file diff --git a/config/excel.php b/config/excel.php index af3e8bb99..28cf95fd1 100755 --- a/config/excel.php +++ b/config/excel.php @@ -109,4 +109,4 @@ return [ */ 'pdf' => Excel::DOMPDF, ], -]; +]; \ No newline at end of file diff --git a/config/jwt.php b/config/jwt.php new file mode 100644 index 000000000..8b7843b6b --- /dev/null +++ b/config/jwt.php @@ -0,0 +1,304 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return [ + + /* + |-------------------------------------------------------------------------- + | JWT Authentication Secret + |-------------------------------------------------------------------------- + | + | Don't forget to set this in your .env file, as it will be used to sign + | your tokens. A helper command is provided for this: + | `php artisan jwt:secret` + | + | Note: This will be used for Symmetric algorithms only (HMAC), + | since RSA and ECDSA use a private/public key combo (See below). + | + */ + + 'secret' => env('JWT_SECRET'), + + /* + |-------------------------------------------------------------------------- + | JWT Authentication Keys + |-------------------------------------------------------------------------- + | + | The algorithm you are using, will determine whether your tokens are + | signed with a random string (defined in `JWT_SECRET`) or using the + | following public & private keys. + | + | Symmetric Algorithms: + | HS256, HS384 & HS512 will use `JWT_SECRET`. + | + | Asymmetric Algorithms: + | RS256, RS384 & RS512 / ES256, ES384 & ES512 will use the keys below. + | + */ + + 'keys' => [ + + /* + |-------------------------------------------------------------------------- + | Public Key + |-------------------------------------------------------------------------- + | + | A path or resource to your public key. + | + | E.g. 'file://path/to/public/key' + | + */ + + 'public' => env('JWT_PUBLIC_KEY'), + + /* + |-------------------------------------------------------------------------- + | Private Key + |-------------------------------------------------------------------------- + | + | A path or resource to your private key. + | + | E.g. 'file://path/to/private/key' + | + */ + + 'private' => env('JWT_PRIVATE_KEY'), + + /* + |-------------------------------------------------------------------------- + | Passphrase + |-------------------------------------------------------------------------- + | + | The passphrase for your private key. Can be null if none set. + | + */ + + 'passphrase' => env('JWT_PASSPHRASE'), + + ], + + /* + |-------------------------------------------------------------------------- + | JWT time to live + |-------------------------------------------------------------------------- + | + | Specify the length of time (in minutes) that the token will be valid for. + | Defaults to 1 hour. + | + | You can also set this to null, to yield a never expiring token. + | Some people may want this behaviour for e.g. a mobile app. + | This is not particularly recommended, so make sure you have appropriate + | systems in place to revoke the token if necessary. + | Notice: If you set this to null you should remove 'exp' element from 'required_claims' list. + | + */ + + 'ttl' => env('JWT_TTL', 60), + + /* + |-------------------------------------------------------------------------- + | Refresh time to live + |-------------------------------------------------------------------------- + | + | Specify the length of time (in minutes) that the token can be refreshed + | within. I.E. The user can refresh their token within a 2 week window of + | the original token being created until they must re-authenticate. + | Defaults to 2 weeks. + | + | You can also set this to null, to yield an infinite refresh time. + | Some may want this instead of never expiring tokens for e.g. a mobile app. + | This is not particularly recommended, so make sure you have appropriate + | systems in place to revoke the token if necessary. + | + */ + + 'refresh_ttl' => env('JWT_REFRESH_TTL', 20160), + + /* + |-------------------------------------------------------------------------- + | JWT hashing algorithm + |-------------------------------------------------------------------------- + | + | Specify the hashing algorithm that will be used to sign the token. + | + | See here: https://github.com/namshi/jose/tree/master/src/Namshi/JOSE/Signer/OpenSSL + | for possible values. + | + */ + + 'algo' => env('JWT_ALGO', 'HS256'), + + /* + |-------------------------------------------------------------------------- + | Required Claims + |-------------------------------------------------------------------------- + | + | Specify the required claims that must exist in any token. + | A TokenInvalidException will be thrown if any of these claims are not + | present in the payload. + | + */ + + 'required_claims' => [ + 'iss', + 'iat', + 'exp', + 'nbf', + 'sub', + 'jti', + ], + + /* + |-------------------------------------------------------------------------- + | Persistent Claims + |-------------------------------------------------------------------------- + | + | Specify the claim keys to be persisted when refreshing a token. + | `sub` and `iat` will automatically be persisted, in + | addition to the these claims. + | + | Note: If a claim does not exist then it will be ignored. + | + */ + + 'persistent_claims' => [ + // 'foo', + // 'bar', + ], + + /* + |-------------------------------------------------------------------------- + | Lock Subject + |-------------------------------------------------------------------------- + | + | This will determine whether a `prv` claim is automatically added to + | the token. The purpose of this is to ensure that if you have multiple + | authentication models e.g. `App\User` & `App\OtherPerson`, then we + | should prevent one authentication request from impersonating another, + | if 2 tokens happen to have the same id across the 2 different models. + | + | Under specific circumstances, you may want to disable this behaviour + | e.g. if you only have one authentication model, then you would save + | a little on token size. + | + */ + + 'lock_subject' => true, + + /* + |-------------------------------------------------------------------------- + | Leeway + |-------------------------------------------------------------------------- + | + | This property gives the jwt timestamp claims some "leeway". + | Meaning that if you have any unavoidable slight clock skew on + | any of your servers then this will afford you some level of cushioning. + | + | This applies to the claims `iat`, `nbf` and `exp`. + | + | Specify in seconds - only if you know you need it. + | + */ + + 'leeway' => env('JWT_LEEWAY', 0), + + /* + |-------------------------------------------------------------------------- + | Blacklist Enabled + |-------------------------------------------------------------------------- + | + | In order to invalidate tokens, you must have the blacklist enabled. + | If you do not want or need this functionality, then set this to false. + | + */ + + 'blacklist_enabled' => env('JWT_BLACKLIST_ENABLED', true), + + /* + | ------------------------------------------------------------------------- + | Blacklist Grace Period + | ------------------------------------------------------------------------- + | + | When multiple concurrent requests are made with the same JWT, + | it is possible that some of them fail, due to token regeneration + | on every request. + | + | Set grace period in seconds to prevent parallel request failure. + | + */ + + 'blacklist_grace_period' => env('JWT_BLACKLIST_GRACE_PERIOD', 0), + + /* + |-------------------------------------------------------------------------- + | Cookies encryption + |-------------------------------------------------------------------------- + | + | By default Laravel encrypt cookies for security reason. + | If you decide to not decrypt cookies, you will have to configure Laravel + | to not encrypt your cookie token by adding its name into the $except + | array available in the middleware "EncryptCookies" provided by Laravel. + | see https://laravel.com/docs/master/responses#cookies-and-encryption + | for details. + | + | Set it to true if you want to decrypt cookies. + | + */ + + 'decrypt_cookies' => false, + + /* + |-------------------------------------------------------------------------- + | Providers + |-------------------------------------------------------------------------- + | + | Specify the various providers used throughout the package. + | + */ + + 'providers' => [ + + /* + |-------------------------------------------------------------------------- + | JWT Provider + |-------------------------------------------------------------------------- + | + | Specify the provider that is used to create and decode the tokens. + | + */ + + 'jwt' => Tymon\JWTAuth\Providers\JWT\Lcobucci::class, + + /* + |-------------------------------------------------------------------------- + | Authentication Provider + |-------------------------------------------------------------------------- + | + | Specify the provider that is used to authenticate users. + | + */ + + 'auth' => Tymon\JWTAuth\Providers\Auth\Illuminate::class, + + /* + |-------------------------------------------------------------------------- + | Storage Provider + |-------------------------------------------------------------------------- + | + | Specify the provider that is used to store tokens in the blacklist. + | + */ + + 'storage' => Tymon\JWTAuth\Providers\Storage\Illuminate::class, + + ], + +]; diff --git a/config/tinker.php b/config/tinker.php index 181f0fdbd..2405c8b0a 100755 --- a/config/tinker.php +++ b/config/tinker.php @@ -2,21 +2,6 @@ return [ - /* - |-------------------------------------------------------------------------- - | Console Commands - |-------------------------------------------------------------------------- - | - | This option allows you to add additional Artisan commands that should - | be available within the Tinker environment. Once the command is in - | this array you may execute the command in Tinker using its name. - | - */ - - 'commands' => [ - // App\Console\Commands\ExampleCommand::class, - ], - /* |-------------------------------------------------------------------------- | Alias Blacklist @@ -30,4 +15,4 @@ return [ 'dont_alias' => [], -]; +]; \ No newline at end of file diff --git a/config/translatable.php b/config/translatable.php index 17bf04aac..1ef910d3e 100755 --- a/config/translatable.php +++ b/config/translatable.php @@ -54,7 +54,7 @@ return [ | $useTranslationFallback when defined | */ - 'use_fallback' => true, + 'use_fallback' => false, /* |-------------------------------------------------------------------------- @@ -113,4 +113,4 @@ return [ | */ 'to_array_always_loads_translations' => true, -]; \ No newline at end of file +]; diff --git a/config/trustedproxy.php b/config/trustedproxy.php index acda8d51a..6f8257058 100755 --- a/config/trustedproxy.php +++ b/config/trustedproxy.php @@ -31,15 +31,15 @@ return [ /* * Which headers to use to detect proxy related data (For, Host, Proto, Port) - * + * * Options include: - * + * * - Illuminate\Http\Request::HEADER_X_FORWARDED_ALL (use all x-forwarded-* headers to establish trust) * - Illuminate\Http\Request::HEADER_FORWARDED (use the FORWARDED header to establish trust) - * + * * @link https://symfony.com/doc/current/deployment/proxies.html */ 'headers' => Illuminate\Http\Request::HEADER_X_FORWARDED_ALL, - -]; + +]; \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Config/acl.php b/packages/Webkul/Admin/src/Config/acl.php index 56cc3663e..86805a05d 100755 --- a/packages/Webkul/Admin/src/Config/acl.php +++ b/packages/Webkul/Admin/src/Config/acl.php @@ -36,41 +36,81 @@ return [ 'name' => 'admin::app.acl.products', 'route' => 'admin.catalog.products.index', 'sort' => 1 + ], [ + 'key' => 'catalog.products.create', + 'name' => 'admin::app.acl.create', + 'route' => 'admin.catalog.products.create', + 'sort' => 1 ], [ 'key' => 'catalog.products.edit', 'name' => 'admin::app.acl.edit', 'route' => 'admin.catalog.products.edit', - 'sort' => 1 + 'sort' => 2 + ], [ + 'key' => 'catalog.products.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.catalog.products.delete', + 'sort' => 3 ], [ 'key' => 'catalog.categories', 'name' => 'admin::app.acl.categories', 'route' => 'admin.catalog.categories.index', 'sort' => 2 + ], [ + 'key' => 'catalog.categories.create', + 'name' => 'admin::app.acl.create', + 'route' => 'admin.catalog.categories.create', + 'sort' => 1 ], [ 'key' => 'catalog.categories.edit', 'name' => 'admin::app.acl.edit', 'route' => 'admin.catalog.categories.edit', 'sort' => 2 + ], [ + 'key' => 'catalog.categories.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.catalog.categories.delete', + 'sort' => 3 ], [ 'key' => 'catalog.attributes', 'name' => 'admin::app.acl.attributes', 'route' => 'admin.catalog.attributes.index', 'sort' => 3 + ], [ + 'key' => 'catalog.attributes.create', + 'name' => 'admin::app.acl.create', + 'route' => 'admin.catalog.attributes.create', + 'sort' => 1 ], [ 'key' => 'catalog.attributes.edit', 'name' => 'admin::app.acl.edit', 'route' => 'admin.catalog.attributes.edit', + 'sort' => 2 + ], [ + 'key' => 'catalog.attributes.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.catalog.attributes.delete', 'sort' => 3 ], [ 'key' => 'catalog.families', 'name' => 'admin::app.acl.attribute-families', 'route' => 'admin.catalog.families.index', 'sort' => 4 + ], [ + 'key' => 'catalog.families.create', + 'name' => 'admin::app.acl.create', + 'route' => 'admin.catalog.families.create', + 'sort' => 1 ], [ 'key' => 'catalog.families.edit', 'name' => 'admin::app.acl.edit', 'route' => 'admin.catalog.families.edit', - 'sort' => 4 + 'sort' => 2 + ], [ + 'key' => 'catalog.families.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.catalog.families.delete', + 'sort' => 3 ], [ 'key' => 'customers', 'name' => 'admin::app.acl.customers', @@ -81,21 +121,41 @@ return [ 'name' => 'admin::app.acl.customers', 'route' => 'admin.customer.index', 'sort' => 1 + ], [ + 'key' => 'customers.customers.create', + 'name' => 'admin::app.acl.create', + 'route' => 'admin.customer.create', + 'sort' => 1 ], [ 'key' => 'customers.customers.edit', 'name' => 'admin::app.acl.edit', 'route' => 'admin.customer.edit', - 'sort' => 1 + 'sort' => 2 + ], [ + 'key' => 'customers.customers.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.customer.delete', + 'sort' => 3 ], [ 'key' => 'customers.groups', 'name' => 'admin::app.acl.groups', 'route' => 'admin.groups.index', 'sort' => 2 + ], [ + 'key' => 'customers.groups.create', + 'name' => 'admin::app.acl.create', + 'route' => 'admin.groups.create', + 'sort' => 1 ], [ 'key' => 'customers.groups.edit', 'name' => 'admin::app.acl.edit', 'route' => 'admin.groups.edit', 'sort' => 2 + ], [ + 'key' => 'customers.groups.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.groups.delete', + 'sort' => 3 ], [ 'key' => 'customers.reviews', 'name' => 'admin::app.acl.reviews', @@ -105,7 +165,12 @@ return [ 'key' => 'customers.reviews.edit', 'name' => 'admin::app.acl.edit', 'route' => 'admin.customer.review.edit', - 'sort' => 3 + 'sort' => 1 + ], [ + 'key' => 'customers.reviews.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.customer.review.delete', + 'sort' => 2 ], [ 'key' => 'configuration', 'name' => 'admin::app.acl.configure', @@ -121,51 +186,101 @@ return [ 'name' => 'admin::app.acl.locales', 'route' => 'admin.locales.index', 'sort' => 1 + ], [ + 'key' => 'settings.locales.create', + 'name' => 'admin::app.acl.create', + 'route' => 'admin.locales.create', + 'sort' => 1 ], [ 'key' => 'settings.locales.edit', 'name' => 'admin::app.acl.edit', 'route' => 'admin.locales.edit', - 'sort' => 1 + 'sort' => 2 + ], [ + 'key' => 'settings.locales.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.locales.delete', + 'sort' => 3 ], [ 'key' => 'settings.currencies', 'name' => 'admin::app.acl.currencies', 'route' => 'admin.currencies.index', 'sort' => 2 + ], [ + 'key' => 'settings.currencies.create', + 'name' => 'admin::app.acl.create', + 'route' => 'admin.currencies.create', + 'sort' => 1 ], [ 'key' => 'settings.currencies.edit', 'name' => 'admin::app.acl.edit', 'route' => 'admin.currencies.edit', 'sort' => 2 + ], [ + 'key' => 'settings.currencies.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.currencies.delete', + 'sort' => 3 ], [ 'key' => 'settings.exchange_rates', 'name' => 'admin::app.acl.exchange-rates', 'route' => 'admin.exchange_rates.index', 'sort' => 3 + ], [ + 'key' => 'settings.exchange_rates.create', + 'name' => 'admin::app.acl.create', + 'route' => 'admin.exchange_rates.create', + 'sort' => 1 ], [ 'key' => 'settings.exchange_rates.edit', 'name' => 'admin::app.acl.edit', 'route' => 'admin.exchange_rates.edit', + 'sort' => 2 + ], [ + 'key' => 'settings.exchange_rates.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.exchange_rates.delete', 'sort' => 3 ], [ 'key' => 'settings.inventory_sources', 'name' => 'admin::app.acl.inventory-sources', 'route' => 'admin.inventory_sources.index', 'sort' => 4 + ], [ + 'key' => 'settings.inventory_sources.create', + 'name' => 'admin::app.acl.create', + 'route' => 'admin.inventory_sources.create', + 'sort' => 1 ], [ 'key' => 'settings.inventory_sources.edit', 'name' => 'admin::app.acl.edit', 'route' => 'admin.inventory_sources.edit', - 'sort' => 4 + 'sort' => 2 + ], [ + 'key' => 'settings.inventory_sources.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.inventory_sources.delete', + 'sort' => 3 ], [ 'key' => 'settings.channels', 'name' => 'admin::app.acl.channels', 'route' => 'admin.channels.index', 'sort' => 5 + ], [ + 'key' => 'settings.channels.create', + 'name' => 'admin::app.acl.create', + 'route' => 'admin.channels.create', + 'sort' => 1 ], [ 'key' => 'settings.channels.edit', 'name' => 'admin::app.acl.edit', 'route' => 'admin.channels.edit', - 'sort' => 5 + 'sort' => 2 + ], [ + 'key' => 'settings.channels.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.channels.delete', + 'sort' => 3 ], [ 'key' => 'settings.users', 'name' => 'admin::app.acl.users', @@ -176,31 +291,61 @@ return [ 'name' => 'admin::app.acl.users', 'route' => 'admin.users.index', 'sort' => 1 + ], [ + 'key' => 'settings.users.users.create', + 'name' => 'admin::app.acl.create', + 'route' => 'admin.users.create', + 'sort' => 1 ], [ 'key' => 'settings.users.users.edit', 'name' => 'admin::app.acl.edit', 'route' => 'admin.users.edit', - 'sort' => 1 + 'sort' => 2 + ], [ + 'key' => 'settings.users.users.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.users.delete', + 'sort' => 3 ], [ 'key' => 'settings.users.roles', 'name' => 'admin::app.acl.roles', 'route' => 'admin.roles.index', + 'sort' => 2 + ], [ + 'key' => 'settings.users.roles.create', + 'name' => 'admin::app.acl.create', + 'route' => 'admin.roles.create', 'sort' => 1 ], [ 'key' => 'settings.users.roles.edit', 'name' => 'admin::app.acl.edit', 'route' => 'admin.roles.edit', - 'sort' => 1 + 'sort' => 2 + ], [ + 'key' => 'settings.users.roles.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.roles.delete', + 'sort' => 3 ], [ 'key' => 'settings.sliders', 'name' => 'admin::app.acl.sliders', 'route' => 'admin.sliders.index', 'sort' => 7 + ], [ + 'key' => 'settings.sliders.create', + 'name' => 'admin::app.acl.create', + 'route' => 'admin.sliders.create', + 'sort' => 1 ], [ 'key' => 'settings.sliders.edit', 'name' => 'admin::app.acl.edit', 'route' => 'admin.sliders.edit', - 'sort' => 1 + 'sort' => 2 + ], [ + 'key' => 'settings.sliders.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.sliders.delete', + 'sort' => 3 ], [ 'key' => 'settings.taxes', 'name' => 'admin::app.acl.taxes', @@ -211,21 +356,41 @@ return [ 'name' => 'admin::app.acl.tax-categories', 'route' => 'admin.tax-categories.index', 'sort' => 1 + ], [ + 'key' => 'settings.taxes.tax-categories.create', + 'name' => 'admin::app.acl.create', + 'route' => 'admin.tax-categories.create', + 'sort' => 1 ], [ 'key' => 'settings.taxes.tax-categories.edit', 'name' => 'admin::app.acl.edit', 'route' => 'admin.tax-categories.edit', - 'sort' => 1 + 'sort' => 2 + ], [ + 'key' => 'settings.taxes.tax-categories.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.tax-categories.delete', + 'sort' => 3 ], [ 'key' => 'settings.taxes.tax-rates', 'name' => 'admin::app.acl.tax-rates', 'route' => 'admin.tax-rates.index', + 'sort' => 2 + ], [ + 'key' => 'settings.taxes.tax-rates.create', + 'name' => 'admin::app.acl.create', + 'route' => 'admin.tax-rates.create', 'sort' => 1 ], [ 'key' => 'settings.taxes.tax-rates.edit', 'name' => 'admin::app.acl.edit', 'route' => 'admin.tax-rates.edit', - 'sort' => 1 + 'sort' => 2 + ], [ + 'key' => 'settings.taxes.tax-rates.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.tax-rates.delete', + 'sort' => 3 ] ]; diff --git a/packages/Webkul/Admin/src/Listeners/Order.php b/packages/Webkul/Admin/src/Listeners/Order.php index 377b4fbdd..bd4df32cc 100755 --- a/packages/Webkul/Admin/src/Listeners/Order.php +++ b/packages/Webkul/Admin/src/Listeners/Order.php @@ -6,6 +6,7 @@ use Illuminate\Support\Facades\Mail; use Webkul\Admin\Mail\NewOrderNotification; use Webkul\Admin\Mail\NewInvoiceNotification; use Webkul\Admin\Mail\NewShipmentNotification; +use Webkul\Admin\Mail\NewInventorySourceNotification; /** * Order event handler @@ -18,7 +19,7 @@ class Order { /** * @param mixed $order * - * Send new order confirmation mail to the customer + * Send new shipment mail to the customer and inventory source */ public function sendNewOrderMail($order) { @@ -52,6 +53,8 @@ class Order { { try { Mail::send(new NewShipmentNotification($shipment)); + + Mail::send(new NewInventorySourceNotification($shipment)); } catch (\Exception $e) { } diff --git a/packages/Webkul/Admin/src/Mail/NewInventorySourceNotification.php b/packages/Webkul/Admin/src/Mail/NewInventorySourceNotification.php new file mode 100644 index 000000000..7fda9cd25 --- /dev/null +++ b/packages/Webkul/Admin/src/Mail/NewInventorySourceNotification.php @@ -0,0 +1,51 @@ + + * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com) + */ +class NewInventorySourceNotification extends Mailable +{ + use Queueable, SerializesModels; + + /** + * The shipment instance. + * + * @var Shipment + */ + public $shipment; + + /** + * Create a new message instance. + * + * @param mixed $shipment + * @return void + */ + public function __construct($shipment) + { + $this->shipment = $shipment; + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { $order = $this->shipment->order; + $inventory = $this->shipment->inventory_source; + + return $this->to($inventory->contact_email, $inventory->name) + ->subject(trans('shop::app.mail.shipment.subject', ['order_id' => $order->id])) + ->view('shop::emails.sales.new-inventorysource-shipment'); + } +} diff --git a/packages/Webkul/Admin/src/Resources/lang/ar/app.php b/packages/Webkul/Admin/src/Resources/lang/ar/app.php index 5d2530121..47e83ea0f 100644 --- a/packages/Webkul/Admin/src/Resources/lang/ar/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/ar/app.php @@ -69,6 +69,8 @@ return [ 'tax-categories' => 'فئات الضرائب', 'tax-rates' => 'المعدلات الضريبية', 'edit' => 'Edit', + 'create' => 'Add', + 'delete' => 'Delete', ], 'dashboard' => [ 'title' => 'لوحة العدادات', diff --git a/packages/Webkul/Admin/src/Resources/lang/en/app.php b/packages/Webkul/Admin/src/Resources/lang/en/app.php index b048c62f9..eee6217bc 100755 --- a/packages/Webkul/Admin/src/Resources/lang/en/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/en/app.php @@ -71,6 +71,8 @@ return [ 'tax-categories' => 'Tax Categories', 'tax-rates' => 'Tax Rates', 'edit' => 'Edit', + 'create' => 'Add', + 'delete' => 'Delete', ], 'dashboard' => [ diff --git a/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php b/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php index 3987989f7..f4a87ce6d 100755 --- a/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php @@ -71,6 +71,8 @@ return [ 'tax-categories' => 'Categorias de Impostos', 'tax-rates' => 'Impostos de Impostos', 'edit' => 'Edit', + 'create' => 'Add', + 'delete' => 'Delete', ], 'dashboard' => [ diff --git a/packages/Webkul/Admin/src/Resources/views/catalog/products/field-types/multiselect.blade.php b/packages/Webkul/Admin/src/Resources/views/catalog/products/field-types/multiselect.blade.php index f05e1be55..6d2ce65f8 100755 --- a/packages/Webkul/Admin/src/Resources/views/catalog/products/field-types/multiselect.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/catalog/products/field-types/multiselect.blade.php @@ -1,7 +1,7 @@