diff --git a/.env b/.env index a54d6c9..9d3df80 100644 --- a/.env +++ b/.env @@ -5,17 +5,24 @@ APP_DEBUG=true APP_URL=https://partner.gruene-seele.test APP_API_DOMAIN=partner.gruene-seele.test APP_DOMAIN=partner.gruene-seele.test + APP_PROMO_URL=https://testemich.test APP_PROMO_DOMAIN=testemich.test +APP_SHOP_URL=https://grueneseele.test +APP_SHOP_DOMAIN=grueneseele.test + APP_CHECKOUT_MAIL=register@adametz.media APP_CHECKOUT_TEST_MAIL=register@adametz.media APP_INFO_MAIL=register@adametz.media APP_INFO_TEST_MAIL=register@adametz.media +EXCEPTION_MAIL=exception@adametz.media APP_MAIN_TAX = 1.19 APP_MAIN_TAX_RATE = 19 +APP_MAIN_USER_ID = 2 + LOG_CHANNEL=stack LOG_LEVEL=debug @@ -46,15 +53,25 @@ REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 -MAIL_MAILER=smtp -MAIL_HOST=s182.goserver.host +MAIL_DRIVER=smtp +MAIL_HOST=w017f6e4.kasserver.com MAIL_PORT=587 -MAIL_USERNAME=web28p3 -MAIL_PASSWORD=WeE2bmI9GjB7pDgi -MAIL_ENCRYPTION="" +MAIL_USERNAME=m04a9fbc +MAIL_PASSWORD=3tQ72oCHZgncCTpK +MAIL_ENCRYPTION=null + +#MAIL_MAILER=smtp +#MAIL_HOST=s182.goserver.host +#MAIL_PORT=587 +#MAIL_USERNAME=web28p3 +#MAIL_PASSWORD=WeE2bmI9GjB7pDgi +#MAIL_ENCRYPTION="" MAIL_FROM_ADDRESS=partner@gruene-seele.bio MAIL_FROM_NAME="GRÜNE SEELE Naturkosmetik" +RECAPTCHA_SITE_KEY="6LcGr_kqAAAAAOnz-L6IIBC_fTzJ7siTheZgFVMY" +RECAPTCHA_SECRET_KEY="6LcGr_kqAAAAAKBZVoy37ski0Gl54jenWOlrbc9z" + PAYPAL_MODE=sandbox PAYPAL_SANDBOX_CLIENT_ID=AWMeW59cMOHaMWfv44kIMnzaR81Qo4yNVzEC5LyWl7x5RjkJZOJmvbvljqWPNEw7GihF3FLRL_tEJPHo PAYPAL_SANDBOX_CLIENT_SECRET=EFOuvQJpx3lM2HjLjPURgcxKuGLtKxNHKZqx65uQpQ8WNLDvijHhb79X5oE22LKIwW5V0GdX09jI24bF diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php new file mode 100644 index 0000000..69e0c55 --- /dev/null +++ b/.php-cs-fixer.php @@ -0,0 +1,39 @@ +in([ + __DIR__ . '/app', + __DIR__ . '/config', + __DIR__ . '/database', + __DIR__ . '/resources', + __DIR__ . '/routes', + __DIR__ . '/tests', + ]) + ->name('*.php') + ->notName('*.blade.php') + ->ignoreDotFiles(true) + ->ignoreVCS(true); + +return (new PhpCsFixer\Config()) + ->setRules([ + '@PSR2' => true, + 'array_syntax' => ['syntax' => 'short'], + 'ordered_imports' => ['sort_algorithm' => 'alpha'], + 'no_unused_imports' => true, + 'not_operator_with_successor_space' => true, + 'trailing_comma_in_multiline' => true, + 'phpdoc_scalar' => true, + 'unary_operator_spaces' => true, + 'binary_operator_spaces' => true, + 'blank_line_before_statement' => [ + 'statements' => ['break', 'continue', 'declare', 'return', 'throw', 'try'], + ], + 'phpdoc_single_line_var_spacing' => true, + 'phpdoc_var_without_name' => true, + 'method_argument_space' => [ + 'on_multiline' => 'ensure_fully_multiline', + 'keep_multiple_spaces_after_comma' => true, + ], + 'single_trait_insert_per_statement' => true, + ]) + ->setFinder($finder); diff --git a/.phpstorm.meta.php b/.phpstorm.meta.php index 388e300..81cc317 100644 --- a/.phpstorm.meta.php +++ b/.phpstorm.meta.php @@ -20,8 +20,10 @@ namespace PHPSTORM_META { 'Facade\Ignition\DumpRecorder\MultiDumpHandler' => \Facade\Ignition\DumpRecorder\MultiDumpHandler::class, 'Facade\Ignition\ErrorPage\Renderer' => \Facade\Ignition\ErrorPage\Renderer::class, 'Facade\Ignition\IgnitionConfig' => \Facade\Ignition\IgnitionConfig::class, + 'Facade\Ignition\JobRecorder\JobRecorder' => \Facade\Ignition\JobRecorder\JobRecorder::class, 'Facade\Ignition\LogRecorder\LogRecorder' => \Facade\Ignition\LogRecorder\LogRecorder::class, 'Facade\Ignition\QueryRecorder\QueryRecorder' => \Facade\Ignition\QueryRecorder\QueryRecorder::class, + 'Facade\Ignition\Support\SentReports' => \Facade\Ignition\Support\SentReports::class, 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, @@ -29,6 +31,7 @@ namespace PHPSTORM_META { 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, @@ -42,6 +45,7 @@ namespace PHPSTORM_META { 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -49,9 +53,17 @@ namespace PHPSTORM_META { 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laracasts\Flash\SessionStore' => \Laracasts\Flash\LaravelSessionStore::class, 'Laravel\Passport\ClientRepository' => \Laravel\Passport\ClientRepository::class, - 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Parser::class, + 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Token\Parser::class, + 'League\OAuth2\Server\AuthorizationServer' => \League\OAuth2\Server\AuthorizationServer::class, + 'League\OAuth2\Server\ResourceServer' => \League\OAuth2\Server\ResourceServer::class, + 'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class, + 'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class, + 'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class, + 'Maatwebsite\Excel\Transactions\TransactionHandler' => \Maatwebsite\Excel\Transactions\DbTransactionHandler::class, + 'Maatwebsite\Excel\Transactions\TransactionManager' => \Maatwebsite\Excel\Transactions\TransactionManager::class, 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, @@ -64,7 +76,6 @@ namespace PHPSTORM_META { 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, 'cache' => \Illuminate\Cache\CacheManager::class, 'cache.store' => \Illuminate\Cache\Repository::class, - 'cart' => \Gloudemans\Shoppingcart\Cart::class, 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, @@ -77,6 +88,7 @@ namespace PHPSTORM_META { 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, @@ -124,7 +136,9 @@ namespace PHPSTORM_META { 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, @@ -162,6 +176,7 @@ namespace PHPSTORM_META { 'dompdf.wrapper' => \Barryvdh\DomPDF\PDF::class, 'encrypter' => \Illuminate\Encryption\Encrypter::class, 'events' => \Illuminate\Events\Dispatcher::class, + 'excel' => \Maatwebsite\Excel\Excel::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, @@ -180,6 +195,7 @@ namespace PHPSTORM_META { 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'paypal_client' => \Srmklive\PayPal\Services\PayPal::class, 'profanityFilter' => \Askedio\Laravel5ProfanityFilter\ProfanityFilter::class, 'queue' => \Illuminate\Queue\QueueManager::class, 'queue.connection' => \Illuminate\Queue\SyncQueue::class, @@ -210,8 +226,10 @@ namespace PHPSTORM_META { 'Facade\Ignition\DumpRecorder\MultiDumpHandler' => \Facade\Ignition\DumpRecorder\MultiDumpHandler::class, 'Facade\Ignition\ErrorPage\Renderer' => \Facade\Ignition\ErrorPage\Renderer::class, 'Facade\Ignition\IgnitionConfig' => \Facade\Ignition\IgnitionConfig::class, + 'Facade\Ignition\JobRecorder\JobRecorder' => \Facade\Ignition\JobRecorder\JobRecorder::class, 'Facade\Ignition\LogRecorder\LogRecorder' => \Facade\Ignition\LogRecorder\LogRecorder::class, 'Facade\Ignition\QueryRecorder\QueryRecorder' => \Facade\Ignition\QueryRecorder\QueryRecorder::class, + 'Facade\Ignition\Support\SentReports' => \Facade\Ignition\Support\SentReports::class, 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, @@ -219,6 +237,7 @@ namespace PHPSTORM_META { 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, @@ -232,6 +251,7 @@ namespace PHPSTORM_META { 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -239,9 +259,17 @@ namespace PHPSTORM_META { 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laracasts\Flash\SessionStore' => \Laracasts\Flash\LaravelSessionStore::class, 'Laravel\Passport\ClientRepository' => \Laravel\Passport\ClientRepository::class, - 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Parser::class, + 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Token\Parser::class, + 'League\OAuth2\Server\AuthorizationServer' => \League\OAuth2\Server\AuthorizationServer::class, + 'League\OAuth2\Server\ResourceServer' => \League\OAuth2\Server\ResourceServer::class, + 'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class, + 'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class, + 'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class, + 'Maatwebsite\Excel\Transactions\TransactionHandler' => \Maatwebsite\Excel\Transactions\DbTransactionHandler::class, + 'Maatwebsite\Excel\Transactions\TransactionManager' => \Maatwebsite\Excel\Transactions\TransactionManager::class, 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, @@ -254,7 +282,6 @@ namespace PHPSTORM_META { 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, 'cache' => \Illuminate\Cache\CacheManager::class, 'cache.store' => \Illuminate\Cache\Repository::class, - 'cart' => \Gloudemans\Shoppingcart\Cart::class, 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, @@ -267,6 +294,7 @@ namespace PHPSTORM_META { 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, @@ -314,7 +342,9 @@ namespace PHPSTORM_META { 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, @@ -352,6 +382,7 @@ namespace PHPSTORM_META { 'dompdf.wrapper' => \Barryvdh\DomPDF\PDF::class, 'encrypter' => \Illuminate\Encryption\Encrypter::class, 'events' => \Illuminate\Events\Dispatcher::class, + 'excel' => \Maatwebsite\Excel\Excel::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, @@ -370,6 +401,7 @@ namespace PHPSTORM_META { 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'paypal_client' => \Srmklive\PayPal\Services\PayPal::class, 'profanityFilter' => \Askedio\Laravel5ProfanityFilter\ProfanityFilter::class, 'queue' => \Illuminate\Queue\QueueManager::class, 'queue.connection' => \Illuminate\Queue\SyncQueue::class, @@ -400,8 +432,10 @@ namespace PHPSTORM_META { 'Facade\Ignition\DumpRecorder\MultiDumpHandler' => \Facade\Ignition\DumpRecorder\MultiDumpHandler::class, 'Facade\Ignition\ErrorPage\Renderer' => \Facade\Ignition\ErrorPage\Renderer::class, 'Facade\Ignition\IgnitionConfig' => \Facade\Ignition\IgnitionConfig::class, + 'Facade\Ignition\JobRecorder\JobRecorder' => \Facade\Ignition\JobRecorder\JobRecorder::class, 'Facade\Ignition\LogRecorder\LogRecorder' => \Facade\Ignition\LogRecorder\LogRecorder::class, 'Facade\Ignition\QueryRecorder\QueryRecorder' => \Facade\Ignition\QueryRecorder\QueryRecorder::class, + 'Facade\Ignition\Support\SentReports' => \Facade\Ignition\Support\SentReports::class, 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, @@ -409,6 +443,7 @@ namespace PHPSTORM_META { 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, @@ -422,6 +457,7 @@ namespace PHPSTORM_META { 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -429,9 +465,17 @@ namespace PHPSTORM_META { 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laracasts\Flash\SessionStore' => \Laracasts\Flash\LaravelSessionStore::class, 'Laravel\Passport\ClientRepository' => \Laravel\Passport\ClientRepository::class, - 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Parser::class, + 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Token\Parser::class, + 'League\OAuth2\Server\AuthorizationServer' => \League\OAuth2\Server\AuthorizationServer::class, + 'League\OAuth2\Server\ResourceServer' => \League\OAuth2\Server\ResourceServer::class, + 'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class, + 'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class, + 'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class, + 'Maatwebsite\Excel\Transactions\TransactionHandler' => \Maatwebsite\Excel\Transactions\DbTransactionHandler::class, + 'Maatwebsite\Excel\Transactions\TransactionManager' => \Maatwebsite\Excel\Transactions\TransactionManager::class, 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, @@ -444,7 +488,6 @@ namespace PHPSTORM_META { 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, 'cache' => \Illuminate\Cache\CacheManager::class, 'cache.store' => \Illuminate\Cache\Repository::class, - 'cart' => \Gloudemans\Shoppingcart\Cart::class, 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, @@ -457,6 +500,7 @@ namespace PHPSTORM_META { 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, @@ -504,7 +548,9 @@ namespace PHPSTORM_META { 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, @@ -542,6 +588,7 @@ namespace PHPSTORM_META { 'dompdf.wrapper' => \Barryvdh\DomPDF\PDF::class, 'encrypter' => \Illuminate\Encryption\Encrypter::class, 'events' => \Illuminate\Events\Dispatcher::class, + 'excel' => \Maatwebsite\Excel\Excel::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, @@ -560,6 +607,7 @@ namespace PHPSTORM_META { 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'paypal_client' => \Srmklive\PayPal\Services\PayPal::class, 'profanityFilter' => \Askedio\Laravel5ProfanityFilter\ProfanityFilter::class, 'queue' => \Illuminate\Queue\QueueManager::class, 'queue.connection' => \Illuminate\Queue\SyncQueue::class, @@ -590,8 +638,10 @@ namespace PHPSTORM_META { 'Facade\Ignition\DumpRecorder\MultiDumpHandler' => \Facade\Ignition\DumpRecorder\MultiDumpHandler::class, 'Facade\Ignition\ErrorPage\Renderer' => \Facade\Ignition\ErrorPage\Renderer::class, 'Facade\Ignition\IgnitionConfig' => \Facade\Ignition\IgnitionConfig::class, + 'Facade\Ignition\JobRecorder\JobRecorder' => \Facade\Ignition\JobRecorder\JobRecorder::class, 'Facade\Ignition\LogRecorder\LogRecorder' => \Facade\Ignition\LogRecorder\LogRecorder::class, 'Facade\Ignition\QueryRecorder\QueryRecorder' => \Facade\Ignition\QueryRecorder\QueryRecorder::class, + 'Facade\Ignition\Support\SentReports' => \Facade\Ignition\Support\SentReports::class, 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, @@ -599,6 +649,7 @@ namespace PHPSTORM_META { 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, @@ -612,6 +663,7 @@ namespace PHPSTORM_META { 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -619,9 +671,17 @@ namespace PHPSTORM_META { 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laracasts\Flash\SessionStore' => \Laracasts\Flash\LaravelSessionStore::class, 'Laravel\Passport\ClientRepository' => \Laravel\Passport\ClientRepository::class, - 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Parser::class, + 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Token\Parser::class, + 'League\OAuth2\Server\AuthorizationServer' => \League\OAuth2\Server\AuthorizationServer::class, + 'League\OAuth2\Server\ResourceServer' => \League\OAuth2\Server\ResourceServer::class, + 'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class, + 'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class, + 'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class, + 'Maatwebsite\Excel\Transactions\TransactionHandler' => \Maatwebsite\Excel\Transactions\DbTransactionHandler::class, + 'Maatwebsite\Excel\Transactions\TransactionManager' => \Maatwebsite\Excel\Transactions\TransactionManager::class, 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, @@ -634,7 +694,6 @@ namespace PHPSTORM_META { 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, 'cache' => \Illuminate\Cache\CacheManager::class, 'cache.store' => \Illuminate\Cache\Repository::class, - 'cart' => \Gloudemans\Shoppingcart\Cart::class, 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, @@ -647,6 +706,7 @@ namespace PHPSTORM_META { 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, @@ -694,7 +754,9 @@ namespace PHPSTORM_META { 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, @@ -732,6 +794,7 @@ namespace PHPSTORM_META { 'dompdf.wrapper' => \Barryvdh\DomPDF\PDF::class, 'encrypter' => \Illuminate\Encryption\Encrypter::class, 'events' => \Illuminate\Events\Dispatcher::class, + 'excel' => \Maatwebsite\Excel\Excel::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, @@ -750,6 +813,7 @@ namespace PHPSTORM_META { 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'paypal_client' => \Srmklive\PayPal\Services\PayPal::class, 'profanityFilter' => \Askedio\Laravel5ProfanityFilter\ProfanityFilter::class, 'queue' => \Illuminate\Queue\QueueManager::class, 'queue.connection' => \Illuminate\Queue\SyncQueue::class, @@ -780,8 +844,10 @@ namespace PHPSTORM_META { 'Facade\Ignition\DumpRecorder\MultiDumpHandler' => \Facade\Ignition\DumpRecorder\MultiDumpHandler::class, 'Facade\Ignition\ErrorPage\Renderer' => \Facade\Ignition\ErrorPage\Renderer::class, 'Facade\Ignition\IgnitionConfig' => \Facade\Ignition\IgnitionConfig::class, + 'Facade\Ignition\JobRecorder\JobRecorder' => \Facade\Ignition\JobRecorder\JobRecorder::class, 'Facade\Ignition\LogRecorder\LogRecorder' => \Facade\Ignition\LogRecorder\LogRecorder::class, 'Facade\Ignition\QueryRecorder\QueryRecorder' => \Facade\Ignition\QueryRecorder\QueryRecorder::class, + 'Facade\Ignition\Support\SentReports' => \Facade\Ignition\Support\SentReports::class, 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, @@ -789,6 +855,7 @@ namespace PHPSTORM_META { 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, @@ -802,6 +869,7 @@ namespace PHPSTORM_META { 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -809,9 +877,17 @@ namespace PHPSTORM_META { 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laracasts\Flash\SessionStore' => \Laracasts\Flash\LaravelSessionStore::class, 'Laravel\Passport\ClientRepository' => \Laravel\Passport\ClientRepository::class, - 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Parser::class, + 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Token\Parser::class, + 'League\OAuth2\Server\AuthorizationServer' => \League\OAuth2\Server\AuthorizationServer::class, + 'League\OAuth2\Server\ResourceServer' => \League\OAuth2\Server\ResourceServer::class, + 'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class, + 'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class, + 'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class, + 'Maatwebsite\Excel\Transactions\TransactionHandler' => \Maatwebsite\Excel\Transactions\DbTransactionHandler::class, + 'Maatwebsite\Excel\Transactions\TransactionManager' => \Maatwebsite\Excel\Transactions\TransactionManager::class, 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, @@ -824,7 +900,6 @@ namespace PHPSTORM_META { 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, 'cache' => \Illuminate\Cache\CacheManager::class, 'cache.store' => \Illuminate\Cache\Repository::class, - 'cart' => \Gloudemans\Shoppingcart\Cart::class, 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, @@ -837,6 +912,7 @@ namespace PHPSTORM_META { 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, @@ -884,7 +960,9 @@ namespace PHPSTORM_META { 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, @@ -922,6 +1000,7 @@ namespace PHPSTORM_META { 'dompdf.wrapper' => \Barryvdh\DomPDF\PDF::class, 'encrypter' => \Illuminate\Encryption\Encrypter::class, 'events' => \Illuminate\Events\Dispatcher::class, + 'excel' => \Maatwebsite\Excel\Excel::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, @@ -940,6 +1019,7 @@ namespace PHPSTORM_META { 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'paypal_client' => \Srmklive\PayPal\Services\PayPal::class, 'profanityFilter' => \Askedio\Laravel5ProfanityFilter\ProfanityFilter::class, 'queue' => \Illuminate\Queue\QueueManager::class, 'queue.connection' => \Illuminate\Queue\SyncQueue::class, @@ -970,8 +1050,10 @@ namespace PHPSTORM_META { 'Facade\Ignition\DumpRecorder\MultiDumpHandler' => \Facade\Ignition\DumpRecorder\MultiDumpHandler::class, 'Facade\Ignition\ErrorPage\Renderer' => \Facade\Ignition\ErrorPage\Renderer::class, 'Facade\Ignition\IgnitionConfig' => \Facade\Ignition\IgnitionConfig::class, + 'Facade\Ignition\JobRecorder\JobRecorder' => \Facade\Ignition\JobRecorder\JobRecorder::class, 'Facade\Ignition\LogRecorder\LogRecorder' => \Facade\Ignition\LogRecorder\LogRecorder::class, 'Facade\Ignition\QueryRecorder\QueryRecorder' => \Facade\Ignition\QueryRecorder\QueryRecorder::class, + 'Facade\Ignition\Support\SentReports' => \Facade\Ignition\Support\SentReports::class, 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, @@ -979,6 +1061,7 @@ namespace PHPSTORM_META { 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, @@ -992,6 +1075,7 @@ namespace PHPSTORM_META { 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -999,9 +1083,17 @@ namespace PHPSTORM_META { 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laracasts\Flash\SessionStore' => \Laracasts\Flash\LaravelSessionStore::class, 'Laravel\Passport\ClientRepository' => \Laravel\Passport\ClientRepository::class, - 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Parser::class, + 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Token\Parser::class, + 'League\OAuth2\Server\AuthorizationServer' => \League\OAuth2\Server\AuthorizationServer::class, + 'League\OAuth2\Server\ResourceServer' => \League\OAuth2\Server\ResourceServer::class, + 'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class, + 'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class, + 'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class, + 'Maatwebsite\Excel\Transactions\TransactionHandler' => \Maatwebsite\Excel\Transactions\DbTransactionHandler::class, + 'Maatwebsite\Excel\Transactions\TransactionManager' => \Maatwebsite\Excel\Transactions\TransactionManager::class, 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, @@ -1014,7 +1106,6 @@ namespace PHPSTORM_META { 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, 'cache' => \Illuminate\Cache\CacheManager::class, 'cache.store' => \Illuminate\Cache\Repository::class, - 'cart' => \Gloudemans\Shoppingcart\Cart::class, 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, @@ -1027,6 +1118,7 @@ namespace PHPSTORM_META { 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, @@ -1074,7 +1166,9 @@ namespace PHPSTORM_META { 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, @@ -1112,6 +1206,7 @@ namespace PHPSTORM_META { 'dompdf.wrapper' => \Barryvdh\DomPDF\PDF::class, 'encrypter' => \Illuminate\Encryption\Encrypter::class, 'events' => \Illuminate\Events\Dispatcher::class, + 'excel' => \Maatwebsite\Excel\Excel::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, @@ -1130,6 +1225,7 @@ namespace PHPSTORM_META { 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'paypal_client' => \Srmklive\PayPal\Services\PayPal::class, 'profanityFilter' => \Askedio\Laravel5ProfanityFilter\ProfanityFilter::class, 'queue' => \Illuminate\Queue\QueueManager::class, 'queue.connection' => \Illuminate\Queue\SyncQueue::class, @@ -1160,8 +1256,10 @@ namespace PHPSTORM_META { 'Facade\Ignition\DumpRecorder\MultiDumpHandler' => \Facade\Ignition\DumpRecorder\MultiDumpHandler::class, 'Facade\Ignition\ErrorPage\Renderer' => \Facade\Ignition\ErrorPage\Renderer::class, 'Facade\Ignition\IgnitionConfig' => \Facade\Ignition\IgnitionConfig::class, + 'Facade\Ignition\JobRecorder\JobRecorder' => \Facade\Ignition\JobRecorder\JobRecorder::class, 'Facade\Ignition\LogRecorder\LogRecorder' => \Facade\Ignition\LogRecorder\LogRecorder::class, 'Facade\Ignition\QueryRecorder\QueryRecorder' => \Facade\Ignition\QueryRecorder\QueryRecorder::class, + 'Facade\Ignition\Support\SentReports' => \Facade\Ignition\Support\SentReports::class, 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, @@ -1169,6 +1267,7 @@ namespace PHPSTORM_META { 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, @@ -1182,6 +1281,7 @@ namespace PHPSTORM_META { 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -1189,9 +1289,17 @@ namespace PHPSTORM_META { 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laracasts\Flash\SessionStore' => \Laracasts\Flash\LaravelSessionStore::class, 'Laravel\Passport\ClientRepository' => \Laravel\Passport\ClientRepository::class, - 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Parser::class, + 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Token\Parser::class, + 'League\OAuth2\Server\AuthorizationServer' => \League\OAuth2\Server\AuthorizationServer::class, + 'League\OAuth2\Server\ResourceServer' => \League\OAuth2\Server\ResourceServer::class, + 'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class, + 'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class, + 'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class, + 'Maatwebsite\Excel\Transactions\TransactionHandler' => \Maatwebsite\Excel\Transactions\DbTransactionHandler::class, + 'Maatwebsite\Excel\Transactions\TransactionManager' => \Maatwebsite\Excel\Transactions\TransactionManager::class, 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, @@ -1204,7 +1312,6 @@ namespace PHPSTORM_META { 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, 'cache' => \Illuminate\Cache\CacheManager::class, 'cache.store' => \Illuminate\Cache\Repository::class, - 'cart' => \Gloudemans\Shoppingcart\Cart::class, 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, @@ -1217,6 +1324,7 @@ namespace PHPSTORM_META { 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, @@ -1264,7 +1372,9 @@ namespace PHPSTORM_META { 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, @@ -1302,6 +1412,7 @@ namespace PHPSTORM_META { 'dompdf.wrapper' => \Barryvdh\DomPDF\PDF::class, 'encrypter' => \Illuminate\Encryption\Encrypter::class, 'events' => \Illuminate\Events\Dispatcher::class, + 'excel' => \Maatwebsite\Excel\Excel::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, @@ -1320,6 +1431,7 @@ namespace PHPSTORM_META { 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'paypal_client' => \Srmklive\PayPal\Services\PayPal::class, 'profanityFilter' => \Askedio\Laravel5ProfanityFilter\ProfanityFilter::class, 'queue' => \Illuminate\Queue\QueueManager::class, 'queue.connection' => \Illuminate\Queue\SyncQueue::class, @@ -1350,8 +1462,10 @@ namespace PHPSTORM_META { 'Facade\Ignition\DumpRecorder\MultiDumpHandler' => \Facade\Ignition\DumpRecorder\MultiDumpHandler::class, 'Facade\Ignition\ErrorPage\Renderer' => \Facade\Ignition\ErrorPage\Renderer::class, 'Facade\Ignition\IgnitionConfig' => \Facade\Ignition\IgnitionConfig::class, + 'Facade\Ignition\JobRecorder\JobRecorder' => \Facade\Ignition\JobRecorder\JobRecorder::class, 'Facade\Ignition\LogRecorder\LogRecorder' => \Facade\Ignition\LogRecorder\LogRecorder::class, 'Facade\Ignition\QueryRecorder\QueryRecorder' => \Facade\Ignition\QueryRecorder\QueryRecorder::class, + 'Facade\Ignition\Support\SentReports' => \Facade\Ignition\Support\SentReports::class, 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, @@ -1359,6 +1473,7 @@ namespace PHPSTORM_META { 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, @@ -1372,6 +1487,7 @@ namespace PHPSTORM_META { 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -1379,9 +1495,17 @@ namespace PHPSTORM_META { 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laracasts\Flash\SessionStore' => \Laracasts\Flash\LaravelSessionStore::class, 'Laravel\Passport\ClientRepository' => \Laravel\Passport\ClientRepository::class, - 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Parser::class, + 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Token\Parser::class, + 'League\OAuth2\Server\AuthorizationServer' => \League\OAuth2\Server\AuthorizationServer::class, + 'League\OAuth2\Server\ResourceServer' => \League\OAuth2\Server\ResourceServer::class, + 'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class, + 'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class, + 'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class, + 'Maatwebsite\Excel\Transactions\TransactionHandler' => \Maatwebsite\Excel\Transactions\DbTransactionHandler::class, + 'Maatwebsite\Excel\Transactions\TransactionManager' => \Maatwebsite\Excel\Transactions\TransactionManager::class, 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, @@ -1394,7 +1518,6 @@ namespace PHPSTORM_META { 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, 'cache' => \Illuminate\Cache\CacheManager::class, 'cache.store' => \Illuminate\Cache\Repository::class, - 'cart' => \Gloudemans\Shoppingcart\Cart::class, 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, @@ -1407,6 +1530,7 @@ namespace PHPSTORM_META { 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, @@ -1454,7 +1578,9 @@ namespace PHPSTORM_META { 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, @@ -1492,6 +1618,7 @@ namespace PHPSTORM_META { 'dompdf.wrapper' => \Barryvdh\DomPDF\PDF::class, 'encrypter' => \Illuminate\Encryption\Encrypter::class, 'events' => \Illuminate\Events\Dispatcher::class, + 'excel' => \Maatwebsite\Excel\Excel::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, @@ -1510,6 +1637,7 @@ namespace PHPSTORM_META { 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'paypal_client' => \Srmklive\PayPal\Services\PayPal::class, 'profanityFilter' => \Askedio\Laravel5ProfanityFilter\ProfanityFilter::class, 'queue' => \Illuminate\Queue\QueueManager::class, 'queue.connection' => \Illuminate\Queue\SyncQueue::class, @@ -1540,8 +1668,10 @@ namespace PHPSTORM_META { 'Facade\Ignition\DumpRecorder\MultiDumpHandler' => \Facade\Ignition\DumpRecorder\MultiDumpHandler::class, 'Facade\Ignition\ErrorPage\Renderer' => \Facade\Ignition\ErrorPage\Renderer::class, 'Facade\Ignition\IgnitionConfig' => \Facade\Ignition\IgnitionConfig::class, + 'Facade\Ignition\JobRecorder\JobRecorder' => \Facade\Ignition\JobRecorder\JobRecorder::class, 'Facade\Ignition\LogRecorder\LogRecorder' => \Facade\Ignition\LogRecorder\LogRecorder::class, 'Facade\Ignition\QueryRecorder\QueryRecorder' => \Facade\Ignition\QueryRecorder\QueryRecorder::class, + 'Facade\Ignition\Support\SentReports' => \Facade\Ignition\Support\SentReports::class, 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, @@ -1549,6 +1679,7 @@ namespace PHPSTORM_META { 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, @@ -1562,6 +1693,7 @@ namespace PHPSTORM_META { 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -1569,9 +1701,17 @@ namespace PHPSTORM_META { 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laracasts\Flash\SessionStore' => \Laracasts\Flash\LaravelSessionStore::class, 'Laravel\Passport\ClientRepository' => \Laravel\Passport\ClientRepository::class, - 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Parser::class, + 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Token\Parser::class, + 'League\OAuth2\Server\AuthorizationServer' => \League\OAuth2\Server\AuthorizationServer::class, + 'League\OAuth2\Server\ResourceServer' => \League\OAuth2\Server\ResourceServer::class, + 'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class, + 'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class, + 'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class, + 'Maatwebsite\Excel\Transactions\TransactionHandler' => \Maatwebsite\Excel\Transactions\DbTransactionHandler::class, + 'Maatwebsite\Excel\Transactions\TransactionManager' => \Maatwebsite\Excel\Transactions\TransactionManager::class, 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, @@ -1584,7 +1724,6 @@ namespace PHPSTORM_META { 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, 'cache' => \Illuminate\Cache\CacheManager::class, 'cache.store' => \Illuminate\Cache\Repository::class, - 'cart' => \Gloudemans\Shoppingcart\Cart::class, 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, @@ -1597,6 +1736,7 @@ namespace PHPSTORM_META { 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, @@ -1644,7 +1784,9 @@ namespace PHPSTORM_META { 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, @@ -1682,6 +1824,7 @@ namespace PHPSTORM_META { 'dompdf.wrapper' => \Barryvdh\DomPDF\PDF::class, 'encrypter' => \Illuminate\Encryption\Encrypter::class, 'events' => \Illuminate\Events\Dispatcher::class, + 'excel' => \Maatwebsite\Excel\Excel::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, @@ -1700,6 +1843,7 @@ namespace PHPSTORM_META { 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'paypal_client' => \Srmklive\PayPal\Services\PayPal::class, 'profanityFilter' => \Askedio\Laravel5ProfanityFilter\ProfanityFilter::class, 'queue' => \Illuminate\Queue\QueueManager::class, 'queue.connection' => \Illuminate\Queue\SyncQueue::class, @@ -1730,8 +1874,10 @@ namespace PHPSTORM_META { 'Facade\Ignition\DumpRecorder\MultiDumpHandler' => \Facade\Ignition\DumpRecorder\MultiDumpHandler::class, 'Facade\Ignition\ErrorPage\Renderer' => \Facade\Ignition\ErrorPage\Renderer::class, 'Facade\Ignition\IgnitionConfig' => \Facade\Ignition\IgnitionConfig::class, + 'Facade\Ignition\JobRecorder\JobRecorder' => \Facade\Ignition\JobRecorder\JobRecorder::class, 'Facade\Ignition\LogRecorder\LogRecorder' => \Facade\Ignition\LogRecorder\LogRecorder::class, 'Facade\Ignition\QueryRecorder\QueryRecorder' => \Facade\Ignition\QueryRecorder\QueryRecorder::class, + 'Facade\Ignition\Support\SentReports' => \Facade\Ignition\Support\SentReports::class, 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, @@ -1739,6 +1885,7 @@ namespace PHPSTORM_META { 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, @@ -1752,6 +1899,7 @@ namespace PHPSTORM_META { 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -1759,9 +1907,17 @@ namespace PHPSTORM_META { 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laracasts\Flash\SessionStore' => \Laracasts\Flash\LaravelSessionStore::class, 'Laravel\Passport\ClientRepository' => \Laravel\Passport\ClientRepository::class, - 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Parser::class, + 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Token\Parser::class, + 'League\OAuth2\Server\AuthorizationServer' => \League\OAuth2\Server\AuthorizationServer::class, + 'League\OAuth2\Server\ResourceServer' => \League\OAuth2\Server\ResourceServer::class, + 'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class, + 'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class, + 'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class, + 'Maatwebsite\Excel\Transactions\TransactionHandler' => \Maatwebsite\Excel\Transactions\DbTransactionHandler::class, + 'Maatwebsite\Excel\Transactions\TransactionManager' => \Maatwebsite\Excel\Transactions\TransactionManager::class, 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, @@ -1774,7 +1930,6 @@ namespace PHPSTORM_META { 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, 'cache' => \Illuminate\Cache\CacheManager::class, 'cache.store' => \Illuminate\Cache\Repository::class, - 'cart' => \Gloudemans\Shoppingcart\Cart::class, 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, @@ -1787,6 +1942,7 @@ namespace PHPSTORM_META { 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, @@ -1834,7 +1990,9 @@ namespace PHPSTORM_META { 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, @@ -1872,6 +2030,7 @@ namespace PHPSTORM_META { 'dompdf.wrapper' => \Barryvdh\DomPDF\PDF::class, 'encrypter' => \Illuminate\Encryption\Encrypter::class, 'events' => \Illuminate\Events\Dispatcher::class, + 'excel' => \Maatwebsite\Excel\Excel::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, @@ -1890,6 +2049,7 @@ namespace PHPSTORM_META { 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'paypal_client' => \Srmklive\PayPal\Services\PayPal::class, 'profanityFilter' => \Askedio\Laravel5ProfanityFilter\ProfanityFilter::class, 'queue' => \Illuminate\Queue\QueueManager::class, 'queue.connection' => \Illuminate\Queue\SyncQueue::class, @@ -1920,8 +2080,10 @@ namespace PHPSTORM_META { 'Facade\Ignition\DumpRecorder\MultiDumpHandler' => \Facade\Ignition\DumpRecorder\MultiDumpHandler::class, 'Facade\Ignition\ErrorPage\Renderer' => \Facade\Ignition\ErrorPage\Renderer::class, 'Facade\Ignition\IgnitionConfig' => \Facade\Ignition\IgnitionConfig::class, + 'Facade\Ignition\JobRecorder\JobRecorder' => \Facade\Ignition\JobRecorder\JobRecorder::class, 'Facade\Ignition\LogRecorder\LogRecorder' => \Facade\Ignition\LogRecorder\LogRecorder::class, 'Facade\Ignition\QueryRecorder\QueryRecorder' => \Facade\Ignition\QueryRecorder\QueryRecorder::class, + 'Facade\Ignition\Support\SentReports' => \Facade\Ignition\Support\SentReports::class, 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, @@ -1929,6 +2091,7 @@ namespace PHPSTORM_META { 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, @@ -1942,6 +2105,7 @@ namespace PHPSTORM_META { 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, @@ -1949,9 +2113,17 @@ namespace PHPSTORM_META { 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Laracasts\Flash\SessionStore' => \Laracasts\Flash\LaravelSessionStore::class, 'Laravel\Passport\ClientRepository' => \Laravel\Passport\ClientRepository::class, - 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Parser::class, + 'Lcobucci\JWT\Parser' => \Lcobucci\JWT\Token\Parser::class, + 'League\OAuth2\Server\AuthorizationServer' => \League\OAuth2\Server\AuthorizationServer::class, + 'League\OAuth2\Server\ResourceServer' => \League\OAuth2\Server\ResourceServer::class, + 'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class, + 'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class, + 'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class, + 'Maatwebsite\Excel\Transactions\TransactionHandler' => \Maatwebsite\Excel\Transactions\DbTransactionHandler::class, + 'Maatwebsite\Excel\Transactions\TransactionManager' => \Maatwebsite\Excel\Transactions\TransactionManager::class, 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, @@ -1964,7 +2136,6 @@ namespace PHPSTORM_META { 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, 'cache' => \Illuminate\Cache\CacheManager::class, 'cache.store' => \Illuminate\Cache\Repository::class, - 'cart' => \Gloudemans\Shoppingcart\Cart::class, 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, @@ -1977,6 +2148,7 @@ namespace PHPSTORM_META { 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, @@ -2024,7 +2196,9 @@ namespace PHPSTORM_META { 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, @@ -2062,6 +2236,7 @@ namespace PHPSTORM_META { 'dompdf.wrapper' => \Barryvdh\DomPDF\PDF::class, 'encrypter' => \Illuminate\Encryption\Encrypter::class, 'events' => \Illuminate\Events\Dispatcher::class, + 'excel' => \Maatwebsite\Excel\Excel::class, 'files' => \Illuminate\Filesystem\Filesystem::class, 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, @@ -2080,6 +2255,7 @@ namespace PHPSTORM_META { 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'paypal_client' => \Srmklive\PayPal\Services\PayPal::class, 'profanityFilter' => \Askedio\Laravel5ProfanityFilter\ProfanityFilter::class, 'queue' => \Illuminate\Queue\QueueManager::class, 'queue.connection' => \Illuminate\Queue\SyncQueue::class, @@ -2101,6 +2277,10 @@ namespace PHPSTORM_META { ])); + override(\Illuminate\Foundation\Testing\Concerns\InteractsWithContainer::mock(0), map(["" => "@&\Mockery\MockInterface"])); + override(\Illuminate\Foundation\Testing\Concerns\InteractsWithContainer::partialMock(0), map(["" => "@&\Mockery\MockInterface"])); + override(\Illuminate\Foundation\Testing\Concerns\InteractsWithContainer::instance(0), type(1)); + override(\Illuminate\Foundation\Testing\Concerns\InteractsWithContainer::spy(0), map(["" => "@&\Mockery\MockInterface"])); override(\Illuminate\Support\Arr::add(0), type(0)); override(\Illuminate\Support\Arr::except(0), type(0)); override(\Illuminate\Support\Arr::first(0), elementType(0)); diff --git a/_ide_helper.php b/_ide_helper.php index e54cb27..ee4daf2 100644 --- a/_ide_helper.php +++ b/_ide_helper.php @@ -1,9 +1,10 @@ langPath(); + } + /** + * Set the language file directory. + * + * @param string $path + * @return \Illuminate\Foundation\Application + * @static + */ + public static function useLangPath($path) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->useLangPath($path); } /** * Get the path to the public / web directory. @@ -242,6 +255,20 @@ { /** @var \Illuminate\Foundation\Application $instance */ return $instance->resourcePath($path); + } + /** + * Get the path to the views directory. + * + * This method returns the first configured path in the array of view paths. + * + * @param string $path + * @return string + * @static + */ + public static function viewPath($path = '') + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->viewPath($path); } /** * Get the path to the environment file directory. @@ -313,7 +340,7 @@ return $instance->environment(...$environments); } /** - * Determine if application is in local environment. + * Determine if the application is in the local environment. * * @return bool * @static @@ -324,7 +351,7 @@ return $instance->isLocal(); } /** - * Determine if application is in production environment. + * Determine if the application is in the production environment. * * @return bool * @static @@ -367,6 +394,17 @@ { /** @var \Illuminate\Foundation\Application $instance */ return $instance->runningUnitTests(); + } + /** + * Determine if the application is running with debug mode enabled. + * + * @return bool + * @static + */ + public static function hasDebugModeEnabled() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->hasDebugModeEnabled(); } /** * Register all of the configured providers. @@ -538,6 +576,7 @@ /** * {@inheritdoc} * + * @return \Symfony\Component\HttpFoundation\Response * @static */ public static function handle($request, $type = 1, $catch = true) @@ -673,7 +712,7 @@ * @param int $code * @param string $message * @param array $headers - * @return void + * @return never * @throws \Symfony\Component\HttpKernel\Exception\HttpException * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException * @static @@ -681,7 +720,7 @@ public static function abort($code, $message = '', $headers = []) { /** @var \Illuminate\Foundation\Application $instance */ - $instance->abort($code, $message, $headers); + return $instance->abort($code, $message, $headers); } /** * Register a terminating callback with the application. @@ -846,7 +885,7 @@ $instance->setFallbackLocale($fallbackLocale); } /** - * Determine if application locale is the given locale. + * Determine if the application locale is the given locale. * * @param string $locale * @return bool @@ -911,6 +950,7 @@ * `has($id)` returning true does not mean that `get($id)` will not throw an exception. * It does however mean that `get($id)` will not throw a `NotFoundExceptionInterface`. * + * @return bool * @param string $id Identifier of the entry to look for. * @return bool * @static @@ -963,6 +1003,7 @@ * @param \Closure|string|null $concrete * @param bool $shared * @return void + * @throws \TypeError * @static */ public static function bind($abstract, $concrete = null, $shared = false) @@ -1061,6 +1102,32 @@ { //Method inherited from \Illuminate\Container\Container /** @var \Illuminate\Foundation\Application $instance */ $instance->singletonIf($abstract, $concrete); + } + /** + * Register a scoped binding in the container. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @return void + * @static + */ + public static function scoped($abstract, $concrete = null) + { //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->scoped($abstract, $concrete); + } + /** + * Register a scoped binding if it hasn't already been registered. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @return void + * @static + */ + public static function scopedIf($abstract, $concrete = null) + { //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->scopedIf($abstract, $concrete); } /** * "Extend" an abstract type in the container. @@ -1106,7 +1173,7 @@ * Resolve all of the bindings for a given tag. * * @param string $tag - * @return \Illuminate\Container\iterable + * @return iterable * @static */ public static function tagged($tag) @@ -1172,7 +1239,7 @@ * Call the given Closure / class@method and inject its dependencies. * * @param callable|string $callback - * @param \Illuminate\Container\array $parameters + * @param array $parameters * @param string|null $defaultMethod * @return mixed * @throws \InvalidArgumentException @@ -1212,6 +1279,7 @@ /** * Finds an entry of the container by its identifier and returns it. * + * @return mixed * @param string $id Identifier of the entry to look for. * @throws NotFoundExceptionInterface No entry was found for **this** identifier. * @throws ContainerExceptionInterface Error while retrieving the entry. @@ -1229,6 +1297,7 @@ * @param \Closure|string $concrete * @return mixed * @throws \Illuminate\Contracts\Container\BindingResolutionException + * @throws \Illuminate\Contracts\Container\CircularDependencyException * @static */ public static function build($concrete) @@ -1332,6 +1401,17 @@ { //Method inherited from \Illuminate\Container\Container /** @var \Illuminate\Foundation\Application $instance */ $instance->forgetInstances(); + } + /** + * Clear all of the scoped instances from the container. + * + * @return void + * @static + */ + public static function forgetScopedInstances() + { //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->forgetScopedInstances(); } /** * Get the globally available instance of the container. @@ -1691,6 +1771,29 @@ { /** @var \Illuminate\Auth\AuthManager $instance */ return $instance->hasResolvedGuards(); + } + /** + * Forget all of the resolved guard instances. + * + * @return \Illuminate\Auth\AuthManager + * @static + */ + public static function forgetGuards() + { + /** @var \Illuminate\Auth\AuthManager $instance */ + return $instance->forgetGuards(); + } + /** + * Set the application instance used by the manager. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return \Illuminate\Auth\AuthManager + * @static + */ + public static function setApplication($app) + { + /** @var \Illuminate\Auth\AuthManager $instance */ + return $instance->setApplication($app); } /** * Create the user provider implementation for the driver. @@ -1812,6 +1915,20 @@ { /** @var \Illuminate\Auth\SessionGuard $instance */ return $instance->attempt($credentials, $remember); + } + /** + * Attempt to authenticate a user with credentials and additional callbacks. + * + * @param array $credentials + * @param array|callable $callbacks + * @param false $remember + * @return bool + * @static + */ + public static function attemptWhen($credentials = [], $callbacks = null, $remember = false) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->attemptWhen($credentials, $callbacks, $remember); } /** * Log the given user ID into the application. @@ -1870,7 +1987,8 @@ * * @param string $password * @param string $attribute - * @return bool|null + * @return \App\User|null + * @throws \Illuminate\Auth\AuthenticationException * @static */ public static function logoutOtherDevices($password, $attribute = 'password') @@ -1933,6 +2051,18 @@ { /** @var \Illuminate\Auth\SessionGuard $instance */ return $instance->viaRemember(); + } + /** + * Set the number of minutes the remember me cookie should be valid for. + * + * @param int $minutes + * @return \Illuminate\Auth\SessionGuard + * @static + */ + public static function setRememberDuration($minutes) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->setRememberDuration($minutes); } /** * Get the cookie creator instance used by the guard. @@ -2039,7 +2169,18 @@ return $instance->setRequest($request); } /** - * Determine if current user is authenticated. If not, throw an exception. + * Get the timebox instance used by the guard. + * + * @return \Illuminate\Support\Timebox + * @static + */ + public static function getTimebox() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->getTimebox(); + } + /** + * Determine if the current user is authenticated. If not, throw an exception. * * @return \App\User * @throws \Illuminate\Auth\AuthenticationException @@ -2141,6 +2282,16 @@ public static function hasMacro($name) { return \Illuminate\Auth\SessionGuard::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Auth\SessionGuard::flushMacros(); } } @@ -2196,6 +2347,30 @@ { /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ return $instance->compileString($value); + } + /** + * Evaluate and render a Blade string to HTML. + * + * @param string $string + * @param array $data + * @param bool $deleteCachedView + * @return string + * @static + */ + public static function render($string, $data = [], $deleteCachedView = false) + { + return \Illuminate\View\Compilers\BladeCompiler::render($string, $data, $deleteCachedView); + } + /** + * Render a component instance to HTML. + * + * @param \Illuminate\View\Component $component + * @return string + * @static + */ + public static function renderComponent($component) + { + return \Illuminate\View\Compilers\BladeCompiler::renderComponent($component); } /** * Strip the parentheses from the given expression. @@ -2522,6 +2697,19 @@ { /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ return $instance->compileEndOnce(); + } + /** + * Add a handler to be executed before echoing a given class. + * + * @param string|callable $class + * @param callable|null $handler + * @return void + * @static + */ + public static function stringable($class, $handler = null) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->stringable($class, $handler); } /** * Compile Blade echos into valid PHP. @@ -2534,6 +2722,18 @@ { /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ return $instance->compileEchos($value); + } + /** + * Apply the echo handler for the value if it exists. + * + * @param string $value + * @return string + * @static + */ + public static function applyEchoHandler($value) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->applyEchoHandler($value); } } @@ -2664,6 +2864,40 @@ { /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ return $instance->extend($driver, $callback); + } + /** + * Get the application instance used by the manager. + * + * @return \Illuminate\Contracts\Foundation\Application + * @static + */ + public static function getApplication() + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->getApplication(); + } + /** + * Set the application instance used by the manager. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return \Illuminate\Broadcasting\BroadcastManager + * @static + */ + public static function setApplication($app) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->setApplication($app); + } + /** + * Forget all of the resolved driver instances. + * + * @return \Illuminate\Broadcasting\BroadcastManager + * @static + */ + public static function forgetDrivers() + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->forgetDrivers(); } } @@ -2688,7 +2922,7 @@ /** * Dispatch a command to its appropriate handler in the current process. * - * Queuable jobs will be dispatched to the "sync" queue. + * Queueable jobs will be dispatched to the "sync" queue. * * @param mixed $command * @param mixed $handler @@ -2778,6 +3012,7 @@ * * @param mixed $command * @return mixed + * @throws \RuntimeException * @static */ public static function dispatchToQueue($command) @@ -2860,6 +3095,56 @@ { /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ $instance->assertNotDispatched($command, $callback); + } + /** + * Assert that no jobs were dispatched. + * + * @return void + * @static + */ + public static function assertNothingDispatched() + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertNothingDispatched(); + } + /** + * Assert if a job was explicitly dispatched synchronously based on a truth-test callback. + * + * @param string|\Closure $command + * @param callable|int|null $callback + * @return void + * @static + */ + public static function assertDispatchedSync($command, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertDispatchedSync($command, $callback); + } + /** + * Assert if a job was pushed synchronously a number of times. + * + * @param string $command + * @param int $times + * @return void + * @static + */ + public static function assertDispatchedSyncTimes($command, $times = 1) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertDispatchedSyncTimes($command, $times); + } + /** + * Determine if a job was dispatched based on a truth-test callback. + * + * @param string|\Closure $command + * @param callable|null $callback + * @return void + * @static + */ + public static function assertNotDispatchedSync($command, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertNotDispatchedSync($command, $callback); } /** * Assert if a job was dispatched after the response was sent based on a truth-test callback. @@ -2936,6 +3221,18 @@ { /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ $instance->assertBatched($callback); + } + /** + * Assert the number of batches that have been dispatched. + * + * @param int $count + * @return void + * @static + */ + public static function assertBatchCount($count) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertBatchCount($count); } /** * Get all of the jobs matching a truth-test callback. @@ -2949,6 +3246,19 @@ { /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ return $instance->dispatched($command, $callback); + } + /** + * Get all of the jobs dispatched synchronously matching a truth-test callback. + * + * @param string $command + * @param callable|null $callback + * @return \Illuminate\Support\Collection + * @static + */ + public static function dispatchedSync($command, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + return $instance->dispatchedSync($command, $callback); } /** * Get all of the jobs dispatched after the response was sent matching a truth-test callback. @@ -2994,6 +3304,18 @@ * @return bool * @static */ + public static function hasDispatchedSync($command) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + return $instance->hasDispatchedSync($command); + } + /** + * Determine if there are any stored commands for a given class. + * + * @param string $command + * @return bool + * @static + */ public static function hasDispatchedAfterResponse($command) { /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ @@ -3181,9 +3503,10 @@ /** * Obtains multiple cache items by their unique keys. * - * @param \Psr\SimpleCache\iterable $keys A list of keys that can obtained in a single operation. + * @return iterable + * @param iterable $keys A list of keys that can obtained in a single operation. * @param mixed $default Default value to return for keys that do not exist. - * @return \Psr\SimpleCache\iterable A list of key => value pairs. Cache keys that do not exist or are stale will have $default as value. + * @return iterable A list of key => value pairs. Cache keys that do not exist or are stale will have $default as value. * @throws \Psr\SimpleCache\InvalidArgumentException * MUST be thrown if $keys is neither an array nor a Traversable, * or if any of the $keys are not a legal value. @@ -3224,6 +3547,7 @@ /** * Persists data in the cache, uniquely referenced by a key with an optional expiration TTL time. * + * @return bool * @param string $key The key of the item to store. * @param mixed $value The value of the item to store, must be serializable. * @param null|int|\DateInterval $ttl Optional. The TTL value of this item. If no value is sent and @@ -3255,7 +3579,8 @@ /** * Persists a set of key => value pairs in the cache, with an optional TTL. * - * @param \Psr\SimpleCache\iterable $values A list of key => value pairs for a multiple-set operation. + * @return bool + * @param iterable $values A list of key => value pairs for a multiple-set operation. * @param null|int|\DateInterval $ttl Optional. The TTL value of this item. If no value is sent and * the driver supports TTL then the library may set a default value * for it or let the driver take care of that. @@ -3327,7 +3652,7 @@ * Get an item from the cache, or execute the given Closure and store the result. * * @param string $key - * @param \DateTimeInterface|\DateInterval|int|null $ttl + * @param \Closure|\DateTimeInterface|\DateInterval|int|null $ttl * @param \Closure $callback * @return mixed * @static @@ -3378,6 +3703,7 @@ /** * Delete an item from the cache by its unique key. * + * @return bool * @param string $key The unique cache key of the item to delete. * @return bool True if the item was successfully removed. False if there was an error. * @throws \Psr\SimpleCache\InvalidArgumentException @@ -3392,7 +3718,8 @@ /** * Deletes multiple cache items in a single operation. * - * @param \Psr\SimpleCache\iterable $keys A list of string-based keys to be deleted. + * @return bool + * @param iterable $keys A list of string-based keys to be deleted. * @return bool True if the items were successfully removed. False if there was an error. * @throws \Psr\SimpleCache\InvalidArgumentException * MUST be thrown if $keys is neither an array nor a Traversable, @@ -3407,6 +3734,7 @@ /** * Wipes clean the entire cache's keys. * + * @return bool * @return bool True on success and false on failure. * @static */ @@ -3580,6 +3908,16 @@ public static function hasMacro($name) { return \Illuminate\Cache\Repository::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Cache\Repository::flushMacros(); } /** * Dynamically handle calls to the class. @@ -3909,6 +4247,20 @@ { /** @var \Illuminate\Cookie\CookieJar $instance */ $instance->queue(...$parameters); + } + /** + * Queue a cookie to expire with the next response. + * + * @param string $name + * @param string|null $path + * @param string|null $domain + * @return void + * @static + */ + public static function expire($name, $path = null, $domain = null) + { + /** @var \Illuminate\Cookie\CookieJar $instance */ + $instance->expire($name, $path, $domain); } /** * Remove a cookie from the queue. @@ -3948,6 +4300,17 @@ { /** @var \Illuminate\Cookie\CookieJar $instance */ return $instance->getQueuedCookies(); + } + /** + * Flush the cookies which have been queued for the next request. + * + * @return \Illuminate\Cookie\CookieJar + * @static + */ + public static function flushQueuedCookies() + { + /** @var \Illuminate\Cookie\CookieJar $instance */ + return $instance->flushQueuedCookies(); } /** * Register a custom macro. @@ -3984,6 +4347,16 @@ public static function hasMacro($name) { return \Illuminate\Cookie\CookieJar::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Cookie\CookieJar::flushMacros(); } } @@ -4101,6 +4474,22 @@ { /** @var \Illuminate\Database\DatabaseManager $instance */ return $instance->connection($name); + } + /** + * Register a custom Doctrine type. + * + * @param string $class + * @param string $name + * @param string $type + * @return void + * @throws \Doctrine\DBAL\DBALException + * @throws \RuntimeException + * @static + */ + public static function registerDoctrineType($class, $name, $type) + { + /** @var \Illuminate\Database\DatabaseManager $instance */ + $instance->registerDoctrineType($class, $name, $type); } /** * Disconnect from the given database and remove from local cache. @@ -4231,6 +4620,18 @@ { /** @var \Illuminate\Database\DatabaseManager $instance */ $instance->setReconnector($reconnector); + } + /** + * Set the application instance used by the manager. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return \Illuminate\Database\DatabaseManager + * @static + */ + public static function setApplication($app) + { + /** @var \Illuminate\Database\DatabaseManager $instance */ + return $instance->setApplication($app); } /** * Determine if the connected database is a MariaDB database. @@ -4506,6 +4907,18 @@ { //Method inherited from \Illuminate\Database\Connection /** @var \Illuminate\Database\MySqlConnection $instance */ $instance->logQuery($query, $bindings, $time); + } + /** + * Register a hook to be run just before a database query is executed. + * + * @param \Closure $callback + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function beforeExecuting($callback) + { //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->beforeExecuting($callback); } /** * Register a database query listener with the connection. @@ -4530,6 +4943,17 @@ { //Method inherited from \Illuminate\Database\Connection /** @var \Illuminate\Database\MySqlConnection $instance */ return $instance->raw($value); + } + /** + * Determine if the database connection has modified any database records. + * + * @return bool + * @static + */ + public static function hasModifiedRecords() + { //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->hasModifiedRecords(); } /** * Indicate if any records have been modified. @@ -4542,6 +4966,41 @@ { //Method inherited from \Illuminate\Database\Connection /** @var \Illuminate\Database\MySqlConnection $instance */ $instance->recordsHaveBeenModified($value); + } + /** + * Set the record modification state. + * + * @param bool $value + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function setRecordModificationState($value) + { //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->setRecordModificationState($value); + } + /** + * Reset the record modification state. + * + * @return void + * @static + */ + public static function forgetRecordModificationState() + { //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->forgetRecordModificationState(); + } + /** + * Indicate that the connection should use the write PDO connection for reads. + * + * @param bool $value + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function useWriteConnectionWhenReading($value = true) + { //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->useWriteConnectionWhenReading($value); } /** * Is Doctrine available? @@ -4667,6 +5126,17 @@ { //Method inherited from \Illuminate\Database\Connection /** @var \Illuminate\Database\MySqlConnection $instance */ return $instance->getName(); + } + /** + * Get the database connection full name. + * + * @return string|null + * @static + */ + public static function getNameWithReadWriteType() + { //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getNameWithReadWriteType(); } /** * Get an option from the configuration options. @@ -4905,6 +5375,18 @@ { //Method inherited from \Illuminate\Database\Connection /** @var \Illuminate\Database\MySqlConnection $instance */ return $instance->setDatabaseName($database); + } + /** + * Set the read / write type of the connection. + * + * @param string|null $readWriteType + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function setReadWriteType($readWriteType) + { //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->setReadWriteType($readWriteType); } /** * Get the table prefix for the connection. @@ -5031,6 +5513,7 @@ * * @param callable $callback * @return void + * @throws \RuntimeException * @static */ public static function afterCommit($callback) @@ -5050,7 +5533,7 @@ * Register an event listener with the dispatcher. * * @param \Closure|string|array $events - * @param \Closure|string|null $listener + * @param \Closure|string|array|null $listener * @return void * @static */ @@ -5162,7 +5645,7 @@ /** * Register an event listener with the dispatcher. * - * @param \Closure|string $listener + * @param \Closure|string|array $listener * @param bool $wildcard * @return \Closure * @static @@ -5255,6 +5738,29 @@ public static function hasMacro($name) { return \Illuminate\Events\Dispatcher::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Events\Dispatcher::flushMacros(); + } + /** + * Assert if an event has a listener attached to it. + * + * @param string $expectedEvent + * @param string $expectedListener + * @return void + * @static + */ + public static function assertListening($expectedEvent, $expectedListener) + { + /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ + $instance->assertListening($expectedEvent, $expectedListener); } /** * Assert if an event was dispatched based on a truth-test callback. @@ -5409,6 +5915,7 @@ * @param string $path * @param array $data * @return mixed + * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException * @static */ public static function requireOnce($path, $data = []) @@ -5467,6 +5974,20 @@ { /** @var \Illuminate\Filesystem\Filesystem $instance */ $instance->replace($path, $content); + } + /** + * Replace a given string within a given file. + * + * @param array|string $search + * @param array|string $replace + * @param string $path + * @return void + * @static + */ + public static function replaceInFile($search, $replace, $path) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + $instance->replaceInFile($search, $replace, $path); } /** * Prepend to a file. @@ -5564,6 +6085,7 @@ * @param string $target * @param string $link * @return void + * @throws \RuntimeException * @static */ public static function relativeLink($target, $link) @@ -5624,6 +6146,7 @@ * * @param string $path * @return string|null + * @throws \RuntimeException * @static */ public static function guessExtension($path) @@ -5909,6 +6432,16 @@ public static function hasMacro($name) { return \Illuminate\Filesystem\Filesystem::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Filesystem\Filesystem::flushMacros(); } } @@ -5929,6 +6462,36 @@ { /** @var \Illuminate\Auth\Access\Gate $instance */ return $instance->has($ability); + } + /** + * Perform an on-demand authorization check. Throw an authorization exception if the condition or callback is false. + * + * @param \Illuminate\Auth\Access\Response|\Closure|bool $condition + * @param string|null $message + * @param string|null $code + * @return \Illuminate\Auth\Access\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + * @static + */ + public static function allowIf($condition, $message = null, $code = null) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->allowIf($condition, $message, $code); + } + /** + * Perform an on-demand authorization check. Throw an authorization exception if the condition or callback is true. + * + * @param \Illuminate\Auth\Access\Response|\Closure|bool $condition + * @param string|null $message + * @param string|null $code + * @return \Illuminate\Auth\Access\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + * @static + */ + public static function denyIf($condition, $message = null, $code = null) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->denyIf($condition, $message, $code); } /** * Define a new ability. @@ -6024,7 +6587,7 @@ /** * Determine if all of the given abilities should be granted for the current user. * - * @param \Illuminate\Auth\Access\iterable|string $abilities + * @param iterable|string $abilities * @param array|mixed $arguments * @return bool * @static @@ -6037,7 +6600,7 @@ /** * Determine if any one of the given abilities should be granted for the current user. * - * @param \Illuminate\Auth\Access\iterable|string $abilities + * @param iterable|string $abilities * @param array|mixed $arguments * @return bool * @static @@ -6050,7 +6613,7 @@ /** * Determine if all of the given abilities should be denied for the current user. * - * @param \Illuminate\Auth\Access\iterable|string $abilities + * @param iterable|string $abilities * @param array|mixed $arguments * @return bool * @static @@ -6171,6 +6734,18 @@ { /** @var \Illuminate\Auth\Access\Gate $instance */ return $instance->policies(); + } + /** + * Set the container instance used by the gate. + * + * @param \Illuminate\Contracts\Container\Container $container + * @return \Illuminate\Auth\Access\Gate + * @static + */ + public static function setContainer($container) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->setContainer($container); } } @@ -6312,6 +6887,40 @@ { //Method inherited from \Illuminate\Support\Manager /** @var \Illuminate\Hashing\HashManager $instance */ return $instance->getDrivers(); + } + /** + * Get the container instance used by the manager. + * + * @return \Illuminate\Contracts\Container\Container + * @static + */ + public static function getContainer() + { //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Hashing\HashManager $instance */ + return $instance->getContainer(); + } + /** + * Set the container instance used by the manager. + * + * @param \Illuminate\Contracts\Container\Container $container + * @return \Illuminate\Hashing\HashManager + * @static + */ + public static function setContainer($container) + { //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Hashing\HashManager $instance */ + return $instance->setContainer($container); + } + /** + * Forget all of the resolved driver instances. + * + * @return \Illuminate\Hashing\HashManager + * @static + */ + public static function forgetDrivers() + { //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Hashing\HashManager $instance */ + return $instance->forgetDrivers(); } } @@ -6323,12 +6932,16 @@ * @method static \Illuminate\Http\Client\PendingRequest asForm() * @method static \Illuminate\Http\Client\PendingRequest asJson() * @method static \Illuminate\Http\Client\PendingRequest asMultipart() - * @method static \Illuminate\Http\Client\PendingRequest attach(string $name, string $contents, string|null $filename = null, array $headers = []) + * @method static \Illuminate\Http\Client\PendingRequest async() + * @method static \Illuminate\Http\Client\PendingRequest attach(string|array $name, string $contents = '', string|null $filename = null, array $headers = []) * @method static \Illuminate\Http\Client\PendingRequest baseUrl(string $url) * @method static \Illuminate\Http\Client\PendingRequest beforeSending(callable $callback) * @method static \Illuminate\Http\Client\PendingRequest bodyFormat(string $format) * @method static \Illuminate\Http\Client\PendingRequest contentType(string $contentType) - * @method static \Illuminate\Http\Client\PendingRequest retry(int $times, int $sleep = 0) + * @method static \Illuminate\Http\Client\PendingRequest dd() + * @method static \Illuminate\Http\Client\PendingRequest dump() + * @method static \Illuminate\Http\Client\PendingRequest retry(int $times, int $sleep = 0, ?callable $when = null) + * @method static \Illuminate\Http\Client\PendingRequest sink(string|resource $to) * @method static \Illuminate\Http\Client\PendingRequest stub(callable $callback) * @method static \Illuminate\Http\Client\PendingRequest timeout(int $seconds) * @method static \Illuminate\Http\Client\PendingRequest withBasicAuth(string $username, string $password) @@ -6336,13 +6949,16 @@ * @method static \Illuminate\Http\Client\PendingRequest withCookies(array $cookies, string $domain) * @method static \Illuminate\Http\Client\PendingRequest withDigestAuth(string $username, string $password) * @method static \Illuminate\Http\Client\PendingRequest withHeaders(array $headers) + * @method static \Illuminate\Http\Client\PendingRequest withMiddleware(callable $middleware) * @method static \Illuminate\Http\Client\PendingRequest withOptions(array $options) * @method static \Illuminate\Http\Client\PendingRequest withToken(string $token, string $type = 'Bearer') + * @method static \Illuminate\Http\Client\PendingRequest withUserAgent(string $userAgent) * @method static \Illuminate\Http\Client\PendingRequest withoutRedirecting() * @method static \Illuminate\Http\Client\PendingRequest withoutVerifying() + * @method static array pool(callable $callback) * @method static \Illuminate\Http\Client\Response delete(string $url, array $data = []) - * @method static \Illuminate\Http\Client\Response get(string $url, array $query = []) - * @method static \Illuminate\Http\Client\Response head(string $url, array $query = []) + * @method static \Illuminate\Http\Client\Response get(string $url, array|string|null $query = null) + * @method static \Illuminate\Http\Client\Response head(string $url, array|string|null $query = null) * @method static \Illuminate\Http\Client\Response patch(string $url, array $data = []) * @method static \Illuminate\Http\Client\Response post(string $url, array $data = []) * @method static \Illuminate\Http\Client\Response put(string $url, array $data = []) @@ -6438,7 +7054,7 @@ $instance->assertSent($callback); } /** - * Assert that the given request were sent in the given order. + * Assert that the given request was sent in the given order. * * @param array $callbacks * @return void @@ -6506,6 +7122,17 @@ { /** @var \Illuminate\Http\Client\Factory $instance */ return $instance->recorded($callback); + } + /** + * Get the current event dispatcher implementation. + * + * @return \Illuminate\Contracts\Events\Dispatcher|null + * @static + */ + public static function getDispatcher() + { + /** @var \Illuminate\Http\Client\Factory $instance */ + return $instance->getDispatcher(); } /** * Register a custom macro. @@ -6542,6 +7169,16 @@ public static function hasMacro($name) { return \Illuminate\Http\Client\Factory::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Http\Client\Factory::flushMacros(); } /** * Dynamically handle calls to the class. @@ -6748,6 +7385,7 @@ * * @param string $locale * @return void + * @throws \InvalidArgumentException * @static */ public static function setLocale($locale) @@ -6802,6 +7440,17 @@ { //Method inherited from \Illuminate\Support\NamespacedItemResolver /** @var \Illuminate\Translation\Translator $instance */ $instance->setParsedKey($key, $parsed); + } + /** + * Flush the cache of parsed keys. + * + * @return void + * @static + */ + public static function flushParsedKeys() + { //Method inherited from \Illuminate\Support\NamespacedItemResolver + /** @var \Illuminate\Translation\Translator $instance */ + $instance->flushParsedKeys(); } /** * Register a custom macro. @@ -6838,18 +7487,42 @@ public static function hasMacro($name) { return \Illuminate\Translation\Translator::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Translation\Translator::flushMacros(); } } /** * * + * @method static \Illuminate\Log\Logger withContext(array $context = []) + * @method static \Illuminate\Log\Logger withoutContext() * @method static void write(string $level, string $message, array $context = []) * @method static void listen(\Closure $callback) * @see \Illuminate\Log\Logger */ class Log { /** + * Build an on-demand log channel. + * + * @param array $config + * @return \Psr\Log\LoggerInterface + * @static + */ + public static function build($config) + { + /** @var \Illuminate\Log\LogManager $instance */ + return $instance->build($config); + } + /** * Create a new, on-demand aggregate logger instance. * * @param array $channels @@ -6885,22 +7558,11 @@ { /** @var \Illuminate\Log\LogManager $instance */ return $instance->driver($driver); - } - /** - * - * - * @return array - * @static - */ - public static function getChannels() - { - /** @var \Illuminate\Log\LogManager $instance */ - return $instance->getChannels(); } /** * Get the default log driver name. * - * @return string + * @return string|null * @static */ public static function getDefaultDriver() @@ -6944,6 +7606,17 @@ { /** @var \Illuminate\Log\LogManager $instance */ return $instance->forgetChannel($driver); + } + /** + * Get all of the resolved log channels. + * + * @return array + * @static + */ + public static function getChannels() + { + /** @var \Illuminate\Log\LogManager $instance */ + return $instance->getChannels(); } /** * System is unusable. @@ -7079,6 +7752,10 @@ /** * * + * @method static void alwaysFrom(string $address, string|null $name = null) + * @method static void alwaysReplyTo(string $address, string|null $name = null) + * @method static void alwaysReturnPath(string $address) + * @method static void alwaysTo(string $address, string|null $name = null) * @method static mixed laterOn(string $queue, \DateTimeInterface|\DateInterval|int $delay, \Illuminate\Contracts\Mail\Mailable|string|array $view) * @method static mixed queueOn(string $queue, \Illuminate\Contracts\Mail\Mailable|string|array $view) * @method static void plain(string $view, array $data, $callback) @@ -7091,7 +7768,7 @@ * Get a mailer instance by name. * * @param string|null $name - * @return \Illuminate\Mail\Mailer + * @return \Illuminate\Contracts\Mail\Mailer * @static */ public static function mailer($name = null) @@ -7116,6 +7793,7 @@ * * @param array $config * @return \Swift_Transport + * @throws \InvalidArgumentException * @static */ public static function createTransport($config) @@ -7170,6 +7848,40 @@ { /** @var \Illuminate\Mail\MailManager $instance */ return $instance->extend($driver, $callback); + } + /** + * Get the application instance used by the manager. + * + * @return \Illuminate\Contracts\Foundation\Application + * @static + */ + public static function getApplication() + { + /** @var \Illuminate\Mail\MailManager $instance */ + return $instance->getApplication(); + } + /** + * Set the application instance used by the manager. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return \Illuminate\Mail\MailManager + * @static + */ + public static function setApplication($app) + { + /** @var \Illuminate\Mail\MailManager $instance */ + return $instance->setApplication($app); + } + /** + * Forget all of the resolved mailer instances. + * + * @return \Illuminate\Mail\MailManager + * @static + */ + public static function forgetMailers() + { + /** @var \Illuminate\Mail\MailManager $instance */ + return $instance->forgetMailers(); } /** * Assert if a mailable was sent based on a truth-test callback. @@ -7183,11 +7895,24 @@ { /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ $instance->assertSent($mailable, $callback); + } + /** + * Determine if a mailable was not sent or queued to be sent based on a truth-test callback. + * + * @param string|\Closure $mailable + * @param callable|null $callback + * @return void + * @static + */ + public static function assertNotOutgoing($mailable, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + $instance->assertNotOutgoing($mailable, $callback); } /** * Determine if a mailable was not sent based on a truth-test callback. * - * @param string $mailable + * @param string|\Closure $mailable * @param callable|null $callback * @return void * @static @@ -7196,6 +7921,17 @@ { /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ $instance->assertNotSent($mailable, $callback); + } + /** + * Assert that no mailables were sent or queued to be sent. + * + * @return void + * @static + */ + public static function assertNothingOutgoing() + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + $instance->assertNothingOutgoing(); } /** * Assert that no mailables were sent. @@ -7224,7 +7960,7 @@ /** * Determine if a mailable was not queued based on a truth-test callback. * - * @param string $mailable + * @param string|\Closure $mailable * @param callable|null $callback * @return void * @static @@ -7248,7 +7984,7 @@ /** * Get all of the mailables matching a truth-test callback. * - * @param string $mailable + * @param string|\Closure $mailable * @param callable|null $callback * @return \Illuminate\Support\Collection * @static @@ -7273,7 +8009,7 @@ /** * Get all of the queued mailables matching a truth-test callback. * - * @param string $mailable + * @param string|\Closure $mailable * @param callable|null $callback * @return \Illuminate\Support\Collection * @static @@ -7335,7 +8071,7 @@ /** * Send a new message using a view. * - * @param string|array $view + * @param \Illuminate\Contracts\Mail\Mailable|string|array $view * @param array $data * @param \Closure|string|null $callback * @return void @@ -7513,6 +8249,54 @@ { //Method inherited from \Illuminate\Support\Manager /** @var \Illuminate\Notifications\ChannelManager $instance */ return $instance->getDrivers(); + } + /** + * Get the container instance used by the manager. + * + * @return \Illuminate\Contracts\Container\Container + * @static + */ + public static function getContainer() + { //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Notifications\ChannelManager $instance */ + return $instance->getContainer(); + } + /** + * Set the container instance used by the manager. + * + * @param \Illuminate\Contracts\Container\Container $container + * @return \Illuminate\Notifications\ChannelManager + * @static + */ + public static function setContainer($container) + { //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Notifications\ChannelManager $instance */ + return $instance->setContainer($container); + } + /** + * Forget all of the resolved driver instances. + * + * @return \Illuminate\Notifications\ChannelManager + * @static + */ + public static function forgetDrivers() + { //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Notifications\ChannelManager $instance */ + return $instance->forgetDrivers(); + } + /** + * Assert if a notification was sent on-demand based on a truth-test callback. + * + * @param string|\Closure $notification + * @param callable|null $callback + * @return void + * @throws \Exception + * @static + */ + public static function assertSentOnDemand($notification, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ + $instance->assertSentOnDemand($notification, $callback); } /** * Assert if a notification was sent based on a truth-test callback. @@ -7528,6 +8312,19 @@ { /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ $instance->assertSentTo($notifiable, $notification, $callback); + } + /** + * Assert if a notification was sent on-demand a number of times. + * + * @param string $notification + * @param int $times + * @return void + * @static + */ + public static function assertSentOnDemandTimes($notification, $times = 1) + { + /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ + $instance->assertSentOnDemandTimes($notification, $times); } /** * Assert if a notification was sent a number of times. @@ -7568,6 +8365,19 @@ { /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ $instance->assertNothingSent(); + } + /** + * Assert the total amount of times a notification was sent. + * + * @param string $notification + * @param int $expectedCount + * @return void + * @static + */ + public static function assertSentTimes($notification, $expectedCount) + { + /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ + $instance->assertSentTimes($notification, $expectedCount); } /** * Assert the total amount of times a notification was sent. @@ -7575,6 +8385,7 @@ * @param int $expectedCount * @param string $notification * @return void + * @deprecated Use the assertSentTimes method instead * @static */ public static function assertTimesSent($expectedCount, $notification) @@ -7644,6 +8455,16 @@ public static function hasMacro($name) { return \Illuminate\Support\Testing\Fakes\NotificationFake::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Support\Testing\Fakes\NotificationFake::flushMacros(); } } @@ -7651,7 +8472,7 @@ * * * @method static mixed reset(array $credentials, \Closure $callback) - * @method static string sendResetLink(array $credentials) + * @method static string sendResetLink(array $credentials, \Closure $callback = null) * @method static \Illuminate\Contracts\Auth\CanResetPassword getUser(array $credentials) * @method static string createToken(\Illuminate\Contracts\Auth\CanResetPassword $user) * @method static void deleteToken(\Illuminate\Contracts\Auth\CanResetPassword $user) @@ -7700,7 +8521,6 @@ /** * * - * @method static void popUsing(string $workerName, callable $callback) * @see \Illuminate\Queue\QueueManager * @see \Illuminate\Queue\Queue */ @@ -7861,6 +8681,29 @@ { /** @var \Illuminate\Queue\QueueManager $instance */ return $instance->getName($connection); + } + /** + * Get the application instance used by the manager. + * + * @return \Illuminate\Contracts\Foundation\Application + * @static + */ + public static function getApplication() + { + /** @var \Illuminate\Queue\QueueManager $instance */ + return $instance->getApplication(); + } + /** + * Set the application instance used by the manager. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return \Illuminate\Queue\QueueManager + * @static + */ + public static function setApplication($app) + { + /** @var \Illuminate\Queue\QueueManager $instance */ + return $instance->setApplication($app); } /** * Assert if a job was pushed based on a truth-test callback. @@ -7980,7 +8823,7 @@ /** * Push a new job onto the queue. * - * @param string $job + * @param string|object $job * @param mixed $data * @param string|null $queue * @return mixed @@ -8009,7 +8852,7 @@ * Push a new job onto the queue after a delay. * * @param \DateTimeInterface|\DateInterval|int $delay - * @param string $job + * @param string|object $job * @param mixed $data * @param string|null $queue * @return mixed @@ -8024,7 +8867,7 @@ * Push a new job onto the queue. * * @param string $queue - * @param string $job + * @param string|object $job * @param mixed $data * @return mixed * @static @@ -8039,7 +8882,7 @@ * * @param string $queue * @param \DateTimeInterface|\DateInterval|int $delay - * @param string $job + * @param string|object $job * @param mixed $data * @return mixed * @static @@ -8136,13 +8979,24 @@ /** * Register a callback to be executed when creating job payloads. * - * @param callable $callback + * @param callable|null $callback * @return void * @static */ public static function createPayloadUsing($callback) { //Method inherited from \Illuminate\Queue\Queue \Illuminate\Queue\SyncQueue::createPayloadUsing($callback); + } + /** + * Get the container instance being used by the connection. + * + * @return \Illuminate\Container\Container + * @static + */ + public static function getContainer() + { //Method inherited from \Illuminate\Queue\Queue + /** @var \Illuminate\Queue\SyncQueue $instance */ + return $instance->getContainer(); } /** * Set the IoC container instance. @@ -8408,6 +9262,16 @@ public static function hasMacro($name) { return \Illuminate\Routing\Redirector::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Routing\Redirector::flushMacros(); } } @@ -8494,6 +9358,18 @@ { /** @var \Illuminate\Http\Request $instance */ return $instance->fullUrlWithQuery($query); + } + /** + * Get the full URL for the request without the given query string parameters. + * + * @param array|string $query + * @return string + * @static + */ + public static function fullUrlWithoutQuery($keys) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->fullUrlWithoutQuery($keys); } /** * Get the current path info for the request. @@ -8566,7 +9442,7 @@ return $instance->routeIs(...$patterns); } /** - * Determine if the current request URL and query string matches a pattern. + * Determine if the current request URL and query string match a pattern. * * @param mixed $patterns * @return bool @@ -8589,7 +9465,7 @@ return $instance->ajax(); } /** - * Determine if the request is the result of an PJAX call. + * Determine if the request is the result of a PJAX call. * * @return bool * @static @@ -8600,7 +9476,7 @@ return $instance->pjax(); } /** - * Determine if the request is the result of an prefetch call. + * Determine if the request is the result of a prefetch call. * * @return bool * @static @@ -8665,6 +9541,18 @@ { /** @var \Illuminate\Http\Request $instance */ return $instance->merge($input); + } + /** + * Merge new input into the request's input, but only when that key is missing from the request. + * + * @param array $input + * @return \Illuminate\Http\Request + * @static + */ + public static function mergeIfMissing($input) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->mergeIfMissing($input); } /** * Replace the input for the current request. @@ -8732,12 +9620,13 @@ /** * Clones a request and overrides some of its parameters. * - * @param array $query The GET parameters - * @param array $request The POST parameters - * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) - * @param array $cookies The COOKIE parameters - * @param array $files The FILES parameters - * @param array $server The SERVER parameters + * @return static + * @param array|null $query The GET parameters + * @param array|null $request The POST parameters + * @param array|null $attributes The request attributes (parameters parsed from the PATH_INFO, ...) + * @param array|null $cookies The COOKIE parameters + * @param array|null $files The FILES parameters + * @param array|null $server The SERVER parameters * @return static * @static */ @@ -8979,6 +9868,7 @@ * @param array $server The server parameters ($_SERVER) * @param string|resource|null $content The raw body data * @return static + * @throws BadRequestException When the URI is invalid * @static */ public static function create($uri, $method = 'GET', $parameters = [], $cookies = [], $files = [], $server = [], $content = null) @@ -9027,7 +9917,7 @@ /** * Gets the list of trusted proxies. * - * @return array An array of trusted proxies + * @return array * @static */ public static function getTrustedProxies() @@ -9059,7 +9949,7 @@ /** * Gets the list of trusted host patterns. * - * @return array An array of trusted host patterns + * @return array * @static */ public static function getTrustedHosts() @@ -9072,7 +9962,7 @@ * It builds a normalized query string, where keys/value pairs are alphabetized, * have consistent escaping and unneeded delimiters are removed. * - * @return string A normalized query string for the Request + * @return string * @static */ public static function normalizeQueryString($qs) @@ -9099,7 +9989,7 @@ /** * Checks whether support for the _method request parameter is enabled. * - * @return bool True when the _method request parameter is enabled, false otherwise + * @return bool * @static */ public static function getHttpMethodParameterOverride() @@ -9125,7 +10015,8 @@ * like whether the session is started or not. It is just a way to check if this Request * is associated with a Session instance. * - * @return bool true when the Request contains a Session object, false otherwise + * @param bool $skipIfUninitialized When true, ignores factories injected by `setSessionFactory` + * @return bool * @static */ public static function hasSession() @@ -9147,6 +10038,7 @@ * * * @internal + * @param callable(): SessionInterface $factory * @static */ public static function setSessionFactory($factory) @@ -9163,7 +10055,7 @@ * * Use this method carefully; you should use getClientIp() instead. * - * @return array The client IP addresses + * @return array * @see getClientIp() * @static */ @@ -9185,7 +10077,7 @@ * ("Client-Ip" for instance), configure it via the $trustedHeaderSet * argument of the Request::setTrustedProxies() method instead. * - * @return string|null The client IP address + * @return string|null * @see getClientIps() * @see https://wikipedia.org/wiki/X-Forwarded-For * @static @@ -9279,7 +10171,7 @@ * * The "X-Forwarded-Port" header must contain the client port. * - * @return int|string can be a string if fetched from the server bag + * @return int|string|null Can be a string if fetched from the server bag * @static */ public static function getPort() @@ -9312,7 +10204,7 @@ /** * Gets the user info. * - * @return string A user name and, optionally, scheme-specific information about how to gain authorization to access the server + * @return string|null A user name if any and, optionally, scheme-specific information about how to gain authorization to access the server * @static */ public static function getUserInfo() @@ -9350,7 +10242,7 @@ * If the URL was called with basic authentication, the user * and the password are not added to the generated string. * - * @return string The scheme and HTTP host + * @return string * @static */ public static function getSchemeAndHttpHost() @@ -9361,7 +10253,7 @@ /** * Generates a normalized URI (URL) for the Request. * - * @return string A normalized URI (URL) for the Request + * @return string * @see getQueryString() * @static */ @@ -9374,7 +10266,7 @@ * Generates a normalized URI for the given path. * * @param string $path A path to use instead of the current one - * @return string The normalized URI for the path + * @return string * @static */ public static function getUriForPath($path) @@ -9397,7 +10289,7 @@ * - "/a/b/c/other" -> "other" * - "/a/x/y" -> "../../x/y" * - * @return string The relative target path + * @return string * @static */ public static function getRelativeUriForPath($path) @@ -9411,7 +10303,7 @@ * It builds a normalized query string, where keys/value pairs are alphabetized * and have consistent escaping. * - * @return string|null A normalized query string for the Request + * @return string|null * @static */ public static function getQueryString() @@ -9473,7 +10365,7 @@ * * The method is always an uppercased string. * - * @return string The request method + * @return string * @see getRealMethod() * @static */ @@ -9485,7 +10377,7 @@ /** * Gets the "real" request method. * - * @return string The request method + * @return string * @see getMethod() * @static */ @@ -9497,7 +10389,7 @@ /** * Gets the mime type associated with the format. * - * @return string|null The associated mime type (null if not found) + * @return string|null * @static */ public static function getMimeType($format) @@ -9508,7 +10400,7 @@ /** * Gets the mime types associated with the format. * - * @return array The associated mime types + * @return array * @static */ public static function getMimeTypes($format) @@ -9518,7 +10410,7 @@ /** * Gets the format associated with the mime type. * - * @return string|null The format (null if not found) + * @return string|null * @static */ public static function getFormat($mimeType) @@ -9547,7 +10439,7 @@ * * $default * * @see getPreferredFormat - * @return string|null The request format + * @return string|null * @static */ public static function getRequestFormat($default = 'html') @@ -9568,7 +10460,7 @@ /** * Gets the format associated with the request. * - * @return string|null The format (null if no content type is present) + * @return string|null * @static */ public static function getContentType() @@ -9657,7 +10549,7 @@ * Checks whether the method is cacheable or not. * * @see https://tools.ietf.org/html/rfc7231#section-4.2.3 - * @return bool True for GET and HEAD, false otherwise + * @return bool * @static */ public static function isMethodCacheable() @@ -9674,7 +10566,7 @@ * if the proxy is trusted (see "setTrustedProxies()"), otherwise it returns * the latter (from the "SERVER_PROTOCOL" server parameter). * - * @return string + * @return string|null * @static */ public static function getProtocolVersion() @@ -9686,7 +10578,7 @@ * Returns the request body content. * * @param bool $asResource If true, a resource will be returned - * @return string|resource The request body content or a resource to read the body stream + * @return string|resource * @static */ public static function getContent($asResource = false) @@ -9697,7 +10589,7 @@ /** * Gets the Etags. * - * @return array The entity tags + * @return array * @static */ public static function getETags() @@ -9735,7 +10627,7 @@ * Returns the preferred language. * * @param string[] $locales An array of ordered available locales - * @return string|null The preferred locale + * @return string|null * @static */ public static function getPreferredLanguage($locales = null) @@ -9744,9 +10636,9 @@ return $instance->getPreferredLanguage($locales); } /** - * Gets a list of languages acceptable by the client browser. + * Gets a list of languages acceptable by the client browser ordered in the user browser preferences. * - * @return array Languages ordered in the user browser preferences + * @return array * @static */ public static function getLanguages() @@ -9755,9 +10647,9 @@ return $instance->getLanguages(); } /** - * Gets a list of charsets acceptable by the client browser. + * Gets a list of charsets acceptable by the client browser in preferable order. * - * @return array List of charsets in preferable order + * @return array * @static */ public static function getCharsets() @@ -9766,9 +10658,9 @@ return $instance->getCharsets(); } /** - * Gets a list of encodings acceptable by the client browser. + * Gets a list of encodings acceptable by the client browser in preferable order. * - * @return array List of encodings in preferable order + * @return array * @static */ public static function getEncodings() @@ -9777,9 +10669,9 @@ return $instance->getEncodings(); } /** - * Gets a list of content types acceptable by the client browser. + * Gets a list of content types acceptable by the client browser in preferable order. * - * @return array List of content types in preferable order + * @return array * @static */ public static function getAcceptableContentTypes() @@ -9788,13 +10680,13 @@ return $instance->getAcceptableContentTypes(); } /** - * Returns true if the request is a XMLHttpRequest. + * Returns true if the request is an XMLHttpRequest. * * It works if your JavaScript library sets an X-Requested-With HTTP header. * It is known to work with common JavaScript frameworks: * * @see https://wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript - * @return bool true if the request is an XMLHttpRequest, false otherwise + * @return bool * @static */ public static function isXmlHttpRequest() @@ -9819,7 +10711,7 @@ * This can be useful to determine whether or not to trust the * contents of a proxy-specific header. * - * @return bool true if the request came from a trusted proxy, false otherwise + * @return bool * @static */ public static function isFromTrustedProxy() @@ -9946,7 +10838,7 @@ * * @param string|null $key * @param string|array|null $default - * @return string|array + * @return string|array|null * @static */ public static function old($key = null, $default = null) @@ -10090,13 +10982,14 @@ * * @param string $key * @param callable $callback + * @param callable|null $default * @return $this|mixed * @static */ - public static function whenHas($key, $callback) + public static function whenHas($key, $callback, $default = null) { /** @var \Illuminate\Http\Request $instance */ - return $instance->whenHas($key, $callback); + return $instance->whenHas($key, $callback, $default); } /** * Determine if the request contains a non-empty value for an input item. @@ -10139,13 +11032,14 @@ * * @param string $key * @param callable $callback + * @param callable|null $default * @return $this|mixed * @static */ - public static function whenFilled($key, $callback) + public static function whenFilled($key, $callback, $default = null) { /** @var \Illuminate\Http\Request $instance */ - return $instance->whenFilled($key, $callback); + return $instance->whenFilled($key, $callback, $default); } /** * Determine if the request is missing a given input item key. @@ -10209,6 +11103,32 @@ { /** @var \Illuminate\Http\Request $instance */ return $instance->boolean($key, $default); + } + /** + * Retrieve input from the request as a Carbon instance. + * + * @param string $key + * @param string|null $format + * @param string|null $tz + * @return \Illuminate\Support\Carbon|null + * @static + */ + public static function date($key, $format = null, $tz = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->date($key, $format, $tz); + } + /** + * Retrieve input from the request as a collection. + * + * @param array|string|null $key + * @return \Illuminate\Support\Collection + * @static + */ + public static function collect($key = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->collect($key); } /** * Get a subset containing the provided keys with values from the input data. @@ -10324,7 +11244,7 @@ /** * Dump the request items and end the script. * - * @param array|mixed $keys + * @param mixed $keys * @return void * @static */ @@ -10336,7 +11256,7 @@ /** * Dump the items. * - * @param array $keys + * @param mixed $keys * @return \Illuminate\Http\Request * @static */ @@ -10380,6 +11300,16 @@ public static function hasMacro($name) { return \Illuminate\Http\Request::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Http\Request::flushMacros(); } /** * @@ -10438,7 +11368,7 @@ /** * Create a new response instance. * - * @param string $content + * @param mixed $content * @param int $status * @param array $headers * @return \Illuminate\Http\Response @@ -10675,6 +11605,16 @@ public static function hasMacro($name) { return \Illuminate\Routing\ResponseFactory::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Routing\ResponseFactory::flushMacros(); } } @@ -10682,12 +11622,15 @@ * * * @method static \Illuminate\Routing\RouteRegistrar as(string $value) + * @method static \Illuminate\Routing\RouteRegistrar controller(string $controller) * @method static \Illuminate\Routing\RouteRegistrar domain(string $value) * @method static \Illuminate\Routing\RouteRegistrar middleware(array|string|null $middleware) * @method static \Illuminate\Routing\RouteRegistrar name(string $value) * @method static \Illuminate\Routing\RouteRegistrar namespace(string|null $value) - * @method static \Illuminate\Routing\RouteRegistrar prefix(string $prefix) - * @method static \Illuminate\Routing\RouteRegistrar where(array $where) + * @method static \Illuminate\Routing\RouteRegistrar prefix(string $prefix) + * @method static \Illuminate\Routing\RouteRegistrar scopeBindings() + * @method static \Illuminate\Routing\RouteRegistrar where(array $where) + * @method static \Illuminate\Routing\RouteRegistrar withoutMiddleware(array|string $middleware) * @see \Illuminate\Routing\Router */ class Route { @@ -11170,6 +12113,17 @@ { /** @var \Illuminate\Routing\Router $instance */ return $instance->pushMiddlewareToGroup($group, $middleware); + } + /** + * Flush the router's middleware groups. + * + * @return \Illuminate\Routing\Router + * @static + */ + public static function flushMiddlewareGroups() + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->flushMiddlewareGroups(); } /** * Add a new route parameter binder. @@ -11477,6 +12431,18 @@ public static function uniqueMiddleware($middleware) { return \Illuminate\Routing\Router::uniqueMiddleware($middleware); + } + /** + * Set the container instance used by the router. + * + * @param \Illuminate\Container\Container $container + * @return \Illuminate\Routing\Router + * @static + */ + public static function setContainer($container) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->setContainer($container); } /** * Register a custom macro. @@ -11513,6 +12479,16 @@ public static function hasMacro($name) { return \Illuminate\Routing\Router::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Routing\Router::flushMacros(); } /** * Dynamically handle calls to the class. @@ -11578,6 +12554,30 @@ */ class Schema { /** + * Create a database in the schema. + * + * @param string $name + * @return bool + * @static + */ + public static function createDatabase($name) + { + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->createDatabase($name); + } + /** + * Drop a database from the schema if the database exists. + * + * @param string $name + * @return bool + * @static + */ + public static function dropDatabaseIfExists($name) + { + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->dropDatabaseIfExists($name); + } + /** * Determine if the given table exists. * * @param string $table @@ -11661,6 +12661,7 @@ * * @param string $type * @return void + * @throws \InvalidArgumentException * @static */ public static function defaultMorphKeyType($type) @@ -11833,8 +12834,6 @@ * @param string $name * @param string $type * @return void - * @throws \Doctrine\DBAL\DBALException - * @throws \RuntimeException * @static */ public static function registerCustomDoctrineType($class, $name, $type) @@ -11978,6 +12977,40 @@ { //Method inherited from \Illuminate\Support\Manager /** @var \Illuminate\Session\SessionManager $instance */ return $instance->getDrivers(); + } + /** + * Get the container instance used by the manager. + * + * @return \Illuminate\Contracts\Container\Container + * @static + */ + public static function getContainer() + { //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Session\SessionManager $instance */ + return $instance->getContainer(); + } + /** + * Set the container instance used by the manager. + * + * @param \Illuminate\Contracts\Container\Container $container + * @return \Illuminate\Session\SessionManager + * @static + */ + public static function setContainer($container) + { //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Session\SessionManager $instance */ + return $instance->setContainer($container); + } + /** + * Forget all of the resolved driver instances. + * + * @return \Illuminate\Session\SessionManager + * @static + */ + public static function forgetDrivers() + { //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Session\SessionManager $instance */ + return $instance->forgetDrivers(); } /** * Start the session, reading the data from a handler. @@ -12046,6 +13079,18 @@ { /** @var \Illuminate\Session\Store $instance */ return $instance->exists($key); + } + /** + * Determine if the given key is missing from the session data. + * + * @param string|array $key + * @return bool + * @static + */ + public static function missing($key) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->missing($key); } /** * Checks if a key is present and not null. @@ -12531,6 +13576,18 @@ { /** @var \Illuminate\Filesystem\FilesystemManager $instance */ return $instance->cloud(); + } + /** + * Build an on-demand disk. + * + * @param string|array $config + * @return \Illuminate\Filesystem\FilesystemAdapter + * @static + */ + public static function build($config) + { + /** @var \Illuminate\Filesystem\FilesystemManager $instance */ + return $instance->build($config); } /** * Create an instance of the local driver. @@ -12651,6 +13708,18 @@ { /** @var \Illuminate\Filesystem\FilesystemManager $instance */ return $instance->extend($driver, $callback); + } + /** + * Set the application instance used by the manager. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return \Illuminate\Filesystem\FilesystemManager + * @static + */ + public static function setApplication($app) + { + /** @var \Illuminate\Filesystem\FilesystemManager $instance */ + return $instance->setApplication($app); } /** * Assert that the given file exists. @@ -12759,7 +13828,7 @@ * Write the contents of a file. * * @param string $path - * @param string|resource $contents + * @param \Psr\Http\Message\StreamInterface|\Illuminate\Http\File|\Illuminate\Http\UploadedFile|string|resource $contents * @param mixed $options * @return bool * @static @@ -13094,6 +14163,78 @@ { /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ return $instance->getDriver(); + } + /** + * Define a custom temporary URL builder callback. + * + * @param \Closure $callback + * @return void + * @static + */ + public static function buildTemporaryUrlsUsing($callback) + { + /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + $instance->buildTemporaryUrlsUsing($callback); + } + /** + * Register a custom macro. + * + * @param string $name + * @param object|callable $macro + * @return void + * @static + */ + public static function macro($name, $macro) + { + \Illuminate\Filesystem\FilesystemAdapter::macro($name, $macro); + } + /** + * Mix another object into the class. + * + * @param object $mixin + * @param bool $replace + * @return void + * @throws \ReflectionException + * @static + */ + public static function mixin($mixin, $replace = true) + { + \Illuminate\Filesystem\FilesystemAdapter::mixin($mixin, $replace); + } + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Filesystem\FilesystemAdapter::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Filesystem\FilesystemAdapter::flushMacros(); + } + /** + * Dynamically handle calls to the class. + * + * @param string $method + * @param array $parameters + * @return mixed + * @throws \BadMethodCallException + * @static + */ + public static function macroCall($method, $parameters) + { + /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ + return $instance->macroCall($method, $parameters); } } @@ -13580,6 +14721,16 @@ public static function hasMacro($name) { return \Illuminate\Routing\UrlGenerator::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Routing\UrlGenerator::flushMacros(); } } @@ -13674,6 +14825,17 @@ { /** @var \Illuminate\Validation\Factory $instance */ $instance->replacer($rule, $replacer); + } + /** + * Indicate that unvalidated array keys should be excluded, even if the parent array was validated. + * + * @return void + * @static + */ + public static function excludeUnvalidatedArrayKeys() + { + /** @var \Illuminate\Validation\Factory $instance */ + $instance->excludeUnvalidatedArrayKeys(); } /** * Set the Validator instance resolver. @@ -13720,6 +14882,29 @@ { /** @var \Illuminate\Validation\Factory $instance */ $instance->setPresenceVerifier($presenceVerifier); + } + /** + * Get the container instance used by the validation factory. + * + * @return \Illuminate\Contracts\Container\Container + * @static + */ + public static function getContainer() + { + /** @var \Illuminate\Validation\Factory $instance */ + return $instance->getContainer(); + } + /** + * Set the container instance used by the validation factory. + * + * @param \Illuminate\Contracts\Container\Container $container + * @return \Illuminate\Validation\Factory + * @static + */ + public static function setContainer($container) + { + /** @var \Illuminate\Validation\Factory $instance */ + return $instance->setContainer($container); } } @@ -13786,6 +14971,21 @@ { /** @var \Illuminate\View\Factory $instance */ return $instance->renderWhen($condition, $view, $data, $mergeData); + } + /** + * Get the rendered content of the view based on the negation of a given condition. + * + * @param bool $condition + * @param string $view + * @param \Illuminate\Contracts\Support\Arrayable|array $data + * @param array $mergeData + * @return string + * @static + */ + public static function renderUnless($condition, $view, $data = [], $mergeData = []) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->renderUnless($condition, $view, $data, $mergeData); } /** * Get the rendered contents of a partial from a loop. @@ -14145,6 +15345,16 @@ public static function hasMacro($name) { return \Illuminate\View\Factory::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\View\Factory::flushMacros(); } /** * Start a component rendering process. @@ -14182,19 +15392,33 @@ { /** @var \Illuminate\View\Factory $instance */ return $instance->renderComponent(); + } + /** + * Get an item from the component data that exists above the current component. + * + * @param string $key + * @param mixed $default + * @return mixed|null + * @static + */ + public static function getConsumableComponentData($key, $default = null) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->getConsumableComponentData($key, $default); } /** * Start the slot rendering process. * * @param string $name * @param string|null $content + * @param array $attributes * @return void * @static */ - public static function slot($name, $content = null) + public static function slot($name, $content = null, $attributes = []) { /** @var \Illuminate\View\Factory $instance */ - $instance->slot($name, $content); + $instance->slot($name, $content, $attributes); } /** * Save the slot content for rendering. @@ -14601,6 +15825,34 @@ public static function debug() { return \Illuminate\Support\Collection::debug(); + } + /** + * + * + * @see \Maatwebsite\Excel\Mixins\DownloadCollectionMixin::downloadExcel() + * @param string $fileName + * @param string|null $writerType + * @param mixed $withHeadings + * @param array $responseHeaders + * @static + */ + public static function downloadExcel($fileName, $writerType = null, $withHeadings = false, $responseHeaders = []) + { + return \Illuminate\Support\Collection::downloadExcel($fileName, $writerType, $withHeadings, $responseHeaders); + } + /** + * + * + * @see \Maatwebsite\Excel\Mixins\StoreCollectionMixin::storeExcel() + * @param string $filePath + * @param string|null $disk + * @param string|null $writerType + * @param mixed $withHeadings + * @static + */ + public static function storeExcel($filePath, $disk = null, $writerType = null, $withHeadings = false) + { + return \Illuminate\Support\Collection::storeExcel($filePath, $disk, $writerType, $withHeadings); } } @@ -15258,6 +16510,16 @@ public static function hasMacro($name) { return \Collective\Html\FormBuilder::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Collective\Html\FormBuilder::flushMacros(); } /** * Dynamically handle calls to the class. @@ -15661,6 +16923,16 @@ public static function hasMacro($name) { return \Collective\Html\HtmlBuilder::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Collective\Html\HtmlBuilder::flushMacros(); } /** * Dynamically handle calls to the class. @@ -16064,6 +17336,16 @@ public static function hasMacro($name) { return \Collective\Html\HtmlBuilder::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Collective\Html\HtmlBuilder::flushMacros(); } /** * Dynamically handle calls to the class. @@ -16189,9 +17471,10 @@ namespace Carbon { /** * A simple API extension for DateTime. + * + * @mixin DeprecatedProperties * * - * * @property int $year * @property int $yearIso * @property int $month @@ -16201,480 +17484,476 @@ * @property int $second * @property int $micro * @property int $microsecond - * @property int|float|string $timestamp seconds since the Unix Epoch - * @property string $englishDayOfWeek the day of week in English - * @property string $shortEnglishDayOfWeek the abbreviated day of week in English - * @property string $englishMonth the month in English - * @property string $shortEnglishMonth the abbreviated month in English - * @property string $localeDayOfWeek the day of week in current locale LC_TIME - * @property string $shortLocaleDayOfWeek the abbreviated day of week in current locale LC_TIME - * @property string $localeMonth the month in current locale LC_TIME - * @property string $shortLocaleMonth the abbreviated month in current locale LC_TIME + * @property int|float|string $timestamp seconds since the Unix Epoch + * @property string $englishDayOfWeek the day of week in English + * @property string $shortEnglishDayOfWeek the abbreviated day of week in English + * @property string $englishMonth the month in English + * @property string $shortEnglishMonth the abbreviated month in English * @property int $milliseconds * @property int $millisecond * @property int $milli - * @property int $week 1 through 53 - * @property int $isoWeek 1 through 53 - * @property int $weekYear year according to week format - * @property int $isoWeekYear year according to ISO week format - * @property int $dayOfYear 1 through 366 - * @property int $age does a diffInYears() with default parameters - * @property int $offset the timezone offset in seconds from UTC - * @property int $offsetMinutes the timezone offset in minutes from UTC - * @property int $offsetHours the timezone offset in hours from UTC - * @property CarbonTimeZone $timezone the current timezone - * @property CarbonTimeZone $tz alias of $timezone - * @property-read int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) - * @property-read int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) - * @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday - * @property-read int $daysInMonth number of days in the given month - * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) - * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) - * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name - * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName - * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read int $noZeroHour current hour from 1 to 24 - * @property-read int $weeksInYear 51 through 53 - * @property-read int $isoWeeksInYear 51 through 53 - * @property-read int $weekOfMonth 1 through 5 - * @property-read int $weekNumberInMonth 1 through 5 - * @property-read int $firstWeekDay 0 through 6 - * @property-read int $lastWeekDay 0 through 6 - * @property-read int $daysInYear 365 or 366 - * @property-read int $quarter the quarter of this instance, 1 - 4 - * @property-read int $decade the decade of this instance - * @property-read int $century the century of this instance - * @property-read int $millennium the millennium of this instance - * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise - * @property-read bool $local checks if the timezone is local, true if local, false otherwise - * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise - * @property-read string $timezoneName the current timezone name - * @property-read string $tzName alias of $timezoneName - * @property-read string $locale locale of the current instance - * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) - * @method bool isLocal() Check if the current instance has non-UTC timezone. - * @method bool isValid() Check if the current instance is a valid date. - * @method bool isDST() Check if the current instance is in a daylight saving time. - * @method bool isSunday() Checks if the instance day is sunday. - * @method bool isMonday() Checks if the instance day is monday. - * @method bool isTuesday() Checks if the instance day is tuesday. - * @method bool isWednesday() Checks if the instance day is wednesday. - * @method bool isThursday() Checks if the instance day is thursday. - * @method bool isFriday() Checks if the instance day is friday. - * @method bool isSaturday() Checks if the instance day is saturday. - * @method bool isSameYear(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. - * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. - * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. - * @method bool isSameWeek(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. - * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. - * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. - * @method bool isSameDay(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. - * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. - * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. - * @method bool isSameHour(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. - * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. - * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. - * @method bool isSameMinute(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. - * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. - * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. - * @method bool isSameSecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. - * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. - * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. - * @method bool isSameMicro(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameMicrosecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. - * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. - * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. - * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. - * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. - * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. - * @method bool isSameDecade(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. - * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. - * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. - * @method bool isSameCentury(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. - * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. - * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. - * @method bool isSameMillennium(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. - * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. - * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. - * @method $this years(int $value) Set current instance year to the given value. - * @method $this year(int $value) Set current instance year to the given value. - * @method $this setYears(int $value) Set current instance year to the given value. - * @method $this setYear(int $value) Set current instance year to the given value. - * @method $this months(int $value) Set current instance month to the given value. - * @method $this month(int $value) Set current instance month to the given value. - * @method $this setMonths(int $value) Set current instance month to the given value. - * @method $this setMonth(int $value) Set current instance month to the given value. - * @method $this days(int $value) Set current instance day to the given value. - * @method $this day(int $value) Set current instance day to the given value. - * @method $this setDays(int $value) Set current instance day to the given value. - * @method $this setDay(int $value) Set current instance day to the given value. - * @method $this hours(int $value) Set current instance hour to the given value. - * @method $this hour(int $value) Set current instance hour to the given value. - * @method $this setHours(int $value) Set current instance hour to the given value. - * @method $this setHour(int $value) Set current instance hour to the given value. - * @method $this minutes(int $value) Set current instance minute to the given value. - * @method $this minute(int $value) Set current instance minute to the given value. - * @method $this setMinutes(int $value) Set current instance minute to the given value. - * @method $this setMinute(int $value) Set current instance minute to the given value. - * @method $this seconds(int $value) Set current instance second to the given value. - * @method $this second(int $value) Set current instance second to the given value. - * @method $this setSeconds(int $value) Set current instance second to the given value. - * @method $this setSecond(int $value) Set current instance second to the given value. - * @method $this millis(int $value) Set current instance millisecond to the given value. - * @method $this milli(int $value) Set current instance millisecond to the given value. - * @method $this setMillis(int $value) Set current instance millisecond to the given value. - * @method $this setMilli(int $value) Set current instance millisecond to the given value. - * @method $this milliseconds(int $value) Set current instance millisecond to the given value. - * @method $this millisecond(int $value) Set current instance millisecond to the given value. - * @method $this setMilliseconds(int $value) Set current instance millisecond to the given value. - * @method $this setMillisecond(int $value) Set current instance millisecond to the given value. - * @method $this micros(int $value) Set current instance microsecond to the given value. - * @method $this micro(int $value) Set current instance microsecond to the given value. - * @method $this setMicros(int $value) Set current instance microsecond to the given value. - * @method $this setMicro(int $value) Set current instance microsecond to the given value. - * @method $this microseconds(int $value) Set current instance microsecond to the given value. - * @method $this microsecond(int $value) Set current instance microsecond to the given value. - * @method $this setMicroseconds(int $value) Set current instance microsecond to the given value. - * @method $this setMicrosecond(int $value) Set current instance microsecond to the given value. - * @method $this addYears(int $value = 1) Add years (the $value count passed in) to the instance (using date interval). - * @method $this addYear() Add one year to the instance (using date interval). - * @method $this subYears(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval). - * @method $this subYear() Sub one year to the instance (using date interval). - * @method $this addYearsWithOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. - * @method $this subYearsWithOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. - * @method $this addYearsWithoutOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearsWithoutOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearsWithNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearsWithNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearsNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearsNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonths(int $value = 1) Add months (the $value count passed in) to the instance (using date interval). - * @method $this addMonth() Add one month to the instance (using date interval). - * @method $this subMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval). - * @method $this subMonth() Sub one month to the instance (using date interval). - * @method $this addMonthsWithOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. - * @method $this subMonthsWithOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. - * @method $this addMonthsWithoutOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthsWithoutOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthsWithNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthsWithNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthsNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthsNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDays(int $value = 1) Add days (the $value count passed in) to the instance (using date interval). - * @method $this addDay() Add one day to the instance (using date interval). - * @method $this subDays(int $value = 1) Sub days (the $value count passed in) to the instance (using date interval). - * @method $this subDay() Sub one day to the instance (using date interval). - * @method $this addHours(int $value = 1) Add hours (the $value count passed in) to the instance (using date interval). - * @method $this addHour() Add one hour to the instance (using date interval). - * @method $this subHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). - * @method $this subHour() Sub one hour to the instance (using date interval). - * @method $this addMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). - * @method $this addMinute() Add one minute to the instance (using date interval). - * @method $this subMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). - * @method $this subMinute() Sub one minute to the instance (using date interval). - * @method $this addSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). - * @method $this addSecond() Add one second to the instance (using date interval). - * @method $this subSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). - * @method $this subSecond() Sub one second to the instance (using date interval). - * @method $this addMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method $this addMilli() Add one millisecond to the instance (using date interval). - * @method $this subMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method $this subMilli() Sub one millisecond to the instance (using date interval). - * @method $this addMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method $this addMillisecond() Add one millisecond to the instance (using date interval). - * @method $this subMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method $this subMillisecond() Sub one millisecond to the instance (using date interval). - * @method $this addMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method $this addMicro() Add one microsecond to the instance (using date interval). - * @method $this subMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method $this subMicro() Sub one microsecond to the instance (using date interval). - * @method $this addMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method $this addMicrosecond() Add one microsecond to the instance (using date interval). - * @method $this subMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method $this subMicrosecond() Sub one microsecond to the instance (using date interval). - * @method $this addMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval). - * @method $this addMillennium() Add one millennium to the instance (using date interval). - * @method $this subMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval). - * @method $this subMillennium() Sub one millennium to the instance (using date interval). - * @method $this addMillenniaWithOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method $this subMillenniaWithOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method $this addMillenniaWithoutOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniaWithoutOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniaWithNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniaWithNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniaNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniaNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval). - * @method $this addCentury() Add one century to the instance (using date interval). - * @method $this subCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval). - * @method $this subCentury() Sub one century to the instance (using date interval). - * @method $this addCenturiesWithOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. - * @method $this subCenturiesWithOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. - * @method $this addCenturiesWithoutOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturiesWithoutOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturiesWithNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturiesWithNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturiesNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturiesNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval). - * @method $this addDecade() Add one decade to the instance (using date interval). - * @method $this subDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval). - * @method $this subDecade() Sub one decade to the instance (using date interval). - * @method $this addDecadesWithOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. - * @method $this subDecadesWithOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. - * @method $this addDecadesWithoutOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadesWithoutOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadesWithNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadesWithNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadesNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadesNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval). - * @method $this addQuarter() Add one quarter to the instance (using date interval). - * @method $this subQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval). - * @method $this subQuarter() Sub one quarter to the instance (using date interval). - * @method $this addQuartersWithOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method $this subQuartersWithOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method $this addQuartersWithoutOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuartersWithoutOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuartersWithNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuartersWithNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuartersNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuartersNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). - * @method $this addWeek() Add one week to the instance (using date interval). - * @method $this subWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). - * @method $this subWeek() Sub one week to the instance (using date interval). - * @method $this addWeekdays(int $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). - * @method $this addWeekday() Add one weekday to the instance (using date interval). - * @method $this subWeekdays(int $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). - * @method $this subWeekday() Sub one weekday to the instance (using date interval). - * @method $this addRealMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method $this addRealMicro() Add one microsecond to the instance (using timestamp). - * @method $this subRealMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method $this subRealMicro() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method $this addRealMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method $this addRealMicrosecond() Add one microsecond to the instance (using timestamp). - * @method $this subRealMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method $this subRealMicrosecond() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method $this addRealMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method $this addRealMilli() Add one millisecond to the instance (using timestamp). - * @method $this subRealMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method $this subRealMilli() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method $this addRealMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method $this addRealMillisecond() Add one millisecond to the instance (using timestamp). - * @method $this subRealMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method $this subRealMillisecond() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method $this addRealSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). - * @method $this addRealSecond() Add one second to the instance (using timestamp). - * @method $this subRealSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). - * @method $this subRealSecond() Sub one second to the instance (using timestamp). - * @method CarbonPeriod secondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. - * @method $this addRealMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). - * @method $this addRealMinute() Add one minute to the instance (using timestamp). - * @method $this subRealMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). - * @method $this subRealMinute() Sub one minute to the instance (using timestamp). - * @method CarbonPeriod minutesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. - * @method $this addRealHours(int $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). - * @method $this addRealHour() Add one hour to the instance (using timestamp). - * @method $this subRealHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). - * @method $this subRealHour() Sub one hour to the instance (using timestamp). - * @method CarbonPeriod hoursUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. - * @method $this addRealDays(int $value = 1) Add days (the $value count passed in) to the instance (using timestamp). - * @method $this addRealDay() Add one day to the instance (using timestamp). - * @method $this subRealDays(int $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). - * @method $this subRealDay() Sub one day to the instance (using timestamp). - * @method CarbonPeriod daysUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. - * @method $this addRealWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). - * @method $this addRealWeek() Add one week to the instance (using timestamp). - * @method $this subRealWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). - * @method $this subRealWeek() Sub one week to the instance (using timestamp). - * @method CarbonPeriod weeksUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. - * @method $this addRealMonths(int $value = 1) Add months (the $value count passed in) to the instance (using timestamp). - * @method $this addRealMonth() Add one month to the instance (using timestamp). - * @method $this subRealMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). - * @method $this subRealMonth() Sub one month to the instance (using timestamp). - * @method CarbonPeriod monthsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. - * @method $this addRealQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). - * @method $this addRealQuarter() Add one quarter to the instance (using timestamp). - * @method $this subRealQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). - * @method $this subRealQuarter() Sub one quarter to the instance (using timestamp). - * @method CarbonPeriod quartersUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. - * @method $this addRealYears(int $value = 1) Add years (the $value count passed in) to the instance (using timestamp). - * @method $this addRealYear() Add one year to the instance (using timestamp). - * @method $this subRealYears(int $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). - * @method $this subRealYear() Sub one year to the instance (using timestamp). - * @method CarbonPeriod yearsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. - * @method $this addRealDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). - * @method $this addRealDecade() Add one decade to the instance (using timestamp). - * @method $this subRealDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). - * @method $this subRealDecade() Sub one decade to the instance (using timestamp). - * @method CarbonPeriod decadesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. - * @method $this addRealCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). - * @method $this addRealCentury() Add one century to the instance (using timestamp). - * @method $this subRealCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). - * @method $this subRealCentury() Sub one century to the instance (using timestamp). - * @method CarbonPeriod centuriesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. - * @method $this addRealMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). - * @method $this addRealMillennium() Add one millennium to the instance (using timestamp). - * @method $this subRealMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). - * @method $this subRealMillennium() Sub one millennium to the instance (using timestamp). - * @method CarbonPeriod millenniaUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. - * @method $this roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method $this roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method $this floorYear(float $precision = 1) Truncate the current instance year with given precision. - * @method $this floorYears(float $precision = 1) Truncate the current instance year with given precision. - * @method $this ceilYear(float $precision = 1) Ceil the current instance year with given precision. - * @method $this ceilYears(float $precision = 1) Ceil the current instance year with given precision. - * @method $this roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method $this roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method $this floorMonth(float $precision = 1) Truncate the current instance month with given precision. - * @method $this floorMonths(float $precision = 1) Truncate the current instance month with given precision. - * @method $this ceilMonth(float $precision = 1) Ceil the current instance month with given precision. - * @method $this ceilMonths(float $precision = 1) Ceil the current instance month with given precision. - * @method $this roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this floorDay(float $precision = 1) Truncate the current instance day with given precision. - * @method $this floorDays(float $precision = 1) Truncate the current instance day with given precision. - * @method $this ceilDay(float $precision = 1) Ceil the current instance day with given precision. - * @method $this ceilDays(float $precision = 1) Ceil the current instance day with given precision. - * @method $this roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method $this roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method $this floorHour(float $precision = 1) Truncate the current instance hour with given precision. - * @method $this floorHours(float $precision = 1) Truncate the current instance hour with given precision. - * @method $this ceilHour(float $precision = 1) Ceil the current instance hour with given precision. - * @method $this ceilHours(float $precision = 1) Ceil the current instance hour with given precision. - * @method $this roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method $this roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method $this floorMinute(float $precision = 1) Truncate the current instance minute with given precision. - * @method $this floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. - * @method $this ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. - * @method $this ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. - * @method $this roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method $this roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method $this floorSecond(float $precision = 1) Truncate the current instance second with given precision. - * @method $this floorSeconds(float $precision = 1) Truncate the current instance second with given precision. - * @method $this ceilSecond(float $precision = 1) Ceil the current instance second with given precision. - * @method $this ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. - * @method $this roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method $this roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method $this floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. - * @method $this floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. - * @method $this ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. - * @method $this ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. - * @method $this roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method $this roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method $this floorCentury(float $precision = 1) Truncate the current instance century with given precision. - * @method $this floorCenturies(float $precision = 1) Truncate the current instance century with given precision. - * @method $this ceilCentury(float $precision = 1) Ceil the current instance century with given precision. - * @method $this ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. - * @method $this roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method $this roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method $this floorDecade(float $precision = 1) Truncate the current instance decade with given precision. - * @method $this floorDecades(float $precision = 1) Truncate the current instance decade with given precision. - * @method $this ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. - * @method $this ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. - * @method $this roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method $this roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method $this floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. - * @method $this floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. - * @method $this ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. - * @method $this ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. - * @method $this roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method $this roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method $this floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method $this floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method $this ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method $this ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method $this roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method $this roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method $this floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method $this floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method $this ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method $this ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method static Carbon|false createFromFormat(string $format, string $time, string|DateTimeZone $timezone = null) Parse a string into a new Carbon object according to the specified format. - * @method static Carbon __set_state(array $array) https://php.net/manual/en/datetime.set-state.php + * @property int $week 1 through 53 + * @property int $isoWeek 1 through 53 + * @property int $weekYear year according to week format + * @property int $isoWeekYear year according to ISO week format + * @property int $dayOfYear 1 through 366 + * @property int $age does a diffInYears() with default parameters + * @property int $offset the timezone offset in seconds from UTC + * @property int $offsetMinutes the timezone offset in minutes from UTC + * @property int $offsetHours the timezone offset in hours from UTC + * @property CarbonTimeZone $timezone the current timezone + * @property CarbonTimeZone $tz alias of $timezone + * @property-read int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) + * @property-read int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) + * @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday + * @property-read int $daysInMonth number of days in the given month + * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) + * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) + * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name + * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName + * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language + * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language + * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + * @property-read int $noZeroHour current hour from 1 to 24 + * @property-read int $weeksInYear 51 through 53 + * @property-read int $isoWeeksInYear 51 through 53 + * @property-read int $weekOfMonth 1 through 5 + * @property-read int $weekNumberInMonth 1 through 5 + * @property-read int $firstWeekDay 0 through 6 + * @property-read int $lastWeekDay 0 through 6 + * @property-read int $daysInYear 365 or 366 + * @property-read int $quarter the quarter of this instance, 1 - 4 + * @property-read int $decade the decade of this instance + * @property-read int $century the century of this instance + * @property-read int $millennium the millennium of this instance + * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise + * @property-read bool $local checks if the timezone is local, true if local, false otherwise + * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise + * @property-read string $timezoneName the current timezone name + * @property-read string $tzName alias of $timezoneName + * @property-read string $locale locale of the current instance + * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) + * @method bool isLocal() Check if the current instance has non-UTC timezone. + * @method bool isValid() Check if the current instance is a valid date. + * @method bool isDST() Check if the current instance is in a daylight saving time. + * @method bool isSunday() Checks if the instance day is sunday. + * @method bool isMonday() Checks if the instance day is monday. + * @method bool isTuesday() Checks if the instance day is tuesday. + * @method bool isWednesday() Checks if the instance day is wednesday. + * @method bool isThursday() Checks if the instance day is thursday. + * @method bool isFriday() Checks if the instance day is friday. + * @method bool isSaturday() Checks if the instance day is saturday. + * @method bool isSameYear(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. + * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. + * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. + * @method bool isSameWeek(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. + * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. + * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. + * @method bool isSameDay(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. + * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. + * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. + * @method bool isSameHour(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. + * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. + * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. + * @method bool isSameMinute(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. + * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. + * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. + * @method bool isSameSecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. + * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. + * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. + * @method bool isSameMicro(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. + * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. + * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. + * @method bool isSameMicrosecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. + * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. + * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. + * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. + * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. + * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. + * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. + * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. + * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. + * @method bool isSameDecade(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. + * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. + * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. + * @method bool isSameCentury(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. + * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. + * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. + * @method bool isSameMillennium(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. + * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. + * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. + * @method $this years(int $value) Set current instance year to the given value. + * @method $this year(int $value) Set current instance year to the given value. + * @method $this setYears(int $value) Set current instance year to the given value. + * @method $this setYear(int $value) Set current instance year to the given value. + * @method $this months(int $value) Set current instance month to the given value. + * @method $this month(int $value) Set current instance month to the given value. + * @method $this setMonths(int $value) Set current instance month to the given value. + * @method $this setMonth(int $value) Set current instance month to the given value. + * @method $this days(int $value) Set current instance day to the given value. + * @method $this day(int $value) Set current instance day to the given value. + * @method $this setDays(int $value) Set current instance day to the given value. + * @method $this setDay(int $value) Set current instance day to the given value. + * @method $this hours(int $value) Set current instance hour to the given value. + * @method $this hour(int $value) Set current instance hour to the given value. + * @method $this setHours(int $value) Set current instance hour to the given value. + * @method $this setHour(int $value) Set current instance hour to the given value. + * @method $this minutes(int $value) Set current instance minute to the given value. + * @method $this minute(int $value) Set current instance minute to the given value. + * @method $this setMinutes(int $value) Set current instance minute to the given value. + * @method $this setMinute(int $value) Set current instance minute to the given value. + * @method $this seconds(int $value) Set current instance second to the given value. + * @method $this second(int $value) Set current instance second to the given value. + * @method $this setSeconds(int $value) Set current instance second to the given value. + * @method $this setSecond(int $value) Set current instance second to the given value. + * @method $this millis(int $value) Set current instance millisecond to the given value. + * @method $this milli(int $value) Set current instance millisecond to the given value. + * @method $this setMillis(int $value) Set current instance millisecond to the given value. + * @method $this setMilli(int $value) Set current instance millisecond to the given value. + * @method $this milliseconds(int $value) Set current instance millisecond to the given value. + * @method $this millisecond(int $value) Set current instance millisecond to the given value. + * @method $this setMilliseconds(int $value) Set current instance millisecond to the given value. + * @method $this setMillisecond(int $value) Set current instance millisecond to the given value. + * @method $this micros(int $value) Set current instance microsecond to the given value. + * @method $this micro(int $value) Set current instance microsecond to the given value. + * @method $this setMicros(int $value) Set current instance microsecond to the given value. + * @method $this setMicro(int $value) Set current instance microsecond to the given value. + * @method $this microseconds(int $value) Set current instance microsecond to the given value. + * @method $this microsecond(int $value) Set current instance microsecond to the given value. + * @method $this setMicroseconds(int $value) Set current instance microsecond to the given value. + * @method $this setMicrosecond(int $value) Set current instance microsecond to the given value. + * @method $this addYears(int $value = 1) Add years (the $value count passed in) to the instance (using date interval). + * @method $this addYear() Add one year to the instance (using date interval). + * @method $this subYears(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval). + * @method $this subYear() Sub one year to the instance (using date interval). + * @method $this addYearsWithOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. + * @method $this subYearsWithOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. + * @method $this addYearsWithoutOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subYearsWithoutOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addYearsWithNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subYearsWithNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addYearsNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subYearsNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMonths(int $value = 1) Add months (the $value count passed in) to the instance (using date interval). + * @method $this addMonth() Add one month to the instance (using date interval). + * @method $this subMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval). + * @method $this subMonth() Sub one month to the instance (using date interval). + * @method $this addMonthsWithOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. + * @method $this subMonthsWithOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. + * @method $this addMonthsWithoutOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMonthsWithoutOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMonthsWithNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMonthsWithNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMonthsNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMonthsNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDays(int $value = 1) Add days (the $value count passed in) to the instance (using date interval). + * @method $this addDay() Add one day to the instance (using date interval). + * @method $this subDays(int $value = 1) Sub days (the $value count passed in) to the instance (using date interval). + * @method $this subDay() Sub one day to the instance (using date interval). + * @method $this addHours(int $value = 1) Add hours (the $value count passed in) to the instance (using date interval). + * @method $this addHour() Add one hour to the instance (using date interval). + * @method $this subHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). + * @method $this subHour() Sub one hour to the instance (using date interval). + * @method $this addMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). + * @method $this addMinute() Add one minute to the instance (using date interval). + * @method $this subMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). + * @method $this subMinute() Sub one minute to the instance (using date interval). + * @method $this addSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). + * @method $this addSecond() Add one second to the instance (using date interval). + * @method $this subSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). + * @method $this subSecond() Sub one second to the instance (using date interval). + * @method $this addMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). + * @method $this addMilli() Add one millisecond to the instance (using date interval). + * @method $this subMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). + * @method $this subMilli() Sub one millisecond to the instance (using date interval). + * @method $this addMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). + * @method $this addMillisecond() Add one millisecond to the instance (using date interval). + * @method $this subMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). + * @method $this subMillisecond() Sub one millisecond to the instance (using date interval). + * @method $this addMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). + * @method $this addMicro() Add one microsecond to the instance (using date interval). + * @method $this subMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). + * @method $this subMicro() Sub one microsecond to the instance (using date interval). + * @method $this addMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). + * @method $this addMicrosecond() Add one microsecond to the instance (using date interval). + * @method $this subMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). + * @method $this subMicrosecond() Sub one microsecond to the instance (using date interval). + * @method $this addMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval). + * @method $this addMillennium() Add one millennium to the instance (using date interval). + * @method $this subMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval). + * @method $this subMillennium() Sub one millennium to the instance (using date interval). + * @method $this addMillenniaWithOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. + * @method $this subMillenniaWithOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. + * @method $this addMillenniaWithoutOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMillenniaWithoutOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMillenniaWithNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMillenniaWithNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMillenniaNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMillenniaNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval). + * @method $this addCentury() Add one century to the instance (using date interval). + * @method $this subCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval). + * @method $this subCentury() Sub one century to the instance (using date interval). + * @method $this addCenturiesWithOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. + * @method $this subCenturiesWithOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. + * @method $this addCenturiesWithoutOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subCenturiesWithoutOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addCenturiesWithNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subCenturiesWithNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addCenturiesNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subCenturiesNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval). + * @method $this addDecade() Add one decade to the instance (using date interval). + * @method $this subDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval). + * @method $this subDecade() Sub one decade to the instance (using date interval). + * @method $this addDecadesWithOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. + * @method $this subDecadesWithOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. + * @method $this addDecadesWithoutOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subDecadesWithoutOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDecadesWithNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subDecadesWithNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDecadesNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subDecadesNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval). + * @method $this addQuarter() Add one quarter to the instance (using date interval). + * @method $this subQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval). + * @method $this subQuarter() Sub one quarter to the instance (using date interval). + * @method $this addQuartersWithOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. + * @method $this subQuartersWithOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. + * @method $this addQuartersWithoutOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subQuartersWithoutOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addQuartersWithNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subQuartersWithNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addQuartersNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subQuartersNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). + * @method $this addWeek() Add one week to the instance (using date interval). + * @method $this subWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). + * @method $this subWeek() Sub one week to the instance (using date interval). + * @method $this addWeekdays(int $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). + * @method $this addWeekday() Add one weekday to the instance (using date interval). + * @method $this subWeekdays(int $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). + * @method $this subWeekday() Sub one weekday to the instance (using date interval). + * @method $this addRealMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). + * @method $this addRealMicro() Add one microsecond to the instance (using timestamp). + * @method $this subRealMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). + * @method $this subRealMicro() Sub one microsecond to the instance (using timestamp). + * @method CarbonPeriod microsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. + * @method $this addRealMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). + * @method $this addRealMicrosecond() Add one microsecond to the instance (using timestamp). + * @method $this subRealMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). + * @method $this subRealMicrosecond() Sub one microsecond to the instance (using timestamp). + * @method CarbonPeriod microsecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. + * @method $this addRealMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). + * @method $this addRealMilli() Add one millisecond to the instance (using timestamp). + * @method $this subRealMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). + * @method $this subRealMilli() Sub one millisecond to the instance (using timestamp). + * @method CarbonPeriod millisUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. + * @method $this addRealMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). + * @method $this addRealMillisecond() Add one millisecond to the instance (using timestamp). + * @method $this subRealMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). + * @method $this subRealMillisecond() Sub one millisecond to the instance (using timestamp). + * @method CarbonPeriod millisecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. + * @method $this addRealSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). + * @method $this addRealSecond() Add one second to the instance (using timestamp). + * @method $this subRealSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). + * @method $this subRealSecond() Sub one second to the instance (using timestamp). + * @method CarbonPeriod secondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. + * @method $this addRealMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). + * @method $this addRealMinute() Add one minute to the instance (using timestamp). + * @method $this subRealMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). + * @method $this subRealMinute() Sub one minute to the instance (using timestamp). + * @method CarbonPeriod minutesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. + * @method $this addRealHours(int $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). + * @method $this addRealHour() Add one hour to the instance (using timestamp). + * @method $this subRealHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). + * @method $this subRealHour() Sub one hour to the instance (using timestamp). + * @method CarbonPeriod hoursUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. + * @method $this addRealDays(int $value = 1) Add days (the $value count passed in) to the instance (using timestamp). + * @method $this addRealDay() Add one day to the instance (using timestamp). + * @method $this subRealDays(int $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). + * @method $this subRealDay() Sub one day to the instance (using timestamp). + * @method CarbonPeriod daysUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. + * @method $this addRealWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). + * @method $this addRealWeek() Add one week to the instance (using timestamp). + * @method $this subRealWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). + * @method $this subRealWeek() Sub one week to the instance (using timestamp). + * @method CarbonPeriod weeksUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. + * @method $this addRealMonths(int $value = 1) Add months (the $value count passed in) to the instance (using timestamp). + * @method $this addRealMonth() Add one month to the instance (using timestamp). + * @method $this subRealMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). + * @method $this subRealMonth() Sub one month to the instance (using timestamp). + * @method CarbonPeriod monthsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. + * @method $this addRealQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). + * @method $this addRealQuarter() Add one quarter to the instance (using timestamp). + * @method $this subRealQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). + * @method $this subRealQuarter() Sub one quarter to the instance (using timestamp). + * @method CarbonPeriod quartersUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. + * @method $this addRealYears(int $value = 1) Add years (the $value count passed in) to the instance (using timestamp). + * @method $this addRealYear() Add one year to the instance (using timestamp). + * @method $this subRealYears(int $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). + * @method $this subRealYear() Sub one year to the instance (using timestamp). + * @method CarbonPeriod yearsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. + * @method $this addRealDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). + * @method $this addRealDecade() Add one decade to the instance (using timestamp). + * @method $this subRealDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). + * @method $this subRealDecade() Sub one decade to the instance (using timestamp). + * @method CarbonPeriod decadesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. + * @method $this addRealCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). + * @method $this addRealCentury() Add one century to the instance (using timestamp). + * @method $this subRealCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). + * @method $this subRealCentury() Sub one century to the instance (using timestamp). + * @method CarbonPeriod centuriesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. + * @method $this addRealMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). + * @method $this addRealMillennium() Add one millennium to the instance (using timestamp). + * @method $this subRealMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). + * @method $this subRealMillennium() Sub one millennium to the instance (using timestamp). + * @method CarbonPeriod millenniaUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. + * @method $this roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method $this roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method $this floorYear(float $precision = 1) Truncate the current instance year with given precision. + * @method $this floorYears(float $precision = 1) Truncate the current instance year with given precision. + * @method $this ceilYear(float $precision = 1) Ceil the current instance year with given precision. + * @method $this ceilYears(float $precision = 1) Ceil the current instance year with given precision. + * @method $this roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method $this roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method $this floorMonth(float $precision = 1) Truncate the current instance month with given precision. + * @method $this floorMonths(float $precision = 1) Truncate the current instance month with given precision. + * @method $this ceilMonth(float $precision = 1) Ceil the current instance month with given precision. + * @method $this ceilMonths(float $precision = 1) Ceil the current instance month with given precision. + * @method $this roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method $this roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method $this floorDay(float $precision = 1) Truncate the current instance day with given precision. + * @method $this floorDays(float $precision = 1) Truncate the current instance day with given precision. + * @method $this ceilDay(float $precision = 1) Ceil the current instance day with given precision. + * @method $this ceilDays(float $precision = 1) Ceil the current instance day with given precision. + * @method $this roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method $this roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method $this floorHour(float $precision = 1) Truncate the current instance hour with given precision. + * @method $this floorHours(float $precision = 1) Truncate the current instance hour with given precision. + * @method $this ceilHour(float $precision = 1) Ceil the current instance hour with given precision. + * @method $this ceilHours(float $precision = 1) Ceil the current instance hour with given precision. + * @method $this roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method $this roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method $this floorMinute(float $precision = 1) Truncate the current instance minute with given precision. + * @method $this floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. + * @method $this ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. + * @method $this ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. + * @method $this roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method $this roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method $this floorSecond(float $precision = 1) Truncate the current instance second with given precision. + * @method $this floorSeconds(float $precision = 1) Truncate the current instance second with given precision. + * @method $this ceilSecond(float $precision = 1) Ceil the current instance second with given precision. + * @method $this ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. + * @method $this roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method $this roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method $this floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. + * @method $this floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. + * @method $this ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. + * @method $this ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. + * @method $this roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method $this roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method $this floorCentury(float $precision = 1) Truncate the current instance century with given precision. + * @method $this floorCenturies(float $precision = 1) Truncate the current instance century with given precision. + * @method $this ceilCentury(float $precision = 1) Ceil the current instance century with given precision. + * @method $this ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. + * @method $this roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method $this roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method $this floorDecade(float $precision = 1) Truncate the current instance decade with given precision. + * @method $this floorDecades(float $precision = 1) Truncate the current instance decade with given precision. + * @method $this ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. + * @method $this ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. + * @method $this roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method $this roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method $this floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. + * @method $this floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. + * @method $this ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. + * @method $this ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. + * @method $this roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method $this roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method $this floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method $this floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method $this ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method $this ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method $this roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method $this roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method $this floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method $this floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method $this ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. + * @method $this ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. + * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method static static|false createFromFormat(string $format, string $time, DateTimeZone|string|false|null $timezone = null) Parse a string into a new Carbon object according to the specified format. + * @method static static __set_state(array $array) https://php.net/manual/en/datetime.set-state.php * * */ @@ -16786,7 +18065,7 @@ * DataTables using Query. * * @param \Illuminate\Database\Query\Builder|mixed $builder - * @return \Yajra\DataTables\DataTableAbstract|\Yajra\DataTables\QueryDataTable + * @return \Yajra\DataTables\QueryDataTable|\Yajra\DataTables\DataTableAbstract * @static */ public static function query($builder) @@ -16798,7 +18077,7 @@ * DataTables using Eloquent Builder. * * @param \Illuminate\Database\Eloquent\Builder|mixed $builder - * @return \Yajra\DataTables\DataTableAbstract|\Yajra\DataTables\EloquentDataTable + * @return \Yajra\DataTables\EloquentDataTable|\Yajra\DataTables\DataTableAbstract * @static */ public static function eloquent($builder) @@ -16810,7 +18089,7 @@ * DataTables using Collection. * * @param \Illuminate\Support\Collection|array $collection - * @return \Yajra\DataTables\DataTableAbstract|\Yajra\DataTables\CollectionDataTable + * @return \Yajra\DataTables\CollectionDataTable|\Yajra\DataTables\DataTableAbstract * @static */ public static function collection($collection) @@ -16822,7 +18101,7 @@ * DataTables using Collection. * * @param \Illuminate\Http\Resources\Json\AnonymousResourceCollection|array $collection - * @return \Yajra\DataTables\DataTableAbstract|\Yajra\DataTables\ApiResourceDataTable + * @return \Yajra\DataTables\ApiResourceDataTable|\Yajra\DataTables\DataTableAbstract * @static */ public static function resource($resource) @@ -16877,6 +18156,16 @@ public static function hasMacro($name) { return \Yajra\DataTables\DataTables::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Yajra\DataTables\DataTables::flushMacros(); } } @@ -16903,6 +18192,66 @@ * * @static */ + public static function setGlobalTaxRate($value) + { + /** @var \App\Services\Yard $instance */ + return $instance->setGlobalTaxRate($value); + } + /** + * + * + * @static + */ + public static function getGlobalTaxRate() + { + /** @var \App\Services\Yard $instance */ + return $instance->getGlobalTaxRate(); + } + /** + * + * + * @static + */ + public static function setShippingOption($value) + { + /** @var \App\Services\Yard $instance */ + return $instance->setShippingOption($value); + } + /** + * + * + * @static + */ + public static function getShippingOption() + { + /** @var \App\Services\Yard $instance */ + return $instance->getShippingOption(); + } + /** + * + * + * @static + */ + public static function isQuickShipping() + { + /** @var \App\Services\Yard $instance */ + return $instance->isQuickShipping(); + } + /** + * + * + * @static + */ + public static function isWithPayments() + { + /** @var \App\Services\Yard $instance */ + return $instance->isWithPayments(); + } + /** + * + * + * @static + */ public static function putYardExtra($key, $value) { /** @var \App\Services\Yard $instance */ @@ -16953,6 +18302,16 @@ * * @static */ + public static function getShippingPrice() + { + /** @var \App\Services\Yard $instance */ + return $instance->getShippingPrice(); + } + /** + * + * + * @static + */ public static function getYContent() { /** @var \App\Services\Yard $instance */ @@ -16963,6 +18322,26 @@ * * @static */ + public static function getCartContent() + { + /** @var \App\Services\Yard $instance */ + return $instance->getCartContent(); + } + /** + * + * + * @static + */ + public static function reCalculateShippingPrice() + { + /** @var \App\Services\Yard $instance */ + return $instance->reCalculateShippingPrice(); + } + /** + * + * + * @static + */ public static function reCalculate() { /** @var \App\Services\Yard $instance */ @@ -16983,6 +18362,26 @@ * * @static */ + public static function setUser($user) + { + /** @var \App\Services\Yard $instance */ + return $instance->setUser($user); + } + /** + * + * + * @static + */ + public static function sponsorHasCommisson() + { + /** @var \App\Services\Yard $instance */ + return $instance->sponsorHasCommisson(); + } + /** + * + * + * @static + */ public static function getYardMargin() { /** @var \App\Services\Yard $instance */ @@ -17013,10 +18412,100 @@ * * @static */ - public static function setShoppingUser($user, $payment_credit = false) + public static function setUserPriceInfos($setUserPriceInfos = []) { /** @var \App\Services\Yard $instance */ - return $instance->setShoppingUser($user, $payment_credit); + return $instance->setUserPriceInfos($setUserPriceInfos); + } + /** + * + * + * @static + */ + public static function setShoppingUser($user, $use_payment_credit = false) + { + /** @var \App\Services\Yard $instance */ + return $instance->setShoppingUser($user, $use_payment_credit); + } + /** + * + * + * @static + */ + public static function getUserPriceInfos() + { + /** @var \App\Services\Yard $instance */ + return $instance->getUserPriceInfos(); + } + /** + * + * + * @static + */ + public static function getUserCountryId() + { + /** @var \App\Services\Yard $instance */ + return $instance->getUserCountryId(); + } + /** + * + * + * @static + */ + public static function getUserCountry() + { + /** @var \App\Services\Yard $instance */ + return $instance->getUserCountry(); + } + /** + * + * + * @static + */ + public static function getUserTaxFree() + { + /** @var \App\Services\Yard $instance */ + return $instance->getUserTaxFree(); + } + /** + * + * + * @static + */ + public static function getShippingFree() + { + /** @var \App\Services\Yard $instance */ + return $instance->getShippingFree(); + } + /** + * + * + * @static + */ + public static function getShippingFreeMissingValue() + { + /** @var \App\Services\Yard $instance */ + return $instance->getShippingFreeMissingValue(); + } + /** + * + * + * @static + */ + public static function setReducePaymentCredit($reduce_payment_credit) + { + /** @var \App\Services\Yard $instance */ + return $instance->setReducePaymentCredit($reduce_payment_credit); + } + /** + * + * + * @static + */ + public static function getReducePaymentCredit() + { + /** @var \App\Services\Yard $instance */ + return $instance->getReducePaymentCredit(); } /** * @@ -17027,6 +18516,36 @@ { /** @var \App\Services\Yard $instance */ return $instance->getPaymentCredit(); + } + /** + * + * + * @static + */ + public static function hasActivePromotion() + { + /** @var \App\Services\Yard $instance */ + return $instance->hasActivePromotion(); + } + /** + * + * + * @static + */ + public static function reducePaymentCredit() + { + /** @var \App\Services\Yard $instance */ + return $instance->reducePaymentCredit(); + } + /** + * + * + * @static + */ + public static function preCalcuShippingPrice() + { + /** @var \App\Services\Yard $instance */ + return $instance->preCalcuShippingPrice(); } /** * @@ -17183,10 +18702,10 @@ * * @static */ - public static function getCartItemByProduct($product_id, $set_price = 'with') + public static function getCartItemByProduct($product_id, $set_price = 'with', $commission = true) { /** @var \App\Services\Yard $instance */ - return $instance->getCartItemByProduct($product_id, $set_price); + return $instance->getCartItemByProduct($product_id, $set_price, $commission); } /** * @@ -17213,6 +18732,16 @@ * * @static */ + public static function rowPrice($row, $decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + /** @var \App\Services\Yard $instance */ + return $instance->rowPrice($row, $decimals, $decimalPoint, $thousandSeperator); + } + /** + * + * + * @static + */ public static function rowPriceNet($row, $decimals = null, $decimalPoint = null, $thousandSeperator = null) { /** @var \App\Services\Yard $instance */ @@ -17223,6 +18752,16 @@ * * @static */ + public static function rowSubtotal($row, $decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + /** @var \App\Services\Yard $instance */ + return $instance->rowSubtotal($row, $decimals, $decimalPoint, $thousandSeperator); + } + /** + * + * + * @static + */ public static function rowSubtotalNet($row, $decimals = null, $decimalPoint = null, $thousandSeperator = null) { /** @var \App\Services\Yard $instance */ @@ -17253,6 +18792,16 @@ * * @static */ + public static function getFreeProductId() + { + /** @var \App\Services\Yard $instance */ + return $instance->getFreeProductId(); + } + /** + * + * + * @static + */ public static function getContentByOrder() { /** @var \App\Services\Yard $instance */ @@ -17549,7 +19098,7 @@ } - namespace Barryvdh\Debugbar { + namespace Barryvdh\Debugbar\Facades { /** * * @@ -17564,7 +19113,7 @@ * @method static void warning(mixed $message) * @see \Barryvdh\Debugbar\LaravelDebugbar */ - class Facade { + class Debugbar { /** * Enable the Debugbar and boot, if not already booted. * @@ -17598,7 +19147,7 @@ /** * Adds a data collector * - * @param \Barryvdh\Debugbar\DataCollectorInterface $collector + * @param \DebugBar\DataCollector\DataCollectorInterface $collector * @throws DebugBarException * @return \Barryvdh\Debugbar\LaravelDebugbar * @static @@ -17807,7 +19356,7 @@ * Returns a data collector * * @param string $name - * @return \DebugBar\DataCollectorInterface + * @return \DebugBar\DataCollector\DataCollectorInterface * @throws DebugBarException * @static */ @@ -17819,7 +19368,7 @@ /** * Returns an array of all data collectors * - * @return \DebugBar\array[DataCollectorInterface] + * @return array[DataCollectorInterface] * @static */ public static function getCollectors() @@ -18086,41 +19635,37 @@ } - namespace Barryvdh\DomPDF { + namespace Barryvdh\DomPDF\Facade { /** * * + * @method static BasePDF setBaseHost(string $baseHost) + * @method static BasePDF setBasePath(string $basePath) + * @method static BasePDF setCanvas(\Dompdf\Canvas $canvas) + * @method static BasePDF setCallbacks(array $callbacks) + * @method static BasePDF setCss(\Dompdf\Css\Stylesheet $css) + * @method static BasePDF setDefaultView(string $defaultView, array $options) + * @method static BasePDF setDom(\DOMDocument $dom) + * @method static BasePDF setFontMetrics(\Dompdf\FontMetrics $fontMetrics) + * @method static BasePDF setHttpContext(resource|array $httpContext) + * @method static BasePDF setPaper(string|float[] $paper, string $orientation = 'portrait') + * @method static BasePDF setProtocol(string $protocol) + * @method static BasePDF setTree(\Dompdf\Frame\FrameTree $tree) */ - class Facade { + class Pdf { /** * Get the DomPDF instance * - * @return \Barryvdh\DomPDF\Dompdf * @static */ public static function getDomPDF() { /** @var \Barryvdh\DomPDF\PDF $instance */ return $instance->getDomPDF(); - } - /** - * Set the paper size (default A4) - * - * @param string $paper - * @param string $orientation - * @return \Barryvdh\DomPDF\PDF - * @static - */ - public static function setPaper($paper, $orientation = 'portrait') - { - /** @var \Barryvdh\DomPDF\PDF $instance */ - return $instance->setPaper($paper, $orientation); } /** * Show or hide warnings * - * @param bool $warnings - * @return \Barryvdh\DomPDF\PDF * @static */ public static function setWarnings($warnings) @@ -18131,9 +19676,7 @@ /** * Load a HTML string * - * @param string $string - * @param string $encoding Not used yet - * @return static + * @param string|null $encoding Not used yet * @static */ public static function loadHTML($string, $encoding = null) @@ -18144,8 +19687,6 @@ /** * Load a HTML file * - * @param string $file - * @return static * @static */ public static function loadFile($file) @@ -18156,8 +19697,7 @@ /** * Add metadata info * - * @param array $info - * @return static + * @param array $info * @static */ public static function addInfo($info) @@ -18168,11 +19708,9 @@ /** * Load a View and convert to HTML * - * @param string $view - * @param array $data - * @param array $mergeData - * @param string $encoding Not used yet - * @return static + * @param array $data + * @param array $mergeData + * @param string|null $encoding Not used yet * @static */ public static function loadView($view, $data = [], $mergeData = [], $encoding = null) @@ -18181,45 +19719,58 @@ return $instance->loadView($view, $data, $mergeData, $encoding); } /** - * Set/Change an option in DomPdf + * Set/Change an option (or array of options) in Dompdf * - * @param array $options - * @return static + * @param array|string $attribute + * @param null|mixed $value * @static */ - public static function setOptions($options) + public static function setOption($attribute, $value = null) { /** @var \Barryvdh\DomPDF\PDF $instance */ - return $instance->setOptions($options); + return $instance->setOption($attribute, $value); + } + /** + * Replace all the Options from DomPDF + * + * @param array $options + * @static + */ + public static function setOptions($options, $mergeWithDefaults = false) + { + /** @var \Barryvdh\DomPDF\PDF $instance */ + return $instance->setOptions($options, $mergeWithDefaults); } /** * Output the PDF as a string. + * + * The options parameter controls the output. Accepted options are: + * + * 'compress' = > 1 or 0 - apply content stream compression, this is + * on (1) by default * + * @param array $options * @return string The rendered PDF as string * @static */ - public static function output() + public static function output($options = []) { /** @var \Barryvdh\DomPDF\PDF $instance */ - return $instance->output(); + return $instance->output($options); } /** * Save the PDF to a file * - * @param $filename - * @return static * @static */ - public static function save($filename) + public static function save($filename, $disk = null) { /** @var \Barryvdh\DomPDF\PDF $instance */ - return $instance->save($filename); + return $instance->save($filename, $disk); } /** * Make the PDF downloadable by the user * - * @param string $filename - * @return \Illuminate\Http\Response * @static */ public static function download($filename = 'document.pdf') @@ -18230,8 +19781,6 @@ /** * Return a response with the PDF to show in the browser * - * @param string $filename - * @return \Illuminate\Http\Response * @static */ public static function stream($filename = 'document.pdf') @@ -18240,364 +19789,200 @@ return $instance->stream($filename); } /** - * + * Render the PDF * * @static */ - public static function setEncryption($password) + public static function render() { /** @var \Barryvdh\DomPDF\PDF $instance */ - return $instance->setEncryption($password); + return $instance->render(); + } + /** + * + * + * @param array $pc + * @static + */ + public static function setEncryption($password, $ownerpassword = '', $pc = []) + { + /** @var \Barryvdh\DomPDF\PDF $instance */ + return $instance->setEncryption($password, $ownerpassword, $pc); } } - -} - - namespace Gloudemans\Shoppingcart\Facades { /** * * + * @method static BasePDF setBaseHost(string $baseHost) + * @method static BasePDF setBasePath(string $basePath) + * @method static BasePDF setCanvas(\Dompdf\Canvas $canvas) + * @method static BasePDF setCallbacks(array $callbacks) + * @method static BasePDF setCss(\Dompdf\Css\Stylesheet $css) + * @method static BasePDF setDefaultView(string $defaultView, array $options) + * @method static BasePDF setDom(\DOMDocument $dom) + * @method static BasePDF setFontMetrics(\Dompdf\FontMetrics $fontMetrics) + * @method static BasePDF setHttpContext(resource|array $httpContext) + * @method static BasePDF setPaper(string|float[] $paper, string $orientation = 'portrait') + * @method static BasePDF setProtocol(string $protocol) + * @method static BasePDF setTree(\Dompdf\Frame\FrameTree $tree) */ - class Cart { + class Pdf { /** - * Set the current cart instance. + * Get the DomPDF instance * - * @param string|null $instance - * @return \Gloudemans\Shoppingcart\Cart * @static */ - public static function instance($instance = null) + public static function getDomPDF() { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->instance($instance); + /** @var \Barryvdh\DomPDF\PDF $instance */ + return $instance->getDomPDF(); } /** - * Get the current cart instance. + * Show or hide warnings * - * @return string * @static */ - public static function currentInstance() + public static function setWarnings($warnings) { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->currentInstance(); + /** @var \Barryvdh\DomPDF\PDF $instance */ + return $instance->setWarnings($warnings); } /** - * Add an item to the cart. + * Load a HTML string * - * @param mixed $id - * @param mixed $name - * @param int|float $qty - * @param float $price - * @param array $options - * @return \Gloudemans\Shoppingcart\CartItem + * @param string|null $encoding Not used yet * @static */ - public static function add($id, $name = null, $qty = null, $price = null, $taxRate = null, $options = []) + public static function loadHTML($string, $encoding = null) { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->add($id, $name, $qty, $price, $taxRate, $options); + /** @var \Barryvdh\DomPDF\PDF $instance */ + return $instance->loadHTML($string, $encoding); } /** - * Update the cart item with the given rowId. + * Load a HTML file * - * @param string $rowId - * @param mixed $qty - * @return \Gloudemans\Shoppingcart\CartItem * @static */ - public static function update($rowId, $qty) + public static function loadFile($file) { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->update($rowId, $qty); + /** @var \Barryvdh\DomPDF\PDF $instance */ + return $instance->loadFile($file); } /** - * Remove the cart item with the given rowId from the cart. + * Add metadata info * - * @param string $rowId - * @return void + * @param array $info * @static */ - public static function remove($rowId) + public static function addInfo($info) { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - $instance->remove($rowId); + /** @var \Barryvdh\DomPDF\PDF $instance */ + return $instance->addInfo($info); } /** - * Get a cart item from the cart by its rowId. + * Load a View and convert to HTML * - * @param string $rowId - * @return \Gloudemans\Shoppingcart\CartItem + * @param array $data + * @param array $mergeData + * @param string|null $encoding Not used yet * @static */ - public static function get($rowId) + public static function loadView($view, $data = [], $mergeData = [], $encoding = null) { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->get($rowId); + /** @var \Barryvdh\DomPDF\PDF $instance */ + return $instance->loadView($view, $data, $mergeData, $encoding); } /** - * Destroy the current cart instance. + * Set/Change an option (or array of options) in Dompdf * - * @return void + * @param array|string $attribute + * @param null|mixed $value * @static */ - public static function destroy() + public static function setOption($attribute, $value = null) { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - $instance->destroy(); + /** @var \Barryvdh\DomPDF\PDF $instance */ + return $instance->setOption($attribute, $value); } /** - * Get the content of the cart. + * Replace all the Options from DomPDF * - * @return \Illuminate\Support\Collection + * @param array $options * @static */ - public static function content() + public static function setOptions($options, $mergeWithDefaults = false) { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->content(); + /** @var \Barryvdh\DomPDF\PDF $instance */ + return $instance->setOptions($options, $mergeWithDefaults); } /** - * Get the number of items in the cart. - * - * @return int|float - * @static - */ - public static function count() - { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->count(); - } - /** - * Get the total price of the items in the cart. - * - * @param int $decimals - * @param string $decimalPoint - * @param string $thousandSeperator - * @return string - * @static - */ - public static function total($decimals = null, $decimalPoint = null, $thousandSeperator = null, $withFees = true) - { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->total($decimals, $decimalPoint, $thousandSeperator, $withFees); - } - /** - * Get the total tax of the items in the cart. - * - * @param int $decimals - * @param string $decimalPoint - * @param string $thousandSeperator - * @return float - * @static - */ - public static function tax($decimals = null, $decimalPoint = null, $thousandSeperator = null, $withFees = true) - { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->tax($decimals, $decimalPoint, $thousandSeperator, $withFees); - } - /** - * Get the total tax of the items in the cart. - * - * @param int $decimals - * @param string $decimalPoint - * @param string $thousandSeperator - * @return float - * @static - */ - public static function feeTax($decimals = null, $decimalPoint = null, $thousandSeperator = null) - { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->feeTax($decimals, $decimalPoint, $thousandSeperator); - } - /** - * Get the subtotal (total - tax) of the items in the cart. - * - * @param int $decimals - * @param string $decimalPoint - * @param string $thousandSeperator - * @return float - * @static - */ - public static function subtotal($decimals = null, $decimalPoint = null, $thousandSeperator = null) - { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->subtotal($decimals, $decimalPoint, $thousandSeperator); - } - /** - * Get the subtotal (total - tax) of the items in the cart. - * - * @param int $decimals - * @param string $decimalPoint - * @param string $thousandSeperator - * @return float - * @static - */ - public static function subtotalTax($decimals = null, $decimalPoint = null, $thousandSeperator = null) - { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->subtotalTax($decimals, $decimalPoint, $thousandSeperator); - } - /** - * Search the cart content for a cart item matching the given search closure. - * - * @param \Closure $search - * @return \Illuminate\Support\Collection - * @static - */ - public static function search($search) - { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->search($search); - } - /** - * Associate the cart item with the given rowId with the given model. - * - * @param string $rowId - * @param mixed $model - * @return void - * @static - */ - public static function associate($rowId, $model) - { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - $instance->associate($rowId, $model); - } - /** - * Set the tax rate for the cart item with the given rowId. - * - * @param string $rowId - * @param int|float $taxRate - * @return void - * @static - */ - public static function setTax($rowId, $taxRate) - { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - $instance->setTax($rowId, $taxRate); - } - /** - * Store an the current instance of the cart. - * - * @param mixed $identifier - * @return void - * @static - */ - public static function store($identifier) - { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - $instance->store($identifier); - } - /** - * Restore the cart with the given identifier. - * - * @param mixed $identifier - * @return void - * @static - */ - public static function restore($identifier) - { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - $instance->restore($identifier); - } - /** - * Gets a specific fee from the fees array. - * - * @param $name - * @return mixed - * @static - */ - public static function getFee($name) - { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->getFee($name); - } - /** - * Allows to charge for additional fees that may or may not be taxable - * ex - service fee , delivery fee, tips. + * Output the PDF as a string. * - * Because it uses ->put, the name must be unique otherwise will be overwritten. + * The options parameter controls the output. Accepted options are: + * + * 'compress' = > 1 or 0 - apply content stream compression, this is + * on (1) by default * - * @param $name - * @param $amount - * @param $taxRate - * @param array $options + * @param array $options + * @return string The rendered PDF as string * @static */ - public static function addFee($name, $amount, $taxRate = null, $options = []) + public static function output($options = []) { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->addFee($name, $amount, $taxRate, $options); + /** @var \Barryvdh\DomPDF\PDF $instance */ + return $instance->output($options); } /** - * Removes a fee from the fee array. + * Save the PDF to a file * - * @todo test to see if i need to restore this - * @param $name * @static */ - public static function removeFee($name) + public static function save($filename, $disk = null) { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->removeFee($name); + /** @var \Barryvdh\DomPDF\PDF $instance */ + return $instance->save($filename, $disk); } /** - * Removes all the fees set in the cart. + * Make the PDF downloadable by the user * * @static */ - public static function removeFees() + public static function download($filename = 'document.pdf') { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->removeFees(); + /** @var \Barryvdh\DomPDF\PDF $instance */ + return $instance->download($filename); } /** - * Gets all the fee totals. + * Return a response with the PDF to show in the browser * - * @param bool $format - * @param bool $withTax - * @return string * @static */ - public static function feeTotal($decimals = null, $decimalPoint = null, $thousandSeperator = null, $withTax = true) + public static function stream($filename = 'document.pdf') { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->feeTotal($decimals, $decimalPoint, $thousandSeperator, $withTax); + /** @var \Barryvdh\DomPDF\PDF $instance */ + return $instance->stream($filename); } /** - * Gets all the fees on the cart object. + * Render the PDF * - * @return mixed * @static */ - public static function getFees() + public static function render() { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->getFees(); + /** @var \Barryvdh\DomPDF\PDF $instance */ + return $instance->render(); } /** * * - * @return array + * @param array $pc * @static */ - public static function toArray() + public static function setEncryption($password, $ownerpassword = '', $pc = []) { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->toArray(); - } - /** - * - * - * @param $array - * @return \Gloudemans\Shoppingcart\Cart - * @static - */ - public static function fromArray($array) - { - /** @var \Gloudemans\Shoppingcart\Cart $instance */ - return $instance->fromArray($array); + /** @var \Barryvdh\DomPDF\PDF $instance */ + return $instance->setEncryption($password, $ownerpassword, $pc); } } @@ -18625,6 +20010,57 @@ * * @static */ + public static function determineVersionUsing($determineVersionCallable) + { + /** @var \Facade\FlareClient\Flare $instance */ + return $instance->determineVersionUsing($determineVersionCallable); + } + /** + * + * + * @static + */ + public static function reportErrorLevels($reportErrorLevels) + { + /** @var \Facade\FlareClient\Flare $instance */ + return $instance->reportErrorLevels($reportErrorLevels); + } + /** + * + * + * @static + */ + public static function filterExceptionsUsing($filterExceptionsCallable) + { + /** @var \Facade\FlareClient\Flare $instance */ + return $instance->filterExceptionsUsing($filterExceptionsCallable); + } + /** + * + * + * @static + */ + public static function filterReportsUsing($filterReportsCallable) + { + /** @var \Facade\FlareClient\Flare $instance */ + return $instance->filterReportsUsing($filterReportsCallable); + } + /** + * + * + * @return null|string + * @static + */ + public static function version() + { + /** @var \Facade\FlareClient\Flare $instance */ + return $instance->version(); + } + /** + * + * + * @static + */ public static function getMiddleware() { /** @var \Facade\FlareClient\Flare $instance */ @@ -18775,6 +20211,16 @@ * * @static */ + public static function censorRequestBodyFields($fieldNames) + { + /** @var \Facade\FlareClient\Flare $instance */ + return $instance->censorRequestBodyFields($fieldNames); + } + /** + * + * + * @static + */ public static function createReport($throwable) { /** @var \Facade\FlareClient\Flare $instance */ @@ -18982,6 +20428,340 @@ public static function hasMacro($name) { return \Laracasts\Flash\FlashNotifier::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Laracasts\Flash\FlashNotifier::flushMacros(); + } + + } + +} + + namespace Maatwebsite\Excel\Facades { + /** + * + * + */ + class Excel { + /** + * + * + * @param object $export + * @param string|null $fileName + * @param string $writerType + * @param array $headers + * @return \Symfony\Component\HttpFoundation\BinaryFileResponse + * @throws \PhpOffice\PhpSpreadsheet\Exception + * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception + * @static + */ + public static function download($export, $fileName, $writerType = null, $headers = []) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->download($export, $fileName, $writerType, $headers); + } + /** + * + * + * @param string|null $disk Fallback for usage with named properties + * @param object $export + * @param string $filePath + * @param string|null $diskName + * @param string $writerType + * @param mixed $diskOptions + * @return bool + * @throws \PhpOffice\PhpSpreadsheet\Exception + * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception + * @static + */ + public static function store($export, $filePath, $diskName = null, $writerType = null, $diskOptions = [], $disk = null) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->store($export, $filePath, $diskName, $writerType, $diskOptions, $disk); + } + /** + * + * + * @param object $export + * @param string $filePath + * @param string|null $disk + * @param string $writerType + * @param mixed $diskOptions + * @return \Illuminate\Foundation\Bus\PendingDispatch + * @static + */ + public static function queue($export, $filePath, $disk = null, $writerType = null, $diskOptions = []) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->queue($export, $filePath, $disk, $writerType, $diskOptions); + } + /** + * + * + * @param object $export + * @param string $writerType + * @return string + * @static + */ + public static function raw($export, $writerType) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->raw($export, $writerType); + } + /** + * + * + * @param object $import + * @param string|\Symfony\Component\HttpFoundation\File\UploadedFile $filePath + * @param string|null $disk + * @param string|null $readerType + * @return \Maatwebsite\Excel\Reader|\Illuminate\Foundation\Bus\PendingDispatch + * @static + */ + public static function import($import, $filePath, $disk = null, $readerType = null) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->import($import, $filePath, $disk, $readerType); + } + /** + * + * + * @param object $import + * @param string|\Symfony\Component\HttpFoundation\File\UploadedFile $filePath + * @param string|null $disk + * @param string|null $readerType + * @return array + * @static + */ + public static function toArray($import, $filePath, $disk = null, $readerType = null) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->toArray($import, $filePath, $disk, $readerType); + } + /** + * + * + * @param object $import + * @param string|\Symfony\Component\HttpFoundation\File\UploadedFile $filePath + * @param string|null $disk + * @param string|null $readerType + * @return \Illuminate\Support\Collection + * @static + */ + public static function toCollection($import, $filePath, $disk = null, $readerType = null) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->toCollection($import, $filePath, $disk, $readerType); + } + /** + * + * + * @param \Illuminate\Contracts\Queue\ShouldQueue $import + * @param string|\Symfony\Component\HttpFoundation\File\UploadedFile $filePath + * @param string|null $disk + * @param string $readerType + * @return \Illuminate\Foundation\Bus\PendingDispatch + * @static + */ + public static function queueImport($import, $filePath, $disk = null, $readerType = null) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->queueImport($import, $filePath, $disk, $readerType); + } + /** + * Register a custom macro. + * + * @param string $name + * @param object|callable $macro + * @return void + * @static + */ + public static function macro($name, $macro) + { + \Maatwebsite\Excel\Excel::macro($name, $macro); + } + /** + * Mix another object into the class. + * + * @param object $mixin + * @param bool $replace + * @return void + * @throws \ReflectionException + * @static + */ + public static function mixin($mixin, $replace = true) + { + \Maatwebsite\Excel\Excel::mixin($mixin, $replace); + } + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Maatwebsite\Excel\Excel::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Maatwebsite\Excel\Excel::flushMacros(); + } + /** + * + * + * @param string $concern + * @param callable $handler + * @param string $event + * @static + */ + public static function extend($concern, $handler, $event = 'Maatwebsite\\Excel\\Events\\BeforeWriting') + { + return \Maatwebsite\Excel\Excel::extend($concern, $handler, $event); + } + /** + * When asserting downloaded, stored, queued or imported, use regular expression + * to look for a matching file path. + * + * @return void + * @static + */ + public static function matchByRegex() + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + $instance->matchByRegex(); + } + /** + * When asserting downloaded, stored, queued or imported, use regular string + * comparison for matching file path. + * + * @return void + * @static + */ + public static function doNotMatchByRegex() + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + $instance->doNotMatchByRegex(); + } + /** + * + * + * @param string $fileName + * @param callable|null $callback + * @static + */ + public static function assertDownloaded($fileName, $callback = null) + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->assertDownloaded($fileName, $callback); + } + /** + * + * + * @param string $filePath + * @param string|callable|null $disk + * @param callable|null $callback + * @static + */ + public static function assertStored($filePath, $disk = null, $callback = null) + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->assertStored($filePath, $disk, $callback); + } + /** + * + * + * @param string $filePath + * @param string|callable|null $disk + * @param callable|null $callback + * @static + */ + public static function assertQueued($filePath, $disk = null, $callback = null) + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->assertQueued($filePath, $disk, $callback); + } + /** + * + * + * @static + */ + public static function assertQueuedWithChain($chain) + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->assertQueuedWithChain($chain); + } + /** + * + * + * @param string $classname + * @param callable|null $callback + * @static + */ + public static function assertExportedInRaw($classname, $callback = null) + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->assertExportedInRaw($classname, $callback); + } + /** + * + * + * @param string $filePath + * @param string|callable|null $disk + * @param callable|null $callback + * @static + */ + public static function assertImported($filePath, $disk = null, $callback = null) + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->assertImported($filePath, $disk, $callback); + } + + } + +} + + namespace Srmklive\PayPal\Facades { + /** + * + * + */ + class PayPal { + /** + * Get specific PayPal API provider object to use. + * + * @throws Exception + * @return \Srmklive\PayPal\Services\PayPal + * @static + */ + public static function getProvider() + { + return \Srmklive\PayPal\PayPalFacadeAccessor::getProvider(); + } + /** + * Set PayPal API Client to use. + * + * @throws \Exception + * @return \Srmklive\PayPal\Services\PayPal + * @static + */ + public static function setProvider() + { + return \Srmklive\PayPal\PayPalFacadeAccessor::setProvider(); } } @@ -19227,7 +21007,7 @@ namespace { * @param mixed $operator * @param mixed $value * @param string $boolean - * @return \Illuminate\Database\Eloquent\Model|static + * @return \Illuminate\Database\Eloquent\Model|static|null * @static */ public static function firstWhere($column, $operator = null, $value = null, $boolean = 'and') @@ -19431,6 +21211,21 @@ namespace { return $instance->firstOr($columns, $callback); } + /** + * Execute the query and get the first result if it's the sole matching record. + * + * @param array|string $columns + * @return \Illuminate\Database\Eloquent\Model + * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + * @throws \Illuminate\Database\MultipleRecordsFoundException + * @static + */ + public static function sole($columns = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->sole($columns); + } + /** * Get a single column's value from the first result of a query. * @@ -19444,6 +21239,20 @@ namespace { return $instance->value($column); } + /** + * Get a single column's value from the first result of the query or throw an exception. + * + * @param string|\Illuminate\Database\Query\Expression $column + * @return mixed + * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + * @static + */ + public static function valueOrFail($column) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->valueOrFail($column); + } + /** * Execute the query as a "select" statement. * @@ -19542,6 +21351,22 @@ namespace { return $instance->simplePaginate($perPage, $columns, $pageName, $page); } + /** + * Paginate the given query into a cursor paginator. + * + * @param int|null $perPage + * @param array $columns + * @param string $cursorName + * @param \Illuminate\Pagination\Cursor|string|null $cursor + * @return \Illuminate\Contracts\Pagination\CursorPaginator + * @static + */ + public static function cursorPaginate($perPage = null, $columns = [], $cursorName = 'cursor', $cursor = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->cursorPaginate($perPage, $columns, $cursorName, $cursor); + } + /** * Save a new model and return the instance. * @@ -19634,6 +21459,19 @@ namespace { return $instance->without($relations); } + /** + * Set the relationships that should be eager loaded while removing any previously added eager loading specifications. + * + * @param mixed $relations + * @return \Illuminate\Database\Eloquent\Builder|static + * @static + */ + public static function withOnly($relations) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withOnly($relations); + } + /** * Create a new instance of the model being queried. * @@ -19798,119 +21636,15 @@ namespace { } /** - * Chunk the results of the query. + * Clone the Eloquent query builder. * - * @param int $count - * @param callable $callback - * @return bool + * @return static * @static */ - public static function chunk($count, $callback) + public static function clone() { /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->chunk($count, $callback); - } - - /** - * Execute a callback over each item while chunking. - * - * @param callable $callback - * @param int $count - * @return bool - * @static - */ - public static function each($callback, $count = 1000) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->each($callback, $count); - } - - /** - * Chunk the results of a query by comparing IDs. - * - * @param int $count - * @param callable $callback - * @param string|null $column - * @param string|null $alias - * @return bool - * @static - */ - public static function chunkById($count, $callback, $column = null, $alias = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->chunkById($count, $callback, $column, $alias); - } - - /** - * Execute a callback over each item while chunking by ID. - * - * @param callable $callback - * @param int $count - * @param string|null $column - * @param string|null $alias - * @return bool - * @static - */ - public static function eachById($callback, $count = 1000, $column = null, $alias = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->eachById($callback, $count, $column, $alias); - } - - /** - * Execute the query and get the first result. - * - * @param array|string $columns - * @return \Illuminate\Database\Eloquent\Model|object|static|null - * @static - */ - public static function first($columns = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->first($columns); - } - - /** - * Apply the callback's query changes if the given "value" is true. - * - * @param mixed $value - * @param callable $callback - * @param callable|null $default - * @return mixed|$this - * @static - */ - public static function when($value, $callback, $default = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->when($value, $callback, $default); - } - - /** - * Pass the query to a given callback. - * - * @param callable $callback - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function tap($callback) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->tap($callback); - } - - /** - * Apply the callback's query changes if the given "value" is false. - * - * @param mixed $value - * @param callable $callback - * @param callable|null $default - * @return mixed|$this - * @static - */ - public static function unless($value, $callback, $default = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->unless($value, $callback, $default); + return $instance->clone(); } /** @@ -20162,6 +21896,131 @@ namespace { return $instance->orWhereDoesntHaveMorph($relation, $types, $callback); } + /** + * Add a basic where clause to a relationship query. + * + * @param string $relation + * @param \Closure|string|array|\Illuminate\Database\Query\Expression $column + * @param mixed $operator + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder|static + * @static + */ + public static function whereRelation($relation, $column, $operator = null, $value = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->whereRelation($relation, $column, $operator, $value); + } + + /** + * Add an "or where" clause to a relationship query. + * + * @param string $relation + * @param \Closure|string|array|\Illuminate\Database\Query\Expression $column + * @param mixed $operator + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder|static + * @static + */ + public static function orWhereRelation($relation, $column, $operator = null, $value = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orWhereRelation($relation, $column, $operator, $value); + } + + /** + * Add a polymorphic relationship condition to the query with a where clause. + * + * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation + * @param string|array $types + * @param \Closure|string|array|\Illuminate\Database\Query\Expression $column + * @param mixed $operator + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder|static + * @static + */ + public static function whereMorphRelation($relation, $types, $column, $operator = null, $value = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->whereMorphRelation($relation, $types, $column, $operator, $value); + } + + /** + * Add a polymorphic relationship condition to the query with an "or where" clause. + * + * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation + * @param string|array $types + * @param \Closure|string|array|\Illuminate\Database\Query\Expression $column + * @param mixed $operator + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder|static + * @static + */ + public static function orWhereMorphRelation($relation, $types, $column, $operator = null, $value = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orWhereMorphRelation($relation, $types, $column, $operator, $value); + } + + /** + * Add a morph-to relationship condition to the query. + * + * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation + * @param \Illuminate\Database\Eloquent\Model|string $model + * @return \Illuminate\Database\Eloquent\Builder|static + * @static + */ + public static function whereMorphedTo($relation, $model, $boolean = 'and') + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->whereMorphedTo($relation, $model, $boolean); + } + + /** + * Add a morph-to relationship condition to the query with an "or where" clause. + * + * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation + * @param \Illuminate\Database\Eloquent\Model|string $model + * @return \Illuminate\Database\Eloquent\Builder|static + * @static + */ + public static function orWhereMorphedTo($relation, $model) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orWhereMorphedTo($relation, $model); + } + + /** + * Add a "belongs to" relationship where clause to the query. + * + * @param \Illuminate\Database\Eloquent\Model $related + * @param string $relationship + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder|static + * @throws \RuntimeException + * @static + */ + public static function whereBelongsTo($related, $relationshipName = null, $boolean = 'and') + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->whereBelongsTo($related, $relationshipName, $boolean); + } + + /** + * Add an "BelongsTo" relationship with an "or where" clause to the query. + * + * @param \Illuminate\Database\Eloquent\Model $related + * @param string $relationship + * @return \Illuminate\Database\Eloquent\Builder|static + * @throws \RuntimeException + * @static + */ + public static function orWhereBelongsTo($related, $relationshipName = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orWhereBelongsTo($related, $relationshipName); + } + /** * Add subselect queries to include an aggregate value for a relationship. * @@ -20246,6 +22105,19 @@ namespace { return $instance->withAvg($relation, $column); } + /** + * Add subselect queries to include the existence of related models. + * + * @param string|array $relation + * @return \Illuminate\Database\Eloquent\Builder|static + * @static + */ + public static function withExists($relation) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withExists($relation); + } + /** * Merge the where constraints from another query to the current query. * @@ -20260,15 +22132,253 @@ namespace { } /** - * Explains the query. + * Chunk the results of the query. * + * @param int $count + * @param callable $callback + * @return bool + * @static + */ + public static function chunk($count, $callback) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->chunk($count, $callback); + } + + /** + * Run a map over each item while chunking. + * + * @param callable $callback + * @param int $count * @return \Illuminate\Support\Collection * @static */ - public static function explain() + public static function chunkMap($callback, $count = 1000) { /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->explain(); + return $instance->chunkMap($callback, $count); + } + + /** + * Execute a callback over each item while chunking. + * + * @param callable $callback + * @param int $count + * @return bool + * @throws \RuntimeException + * @static + */ + public static function each($callback, $count = 1000) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->each($callback, $count); + } + + /** + * Chunk the results of a query by comparing IDs. + * + * @param int $count + * @param callable $callback + * @param string|null $column + * @param string|null $alias + * @return bool + * @static + */ + public static function chunkById($count, $callback, $column = null, $alias = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->chunkById($count, $callback, $column, $alias); + } + + /** + * Execute a callback over each item while chunking by ID. + * + * @param callable $callback + * @param int $count + * @param string|null $column + * @param string|null $alias + * @return bool + * @static + */ + public static function eachById($callback, $count = 1000, $column = null, $alias = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->eachById($callback, $count, $column, $alias); + } + + /** + * Query lazily, by chunks of the given size. + * + * @param int $chunkSize + * @return \Illuminate\Support\LazyCollection + * @throws \InvalidArgumentException + * @static + */ + public static function lazy($chunkSize = 1000) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->lazy($chunkSize); + } + + /** + * Query lazily, by chunking the results of a query by comparing IDs. + * + * @param int $chunkSize + * @param string|null $column + * @param string|null $alias + * @return \Illuminate\Support\LazyCollection + * @throws \InvalidArgumentException + * @static + */ + public static function lazyById($chunkSize = 1000, $column = null, $alias = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->lazyById($chunkSize, $column, $alias); + } + + /** + * Query lazily, by chunking the results of a query by comparing IDs in descending order. + * + * @param int $chunkSize + * @param string|null $column + * @param string|null $alias + * @return \Illuminate\Support\LazyCollection + * @throws \InvalidArgumentException + * @static + */ + public static function lazyByIdDesc($chunkSize = 1000, $column = null, $alias = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->lazyByIdDesc($chunkSize, $column, $alias); + } + + /** + * Execute the query and get the first result. + * + * @param array|string $columns + * @return \Illuminate\Database\Eloquent\Model|object|static|null + * @static + */ + public static function first($columns = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->first($columns); + } + + /** + * Execute the query and get the first result if it's the sole matching record. + * + * @param array|string $columns + * @return \Illuminate\Database\Eloquent\Model|object|static|null + * @throws \Illuminate\Database\RecordsNotFoundException + * @throws \Illuminate\Database\MultipleRecordsFoundException + * @static + */ + public static function baseSole($columns = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->baseSole($columns); + } + + /** + * Pass the query to a given callback. + * + * @param callable $callback + * @return $this|mixed + * @static + */ + public static function tap($callback) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->tap($callback); + } + + /** + * Apply the callback if the given "value" is truthy. + * + * @param mixed $value + * @param callable $callback + * @param callable|null $default + * @return $this|mixed + * @static + */ + public static function when($value, $callback, $default = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->when($value, $callback, $default); + } + + /** + * Apply the callback if the given "value" is falsy. + * + * @param mixed $value + * @param callable $callback + * @param callable|null $default + * @return $this|mixed + * @static + */ + public static function unless($value, $callback, $default = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->unless($value, $callback, $default); + } + + /** + * + * + * @see \Maatwebsite\Excel\Mixins\DownloadQueryMacro::__invoke() + * @param string $fileName + * @param string|null $writerType + * @param mixed $withHeadings + * @static + */ + public static function downloadExcel($fileName, $writerType = null, $withHeadings = false) + { + return \Illuminate\Database\Eloquent\Builder::downloadExcel($fileName, $writerType, $withHeadings); + } + + /** + * + * + * @see \Maatwebsite\Excel\Mixins\StoreQueryMacro::__invoke() + * @param string $filePath + * @param string|null $disk + * @param string|null $writerType + * @param mixed $withHeadings + * @static + */ + public static function storeExcel($filePath, $disk = null, $writerType = null, $withHeadings = false) + { + return \Illuminate\Database\Eloquent\Builder::storeExcel($filePath, $disk, $writerType, $withHeadings); + } + + /** + * + * + * @see \Maatwebsite\Excel\Mixins\ImportMacro::__invoke() + * @param string $filename + * @param string|null $disk + * @param string|null $readerType + * @static + */ + public static function import($filename, $disk = null, $readerType = null) + { + return \Illuminate\Database\Eloquent\Builder::import($filename, $disk, $readerType); + } + + /** + * + * + * @see \Maatwebsite\Excel\Mixins\ImportAsMacro::__invoke() + * @param string $filename + * @param callable $mapping + * @param string|null $disk + * @param string|null $readerType + * @static + */ + public static function importAs($filename, $mapping, $disk = null, $readerType = null) + { + return \Illuminate\Database\Eloquent\Builder::importAs($filename, $mapping, $disk, $readerType); } /** @@ -20287,7 +22397,7 @@ namespace { /** * Add a subselect expression to the query. * - * @param \Closure|\Illuminate\Database\Query\Builder|string $query + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|string $query * @param string $as * @return \Illuminate\Database\Query\Builder * @throws \InvalidArgumentException @@ -20358,6 +22468,7 @@ namespace { /** * Force the query to only return distinct results. * + * @param mixed $distinct * @return \Illuminate\Database\Query\Builder * @static */ @@ -20419,7 +22530,7 @@ namespace { /** * Add a subquery join clause to the query. * - * @param \Closure|\Illuminate\Database\Query\Builder|string $query + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|string $query * @param string $as * @param \Closure|string $first * @param string|null $operator @@ -20471,7 +22582,7 @@ namespace { /** * Add a subquery left join to the query. * - * @param \Closure|\Illuminate\Database\Query\Builder|string $query + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|string $query * @param string $as * @param \Closure|string $first * @param string|null $operator @@ -20520,7 +22631,7 @@ namespace { /** * Add a subquery right join to the query. * - * @param \Closure|\Illuminate\Database\Query\Builder|string $query + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|string $query * @param string $as * @param \Closure|string $first * @param string|null $operator @@ -20790,7 +22901,7 @@ namespace { /** * Add an "or where null" clause to the query. * - * @param string $column + * @param string|array $column * @return \Illuminate\Database\Query\Builder * @static */ @@ -20948,7 +23059,7 @@ namespace { /** * Add a "where date" statement to the query. * - * @param string $column + * @param \Illuminate\Database\Query\Expression|string $column * @param string $operator * @param \DateTimeInterface|string|null $value * @param string $boolean @@ -21347,6 +23458,35 @@ namespace { return $instance->dynamicWhere($method, $parameters); } + /** + * Add a "where fulltext" clause to the query. + * + * @param string|string[] $columns + * @param string $value + * @param string $boolean + * @return \Illuminate\Database\Query\Builder + * @static + */ + public static function whereFullText($columns, $value, $options = [], $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereFullText($columns, $value, $options, $boolean); + } + + /** + * Add a "or where fulltext" clause to the query. + * + * @param string|string[] $columns + * @param string $value + * @return \Illuminate\Database\Query\Builder + * @static + */ + public static function orWhereFullText($columns, $value, $options = []) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereFullText($columns, $value, $options); + } + /** * Add a "group by" clause to the query. * @@ -21453,7 +23593,7 @@ namespace { /** * Add an "order by" clause to the query. * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Query\Expression|string $column + * @param \Closure|\Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Query\Builder|\Illuminate\Database\Query\Expression|string $column * @param string $direction * @return \Illuminate\Database\Query\Builder * @throws \InvalidArgumentException @@ -21468,7 +23608,7 @@ namespace { /** * Add a descending "order by" clause to the query. * - * @param string $column + * @param \Closure|\Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Query\Builder|\Illuminate\Database\Query\Expression|string $column * @return \Illuminate\Database\Query\Builder * @static */ @@ -21604,7 +23744,7 @@ namespace { /** * Remove all existing orders and optionally add a new order. * - * @param string|null $column + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Query\Expression|string|null $column * @param string $direction * @return \Illuminate\Database\Query\Builder * @static @@ -21679,6 +23819,31 @@ namespace { return $instance->sharedLock(); } + /** + * Register a closure to be invoked before the query is executed. + * + * @param callable $callback + * @return \Illuminate\Database\Query\Builder + * @static + */ + public static function beforeQuery($callback) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->beforeQuery($callback); + } + + /** + * Invoke the "before query" modification callbacks. + * + * @return void + * @static + */ + public static function applyBeforeQueryCallbacks() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + $instance->applyBeforeQueryCallbacks(); + } + /** * Get the SQL representation of the query. * @@ -21928,6 +24093,19 @@ namespace { return $instance->insertUsing($columns, $query); } + /** + * Update records in a PostgreSQL database using the update from syntax. + * + * @param array $values + * @return int + * @static + */ + public static function updateFrom($values) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->updateFrom($values); + } + /** * Insert or update a record matching the attributes, and fill it with values. * @@ -22021,6 +24199,19 @@ namespace { return $instance->addBinding($value, $type); } + /** + * Cast the given binding value. + * + * @param mixed $value + * @return mixed + * @static + */ + public static function castBinding($value) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->castBinding($value); + } + /** * Merge an array of bindings into our bindings. * @@ -22083,18 +24274,6 @@ namespace { return $instance->useWritePdo(); } - /** - * Clone the query. - * - * @return static - * @static - */ - public static function clone() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->clone(); - } - /** * Clone the query without the given properties. * @@ -22136,13 +24315,25 @@ namespace { /** * Die and dump the current SQL and bindings. * - * @return void + * @return never * @static */ public static function dd() { /** @var \Illuminate\Database\Query\Builder $instance */ - $instance->dd(); + return $instance->dd(); + } + + /** + * Explains the query. + * + * @return \Illuminate\Support\Collection + * @static + */ + public static function explain() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->explain(); } /** @@ -22172,6 +24363,17 @@ namespace { \Illuminate\Database\Query\Builder::mixin($mixin, $replace); } + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Database\Query\Builder::flushMacros(); + } + /** * Dynamically handle calls to the class. * @@ -22218,12 +24420,14 @@ namespace { class Util extends \App\Services\Util {} class DataTables extends \Yajra\DataTables\Facades\DataTables {} class Yard extends \App\Services\Facade\Yard {} - class Debugbar extends \Barryvdh\Debugbar\Facade {} - class PDF extends \Barryvdh\DomPDF\Facade {} - class Cart extends \Gloudemans\Shoppingcart\Facades\Cart {} + class Debugbar extends \Barryvdh\Debugbar\Facades\Debugbar {} + class PDF extends \Barryvdh\DomPDF\Facade\Pdf {} + class Pdf extends \Barryvdh\DomPDF\Facade\Pdf {} class Flare extends \Facade\Ignition\Facades\Flare {} class Flash extends \Laracasts\Flash\Flash {} class Html extends \Collective\Html\HtmlFacade {} + class Excel extends \Maatwebsite\Excel\Facades\Excel {} + class PayPal extends \Srmklive\PayPal\Facades\PayPal {} } diff --git a/app/Console/Commands/PaymentsAccounts.php b/app/Console/Commands/PaymentsAccounts.php index 7b15fee..a7369f9 100644 --- a/app/Console/Commands/PaymentsAccounts.php +++ b/app/Console/Commands/PaymentsAccounts.php @@ -21,7 +21,7 @@ class PaymentsAccounts extends Command private $timeStart; - + private $dev = false; public function __construct() { @@ -35,86 +35,169 @@ class PaymentsAccounts extends Command */ public function handle() { + \Log::info('Starting PaymentsAccounts Command', ['timestamp' => now()]); $this->info('RUN Command Payments Account: '.date('d.m.Y H:i')); $this->timeStart = microtime(true); - $this->updateUserNextLevel(); - $this->updatePaymentsAccountsFree(); - $this->reminderPaymentsAccounts(); - - return 0; - + try { + $this->updateUserNextLevel(); + $this->updatePaymentsAccountsFree(); + $this->deactivateUserAccounts(); + $this->reminderPaymentsAccounts(); + + \Log::info('PaymentsAccounts Command completed successfully'); + return 0; + } catch (\Exception $e) { + \Log::error('PaymentsAccounts Command failed', [ + 'error' => $e->getMessage(), + 'trace' => $e->getTraceAsString() + ]); + return 1; + } } private function updateUserNextLevel(){ - // now date - renewal_days - $count = 0; - $renewalDate = Carbon::now()->modify('+'.(config('main.renewal_days')).' days'); - $users = User::where('payment_account', '!=', NULL) - ->where('active', '=', 1) - ->where('blocked', '!=', 1) - ->where('payment_account', '<', $renewalDate) - ->whereColumn('m_level', '!=', 'next_m_level') - ->get(); - - foreach($users as $user){ - $user->m_level = $user->next_m_level; - $user->save(); - $count ++; - } + try { + // now date - renewal_days + $count = 0; + $renewalDate = Carbon::now()->modify('+'.(config('main.renewal_days')).' days'); + $users = User::where('payment_account', '!=', NULL) + ->where('active', '=', 1) + ->where('blocked', '!=', 1) + ->where('payment_account', '<', $renewalDate) + ->whereColumn('m_level', '!=', 'next_m_level') + ->where('deleted_at', NULL) + ->get(); + + foreach($users as $user){ + $user->m_level = $user->next_m_level; + $user->save(); + $count ++; + } - $diff = microtime(true) - $this->timeStart; - $sec = intval($diff); - $micro = $diff - $sec; - $this->info('END Command updateUserNextLevel: '.$count.' | Time: '.$sec. 'sec :' . round($micro * 1000, 4) . " ms"); + $diff = microtime(true) - $this->timeStart; + $sec = intval($diff); + $micro = $diff - $sec; + $this->info('END Command updateUserNextLevel: '.$count.' | Time: '.$sec. 'sec :' . round($micro * 1000, 4) . " ms"); + + \Log::info('updateUserNextLevel completed', [ + 'users_updated' => $count, + 'execution_time' => $sec . 'sec :' . round($micro * 1000, 4) . "ms" + ]); + } catch (\Exception $e) { + \Log::error('updateUserNextLevel failed', [ + 'error' => $e->getMessage() + ]); + throw $e; + } } private function updatePaymentsAccountsFree(){ - // now date - renewal_days -1 / user_levels.payment_year false is no payment - $count = 0; - $renewalDate = Carbon::now()->modify('+'.(config('main.renewal_days')-1).' days'); - $users = User::join('user_levels', 'm_level', '=', 'user_levels.id')->select('users.*') - ->where('users.payment_account', '!=', NULL) - ->where('users.active', '=', 1) - ->where('users.blocked', '!=', 1) - ->where('users.payment_account', '<', $renewalDate) - ->where('user_levels.payment_year', '=', 0) - ->get(); - - foreach($users as $user){ - $user->payment_account = Carbon::parse($user->payment_account)->modify('1 year'); - $user->save(); - $count ++; - } + try { + // now date - renewal_days -1 / user_levels.payment_year false is no payment + $count = 0; + $renewalDate = Carbon::now()->modify('+'.(config('main.renewal_days')-1).' days'); + $users = User::join('user_levels', 'm_level', '=', 'user_levels.id')->select('users.*') + ->where('users.payment_account', '!=', NULL) + ->where('users.active', '=', 1) + ->where('users.blocked', '!=', 1) + ->where('users.payment_account', '<', $renewalDate) + ->where('user_levels.payment_year', '=', 0)//user_levels.payment_year false is no payment + ->where('users.deleted_at', NULL) + ->get(); + + foreach($users as $user){ + $user->payment_account = Carbon::parse($user->payment_account)->modify('1 year'); + $user->save(); + $count ++; + } - $diff = microtime(true) - $this->timeStart; - $sec = intval($diff); - $micro = $diff - $sec; - $this->info('END Command updatePaymentsAccountsFree: '.$count.' | Time: '.$sec. 'sec :' . round($micro * 1000, 4) . " ms"); + $diff = microtime(true) - $this->timeStart; + $sec = intval($diff); + $micro = $diff - $sec; + $this->info('END Command updatePaymentsAccountsFree: '.$count.' | Time: '.$sec. 'sec :' . round($micro * 1000, 4) . " ms"); + + \Log::info('updatePaymentsAccountsFree completed', [ + 'users_updated' => $count, + 'execution_time' => $sec . 'sec :' . round($micro * 1000, 4) . "ms" + ]); + } catch (\Exception $e) { + \Log::error('updatePaymentsAccountsFree failed', [ + 'error' => $e->getMessage() + ]); + throw $e; + } + } + + private function deactivateUserAccounts(){ + try { + $count = 0; + $sevenDaysAfterExpiry = Carbon::now()->subDays(7); + $users = User::where('payment_account', '!=', NULL) + ->where('active', '=', 1) + ->where('blocked', '!=', 1) + ->where('payment_account', '<', $sevenDaysAfterExpiry) + ->where('deleted_at', NULL) + ->get(); + + foreach($users as $user){ + $user->active = 0; + $user->save(); + $this->info('deactivateUserAccount | User: '.$user->id.' '.$user->email.' | Date :' . $user->getPaymentAccountDateFormat() . ""); + + $count ++; + } + + $diff = microtime(true) - $this->timeStart; + $sec = intval($diff); + $micro = $diff - $sec; + $this->info('END Command deactivateUserAccounts: '.$count.' | Time: '.$sec. 'sec :' . round($micro * 1000, 4) . " ms"); + + \Log::info('deactivateUserAccounts completed', [ + 'users_updated' => $count, + 'execution_time' => $sec . 'sec :' . round($micro * 1000, 4) . "ms" + ]); + } catch (\Exception $e) { + \Log::error('deactivateUserAccounts failed', [ + 'error' => $e->getMessage() + ]); + throw $e; + } } private function reminderPaymentsAccounts() { + try { + $count = 0; + $max_reminder_date = Carbon::now()->modify('+'.(config('main.remind_first_days')).' days'); + $users = User::where('payment_account', '!=', NULL) + ->where('active', '=', 1) + ->where('blocked', '!=', 1) + ->where('payment_account', '<', $max_reminder_date) + ->where('deleted_at', NULL) + ->get(); - $count = 0; - $max_reminder_date = Carbon::now()->modify('+'.(config('main.remind_first_days')).' days'); - $users = User::where('payment_account', '!=', NULL) - ->where('active', '=', 1) - ->where('blocked', '!=', 1) - ->where('payment_account', '<', $max_reminder_date) - ->get(); + foreach ($users as $user){ + $status = UserCheckPaymentsAccounts::userReminderPayments($user, $this->dev); + $this->info('reminderPaymentsAccounts Status: '.$status.' | User: '.$user->id.' '.$user->email.' | Date :' . $user->getPaymentAccountDateFormat() . ""); + $count ++; + } - foreach ($users as $user){ - $status = UserCheckPaymentsAccounts::userReminderPayments($user); - $this->info('reminderPaymentsAccounts Status: '.$status.' | User: '.$user->id.' '.$user->email.' | Date :' . $user->getPaymentAccountDateFormat() . ""); - $count ++; - } - - $diff = microtime(true) - $this->timeStart; - $sec = intval($diff); - $micro = $diff - $sec; - $this->info('END Command reminderPaymentsAccounts: '.$count.' | Time: '.$sec. 'sec :' . round($micro * 1000, 4) . " ms"); + $diff = microtime(true) - $this->timeStart; + $sec = intval($diff); + $micro = $diff - $sec; + $this->info('END Command reminderPaymentsAccounts: '.$count.' | Time: '.$sec. 'sec :' . round($micro * 1000, 4) . " ms"); + \Log::info('reminderPaymentsAccounts completed', [ + 'users_processed' => $count, + 'execution_time' => $sec . 'sec :' . round($micro * 1000, 4) . "ms" + ]); + } catch (\Exception $e) { + \Log::error('reminderPaymentsAccounts failed', [ + 'error' => $e->getMessage() + ]); + throw $e; + } } } diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 2ea397d..5163049 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -25,9 +25,12 @@ class Kernel extends ConsoleKernel protected function schedule(Schedule $schedule) { $schedule->command('payments:accounts') - ->sendOutputTo("cron.log"); - //->hourly(); - // ->emailOutputTo('kevin@adametz.media'); + ->sendOutputTo(storage_path('logs/cron.log')) + ->appendOutputTo(storage_path('logs/cron-history.log')) + ->emailOutputOnFailure(config('app.exception_mail')) + ->onFailure(function () { + \Log::error('Payments:accounts command failed'); + }); } /** diff --git a/app/Cron/CronController.php b/app/Cron/CronController.php deleted file mode 100644 index c9c34c2..0000000 --- a/app/Cron/CronController.php +++ /dev/null @@ -1,87 +0,0 @@ -month = $month; - $this->year = $year; - } - - - public function getUserBusinessByMonthYear(){ - return UserBusiness::select('user_businesses.*') - ->where('user_businesses.month', '=', $this->month) - ->where('user_businesses.year', '=', $this->year) - ->where(function($q) { - return $q->where('user_businesses.commission_team_total', '>', 0) - ->orWhere('user_businesses.commission_shop_sales', '>', 0); - }) - ->get(); - } - - public function addUserCreditItem($userBusiness) - { - $date = HTMLHelper::getMonth($userBusiness->month).' '.$userBusiness->year; - - if($userBusiness->commission_shop_sales > 0){ - if($this->hasNotUserCreditItem($userBusiness, 1)){ - UserCreditItem::create([ - 'user_id' => $userBusiness->user_id, - 'user_business_id' => $userBusiness->id, - 'credit' => $userBusiness->commission_shop_sales, - 'message' => 'Provision Shop '.$date, - 'status' => 1, - ]); - } - } - if($userBusiness->commission_team_total > 0){ - if($this->hasNotUserCreditItem($userBusiness, 2)){ - UserCreditItem::create([ - 'user_id' => $userBusiness->user_id, - 'user_business_id' => $userBusiness->id, - 'credit' => $userBusiness->commission_team_total, - 'message' => 'Provision Team '.$date, - 'status' => 2, - ]); - } - } - return $userBusiness; - - } - - public function getUserCreditItemUsersByMonthYear(){ - return UserCreditItem::select('user_credit_items.*') - ->where('paid', '=', false) - ->groupBy('user_id') - ->get(); - } - - public function makeCreditPaymentPDF($user_id, $credit_send_mail) - { - //$user_id = 2; - $user = User::findOrFail($user_id); - $data = []; - if($credit_send_mail){ - $data['credit_send_mail'] = true; - } - $credit_repo = new CreditRepository($user); - return $credit_repo->create($data); - } - - private function hasNotUserCreditItem($userBusiness, $status){ - return (UserCreditItem::where('user_business_id', $userBusiness->id) - ->where('user_id', $userBusiness->user_id)->where('status', $status)->count() > 0) ? false : true; - } -} diff --git a/app/Cron/UserCheckPaymentsAccounts.php b/app/Cron/UserCheckPaymentsAccounts.php index 4a9be9a..30b7c97 100644 --- a/app/Cron/UserCheckPaymentsAccounts.php +++ b/app/Cron/UserCheckPaymentsAccounts.php @@ -27,27 +27,28 @@ class UserCheckPaymentsAccounts > 0 deaktiv = reminder_deaktiv //status 35 */ - public static function userReminderPayments(User $user){ + public static function userReminderPayments(User $user, $dev){ //35 reminder_deaktiv if(!$user->isActiveAccount()){ // payment_account gt now - return self::checkIsReminderSend($user, 35); + return self::checkIsReminderSend($user, 35, $dev); } //34 reminder_last if($user->daysActiveAccount() <= config('main.remind_last_days')){ - return self::checkIsReminderSend($user, 34); + return self::checkIsReminderSend($user, 34, $dev); } //33 reminder_sec if($user->daysActiveAccount() <= config('main.remind_sec_days')){ - return self::checkIsReminderSend($user, 33); + return self::checkIsReminderSend($user, 33, $dev); } //31 reminder_first if($user->daysActiveAccount() > config('main.remind_sec_days')){ - return self::checkIsReminderSend($user, 31); + return self::checkIsReminderSend($user, 31, $dev); } + return 0; } - private static function checkIsReminderSend(User $user, $status){ + private static function checkIsReminderSend(User $user, $status, $dev){ $isSend = UserHistory::whereUserId($user->id) ->whereAction('reminder_payments') @@ -58,7 +59,11 @@ class UserCheckPaymentsAccounts if($isSend){ return 0; } - $referenz = self::sendReminderMail($user, $status); + if($dev){ + $referenz = 0; + }else{ + $referenz = self::sendReminderMail($user, $status); + } UserHistory::create(['user_id' => $user->id, 'action'=>'reminder_payments', 'referenz'=>$referenz, 'identifier'=>$user->payment_account, 'status'=>$status]); return $status; @@ -105,9 +110,9 @@ class UserCheckPaymentsAccounts ]); try{ if($status >= 34){ - Mail::to($user->email)->bcc(config('app.info_mail'))->send(new MailCustomMessage($user, $data, $sender, false)); + //Mail::to($user->email)->bcc(config('app.info_mail'))->send(new MailCustomMessage($user, $data, $sender, false)); }else{ - Mail::to($user->email)->send(new MailCustomMessage($user, $data, $sender, false)); + //Mail::to($user->email)->send(new MailCustomMessage($user, $data, $sender, false)); } } catch(\Exception $e){ @@ -129,6 +134,8 @@ class UserCheckPaymentsAccounts /*public function checkConfirmation() { + User Register sind in der DB UserRegister, erst bei bestätigung wird es in die User DB übertragen + $now = date('Y-m-d H:i:s'); $next = date('Y-m-d H:i:s', strtotime('+3 week')); diff --git a/app/Exports/ExcelExport.php b/app/Exports/ExcelExport.php new file mode 100644 index 0000000..a325e94 --- /dev/null +++ b/app/Exports/ExcelExport.php @@ -0,0 +1,33 @@ +collection = $data; + $this->headings = $header; + } + + public function collection() + { + return collect($this->collection); + } + + public function headings(): array + { + return [$this->headings]; + } + +} \ No newline at end of file diff --git a/app/Exports/UserTeamExport.php b/app/Exports/UserTeamExport.php new file mode 100644 index 0000000..0767de0 --- /dev/null +++ b/app/Exports/UserTeamExport.php @@ -0,0 +1,33 @@ +collection = $data; + $this->headings = $header; + } + + public function collection() + { + return collect($this->collection); + } + + public function headings(): array + { + return [$this->headings]; + } + +} \ No newline at end of file diff --git a/app/Exports/XLSExport.php b/app/Exports/XLSExport.php new file mode 100644 index 0000000..769ffdd --- /dev/null +++ b/app/Exports/XLSExport.php @@ -0,0 +1,33 @@ +collection = $data; + $this->headings = $header; + } + + public function collection() + { + return collect($this->collection); + } + + public function headings(): array + { + return [$this->headings]; + } + +} \ No newline at end of file diff --git a/app/Http/Controllers/Api/ShoppingUserController.php b/app/Http/Controllers/Api/ShoppingUserController.php index fb1ff9b..daa4f5f 100755 --- a/app/Http/Controllers/Api/ShoppingUserController.php +++ b/app/Http/Controllers/Api/ShoppingUserController.php @@ -595,7 +595,9 @@ class ShoppingUserController extends Controller if ($order->price != ($product->price * 100)) { $error[] = "different price: " . ($product->price * 100); } - Yard::instance('shopping')->add($product->id, $product->name, (int) $order->qty, $product->price, ['image' => [], 'slug' => $product->slug, 'weight' => $product->weight]); + + + Yard::instance('shopping')->add($product->id, $product->name, (int) $order->qty, $product->price, $product->tax, ['image' => [], 'slug' => $product->slug, 'weight' => $product->weight]); } } $order->message = $error; @@ -604,7 +606,7 @@ class ShoppingUserController extends Controller $ShippingCountry = ShippingCountry::whereCountryId($shopping_user->shipping_country_id)->first(); if($ShippingCountry){ - Yard::instance('shopping')->setShippingCountryWithPrice($ShippingCountry->id); + Yard::instance('shopping')->setShippingCountryWithPrice($ShippingCountry->id, 'ot'); } $shopping_order = $this->makeShoppingOrder($shopping_user, $wp_invoice_path, $wp_notice); $this->orderStatusSendMail($shopping_order); diff --git a/app/Http/Controllers/AttributeController.php b/app/Http/Controllers/AttributeController.php index 3df29db..993a804 100755 --- a/app/Http/Controllers/AttributeController.php +++ b/app/Http/Controllers/AttributeController.php @@ -3,9 +3,10 @@ namespace App\Http\Controllers; -use App\Models\Attribute; -use App\Models\ProductAttribute; use Request; +use App\Models\Attribute; +use App\Models\AttributeType; +use App\Models\ProductAttribute; class AttributeController extends Controller @@ -20,33 +21,64 @@ class AttributeController extends Controller { $data = [ - 'values' => Attribute::all(), + 'attribute_types' => AttributeType::all(), + 'attributes' => Attribute::all(), 'trans' => array_keys(config('localization.supportedLocales')), ]; return view('admin.attribute.index', $data); } + + public function store() { $data = Request::all(); - if($data['id'] == "new"){ - $model = Attribute::create([ - 'parent_id' => null, - 'name' => $data['name'], - 'pos' => $data['pos'], - 'active' => isset($data['active']) ? true : false, - ]); - }else{ - $model = Attribute::find($data['id']); - $model->parent_id = null; - $model->name = $data['name']; - $model->pos = $data['pos']; - $model->active = isset($data['active']) ? true : false; - $model->save(); - } + if(isset($data['action'])){ - if(!empty($data['trans'])){ + if( $data['action'] === "attribute-type"){ + if($data['id'] == "new"){ + $model = AttributeType::create([ + 'parent_id' => null, + 'name' => $data['name'], + 'description' => $data['description'], + 'pos' => $data['pos'], + 'active' => isset($data['active']) ? true : false, + ]); + }else{ + $model = AttributeType::find($data['id']); + $model->parent_id = null; + $model->name = $data['name']; + $model->description = $data['description']; + $model->pos = $data['pos']; + $model->active = isset($data['active']) ? true : false; + $model->save(); + } + } + if($data['action'] === "attribute"){ + if($data['id'] == "new"){ + $model = Attribute::create([ + 'parent_id' => null, + 'attribute_type_id' => $data['attribute_type_id'], + 'name' => $data['name'], + 'value' => $data['value'], + 'pos' => $data['pos'], + 'active' => isset($data['active']) ? true : false, + ]); + }else{ + $model = Attribute::find($data['id']); + $model->parent_id = null; + $model->name = $data['name']; + $model->value = $data['value']; + $model->attribute_type_id = $data['attribute_type_id']; + $model->pos = $data['pos']; + $model->active = isset($data['active']) ? true : false; + $model->save(); + } + } + } + + /*if(!empty($data['trans'])){ $trans = []; foreach ($data['trans'] as $lang => $value){ if($value && $value != null){ @@ -57,7 +89,7 @@ class AttributeController extends Controller $model->trans_name = $trans; $model->save(); } - } + }*/ \Session()->flash('alert-save', '1'); return redirect(route('admin_product_attributes')); @@ -66,21 +98,41 @@ class AttributeController extends Controller } - public function delete($id){ + public function delete($attr, $id){ - if(ProductAttribute::where('attribute_id', $id)->count()){ - \Session()->flash('alert-error', 'Eintrag wird als Produktattribute verwendet'); + if($attr === 'type'){ + if(Attribute::where('attribute_type_id', $id)->count()){ + \Session()->flash('alert-error', 'Attribute Type wird bei den Attributen verwendet'); + return redirect(route('admin_product_attributes')); + } + /* if(AttributeType::where('parent_id', $id)->count()){ + \Session()->flash('alert-error', 'Eintrag wird als Main Attribute verwendet'); + return redirect(route('admin_product_attributes')); + } + */ + $model = AttributeType::findOrFail($id); + $model->delete(); + \Session()->flash('alert-success', 'Attribute Type gelöscht'); return redirect(route('admin_product_attributes')); } - /* if(Attribute::where('parent_id', $id)->count()){ - \Session()->flash('alert-error', 'Eintrag wird als Main Attribute verwendet'); - return redirect(route('admin_industry_sectors')); + + if($attr === 'attr'){ + if(ProductAttribute::where('attribute_id', $id)->count()){ + \Session()->flash('alert-error', 'Attribute wird bei den Produkten verwendet'); + return redirect(route('admin_product_attributes')); + } + /* if(Attribute::where('parent_id', $id)->count()){ + \Session()->flash('alert-error', 'Eintrag wird als Main Attribute verwendet'); + return redirect(route('admin_product_attributes')); + } + */ + $model = Attribute::findOrFail($id); + $model->delete(); + \Session()->flash('alert-success', 'Eintrag gelöscht'); + return redirect(route('admin_product_attributes')); } - */ - $model = Attribute::findOrFail($id); - $model->delete(); - \Session()->flash('alert-success', 'Eintrag gelöscht'); - return redirect(route('admin_product_attributes')); + + } } \ No newline at end of file diff --git a/app/Http/Controllers/CountryController.php b/app/Http/Controllers/CountryController.php index 7629043..e1c879f 100755 --- a/app/Http/Controllers/CountryController.php +++ b/app/Http/Controllers/CountryController.php @@ -52,6 +52,8 @@ class CountryController extends Controller $data['active'] = isset($data['active']) ? true : false; $data['switch'] = isset($data['switch']) ? true : false; + $data['translate'] = isset($data['translate']) ? true : false; + $data['eu_country'] = isset($data['eu_country']) ? true : false; $data['own_eur'] = isset($data['own_eur']) ? true : false; $data['currency'] = isset($data['currency']) ? true : false; $data['currency_faktor'] = $data['currency_faktor'] == "" ? null : reFormatNumber($data['currency_faktor']); diff --git a/app/Http/Controllers/CronController.php b/app/Http/Controllers/CronController.php index c7f2d78..a0c6f4b 100644 --- a/app/Http/Controllers/CronController.php +++ b/app/Http/Controllers/CronController.php @@ -43,6 +43,7 @@ class CronController extends Controller if($key !== 'key'){ abort(404); } + die('not in use'); if($action === 'check_payments_account'){ $this->checkPaymentsAccounts(); } @@ -54,6 +55,8 @@ class CronController extends Controller */ public function checkConfirmation() { + /* + User Register sind in der DB UserRegister, erst bei bestätigung wird es in die User DB übertragen $now = date('Y-m-d H:i:s'); $next = date('Y-m-d H:i:s', strtotime('+3 week')); @@ -73,7 +76,7 @@ class CronController extends Controller $user->confirmation_code_remider = 1; $user->save(); } - } + }*/ return "TOSK"; } diff --git a/app/Http/Controllers/DataTableController.php b/app/Http/Controllers/DataTableController.php index 2af67bf..177562d 100644 --- a/app/Http/Controllers/DataTableController.php +++ b/app/Http/Controllers/DataTableController.php @@ -30,6 +30,9 @@ class DataTableController extends Controller ->addColumn('admin', function (User $user) { return ''.HTMLHelper::getRoleLabel($user->admin).''; }) + ->addColumn('role', function (User $user) { + return $user->user_level ? $user->user_level->name : ''; + }) ->addColumn('confirmed', function (User $user) { $date = $user->getConfirmationDateFormat(); $link = ''; @@ -71,6 +74,9 @@ class DataTableController extends Controller } return "-"; })*/ + ->addColumn('country', function (User $user) { + return ($user->account && $user->account->country) ? $user->account->country->de : ''; + }) ->addColumn('my_payment_methods', function (User $user) { $payment_methods = json_encode($user->payment_methods); $link = ''; diff --git a/app/Http/Controllers/Evo/SalesController.php b/app/Http/Controllers/Evo/SalesController.php new file mode 100755 index 0000000..ae5eb04 --- /dev/null +++ b/app/Http/Controllers/Evo/SalesController.php @@ -0,0 +1,200 @@ +middleware('admin'); + } + + public function index() + { + + $this->setFilterVars(); + $data = [ + 'filter_months' => HTMLHelper::getTransMonths(), + 'filter_years' => HTMLHelper::getYearRange(2022), + ]; + return view('admin.evaluation.salesvolume', $data); + } + + + + public function download(){ + + if(Request::get('action') === "export"){ + $objects = $this->initSearch(false); + $columns = []; + $filename = "gs-absatzmengen-".session('product_sales_vol_filter_month').'_'.session('product_sales_vol_filter_year')."-export"; + $headers = array( + '#', + 'Produkt', + 'Artikelnummer', + 'Menge', + + ); + if($objects){ + foreach ($objects as $key => $obj){ + $columns[] = array( + 'id' => $key, + 'name' => $obj['name'], + 'number' => $obj['number'], + 'value' => $obj['value'], + ); + } + } + return Excel::download(new UserTeamExport($columns, $headers), $filename.'.xls'); + } + } + + + private function setFilterVars(){ + + if(!session('product_sales_vol_filter_month')){ + session(['product_sales_vol_filter_month' => intval(date('m'))]); + } + if(!session('product_sales_vol_filter_year')){ + session(['product_sales_vol_filter_year' => intval(date('Y'))]); + } + + if(Request::get('product_sales_vol_filter_month')){ + session(['product_sales_vol_filter_month' => Request::get('product_sales_vol_filter_month')]); + } + if(Request::get('product_sales_vol_filter_year')){ + session(['product_sales_vol_filter_year' => Request::get('product_sales_vol_filter_year')]); + } + } + + + private function initSearch($returnColl = true) + { + $this->setFilterVars(); + + $date_start = Carbon::parse('01.'.session('product_sales_vol_filter_month').'.'.session('product_sales_vol_filter_year'))->format('Y-m-d H:i:s'); + $date_end = Carbon::parse('01.'.session('product_sales_vol_filter_month').'.'.session('product_sales_vol_filter_year'))->endOfMonth()->format('Y-m-d H:i:s'); + + $ShoppingOrders = ShoppingOrder::where('paid', 1)->where('mode', 'live')->whereBetween('created_at', [$date_start, $date_end])->get(); + + $objects = []; + foreach($ShoppingOrders as $ShoppingOrder){ + foreach($ShoppingOrder->shopping_order_items as $shopping_order_item){ + + if($shopping_order_item->product){ + if(isset($objects[$shopping_order_item->product->id])){ + $value = intval($objects[$shopping_order_item->product->id]['value'] + $shopping_order_item->qty); + $objects[$shopping_order_item->product->id]['value'] = $value; + }else{ + $objects[$shopping_order_item->product->id] = [ + 'name' => $shopping_order_item->product->name, + 'number' => $shopping_order_item->product->number, + 'value' => $shopping_order_item->qty + ]; + } + + } + + } + } + + if($returnColl){ + $collection = collect(); + + foreach($objects as $key => $obj){ + $collection->push([ + 'id' => $key, + 'name' => $obj['name'], + 'number' => $obj['number'], + 'value' => $obj['value'], + ]); + } + return $collection; + } + return $objects; + + + } + + + public function datatable(){ + + $collection = $this->initSearch(true); + + $collect = collect([ + ['id' => 1, 'name' => 'John', 'number'=>92012, 'value'=>123], + ['id' => 2, 'name' => 'Jane', 'number'=>92012, 'value'=>123], + ['id' => 3, 'name' => 'James', 'number'=>92012, 'value'=>123], + ]); + + return \DataTables::of($collection)->toJson(); + + + + } + + /*private function testCheckFunction(){ + + //$date_start = Carbon::parse('01.'.session('product_sales_vol_filter_month').'.'.session('product_sales_vol_filter_year'))->format('Y-m-d'); + //$date_end = Carbon::parse('01.'.session('product_sales_vol_filter_month').'.'.session('product_sales_vol_filter_year'))->endOfMonth()->format('Y-m-d'); + + $date_start = Carbon::parse('01.01.2024')->format('Y-m-d H:i:s'); + $date_end = Carbon::parse('01.01.2024')->endOfMonth()->format('Y-m-d H:i:s'); + dump($date_start); + dump($date_end); + + $ShoppingOrders = ShoppingOrder::where('mode', 'live')->whereBetween('created_at', [$date_start, $date_end])->get(); + + $objects = []; + $counter = 0; + foreach($ShoppingOrders as $ShoppingOrder){ + foreach($ShoppingOrder->shopping_order_items as $shopping_order_item){ + + if($shopping_order_item->product){ + if($shopping_order_item->product->id === 122){ + //dump($shopping_order_item->qty); + //$counter += $shopping_order_item->qty; + if(isset($objects[$shopping_order_item->product->id])){ + $value = intval($objects[$shopping_order_item->product->id]['value'] + $shopping_order_item->qty); + $objects[$shopping_order_item->product->id]['value'] = $value; + }else{ + $objects[$shopping_order_item->product->id] = [ + 'name' => $shopping_order_item->product->name, + 'number' => $shopping_order_item->product->number, + 'value' => $shopping_order_item->qty + ]; + } + } + } + + } + } + + $ShoppingOrderItems = ShoppingOrderItem::whereProductId(122)->whereBetween('created_at', [$date_start, $date_end])->get(); + $counter = 0; + foreach($ShoppingOrderItems as $ShoppingOrderItem){ + $counter += $ShoppingOrderItem->qty; + dump($ShoppingOrderItem->id); + } + // dump($objects); + dump($counter); + dd("OKAY"); + }*/ + + + +} \ No newline at end of file diff --git a/app/Http/Controllers/FileController.php b/app/Http/Controllers/FileController.php index cbe20b4..55f61f9 100644 --- a/app/Http/Controllers/FileController.php +++ b/app/Http/Controllers/FileController.php @@ -47,61 +47,89 @@ class FileController extends Controller $this->isPermission($shopping_order->auth_user_id); $filename = Invoice::getFilename($shopping_order); $path = Invoice::getDownloadPath($shopping_order); - if (!Storage::disk('public')->exists($path)) { - return Response::make('File no found.', 404); - } - $file = Storage::disk('public')->get($path); - $type = Storage::disk('public')->mimeType($path); - - if($do === 'download'){ - return Response::make($file, 200) - ->header("Content-Type", $type) - ->header('Content-disposition', 'attachment; filename="'.$filename.'"'); - /* $full_path = Invoice::getDownloadPath($shopping_order, true); - $he - if (file_exists($full_path)) { - return Response::download($full_path, $filename); - }*/ - } - if($do === 'stream'){ - return Response::make($file, 200) - ->header("Content-Type", $type) - ->header('Content-disposition','filename="'.$filename.'"'); - } - + } + + + if ($disk === 'delivery'){ + $shopping_order = \App\Models\ShoppingOrder::findOrFail($id); + $this->isPermission($shopping_order->auth_user_id); + $filename = Invoice::getDeliveryFilename($shopping_order); + $path = Invoice::getDownloadPathDelivery($shopping_order); } + if ($disk === 'invoice_delivery'){ + $shopping_order = \App\Models\ShoppingOrder::findOrFail($id); + $this->isPermission($shopping_order->auth_user_id); + + $ifilename = Invoice::getFilename($shopping_order); + $ipath = Invoice::getDownloadPath($shopping_order, true); + $dfilename = Invoice::getDeliveryFilename($shopping_order); + $dpath = Invoice::getDownloadPathDelivery($shopping_order, true); + + $oMerger = new \App\Services\PDFMerger(); + $oMerger->init(); + + $oMerger->addPDF($ipath); + $oMerger->addPDF($dpath); + $filename = str_replace('Rechnung-', 'Rechnung-Lieferschein-', $ifilename); + $oMerger->setFileName($filename); + $oMerger->merge(); + $file = $oMerger->output(); + return Response::make($file, 200) + ->header("Content-Type", 'application/pdf') + ->header('Content-disposition', 'attachment; filename="'.$filename.'"'); + } + if ($disk === 'credit'){ $UserCredit = \App\Models\UserCredit::findOrFail($id); $this->isPermission($UserCredit->auth_user_id); - $filename = Credit::getFilename($UserCredit); $path = Credit::getDownloadPath($UserCredit); - - if (!Storage::disk('public')->exists($path)) { - return Response::make('File no found.', 404); - } - $file = Storage::disk('public')->get($path); - $type = Storage::disk('public')->mimeType($path); - - if($do === 'download'){ - return Response::make($file, 200) - ->header("Content-Type", $type) - ->header('Content-disposition', 'attachment; filename="'.$filename.'"'); - /* $full_path = Invoice::getDownloadPath($shopping_order, true); - $he - if (file_exists($full_path)) { - return Response::download($full_path, $filename); - }*/ - } - if($do === 'stream'){ - return Response::make($file, 200) - ->header("Content-Type", $type) - ->header('Content-disposition','filename="'.$filename.'"'); - } - } + if (!Storage::disk('public')->exists($path)) { + return Response::make('File no found.', 404); + } + + $file = Storage::disk('public')->get($path); + $mime = Storage::disk('public')->mimeType($path); + + if($do === 'download'){ + return Response::make($file, 200) + ->header("Content-Type", $mime) + ->header('Content-disposition', 'attachment; filename="'.$filename.'"'); + /* $full_path = Invoice::getDownloadPath($shopping_order, true); + $he + if (file_exists($full_path)) { + return Response::download($full_path, $filename); + }*/ + } + if($do === 'stream'){ + return Response::make($file, 200) + ->header("Content-Type", $mime) + ->header('Content-disposition','filename="'.$filename.'"'); + } + + if($do === 'file'){ + return Response::make($file, 200) + ->header("Content-Type", $mime) + ->header('Content-disposition', 'filename="'.$filename.'"'); + } + if($do === 'image'){ + return Response::make($file, 200) + ->header("Content-Type", $mime); + } + if($do === 'pdf'){ + $path = storage_path().'/app/public/' . $path; + $headers = array( + 'Content-Type:'. $mime, + // 'Content-Length: ' . $file->size + // 'Content-Disposition: ' . $stream . '; filename=' . $file->original_name + ); + return Response::download($path, $filename, $headers); + } + + } } \ No newline at end of file diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index ac3f420..a18138a 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -90,34 +90,7 @@ class HomeController extends Controller } - public function verify($confirmation_code){ - if( ! $confirmation_code) - { - return redirect('/status/error'); - } - - $user = User::whereConfirmationCode($confirmation_code)->first(); - - if ( ! $user) - { - return redirect('/status/not/found'); - } - if($user->confirmed === 0){ - $user->confirmed = 1; - //kill after wizzard! - // $user->confirmation_code = null; - // $user->confirmation_code_to = null; - // $user->confirmation_code_remider = 0; - $user->confirmation_date = now(); - } - - $user->save(); - - //Login! - Auth::login($user); - - return redirect('/home'); - } + public function statusRegister(){ return view('status.status_register'); diff --git a/app/Http/Controllers/ImportProductController.php b/app/Http/Controllers/ImportProductController.php index 0c6f75f..77e9663 100755 --- a/app/Http/Controllers/ImportProductController.php +++ b/app/Http/Controllers/ImportProductController.php @@ -84,6 +84,7 @@ class ImportProductController extends Controller ProductImage::create([ 'product_id' => $product->id, + 'type' => 'product', // 'product', 'filename' => $name, 'original_name' => $original_name, 'ext' => $ext, diff --git a/app/Http/Controllers/LeadController.php b/app/Http/Controllers/LeadController.php index c3e7ec5..0c8a53c 100755 --- a/app/Http/Controllers/LeadController.php +++ b/app/Http/Controllers/LeadController.php @@ -2,20 +2,23 @@ namespace App\Http\Controllers; +use App\Exports\ExcelExport; +use Request; +use App\User; +use Validator; +use App\Services\SysLog; +use App\Models\UserAccount; +use App\Models\UserHistory; +use Maatwebsite\Excel\Facades\Excel; +use App\Services\UserService; +use App\Mail\MailAccountActive; use App\Mail\MailCustomMessage; use App\Mail\MailVerifyAccount; use App\Mail\MailVerifyContact; -use App\Mail\MailAccountActive; -use App\Models\UserAccount; -use App\Models\UserHistory; -use App\Repositories\ContractPDFRepository; +use App\Models\UserWhitelabelProduct; use App\Repositories\UserRepository; -use App\Services\SysLog; -use App\Services\UserService; -use App\User; use Illuminate\Support\Facades\Mail; -use Request; -use Validator; +use App\Repositories\ContractPDFRepository; class LeadController extends Controller { @@ -33,13 +36,14 @@ class LeadController extends Controller */ public function index() { + $this->setFilterVars(); $data = [ 'values' => User::where('admin', '=', 0)->where('confirmation_code_remider', '!=', 2)->get(), + ]; return view('admin.lead.index', $data); } - /** * @param $id * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View @@ -122,6 +126,17 @@ class LeadController extends Controller $data = Request::all(); $show = Request::get('show'); + + if(isset($data['action']) && $data['action'] == "reverse_charge_validate" && isset($data['user_id'])){ + $user = User::findOrFail($data['user_id']); + return $this->userRepo->reverse_charge_validate($data, $user, route('admin_lead_edit', [$user->id])); + } + + if(isset($data['action']) && $data['action'] == "reverse_charge_delete" && isset($data['user_id'])){ + $user = User::findOrFail($data['user_id']); + return $this->userRepo->reverse_charge_delete($data, $user, route('admin_lead_edit', [$user->id])); + } + if ($data['user_id'] === "new" || $data['user_id'] == 0) { $rules = array( 'salutation' => 'required', @@ -187,6 +202,7 @@ class LeadController extends Controller if(isset($data['m_data_edit']) && $data['m_data_edit'] === "TSOK"){ $user = $this->userRepo->getModel(); $user->m_level = isset($data['m_level']) ? $data['m_level'] : NULL; + $user->lead_type_id = isset($data['lead_type_id']) ? $data['lead_type_id'] : NULL; $user->m_sponsor = isset($data['m_sponsor']) ? $data['m_sponsor'] : NULL; $user->save(); } @@ -215,8 +231,229 @@ class LeadController extends Controller } - //user released when register is complete - public function released($action, $id){ + + + public function update() + { + $data = Request::all(); + $show = Request::get('show'); + if(!isset($data['user_id']) || $data['user_id'] === "new" || $data['user_id'] == 0){ + abort(404, 'User not found'); + } + $user = User::findOrFail($data['user_id']); + + if(isset($data['action'])){ + + //add whitelabel products + if($data['action'] === 'add_whitelabel_products'){ + if(isset($data['whitelabel_products']) && is_array($data['whitelabel_products'])){ + foreach ($data['whitelabel_products'] as $product_id){ + $user->whitelabel_products()->create(['product_id' => $product_id]); + } + } + \Session()->flash('alert-save', true); + } + //remove whitelabel products + if($data['action'] === 'remove_whitelabel_products'){ + if(isset($data['whitelabel_products']) && is_array($data['whitelabel_products'])){ + $user->whitelabel_products()->whereIn('product_id', $data['whitelabel_products'])->delete(); + } + \Session()->flash('alert-success', "Produkt gelöscht"); + } + if($data['action'] === 'upload_white_label_image'){ + //id == user_whitelabel_product_id + $whitelabel_product = UserWhitelabelProduct::findOrFail($data['id']); + if($whitelabel_product && $user->id == $whitelabel_product->user_id){ + return \App\Services\ProductImage::imageUpload('user_wl_product', $whitelabel_product, Request::get('upload_type')); + } + } + //update whitelabel products + if($data['action'] === 'update_whitelabel_products'){ + if(isset($data['image_wl_attributes']) && is_array($data['image_wl_attributes'])){ + foreach ( $user->whitelabel_products as $wl_product){ + foreach ($wl_product->whitelabel_images as $wl_image) { + $wl_image->update([ + 'attributes' => isset($data['image_wl_attributes'][$wl_image->id]) ? $data['image_wl_attributes'][$wl_image->id] : NULL, + ]); + } + } + } + \Session()->flash('alert-save', true); + } + } + return redirect(route('admin_lead_edit', [$user->id])."?show=".$show); + } + + public function remove($action, $user_id, $id, $mid=null){ + $show = Request::get('show'); + $user = User::findOrFail($user_id); + + if($action === 'remove_whitelabel_label'){ + $model = $user->whitelabel_products()->where('id', $id)->first(); + return \App\Services\ProductImage::imageDelete('user_wl_image', $model, $mid); + } + + if($action === 'remove_whitelabel_product'){ + + $model = $user->whitelabel_products()->where('id', $id)->first(); + //remove images + foreach ($model->whitelabel_images as $image){ + \App\Services\ProductImage::imageDelete('user_wl_image', $model, $image->id); + + } + $model->delete(); + \Session()->flash('alert-success', "White Label Produkt entfernt"); + return redirect(route('admin_lead_edit', [$user->id])."?show=$show"); + } + + } + + public function download(){ + + if(Request::get('action') === "export"){ + $query = $this->initSearch(); + $columns = []; + $filename = "GS-VP-export-".date("d-m-Y"); + $headers = array( + 'ID', + 'Email', + 'Firma', + 'Anrede', + 'Vorname', + 'Nachname', + 'Mitglied', + 'Bis', + 'Art', + + ); + $objects = $query->get(); + if($objects){ + foreach ($objects as $obj){ + $columns[] = array( + 'ID' => $obj->id, + 'Email' => $obj->email, + 'Firma' => $obj->account ? $obj->account->company : '', + 'Anrede' => $obj->account ? ($obj->account->salutation == 'mr' ? 'Herr' : 'Frau') : '-', + 'Vorname' => $obj->account ? $obj->account->first_name : '', + 'Nachname' => $obj->account ? $obj->account->last_name : '', + 'Mitglied' => $obj->payment_account ? ($obj->isActiveAccount() ? 'JA' : 'Abgelaufen') : "Nein", + 'Bis' => $obj->payment_account ? $obj->getPaymentAccountDateFormat(false) : '-', + 'Art' => $obj->lead_type ? $obj->lead_type->name : '-', + ); + } + } + return Excel::download(new ExcelExport($columns, $headers), $filename.'.xls'); + } + } + + private function setFilterVars(){ + if(!session('filter_lead_type_id')){ + session(['filter_lead_type_id' => 'all']); + } + if(Request::get('filter_lead_type_id')){ + session(['filter_lead_type_id' => Request::get('filter_lead_type_id')]); + } + } + + private function initSearch(){ + $this->setFilterVars(); + $query = User::with('account')->select('users.*')->where('users.deleted_at', '=', null)->where('users.admin', "<", 4); + if(session('filter_lead_type_id') && session('filter_lead_type_id') !== null && session('filter_lead_type_id') !== "all"){ + $query->where('lead_type_id', session('filter_lead_type_id')); + } + return $query; + } + + public function getLeads() + { + $query = $this->initSearch(); + + return \DataTables::eloquent($query) + ->addColumn('first_name', function (User $user) { + return $user->account ? $user->account->first_name : ''; + }) + ->addColumn('company', function (User $user) { + return $user->account ? $user->account->company : ''; + }) + ->addColumn('last_name', function (User $user) { + return $user->account ? $user->account->last_name : ''; + }) + ->addColumn('user_level', function (User $user) { + return $user->user_level ? $user->user_level->name : ''; + }) + ->addColumn('lead_type', function (User $user) { + return $user->lead_type ? $user->lead_type->name : ''; + }) + ->addColumn('id', function (User $user) { + return ''; + }) + ->addColumn('confirmed', function (User $user) { + return $user->confirmed ? '' : ''; + }) + ->addColumn('active', function (User $user) { + return $user->active ? ' ' : ''; + }) + ->addColumn('agreement', function (User $user) { + return $user->agreement ? ' ' : ''; + }) + ->addColumn('payment_account', function (User $user) { + return $user->payment_account ? ' ' : ''; + }) + ->addColumn('payment_account_date', function (User $user) { + return $user->payment_account ? $user->getPaymentAccountDateFormat(false) : "-"; + }) + /*->addColumn('payment_shop', function (User $user) { + return $user->payment_shop ? ' ' : ''; + }) + ->addColumn('payment_shop_date', function (User $user) { + return $user->payment_shop ? $user->getPaymentShopDateFormat(false) : "-"; + })*/ + ->addColumn('turnover', function (User $user) { + return "-"; + }) + ->addColumn('sales_total', function (User $user) { + return "-"; + }) + + ->orderColumn('id', 'id $1') + ->orderColumn('confirmed', 'confirmed $1') + ->orderColumn('active', 'active $1') + ->orderColumn('lead_type', 'lead_type_id $1') + ->orderColumn('agreement', 'agreement $1') + ->orderColumn('payment_account', 'payment_account $1') + //->orderColumn('payment_shop', 'payment_shop $1') + ->rawColumns(['id', 'confirmed', 'active', 'agreement', 'payment_account']) + ->make(true); + } + + private function activeAccountPayment($user){ + + if($user->user_level){ + if($user->user_level->payment_year){ + //if true = payments + $user->wizard = 20; + $user->active = 1; + $user->active_date = now(); + $user->confirmation_code = null; + $user->confirmation_code_to = null; + $user->confirmation_code_remider = 0; + $user->save(); + }else{ + //if false = no payments for 1 year + $user->wizard = 100; + $user->payment_account = \Carbon::now()->modify('1 year'); + $user->active = 1; + $user->active_date = now(); + $user->confirmation_code = null; + $user->confirmation_code_to = null; + $user->confirmation_code_remider = 0; + $user->save(); + } + } + } + + //user released when register is complete + public function released($action, $id){ $user = User::findOrFail($id); if($action === 'completed'){ @@ -299,7 +536,7 @@ class LeadController extends Controller \Session()->flash('alert-success', "E-Mail an Vertriebspartner gesendet."); } if($action === 'reset_switch'){ - $user->wizard = 4; + $user->wizard = 3; $user->save(); UserHistory::create(['user_id' => $user->id, 'action'=>'reset_switch', 'status'=>0]); \Session()->flash('alert-success', "Vertriebspartner zurückgesetzt!"); @@ -353,7 +590,9 @@ class LeadController extends Controller //send new verfified mail to user - public function newMailVerified($id){ + /* public function newMailVerified($id){ + + User Register sind in der DB UserRegister, erst bei bestätigung wird es in die User DB übertragen $user = User::findOrFail($id); @@ -378,7 +617,7 @@ class LeadController extends Controller \Session()->flash('alert-success', "E-Mail erneut gesendet"); return redirect(route('admin_lead_edit', [$user->id])); - } + }*/ public function deleteFile($user_id, $file_id, $relation){ @@ -392,89 +631,4 @@ class LeadController extends Controller } return back(); } - - public function getLeads() - { - - $query = User::with('account')->select('users.*')->where('users.deleted_at', '=', null)->where('users.admin', "<", 4); - - return \DataTables::eloquent($query) - ->addColumn('first_name', function (User $user) { - return $user->account ? $user->account->first_name : ''; - }) - ->addColumn('company', function (User $user) { - return $user->account ? $user->account->company : ''; - }) - ->addColumn('last_name', function (User $user) { - return $user->account ? $user->account->last_name : ''; - }) - ->addColumn('user_level', function (User $user) { - return $user->user_level ? $user->user_level->name : ''; - }) - ->addColumn('id', function (User $user) { - return ''; - }) - ->addColumn('confirmed', function (User $user) { - return $user->confirmed ? '' : ''; - }) - ->addColumn('active', function (User $user) { - return $user->active ? ' ' : ''; - }) - ->addColumn('agreement', function (User $user) { - return $user->agreement ? ' ' : ''; - }) - ->addColumn('payment_account', function (User $user) { - return $user->payment_account ? ' ' : ''; - }) - ->addColumn('payment_account_date', function (User $user) { - return $user->payment_account ? $user->getPaymentAccountDateFormat(false) : "-"; - }) - /*->addColumn('payment_shop', function (User $user) { - return $user->payment_shop ? ' ' : ''; - }) - ->addColumn('payment_shop_date', function (User $user) { - return $user->payment_shop ? $user->getPaymentShopDateFormat(false) : "-"; - })*/ - ->addColumn('turnover', function (User $user) { - return "-"; - }) - ->addColumn('sales_total', function (User $user) { - return "-"; - }) - - ->orderColumn('id', 'id $1') - ->orderColumn('confirmed', 'confirmed $1') - ->orderColumn('active', 'active $1') - ->orderColumn('agreement', 'agreement $1') - ->orderColumn('payment_account', 'payment_account $1') - //->orderColumn('payment_shop', 'payment_shop $1') - ->rawColumns(['id', 'confirmed', 'active', 'agreement', 'payment_account']) - ->make(true); - } - - private function activeAccountPayment($user){ - - if($user->user_level){ - if($user->user_level->payment_year){ - //if true = payments - $user->wizard = 20; - $user->active = 1; - $user->active_date = now(); - $user->confirmation_code = null; - $user->confirmation_code_to = null; - $user->confirmation_code_remider = 0; - $user->save(); - }else{ - //if false = no payments for 1 year - $user->wizard = 100; - $user->payment_account = \Carbon::now()->modify('1 year'); - $user->active = 1; - $user->active_date = now(); - $user->confirmation_code = null; - $user->confirmation_code_to = null; - $user->confirmation_code_remider = 0; - $user->save(); - } - } - } } \ No newline at end of file diff --git a/app/Http/Controllers/LeadTypeController.php b/app/Http/Controllers/LeadTypeController.php new file mode 100644 index 0000000..f9ff07f --- /dev/null +++ b/app/Http/Controllers/LeadTypeController.php @@ -0,0 +1,47 @@ +middleware('admin'); + } + + public function index() + { + + $data = [ + 'values' => LeadType::all(), + ]; + return view('admin.lead.types', $data); + } + + public function store() + { + + $data = Request::all(); + if($data['id'] === "new"){ + $model = LeadType::create([ + 'name' => $data['name'], + 'active' => isset($data['active']) ? true : false, + ]); + }else{ + $model = LeadType::find($data['id']); + $model->name = $data['name']; + $model->active = isset($data['active']) ? true : false; + $model->save(); + } + \Session()->flash('alert-save', '1'); + return redirect(route('admin_lead_types')); + + + } +} \ No newline at end of file diff --git a/app/Http/Controllers/MembershipController.php b/app/Http/Controllers/MembershipController.php index 2ac6762..cd13b15 100755 --- a/app/Http/Controllers/MembershipController.php +++ b/app/Http/Controllers/MembershipController.php @@ -99,6 +99,17 @@ class MembershipController extends Controller $image = $product->images->first()->slug; } $qty = Request::get('qty') ? Request::get('qty') : 1; + + /* //need setGlobalTaxRate + + $cartItem = Yard::instance('shopping')->add($product->id, $product->getLang('name'), $qty, $product->getPriceWith(\App\Services\UserService::getTaxFree(), false, \App\Services\UserService::$user_country), false, false, ['image' => $image, 'slug' => $product->slug, 'weight' => $product->weight, 'points' => $product->points, 'no_commission' => $product->no_commission]); + if(\App\Services\UserService::getTaxFree()){ + Yard::setTax($cartItem->rowId, 0); + }else{ + Yard::setTax($cartItem->rowId, $product->getTaxWith(\App\Services\UserService::$user_country)); + } + */ + //Keine steuer Yard::instance('shopping')->add($product->id, $product->getLang('name'), $qty, $product->price, $product->tax, ['image' => $image, 'slug' => $product->slug, 'weight' => $product->weight]); Yard::instance('shopping')->setGlobalTaxRate(0); /* @@ -161,6 +172,8 @@ class MembershipController extends Controller if($action === "change_level"){ if(Request::get('switchers-package-level')){ $user = User::find(Auth::user()->id); + //hier wird die nächste Mitgliedschaftsstufe gesetzt + //wird im Cronjob UserCheckPaymentsAccounts.php verwendet und gesetzt $user->next_m_level = Request::get('switchers-package-level'); $user->save(); UserHistory::create(['user_id' => $user->id, 'action'=>$action, 'status'=>10, 'referenz'=>Request::get('switchers-package-level')]); diff --git a/app/Http/Controllers/Pay/PayController.php b/app/Http/Controllers/Pay/PayController.php index 5151e04..d94ac7b 100644 --- a/app/Http/Controllers/Pay/PayController.php +++ b/app/Http/Controllers/Pay/PayController.php @@ -177,11 +177,18 @@ class PayController extends Controller ]); //paypal if($this->payment_method === 'pp'){ - $paypal = new PayPalController; - $redirect = $paypal->payment($this->shopping_payment, $payt, $identifier, $this->shopping_order->promotion_user_id); - Util::setUserHistoryValue(['status'=>4], $identifier); - return $redirect; - + switch ($payment_for) { + case 7: //promotion + $paypal = new PayPalController; + $redirect = $paypal->payment($this->shopping_payment, $payt, $identifier, $payment_for, $this->shopping_order->promotion_user_id); + Util::setUserHistoryValue(['status'=>4], $identifier); + return $redirect; + case 8: //shop + $paypal = new PayPalController; + $redirect = $paypal->payment($this->shopping_payment, $payt, $identifier, $payment_for, $this->shopping_order->user_shop_id); + Util::setUserHistoryValue(['status'=>4], $identifier); + return $redirect; + } } Util::setUserHistoryValue(['status'=>5], $identifier); @@ -189,7 +196,10 @@ class PayController extends Controller case 7: //promotion return redirect(route('web_promotion_goto', ['thanksorder', $this->shopping_order->promotion_user_id, $payt->id, $this->reference, $identifier])); break; - + case 8: //shop + return redirect(route('web_shop_goto', ['thanksorder', $this->shopping_order->user_shop_id, $payt->id, $this->reference, $identifier])); + break; + default: return redirect(route('user_checkout_final', [$payt->id, $this->reference, $identifier])); break; diff --git a/app/Http/Controllers/Pay/PayPalController.php b/app/Http/Controllers/Pay/PayPalController.php index 7e4e9b7..570d964 100644 --- a/app/Http/Controllers/Pay/PayPalController.php +++ b/app/Http/Controllers/Pay/PayPalController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Pay; use Request; +use App\Models\UserShop; use App\Models\PromotionUser; use App\Models\PaymentTransaction; use App\Http\Controllers\Controller; @@ -12,7 +13,7 @@ use Srmklive\PayPal\Services\PayPal as PayPalClient; class PayPalController extends Controller { - public function payment($shopping_payment, $payt, $identifier, $promotion_user_id) + public function payment($shopping_payment, $payt, $identifier, $payment_for, $payment_for_user_id) { $provider = new PayPalClient; // Through facade. No need to import namespaces @@ -36,8 +37,8 @@ class PayPalController extends Controller ] ], 'application_context' => [ - 'cancel_url' => route('cancel.paypal_payment', [$promotion_user_id, $payt->id, $shopping_payment->reference, $identifier]), - 'return_url' => route('success.paypal_payment', [$promotion_user_id, $payt->id, $shopping_payment->reference, $identifier]) + 'cancel_url' => route('cancel.paypal_payment', [$payment_for, $payment_for_user_id, $payt->id, $shopping_payment->reference, $identifier]), + 'return_url' => route('success.paypal_payment', [$payment_for, $payment_for_user_id, $payt->id, $shopping_payment->reference, $identifier]) ] ]); @@ -47,9 +48,8 @@ class PayPalController extends Controller } - public function paymentSuccess($id, $transactionId=false, $reference=false, $identifier=false) + public function paymentSuccess($payment_for, $id, $transactionId=false, $reference=false, $identifier=false) { - $PromotionUser = PromotionUser::findOrFail($id); $payt = PaymentTransaction::findOrFail($transactionId); if($payt->shopping_payment->reference != $reference){ abort(404); @@ -74,16 +74,34 @@ class PayPalController extends Controller } $payt->request = $order['status']; $payt->save(); - return redirect(route('web_promotion_goto', ['thanksorder', $id, $payt->id, $reference, $identifier])); + + switch ($payment_for) { + case 7: //promotion + $PromotionUser = PromotionUser::findOrFail($id); + return redirect(route('web_promotion_goto', ['thanksorder', $id, $payt->id, $reference, $identifier])); + case 8: //shop + $userShop = UserShop::findOrFail($id); + return redirect(route('web_shop_goto', ['thanksorder', $id, $payt->id, $reference, $identifier])); + dd('Your payment has been declend. The payment cancelation page goes here!'); + } + } - public function paymentCancel($id, $transactionId=false, $reference=false, $identifier=false) + public function paymentCancel($payment_for, $id, $transactionId=false, $reference=false, $identifier=false) { - $PromotionUser = PromotionUser::findOrFail($id); - - return redirect(url($PromotionUser->url)); - dd('Your payment has been declend. The payment cancelation page goes here!'); + switch ($payment_for) { + case 7: //promotion + $PromotionUser = PromotionUser::findOrFail($id); + return redirect(url($PromotionUser->url)); + dd('Your payment has been declend. The payment cancelation page goes here!'); + case 8: //shop + $userShop = UserShop::findOrFail($id); + return redirect(url($userShop->url)); + dd('Your payment has been declend. The payment cancelation page goes here!'); + } + + } diff --git a/app/Http/Controllers/PaymentCreditController.php b/app/Http/Controllers/PaymentCreditController.php index ed8e73e..79f2531 100644 --- a/app/Http/Controllers/PaymentCreditController.php +++ b/app/Http/Controllers/PaymentCreditController.php @@ -4,17 +4,18 @@ namespace App\Http\Controllers; use App\Models\Models\UserCreditMargin as ModelsUserCreditMargin; -use Carbon; -use Request; -use App\User; -use App\Services\Util; -use App\Services\Credit; -use App\Services\Payment; -use App\Models\UserCredit; use App\Models\ShoppingOrderMargin; +use App\Models\UserCredit; use App\Models\UserCreditMargin; use App\Repositories\CreditRepository; +use App\Services\Credit; +use App\Services\Payment; +use App\Services\Payment\UserBot; +use App\Services\Util; +use App\User; +use Carbon; use Illuminate\Support\Collection; +use Request; class PaymentCreditController extends Controller { @@ -23,10 +24,12 @@ class PaymentCreditController extends Controller private $endYear; private $rangeYears; private $activeYear; + private $userBot; - public function __construct() + public function __construct(UserBot $userBot) { $this->middleware('auth'); + $this->userBot = $userBot; $this->startYear = 2021; $this->endYear = date('Y'); $this->rangeYears = range($this->startYear, $this->endYear); @@ -41,7 +44,11 @@ class PaymentCreditController extends Controller } - + /** + * fügt eine neue Manuelle Gutschrift hinzu + * + * @return \Illuminate\Http\RedirectResponse + */ public function store(){ $data = Request::all(); @@ -64,7 +71,6 @@ class PaymentCreditController extends Controller $credit = Util::reFormatNumber($data['credit']); $credit = number_format($credit, 2, '.', ''); - Payment::addUserCreditMargin($user, $credit, 3, $data['message']); \Session()->flash('alert-success', "Guthaben hinzugefügt"); } @@ -72,6 +78,11 @@ class PaymentCreditController extends Controller return redirect(route('admin_payments_credit')); } + /** + * Erstellt eine neue komplette Gutschrift für einen Benutzer + * + * @return \Illuminate\Http\RedirectResponse + */ public function create(){ $data = Request::all(); if(isset($data['action'])){ @@ -95,65 +106,18 @@ class PaymentCreditController extends Controller } } - private function makeData(){ + private function makeData(): array + { $this->setActiveYears(); - //$date1 = Carbon::parse('01.01.'.$this->activeYear." 00:00:00")->format('Y-m-d H:i:s'); - //$date2 = Carbon::parse('31.12.'.$this->activeYear." 23:59:59")->toDateString(); - - $ShoppingOrderMargins = ShoppingOrderMargin::join('users', 'm_sponsor_id', '=', 'users.id') - ->groupBy('m_sponsor_id') - ->join('user_accounts', 'account_id', '=', 'user_accounts.id') - ->select('users.id as user_id', 'users.email', 'user_accounts.first_name', 'user_accounts.last_name') - ->wherePaid(true) - ->whereCancellation(false) - ->wherePartnerCommissionPaid(false) - ->where('partner_commission_pending_to', '<', Carbon::now()) - ->get(); - - $ShoppingOrderMarginPendings = ShoppingOrderMargin::join('users', 'm_sponsor_id', '=', 'users.id') - ->groupBy('m_sponsor_id') - ->join('user_accounts', 'account_id', '=', 'user_accounts.id') - ->select('users.id as user_id', 'users.email', 'user_accounts.first_name', 'user_accounts.last_name') - ->wherePaid(true) - ->whereCancellation(false) - ->wherePartnerCommissionPaid(false) - ->where('partner_commission_pending_to', '>=', Carbon::now()) - ->get(); - - $UserCreditMargins = UserCreditMargin::wherePaid(false)->get(); - $ShoppingOrderMarginUserIds = ShoppingOrderMargin::select('m_sponsor_id')->groupBy('m_sponsor_id') - ->wherePaid(true) - ->whereCancellation(false) - ->wherePartnerCommissionPaid(false) - ->where('partner_commission_pending_to', '<', Carbon::now()) - ->get()->pluck('m_sponsor_id')->toArray(); + $this->userBot->readUserHasCredits(); + $this->userBot->readUserHasPendingCredit(); - $onlyUserCreditMargins = []; - foreach($UserCreditMargins as $key => $UserCreditMargin){ - if(!in_array($UserCreditMargin->user_id, $ShoppingOrderMarginUserIds)){ - if(isset($onlyUserCreditMargins[$UserCreditMargin->user_id])){ - $onlyUserCreditMargins[$UserCreditMargin->user_id]['sum'] += $UserCreditMargin->credit; - $onlyUserCreditMargins[$UserCreditMargin->user_id]['entries'][$UserCreditMargin->id] = $UserCreditMargin; - }else{ - $onlyUserCreditMargins[$UserCreditMargin->user_id] = [ - 'user_id' => $UserCreditMargin->user->id, - 'first_name' => $UserCreditMargin->user->account->first_name, - 'last_name' => $UserCreditMargin->user->account->last_name, - 'email' => $UserCreditMargin->user->email, - 'sum' => $UserCreditMargin->credit, - 'entries' => [$UserCreditMargin->id => $UserCreditMargin], - ]; - } - } - } - $data = [ + return [ 'years' => $this->rangeYears, 'active_year' => $this->activeYear, - 'ShoppingOrderMargins' => $ShoppingOrderMargins, - 'ShoppingOrderMarginPendings' => $ShoppingOrderMarginPendings, - 'onlyUserCreditMargins' => $onlyUserCreditMargins, + 'users_credits' => $this->userBot->getUsers(), + 'users_credits_pending' => $this->userBot->getUsersPending(), ]; - return $data; } private function setActiveYears(){ @@ -173,19 +137,25 @@ class PaymentCreditController extends Controller \Session()->flash('alert-error', "Guthaben kann nicht gelöscht werden"); } } + if($del === 'shopping_order_margin'){ + $ShoppingOrderMargin = ShoppingOrderMargin::findOrFail($id); + $ShoppingOrderMargin->out_paid = true; + $ShoppingOrderMargin->save(); + \Session()->flash('alert-success', "Gutschrift ist gelöscht"); + } return redirect(route('admin_payments_credit')); } public function datatable(){ $this->setActiveYears(); - $date1 = Carbon::parse('01.01.'.$this->activeYear)->format('Y-m-d'); - $date2 = Carbon::parse('31.12.'.$this->activeYear)->format('Y-m-d'); + $startDate = Carbon::parse("01.01.{$this->activeYear}")->format('Y-m-d'); + $endDate = Carbon::parse("31.12.{$this->activeYear}")->format('Y-m-d'); $query = UserCredit::with('user', 'user.account')->select('user_credits.*') //::with('shopping_user', )->select('shopping_orders.*') //->where('paid', '=', 1) - ->whereBetween('date', [$date1, $date2]); + ->whereBetween('date', [$startDate, $endDate]); //->orderBy('created_at', 'DESC'); return \DataTables::eloquent($query) diff --git a/app/Http/Controllers/PaymentInvoiceController.php b/app/Http/Controllers/PaymentInvoiceController.php index ee03755..1b56589 100644 --- a/app/Http/Controllers/PaymentInvoiceController.php +++ b/app/Http/Controllers/PaymentInvoiceController.php @@ -81,7 +81,7 @@ class PaymentInvoiceController extends Controller return Payment::getShoppingOrderBadge($ShoppingOrder); }) ->addColumn('payment_for', function (ShoppingOrder $ShoppingOrder) { - return ''.$ShoppingOrder->getPaymentForType().''; + return Payment::getPaymentForTypeBadge($ShoppingOrder); }) ->addColumn('invoice', function (ShoppingOrder $ShoppingOrder) { $ret = ""; diff --git a/app/Http/Controllers/PaymentMethodController.php b/app/Http/Controllers/PaymentMethodController.php index a8ff314..e7b2840 100755 --- a/app/Http/Controllers/PaymentMethodController.php +++ b/app/Http/Controllers/PaymentMethodController.php @@ -4,7 +4,6 @@ namespace App\Http\Controllers; use App\Models\PaymentMethod; -use App\Models\UserLevel; use Request; diff --git a/app/Http/Controllers/ProductController.php b/app/Http/Controllers/ProductController.php index 687edda..7386bd4 100755 --- a/app/Http/Controllers/ProductController.php +++ b/app/Http/Controllers/ProductController.php @@ -136,75 +136,16 @@ class ProductController extends Controller // Upload FILE ----------------------------------------------------------------------------------------------------------------------- public function imageUpload(){ - $product_id = Request::get('product_id'); - $product = Product::findOrFail($product_id); - - try { - $image = \App\Services\Slim::getImages('images')[0]; - - if ( isset($image['output']['data']) ) - { - - // Base64 of the image - $data = $image['output']['data']; - $file_ex = array( 'image/jpeg' => 'jpg', 'image/png' => 'png'); - - if (!isset($file_ex[$image['output']['type']])) { - \Session()->flash('alert-danger', 'File is not jpg or png!'); - return redirect(route('admin_product_edit', [$product->id])); - } - - $ext = $file_ex[$image['output']['type']]; - // Original file name - $name = $image['output']['name']; - $name = \App\Services\Slim::sanitizeFileName($name); - $name = uniqid() . '_' . $name; - - $data = \Storage::disk('public')->put( - 'images/product/'.$product->id.'/'.$name, - $data - ); - - ProductImage::create([ - 'product_id' => $product->id, - 'filename' => $name, - 'original_name' => $image['output']['name'], - 'ext' => $ext, - 'mine' => $image['output']['type'], - 'size' => $image['input']['size'] - ]); - - - \Session()->flash('alert-success', "Datei hochgeladen"); - return redirect(route('admin_product_edit', [$product->id])); - } - \Session()->flash('alert-danger', "Datei leer"); - return redirect(route('admin_product_edit', [$product->id])); - - } - catch (\Exception $e) { - \Session()->flash('alert-danger', "Fehler".$e); - return redirect(route('admin_product_edit', [$product->id])); + if(Request::has('product_id')){ + $product = Product::findOrFail(Request::get('product_id')); + return \App\Services\ProductImage::imageUpload('product', $product, Request::get('upload_type')); } + } - public function imageDelete($image_id, $product_id){ - + public function imageDelete($product_image_id, $product_id){ $product = Product::findOrFail($product_id); - $product_image = ProductImage::findOrFail($image_id); - - if($product_image->product_id == $product->id){ - $file = 'images/product/'.$product->id.'/'.$product_image->filename; - \Storage::disk('public')->delete($file); - - $product_image->delete(); - - \Session()->flash('alert-success', "Datei gelöscht"); - return redirect(route('admin_product_edit', [$product->id])); - - } - \Session()->flash('alert-danger', "Datei nicht gefunden"); - return redirect(route('admin_product_edit', [$product->id])); + return \App\Services\ProductImage::imageDelete('product', $product, $product_image_id); } diff --git a/app/Http/Controllers/SalesController.php b/app/Http/Controllers/SalesController.php index d32b1f2..4b6e015 100755 --- a/app/Http/Controllers/SalesController.php +++ b/app/Http/Controllers/SalesController.php @@ -82,7 +82,7 @@ class SalesController extends Controller return ''.$ShoppingOrder->getShippedType().''; }) ->addColumn('payment_for', function (ShoppingOrder $ShoppingOrder) { - return ''.$ShoppingOrder->getPaymentForType().''; + return Payment::getPaymentForTypeBadge($ShoppingOrder); }) ->addColumn('reference', function (ShoppingOrder $ShoppingOrder) { return $ShoppingOrder->getLastShoppingPayment('reference'); @@ -210,7 +210,7 @@ class SalesController extends Controller return ''.$ShoppingOrder->getShippedType().''; }) ->addColumn('payment_for', function (ShoppingOrder $ShoppingOrder) { - return ''.$ShoppingOrder->getPaymentForType().''; + return Payment::getPaymentForTypeBadge($ShoppingOrder); }) ->addColumn('reference', function (ShoppingOrder $ShoppingOrder) { return $ShoppingOrder->getLastShoppingPayment('reference'); @@ -246,43 +246,59 @@ class SalesController extends Controller abort(404); } if(isset($data['action'])){ - if($data['action'] === 'store_shipped' && isset($data['shipped'])){ $shopping_order = ShoppingOrder::findOrFail($data['id']); $shopping_order->shipped = $data['shipped']; $shopping_order->save(); //handel Promotion Product and credit by storno Payment::handelUserPromotionOrder($shopping_order); + Payment::handelUserShopOrder($shopping_order); + if($shopping_order->getAPIShippedType() === 'sent' || $shopping_order->getAPIShippedType() === 'close'){ if(!$shopping_order->shipped_at){ $shopping_order->shipped_at = now(); $shopping_order->save(); - //set to oder_margin - if($shopping_order->shopping_order_margin && $shopping_order->shopping_order_margin->hasPartnerCommission()){ + //is shipped set pending_to + if($shopping_order->shopping_order_margin){ + if($shopping_order->shopping_order_margin->hasPartnerCommission()){ $days = Setting::getContentBySlug('pending_partner_commissions_in_days'); - $days = $days ? $days : 20; - $partner_commission_pending_to = $shopping_order->shipped_at; - $partner_commission_pending_to->addDays($days); - $shopping_order->shopping_order_margin->partner_commission_pending_to = $partner_commission_pending_to; - $shopping_order->shopping_order_margin->save(); + $days = $days ? $days : 20; + $partner_commission_pending_to = $shopping_order->shipped_at; + $partner_commission_pending_to->addDays($days); + $shopping_order->shopping_order_margin->partner_commission_pending_to = $partner_commission_pending_to; + $shopping_order->shopping_order_margin->save(); + }else{ + $days = Setting::getContentBySlug('pending_order_margins_in_days'); + $days = $days ? $days : 20; + $margin_pending_to = $shopping_order->shipped_at; + $margin_pending_to->addDays($days); + $shopping_order->shopping_order_margin->margin_pending_to = $margin_pending_to; + $shopping_order->shopping_order_margin->save(); + } } } }else{ $shopping_order->shipped_at = null; $shopping_order->save(); - if($shopping_order->shopping_order_margin && $shopping_order->shopping_order_margin->hasPartnerCommission()){ + if($shopping_order->shopping_order_margin){ + //zurücksetzen der pending_to $shopping_order->shopping_order_margin->partner_commission_pending_to = null; + $shopping_order->shopping_order_margin->margin_pending_to = null; $shopping_order->shopping_order_margin->save(); } } if($shopping_order->getAPIShippedType() === 'cancel'){ if($shopping_order->shopping_order_margin){ $shopping_order->shopping_order_margin->cancellation = true; + $shopping_order->shopping_order_margin->partner_commission_pending_to = null; + $shopping_order->shopping_order_margin->margin_pending_to = null; $shopping_order->shopping_order_margin->save(); } }else{ if($shopping_order->shopping_order_margin && $shopping_order->shopping_order_margin->cancellation){ $shopping_order->shopping_order_margin->cancellation = false; + $shopping_order->shopping_order_margin->partner_commission_pending_to = null; + $shopping_order->shopping_order_margin->margin_pending_to = null; $shopping_order->shopping_order_margin->save(); } } @@ -326,10 +342,10 @@ class SalesController extends Controller $shopping_order->save(); $shopping_payment->txaction = $data['txaction']; $shopping_payment->save(); - if($payt->status === 'vor' && $payt->txaction === 'paid'){ $send_link = Payment::paymentStatusPaidAction($shopping_order, true); } + //handel credit loading by change when by $shopping_order_item->handl if($shopping_order->shopping_user->is_for === 'cr'){ $last_UserPayCredit = UserPayCredit::where('shopping_order_id', $shopping_order->id)->whereIn('status', [7, 8])->orderBy('id', 'DESC')->first(); diff --git a/app/Http/Controllers/Stats/SalesController.php b/app/Http/Controllers/Stats/SalesController.php new file mode 100755 index 0000000..64944c2 --- /dev/null +++ b/app/Http/Controllers/Stats/SalesController.php @@ -0,0 +1,193 @@ +middleware('admin'); + $this->serviceSales = $serviceSales; + } + + public function index() + { + $this->setFilterVars(); + $data = [ + 'filter_months' => HTMLHelper::getTransMonths(true), + 'filter_years' => HTMLHelper::getYearRange(2020), + 'filter_products' => $this->serviceSales->setFilterProducts(), + ]; + return view('admin.stats.salesvolume', $data); + } + + + public function download() + { + + $this->setFilterVars(); + + if (Request::get('action') === "filter") { + // $data = Request::all(); + return back(); + } + + if (Request::get('action') === "export") { + $objects = $this->serviceSales->getObjects(); + $columns = []; + $filename = "gs-absatzmengen-" . session('product_sales_vol_filter_month') . '_' . session('product_sales_vol_filter_year') . "-export"; + $headers = array( + '#', + 'Produkt', + 'Artikelnummer', + 'Menge', + 'Gesamt Netto in EURO', + 'Vorjahr Menge', + 'Vorjahr Gesamt Netto in EURO', + 'Einzelrabatt', + 'Einzelrabatt %', + 'VP Einzelrabatt %', + + + ); + if ($objects) { + foreach ($objects as $key => $obj) { + $columns[] = array( + 'id' => $key, + 'name' => $obj['name'], + 'number' => $obj['number'], + 'qty' => $obj['qty'], + 'total' => $obj['total'], + 'pre_qty' => $obj['pre_qty'], + 'pre_total' => $obj['pre_total'], + 'single_commission' => $obj['single_commission'], + 'value_commission' => $obj['value_commission'], + 'partner_commission' => $obj['partner_commission'], + + ); + } + } + return Excel::download(new ExcelExport($columns, $headers), $filename . '.xls'); + } + } + + private function setFilterVars() + { + + if (!session('product_sales_vol_filter_month')) { + session(['product_sales_vol_filter_month' => intval(date('m'))]); + } + if (!session('product_sales_vol_filter_year')) { + session(['product_sales_vol_filter_year' => intval(date('Y'))]); + } + if (!session('product_sales_vol_filter_products')) { + session(['product_sales_vol_filter_products' => []]); + } + if (Request::get('product_sales_vol_filter_month')) { + session(['product_sales_vol_filter_month' => Request::get('product_sales_vol_filter_month')]); + } + if (Request::get('product_sales_vol_filter_year')) { + session(['product_sales_vol_filter_year' => Request::get('product_sales_vol_filter_year')]); + } + if (Request::get('product_sales_vol_filter_products')) { + session(['product_sales_vol_filter_products' => Request::get('product_sales_vol_filter_products')]); + } + + $this->serviceSales->setFilterVars( + session('product_sales_vol_filter_month'), + session('product_sales_vol_filter_year'), + session('product_sales_vol_filter_products') + ); + } + + + + + + + + + + public function datatable() + { + + $this->setFilterVars(); + $collection = $this->serviceSales->getCollection(); + + /* $collect = collect([ + ['id' => 1, 'name' => 'John', 'number'=>92012, 'value'=>123], + ['id' => 2, 'name' => 'Jane', 'number'=>92012, 'value'=>123], + ['id' => 3, 'name' => 'James', 'number'=>92012, 'value'=>123], + ]); + */ + + return \DataTables::of($collection)->toJson(); + } + + /*private function testCheckFunction(){ + + //$date_start = Carbon::parse('01.'.session('product_sales_vol_filter_month').'.'.session('product_sales_vol_filter_year'))->format('Y-m-d'); + //$date_end = Carbon::parse('01.'.session('product_sales_vol_filter_month').'.'.session('product_sales_vol_filter_year'))->endOfMonth()->format('Y-m-d'); + + $date_start = Carbon::parse('01.01.2024')->format('Y-m-d H:i:s'); + $date_end = Carbon::parse('01.01.2024')->endOfMonth()->format('Y-m-d H:i:s'); + dump($date_start); + dump($date_end); + + $ShoppingOrders = ShoppingOrder::where('mode', 'live')->whereBetween('created_at', [$date_start, $date_end])->get(); + + $objects = []; + $counter = 0; + foreach($ShoppingOrders as $ShoppingOrder){ + foreach($ShoppingOrder->shopping_order_items as $shopping_order_item){ + + if($shopping_order_item->product){ + if($shopping_order_item->product->id === 122){ + //dump($shopping_order_item->qty); + //$counter += $shopping_order_item->qty; + if(isset($objects[$shopping_order_item->product->id])){ + $value = intval($objects[$shopping_order_item->product->id]['value'] + $shopping_order_item->qty); + $objects[$shopping_order_item->product->id]['value'] = $value; + }else{ + $objects[$shopping_order_item->product->id] = [ + 'name' => $shopping_order_item->product->name, + 'number' => $shopping_order_item->product->number, + 'value' => $shopping_order_item->qty + ]; + } + } + } + + } + } + + $ShoppingOrderItems = ShoppingOrderItem::whereProductId(122)->whereBetween('created_at', [$date_start, $date_end])->get(); + $counter = 0; + foreach($ShoppingOrderItems as $ShoppingOrderItem){ + $counter += $ShoppingOrderItem->qty; + dump($ShoppingOrderItem->id); + } + // dump($objects); + dump($counter); + dd("OKAY"); + }*/ +} diff --git a/app/Http/Controllers/SyS/AdminToolsController.php b/app/Http/Controllers/SyS/AdminToolsController.php index ed38748..2fe35e8 100755 --- a/app/Http/Controllers/SyS/AdminToolsController.php +++ b/app/Http/Controllers/SyS/AdminToolsController.php @@ -285,7 +285,7 @@ class AdminToolsController extends Controller $text = ""; $kas = new KasController(); - $domain = 'mivita.care'; + $domain = 'hier die DOMAIN'; $ssl = KasSLLController::getApiSSLParameter(); diff --git a/app/Http/Controllers/User/CheckoutController.php b/app/Http/Controllers/User/CheckoutController.php index 8d1d119..ec991c8 100755 --- a/app/Http/Controllers/User/CheckoutController.php +++ b/app/Http/Controllers/User/CheckoutController.php @@ -498,11 +498,16 @@ class CheckoutController extends Controller 'net_amount' => Yard::instance('shopping')->getYardMargin()->net_amount, 'from_payment_credit' => Yard::instance('shopping')->totalfromCredit(2, '.', ''), 'from' => now(), + 'status' => $shopping_order->payment_for, //7 => 'from promotion', 8 => 'from shop', 'content' => serialize(Yard::instance('shopping')->getYardMargin()->toArray()) ]; if(Yard::instance('shopping')->getYardMargin()->net_partner_commission > 0){ - $data['m_sponsor_id'] = $shopping_order->auth_user->m_sponsor; - $data['net_partner_commission'] = Yard::instance('shopping')->getYardMargin()->net_partner_commission; + if(isset($shopping_order->auth_user->m_sponsor)){ + if($shopping_order->auth_user->user_sponsor && $shopping_order->auth_user->user_sponsor->isActiveAccount()){ + $data['m_sponsor_id'] = $shopping_order->auth_user->m_sponsor; + $data['net_partner_commission'] = Yard::instance('shopping')->getYardMargin()->net_partner_commission; + } + } } $shopping_order_margin = false; if ($this->getPayments('shopping_order_margin_id')) { diff --git a/app/Http/Controllers/User/HomepartyController.php b/app/Http/Controllers/User/HomepartyController.php index 09f645c..783b61a 100755 --- a/app/Http/Controllers/User/HomepartyController.php +++ b/app/Http/Controllers/User/HomepartyController.php @@ -370,7 +370,11 @@ class HomepartyController extends Controller $date = date('d.m.Y H:i:s', $time); $user = User::find(Auth::user()->id); Yard::instance('shopping')->destroy(); - Yard::instance('shopping')->add($homeparty->id, 'Bestellung Homeparty '.$date, 1, \App\Services\HomepartyCart::$price, ['image' => "", 'slug' => $time, 'weight' => 0]); + die("STOP nicht getestet"); + Yard::instance('shopping')->add($homeparty->id, 'Bestellung Homeparty '.$date, 1, \App\Services\HomepartyCart::$price, /*need TAX*/ 1, ['image' => "", 'slug' => $time, 'weight' => 0]); + + // $cartItem = Yard::instance('shopping')->add($homeparty->id, 'Bestellung Homeparty '.$date, 1, \App\Services\HomepartyCart::$ek_price, false, false, ['image' => "", 'slug' => $time, 'weight' => 0]); + Yard::setTax($cartItem->rowId, 0); do { $identifier = Util::getToken(); } while( ShoppingInstance::where('identifier', $identifier)->count() ); diff --git a/app/Http/Controllers/User/MyOrderController.php b/app/Http/Controllers/User/MyOrderController.php new file mode 100644 index 0000000..d511e8f --- /dev/null +++ b/app/Http/Controllers/User/MyOrderController.php @@ -0,0 +1,94 @@ +middleware('active.account'); + } + + public function index() + { + + $data = [ + ]; + return view('user.order.index', $data); + } + + public function detail($id) + { + $user = User::find(\Auth::user()->id); + $shopping_order = ShoppingOrder::findOrFail($id); + if($shopping_order->auth_user_id !== $user->id){ + abort(404); + } + $shopping_order->getLastShoppingPayment(); + + $data = [ + 'shopping_order' => $shopping_order, + 'isAdmin' => false, + ]; + return view('user.order.detail', $data); + } + + public function datatable(){ + + $user = User::find(\Auth::user()->id); + $query = ShoppingOrder::with('shopping_user', 'shopping_payments')->select('shopping_orders.*')->where('auth_user_id', '=', $user->id)->where('txaction', '!=', NULL); + + return \DataTables::eloquent($query) + ->addColumn('id', function (ShoppingOrder $ShoppingOrder) { + return ''; + }) + ->addColumn('created_at', function (ShoppingOrder $ShoppingOrder) { + return $ShoppingOrder->created_at->format("d.m.Y"); + }) + ->addColumn('txaction', function (ShoppingOrder $ShoppingOrder) { + return Payment::getShoppingOrderBadge($ShoppingOrder); + }) + ->addColumn('total_shipping', function (ShoppingOrder $ShoppingOrder) { + return $ShoppingOrder->getFormattedTotalShipping()." €"; + }) + ->addColumn('payment', function (ShoppingOrder $ShoppingOrder) { + return $ShoppingOrder->getLastShoppingPayment('getPaymentType'); + }) + ->addColumn('shipped', function (ShoppingOrder $ShoppingOrder) { + return ''.$ShoppingOrder->getShippedType().''; + }) + ->addColumn('payment_for', function (ShoppingOrder $ShoppingOrder) { + return Payment::getPaymentForTypeBadge($ShoppingOrder); + }) + ->addColumn('reference', function (ShoppingOrder $ShoppingOrder) { + return $ShoppingOrder->getLastShoppingPayment('reference'); + }) + ->orderColumn('id', 'id $1') + ->orderColumn('txaction', 'txaction $1') + ->orderColumn('payment_for', 'payment_for $1') + ->orderColumn('shipped', 'shipped $1') + ->orderColumn('total_shipping', 'total_shipping $1') + ->rawColumns(['id', 'txaction', 'payment_for', 'shipped']) + ->make(true); + } + +} \ No newline at end of file diff --git a/app/Http/Controllers/User/OrderController.php b/app/Http/Controllers/User/OrderController.php index aa34ed1..da61ef8 100755 --- a/app/Http/Controllers/User/OrderController.php +++ b/app/Http/Controllers/User/OrderController.php @@ -7,18 +7,20 @@ use Yard; use Request; use App\User; use Validator; +use App\Services\Shop; use App\Services\Util; use App\Models\Product; use App\Models\UserShop; use App\Services\Payment; +use App\Models\ProductBuy; use App\Models\UserHistory; use App\Models\ShoppingUser; use App\Models\ShoppingOrder; +use App\Services\UserService; use App\Models\ProductCategory; use App\Models\ShippingCountry; use App\Models\ShoppingInstance; use App\Http\Controllers\Controller; -use App\Models\ProductBuy; class OrderController extends Controller { @@ -28,80 +30,15 @@ class OrderController extends Controller $this->middleware('active.account'); } - public function index() - { - - $data = [ - ]; - return view('user.order.index', $data); - } - - public function detail($id) - { - $user = User::find(\Auth::user()->id); - $shopping_order = ShoppingOrder::findOrFail($id); - if($shopping_order->auth_user_id !== $user->id){ - abort(404); - } - $shopping_order->getLastShoppingPayment(); - - $data = [ - 'shopping_order' => $shopping_order, - 'isAdmin' => false, - ]; - return view('user.order.detail', $data); - } - - public function ordersDatatable(){ - - $user = User::find(\Auth::user()->id); - $query = ShoppingOrder::with('shopping_user', 'shopping_payments')->select('shopping_orders.*')->where('auth_user_id', '=', $user->id)->where('txaction', '!=', NULL); - - return \DataTables::eloquent($query) - ->addColumn('id', function (ShoppingOrder $ShoppingOrder) { - return ''; - }) - ->addColumn('created_at', function (ShoppingOrder $ShoppingOrder) { - return $ShoppingOrder->created_at->format("d.m.Y"); - }) - ->addColumn('txaction', function (ShoppingOrder $ShoppingOrder) { - return Payment::getShoppingOrderBadge($ShoppingOrder); - }) - ->addColumn('total_shipping', function (ShoppingOrder $ShoppingOrder) { - return $ShoppingOrder->getFormattedTotalShipping()." €"; - }) - ->addColumn('payment', function (ShoppingOrder $ShoppingOrder) { - return $ShoppingOrder->getLastShoppingPayment('getPaymentType'); - }) - ->addColumn('shipped', function (ShoppingOrder $ShoppingOrder) { - return ''.$ShoppingOrder->getShippedType().''; - }) - ->addColumn('payment_for', function (ShoppingOrder $ShoppingOrder) { - return ''.$ShoppingOrder->getPaymentForType().''; - }) - ->addColumn('reference', function (ShoppingOrder $ShoppingOrder) { - return $ShoppingOrder->getLastShoppingPayment('reference'); - }) - ->orderColumn('id', 'id $1') - ->orderColumn('txaction', 'txaction $1') - ->orderColumn('payment_for', 'payment_for $1') - ->orderColumn('shipped', 'shipped $1') - ->orderColumn('total_shipping', 'total_shipping $1') - ->rawColumns(['id', 'txaction', 'payment_for', 'shipped']) - ->make(true); - } - - public function delivery($for, $id=null) { $user = User::find(\Auth::user()->id); - $shopping_user = null; $delivery_id = null; - if($for === 'ot'){ - $shopping_user = $this->checkShoppingUser($id, $user); + if(strpos($for, 'ot') !== false){ + $shopping_user = Shop::checkShoppingUser($id, $user); $delivery_id = $shopping_user->id; - if(!$this->checkShoppingCountry($for, $delivery_id) && !\Session()->has('custom-error')){ + if(!Shop::checkShoppingCountry($for, $delivery_id) && !\Session()->has('custom-error')){ \Session()->flash('custom-error', __('validation.custom.shipping_not_found')); return redirect(route('user_order_my_delivery', [$for, $delivery_id])); } @@ -109,12 +46,11 @@ class OrderController extends Controller if(Request::get('action') === 'next'){ Yard::instance('shopping')->destroy(); - if(Request::get('switchers-radio-is-for') === 'ot'){ + if(strpos(Request::get('switchers-radio-is-for'), 'ot') !== false){ $delivery_id = $id; } return redirect(route('user_order_my_list', [Request::get('switchers-radio-is-for'), $delivery_id])); } - $data = [ 'shopping_user' => $shopping_user, 'isAdmin' => false, @@ -132,16 +68,23 @@ class OrderController extends Controller $shopping_user = null; $delivery_id = null; - if($for === 'ot'){ - $shopping_user = $this->checkShoppingUser($id, $user); + if(strpos($for, 'ot') !== false){ + $shopping_user = Shop::checkShoppingUser($id, $user); $delivery_id = $shopping_user->id; } - $shipping_country_id = $this->checkShoppingCountry($for, $id); - if(!$shipping_country_id){ - \Session()->flash('custom-error', __('validation.custom.shipping_not_found')); - return redirect(route('user_order_my_delivery', [$for, $delivery_id])); + if($for === 'ot-customer'){ //noch nicht implementiert + //Liederung an ot-customer (Kunden) Zahlung und Rechnung geht an Kunden + UserService::initCustomerYard($shopping_user, $for); + }else{ + //Lieferung an user oder ot-member (Kunden) rechnung geht an User + //lieferland und rechnungsland prüfen + $shipping_country_id = Shop::checkShoppingCountry($for, $id); + if(!$shipping_country_id){ + \Session()->flash('custom-error', __('validation.custom.shipping_not_found')); + return redirect(route('user_order_my_delivery', [$for, $delivery_id])); + } + UserService::initUserYard($user, $shipping_country_id, $for); } - Yard::instance('shopping')->setShippingCountryWithPrice($shipping_country_id, $for); if($for === 'cr'){ Yard::instance('shopping')->setGlobalTaxRate(0); @@ -150,7 +93,6 @@ class OrderController extends Controller }else{ Yard::instance('shopping')->setShoppingUser($user, true); } - $data = [ 'shopping_user' => $shopping_user, 'user' => $user, @@ -183,6 +125,8 @@ class OrderController extends Controller if ($validator->fails()) { return back()->withErrors($validator)->withInput(Request::all()); } + //hier prüfen, ob versand etc richtig berechnet wurde + $this->checkSendYardForPayment($data, $id); if(Yard::instance('shopping')->getNumComp() > 0){ if(!isset($data['switchers-comp-product'])){ @@ -211,6 +155,7 @@ class OrderController extends Controller $data['is_from'] = 'user_order'; $data['is_for'] = $for; $data['shopping_user_id'] = $id; + $data['user_price_infos'] = Yard::instance('shopping')->getUserPriceInfos(); unset($data['quantity']); unset($data['_token']); @@ -236,48 +181,108 @@ class OrderController extends Controller return redirect(route('user_checkout', [$identifier])); } - private function checkShoppingCountry($for, $id=null){ + + private function checkSendYardForPayment($data, $id){ - $country_id = null; - if($for === 'me' || $for === 'mp' || $for === 'cr'){ - $user = User::find(\Auth::user()->id); - if($user->same_as_billing){ - $country_id = $user->account->country_id; - }else{ - $country_id = $user->account->shipping_country_id; - } + $user = User::find(\Auth::user()->id); + $shopping_user = null; + if(strpos($data['shipping_is_for'], 'ot') !== false){ + $shopping_user = Shop::checkShoppingUser($id, $user); } - if($for === 'ot' && $id){ - $shopping_user = ShoppingUser::findOrFail($id); - if($shopping_user->same_as_billing){ - $country_id = $shopping_user->billing_country_id; - }else{ - $country_id = $shopping_user->shipping_country_id; - } + + $shipping_country_id = Shop::checkShoppingCountry($data['shipping_is_for'], $id); + if(!$shipping_country_id){ + $identifier = 'error-'.time().mt_rand(1000000, 9999999); + Yard::instance('shopping')->store($identifier); + $data['user_id'] = Auth::user()->id; + $data['shopping_user_id'] = $id; + \App\Services\MyLog::writeLog('payment', 'error', 'no shipping_country_id found | Yard identifier: '.$identifier, $data); + abort(403, __('msg.shipping_country_was_not_found')); + } + //must be the same shipping country + if($shipping_country_id != Yard::instance('shopping')->getShippingCountryId()){ + $identifier = 'error-'.time().mt_rand(1000000, 9999999); + Yard::instance('shopping')->store($identifier); + $data['user_id'] = Auth::user()->id; + $data['shopping_user_id'] = $id; + \App\Services\MyLog::writeLog('payment', 'error', 'shipping_country_id is not the same from Yard | Yard identifier: '.$identifier, $data); + abort(403, __('msg.shipping_country_was_not_correctly')); } - if($country_id){ - if($shipping_country = ShippingCountry::whereCountryId($country_id)->first()){ - return $shipping_country->id; + if($data['shipping_is_for'] !== 'ot-customer'){ + if(Yard::instance('shopping')->shipping_free){ + $identifier = 'error-'.time().mt_rand(1000000, 9999999); + Yard::instance('shopping')->store($identifier); + $data['user_id'] = Auth::user()->id; + $data['shopping_user_id'] = $id; + \App\Services\MyLog::writeLog('payment', 'error', 'Yard can by not shipping_free | Yard identifier: '.$identifier, $data); + abort(403, __('msg.shopping_cart_was_shipping_free')); } } - return false; + + if($data['shipping_is_for'] === 'ot-customer'){ + if(!$user->shop){ + $identifier = 'error-'.time().mt_rand(1000000, 9999999); + Yard::instance('shopping')->store($identifier); + $data['user_id'] = Auth::user()->id; + $data['shopping_user_id'] = $id; + \App\Services\MyLog::writeLog('payment', 'error', 'User has no Shop for an User to Customer order| Yard identifier: '.$identifier, $data); + abort(403, __('msg.shopping_cart_was_not_user_shop')); + } + } + + $shipping_price = Shop::getShippingPriceByShippingCountryId($shipping_country_id, Yard::instance('shopping')->weight()); + //for other and has weight - check + if(strpos($data['shipping_is_for'], 'ot') !== false && $data['shipping_is_for'] !== 'ot-customer' && Yard::instance('shopping')->weight() > 0){ + if(!Yard::instance('shopping')->getShippingPrice() || Yard::instance('shopping')->getShippingPrice() == 0){ + $identifier = 'error-'.time().mt_rand(1000000, 9999999); + Yard::instance('shopping')->store($identifier); + $data['user_id'] = Auth::user()->id; + $data['shopping_user_id'] = $id; + \App\Services\MyLog::writeLog('payment', 'error', 'Yard OT shipping_price is 0 or | Yard identifier: '.$identifier, $data); + abort(403, __('msg.shipping_cost_cannot_be_0')); + } + if(Yard::instance('shopping')->getShippingPrice() != $shipping_price->price){ + $identifier = 'error-'.time().mt_rand(1000000, 9999999); + Yard::instance('shopping')->store($identifier); + $data['user_id'] = Auth::user()->id; + $data['shopping_user_id'] = $id; + \App\Services\MyLog::writeLog('payment', 'error', 'Yard OT shipping_price is not the same from shipping_price | Yard identifier: '.$identifier, $data); + abort(403, __('msg.shipping_costs_were_not_calculated_correctly')); + } + } + + if($data['shipping_is_for'] == 'me' && Yard::instance('shopping')->weight() > 0){ + if(!Yard::instance('shopping')->getShippingPrice() || Yard::instance('shopping')->getShippingPrice() == 0){ + $identifier = 'error-'.time().mt_rand(1000000, 9999999); + Yard::instance('shopping')->store($identifier); + $data['user_id'] = Auth::user()->id; + $data['shopping_user_id'] = $id; + \App\Services\MyLog::writeLog('payment', 'error', 'Yard ME shipping_price is 0 or | Yard identifier: '.$identifier, $data); + abort(403, __('msg.shipping_cost_cannot_be_0')); + } + if(Yard::instance('shopping')->getShippingPrice() != $shipping_price->price_comp){ + $identifier = 'error-'.time().mt_rand(1000000, 9999999); + Yard::instance('shopping')->store($identifier); + $data['user_id'] = Auth::user()->id; + $data['shopping_user_id'] = $id; + \App\Services\MyLog::writeLog('payment', 'error', 'Yard ME shipping_price is not the same from shipping_price | Yard identifier: '.$identifier, $data); + abort(403, __('msg.shipping_costs_were_not_calculated_correctly')); + } + + if(Yard::instance('shopping')->getNumComp() != $shipping_price->num_comp){ + $identifier = 'error-'.time().mt_rand(1000000, 9999999); + Yard::instance('shopping')->store($identifier); + $data['user_id'] = Auth::user()->id; + $data['shopping_user_id'] = $id; + \App\Services\MyLog::writeLog('payment', 'error', 'Yard num_comp is 0 | Yard identifier: '.$identifier, $data); + abort(403, __('msg.compensation_products_cannot_be_0')); + } + + } + } - private function checkShoppingUser($id, $user){ - if($id === null){ - abort(403, 'Error: Keine User ID'); - } - $shopping_user = ShoppingUser::findOrFail($id); - if($shopping_user->member_id !== $user->id){ - abort(403, 'Error: Falsche User ID'); - } - $shopping_user = ShoppingUser::findOrFail($id); - if($shopping_user->is_like){ - abort(403, 'Error: Kunde in Prüfung'); - } - return $shopping_user; - } public function datatable(){ @@ -430,7 +435,11 @@ class OrderController extends Controller } //get the card item - $cartItem = Yard::instance('shopping')->add($product->id, $product->getLang('name'), 1, $product->getPriceWith(false, true), $product->tax, + + //Yard::instance('shopping')->add($product->id, $product->getLang('name'), 1, $product->price, $product->tax, ['image' => $image, 'slug' => $product->slug, 'weight' => $product->weight]); + + $cartItem = Yard::instance('shopping')->add($product->id, $product->getLang('name'), 1, $product->price, $product->tax, + //$product->getPriceWith(Yard::instance('shopping')->getUserTaxFree(), true, Yard::instance('shopping')->getUserCountry()), $product->getTaxWith(Yard::instance('shopping')->getUserCountry()), //$product->tax, true? [ 'image' => $image, 'slug' => $product->slug, @@ -440,7 +449,14 @@ class OrderController extends Controller 'value_commission' => $product->value_commission, 'partner_commission' => $product->partner_commission, ]); - Yard::setTax($cartItem->rowId, $product->tax); + + if(Yard::instance('shopping')->getUserTaxFree()){ + //Yard::setTax($cartItem->rowId, 0); + Yard::instance('shopping')->setGlobalTaxRate(0); + }else{ + //Yard::setTax($cartItem->rowId, $product->getTaxWith(Yard::instance('shopping')->getUserCountry())); + } + if(isset($data['qty']) && $data['qty'] > 0){ Yard::instance('shopping')->update($cartItem->rowId, $data['qty']); @@ -476,7 +492,7 @@ class OrderController extends Controller if($data['action'] === 'updateShippingCountry') { if(isset($data['shipping_country_id'])){ if($shipping_country = ShippingCountry::find($data['shipping_country_id'])){ - Yard::instance('shopping')->setShippingCountryWithPrice($shipping_country->id, $is_for); + Yard::instance('shopping')->setShippingCountryWithPrice($shipping_country->id, $is_for); //$is_for == 'ot' or 'me' $this->checkCompProduct(Yard::instance('shopping')->getNumComp()); } } @@ -543,14 +559,29 @@ class OrderController extends Controller } } - private function getCompProducts($for){ - - if($for === 'me' && \App\Models\Setting::getContentBySlug('order_partner_is_comp_me')){ - return Product::whereActive(true)->whereJsonContains('show_on', ['2'])->where('shipping_addon', true)->orderBy('pos', 'DESC')->get(); + private function getCompProducts($for) { + if($for === 'me' && \App\Models\Setting::getContentBySlug('order_partner_is_comp_me')) { + return Product::whereActive(true) + ->where(function($query) { + $query->whereRaw("JSON_CONTAINS(show_on, '\"2\"')") + ->orWhereRaw("JSON_CONTAINS(show_on, '\"11\"')"); + }) + ->where('shipping_addon', true) + ->orderBy('pos', 'DESC') + ->get(); } - if($for === 'ot' && \App\Models\Setting::getContentBySlug('order_partner_is_comp_ot')){ - return Product::whereActive(true)->whereJsonContains('show_on', ['1'])->where('shipping_addon', true)->orderBy('pos', 'DESC')->get(); + + if($for === 'ot' && \App\Models\Setting::getContentBySlug('order_partner_is_comp_ot')) { + return Product::whereActive(true) + ->where(function($query) { + $query->whereRaw("JSON_CONTAINS(show_on, '\"1\"')") + ->orWhereRaw("JSON_CONTAINS(show_on, '\"11\"')"); + }) + ->where('shipping_addon', true) + ->orderBy('pos', 'DESC') + ->get(); } + return null; } diff --git a/app/Http/Controllers/User/PaymentController.php b/app/Http/Controllers/User/PaymentController.php index 6b1dbca..0023c12 100644 --- a/app/Http/Controllers/User/PaymentController.php +++ b/app/Http/Controllers/User/PaymentController.php @@ -47,10 +47,10 @@ class PaymentController extends Controller return nl2br($user_pay_credit->message); }elseif($user_pay_credit->status === 5 || $user_pay_credit->status === 6){ return trans('payment.'.$user_pay_credit->message). - '   '; + '   '; }else{ return trans('payment.'.$user_pay_credit->message). - '   '; + '   '; } }) ->addColumn('credit', function (UserPayCredit $user_pay_credit) { diff --git a/app/Http/Controllers/User/SalesController.php b/app/Http/Controllers/User/SalesController.php index 2413e8f..95d541e 100755 --- a/app/Http/Controllers/User/SalesController.php +++ b/app/Http/Controllers/User/SalesController.php @@ -1,50 +1,56 @@ middleware('active.account'); } - public function orders() + + public function index() { $data = [ ]; - return view('user.sales.orders', $data); + return view('user.sales.index', $data); } - public function orderDetail($id) + public function detail($id) { $user = User::find(\Auth::user()->id); $shopping_order = ShoppingOrder::findOrFail($id); if($shopping_order->member_id !== $user->id){ abort(404); } + if($shopping_order->payment_for !== 6 && $shopping_order->payment_for !== 7 && $shopping_order->payment_for !== 8){ + return redirect(route('user_myorder_detail', [$shopping_order->id])); + abort(403, 'Beraterbestellung'); + } $data = [ 'shopping_order' => $shopping_order, 'isAdmin' => false, ]; - return view('user.sales.order_detail', $data); + + return view('user.sales.detail', $data); } - public function ordersDatatable(){ + public function datatable(){ $user = User::find(\Auth::user()->id); $query = ShoppingOrder::with('shopping_user')->select('shopping_orders.*')->where('shopping_orders.member_id', $user->id); return \DataTables::eloquent($query) ->addColumn('id', function (ShoppingOrder $ShoppingOrder) { - return ''; + return ''; }) ->addColumn('created_at', function (ShoppingOrder $ShoppingOrder) { return $ShoppingOrder->created_at->format("d.m.Y"); @@ -53,7 +59,7 @@ class SalesController extends Controller return Payment::getShoppingOrderBadge($ShoppingOrder); }) ->addColumn('total_shipping', function (ShoppingOrder $ShoppingOrder) { - return $ShoppingOrder->getFormattedTotalShipping(); + return ''.$ShoppingOrder->getFormattedTotalShipping()." €"; }) ->addColumn('orders', function (ShoppingOrder $ShoppingOrder) { return $ShoppingOrder->shopping_user ? $ShoppingOrder->shopping_user->orders : ''; @@ -62,15 +68,25 @@ class SalesController extends Controller return $ShoppingOrder->user_shop ? ''.$ShoppingOrder->user_shop->getSubdomain(false).'' : ''; }) ->addColumn('payment_for', function (ShoppingOrder $ShoppingOrder) { - return ''.$ShoppingOrder->getPaymentForType().''; + return Payment::getPaymentForTypeBadge($ShoppingOrder); }) + ->addColumn('shipped', function (ShoppingOrder $ShoppingOrder) { + return ''.$ShoppingOrder->getShippedType().' + '; + }) + ->addColumn('invoice', function (ShoppingOrder $ShoppingOrder) { + return $ShoppingOrder->isInvoice() ? ' + ' : '-'; + }) + ->orderColumn('payment_for', 'payment_for $1') ->orderColumn('id', 'id $1') ->orderColumn('txaction', 'txaction $1') - ->orderColumn('payment_for', 'payment_for $1') - ->rawColumns(['id', 'payment_for', 'txaction', 'user_shop_id']) + ->orderColumn('user_shop_id', 'user_shop_id $1') + ->orderColumn('total_shipping', 'total_shipping $1') + + ->rawColumns(['id', 'txaction', 'user_shop_id', 'total_shipping', 'invoice', 'shipped', 'payment_for']) ->make(true); } - - + } \ No newline at end of file diff --git a/app/Http/Controllers/User/ShopController.php b/app/Http/Controllers/User/ShopController.php new file mode 100644 index 0000000..1d6a256 --- /dev/null +++ b/app/Http/Controllers/User/ShopController.php @@ -0,0 +1,119 @@ +middleware('active.account'); + $this->userShopRepo = $userShopRepo; + } + + public function index(){ + + $user = Auth::user(); + + // $user_shop = UserShop::where('user_id', Auth::user()->id)->first(); + if(!$user->shop){ + //create new shop + $user = $this->createNewUserShop(Auth::user()); + } + if($user->shop->user_id != Auth::user()->id){ + abort(404); + } + $data = [ + 'user_shop' => $user->shop, + ]; + + return view('user.shop.detail', $data); + } + private function createNewUserShop($user){ + return $this->userShopRepo->create($user); + } + + public function store() + { + $data = Request::all(); + $user = Auth::user(); + + if(isset($data['action']) && $data['action'] === 'save-user-shop'){ + $rules = array( + 'name' => 'required', + 'user_shop_url' => ' required|alpha_dash|profanity|'.'unique:user_shops,url,'.$user->shop->id.',id'.'|min:4|max:20|full_word_check', + ); + Validator::extend('full_word_check', function ($attribute, $value, $parameters, $validator) { + $profanity = \App\Models\Setting::getContentBySlug('promotion_user_url_profanity'); + $profanity = array_map('trim', explode(',', $profanity)); + if(in_array($value, $profanity)){ + return false; + } + return true; + }); + $validator = Validator::make(Request::all(), $rules); + if ($validator->fails()) { + return redirect(route('user_shop'))->withErrors($validator)->withInput(Request::all()); + } + $model = $this->userShopRepo->update($user->shop->id, Request::all()); + } + \Session()->flash('alert-save', true); + return redirect(route('user_shop')); + } + + public function load(){ + $data = Request::all(); + + if(Request::ajax()) { + if(isset($data['action']) && $data['action'] === 'validate_url'){ + $unique = 'unique:user_shops,url'; + if(isset($data['usid'])){ + $unique .= ','.$data['usid'].',id'; + } + $rules = array( + 'user_shop_url' => ' required|alpha_dash|profanity|'.$unique.'|min:4|max:20|full_word_check', + ); + Validator::extend('full_word_check', function ($attribute, $value, $parameters, $validator) { + $profanity = \App\Models\Setting::getContentBySlug('promotion_user_url_profanity'); + $profanity = array_map('trim', explode(',', $profanity)); + if(in_array($value, $profanity)){ + return false; + } + return true; + }); + $validator = Validator::make(Request::all(), $rules); + + if ($validator->fails()) { + //$messages = $validator->messages(); + return Response::json(array( + 'success' => false, + 'errors' => $validator->getMessageBag()->toArray() + + )); + } + //$slug = SlugService::createSlug(UserShop::class, 'slug', Request::get('user_promotion_url')); + $name = Util::sanitize(Request::get('user_shop_url'), true, false, true, true); + + return Response::json(array( + 'success' => true, + 'preview_user_shop_url' => config('app.shop_url')."/".$name, + )); + } + } + } + + +} \ No newline at end of file diff --git a/app/Http/Controllers/User/ShopSalesController.php b/app/Http/Controllers/User/ShopSalesController.php deleted file mode 100755 index 766f697..0000000 --- a/app/Http/Controllers/User/ShopSalesController.php +++ /dev/null @@ -1,74 +0,0 @@ -middleware('active.shop'); - } - - public function orders() - { - $data = [ - ]; - return view('user.shop.sales.orders', $data); - } - - public function orderDetail($id) - { - $user = User::find(\Auth::user()->id); - $shopping_order = ShoppingOrder::findOrFail($id); - if($shopping_order->member_id !== $user->id){ - abort(404); - } - $data = [ - 'shopping_order' => $shopping_order, - 'isAdmin' => false, - ]; - return view('user.shop.sales.order_detail', $data); - } - - public function ordersDatatable(){ - - $user = User::find(\Auth::user()->id); - $query = ShoppingOrder::with('shopping_user')->select('shopping_orders.*')->where('member_id', $user->id); - - return \DataTables::eloquent($query) - ->addColumn('id', function (ShoppingOrder $ShoppingOrder) { - return ''; - }) - ->addColumn('created_at', function (ShoppingOrder $ShoppingOrder) { - return $ShoppingOrder->created_at->format("d.m.Y"); - }) - ->addColumn('txaction', function (ShoppingOrder $ShoppingOrder) { - return Payment::getShoppingOrderBadge($ShoppingOrder); - }) - ->addColumn('total_shipping', function (ShoppingOrder $ShoppingOrder) { - return $ShoppingOrder->getFormattedTotalShipping(); - }) - ->addColumn('orders', function (ShoppingOrder $ShoppingOrder) { - return $ShoppingOrder->shopping_user ? $ShoppingOrder->shopping_user->orders : ''; - }) - ->addColumn('user_shop_id', function (ShoppingOrder $ShoppingOrder) { - return $ShoppingOrder->user_shop ? ''.$ShoppingOrder->user_shop->getSubdomain(false).'' : ''; - }) - - ->orderColumn('id', 'id $1') - ->orderColumn('txaction', 'txaction $1') - ->orderColumn('user_shop_id', 'user_shop_id $1') - ->rawColumns(['id', 'txaction', 'user_shop_id']) - ->make(true); - } - - - -} \ No newline at end of file diff --git a/app/Http/Controllers/UserDataController.php b/app/Http/Controllers/UserDataController.php index 7202124..4f93644 100755 --- a/app/Http/Controllers/UserDataController.php +++ b/app/Http/Controllers/UserDataController.php @@ -39,6 +39,15 @@ class UserDataController extends Controller /*if(!$user->account){ $user->account = new UserAccount(); }*/ + $data = Request::all(); + if(isset($data['action']) && $data['action'] == "reverse_charge_validate"){ + return $this->userRepo->reverse_charge_validate($data, $user, route('user_edit', [$user->id])); + } + + if(isset($data['action']) && $data['action'] == "reverse_charge_delete"){ + return $this->userRepo->reverse_charge_delete($data, $user, route('user_edit', [$user->id])); + } + $rules = array( 'salutation' => 'required', 'first_name'=>'required', @@ -50,9 +59,6 @@ class UserDataController extends Controller 'mobil' => 'required_without:phone', 'tax_number' => 'required_without:tax_identification_number', 'tax_identification_number' => 'required_without:tax_number', - 'birthday_day' => 'required', - 'birthday_month' => 'required', - 'birthday_year' => 'required', 'country_id' => 'required|integer|min:1', 'email' => 'required|string|email|max:255|exists:users,email', 'email-confirm' => 'required|same:email', @@ -79,7 +85,7 @@ class UserDataController extends Controller } else { $this->userRepo->update(Request::all()); \Session()->flash('alert-save', true); - return redirect('/user/edit'); + return redirect(route('user_edit', [$user->id])); } } diff --git a/app/Http/Controllers/UserShopController.php b/app/Http/Controllers/UserShopController.php index 569ee04..de0fbcd 100755 --- a/app/Http/Controllers/UserShopController.php +++ b/app/Http/Controllers/UserShopController.php @@ -343,8 +343,10 @@ class UserShopController extends Controller public function userShopRegisterSubDomain($slug){ + return ['success' => false, 'error' => 'no KAS']; + /* $kas = new KasController(); - $domain = 'mivita.care'; + $domain = 'HIER DIE DOMAIN'; //check if exisist @@ -360,7 +362,7 @@ class UserShopController extends Controller $pra = array( 'subdomain_name' => $slug, 'domain_name' => $domain, - 'subdomain_path' => '/mein.mivita.care/public/', + 'subdomain_path' => '/hier der Ordner /public/', 'php_version' => '7.3', //'ssl_proxy' => 'Y', //'redirect_status' => 0 @@ -370,6 +372,7 @@ class UserShopController extends Controller return ['success' => true]; } return ['success' => false, 'error' => $add_subdomain]; + */ } /** diff --git a/app/Http/Controllers/Web/PromotionController.php b/app/Http/Controllers/Web/PromotionController.php index 36efea9..2c69a34 100644 --- a/app/Http/Controllers/Web/PromotionController.php +++ b/app/Http/Controllers/Web/PromotionController.php @@ -15,7 +15,7 @@ use App\Models\PaymentMethod; use App\Models\PromotionUser; use App\Models\ShoppingOrder; use App\Models\ShoppingPayment; -use App\Services\PromotionCart; +use App\Services\UserCart; use App\Models\PaymentTransaction; use App\Http\Controllers\Controller; use App\Repositories\CheckoutRepository; @@ -37,13 +37,16 @@ class PromotionController extends Controller } if($path === 'impressum'){ - return view('web.promotion.impressum'); + return view('web.legal.impressum'); } if($path === 'datenschutzerklaerung'){ - return view('web.promotion.datenschutzerklaerung'); + return view('web.legal.datenschutzerklaerung'); } if($path === 'widerrufsbelehrung'){ - return view('web.promotion.widerrufsbelehrung'); + return view('web.legal.widerrufsbelehrung'); + } + if($path === 'versandarten'){ + return view('web.legal.versandarten'); } //search for promo $PromotionUser = PromotionUser::where('url', trim($path))->whereNull('user_deleted_at')->first(); @@ -56,17 +59,23 @@ class PromotionController extends Controller ]; return view('web.promotion.outofstock', $data); } - PromotionCart::initYard(); + UserCart::initYard('prom', null, $PromotionUser); - $first_category = Category::where('active', true)->whereJsonContains('show_on', ['3'])->orderBy('pos', 'DESC')->first(); - $first_category_id = isset($first_category->id) ? $first_category->id : false; - $shop_products = $this->getShowProducts(); + $first_category_id = false; + if(Request::get('catid')){ + $first_category_id = Request::get('catid'); + } + + //$first_category = Category::where('active', true)->whereJsonContains('show_on', ['3'])->orderBy('pos', 'DESC')->first(); + //$first_category_id = isset($first_category->id) ? $first_category->id : false; + $shop_products = $this->getShowProducts($first_category_id); $data = [ 'promotion_user' => $PromotionUser, 'shop_products' => $shop_products, 'user_payment_methods' => PaymentMethod::getDefaultAsArray()->toArray(), 'first_category_id' => $first_category_id, + 'categories_by_show_on' => '3' ]; return view('web.promotion.index', $data); } @@ -230,38 +239,38 @@ class PromotionController extends Controller return response()->json(['response' => $data, 'shop_products_view'=>$shop_products_view, 'status'=>$status]); } if($data['action'] === 'switch-free-product'){ - \App\Services\PromotionCart::updateFeeProduct($data); + \App\Services\UserCart::updateFeeProduct($data); } if($data['action'] === 'add-shop-product'){ - $data['qty'] = \App\Services\PromotionCart::updateProduct($data, true); + $data['qty'] = \App\Services\UserCart::updateProduct($data, true); } if($data['action'] === 'update-shop-product'){ - $data['qty'] = \App\Services\PromotionCart::updateProduct($data); + $data['qty'] = \App\Services\UserCart::updateProduct($data); } if($data['action'] === 'remove-shop-product'){ - \App\Services\PromotionCart::updateProduct($data); + \App\Services\UserCart::updateProduct($data); $data['qty'] = 0; } if($data['action'] === 'clear-cart'){ - \App\Services\PromotionCart::clearCart($data); + \App\Services\UserCart::clearCart($data); } if($data['action'] === 'switch-shipping'){ - \App\Services\PromotionCart::switchShipping($data); + \App\Services\UserCart::switchShipping($data); } if($data['action'] === 'change-state-shipping'){ - \App\Services\PromotionCart::changeStateShipping($data); + \App\Services\UserCart::changeStateShipping($data, 'prom'); } $cart = view("web.promotion._promotion_cart", compact('data'))->render(); if(Yard::instance('shopping')->isQuickShipping()){ - $invoice = view("web.promotion._invoice_details_quick")->render(); + $invoice = view("web.components._invoice_details_quick")->render(); }else{ - $invoice = view("web.promotion._invoice_details")->render(); + $invoice = view("web.components._invoice_details")->render(); } - $checkout = view("web.promotion._checkout")->render(); - $data['shipping_price_formated'] = PromotionCart::getCurrentShippingPrice(); + $checkout = view("web.components._checkout")->render(); + $data['shipping_price_formated'] = UserCart::getCurrentShippingPrice(2); //shipping_for === 2 promotion , 3 shop - return response()->json(['response' => $data, 'cart'=>$cart, 'invoice'=>$invoice, 'checkout'=>$checkout, 'status'=>$status]); + return response()->json(['response' => $data, 'cart'=>$cart, 'invoice'=>$invoice, 'checkout'=>$checkout, 'status'=>$status, 'basketqty'=>Yard::instance('shopping')->count()]); } return response()->json(['response' => $data, 'html'=>$ret, 'status'=>$status]); } diff --git a/app/Http/Controllers/Web/RegisterController.php b/app/Http/Controllers/Web/RegisterController.php index cf950b4..bb9118c 100755 --- a/app/Http/Controllers/Web/RegisterController.php +++ b/app/Http/Controllers/Web/RegisterController.php @@ -3,19 +3,21 @@ namespace App\Http\Controllers\Web; -use App\Http\Controllers\Controller; -use App\Mail\MailContact; -use App\Mail\MailVerifyAccount; -use App\Models\UserHistory; -use App\Repositories\UserRepository; -use App\Services\SysLog; -use App\Services\UserService; -use App\User; -use GuzzleHttp\Client; use Request; -use Illuminate\Support\Facades\Mail; -use App\Services\Util; +use App\User; use Validator; +use App\Services\Util; +use GuzzleHttp\Client; +use App\Services\SysLog; +use App\Mail\MailContact; +use App\Models\UserHistory; +use App\Models\UserRegister; +use App\Services\UserService; +use App\Mail\MailVerifyAccount; +use App\Http\Controllers\Controller; +use App\Repositories\UserRepository; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Mail; class RegisterController extends Controller @@ -34,71 +36,160 @@ class RegisterController extends Controller $this->userRepo = $userRepo; } - public function member($member_id = false) + public function showConsentPage() { + $data = [ + 'from_member_id' => session('from_member_id') + ]; + return view('auth.recaptcha-consent', $data); + } + + public function acceptConsent() + { + if (!Request::has('recaptcha_consent')) { + return back()->withErrors(['error' => 'Bitte stimmen Sie der Verwendung von reCAPTCHA zu']); + } + + session(['recaptcha_consent' => true]); + return redirect()->route('register.form'); + } + + public function showRegistrationForm() + { + if (!session('recaptcha_consent')) { + return redirect()->route('register.consent'); + } + $data = [ + 'from_member_id' => session('from_member_id') + ]; + return view('auth.register', $data); + } + + public function member($from_member_id = false) + { + $this->userRepo->clearUserRegister(); + + if(!$from_member_id){ + return redirect()->route('register.consent'); + } + + //ist ein gültiger Member ID und ist aktiv? + $user_id = (int) str_replace('gs', '', $from_member_id) - config('main.add_number_id'); + $user = User::find($user_id); + if(!$user || !$user->isActive() || !$user->isActiveAccount()){ + return redirect()->route('register.consent'); + } + session(['from_member_id' => $from_member_id]); + return redirect()->route('register.consent'); + + /* + //hat einen Member ID? if(!$member_id){ return redirect('/registrierung'); } + + //ist ein gültiger Member ID und ist aktiv? $user_id = (int) str_replace('gs', '', $member_id) - config('main.add_number_id'); $user = User::find($user_id); if(!$user || !$user->isActive() || !$user->isActiveAccount()){ return redirect('/registrierung'); } + + if (!session('recaptcha_consent')) { + $data = [ + 'from_member_id' => Request::get('from_member_id') + ]; + return view('auth.recaptcha-consent', $data); + + //return redirect()->route('register.consent')->with(['from_member_id' => $member_id]); + } + $data = [ 'from_member_id' => $member_id ]; return view('auth.register', $data); + */ } + public function register(){ - - + $this->userRepo->clearUserRegister(); + // Überprüfe zuerst die reCAPTCHA-Einwilligung + + /* if (!Request::has('recaptcha_consent')) { + return back()->withErrors(['recaptcha_consent' => 'Bitte stimmen Sie der Verwendung von reCAPTCHA zu'])->withInput(Request::all()); + }*/ + + // Überprüfe reCAPTCHA + $recaptchaResponse = Request::input('g-recaptcha-response'); + if (!$this->verifyRecaptcha($recaptchaResponse)) { + return back()->withErrors(['g-recaptcha-response' => 'Bitte bestätigen Sie, dass Sie kein Roboter sind'])->withInput(Request::all()); + } + $rules = array( 'salutation' => 'required', - 'first_name'=>'required', - 'last_name'=>'required', + 'first_name'=>'required|string|min:2', + 'last_name'=>'required|string|min:2', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:6|confirmed', 'password_confirmation' => 'required|string|min:6', 'accepted_data_protection' => 'required', + 'g-recaptcha-response' => 'required', ); - + $validator = Validator::make(Request::all(), $rules); if ($validator->fails()) { return back()->withErrors($validator)->withInput(Request::all()); } + //search in UserRegister $data = Request::all(); - $user = $this->userRepo->create($data); - $confirmation_code = UserService::createConfirmationCode(); - - $user->lang = !empty(\App::getLocale()) ? \App::getLocale() : "de"; - $user->confirmation_code = $confirmation_code; - $user->confirmation_code_to = date('Y-m-d H:i:s', strtotime('+1 week')); - $user->confirmation_code_remider = 0; - if(isset($data['from_member_id'])){ - $user->m_sponsor = (int) str_replace('gs', '', $data['from_member_id']) - config('main.add_number_id'); + $UserRegister = UserRegister::where('identifier', $data['email'])->first(); + if($UserRegister){ + $exists = [ + 'register_email' => $data['email'] + ]; + return view('auth.existing', $exists); } - $user->save(); - - $user = User::find($user->id); + $userObj = $this->userRepo->createUserRegister($data); + $from_member_id = session('from_member_id'); + $user_id = isset($from_member_id) ? (int) str_replace('gs', '', $from_member_id) - config('main.add_number_id') : config('app.main_user_id'); // Krummel try { - Mail::to($user->email)->bcc(config('app.info_mail'))->send(new MailVerifyAccount($confirmation_code, $user)); + Mail::to($userObj->email)->bcc(config('app.info_mail'))->send(new MailVerifyAccount($userObj->confirmation_code, $userObj)); } catch(\Exception $e){ SysLog::action('register-user', 'auth_register', 5) - ->setUserId($user->id) - ->setModel($user->id, User::class) + ->setUserId($user_id) + ->setModel(null, UserRegister::class) ->setMessage('Error send register E-Mail: '.$e->getMessage()) ->save(); } - UserHistory::create(['user_id' => $user->id, 'action'=>'register', 'status'=>0]); + UserHistory::create(['user_id' => $user_id, 'action'=>'register', 'status'=>0]); return redirect('/user_register/finish'); } + // Neue Methode zur Überprüfung des reCAPTCHA + private function verifyRecaptcha($recaptchaResponse) + { + if (empty($recaptchaResponse)) { + return false; + } + + $client = new Client(); + $response = $client->post('https://www.google.com/recaptcha/api/siteverify', [ + 'form_params' => [ + 'secret' => config('services.recaptcha.secret_key'), + 'response' => $recaptchaResponse + ] + ]); + + $body = json_decode((string)$response->getBody()); + return $body->success; + } + public function finish() { $data = [ @@ -106,4 +197,40 @@ class RegisterController extends Controller ]; return view('auth.finish', $data); } + + public function verify($confirmation_code){ + + if( ! $confirmation_code) + { + return redirect('/status/error'); + } + + $UserRegister = UserRegister::where ('instance', $confirmation_code)->first(); + + if ( ! $UserRegister) + { + return redirect('/status/not/found'); + } + + $user = $this->userRepo->create($UserRegister); + + //Login! + Auth::login($user); + + return redirect('/home'); + } + + public function registerAgain(){ + $data = Request::all(); + if(!isset($data['register_email'])){ + abort(403, "No E-Mail"); + } + $UserRegister = UserRegister::where('identifier', $data['register_email'])->first(); + if(!$UserRegister){ + abort(403, "No E-Mail Register"); + } + Mail::to($UserRegister->identifier)->bcc(config('app.info_mail'))->send(new MailVerifyAccount($UserRegister->instance, $UserRegister->content)); + return redirect('/user_register/finish'); + + } } \ No newline at end of file diff --git a/app/Http/Controllers/Web/ShopController.php b/app/Http/Controllers/Web/ShopController.php new file mode 100644 index 0000000..8f545ed --- /dev/null +++ b/app/Http/Controllers/Web/ShopController.php @@ -0,0 +1,294 @@ +first(); + if(!$userShop){ + //redirect !!!! + abort(402); + } + if(!$userShop->isActive()){ + $data = [ + 'user_shop' => $userShop, + ]; + //redirect !!!! + return view('web.shop.outofstock', $data); + } + UserCart::initYard('shop', $userShop, null); + $first_category_id = false; + if(Request::get('catid')){ + $first_category_id = Request::get('catid'); + } + + $userMargin = \App\Services\Shop::calculateUserShopMargins($userShop, null); + + //$first_category = Category::where('active', true)->whereJsonContains('show_on', ['8'])->orderBy('pos', 'DESC')->first(); + // $first_category_id = isset($first_category->id) ? $first_category->id : false; + $shop_products = $this->getShowProducts($first_category_id); + + $data = [ + 'user_shop' => $userShop, + 'shop_products' => $shop_products, + 'user_payment_methods' => PaymentMethod::getDefaultAsArray()->toArray(), + 'first_category_id' => $first_category_id, + 'categories_by_show_on' => '8', + 'userMargin' => $userMargin + ]; + return view('web.shop.index', $data); + } + + public function goto($load, $user_shop_id, $transactionId=false, $reference=false, $identifier=false){ + $userShop = UserShop::findOrFail($user_shop_id); + $data = [ + 'user_shop' => $userShop, + ]; + + if($load === 'thanksreminder'){ + return view('web.shop.thanksreminder', $data); + } + if($load === 'notactive'){ + return view('web.shop.notactive', $data); + } + if($load === 'thanksorder'){ + $payt = PaymentTransaction::findOrFail($transactionId); + if($payt->shopping_payment->reference != $reference){ + abort(404); + } + Yard::instance('shopping')->destroy(); + $checkRepo = new CheckoutRepository(); + $checkRepo->destroy(); + if(($payt->status === 'fnc' || $payt->status === 'vor' || $payt->status === 'pp' || $payt->status === 'non') && $payt->txaction === 'prev'){ + $this->directPaymentStatus($payt, $identifier); + } + $data = [ + 'user_shop' => $userShop, + 'order_reference' => $payt->shopping_payment->reference, + 'pay_trans' => $payt, + ]; + return view('web.shop.thanksorder', $data); + } + + } + public function store($user_shop_id){ + + $userShop = UserShop::findOrFail($user_shop_id); + $data = Request::all(); + if(!isset($data['action'])){ + abort(402); + } + + if($data['action'] === 'submit-reminder-service'){ + return redirect(route('web_shop_goto', ['thanksreminder', $userShop->id])); + } + if($data['action'] === 'submit-order'){ + $rules = array( + 'billing_firstname'=>'required', + 'billing_lastname'=>'required', + 'billing_address'=>'required', + 'billing_zipcode'=>'required', + 'billing_city' => 'required', + 'billing_state' => 'required', + 'billing_email'=>'required|email', + ); + + if(Request::get('same_as_billing')){ + $rules = array_merge($rules, [ + 'shipping_firstname'=>'required', + 'shipping_lastname'=>'required', + 'shipping_address'=>'required', + 'shipping_zipcode'=>'required', + 'shipping_city' => 'required', + 'shipping_salutation' => 'required' + ]); + } + $validator = Validator::make(Request::all(), $rules); + + if ($validator->fails()) { + return back()->withErrors($validator)->withInput(Request::all()); + } + $identifier = Util::getToken(); + $data['is_from'] = 'shopping'; + $data['is_for'] = 'us'; //usershopping + unset($data['_token']); + Yard::instance('shopping')->putYardExtra('shopping_data', $data); + + UserHistory::create(['user_id' => $userShop->user_id, 'action'=>'web_shop_payment', 'status'=>1, 'product_id'=>null, 'identifier'=>$identifier]); + $checkRepo = new CheckoutRepository(); + $checkRepo->setUserShop(8, $userShop); + $checkRepo->init($identifier, $data); + return $checkRepo->makePayment(); + } + } + + private function directPaymentStatus(PaymentTransaction $payt, $identifier){ + + if(isset($payt->transmitted_data['param'])){ + $shopping_order = ShoppingOrder::find($payt->transmitted_data['param']); + $shopping_payment = ShoppingPayment::where('reference', $payt->transmitted_data['reference'])->first(); + + $shopping_order->txaction = 'open'; + $shopping_order->save(); + $payt->txaction = "open"; + + //is Promotion Handel it + if($shopping_order->promotion_user_id > 0){ + Payment::handelPromotionProduct($shopping_order); + } + if($shopping_payment){ + //Payment::handelUserPayCredits($shopping_order, 'deduction'); + if($payt->status === 'vor'){ + $shopping_payment->txaction = 'open'; + $shopping_order->txaction = 'open'; + $payt->txaction = "open"; + $shopping_order->save(); + + } + if($payt->status === 'pp'){ + $send_link = Payment::paymentStatusPaidAction($shopping_order, true); + $shopping_payment->txaction = 'paid'; + $shopping_order->txaction = 'paid'; + $payt->txaction = "paid"; + $shopping_order->save(); + } + if($payt->status === 'fnc'){ + $send_link = Payment::paymentStatusPaidAction($shopping_order, true); + $shopping_payment->txaction = 'paid'; + $shopping_order->txaction = 'paid'; + $payt->txaction = "paid"; + $shopping_order->save(); + + } + if($payt->status === 'non'){ + $send_link = Payment::paymentStatusPaidAction($shopping_order, true); + $shopping_payment->txaction = 'paid'; + $shopping_order->txaction = 'paid'; + $payt->txaction = "paid"; + $shopping_order->save(); + \App\Services\Shop::newUserOrder($shopping_order->shopping_user->number); + } + $shopping_payment->save(); + } + $payt->save(); + $data = [ + 'mode' => $payt->transmitted_data['mode'], + 'txaction' => $payt->txaction, + 'send_link' => false, + ]; + Payment::paymentStatusSendMail($shopping_order, $shopping_payment, $data); + } + } + + public function load(){ + $data = Request::all(); + $ret = ""; + $status = false; + + if(Request::ajax()){ + if($data['action'] === 'web-show-product'){ + $product = Product::find($data['id']); //current user form order + $ret = view("web.shop.show_product", compact('product', 'data'))->render(); + } + if(isset($data['perform'])){ + if($data['action'] === 'switch-show_products'){ + $category_id = isset($data['show_products_option']) ? $data['show_products_option'] : false; + $shop_products = $this->getShowProducts($category_id); + $shop_products_view = view("web.shop._shop_products_inner", compact('shop_products'))->render(); + return response()->json(['response' => $data, 'shop_products_view'=>$shop_products_view, 'status'=>$status]); + } + if($data['action'] === 'add-shop-product'){ + $data['qty'] = \App\Services\UserCart::updateProduct($data, true); + } + if($data['action'] === 'minus-shop-product'){ + $data['qty'] = \App\Services\UserCart::updateProduct($data, false, true); + } + if($data['action'] === 'update-shop-product'){ + $data['qty'] = \App\Services\UserCart::updateProduct($data); + } + if($data['action'] === 'remove-shop-product'){ + \App\Services\UserCart::updateProduct($data); + $data['qty'] = 0; + } + if($data['action'] === 'clear-cart'){ + \App\Services\UserCart::clearCart($data); + } + if($data['action'] === 'switch-shipping'){ + \App\Services\UserCart::switchShipping($data); + } + if($data['action'] === 'change-state-shipping'){ + \App\Services\UserCart::changeStateShipping($data, 'shop'); + } + + $cart = view("web.shop._shop_cart", compact('data'))->render(); + if(Yard::instance('shopping')->isQuickShipping()){ + $invoice = view("web.components._invoice_details_quick")->render(); + }else{ + $invoice = view("web.components._invoice_details")->render(); + } + $checkout = view("web.components._checkout")->render(); + $data['shipping_price_formated'] = UserCart::getCurrentShippingPrice(3); //shipping_for === 2 promotion , 3 shop + + return response()->json(['response' => $data, 'cart'=>$cart, 'invoice'=>$invoice, 'checkout'=>$checkout, 'status'=>$status, 'basketqty'=>Yard::instance('shopping')->count()]); + } + return response()->json(['response' => $data, 'html'=>$ret, 'status'=>$status]); + } + } + + private function getShowProducts($category_id = false){ + $shop_products = []; + if($category_id){ + $shop_products = Product::where('active', true)->whereJsonContains('show_on', ['8']) + ->whereHas('categories', function ($query) use ($category_id) { + $query->where('category_id', $category_id); //->whereJsonContains('show_on', ['3']); + })->orderBy('pos', 'ASC')->get(); + }else{ + $shop_products = Product::where('active', true)->whereJsonContains('show_on', ['8']) + ->orderBy('pos', 'ASC')->get(); + } + return $shop_products; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/WizardController.php b/app/Http/Controllers/WizardController.php index 435d020..e0b15aa 100755 --- a/app/Http/Controllers/WizardController.php +++ b/app/Http/Controllers/WizardController.php @@ -2,22 +2,23 @@ namespace App\Http\Controllers; -use App\Mail\MailReleaseAccount; -use App\Models\File; -use App\Models\Product; -use App\Models\ShoppingInstance; -use App\Models\UserAccount; -use App\Models\UserHistory; -use App\Models\UserLevel; -use App\Repositories\FileRepository; -use App\Services\Util; -use App\User; use Auth; use Hash; -use Illuminate\Support\Facades\Mail; -use Request; -use Validator; use Yard; +use Request; +use App\User; +use Validator; +use App\Models\File; +use App\Services\Util; +use App\Models\Product; +use App\Models\UserLevel; +use App\Models\UserAccount; +use App\Models\UserHistory; +use App\Mail\MailReleaseAccount; +use App\Models\ShoppingInstance; +use App\Repositories\FileRepository; +use App\Repositories\UserRepository; +use Illuminate\Support\Facades\Mail; class WizardController extends Controller { @@ -149,7 +150,13 @@ class WizardController extends Controller if (!$user->account) { $user->account = new UserAccount(); } - + + $data = Request::all(); + if($step == 7 && Request::get('user_country_id')){ + $user->account->country_id = Request::get('user_country_id'); + $user->account->save(); + return redirect(route('wizard_register', [1])); + } if ($step == 0) { $rules = array( 'accepted_data_protection' => 'required', @@ -185,7 +192,23 @@ class WizardController extends Controller $user->save(); return redirect(route('wizard_register')); } + if ($step == 1) { + $data = Request::all(); + if(isset($data['action']) && $data['action'] == "reverse_charge_validate"){ + $user->wizard = 1; + $user->save(); + $userRepo = new UserRepository($user); + return $userRepo->reverse_charge_validate($data, $user, route('wizard_register', [1])); + } + + if(isset($data['action']) && $data['action'] == "reverse_charge_delete"){ + $user->wizard = 1; + $user->save(); + $userRepo = new UserRepository($user); + return $userRepo->reverse_charge_delete($data, $user, route('wizard_register', [1])); + } + $rules = array( 'salutation' => 'required', 'first_name' => 'required', @@ -198,9 +221,6 @@ class WizardController extends Controller 'tax_number' => 'required_without:tax_identification_number', 'tax_identification_number' => 'required_without:tax_number', 'country_id' => 'required|integer|min:1', - 'birthday_day' => 'required', - 'birthday_month' => 'required', - 'birthday_year' => 'required' ); if (!Request::get('same_as_billing')) { @@ -220,19 +240,26 @@ class WizardController extends Controller $user->save(); return redirect(route('wizard_register', [1]))->withErrors($validator)->withInput(Request::all()); } + $data = Request::all(); $data['same_as_billing'] = Request::get('same_as_billing') == NULL ? 0 : 1; $data['birthday_day'] = isset($data['birthday_day']) ? $data['birthday_day'] : 1; $data['birthday_month'] = isset($data['birthday_month']) ? $data['birthday_month'] : 1; - $data['birthday_year'] = isset($data['birthday_year']) ? $data['birthday_year'] : 1970; - $data['birthday'] = $data['birthday_day'].".".$data['birthday_month'].".".$data['birthday_year']; + $data['birthday_year'] = isset($data['birthday_year']) ? $data['birthday_year'] : 1900; + $data['birthday'] = $data['birthday_day'].".".$data['birthday_month'].".".$data['birthday_year']; + $data['birthday'] = $data['birthday'] == "1.1.1900" ? null : $data['birthday']; $user->account->fill($data)->save(); $user->wizard = 2; $user->save(); return redirect(route('wizard_register')); } - - if ($step == 2) { + /* if ($step == 2) { + //kein Ausweis hochladen - deaktiviert + dd("deaktiviert"); + $user->wizard = 3; + $user->save(); + return redirect(route('wizard_register')); + /* if(Request::get('submit') === 'do'){ if(File::whereUserId($user->id)->whereIdentifier('id_card')->count() == 0){ $validator = Validator::make(Request::all(), []); @@ -251,8 +278,10 @@ class WizardController extends Controller $this->fileRepo->_set('identifier', 'id_card'); return $this->fileRepo->uploadFile(Request::all()); } + */ - if ($step == 3) { + if ($step == 2) { + $data = Request::all(); if(Request::get('submit') === 'do'){ $data = Request::all(); @@ -260,7 +289,7 @@ class WizardController extends Controller if(File::whereUserId($user->id)->whereIdentifier('business_license')->count() == 0){ $validator = Validator::make(Request::all(), []); $validator->errors()->add('field', __('Kein Gewerbeschein hinterlegt, bitte erst hochladen.')); - $user->wizard = 3; + $user->wizard = 2; $user->save(); return redirect(route('wizard_register'))->withErrors($validator)->withInput(Request::all()); } @@ -272,7 +301,7 @@ class WizardController extends Controller if(!$data['non_business_license_reason'] || $data['non_business_license_reason'] == ""){ $validator = Validator::make(Request::all(), []); $validator->errors()->add('field', __('Bitte gib eine Begründung ein, warum Du keinen Gewerbeschein benötigst.')); - $user->wizard = 3; + $user->wizard = 2; $user->save(); return redirect(route('wizard_register'))->withErrors($validator)->withInput(Request::all()); }else{ @@ -281,7 +310,7 @@ class WizardController extends Controller } $user->account->setNotice('business_license', $data['business_license_choose']); - $user->wizard = 4; + $user->wizard = 3; $user->save(); return redirect(route('wizard_register')); @@ -293,7 +322,7 @@ class WizardController extends Controller return $this->fileRepo->uploadFile(Request::all()); } - if ($step == 4) { + if ($step == 3) { $data = Request::all(); @@ -397,6 +426,23 @@ class WizardController extends Controller return redirect(route('wizard_create', [12])); } if($step == 12){ + + $data = Request::all(); + + if(isset($data['action']) && $data['action'] == "reverse_charge_validate"){ + $user->wizard = 12; + $user->save(); + $userRepo = new UserRepository($user); + return $userRepo->reverse_charge_validate($data, $user, route('wizard_create', [12])); + } + + if(isset($data['action']) && $data['action'] == "reverse_charge_delete"){ + $user->wizard = 12; + $user->save(); + $userRepo = new UserRepository($user); + return $userRepo->reverse_charge_delete($data, $user, route('wizard_create', [12])); + } + $rules = array( 'salutation' => 'required', 'first_name' => 'required', @@ -409,9 +455,6 @@ class WizardController extends Controller 'tax_number' => 'required_without:tax_identification_number', 'tax_identification_number' => 'required_without:tax_number', 'country_id' => 'required|integer|min:1', - 'birthday_day' => 'required', - 'birthday_month' => 'required', - 'birthday_year' => 'required' ); if(!Request::get('same_as_billing')){ @@ -464,6 +507,15 @@ class WizardController extends Controller if($product->images->count()){ $image = $product->images->first()->slug; } + /*need setGlobalTaxRate + $cartItem = Yard::instance('shopping')->add($product->id, $product->getLang('name'), 1, $product->getPriceWith(\App\Services\UserService::getTaxFree(), false, \App\Services\UserService::$user_country), false, false, ['image' => $image, 'slug' => $product->slug, 'weight' => $product->weight, 'points' => $product->points, 'no_commission' => $product->no_commission]); + if(\App\Services\UserService::getTaxFree()){ + Yard::setTax($cartItem->rowId, 0); + }else{ + Yard::setTax($cartItem->rowId, $product->getTaxWith(\App\Services\UserService::$user_country)); + } + */ + //Keine steuer Yard::instance('shopping')->add($product->id, $product->getLang('name'), 1, $product->price, $product->tax, ['image' => $image, 'slug' => $product->slug, 'weight' => $product->weight]); Yard::instance('shopping')->setGlobalTaxRate(0); @@ -475,6 +527,18 @@ class WizardController extends Controller if($product_on_board->images->count()){ $image = $product_on_board->images->first()->slug; } + + /* + need? + $cartItem = Yard::instance('shopping')->add($product_on_board->id, $product_on_board->getLang('name'), 1, + $product_on_board->getPriceWith(\App\Services\UserService::getTaxFree(), false, \App\Services\UserService::$user_country), + false, false, ['image' => $image, 'slug' => $product_on_board->slug, 'weight' => $product_on_board->weight, 'points' => $product_on_board->points, 'no_commission' => $product_on_board->no_commission]); + if(\App\Services\UserService::getTaxFree()){ + Yard::setTax($cartItem->rowId, 0); + }else{ + Yard::setTax($cartItem->rowId, $product->getTaxWith(\App\Services\UserService::$user_country)); + } + */ Yard::instance('shopping')->add($product_on_board->id, $product_on_board->getLang('name'), 1, $product_on_board->price, $product->tax, ['image' => $image, 'slug' => $product_on_board->slug, 'weight' => $product_on_board->weight]); } } @@ -522,10 +586,16 @@ class WizardController extends Controller if($relation === 'upload'){ $user = User::findOrFail(Auth::user()->id); $file = $user->files()->findOrFail($id); + $identifier = $file->identifier; //remove file \Storage::disk('user')->delete($file->dir.$file->filename); $file->delete(); \Session()->flash('alert-success', "Datei gelöscht"); + if($identifier === 'business_license'){ + $user->wizard = 2; + $user->save(); + return redirect(route('wizard_register', [2])); + } } return back(); } diff --git a/app/Libraries/InvoicePDF.php b/app/Libraries/InvoicePDF.php new file mode 100644 index 0000000..45b5a13 --- /dev/null +++ b/app/Libraries/InvoicePDF.php @@ -0,0 +1,46 @@ +view = $view; + } + + public function create($data, $name='test.pdf', $output='stream', $path = false){ + + header('Content-type: text/html; charset=UTF-8') ;//chrome + //dd($data); + + $pdf = app('dompdf.wrapper'); + $pdf->getDomPDF(); + $pdf->set_option("enable_php", true); + $pdf->loadView($this->view, $data); + $pdf->setPaper('A4', 'portrait'); + + if($output === 'stream'){ + return $pdf->stream($name); + } + if($output === 'download'){ + return $pdf->download($name); + } + + if($output === 'save'){ + if($path){ + $pdf->save($path.$name); + return $path.$name; + } + } + } + +} +?> diff --git a/app/Mail/MailCheckout.php b/app/Mail/MailCheckout.php index f726b3a..c983e72 100644 --- a/app/Mail/MailCheckout.php +++ b/app/Mail/MailCheckout.php @@ -67,8 +67,8 @@ class MailCheckout extends Mailable 'greetings' => __('email.greetings'), 'sender' => __('email.sender'), 'send_link' => $this->send_link, - 'url' => Util::getMyMivitaUrl(), - 'button' => Util::getMyMivitaUrl(false), + 'url' => Util::getMyUrl(), + 'button' => Util::getMyUrl(false), 'mode' => $this->mode ]); }else{ diff --git a/app/Mail/MailLog.php b/app/Mail/MailLog.php new file mode 100644 index 0000000..e31a92e --- /dev/null +++ b/app/Mail/MailLog.php @@ -0,0 +1,63 @@ +channel = $channel; + $this->context = $context; + $this->message = $message; + $this->data = $data; + $this->subject = 'mivita Log'; + + } + + + public function build() + { + $title = 'Log: '.$this->channel.' '.$this->context; + + //make Data readable + $this->data = json_encode($this->data, JSON_PRETTY_PRINT); + $content = ""; + + + $content .= "\n"; + $content .= "Channel: ".$this->channel."\n"; + $content .= "Context: ".$this->context."\n"; + if(\Auth::check()){ + $content .= "From User: ".\Auth::user()->id." | ".\Auth::user()->email."\n"; + } + $content .= "\n"; + $content .= "Message: ".$this->message."\n"; + $content .= "\n"; + $content .= "Data: ".$this->data."\n"; + $content .= "\n"; + $content .= "\n"; + $content .= "Time: ".now()->format("d.m.Y H:i"); + $content .= "\n"; + $content .= request()->header('User-Agent'); + + + return $this->view('emails.sys')->with([ + 'title' => $title, + 'content' => $content, + ]); + } +} \ No newline at end of file diff --git a/app/Mail/MailVerifyAccount.php b/app/Mail/MailVerifyAccount.php index 1204615..daf3639 100644 --- a/app/Mail/MailVerifyAccount.php +++ b/app/Mail/MailVerifyAccount.php @@ -12,14 +12,14 @@ class MailVerifyAccount extends Mailable use Queueable, SerializesModels; protected $confirmation_code; - protected $user; + protected $userObj; public $subject; - public function __construct($confirmation_code, User $user) + public function __construct($confirmation_code, $userObj) { $this->confirmation_code = $confirmation_code; - $this->user = $user; + $this->userObj = $userObj; $this->subject = __('email.email_verify'); } @@ -27,11 +27,11 @@ class MailVerifyAccount extends Mailable public function build() { $salutation = __('email.salutation').","; - if($this->user->account){ - if($this->user->account->salutation === "mr"){ - $salutation = __('email.dear_sir')." ".$this->user->account->first_name.","; + if($this->userObj){ + if($this->userObj->salutation === "mr"){ + $salutation = __('email.dear_sir')." ".$this->userObj->first_name.","; }else{ - $salutation = __('email.dear_mrs')." ".$this->user->account->first_name.","; + $salutation = __('email.dear_mrs')." ".$this->userObj->first_name.","; } } return $this->view('emails.auth')->with([ diff --git a/app/Models/Attribute.php b/app/Models/Attribute.php index 9237561..5613e44 100644 --- a/app/Models/Attribute.php +++ b/app/Models/Attribute.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Services\Util; use Illuminate\Database\Eloquent\Model; /** @@ -25,39 +26,66 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Attribute wherePos($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Attribute whereTransName($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Attribute whereUpdatedAt($value) - * @mixin \Eloquent * @property string|null $slug * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Attribute whereSlug($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Attribute newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Attribute newQuery() * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Attribute query() * @property-read int|null $childrens_count + * @property int $attribute_type_id + * @property string|null $value + * @property-read \App\Models\AttributeType $attribute_type + * @method static \Illuminate\Database\Eloquent\Builder|Attribute whereAttributeTypeId($value) + * @method static \Illuminate\Database\Eloquent\Builder|Attribute whereValue($value) + * @mixin \Eloquent */ class Attribute extends Model { protected $table = 'attributes'; - protected $casts = ['trans_name' => 'array']; - - protected $fillable = [ - 'parent_id', 'name', 'pos', 'active', + protected $casts = [ + 'parent_id' => 'int', + 'pos' => 'int', + 'active' => 'bool', + 'trans_name' => 'array', ]; + protected $fillable = [ + 'parent_id', + 'attribute_type_id', + 'name', + 'value', + 'trans_name', + 'pos', + 'active', + 'slug' + ]; + + public function attribute_type() + { + return $this->belongsTo(AttributeType::class, 'attribute_type_id'); + } + public function parent() { - return $this->belongsTo('App\Models\Attribute', 'parent_id'); + return $this->belongsTo(Attribute::class, 'parent_id'); } public function childrens() { - return $this->hasMany('App\Models\Attribute', 'parent_id', 'id'); + return $this->hasMany(Attribute::class, 'parent_id', 'id'); } public function setPosAttribute($value){ $this->attributes['pos'] = is_numeric($value) ? $value : null; - } + + public function getFormattedValue() + { + // return isset($this->attributes['value']) ? Util::formatNumber($this->attributes['value']) : ""; + } + public function getLang($key) { $lang = \App::getLocale(); diff --git a/app/Models/AttributeType.php b/app/Models/AttributeType.php new file mode 100644 index 0000000..b17beba --- /dev/null +++ b/app/Models/AttributeType.php @@ -0,0 +1,111 @@ + $childrens + * @property-read int|null $childrens_count + * @property-read \App\Models\Attribute|null $parent + * @method static \Illuminate\Database\Eloquent\Builder|AttributeType newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|AttributeType newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|AttributeType query() + * @method static \Illuminate\Database\Eloquent\Builder|AttributeType whereActive($value) + * @method static \Illuminate\Database\Eloquent\Builder|AttributeType whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|AttributeType whereDescription($value) + * @method static \Illuminate\Database\Eloquent\Builder|AttributeType whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|AttributeType whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|AttributeType whereParentId($value) + * @method static \Illuminate\Database\Eloquent\Builder|AttributeType wherePos($value) + * @method static \Illuminate\Database\Eloquent\Builder|AttributeType whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|AttributeType whereTransName($value) + * @method static \Illuminate\Database\Eloquent\Builder|AttributeType whereUpdatedAt($value) + * @mixin \Eloquent + */ +class AttributeType extends Model +{ + protected $table = 'attribute_types'; + + protected $casts = [ + 'parent_id' => 'int', + 'pos' => 'int', + 'active' => 'bool', + 'trans_name' => 'array' + ]; + + protected $fillable = [ + 'parent_id', + 'name', + 'description', + 'trans_name', + 'pos', + 'active', + 'slug' + ]; + + public function parent() + { + return $this->belongsTo(Attribute::class, 'parent_id'); + } + + public function childrens() + { + return $this->hasMany(Attribute::class, 'parent_id', 'id'); + } + + public function setPosAttribute($value){ + $this->attributes['pos'] = is_numeric($value) ? $value : null; + } + + public function getLang($key) + { + $lang = \App::getLocale(); + if ($lang == 'de') { + return $this->{$key}; + } + $trans = $this->getTrans($key, $lang); + if (!$trans || $trans == '') { + return $this->{$key}; + } + return $trans; + } + + public function getTrans($key, $lang) + { + $key = 'trans_' . $key; + if (!empty($this->{$key}[$lang])) { + return $this->{$key}[$lang]; + } + } + + public function getTranNames() + { + $ret = ""; + foreach ((array) $this->trans_name as $value){ + $ret .= $value.', '; + } + return rtrim($ret, ', '); + } +} diff --git a/app/Models/Category.php b/app/Models/Category.php index 2afc8b2..cce9c58 100644 --- a/app/Models/Category.php +++ b/app/Models/Category.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Services\Type; +use App\Models\Product; use Illuminate\Database\Eloquent\Model; use Cviebrock\EloquentSluggable\Sluggable; @@ -27,7 +28,6 @@ use Cviebrock\EloquentSluggable\Sluggable; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Category wherePos($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Category whereTransName($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Category whereUpdatedAt($value) - * @mixin \Eloquent * @property string|null $slug * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProductCategory[] $product_categories * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Category findSimilarSlugs($attribute, $config, $slug) @@ -47,6 +47,9 @@ use Cviebrock\EloquentSluggable\Sluggable; * @property-read \App\Models\IqImage|null $iq_image * @property-read int|null $product_categories_count * @method static \Illuminate\Database\Eloquent\Builder|Category withUniqueSlugConstraints(\Illuminate\Database\Eloquent\Model $model, string $attribute, array $config, string $slug) + * @property array|null $show_on + * @method static \Illuminate\Database\Eloquent\Builder|Category whereShowOn($value) + * @mixin \Eloquent */ class Category extends Model { @@ -60,7 +63,7 @@ class Category extends Model 'parent_id', 'name', 'headline', 'pos', 'active', 'show_on' ]; - public function sluggable() + public function sluggable(): array { return [ 'slug' => [ @@ -134,15 +137,21 @@ class Category extends Model return rtrim($ret, ', '); } - public function getShowOnTypes(){ + public function getShowOnTypes($seperator = false){ $ret = []; if($this->show_on && is_array($this->show_on)){ foreach($this->show_on as $show){ $ret[] = isset(Type::$showONs[$show]) ? Type::$showONs[$show] : '-'; } } - return $ret; + return $seperator ? implode($seperator, $ret) : $ret; + } + public function getProductsCountOn($show_on = ['8']){ + $category_id = $this->id; + return Product::where('active', true)->whereJsonContains('show_on', $show_on) + ->whereHas('categories', function ($query) use ($category_id) { + $query->where('category_id', $category_id); // + })->orderBy('pos', 'ASC')->count(); + } - - } diff --git a/app/Models/Country.php b/app/Models/Country.php index f398114..8fc2f44 100644 --- a/app/Models/Country.php +++ b/app/Models/Country.php @@ -26,7 +26,6 @@ use PHPUnit\Framework\Constraint\Count; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Country whereIt($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Country wherePhone($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Country whereRu($value) - * @mixin \Eloquent * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Country newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Country newQuery() * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Country query() @@ -57,6 +56,13 @@ use PHPUnit\Framework\Constraint\Count; * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\CountryPrice[] $country_prices * @property-read int|null $country_prices_count * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Country whereCurrencyUnit($value) + * @property bool|null $translate + * @property bool|null $eu_country + * @property bool|null $supply_country + * @method static \Illuminate\Database\Eloquent\Builder|Country whereEuCountry($value) + * @method static \Illuminate\Database\Eloquent\Builder|Country whereSupplyCountry($value) + * @method static \Illuminate\Database\Eloquent\Builder|Country whereTranslate($value) + * @mixin \Eloquent */ class Country extends Model { @@ -64,17 +70,19 @@ class Country extends Model protected $casts = [ 'switch' => 'bool', + 'translate' => 'bool', + 'supply_country' => 'bool', + 'eu_country' => 'bool', 'own_eur' => 'bool', 'currency' => 'bool', 'currency_calc' => 'bool', - 'trans_name' => 'array', 'attr' => 'array' ]; protected $fillable = [ 'code', 'phone', 'en', 'de', 'es', 'fr', 'it', 'ru', - 'switch', 'own_eur', 'currency', 'currency_unit', 'currency_calc', 'currency_faktor', - 'active', 'trans_name', 'attr', + 'supply_country', 'eu_country', 'switch', 'translate', 'own_eur', 'currency', 'currency_unit', 'currency_calc', 'currency_faktor', + 'active', 'attr', ]; public function country_prices() diff --git a/app/Models/CountryPrice.php b/app/Models/CountryPrice.php index 1354071..8439d7d 100644 --- a/app/Models/CountryPrice.php +++ b/app/Models/CountryPrice.php @@ -36,8 +36,8 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CountryPrice whereId($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CountryPrice whereProductId($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CountryPrice whereUpdatedAt($value) - * @mixin \Eloquent * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CountryPrice whereCCurrency($value) + * @mixin \Eloquent */ class CountryPrice extends Model { diff --git a/app/Models/IqImage.php b/app/Models/IqImage.php index ab1f097..59a4416 100644 --- a/app/Models/IqImage.php +++ b/app/Models/IqImage.php @@ -29,7 +29,6 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ProductImage whereProductId($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ProductImage whereSize($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ProductImage whereUpdatedAt($value) - * @mixin \Eloquent * @property string|null $slug * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ProductImage findSimilarSlugs($attribute, $config, $slug) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ProductImage whereSlug($value) @@ -39,6 +38,7 @@ use Illuminate\Database\Eloquent\Model; * @property int|null $pos * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\IqImage wherePos($value) * @method static \Illuminate\Database\Eloquent\Builder|IqImage withUniqueSlugConstraints(\Illuminate\Database\Eloquent\Model $model, string $attribute, array $config, string $slug) + * @mixin \Eloquent */ class IqImage extends Model { @@ -51,7 +51,7 @@ class IqImage extends Model 'filename', 'original_name', 'ext', 'mine', 'size' ]; - public function sluggable() + public function sluggable(): array { return [ 'slug' => [ diff --git a/app/Models/LeadType.php b/app/Models/LeadType.php new file mode 100644 index 0000000..3c60618 --- /dev/null +++ b/app/Models/LeadType.php @@ -0,0 +1,43 @@ + 'bool' + ]; + + protected $fillable = [ + 'name', + 'active' + ]; +} diff --git a/app/Models/PaymentMethod.php b/app/Models/PaymentMethod.php index eacaef1..93daf00 100644 --- a/app/Models/PaymentMethod.php +++ b/app/Models/PaymentMethod.php @@ -36,11 +36,11 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\PaymentMethod whereShort($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\PaymentMethod whereShowAt($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\PaymentMethod whereUpdatedAt($value) - * @mixin \Eloquent * @property string|null $max_price * @method static \Illuminate\Database\Eloquent\Builder|PaymentMethod whereMaxPrice($value) * @property array $show_on * @method static \Illuminate\Database\Eloquent\Builder|PaymentMethod whereShowOn($value) + * @mixin \Eloquent */ class PaymentMethod extends Model { @@ -71,14 +71,14 @@ class PaymentMethod extends Model return isset(Type::$payShowATs[$this->show_at]) ? Type::$payShowATs[$this->show_at] : '-'; } - public function getShowOnTypes(){ + public function getShowOnTypes($seperator = false){ $ret = []; if($this->show_on && is_array($this->show_on)){ foreach($this->show_on as $show){ $ret[] = isset(Type::$payShowONs[$show]) ? Type::$payShowONs[$show] : '-'; } } - return $ret; + return $seperator ? implode($seperator, $ret) : $ret; } public static function getDefaultAsArray($short=false){ @@ -105,6 +105,9 @@ class PaymentMethod extends Model $payment_method = PaymentMethod::whereShort($short)->first(); if($payment_method && $payment_method->active){ + if(!$user_payment_methods || !is_array($user_payment_methods)){ + abort(403, 'Fehler: Es sind keine Zahlungsmethoden hinterlegt'); + } if(in_array($payment_method->id, $user_payment_methods)){ if($total > 0 && $payment_method->max_price > 0){ if($payment_method->max_price >= $total){ diff --git a/app/Models/PaymentTransaction.php b/app/Models/PaymentTransaction.php index e0a0f87..67073ed 100644 --- a/app/Models/PaymentTransaction.php +++ b/app/Models/PaymentTransaction.php @@ -39,9 +39,9 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\PaymentTransaction whereTxid($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\PaymentTransaction whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\PaymentTransaction whereUserid($value) - * @mixin \Eloquent * @property string|null $mode * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\PaymentTransaction whereMode($value) + * @mixin \Eloquent */ class PaymentTransaction extends Model { diff --git a/app/Models/Product.php b/app/Models/Product.php index de08b3d..05cee86 100644 --- a/app/Models/Product.php +++ b/app/Models/Product.php @@ -72,7 +72,6 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereUsage($value) * @method static \Illuminate\Database\Query\Builder|\App\Models\Product withTrashed() * @method static \Illuminate\Database\Query\Builder|\App\Models\Product withoutTrashed() - * @mixin \Eloquent * @property string|null $slug * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product findSimilarSlugs($attribute, $config, $slug) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereSlug($value) @@ -130,6 +129,17 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property array|null $show_on * @method static \Illuminate\Database\Eloquent\Builder|Product whereShortCopy($value) * @method static \Illuminate\Database\Eloquent\Builder|Product whereShowOn($value) + * @property bool $exclude_stats_sales + * @property bool|null $whitelabel + * @property string|null $whitelabel_name + * @property-read \Illuminate\Database\Eloquent\Collection $attribute_variants + * @property-read int|null $attribute_variants_count + * @property-read \Illuminate\Database\Eloquent\Collection $whitelabel_images + * @property-read int|null $whitelabel_images_count + * @method static \Illuminate\Database\Eloquent\Builder|Product whereExcludeStatsSales($value) + * @method static \Illuminate\Database\Eloquent\Builder|Product whereWhitelabel($value) + * @method static \Illuminate\Database\Eloquent\Builder|Product whereWhitelabelName($value) + * @mixin \Eloquent */ class Product extends Model { @@ -155,10 +165,12 @@ class Product extends Model 'wp_number' => 'int', 'single_commission' => 'bool', 'amount_commission' => 'bool', + 'exclude_stats_sales' => 'bool', 'active' => 'bool', 'shipping_addon' => 'bool', 'max_buy' => 'bool', - 'max_buy_num' => 'int' + 'max_buy_num' => 'int', + 'whitelabel' => 'bool', ]; use Sluggable; @@ -168,6 +180,8 @@ class Product extends Model protected $fillable = [ 'name', + 'whitelabel', + 'whitelabel_name', 'title', 'copy', 'short_copy', @@ -195,12 +209,14 @@ class Product extends Model 'amount_commission', 'value_commission', 'partner_commission', + 'exclude_stats_sales', 'identifier', 'action', 'upgrade_to_id', 'shipping_addon', 'max_buy', 'max_buy_num' + ]; public $identifiers_types = [ @@ -219,9 +235,6 @@ class Product extends Model 4 => 'KG', ]; - - - public $actions = [ 0 => 'payment_for_account', 1 => 'charging_credits', @@ -231,7 +244,7 @@ class Product extends Model ]; - public function sluggable() + public function sluggable(): array { return [ 'slug' => [ @@ -241,19 +254,28 @@ class Product extends Model } public function attributes(){ - return $this->hasMany('App\Models\ProductAttribute', 'product_id', 'id'); + return $this->hasMany(ProductAttribute::class, 'product_id', 'id')->where('type_id','!=', 1); } + public function attribute_variants(){ + return $this->hasMany(ProductAttribute::class, 'product_id', 'id')->where('type_id','=', 1); + } + + public function categories(){ return $this->hasMany('App\Models\ProductCategory', 'product_id', 'id'); } public function images(){ - return $this->hasMany('App\Models\ProductImage', 'product_id', 'id')->orderBy('pos'); + return $this->hasMany(ProductImage::class, 'product_id', 'id')->where('type','=', 'product')->orderBy('pos'); } public function imagesActive(){ - return $this->hasMany('App\Models\ProductImage', 'product_id', 'id')->where('active', true)->orderBy('pos'); + return $this->hasMany(ProductImage::class, 'product_id', 'id')->where('type','=', 'product')->where('active', true)->orderBy('pos'); + } + + public function whitelabel_images(){ + return $this->hasMany(ProductImage::class, 'product_id', 'id')->where('type','=', 'wllogo')->orderBy('pos'); } public function country_prices() @@ -291,6 +313,11 @@ class Product extends Model } return false; } + + public function getWhiteLableName($id = 0){ + return $this->whitelabel_name ? $this->whitelabel_name : $this->name; + } + public function _format_number($value){ return preg_replace("/[^0-9,]/", "", $value); } @@ -330,9 +357,9 @@ class Product extends Model return isset($this->attributes['price_ek']) ? Util::formatNumber($this->attributes['price_ek']) : ""; } - public function getFormattedTax() + public function getFormattedTax($country = null) { - return isset($this->attributes['tax']) ? Util::formatNumber($this->attributes['tax'], 0) : ""; + return isset($this->attributes['tax']) ? Util::formatNumber($this->getTaxWith($country), 0) : ""; } public function getFormattedPriceOld() @@ -362,24 +389,38 @@ class Product extends Model return $price; } /*price net*/ - private function calcPriceNet($price){ - $tax_rate = ($this->attributes['tax'] + 100) / 100; - + private function calcPriceNet($price, $country=null){ + $tax = $this->getTaxWith($country); + $tax_rate = ($tax + 100) / 100; return $price / $tax_rate; } + //price calu with - public function getPriceWith(Bool $net = true, Bool $ufactor = true){ - $price = $this->attributes['price']; - $price = $net ? $this->calcPriceNet($price) : $price; + public function getPriceWith(Bool $net = true, Bool $ufactor = true, $country = null, $commission=false){ + $price = isset($this->attributes['price']) ? $this->attributes['price'] : null; + + /*$cprice = $country ? $this->getCPrice($country) : null; //eigener Preis für Land + $price = $cprice ? $cprice : $price; */ + + $price = $net ? $this->calcPriceNet($price, $country) : $price; $price = $ufactor ? $this->calcPriceUserFactor($price) : $price; + $price = $commission ? $this->calcPriceUserCommission($price) : $price; return round($price, 2); } + /*out*/ public function getFormattedPriceWith(Bool $net = true, Bool $ufactor = true) { return isset($this->attributes['price']) ? Util::formatNumber($this->getPriceWith($net, $ufactor)) : ""; } + public function getTaxWith($country = null){ + $tax = isset($this->attributes['tax']) ? $this->attributes['tax'] : null; + $ctax = $country ? $this->getCTax($country) : null; + return $ctax !== null ? $ctax : $tax; + } + + public function getBasePriceFormattedFull(){ if($price = $this->getBasePrice()){ @@ -424,14 +465,14 @@ class Product extends Model return isset(Type::$showATs[$this->show_at]) ? Type::$showATs[$this->show_at] : '-'; } - public function getShowOnTypes(){ + public function getShowOnTypes($seperator = false){ $ret = []; if($this->show_on && is_array($this->show_on)){ foreach($this->show_on as $show){ $ret[] = isset(Type::$showONs[$show]) ? Type::$showONs[$show] : '-'; } } - return $ret; + return $seperator ? implode($seperator, $ret) : $ret; } @@ -493,5 +534,15 @@ class Product extends Model return $this->price; } + public function getFormattedPriceCurrencyWith(Bool $net = true, Bool $ufactor = true, Country $country = null, $commission = false){ + $ret = ""; + if($country && isset($country->currency) && $country->currency){ + $price = $this->getPriceWith($net, $ufactor, $country, $commission); + $ret = formatNumber($price * $country->currency_faktor)." ".$country->currency_unit; + return '
~'.$ret.''; + } + return "" ; + } + } diff --git a/app/Models/ProductAttribute.php b/app/Models/ProductAttribute.php index a94b36c..c426fed 100644 --- a/app/Models/ProductAttribute.php +++ b/app/Models/ProductAttribute.php @@ -1,44 +1,66 @@ 'int', + 'type_id' => 'int', + 'attribute_id' => 'int' + ]; - public function product() - { - return $this->belongsTo('App\Models\Product', 'product_id'); - } + protected $fillable = [ + 'product_id', + 'type_id', + 'attribute_id' + ]; - public function attribute() - { - return $this->belongsTo('App\Models\Attribute', 'attribute_id'); - } + public function attribute() + { + return $this->belongsTo(Attribute::class); + } + + public function attribute_type() + { + return $this->belongsTo(AttributeType::class); + } + + public function product() + { + return $this->belongsTo(Product::class); + } } diff --git a/app/Models/ProductCategory.php b/app/Models/ProductCategory.php index 620e0c2..e0d25cc 100644 --- a/app/Models/ProductCategory.php +++ b/app/Models/ProductCategory.php @@ -20,10 +20,14 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ProductCategory whereId($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ProductCategory whereProductId($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ProductCategory whereUpdatedAt($value) - * @mixin \Eloquent * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ProductCategory newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ProductCategory newQuery() * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ProductCategory query() + * @property int|null $pos + * @property array|null $show_on + * @method static \Illuminate\Database\Eloquent\Builder|ProductCategory wherePos($value) + * @method static \Illuminate\Database\Eloquent\Builder|ProductCategory whereShowOn($value) + * @mixin \Eloquent */ class ProductCategory extends Model { @@ -47,14 +51,14 @@ class ProductCategory extends Model return $this->belongsTo('App\Models\Category', 'category_id'); } - public function getShowOnTypes(){ + public function getShowOnTypes($seperator = false){ $ret = []; if($this->show_on && is_array($this->show_on)){ foreach($this->show_on as $show){ $ret[] = isset(Type::$showONs[$show]) ? Type::$showONs[$show] : '-'; } } - return $ret; + return $seperator ? implode($seperator, $ret) : $ret; } } diff --git a/app/Models/ProductImage.php b/app/Models/ProductImage.php index 4ef5bc3..380be74 100644 --- a/app/Models/ProductImage.php +++ b/app/Models/ProductImage.php @@ -29,7 +29,6 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ProductImage whereProductId($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ProductImage whereSize($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ProductImage whereUpdatedAt($value) - * @mixin \Eloquent * @property string|null $slug * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ProductImage findSimilarSlugs($attribute, $config, $slug) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ProductImage whereSlug($value) @@ -39,6 +38,14 @@ use Illuminate\Database\Eloquent\Model; * @property int|null $pos * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ProductImage wherePos($value) * @method static \Illuminate\Database\Eloquent\Builder|ProductImage withUniqueSlugConstraints(\Illuminate\Database\Eloquent\Model $model, string $attribute, array $config, string $slug) + * @property int|null $user_wl_product_id + * @property string|null $type + * @property object|null $attributes + * @property-read \App\Models\UserWhitelabelProduct|null $user_wl_product + * @method static \Illuminate\Database\Eloquent\Builder|ProductImage whereAttributes($value) + * @method static \Illuminate\Database\Eloquent\Builder|ProductImage whereType($value) + * @method static \Illuminate\Database\Eloquent\Builder|ProductImage whereUserWlProductId($value) + * @mixin \Eloquent */ class ProductImage extends Model { @@ -47,11 +54,15 @@ class ProductImage extends Model protected $table = 'product_images'; - protected $fillable = [ - 'product_id', 'filename', 'original_name', 'ext', 'mine', 'size' + protected $casts = [ + 'attributes' => 'object' ]; - public function sluggable() + protected $fillable = [ + 'product_id', 'user_wl_product_id', 'type', 'filename', 'original_name', 'ext', 'mine', 'size', 'attributes' + ]; + + public function sluggable(): array { return [ 'slug' => [ @@ -65,6 +76,11 @@ class ProductImage extends Model return $this->belongsTo('App\Models\Product', 'product_id'); } + public function user_wl_product() + { + return $this->belongsTo('App\Models\UserWhitelabelProduct', 'user_wl_product_id'); + } + public function formatBytes($precision = 2) { $size = $this->size; @@ -80,4 +96,23 @@ class ProductImage extends Model } } + public function getImagePath() + { + if($this->type === 'uwllogo'){ + return '/images/user_product/'.$this->user_wl_product_id .'/'.$this->filename; + } + if($this->type === 'product'){ + return '/images/product/'.$this->product_id .'/'.$this->filename; + } + if($this->type === 'wllogo'){ + return '/images/product/'.$this->product_id .'/'.$this->filename; + } + + return '/images/product/'.$this->product_id .'/'.$this->filename; + } + + + public function getBaseImagePath(){ + return base_path()."/storage/app/public".$this->getImagePath(); + } } diff --git a/app/Models/PromotionAdmin.php b/app/Models/PromotionAdmin.php index ab7b1eb..398621b 100644 --- a/app/Models/PromotionAdmin.php +++ b/app/Models/PromotionAdmin.php @@ -44,7 +44,6 @@ use Illuminate\Database\Eloquent\Collection; * @method static \Illuminate\Database\Eloquent\Builder|PromotionAdmin whereName($value) * @method static \Illuminate\Database\Eloquent\Builder|PromotionAdmin whereTo($value) * @method static \Illuminate\Database\Eloquent\Builder|PromotionAdmin whereUpdatedAt($value) - * @mixin \Eloquent * @property int|null $type * @property bool $shop * @property-read Collection|\App\Models\PromotionAdminProduct[] $promotion_admin_products @@ -57,6 +56,7 @@ use Illuminate\Database\Eloquent\Collection; * @property string|null $user_about * @method static \Illuminate\Database\Eloquent\Builder|PromotionAdmin whereUserAbout($value) * @method static \Illuminate\Database\Eloquent\Builder|PromotionAdmin whereUserDescription($value) + * @mixin \Eloquent */ class PromotionAdmin extends Model { diff --git a/app/Models/PromotionUser.php b/app/Models/PromotionUser.php index 47b81f2..e3779ab 100644 --- a/app/Models/PromotionUser.php +++ b/app/Models/PromotionUser.php @@ -44,7 +44,6 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|PromotionUser whereUrl($value) * @method static \Illuminate\Database\Eloquent\Builder|PromotionUser whereUsedBudgetTotal($value) * @method static \Illuminate\Database\Eloquent\Builder|PromotionUser whereUserDeletedAt($value) - * @mixin \Eloquent * @property int $user_id * @property string|null $user_address * @property-read Collection|\App\Models\PromotionUserProduct[] $promotion_user_products @@ -60,6 +59,9 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|PromotionUser whereAboutYou($value) * @method static \Illuminate\Database\Eloquent\Builder|PromotionUser whereInternalDescription($value) * @method static \Illuminate\Database\Eloquent\Builder|PromotionUser whereInternalName($value) + * @property-read Collection $promotion_user_orders + * @property-read int|null $promotion_user_orders_count + * @mixin \Eloquent */ class PromotionUser extends Model { @@ -71,7 +73,7 @@ class PromotionUser extends Model 'pick_up' => 'bool', 'used_budget_total' => 'float', 'sell_items_total' => 'int', - 'active' => 'bool' + 'active' => 'bool', ]; protected $dates = [ @@ -132,7 +134,6 @@ class PromotionUser extends Model } - public function getUrlPreview() { return $this->url ? config('app.promo_url')."/".$this->url : ""; diff --git a/app/Models/PromotionUserOrder.php b/app/Models/PromotionUserOrder.php index ca6c354..5da050e 100644 --- a/app/Models/PromotionUserOrder.php +++ b/app/Models/PromotionUserOrder.php @@ -53,6 +53,8 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|PromotionUserOrder whereStatus($value) * @method static \Illuminate\Database\Eloquent\Builder|PromotionUserOrder whereTaxRate($value) * @method static \Illuminate\Database\Eloquent\Builder|PromotionUserOrder whereUpdatedAt($value) + * @property bool|null $pick_up + * @method static \Illuminate\Database\Eloquent\Builder|PromotionUserOrder wherePickUp($value) * @mixin \Eloquent */ class PromotionUserOrder extends Model diff --git a/app/Models/Setting.php b/app/Models/Setting.php index 8d1a934..d081fa9 100644 --- a/app/Models/Setting.php +++ b/app/Models/Setting.php @@ -43,10 +43,10 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|Setting whereText($value) * @method static \Illuminate\Database\Eloquent\Builder|Setting whereType($value) * @method static \Illuminate\Database\Eloquent\Builder|Setting whereUpdatedAt($value) - * @mixin \Eloquent * @property int|null $int * @method static \Illuminate\Database\Eloquent\Builder|Setting whereInt($value) * @method static \Illuminate\Database\Eloquent\Builder|Setting withUniqueSlugConstraints(\Illuminate\Database\Eloquent\Model $model, string $attribute, array $config, string $slug) + * @mixin \Eloquent */ class Setting extends Model { @@ -84,7 +84,7 @@ class Setting extends Model ]; - public function sluggable() + public function sluggable(): array { return [ 'slug' => [ diff --git a/app/Models/Shipping.php b/app/Models/Shipping.php index d8c4454..b285118 100644 --- a/app/Models/Shipping.php +++ b/app/Models/Shipping.php @@ -28,9 +28,9 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Shipping whereName($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Shipping whereTransName($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Shipping whereUpdatedAt($value) - * @mixin \Eloquent * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ShippingPrice[] $shipping_prices * @property-read int|null $shipping_prices_count + * @mixin \Eloquent */ class Shipping extends Model { diff --git a/app/Models/ShippingCountry.php b/app/Models/ShippingCountry.php index 1facdf8..5435c68 100644 --- a/app/Models/ShippingCountry.php +++ b/app/Models/ShippingCountry.php @@ -22,9 +22,9 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShippingCountry whereId($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShippingCountry whereShippingId($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShippingCountry whereUpdatedAt($value) - * @mixin \Eloquent * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ShoppingOrder[] $shopping_orders * @property-read int|null $shopping_orders_count + * @mixin \Eloquent */ class ShippingCountry extends Model { diff --git a/app/Models/ShippingPrice.php b/app/Models/ShippingPrice.php index 1c4548e..60a78cd 100644 --- a/app/Models/ShippingPrice.php +++ b/app/Models/ShippingPrice.php @@ -34,7 +34,6 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShippingPrice whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShippingPrice whereWeightFrom($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShippingPrice whereWeightTo($value) - * @mixin \Eloquent * @property-write mixed $tax * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShippingPrice whereTaxRate($value) * @property float|null $price_comp @@ -43,6 +42,7 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShippingPrice wherePriceComp($value) * @property int|null $shipping_for * @method static \Illuminate\Database\Eloquent\Builder|ShippingPrice whereShippingFor($value) + * @mixin \Eloquent */ class ShippingPrice extends Model { @@ -54,7 +54,8 @@ class ShippingPrice extends Model public static $shippingForTypes = [ 1 => 'Berater Bestellungen', - 2 => 'Shop Bestellungen', + 2 => 'Promotion Bestellungen', + 3 => 'Shop Bestellungen', ]; public function shipping() diff --git a/app/Models/ShoppingOrder.php b/app/Models/ShoppingOrder.php index 5d2730f..1ebeeda 100644 --- a/app/Models/ShoppingOrder.php +++ b/app/Models/ShoppingOrder.php @@ -51,7 +51,6 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShoppingOrder whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShoppingOrder whereUserShopId($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShoppingOrder whereWeight($value) - * @mixin \Eloquent * @property int|null $payment_for * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShoppingOrder wherePaymentFor($value) * @property int|null $member_id @@ -104,6 +103,9 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property-read \App\Models\PromotionUser|null $promotion_user * @method static \Illuminate\Database\Eloquent\Builder|ShoppingOrder wherePromotionUserId($value) * @method static \Illuminate\Database\Eloquent\Builder|ShoppingOrder whereShippingOption($value) + * @property array|null $delivery + * @method static \Illuminate\Database\Eloquent\Builder|ShoppingOrder whereDelivery($value) + * @mixin \Eloquent */ class ShoppingOrder extends Model { @@ -116,10 +118,10 @@ class ShoppingOrder extends Model 'shopping_user_id', 'auth_user_id', 'promotion_user_id', + 'user_shop_id', 'member_id', 'payment_for', 'country_id', - 'user_shop_id', 'total', 'subtotal_full', 'discount', @@ -135,6 +137,7 @@ class ShoppingOrder extends Model 'weight', 'paid', 'invoice', + 'delivery', 'invoice_number', 'txaction', 'wp_invoice_path', @@ -149,6 +152,7 @@ class ShoppingOrder extends Model protected $casts = [ 'wp_notice' => 'array', 'invoice' => 'array', + 'delivery' => 'array', 'shipped_at' => 'datetime', ]; @@ -196,10 +200,10 @@ class ShoppingOrder extends Model public static $apiShippedTypes = [ 0 => 'open', //(Fullfilment durch Händler)', - 1 => 'process', //(Fullfilment durch MIVITA: nicht Versand) - 2 => 'sent', //(Fullfilment durch MIVITA: Versand erfolgt)' - 3 => 'close', //(Fullfilment durch MIVITA: Versand erfolgt)', - 4 => 'pick_up', //(Fullfilment durch MIVITA: Versand erfolgt)', + 1 => 'process', //(Fullfilment: nicht Versand) + 2 => 'sent', //(Fullfilment: Versand erfolgt)' + 3 => 'close', //(Fullfilment: Versand erfolgt)', + 4 => 'pick_up', //(Fullfilment: Versand erfolgt)', 10 => 'cancel' ]; @@ -232,6 +236,11 @@ class ShoppingOrder extends Model return $this->belongsTo('App\Models\PromotionUser','promotion_user_id'); } + public function user_shop() + { + return $this->belongsTo('App\Models\UserShop','user_shop_id'); + } + //can null public function member() { @@ -367,6 +376,11 @@ class ShoppingOrder extends Model } return $count; } + + public function isInvoice(){ + return $this->user_invoice ? true : false; + } + public function isPickUp(){ return $this->shipping_option === 'pick_up' ? true : false; } diff --git a/app/Models/ShoppingOrderItem.php b/app/Models/ShoppingOrderItem.php index c92a45c..0a55d3e 100644 --- a/app/Models/ShoppingOrderItem.php +++ b/app/Models/ShoppingOrderItem.php @@ -31,7 +31,6 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShoppingOrderItem whereShoppingOrderId($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShoppingOrderItem whereSlug($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShoppingOrderItem whereUpdatedAt($value) - * @mixin \Eloquent * @property float|null $tax_rate * @property \Illuminate\Support\Carbon|null $deleted_at * @property string|null $user_deleted_at @@ -48,6 +47,9 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property int|null $free_product_id * @property-read \App\Models\PromotionUserProduct|null $promotion_user_product * @method static \Illuminate\Database\Eloquent\Builder|ShoppingOrderItem whereFreeProductId($value) + * @property bool|null $handle + * @method static \Illuminate\Database\Eloquent\Builder|ShoppingOrderItem whereHandle($value) + * @mixin \Eloquent */ class ShoppingOrderItem extends Model { diff --git a/app/Models/ShoppingOrderMargin.php b/app/Models/ShoppingOrderMargin.php index 16af87e..1acf7eb 100644 --- a/app/Models/ShoppingOrderMargin.php +++ b/app/Models/ShoppingOrderMargin.php @@ -51,7 +51,6 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|ShoppingOrderMargin whereStatus($value) * @method static \Illuminate\Database\Eloquent\Builder|ShoppingOrderMargin whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|ShoppingOrderMargin whereUserId($value) - * @mixin \Eloquent * @property \Illuminate\Support\Carbon|null $partner_commission_pending_to * @property bool|null $partner_commission_paid * @property-read User|null $m_sponsor @@ -59,6 +58,7 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|ShoppingOrderMargin wherePartnerCommissionPendingTo($value) * @property int|null $user_credit_id * @method static \Illuminate\Database\Eloquent\Builder|ShoppingOrderMargin whereUserCreditId($value) + * @mixin \Eloquent */ class ShoppingOrderMargin extends Model { @@ -73,10 +73,13 @@ class ShoppingOrderMargin extends Model 'from_payment_credit' => 'float', 'm_sponsor_id' => 'int', 'net_partner_commission' => 'float', - 'paid' => 'bool', - 'cancellation' => 'bool', - 'status' => 'int', - 'partner_commission_pending_to' => 'datetime', + 'order_paid' => 'bool', //ist die Bestellung bezahlt? + 'out_paid' => 'bool', //ist die Provision Marge ausgezahlt? + 'cancellation' => 'bool', //ist die Stornierung beantragt? + 'status' => 'int', //status der Bestellung + 'margin_pending_to' => 'datetime', + 'margin_paid' => 'bool', + 'partner_commission_pending_to' => 'datetime', 'partner_commission_paid' => 'bool', 'user_credit_id' => 'int', ]; @@ -95,15 +98,29 @@ class ShoppingOrderMargin extends Model 'm_sponsor_id', 'net_partner_commission', 'from', - 'paid', + 'order_paid', + 'out_paid', 'cancellation', 'status', + 'margin_pending_to', + 'margin_paid', 'partner_commission_pending_to', 'partner_commission_paid', 'user_credit_id', 'content' ]; + + public static $statusTypes = [ + 0 => 'user order', + 1 => '', + 7 => 'from promotion', + 8 => 'from shop', + 9 => 'storniert' + ]; + + private $storedContent; + public function user() { return $this->belongsTo(User::class, 'user_id'); @@ -131,4 +148,33 @@ class ShoppingOrderMargin extends Model } return false; } + + public function getFormattedNetDiscount() + { + return formatNumber($this->attributes['net_discount']); + } + + public function getFormattedNetPartnerCommission() + { + return formatNumber($this->attributes['net_partner_commission']); + } + + public function getRestoreContent($key = false) + { + if(!$this->storedContent){ + $this->storedContent = unserialize($this->attributes['content']); + } + if (is_array($this->storedContent)) { + switch ($key) { + case 'items': + return $this->storedContent['items']; + break; + case 'commission': + return $this->storedContent['commission']; + break; + + } + return $this->storedContent; + } + } } diff --git a/app/Models/ShoppingPayment.php b/app/Models/ShoppingPayment.php index 7be293f..ebdf405 100644 --- a/app/Models/ShoppingPayment.php +++ b/app/Models/ShoppingPayment.php @@ -38,9 +38,9 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShoppingPayment whereTxaction($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShoppingPayment whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShoppingPayment whereWallettype($value) - * @mixin \Eloquent * @property string|null $mode * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShoppingPayment whereMode($value) + * @mixin \Eloquent */ class ShoppingPayment extends Model { diff --git a/app/Models/ShoppingUser.php b/app/Models/ShoppingUser.php index 1f9be98..61925cd 100644 --- a/app/Models/ShoppingUser.php +++ b/app/Models/ShoppingUser.php @@ -69,7 +69,6 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShoppingUser whereShippingSalutation($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShoppingUser whereShippingZipcode($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShoppingUser whereUpdatedAt($value) - * @mixin \Eloquent * @property int|null $orders * @property-read \App\Models\ShoppingOrder $shopping_order * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ShoppingOrder[] $shopping_orders @@ -113,6 +112,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShoppingUser whereIsFrom($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShoppingUser whereShippingEmail($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ShoppingUser whereShoppingUserId($value) + * @mixin \Eloquent */ class ShoppingUser extends Model { @@ -274,7 +274,7 @@ class ShoppingUser extends Model } return 0; case 'shopping': - return $this->is_for === 'pr' ? 7 : 8; //7 Promotion + return $this->is_for === 'pr' ? 7 : 8; //7 Promotion //8 Shop case 'extern': return 10; } diff --git a/app/Models/SySetting.php b/app/Models/SySetting.php index 114709a..427e62e 100644 --- a/app/Models/SySetting.php +++ b/app/Models/SySetting.php @@ -36,8 +36,8 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\SySetting whereSlug($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\SySetting whereStatus($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\SySetting whereUpdatedAt($value) - * @mixin \Eloquent * @method static \Illuminate\Database\Eloquent\Builder|SySetting withUniqueSlugConstraints(\Illuminate\Database\Eloquent\Model $model, string $attribute, array $config, string $slug) + * @mixin \Eloquent */ class SySetting extends Model { @@ -63,7 +63,7 @@ class SySetting extends Model 1 => 'default', ]; - public function sluggable() + public function sluggable(): array { return [ 'slug' => [ diff --git a/app/Models/UserAccount.php b/app/Models/UserAccount.php index b318c61..b39b4e7 100644 --- a/app/Models/UserAccount.php +++ b/app/Models/UserAccount.php @@ -26,7 +26,6 @@ use Carbon\Carbon; * @method static bool|null restore() * @method static \Illuminate\Database\Query\Builder|\App\Models\UserAccount withTrashed() * @method static \Illuminate\Database\Query\Builder|\App\Models\UserAccount withoutTrashed() - * @mixin \Eloquent * @property int $id * @property string|null $salutation * @property string|null $first_name @@ -121,6 +120,13 @@ use Carbon\Carbon; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\UserAccount whereNotice($value) * @property string|null $about_you * @method static \Illuminate\Database\Eloquent\Builder|UserAccount whereAboutYou($value) + * @property int $reverse_charge + * @property string|null $reverse_charge_code + * @property string|null $reverse_charge_valid + * @method static \Illuminate\Database\Eloquent\Builder|UserAccount whereReverseCharge($value) + * @method static \Illuminate\Database\Eloquent\Builder|UserAccount whereReverseChargeCode($value) + * @method static \Illuminate\Database\Eloquent\Builder|UserAccount whereReverseChargeValid($value) + * @mixin \Eloquent */ class UserAccount extends Model { @@ -196,6 +202,12 @@ class UserAccount extends Model return Carbon::parse($this->attributes['accept_contract'])->format(\Util::formatDateTimeDB()); } + public function getReverseChargeValidFormat(){ + if(!$this->attributes['reverse_charge_valid']){ return ""; } + return Carbon::parse($this->attributes['reverse_charge_valid'])->format(\Util::formatDateTimeDB()); + } + + public function getPaymentData($key) { return isset($this->payment_data[$key]) ? $this->payment_data[$key] : ''; diff --git a/app/Models/UserCredit.php b/app/Models/UserCredit.php index 992fcf3..e17958d 100644 --- a/app/Models/UserCredit.php +++ b/app/Models/UserCredit.php @@ -44,13 +44,13 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|UserCredit whereTotal($value) * @method static \Illuminate\Database\Eloquent\Builder|UserCredit whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|UserCredit whereUserMargins($value) - * @mixin \Eloquent * @property string|null $credit_number * @property string|null $date * @method static \Illuminate\Database\Eloquent\Builder|UserCredit whereCreditNumber($value) * @method static \Illuminate\Database\Eloquent\Builder|UserCredit whereDate($value) * @property object|null $user_credits * @method static \Illuminate\Database\Eloquent\Builder|UserCredit whereUserCredits($value) + * @mixin \Eloquent */ class UserCredit extends Model { diff --git a/app/Models/UserCreditMargin.php b/app/Models/UserCreditMargin.php index 1ce5bdf..e32fc43 100644 --- a/app/Models/UserCreditMargin.php +++ b/app/Models/UserCreditMargin.php @@ -6,6 +6,7 @@ namespace App\Models; +use App\Services\Util; use Carbon\Carbon; use Illuminate\Database\Eloquent\Model; @@ -33,9 +34,9 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|UserCreditMargin whereStatus($value) * @method static \Illuminate\Database\Eloquent\Builder|UserCreditMargin whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|UserCreditMargin whereUserId($value) - * @mixin \Eloquent * @property int|null $user_credit_id * @method static \Illuminate\Database\Eloquent\Builder|UserCreditMargin whereUserCreditId($value) + * @mixin \Eloquent */ class UserCreditMargin extends Model { @@ -75,4 +76,8 @@ class UserCreditMargin extends Model } return false; } + + public function getFormattedCredit(){ + return Util::formatNumber($this->credit); + } } diff --git a/app/Models/UserHistory.php b/app/Models/UserHistory.php index 4e671f9..3b7cedf 100644 --- a/app/Models/UserHistory.php +++ b/app/Models/UserHistory.php @@ -38,11 +38,11 @@ use App\User; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\UserHistory whereStatus($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\UserHistory whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\UserHistory whereUserId($value) - * @mixin \Eloquent * @property string|null $identifier * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\UserHistory whereIdentifier($value) * @property int|null $abo_options * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\UserHistory whereAboOptions($value) + * @mixin \Eloquent */ class UserHistory extends Model { diff --git a/app/Models/UserLevel.php b/app/Models/UserLevel.php index 4500163..636b992 100644 --- a/app/Models/UserLevel.php +++ b/app/Models/UserLevel.php @@ -26,7 +26,6 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\UserLevel wherePos($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\UserLevel whereTransName($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\UserLevel whereUpdatedAt($value) - * @mixin \Eloquent * @property string|null $content * @property array|null $trans_content * @method static \Illuminate\Database\Eloquent\Builder|UserLevel whereContent($value) @@ -37,6 +36,9 @@ use Illuminate\Database\Eloquent\Model; * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\UserLevelMargin[] $user_level_margins_re * @property-read int|null $user_level_margins_re_count * @method static \Illuminate\Database\Eloquent\Builder|UserLevel wherePartnerProvision($value) + * @property bool $payment_year + * @method static \Illuminate\Database\Eloquent\Builder|UserLevel wherePaymentYear($value) + * @mixin \Eloquent */ class UserLevel extends Model { diff --git a/app/Models/UserRegister.php b/app/Models/UserRegister.php new file mode 100644 index 0000000..beb5e84 --- /dev/null +++ b/app/Models/UserRegister.php @@ -0,0 +1,45 @@ + 'object' + ]; + + protected $fillable = [ + 'identifier', 'instance', 'content' + ]; + + +} diff --git a/app/Models/UserShop.php b/app/Models/UserShop.php new file mode 100644 index 0000000..9d32b41 --- /dev/null +++ b/app/Models/UserShop.php @@ -0,0 +1,132 @@ + 'int', + 'pick_up' => 'bool', + 'active' => 'bool', + 'featured' => 'array', + 'trans' => 'array', + ]; + + protected $dates = [ + 'active_date' + ]; + + protected $fillable = [ + 'user_id', + 'url', + 'name', + 'description', + 'about_you', + 'user_address', + 'trans', + 'pick_up', + 'active', + 'active_date', + 'featured' + ]; + + public function user() + { + return $this->belongsTo(User::class); + } + + public function getUrlPreview() + { + return $this->url ? config('app.shop_url')."/".$this->url : ""; + } + + public function getLang($key, $default = true) + { + $lang = \App::getLocale(); + if ($lang == 'de') { + return $this->{$key}; + } + return $this->getTrans($key, $lang, $default); + } + + public function getTrans($key, $lang, $default = true) + { + if ($lang == 'de') { + return $this->{$key}; + } + if(!empty($this->trans[$lang][$key])){ + return $this->trans[$lang][$key]; + } + if($default){ + return !empty($this->{$key}) ? $this->{$key} : ''; + } + return ""; + } + + public function isActive(){ + if($this->active){ + return true; + } + return false; + } + + public function getSubdomain(){ + return ""; + } +} diff --git a/app/Models/UserUpdateEmail.php b/app/Models/UserUpdateEmail.php index ee5edb2..acaa969 100644 --- a/app/Models/UserUpdateEmail.php +++ b/app/Models/UserUpdateEmail.php @@ -8,7 +8,6 @@ use Illuminate\Database\Eloquent\Model; * App\Models\UserUpdateEmail * * @property-read \App\User $user - * @mixin \Eloquent * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\UserUpdateEmail newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\UserUpdateEmail newQuery() * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\UserUpdateEmail query() @@ -20,6 +19,7 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\UserUpdateEmail whereEmail($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\UserUpdateEmail whereToken($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\UserUpdateEmail whereUserId($value) + * @mixin \Eloquent */ class UserUpdateEmail extends Model { diff --git a/app/Models/UserWhitelabelProduct.php b/app/Models/UserWhitelabelProduct.php new file mode 100644 index 0000000..12bbd43 --- /dev/null +++ b/app/Models/UserWhitelabelProduct.php @@ -0,0 +1,79 @@ + $whitelabel_images + * @property-read int|null $whitelabel_images_count + * @method static \Illuminate\Database\Eloquent\Builder|UserWhitelabelProduct newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|UserWhitelabelProduct newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|UserWhitelabelProduct query() + * @method static \Illuminate\Database\Eloquent\Builder|UserWhitelabelProduct whereActive($value) + * @method static \Illuminate\Database\Eloquent\Builder|UserWhitelabelProduct whereAttributes($value) + * @method static \Illuminate\Database\Eloquent\Builder|UserWhitelabelProduct whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|UserWhitelabelProduct whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|UserWhitelabelProduct whereInfo($value) + * @method static \Illuminate\Database\Eloquent\Builder|UserWhitelabelProduct whereOptions($value) + * @method static \Illuminate\Database\Eloquent\Builder|UserWhitelabelProduct whereProductId($value) + * @method static \Illuminate\Database\Eloquent\Builder|UserWhitelabelProduct whereUpdatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|UserWhitelabelProduct whereUserId($value) + * @mixin \Eloquent + */ +class UserWhitelabelProduct extends Model +{ + protected $table = 'user_whitelabel_products'; + + protected $casts = [ + 'user_id' => 'int', + 'product_id' => 'int', + 'active' => 'bool', + 'attributes' => 'object', + 'options' => 'object' + + ]; + + protected $fillable = [ + 'user_id', + 'product_id', + 'info', + 'attributes', + 'options', + 'active' + ]; + + public function product() + { + return $this->belongsTo(Product::class); + } + + public function user() + { + return $this->belongsTo(User::class); + } + + public function whitelabel_images(){ + return $this->hasMany(ProductImage::class, 'user_wl_product_id', 'id')->where('type','=', 'uwllogo')->orderBy('pos'); + } +} diff --git a/app/Repositories/CheckoutRepository.php b/app/Repositories/CheckoutRepository.php index a8909c3..8a3a2c4 100644 --- a/app/Repositories/CheckoutRepository.php +++ b/app/Repositories/CheckoutRepository.php @@ -5,21 +5,24 @@ namespace App\Repositories; use Yard; use App\Services\Shop; use App\Services\Util; +use App\Models\UserShop; use App\Models\ShoppingUser; use App\Models\PromotionUser; use App\Models\ShoppingOrder; use App\Models\ShoppingOrderItem; use App\Services\CustomerPriority; use Illuminate\Support\Collection; +use App\Models\ShoppingOrderMargin; use Illuminate\Session\SessionManager; use App\Http\Controllers\Pay\PayController; - - class CheckoutRepository { private $payment_for; private $PromotionUser; + private $UserShop; + + private $is_for; private $session; private $instance; private $shopping_user; @@ -38,6 +41,14 @@ class CheckoutRepository { { $this->payment_for = $payment_for; $this->PromotionUser = $PromotionUser; + $this->is_for = 'pr'; + } + + public function setUserShop($payment_for, UserShop $UserShop) + { + $this->payment_for = $payment_for; + $this->UserShop = $UserShop; + $this->is_for = 'shop'; } public function init($identifier, $data) @@ -51,7 +62,7 @@ class CheckoutRepository { $shopping_data = Yard::instance('shopping')->getYardExtra('shopping_data'); $this->data['is_from'] = isset($shopping_data['is_from']) ? $shopping_data['is_from'] : 'shopping'; //shopping - $this->data['is_from'] = isset($shopping_data['is_for']) ? $shopping_data['is_for'] : 'pr'; //promotion + $this->data['is_for'] = isset($shopping_data['is_for']) ? $shopping_data['is_for'] : 'pr'; //promotion //us shop $this->shopping_user = $this->makeShoppingUser($data); $this->shopping_order = $this->makeShoppingOrder($this->shopping_user); @@ -94,7 +105,7 @@ class CheckoutRepository { $data['accepted_data'] = isset($data['accepted_data']) ? true : false; $data['billing_country_id'] = Shop::getShippingCountryCountryId($data['billing_state']); $data['shipping_country_id'] = $data['billing_country_id']; - $data['member_id'] = $this->PromotionUser->user_id; + $data['member_id'] = $this->is_for === 'shop' ? $this->UserShop->user_id : $this->PromotionUser->user_id; //pr if(isset($data['shipping_state'])){ $data['shipping_country_id'] = Shop::getShippingCountryCountryId($data['shipping_state']); @@ -119,7 +130,8 @@ class CheckoutRepository { $data = [ 'shopping_user_id' => $shopping_user->id, 'auth_user_id' => $shopping_user->auth_user_id, - 'promotion_user_id' => $this->PromotionUser->id, + 'promotion_user_id' => $this->is_for === 'pr' ? $this->PromotionUser->id : null, + 'user_shop_id' => $this->is_for === 'shop' ? $this->UserShop->id : null, 'country_id' => Yard::instance('shopping')->getShippingCountryId(), 'payment_for' => $this->payment_for, 'total' => Yard::instance('shopping')->total(2, '.', ''), @@ -152,7 +164,7 @@ class CheckoutRepository { if(!$shopping_order){ $shopping_order = ShoppingOrder::create($data); } - //$this->makeOrderMargin($shopping_order); + $this->makeOrderMargin($shopping_order); $this->putPayments('shopping_order_id', $shopping_order->id); $items = Yard::instance('shopping')->getContentByOrder(); @@ -197,6 +209,43 @@ class CheckoutRepository { return $shopping_order; } + private function makeOrderMargin(ShoppingOrder $shopping_order) + { + if ($this->is_for === 'pr' || $this->is_for === 'shop' ) { + + $userMargin = Shop::calculateUserShopMargins($this->UserShop, $this->PromotionUser); + $data = [ + 'shopping_order_id' => $shopping_order->id, + 'user_id' => $shopping_order->shopping_user->member_id, + 'net_price' => $userMargin->yard_margin->net_price, + 'net_discount' => $userMargin->yard_margin->net_discount, + 'net_amount' => $userMargin->yard_margin->net_amount, + 'from_payment_credit' =>0, + 'from' => now(), + 'status' => $this->payment_for, //7 => 'from promotion', 8 => 'from shop', + 'content' => serialize($userMargin->yard_margin->toArray()) + ]; + if($userMargin->yard_margin->net_partner_commission > 0){ + if(isset($shopping_order->auth_user->m_sponsor)){ + if($shopping_order->auth_user->user_sponsor && $shopping_order->auth_user->user_sponsor->isActiveAccount()) + $data['m_sponsor_id'] = $shopping_order->auth_user->m_sponsor; + $data['net_partner_commission'] = $userMargin->yard_margin->net_partner_commission; + } + } + $shopping_order_margin = false; + if ($this->getPayments('shopping_order_margin_id')) { + $shopping_order_margin = ShoppingOrderMargin::find($this->getPayments('shopping_order_margin_id')); + if ($shopping_order_margin) { + $shopping_order_margin->fill($data); + $shopping_order_margin->save();} + } + if (!$shopping_order_margin) { + $shopping_order_margin = ShoppingOrderMargin::create($data); + } + $this->putPayments('shopping_order_margin_id', $shopping_order_margin->id); + } + } + private function putPayments($key, $value){ $content = $this->getContent(); $content->put($key, $value); diff --git a/app/Repositories/ContractPDFRepository.php b/app/Repositories/ContractPDFRepository.php index 47cd281..98d9c16 100644 --- a/app/Repositories/ContractPDFRepository.php +++ b/app/Repositories/ContractPDFRepository.php @@ -80,8 +80,10 @@ class ContractPDFRepository extends BaseRepository { $y += $nl; $pdf->SetXY($x1, $y); $pdf->Write(0, $this->convert($this->model->account->address)); - $pdf->SetXY($x2, $y); - $pdf->Write(0, $this->convert($this->model->account->birthday)); + if($this->model->account->birthday){ + $pdf->SetXY($x2, $y); + $pdf->Write(0, $this->convert($this->model->account->birthday)); + } $y += $nl; $pdf->SetXY($x1, $y); diff --git a/app/Repositories/CreditRepository.php b/app/Repositories/CreditRepository.php index 0d81bd0..f419d3a 100644 --- a/app/Repositories/CreditRepository.php +++ b/app/Repositories/CreditRepository.php @@ -83,31 +83,47 @@ class CreditRepository extends BaseRepository { return true; } + //beendet die Gutschrift private function finishUserCredit($user_credit){ //next number Credit::makeNextCreditNumber(); - //mark as payed - $ShoppingOrderMargins = UserMarign::getOrderFromPartnerCommissionByID($this->model->id); + //Partner Provision + $ShoppingOrderMargins = UserMarign::getPartnerCommissionItems($this->model->id, false); foreach($ShoppingOrderMargins as $ShoppingOrderMargin){ $ShoppingOrderMargin->partner_commission_paid = true; + $ShoppingOrderMargin->out_paid = true; $ShoppingOrderMargin->user_credit_id = $user_credit->id; $ShoppingOrderMargin->save(); } - $UserCreditMargins = UserMarign::getUserCreditMarginByID($this->model->id); + //Shop Provision + $ShoppingOrderMargins = UserMarign::getShopCommissionItems($this->model->id, false); + foreach($ShoppingOrderMargins as $ShoppingOrderMargin){ + $ShoppingOrderMargin->margin_paid = true; + $ShoppingOrderMargin->out_paid = true; + $ShoppingOrderMargin->user_credit_id = $user_credit->id; + $ShoppingOrderMargin->save(); + } + + //Hinzugefügte Provision + $UserCreditMargins = UserMarign::getUserCreditMarginByUserID($this->model->id); foreach($UserCreditMargins as $UserCreditMargin){ - $UserCreditMargin->paid = true; + $UserCreditMargin->paid = true; //wurde ausgezahlt $UserCreditMargin->user_credit_id = $user_credit->id; $UserCreditMargin->save(); } } + + //erstellt der Gutschrift private function makeUserCredit(){ $ret = new \stdClass(); $ret->net = 0; $ret->margins = []; $ret->credits = []; - $ShoppingOrderMargins = UserMarign::getOrderFromPartnerCommissionByID($this->model->id); + + //Partner Provision + $ShoppingOrderMargins = UserMarign::getPartnerCommissionItems($this->model->id, false); foreach($ShoppingOrderMargins as $ShoppingOrderMargin){ $margin = new \stdClass(); $margin->id = $ShoppingOrderMargin->id; @@ -120,7 +136,22 @@ class CreditRepository extends BaseRepository { $ret->net += $ShoppingOrderMargin->net_partner_commission; } - $UserCreditMargins = UserMarign::getUserCreditMarginByID($this->model->id); + //Shop Provision + $ShoppingOrderMargins = UserMarign::getShopCommissionItems($this->model->id, false); + foreach($ShoppingOrderMargins as $ShoppingOrderMargin){ + $margin = new \stdClass(); + $margin->id = $ShoppingOrderMargin->id; + $margin->net = $ShoppingOrderMargin->net_discount; + $margin->reference = $ShoppingOrderMargin->shopping_order->getLastShoppingPayment('reference'); + $margin->firstname = $ShoppingOrderMargin->shopping_order->shopping_user->billing_firstname; + $margin->lastname = $ShoppingOrderMargin->shopping_order->shopping_user->billing_lastname; + $margin->created_at = $ShoppingOrderMargin->shopping_order->created_at->format("d.m.Y"); + $ret->margins[] = $margin; + $ret->net += $ShoppingOrderMargin->net_discount; + } + + //Hinzugefügte Provision + $UserCreditMargins = UserMarign::getUserCreditMarginByUserID($this->model->id); foreach($UserCreditMargins as $UserCreditMargin){ $credit = new \stdClass(); $credit->id = $UserCreditMargin->id; @@ -138,7 +169,7 @@ class CreditRepository extends BaseRepository { if($this->model->account){ $ret->taxable = $this->model->account->taxable_sales == 2 ? false : true; if($ret->taxable){ - $ret->tax_rate = config('app.main_tax_number'); + $ret->tax_rate = config('app.main_tax_rate'); $ret->total = round($ret->net * config('app.main_tax'), 2); $ret->tax = $ret->total - $ret->net; @@ -146,7 +177,6 @@ class CreditRepository extends BaseRepository { $ret->tax_rate = 0; $ret->total = $ret->net; $ret->tax = 0; - } } diff --git a/app/Repositories/InvoiceRepository.php b/app/Repositories/InvoiceRepository.php index 0176a7e..159c270 100644 --- a/app/Repositories/InvoiceRepository.php +++ b/app/Repositories/InvoiceRepository.php @@ -4,9 +4,13 @@ namespace App\Repositories; use PDF; use Storage; -use App\Models\ShoppingOrder; +use App\Models\Attribute; use App\Services\Invoice; +use App\Libraries\InvoicePDF; +use App\Models\ShoppingOrder; use App\Services\MyPDFMerger; +use App\Services\UserService; +use App\Repositories\BaseRepository; class InvoiceRepository extends BaseRepository { @@ -15,6 +19,9 @@ class InvoiceRepository extends BaseRepository { private $filename; private $dir; + private $delivery_dir; + private $delivery_filename; + public function __construct(ShoppingOrder $model) { $this->model = $model; @@ -29,17 +36,28 @@ class InvoiceRepository extends BaseRepository { $this->invoice_number = Invoice::createInvoiceNumber($number, $this->invoice_date); $this->dir = Invoice::getInvoiceStorageDir($this->invoice_date); $this->filename = Invoice::makeInvoiceFilename($this->invoice_number); + $this->delivery_dir = Invoice::getDeliveryStorageDir($this->invoice_date); + $this->delivery_filename = Invoice::makeDeliveryFilename($this->invoice_number); $this->makePDF(); - $data_file = [ + $invoice_file = [ 'filename' => $this->filename, 'dir' => $this->dir, 'disk' => 'public', 'invoice_number' => $this->invoice_number, 'invoice_date' => $this->invoice_date, ]; - $this->model->invoice = $data_file; + + $delivery_file = [ + 'filename' => $this->delivery_filename, + 'dir' => $this->delivery_dir, + 'disk' => 'public', + 'number' => $this->invoice_number, + 'date' => $this->invoice_date, + ]; + $this->model->invoice = $invoice_file; + $this->model->delivery = $delivery_file; $this->model->invoice_number = $this->invoice_number; $this->model->save(); Invoice::makeNextInvoiceNumber(); @@ -58,16 +76,29 @@ class InvoiceRepository extends BaseRepository { $this->dir = Invoice::getDir($this->model); $this->filename = Invoice::getFilename($this->model); + + $this->delivery_dir = Invoice::getDeliveryDir($this->model); + $this->delivery_filename = Invoice::getDeliveryFilename($this->model); + $this->makePDF(); - $data_file = [ + $invoice_file = [ 'filename' => $this->filename, 'dir' => $this->dir, 'disk' => 'public', 'invoice_number' => $this->invoice_number, 'invoice_date' => $this->invoice_date, ]; - $this->model->invoice = $data_file; + $delivery_file = [ + 'filename' => $this->delivery_filename, + 'dir' => $this->delivery_dir, + 'disk' => 'public', + 'number' => $this->invoice_number, + 'date' => $this->invoice_date, + ]; + + $this->model->invoice = $invoice_file; + $this->model->delivery = $delivery_file; $this->model->invoice_number = $this->invoice_number; $this->model->save(); @@ -85,19 +116,123 @@ class InvoiceRepository extends BaseRepository { 'invoice_date' => $this->invoice_date, 'invoice_number' => $this->invoice_number, ]; - $pdf = PDF::loadView('pdf.invoice', $data); - $pdf->setPaper('A4', 'portrait'); + + if($this->model->auth_user_id){ + UserService::checkUserTaxShippingCountry($this->model->auth_user, $this->model->country_id); + $data = array_merge($data, UserService::getYardInfo()); + } + + $data['delivery_items'] = $this->prepairForDelivery(); if(!Storage::disk('public')->exists( $this->dir )){ Storage::disk('public')->makeDirectory($this->dir); //creates directory } + if(!Storage::disk('public')->exists( $this->delivery_dir )){ + Storage::disk('public')->makeDirectory($this->delivery_dir); //creates directory + } $path = Storage::disk('public')->getAdapter()->getPathPrefix(); - $pdf->save($path.$this->dir.$this->filename); - + $pdf_file = new InvoicePDF('pdf.invoice'); + $pdf_file->create($data, $this->filename, 'save', $path.$this->dir); $pdfMerger = new MyPDFMerger(); $pdfMerger->addPDF($path.$this->dir.$this->filename); $file = $pdfMerger->myMerge('string', $this->filename, 'template_invoice_de'); Storage::disk('public')->put($this->dir.$this->filename, $file); + + $pdf_file = new InvoicePDF('pdf.delivery'); + $pdf_file->create($data, $this->delivery_filename, 'save', $path.$this->delivery_dir); + $pdfMerger = new MyPDFMerger(); + $pdfMerger->addPDF($path.$this->delivery_dir.$this->delivery_filename); + $file = $pdfMerger->myMerge('string', $this->delivery_filename, 'template_delivery_de'); + Storage::disk('public')->put($this->delivery_dir.$this->delivery_filename, $file); + + } + //sort white label products + private function prepairForDelivery(){ + $shopping_order = $this->model; + $wl_items = []; + $items = []; + $counter = 1; + $count = 10000; + foreach($shopping_order->shopping_order_items as $shopping_order_item){ + $labels = []; + $sorter = 0; + if($shopping_order_item->product->whitelabel){ + + //get white label default etikett (s) + //ist ausschlaggebend für die etikettierung, ob 1 oder mehr etiketten + if($shopping_order_item->product->whitelabel_images){ + foreach($shopping_order_item->product->whitelabel_images as $whitelabel_image){ + $labels[] = $whitelabel_image; + } + } + //has white label user etikett + if($shopping_order->auth_user){ + $whitelabel_product = $shopping_order->auth_user->whitelabel_products()->where('product_id', '=', $shopping_order_item->product->id)->first(); + if($whitelabel_product && $whitelabel_product->whitelabel_images){ + foreach($whitelabel_product->whitelabel_images as $whitelabel_image){ + if($whitelabel_image->attributes && is_array($whitelabel_image->attributes)){ + foreach($labels as $key => $label){ + foreach($whitelabel_image->attributes as $attribute){ + if(in_array($attribute, $label->attributes)){ + //found and overwrite + $labels[$key] = $whitelabel_image; + } + } + } + } + } + } + } + + foreach($labels as $key=>$label){ + //label hat attribue + $varinats = []; + if($label->attributes && is_array($label->attributes)){ + foreach($label->attributes as $attribute){ + if($attribute = Attribute::find($attribute)){ + if(!isset($varinats[$attribute->value])){ + $temp = explode('#', $attribute->value); + $sorter = $temp[1] > $sorter ? $temp[1] : $sorter; + $label->varinat = [ + 'key' => $attribute->value, + 'id' => $attribute->id, + 'vol' => (float) $temp[0], + 'size' => (float) $temp[1], + 'name' => $label->product_id ? 'Standard' : $attribute->name, + ]; + } + } + } + }else{ + //sonst auf standard zurückgreifen + if($shopping_order_item->product->attribute_variants){ + foreach($shopping_order_item->product->attribute_variants as $attribute_variant){ + if(!isset($varinats[$attribute_variant->attribute->value])){ + $temp = explode('#', $attribute_variant->attribute->value); + $sorter = $temp[1] > $sorter ? $temp[1] : $sorter; + $label->varinat = [ + 'key' => $attribute_variant->attribute->value, + 'id' => $attribute_variant->attribute->id, + 'vol' => (float) $temp[0], + 'size' => (float) $temp[1], + 'name' => 'Standard', + ]; + } + } + } + } + } + //sorten of white label products + $sorter = intval((float) $sorter * 100 + $counter++); + $shopping_order_item->labels = $labels; + $wl_items[$sorter] = $shopping_order_item; + }else{ + $items[$count++] = $shopping_order_item; + } + } + //kleine zuerst + ksort($wl_items); + return array_merge($wl_items, $items); } } \ No newline at end of file diff --git a/app/Repositories/ProductRepository.php b/app/Repositories/ProductRepository.php index bf6724d..e7adce1 100644 --- a/app/Repositories/ProductRepository.php +++ b/app/Repositories/ProductRepository.php @@ -5,12 +5,14 @@ namespace App\Repositories; use App\Models\CountryPrice; +use App\Models\Attribute; use App\Models\Product; use App\Models\ProductAttribute; use App\Models\ProductCategory; use App\Models\ProductImage; use App\Models\ProductIngredient; + class ProductRepository extends BaseRepository { @@ -29,10 +31,12 @@ class ProductRepository extends BaseRepository { $data['active'] = isset($data['active']) ? 1 : 0; $data['single_commission'] = isset($data['single_commission']) ? 1 : 0; $data['amount_commission'] = isset($data['amount_commission']) ? 1 : 0; + $data['exclude_stats_sales'] = isset($data['exclude_stats_sales']) ? 1 : 0; + $data['whitelabel'] = isset($data['whitelabel']) ? 1 : 0; $data['shipping_addon'] = isset($data['shipping_addon']) ? 1 : 0; $data['max_buy'] = isset($data['max_buy']) ? 1 : 0; $data['show_on'] = isset($data['show_on']) ? $data['show_on'] : null; - + if($data['id'] === "new"){ $this->model = Product::create($data); } @@ -42,9 +46,14 @@ class ProductRepository extends BaseRepository { $this->model->save(); } - $this->updateCategories(isset($data['categories']) ? $data['categories'] : array()); - $this->updateAttributes(isset($data['attributes']) ? $data['attributes'] : array()); - $this->updateIngredients(isset($data['product_ingredients']) ? $data['product_ingredients'] : array()); + + $this->updateCategories(isset($data['categories']) ? $data['categories'] : []); + $this->updateAttributes(isset($data['attributes']) ? $data['attributes'] : []); + + $this->updateWLVariants(isset($data['whitelabel_variants']) ? $data['whitelabel_variants'] : []); + $this->updateWLImageAttributs(isset($data['image_wl_attributes']) ? $data['image_wl_attributes'] : [] , isset($data['whitelabel_variants']) ? $data['whitelabel_variants'] : []); + + $this->updateIngredients(isset($data['product_ingredients']) ? $data['product_ingredients'] : []); $this->updateCountryPrices($data); @@ -103,15 +112,62 @@ class ProductRepository extends BaseRepository { //set attr if(is_array($data)){ foreach ($data as $id) { + $attribute = Attribute::findOrFail($id); ProductAttribute::create([ 'product_id' => $this->model->id, - 'attribute_id' => $id, + 'type_id' => $attribute->attribute_type_id, + 'attribute_id' => $attribute->id, ]); } } return true; } + public function updateWLVariants($data = array()) + { + foreach ($this->model->attribute_variants as $variant) { + if(($pos = array_search($variant->attribute_id, $data)) !== FALSE){ + unset($data[$pos]); + }else{ + $variant->delete(); + } + } + //set attr + if(is_array($data)){ + foreach ($data as $id) { + $attribute = Attribute::findOrFail($id); + ProductAttribute::create([ + 'product_id' => $this->model->id, + 'type_id' => $attribute->attribute_type_id, + 'attribute_id' => $attribute->id, + ]); + } + } + return true; + } + + public function updateWLImageAttributs($attributes = [], $variants = []) + { + //abgleich der attributes gegen die variants + foreach ($attributes as $image => $value) { + foreach ($value as $k => $val) { + if(!is_array($variants) || !in_array($val, $variants)){ + unset($attributes[$image][$k]); + } + } + } + foreach ($this->model->whitelabel_images as $image) { + $image->update([ + 'attributes' => isset($attributes[$image->id]) ? $attributes[$image->id] : NULL, + ]); + } + + return true; + } + + + + public function updateCountryPrices($data) { if(!isset($data['country_prices']) || !is_array($data['country_prices'])){ @@ -128,7 +184,6 @@ class ProductRepository extends BaseRepository { 'c_price_old' => isset($data['c_price_old'][$country_id]) ? reFormatNumber($data['c_price_old'][$country_id]) : null, 'c_currency' => isset($data['c_currency'][$country_id]) ? reFormatNumber($data['c_currency'][$country_id]) : null, ]); - } @@ -156,6 +211,7 @@ class ProductRepository extends BaseRepository { foreach ($model->attributes as $attribute){ ProductAttribute::create([ 'product_id' => $this->model->id, + 'type_id' => $this->model->attribute_type_id, 'attribute_id' => $attribute->attribute_id, ]); } @@ -182,30 +238,26 @@ class ProductRepository extends BaseRepository { 'images/product/'.$this->model->id.'/'.$name ); - ProductImage::create([ 'product_id' => $this->model->id, + 'type' => $image->type, 'filename' => $name, 'original_name' => $image->original_name, 'ext' => $image->ext, 'mine' => $image->mine, - 'size' => $image->size + 'size' => $image->size, + 'attributes' => $image->attributes + ]); } - return $this->model; } - - - - public function delete() { } - } \ No newline at end of file diff --git a/app/Repositories/UserRepository.php b/app/Repositories/UserRepository.php index e624ed5..b83b31d 100644 --- a/app/Repositories/UserRepository.php +++ b/app/Repositories/UserRepository.php @@ -2,13 +2,17 @@ namespace App\Repositories; -use App\Models\PaymentMethod; -use App\Models\UserAccount; +use Str; use App\User; +use stdClass; +use Validator; +use Carbon\Carbon; +use App\Models\UserAccount; +use App\Models\UserRegister; +use App\Models\PaymentMethod; +use App\Services\UserService; use Illuminate\Support\Facades\Hash; - - class UserRepository extends BaseRepository { @@ -30,8 +34,6 @@ class UserRepository extends BaseRepository { ]); $this->model->payment_methods = PaymentMethod::getDefaultAsArray(); $this->model->save(); - - } else{ $this->model = $this->getById($data['user_id']); @@ -47,8 +49,9 @@ class UserRepository extends BaseRepository { $data['birthday_day'] = isset($data['birthday_day']) ? $data['birthday_day'] : 1; $data['birthday_month'] = isset($data['birthday_month']) ? $data['birthday_month'] : 1; - $data['birthday_year'] = isset($data['birthday_year']) ? $data['birthday_year'] : 1970; - $data['birthday'] = $data['birthday_day'].".".$data['birthday_month'].".".$data['birthday_year']; + $data['birthday_year'] = isset($data['birthday_year']) ? $data['birthday_year'] : 1900; + $data['birthday'] = $data['birthday_day'].".".$data['birthday_month'].".".$data['birthday_year']; + $data['birthday'] = $data['birthday'] == "1.1.1900" ? null : $data['birthday']; $account->fill($data)->save(); @@ -60,29 +63,80 @@ class UserRepository extends BaseRepository { return true; } - public function create($data){ + public function createUserRegister($data){ - $this->model = User::create([ - 'email' => $data['email'], - 'password' => Hash::make($data['password']), + $obj = new stdClass(); + + $obj->email = $data['email']; + $obj->password = Hash::make($data['password']); + $obj->m_salutation = $data['salutation']; + $obj->m_first_name = $data['first_name']; + $obj->m_last_name = $data['last_name']; + $obj->salutation = $data['salutation']; + $obj->first_name = $data['first_name']; + $obj->last_name = $data['last_name']; + $obj->data_protection = now()->toDateTimeString(); + + $obj->confirmation_code_to = date('Y-m-d H:i:s', strtotime('+1 week')); + $obj->confirmation_code_remider = 0; + $obj->m_sponsor = config('app.main_user_id'); + if(isset($data['from_member_id'])){ + $obj->m_sponsor = (int) str_replace('gs', '', $data['from_member_id']) - config('main.add_number_id'); + } + $confirmation_code = UserService::createConfirmationCode(); + $obj->confirmation_code = $confirmation_code; + UserRegister::create([ + 'identifier' => $data['email'], + 'instance' => $confirmation_code, + 'content' => $obj + ]); + return $obj; + } + + public function clearUserRegister(){ + $cleartime = date('Y-m-d H:i:s', strtotime('-1 day')); //gestern -24h + UserRegister::where('created_at', '<', $cleartime)->delete(); + } + + public function create($UserRegister){ + + + $userObj = $UserRegister->content; + + $user = User::create([ + 'email' => $userObj->email, + 'password' =>$userObj->password, ]); $account = UserAccount::create([ - 'm_salutation' => $data['salutation'], - 'm_first_name' => $data['first_name'], - 'm_last_name' => $data['last_name'], - 'salutation' => $data['salutation'], - 'first_name' => $data['first_name'], - 'last_name' => $data['last_name'], - 'data_protection' => now(), + 'm_salutation' => $userObj->salutation, + 'm_first_name' => $userObj->first_name, + 'm_last_name' => $userObj->last_name, + 'salutation' => $userObj->salutation, + 'first_name' => $userObj->first_name, + 'last_name' => $userObj->last_name, + 'data_protection' => $userObj->data_protection, ]); + $user->confirmed = 1; + $user->confirmation_code = null; + $user->confirmation_code_to = null; + $user->confirmation_code_remider = 0; + $user->confirmation_date = now(); + $user->lang = !empty(\App::getLocale()) ? \App::getLocale() : "de"; + $user->m_sponsor = $userObj->m_sponsor; - $this->model->account_id = $account->id; - $this->model->payment_methods = PaymentMethod::getDefaultAsArray(); - $this->model->save(); + $user->account_id = $account->id; + $user->payment_methods = PaymentMethod::getDefaultAsArray(); + $user->save(); + + $user = User::find($user->id); - return $this->model; + //clear + $identifier = $UserRegister->identifier; + UserRegister::where('identifier', $identifier)->delete(); + + return $user; } public function deleteUser(User $user) @@ -108,5 +162,119 @@ class UserRepository extends BaseRepository { return true; } + public function reverse_charge_validate($data, $user, $route){ + + if(isset($data['action']) && $data['action'] == 'reverse_charge_validate'){ + $rules = array( + 'tax_identification_number' => 'required', + ); + $validator = Validator::make($data, $rules); + if ($validator->fails()) { + $data = [ + 'user' => $user, + ]; + return redirect($route)->withErrors($validator)->withInput($data); + } + $ret = $this->reverse_charge_activate($data, $user); + if($ret === 'error'){ + $validator = Validator::make($data, []); + $validator->errors()->add('tax_identification_number_validated', __('msg.VATID_could_not_be_validated')); + $data['reverse_charge'] = 0; + $data = [ + 'user' => $user, + ]; + return redirect($route.'#user-vat-validation')->withErrors($validator)->withInput($data); + } + if($ret === 'valid'){ + \Session()->flash('alert-success', __('msg.VATID_successfully_entered')); + return redirect($route.'#user-vat-validation')->withInput($data); + + return redirect($route.'#user-vat-validation')->withInput($data); + } + } + } + + public function reverse_charge_delete($data, $user, $route){ + if(isset($data['action']) && $data['action'] == 'reverse_charge_delete'){ + $user->account->tax_identification_number = ''; + $user->account->reverse_charge = 0; + $user->account->reverse_charge_code = null; + $user->account->reverse_charge_valid = null; + $user->account->save(); + $data['tax_identification_number'] = ''; + \Session()->flash('alert-success', __('msg.reverse_charge_procedure_and_VATID_deleted')); + return redirect($route.'#user-vat-validation')->withInput($data); + } + } + + public function reverse_charge_activate($data, $user){ + + /* 'AT' => 'AT-Oesterreich', + 'BE' => 'BE-Belgien', + 'BG' => 'BG-Bulgarien', + 'CY' => 'CY-Zypern', + 'CZ' => 'CZ-Tschechische Republik', + 'DE' => 'DE-Deutschland', + 'DK' => 'DK-Dänemark', + 'EE' => 'EE-Estland', + 'EL' => 'EL-Griechenland', + 'ES' => 'ES-Spanien', + 'FI' => 'FI-Finnland', + 'FR' => 'FR-Frankreich ', + 'HR' => 'HR-Kroatien ', + 'HU' => 'HU-Ungarn', + 'IE' => 'IE-Irland', + 'IT' => 'IT-Italien', + 'LT' => 'LT-Litauen', + 'LU' => 'LU-Luxemburg', + 'LV' => 'LV-Lettland', + 'MT' => 'MT-Malta', + 'NL' => 'NL-Niederlande', + 'PL' => 'PL-Polen', + 'PT' => 'PT-Portugal', + 'RO' => 'RO-Rumänien', + 'SE' => 'SE-Schweden', + 'SI' => 'SI-Slowenien', + 'SK' => 'SK-Slowakei', + 'XI' => 'XI-Nordirland', */ + $countryCode = 'DE'; + + if($user->account->country_id){ + $countryCode = $user->account->country->code; + } + + $vatid = str_replace(array(' ', '.', '-', ',', ', '), '', trim($data['tax_identification_number'])); + $cc = substr($vatid, 0, 2); + $vatNo = substr($vatid, 2); + + $options = [ + 'cache_wsdl' => WSDL_CACHE_NONE, + 'trace' => 1, + 'stream_context' => stream_context_create( + [ + 'ssl' => [ + 'verify_peer' => false, + 'verify_peer_name' => false, + 'allow_self_signed' => true + ] + ] + ) + ]; + + $client = new \SoapClient("https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl", $options); + $result = $client->checkVat(['countryCode' => $countryCode, 'vatNumber' => $vatNo]); + + if($result->valid == true) { + $user->account->tax_identification_number = $data['tax_identification_number']; + $user->account->reverse_charge = 1; + $user->account->reverse_charge_code = $countryCode; + $user->account->reverse_charge_valid = now(); + $user->account->save(); + return 'valid'; + } else { + return 'error'; + } + } + } \ No newline at end of file diff --git a/app/Repositories/UserShopRepository.php b/app/Repositories/UserShopRepository.php new file mode 100644 index 0000000..2cc8478 --- /dev/null +++ b/app/Repositories/UserShopRepository.php @@ -0,0 +1,71 @@ +model = $model; + } + + public function update($id, $data) + { + + $data['active'] = isset($data['active']) ? 1 : 0; + $data['pick_up'] = isset($data['pick_up']) ? 1 : 0; + $data['url'] = Util::sanitize($data['user_shop_url'], true, false, true, true); + + $this->model = $this->getById($id); + $this->model->fill($data); + $this->model->save(); + + return $this->model; + } + + public function create(User $user){ + + $user_name = $user->getFullName(false); + $url = Util::sanitize($user_name, true, false, true, true); + $url = $this->makeUniqueURL($url); + UserShop::create([ + 'user_id' => $user->id, + 'url' => $url, + 'name' => __('shop.greetings')." ".$user_name, + 'description' => __('shop.default_description'), + 'about_you' => $user->account->about_you, + 'user_address' => Auth::user()->getFullAddress()."\n".__('shop.default_user_open'), + 'pick_up' => false, + 'active' => true, + 'active_date' => now(), + + ]); + return User::find($user->id); + } + + public function makeUniqueURL($url){ + + $bool = true; + $count = 1; + $unique_url = $url; + while($bool){ + if(UserShop::where('url', $unique_url)->count()){ + $unique_url = $url."_".$count; + $count ++; + }else{ + $bool = false; + } + } + return $unique_url; + } + + +} \ No newline at end of file diff --git a/app/Services/HTMLHelper.php b/app/Services/HTMLHelper.php index ceb7be6..01441c9 100644 --- a/app/Services/HTMLHelper.php +++ b/app/Services/HTMLHelper.php @@ -1,36 +1,40 @@ 'Januar', - 2 => 'Februar', - 3 => 'März', - 4 => 'April', - 5 => 'Mai', - 6 => 'Juni', - 7 => 'Juli', - 8 => 'August', - 9 => 'September', - 10 => 'Oktober', - 11 => 'November', - 12 => 'Dezember', + public static $months = [ + 1 => 'January', + 2 => 'February', + 3 => 'March', + 4 => 'April', + 5 => 'May', + 6 => 'June', + 7 => 'July', + 8 => 'August', + 9 => 'September', + 10 => 'October', + 11 => 'November', + 12 => 'December' ]; + private static $roles = [ 0 => 'Kunde', 1 => 'Redakteur', @@ -45,6 +49,23 @@ class HTMLHelper return self::$months[intval($i)]; } + public static function getTransMonths($full = false){ + $ret = []; + foreach(self::$months as $key=>$val){ + $ret[$key] = trans('cal.months.'.$val); + } + if($full){ //ganzes Jahr + $ret[13] = trans('cal.months.full_year'); + } + return $ret; + } + + public static function getYearRange($start = 2021) + { + $end = date("Y"); + return array_reverse(range($start, $end)); + } + public static function getRoleLabel($role_id = 0){ return ''.self::$roles[$role_id].''; } @@ -150,22 +171,68 @@ class HTMLHelper return $ret; } - public static function getAttributesWithoutParents($id = false, $sameId = false, $all = true){ - $values = Attribute::where('parent_id', null)->get(); + + public static function getAttributeTypes($id = false){ + $values = AttributeType::where('parent_id', null)->where('active', 1)->orderBy('pos', 'asc')->get(); + $ret = ""; + if($id === false){ + $val = $values->first(); + $id = $val->id; + } + foreach ($values as $value){ + + $attr = ($value->id == $id) ? 'selected="selected"' : ''; + $ret .= '\n'; + } + return $ret; + } + + + public static function getProductsWhiteLabelOptions($ids = [], $unsets = [], $type_id = false){ + $values = Product::where('whitelabel', 1)->where('active', 1)->get(); + $ret = ""; + foreach ($values as $value){ + if(is_array($unsets) && in_array($value->id, $unsets)){ + continue; + } + $attr = (is_array($ids) && in_array($value->id, $ids)) ? 'selected="selected"' : ''; + $ret .= '\n'; + } + return $ret; + } + + + public static function getAttributesOptions($ids = array(), $all = true, $type_id = false){ + if($type_id){ + $values = Attribute::where('active', 1)->where('attribute_type_id', $type_id)->get(); + }else{ + $values = Attribute::where('active', 1)->get(); + } $ret = ""; if($all){ $ret .= '\n'; } foreach ($values as $value){ - if($sameId == $value->id){ - continue; - } - $attr = ($value->id == $id) ? 'selected="selected"' : ''; + $attr = in_array($value->id, $ids) ? 'selected="selected"' : ''; $ret .= '\n'; } return $ret; } + public static function getProductAttributesOptions($product_attributes, $ids = [], $all = true, $type_id = false){ + $ret = ""; + if($all){ + $ret .= '\n'; + } + foreach ($product_attributes as $product_attribute){ + if($product_attribute->attribute){ + $attr = (is_array($ids) && in_array($product_attribute->attribute_id, $ids)) ? 'selected="selected"' : ''; + $ret .= '\n'; + } + } + return $ret; + } + public static function getCategoriesWithoutParents($id = false, $sameId = false, $all = true){ $values = Category::where('parent_id', null)->get(); $ret = ""; @@ -211,6 +278,14 @@ class HTMLHelper return $ret; } + public static function getCategoriesByShowOn($show_on = []){ + $values = Category::where('active', true)->whereJsonContains('show_on', $show_on)->orderBy('pos', 'ASC')->get(); + $ret = []; + foreach ($values as $value){ + $ret[$value->id] = ['name' => $value->name, 'count' => $value->getProductsCountOn($show_on)]; + } + return $ret; + } public static function getCategoriesOptionsByShowOn($ids = array(), $all = false, $show_on = []){ $values = Category::where('active', true)->whereJsonContains('show_on', $show_on)->orderBy('pos', 'ASC')->get(); $ret = ""; @@ -219,7 +294,8 @@ class HTMLHelper } foreach ($values as $value){ $attr = in_array($value->id, $ids) ? 'selected="selected"' : ''; - $ret .= '\n'; + $count = $value->getProductsCountOn($show_on); + $ret .= '\n'; } return $ret; } @@ -236,14 +312,14 @@ class HTMLHelper return $ret; } - public static function getAttributesOptions($ids = array(), $all = true){ - $values = Attribute::where('active', 1)->get(); + public static function getLeadTypeOptions($id = false, $all = true){ + $values = LeadType::where('active', 1)->get(); $ret = ""; if($all){ $ret .= '\n'; } foreach ($values as $value){ - $attr = in_array($value->id, $ids) ? 'selected="selected"' : ''; + $attr = ($value->id == $id) ? 'selected="selected"' : ''; $ret .= '\n'; } return $ret; diff --git a/app/Services/Invoice.php b/app/Services/Invoice.php index 4d715a8..e7e0315 100644 --- a/app/Services/Invoice.php +++ b/app/Services/Invoice.php @@ -31,10 +31,18 @@ class Invoice return "/invoice/".\Carbon::parse($invoice_date)->format('Y/m/'); } + public static function getDeliveryStorageDir($invoice_date){ + return "/delivery/".\Carbon::parse($invoice_date)->format('Y/m/'); + } + public static function makeInvoiceFilename($invoice_number){ return "Rechnung-".$invoice_number.".pdf"; } + public static function makeDeliveryFilename($invoice_number){ + return "Lieferschein-".$invoice_number.".pdf"; + } +//invoice public static function isInvoice(ShoppingOrder $shopping_order){ return isset($shopping_order->invoice['filename']) ? true : false; } @@ -54,10 +62,27 @@ class Invoice public static function getNumber($shopping_order){ return isset($shopping_order->invoice['invoice_number']) ? $shopping_order->invoice['invoice_number'] : false; } - - public static function getDownloadURL(ShoppingOrder $shopping_order, $do = false){ - // return route('storage_file', [$shopping_order->id, 'cms_download_file', $do]); +//delivery + public static function isDelivery(ShoppingOrder $shopping_order){ + return isset($shopping_order->delivery['filename']) ? true : false; } + public static function getDeliveryFilename($shopping_order){ + return isset($shopping_order->delivery['filename']) ? $shopping_order->delivery['filename'] : self::makeDeliveryFilename(self::getDeliveryNumber($shopping_order)); + } + + public static function getDeliveryDir($shopping_order){ + return isset($shopping_order->delivery['dir']) ? $shopping_order->delivery['dir'] : self::getDeliveryStorageDir(self::getDeliveryDate($shopping_order)); + } + + public static function getDeliveryDate($shopping_order){ + return isset($shopping_order->delivery['date']) ? $shopping_order->delivery['date'] : self::getDate($shopping_order); + } + + public static function getDeliveryNumber($shopping_order){ + return isset($shopping_order->delivery['number']) ? $shopping_order->delivery['number'] : self::getNumber($shopping_order); + } + + public static function getDownloadPath(ShoppingOrder $shopping_order, $full = false){ $dir = self::getDir($shopping_order); $filename = self::getFilename($shopping_order); @@ -67,6 +92,15 @@ class Invoice return \Storage::disk('public')->path($dir.$filename); } + public static function getDownloadPathDelivery(ShoppingOrder $shopping_order, $full = false){ + $dir = self::getDeliveryDir($shopping_order); + $filename = self::getDeliveryFilename($shopping_order); + if(!$full){ + return $dir.$filename; + } + return \Storage::disk('public')->path($dir.$filename); + } + public static function sendInvoiceMail($shopping_order){ $bcc = []; $billing_email = $shopping_order->shopping_user->billing_email; diff --git a/app/Services/MyLog.php b/app/Services/MyLog.php new file mode 100644 index 0000000..04c9232 --- /dev/null +++ b/app/Services/MyLog.php @@ -0,0 +1,34 @@ +notice($message.' : '.json_encode($data)); + break; + case 'warning': + \Log::channel($channel)->warning($message.' : '.json_encode($data)); + break; + case 'info': + \Log::channel($channel)->info($message.' : '.json_encode($data)); + break; + default: + \Log::channel($channel)->error($message.' : '.json_encode($data)); + break; + } + Mail::to(config('app.exception_mail'))->send(new MailLog($channel, $context, $message, $data)); + } +} + + + diff --git a/app/Services/PDFMerger.php b/app/Services/PDFMerger.php new file mode 100644 index 0000000..e4cc5bf --- /dev/null +++ b/app/Services/PDFMerger.php @@ -0,0 +1,245 @@ +oFilesystem = $oFilesystem; + $this->oFPDI = new FPDI(); + $this->tmpFiles = collect([]); + + $this->init(); + } + + /** + * The class deconstructor method + */ + public function __destruct() { + $oFilesystem = $this->oFilesystem; + $this->tmpFiles->each(function($filePath) use($oFilesystem){ + $oFilesystem->delete($filePath); + }); + } + + /** + * Initialize a new internal instance of FPDI in order to prevent any problems with shared resources + * Please visit https://www.setasign.com/products/fpdi/manual/#p-159 for more information on this issue + * + * @return self + */ + public function init(){ + $this->oFPDI = new FPDI(); + $this->aFiles = collect([]); + return $this; + } + + /** + * Stream the merged PDF content + * + * @return string + */ + public function stream(){ + return $this->oFPDI->Output($this->fileName, 'I'); + } + + /** + * Download the merged PDF content + * + * @return string + */ + public function download(){ + $output = $this->output(); + return new Response($output, 200, [ + 'Content-Type' => 'application/pdf', + 'Content-Disposition' => 'attachment; filename="' . $this->fileName . '"', + 'Content-Length' => strlen($output), + ]); + } + + /** + * Save the merged PDF content to the filesystem + * + * @return string + */ + public function save($filePath = null){ + return $this->oFilesystem->put($filePath?$filePath:$this->fileName, $this->output()); + } + + /** + * Get the merged PDF content + * + * @return string + */ + public function output(){ + return $this->oFPDI->Output($this->fileName, 'S'); + } + + /** + * Set the final filename + * @param string $fileName + * + * @return string + */ + public function setFileName($fileName){ + $this->fileName = $fileName; + return $this; + } + + /** + * Set the final filename + * @param string $string + * @param mixed $pages + * @param mixed $orientation + * + * @return string + */ + public function addString($string, $pages = 'all', $orientation = null){ + + $filePath = storage_path('tmp/'.Str::random(16).'.pdf'); + $this->oFilesystem->put($filePath, $string); + $this->tmpFiles->push($filePath); + + return $this->addPDF($filePath, $pages, $orientation); + } + + /** + * Add a PDF for inclusion in the merge with a valid file path. Pages should be formatted: 1,3,6, 12-16. + * @param string $filePath + * @param string $pages + * @param string $orientation + * + * @return self + * + * @throws \Exception if the given pages aren't correct + */ + public function addPDF($filePath, $pages = 'all', $orientation = null) { + if (file_exists($filePath)) { + if (!is_array($pages) && strtolower($pages) != 'all') { + throw new \Exception($filePath."'s pages could not be validated"); + } + + $this->aFiles->push([ + 'name' => $filePath, + 'pages' => $pages, + 'orientation' => $orientation + ]); + } else { + throw new \Exception("Could not locate PDF on '$filePath'"); + } + + return $this; + } + + /** + * Merges your provided PDFs and outputs to specified location. + * @param string $orientation + * + * @return void + * + * @throws \Exception if there are now PDFs to merge + */ + public function merge($orientation = null) { + $this->doMerge($orientation, false); + } + + /** + * Merges your provided PDFs and adds blank pages between documents as needed to allow duplex printing + * @param string $orientation + * + * @return void + * + * @throws \Exception if there are now PDFs to merge + */ + public function duplexMerge($orientation = 'P') { + $this->doMerge($orientation, true); + } + + protected function doMerge($orientation, $duplexSafe) { + + if ($this->aFiles->count() == 0) { + throw new \Exception("No PDFs to merge."); + } + + $oFPDI = $this->oFPDI; + + $this->aFiles->each(function($file) use($oFPDI, $orientation, $duplexSafe){ + $file['orientation'] = is_null($file['orientation'])?$orientation:$file['orientation']; + $count = $oFPDI->setSourceFile(StreamReader::createByString(file_get_contents($file['name']))); + + if ($file['pages'] == 'all') { + + for ($i = 1; $i <= $count; $i++) { + $template = $oFPDI->importPage($i); + $size = $oFPDI->getTemplateSize($template); + $autoOrientation = isset($file['orientation']) ? $file['orientation'] : $size['orientation']; + + $oFPDI->AddPage($autoOrientation, [$size['width'], $size['height']]); + $oFPDI->useTemplate($template); + } + } else { + foreach ($file['pages'] as $page) { + if (!$template = $oFPDI->importPage($page)) { + throw new \Exception("Could not load page '$page' in PDF '" . $file['name'] . "'. Check that the page exists."); + } + $size = $oFPDI->getTemplateSize($template); + $autoOrientation = isset($file['orientation']) ? $file['orientation'] : $size['orientation']; + + $oFPDI->AddPage($autoOrientation, [$size['width'], $size['height']]); + $oFPDI->useTemplate($template); + } + } + + if ($duplexSafe && $oFPDI->page % 2) { + $oFPDI->AddPage($file['orientation'], [$size['width'], $size['height']]); + } + }); + } +} \ No newline at end of file diff --git a/app/Services/Payment.php b/app/Services/Payment.php index ff89cf2..b4825df 100644 --- a/app/Services/Payment.php +++ b/app/Services/Payment.php @@ -89,6 +89,11 @@ class Payment return ''.self::getFormattedTxaction($shopping_order->txaction).''; } + public static function getPaymentForTypeBadge(ShoppingOrder $shopping_order){ + return ''.$shopping_order->getPaymentForType().''; + + } + public static function getShoppingPaymentBadge(ShoppingPayment $shopping_payment){ if($shopping_payment->mode === 'test'){ return ''.strtoupper($shopping_payment->mode).' - '.self::getFormattedTxaction($shopping_payment->txaction).''; @@ -207,14 +212,13 @@ class Payment } } - //if the order has action - if($shopping_order->shopping_user->is_from === 'user_order' && $shopping_order->shopping_order_margin){ - //is margin -> set paid - $shopping_order->shopping_order_margin->paid = true; - $shopping_order->shopping_order_margin->save(); - } - } + //if the order has action + if(($shopping_order->shopping_user->is_from === 'user_order' || $shopping_order->shopping_user->is_from === 'shopping') && $shopping_order->shopping_order_margin){ + //is margin -> set paid + $shopping_order->shopping_order_margin->order_paid = true; + $shopping_order->shopping_order_margin->save(); + } return $send_link; } @@ -326,6 +330,14 @@ class Payment } } + public static function handelUserShopOrder(ShoppingOrder $shopping_order){ + //no user shop + if($shopping_order->payment_for !== 8 || !$shopping_order->user_shop){ + return; + } + // need something to do? + } + //add or remove form credit, //when done, put it back SalesController public static function handelUserPayCreditsPromotion(PromotionUserOrder $promotion_user_order, $do){ diff --git a/app/Services/Payment/Credits.php b/app/Services/Payment/Credits.php new file mode 100644 index 0000000..0eefc3b --- /dev/null +++ b/app/Services/Payment/Credits.php @@ -0,0 +1,269 @@ +month = 0; + $this->year = 0; + $this->products = []; + $this->objects = []; + } + + public function setFilterVars($month = null, $year = null, $products = null){ + $this->month = $month ? $month : intval(date('m')); + $this->year = $year ? $year : intval(date('Y')); + $this->products = $products; + } + + public function setFilterProducts(){ + + $ShoppingOrders = $this->getShoppingOrdersBy($this->month, $this->year); + $products = []; + foreach($ShoppingOrders as $ShoppingOrder){ + foreach($ShoppingOrder->shopping_order_items as $shopping_order_item){ + if($shopping_order_item->product && !$shopping_order_item->product->exclude_stats_sales && !isset($products[$shopping_order_item->product->id])){ + $products[$shopping_order_item->product->id] = $shopping_order_item->product->name.' # '. + ($shopping_order_item->product->single_commission ? $shopping_order_item->product->value_commission.' / '.$shopping_order_item->product->partner_commission : 'Staffelrabatt'); + } + } + } + return $products; + } + + private function getShoppingOrdersBy($month, $year){ + if($month == '13'){ //all the year + $date_start = Carbon::parse('01.01.'.$year)->format('Y-m-d H:i:s'); + $date_end = Carbon::parse('31.12.'.$year)->endOfMonth()->format('Y-m-d H:i:s'); + }else{ + $date_start = Carbon::parse('01.'.$month.'.'.$year)->format('Y-m-d H:i:s'); + $date_end = Carbon::parse('01.'.$month.'.'.$year)->endOfMonth()->format('Y-m-d H:i:s'); + } + return ShoppingOrder::where('paid', 1)->where('mode', 'live')->whereBetween('created_at', [$date_start, $date_end])->get(); + } + + public function getCollection(){ + + $this->getObjects(); + $collection = collect(); + + foreach($this->objects as $key => $obj){ + $collection->push([ + 'id' => $key, + 'name' => $obj['name'], + 'number' => $obj['number'], + 'qty' => $obj['qty'], + 'total' => $obj['total'], + 'pre_qty' => $obj['pre_qty'], + 'pre_total' => $obj['pre_total'], + 'single_commission' => $obj['single_commission'], + 'value_commission' => $obj['value_commission'], + 'partner_commission' => $obj['partner_commission'], + + ]); + } + return $collection; + } + + public function getObjects(){ + $this->readObjects(); + $this->readObjectsPreview(); + return $this->objects; + } + + private function readObjects() + { + $shoppingOrders = $this->getShoppingOrdersBy($this->month, $this->year); + $this->objects = []; + + $subtotal_full = 0; // gesamtumsatz + $subtotal = 0; // gesamtumsatz ohne rabatte + $discount = 0; // gesamtrabatte + $subtotal_hide = 0; // ausgeschlossene Produkte + + foreach($shoppingOrders as $ShoppingOrder){ + $subtotal_full += $ShoppingOrder->subtotal_full; + $subtotal += $ShoppingOrder->subtotal; + $discount += $ShoppingOrder->discount; + + foreach($ShoppingOrder->shopping_order_items as $shopping_order_item){ + + if($shopping_order_item->product){ + if(!in_array($shopping_order_item->product->id, $this->products) && !$shopping_order_item->product->exclude_stats_sales){ //ausschließen der Produkte über filter und exclude_stats_sales + if(isset($this->objects[$shopping_order_item->product->id])){ + $qty = intval($this->objects[$shopping_order_item->product->id]['qty'] + $shopping_order_item->qty); + $total = round($this->objects[$shopping_order_item->product->id]['total'] + ($shopping_order_item->price_net * $shopping_order_item->qty), 3); + $this->objects[$shopping_order_item->product->id]['qty'] = $qty; + $this->objects[$shopping_order_item->product->id]['total'] = $total; + }else{ + $this->objects[$shopping_order_item->product->id] = [ + 'name' => $shopping_order_item->product->name, + 'number' => $shopping_order_item->product->number, + 'qty' => $shopping_order_item->qty, + 'total' => round($shopping_order_item->price_net * $shopping_order_item->qty, 3), + 'pre_qty' => 0, + 'pre_total' => 0, + 'single_commission' => $shopping_order_item->product->single_commission ? 'Ja' : 'Nein', + 'value_commission' => $shopping_order_item->product->single_commission ? $shopping_order_item->product->value_commission : '', + 'partner_commission' => $shopping_order_item->product->single_commission ? $shopping_order_item->product->partner_commission : '', + + ]; + } + }else{ + $subtotal_hide += $shopping_order_item->price_net * $shopping_order_item->qty; + } + } + } + } + + + + + $this->objects[9990] = [ + 'name' => 'Angezeigter Umsatz netto €', + 'number' => '', + 'qty' => '', + 'total' => round($subtotal_full - $subtotal_hide, 2), + 'pre_qty' => 0, + 'pre_total' => 0, + 'single_commission' => '', + 'value_commission' => '', + 'partner_commission' => '', + + ]; + + $this->objects[9991] = [ + 'name' => 'Ausgeblendeter Umsatz netto €', + 'number' => '', + 'qty' => '', + 'total' => $subtotal_hide, + 'pre_qty' => 0, + 'pre_total' => 0, + 'single_commission' => '', + 'value_commission' => '', + 'partner_commission' => '', + + ]; + + $this->objects[9992] = [ + 'name' => 'Gesamter Umsatz netto € (alle Verkäufe)', + 'number' => '', + 'qty' => '', + 'total' => $subtotal_full, + 'pre_qty' => 0, + 'pre_total' => 0, + 'single_commission' => '', + 'value_commission' => '', + 'partner_commission' => '', + + ]; + + $this->objects[9998] = [ + 'name' => 'Gesamte Rabatte netto € (alle Verkäufe)', + 'number' => '', + 'qty' => '', + 'total' => ($discount), + 'pre_qty' => 0, + 'pre_total' => 0, + 'single_commission' => '', + 'value_commission' => '', + 'partner_commission' => '', + + ]; + + $this->objects[9999] = [ + 'name' => 'Gesamt netto € (alle Verkäufe)', + 'number' => '', + 'qty' => '', + 'total' => ($subtotal), + 'pre_qty' => 0, + 'pre_total' => 0, + 'single_commission' => '', + 'value_commission' => '', + 'partner_commission' => '', + + ]; + + //format total + foreach($this->objects as $key => $obj){ + $this->objects[$key]['total'] = formatNumber($obj['total']); + } + + } + + private function readObjectsPreview(){ + + + $shoppingOrders = $this->getShoppingOrdersBy($this->month, $this->year-1); + + $subtotal_full = 0; // gesamtumsatz + $subtotal = 0; // gesamtumsatz ohne rabatte + $discount = 0; // gesamtrabatte + $subtotal_hide = 0; // ausgeschlossene Produkte + + foreach($shoppingOrders as $ShoppingOrder){ + $subtotal_full += $ShoppingOrder->subtotal_full; + $subtotal += $ShoppingOrder->subtotal; + $discount += $ShoppingOrder->discount; + + foreach($ShoppingOrder->shopping_order_items as $shopping_order_item){ + + if($shopping_order_item->product){ + if(!in_array($shopping_order_item->product->id, $this->products) && !$shopping_order_item->product->exclude_stats_sales){ //ausschließen der Produkte über filter und exclude_stats_sales + if(isset($this->objects[$shopping_order_item->product->id])){ //einsetzen der Zahlen, wenn vorhanden + $qty = intval($this->objects[$shopping_order_item->product->id]['pre_qty'] + $shopping_order_item->qty); + $total = round($this->objects[$shopping_order_item->product->id]['pre_total'] + ($shopping_order_item->price_net * $shopping_order_item->qty), 3); + $this->objects[$shopping_order_item->product->id]['pre_qty'] = $qty; + $this->objects[$shopping_order_item->product->id]['pre_total'] = $total; + }else{ // nicht vorhanden, anlegen + $this->objects[$shopping_order_item->product->id] = [ + 'name' => $shopping_order_item->product->name, + 'number' => $shopping_order_item->product->number, + 'qty' => 0, + 'total' => 0, + 'pre_qty' => $shopping_order_item->qty, + 'pre_total' => round($shopping_order_item->price_net * $shopping_order_item->qty, 3), + 'single_commission' => $shopping_order_item->product->single_commission ? 'Ja' : 'Nein', + 'value_commission' => $shopping_order_item->product->single_commission ? $shopping_order_item->product->value_commission : '', + 'partner_commission' => $shopping_order_item->product->single_commission ? $shopping_order_item->product->partner_commission : '', + + ]; + } + }else{ + //ausgeschlossene Produkte + $subtotal_hide += $shopping_order_item->price_net * $shopping_order_item->qty; + } + } + } + } + + + + + $this->objects[9990]['pre_total'] = round($subtotal_full - $subtotal_hide, 2); + $this->objects[9991]['pre_total'] = $subtotal_hide; + $this->objects[9992]['pre_total'] = $subtotal_full; + $this->objects[9998]['pre_total'] = ($discount); + $this->objects[9999]['pre_total'] = ($subtotal); + + //format total + foreach($this->objects as $key => $obj){ + $this->objects[$key]['pre_total'] = formatNumber($obj['pre_total']); + } + + + } + +} \ No newline at end of file diff --git a/app/Services/Payment/UserBot.php b/app/Services/Payment/UserBot.php new file mode 100644 index 0000000..6d77ee4 --- /dev/null +++ b/app/Services/Payment/UserBot.php @@ -0,0 +1,303 @@ +users = []; + $this->users_pending = []; + } + + + public function readUserHasCredits(){ + + //user by m_sponsor_id die Partner Provisionen haben + $usersWithPartnerCommission = $this->getUsersWithPartnerCommission(false); + + //user die manuelle Gutschriften haben + $usersWithCreditMargin = $this->getUsersWithCreditMargin(); + //user die Shop Provisionen haben + $usersWithShopCommission = $this->getUsersWithShopCommission(false); + + // Alle Benutzer zum Array hinzufügen + $allUsers = $usersWithPartnerCommission->concat($usersWithCreditMargin)->concat($usersWithShopCommission); + foreach ($allUsers as $user) { + //prüfe ob der User Account noch aktiv ist + if(UserHelper::isActiveAccountByID($user->user_id)){ + $this->addUser($user); + } + } + } + + public function readUserHasPendingCredit(){ + //sponsor Users von Provisionen die bezahlt wurden die noch im pending sind + $usersWithPartnerCommissionPending = $this->getUsersWithPartnerCommission(true); + + $usersWithShopCommissionPending = $this->getUsersWithShopCommission(true); + + // Alle Benutzer zum Array hinzufügen + $allUsers = $usersWithPartnerCommissionPending->concat($usersWithShopCommissionPending); + + foreach ($allUsers as $user) { + //prüfe ob der User Account noch aktiv ist + if(UserHelper::isActiveAccountByID($user->user_id)){ + $this->addUserPending($user); + } + } + + + } + public function getUsers(){ + return $this->users; + } + public function getUsersPending(){ + return $this->users_pending; + } + + private function addUser($user){ + // Prüfen, ob Benutzer bereits existiert + if (!isset($this->users[$user->user_id])) { + $this->users[$user->user_id] = $this->createUserCredit($user); + $this->addCreditItems($user->user_id, false); + } + } + + private function addUserPending($user){ + // Prüfen, ob Benutzer bereits existiert + if (!isset($this->users_pending[$user->user_id])) { + $this->users_pending[$user->user_id] = $this->createUserCredit($user); + $this->addCreditItems($user->user_id, true); + } + } + + + + private function addCreditItems($user_id, $isPending){ + // Partner Provisionen hinzufügen + $this->addPartnerCommissionItems($user_id, $isPending); + + // Shop Provisionen hinzufügen + $this->addShopCommissionItems($user_id, $isPending); + + // Wenn es nicht ausstehende Credits sind, füge manuelle Gutschriften hinzu + if (!$isPending) { + $this->addCreditMarginItems($user_id); + } + } + + private function addPartnerCommissionItems($user_id, $isPending){ + + $shoppingOrderMargins = UserMarign::getPartnerCommissionItems($user_id, $isPending); + + if ($isPending) { + $targetArray = 'users_pending'; + } else { + $targetArray = 'users'; + } + + foreach ($shoppingOrderMargins as $shoppingOrderMargin) { + $entry = $this->createCreditEntry($shoppingOrderMargin); + + if ($shoppingOrderMargin->net_partner_commission) { + $entry->price_formatted = $shoppingOrderMargin->getFormattedNetPartnerCommission(); + $entry->price = $shoppingOrderMargin->net_partner_commission; + } + + $this->{$targetArray}[$user_id]->addItem($entry); + + if (!empty($entry->price)) { + $this->{$targetArray}[$user_id]->total += $entry->price; + } + } + } + + private function addShopCommissionItems($user_id, $isPending){ + + $shoppingOrderMargins = UserMarign::getShopCommissionItems($user_id, $isPending); + + if ($isPending) { + $targetArray = 'users_pending'; + } else { + $targetArray = 'users'; + } + + foreach ($shoppingOrderMargins as $shoppingOrderMargin) { + $entry = $this->createCreditEntry($shoppingOrderMargin); + + $entry->delete = $this->addDeleteButton($shoppingOrderMargin->id, 'shopping_order_margin'); + if ($shoppingOrderMargin->net_discount) { + $entry->price_formatted = $shoppingOrderMargin->getFormattedNetDiscount(); + $entry->price = $shoppingOrderMargin->net_discount; + } + + $this->{$targetArray}[$user_id]->addItem($entry); + + if (!empty($entry->price)) { + $this->{$targetArray}[$user_id]->total += $entry->price; + } + } + } + + private function addCreditMarginItems($user_id){ + + $creditMargins = UserMarign::getUserCreditMarginByUserID($user_id); + + foreach ($creditMargins as $creditMargin) { + $entry = new \stdClass(); + $entry->badge = ' '; + $entry->link = '';//route('admin_credits_detail', [$creditMargin->id]); + $entry->name = nl2br($creditMargin->message); + $entry->reference = ''; + $entry->total = ''; + $entry->date = $creditMargin->created_at->format("d.m.Y"); + $entry->price_formatted = formatNumber($creditMargin->credit); + $entry->price = $creditMargin->credit; + $entry->delete = $this->addDeleteButton($creditMargin->id, 'user_credit_margin', $creditMargin->deleteTime()); + + $this->users[$user_id]->addItem($entry); + + if (!empty($entry->price)) { + $this->users[$user_id]->total += $entry->price; + } + } + } + + private function createCreditEntry($shoppingOrderMargin){ + $entry = new \stdClass(); + $entry->badge = \App\Services\Payment::getPaymentForTypeBadge($shoppingOrderMargin->shopping_order); + + if ($shoppingOrderMargin->shopping_order->payment_for === 7 || $shoppingOrderMargin->shopping_order->payment_for === 8) { + $entry->link = route('admin_sales_customers_detail', [$shoppingOrderMargin->shopping_order->id]); + } else { + $entry->link = route('admin_sales_users_detail', [$shoppingOrderMargin->shopping_order->id]); + } + + $entry->name = $shoppingOrderMargin->shopping_order->shopping_user->billing_firstname . " " . + $shoppingOrderMargin->shopping_order->shopping_user->billing_lastname; + $entry->reference = $shoppingOrderMargin->shopping_order->getLastShoppingPayment('reference'); + $entry->total = $shoppingOrderMargin->shopping_order->getFormattedTotalWithoutCredit() . " €"; + $entry->date = $shoppingOrderMargin->shopping_order->created_at->format("d.m.Y"); + + return $entry; + } + + private function addDeleteButton($id, $type, $deleteTime = false){ + if($type === 'shopping_order_margin'){ + return ' +
+ + + '; + } + if($type === 'user_credit_margin'){ + if($deleteTime){ + return ' + + + noch '. $deleteTime .' min. + '; + } + } + return ''; + } + + /** + * Gibt User mit Partner Provisionen zurück + * + * @param bool $isPending True für künftige Provisionen, False für fällige Provisionen + * @return \Illuminate\Database\Eloquent\Collection + */ + private function getUsersWithPartnerCommission(bool $isPending) + { + $query = ShoppingOrderMargin::join('users', 'm_sponsor_id', '=', 'users.id') + ->groupBy('m_sponsor_id') + ->join('user_accounts', 'account_id', '=', 'user_accounts.id') + ->select('users.id as user_id', 'users.email', 'user_accounts.first_name', 'user_accounts.last_name') + ->whereOrderPaid(true) + ->whereOutPaid(false) + ->whereCancellation(false) + ->wherePartnerCommissionPaid(false) + ->whereNotNull('partner_commission_pending_to'); + + if ($isPending) { + $query->where('partner_commission_pending_to', '>=', Carbon::now()); + } else { + $query->where('partner_commission_pending_to', '<', Carbon::now()); + } + + return $query->get(); + } + + /** + * Gibt User mit Shop Provisionen zurück + * + * @param bool $isPending True für künftige Provisionen, False für fällige Provisionen + * @return \Illuminate\Database\Eloquent\Collection + */ + private function getUsersWithShopCommission(bool $isPending) + { + $query = ShoppingOrderMargin::join('users', 'user_id', '=', 'users.id') + ->groupBy('user_id') + ->join('user_accounts', 'account_id', '=', 'user_accounts.id') + ->select('users.id as user_id', 'users.email', 'user_accounts.first_name', 'user_accounts.last_name') + ->whereOrderPaid(true) + ->whereOutPaid(false) + ->whereCancellation(false) + ->whereMarginPaid(false) + ->whereNotNull('margin_pending_to'); + + if ($isPending) { + $query->where('margin_pending_to', '>=', Carbon::now()); + } else { + $query->where('margin_pending_to', '<', Carbon::now()); + } + + return $query->get(); + } + + /** + * Gibt User mit manuellen Gutschriften zurück + * + * @return \Illuminate\Database\Eloquent\Collection + */ + private function getUsersWithCreditMargin() + { + return UserCreditMargin::join('users', 'user_id', '=', 'users.id') + ->join('user_accounts', 'account_id', '=', 'user_accounts.id') + ->select('user_id', 'users.email', 'user_accounts.first_name', 'user_accounts.last_name') + ->wherePaid(false) + ->get(); + } + + /** + * Erstellt ein neues UserCredits-Objekt + * + * @param object $user Benutzerdaten + * @return UserCredits + */ + private function createUserCredit($user) + { + $userCredit = new UserCredits(); + $userCredit->email = $user->email; + $userCredit->first_name = $user->first_name; + $userCredit->last_name = $user->last_name; + $userCredit->user_id = $user->user_id; + $userCredit->total = 0; + + return $userCredit; + } +} \ No newline at end of file diff --git a/app/Services/Payment/UserCredits.php b/app/Services/Payment/UserCredits.php new file mode 100644 index 0000000..7316df7 --- /dev/null +++ b/app/Services/Payment/UserCredits.php @@ -0,0 +1,33 @@ +items = []; + } + + + public function addItem($entry){ + $this->items[] = $entry; + } + + + +} \ No newline at end of file diff --git a/app/Services/ProductImage.php b/app/Services/ProductImage.php new file mode 100644 index 0000000..18aaa41 --- /dev/null +++ b/app/Services/ProductImage.php @@ -0,0 +1,103 @@ +id]); + $storage_path = 'images/product/'.$model->id; + + } + if($relation === 'user_wl_product'){ + $show = Request::get('show'); + $route = route('admin_lead_edit', [$model->user_id])."?show=".$show; + $storage_path = 'images/user_product/'.$model->id; + } + + try { + $image = \App\Services\Slim::getImages('images')[0]; + + if ( isset($image['output']['data']) ) + { + // Base64 of the image + $data = $image['output']['data']; + $file_ex = array( 'image/jpeg' => 'jpg', 'image/png' => 'png'); + + if (!isset($file_ex[$image['output']['type']])) { + \Session()->flash('alert-danger', 'File is not jpg or png!'); + return redirect($route); + } + + $ext = $file_ex[$image['output']['type']]; + // Original file name + $name = $image['output']['name']; + $name = \App\Services\Slim::sanitizeFileName($name); + $name = uniqid() . '_' . $name; + + $data = \Storage::disk('public')->put( + $storage_path.'/'.$name, + $data + ); + + ProductImageModel::create([ + 'product_id' => $relation === 'product' ? $model->id : null, + 'user_wl_product_id' => $relation === 'user_wl_product' ? $model->id : null, + 'type' => $upload_type, + 'filename' => $name, + 'original_name' => $image['output']['name'], + 'ext' => $ext, + 'mine' => $image['output']['type'], + 'size' => $image['input']['size'] + ]); + + + \Session()->flash('alert-success', "Datei hochgeladen"); + return redirect($route); + } + \Session()->flash('alert-danger', "Datei leer"); + return redirect($route); + + } + catch (\Exception $e) { + \Session()->flash('alert-danger', "Fehler".$e); + return redirect($route); + } + } + + public static function imageDelete($relation, $model, $product_image_id, $redirect = true){ + + $route = "/"; + if($relation === 'product'){ + $route = route('admin_product_edit', [$model->id]); + $storage_path = 'images/product/'.$model->id; + + } + if($relation === 'user_wl_image'){ + $show = Request::get('show'); + $route = route('admin_lead_edit', [$model->user_id])."?show=".$show; + $storage_path = 'images/user_wl_product/'.$model->id; + } + + $product_image = ProductImageModel::findOrFail($product_image_id); + if($product_image->product_id == $model->id || $product_image->user_wl_product_id == $model->id){ + $file = $storage_path.'/'.$product_image->filename; + \Storage::disk('public')->delete($file); + $product_image->delete(); + \Session()->flash('alert-success', "Datei gelöscht"); + return $redirect ? redirect($route) : true; + + } + \Session()->flash('alert-danger', "Datei nicht gefunden"); + return $redirect ? redirect($route) : true; + + } + + +} \ No newline at end of file diff --git a/app/Services/Shop.php b/app/Services/Shop.php index e150394..f40cfab 100644 --- a/app/Services/Shop.php +++ b/app/Services/Shop.php @@ -1,14 +1,26 @@ where('txaction', 'paid')->OrWhere('txaction', 'appointed')->OrWhere('txaction', 'extern')->OrWhere('txaction', 'invoice_open')->OrWhere('txaction', 'invoice_paid'); @@ -43,7 +55,6 @@ class Shop } } - public static function getShippingCountryCountryId($shipping_country_id){ $shippingCountry = ShippingCountry::find($shipping_country_id); if($shippingCountry && $shippingCountry->country){ @@ -57,10 +68,258 @@ class Shop if($shippingCountry){ return $shippingCountry->id; } - if($ShippingCountry = ShippingCountry::all()->first()){ - $ShippingCountry->id; - } - return 1; + return ShippingCountry::all()->first()->id; } + public static function initUserShopLang($country){ + Yard::instance('shopping')->destroy(); + \Session::put('user_shop_lang', strtolower($country->code)); + //init Yard + self::initUserShopYard($country); + + } + + public static function initUserShopYard($country){ + //Lieferadresse im Drittland? + self::$user_tax_free = $country->supply_country ? true : false; + $ShippingCountry = ShippingCountry::whereCountryId($country->id)->first(); + self::$shipping_free = $ShippingCountry->shipping->free; + self::$shipping_country = $ShippingCountry; + self::$user_country = $country; + + Yard::instance('shopping')->setShippingCountryWithPrice($ShippingCountry->id); + Yard::instance('shopping')->setUserPriceInfos(Shop::getShopYardInfo()); + } + + + public static function getShopYardInfo(){ + return [ + 'user_tax_free' => self::$user_tax_free, + 'shipping_free' => self::$shipping_free, + 'user_reverse_charge' => self::$user_reverse_charge, + 'user_country_id' => self::$user_country->id, + 'shipping_country_id' => self::$shipping_country->id, + ]; + } + + public static function checkShoppingUser($id, $user){ + if($id === null){ + abort(403, 'Error: Keine User ID'); + } + $shopping_user = ShoppingUser::findOrFail($id); + if($shopping_user->member_id !== $user->id){ + abort(403, 'Error: Falsche User ID'); + } + $shopping_user = ShoppingUser::findOrFail($id); + if($shopping_user->is_like){ + abort(403, 'Error: Kunde in Prüfung'); + } + return $shopping_user; + } + + public static function checkShoppingCountry($for, $id=null){ + $country_id = null; + if($for === 'me' || $for === 'mp' || $for === 'cr'){ + $user = User::find(\Auth::user()->id); + if($user->account->same_as_billing){ + $country_id = $user->account->country_id; + }else{ + $country_id = $user->account->shipping_country_id; + } + } + if(strpos($for, 'ot') !== false && $id){ + $shopping_user = ShoppingUser::findOrFail($id); + if($shopping_user->same_as_billing){ + $country_id = $shopping_user->billing_country->id; + }else{ + $country_id = $shopping_user->shipping_country->id; + } + } + if($country_id){ + if($shipping_country = ShippingCountry::whereCountryId($country_id)->first()){ + if($shipping_country->shipping && $shipping_country->shipping->active){ + return $shipping_country->id; + } + + } + } + return false; + } + + public static function getShippingPriceByShippingCountryId($shipping_country_id, $shipping_weight){ + $shippingCountry = ShippingCountry::find($shipping_country_id); + if(!$shippingCountry){ + abort(403, 'Fehler: Versandland nicht gefunden'); + } + if(!isset($shippingCountry->shipping) && count($shippingCountry->shipping->shipping_prices) === 0){ + abort(403, 'Fehler: Kein Preise für das Versandland angelegt'); + } + $shipping_price = $shippingCountry->shipping->shipping_prices->first(); + if(!$shipping_price){ + abort(403, 'Fehler: Preis vom Versandland nicht gefunden'); + } + + /*if(!$shipping_weight){ + abort(403, 'Fehler: Kein Versandgewicht'); + }*/ + + if($shipping_weight == 0){ + $shipping_price->price = 0; + $shipping_price->price_comp = 0; + return $shipping_price; + } + + if($shipping_weight > 0){ + /* + if($this->shipping_free && $this->total(2, '.', '') >= $this->shipping_free){ + if($this->weightByFreeShipping() == 0){ + $shipping_price->price = 0; + $shipping_price->price_comp = 0; + }else{ + $shipping_price = $this->shippingPriceByWeight($shipping->shipping_prices, $this->weightByFreeShipping()); + } + + }else{ + */ + + return self::shippingPriceByWeight($shippingCountry->shipping->shipping_prices, $shipping_weight); + } + /*if($this->weight() == 0){ + + }else{ + + $shipping_price = $this->shippingPriceByWeight($shipping->shipping_prices, $this->weight()); + //first by price + //$shipping_price = $this->shippingPriceByTotal($shipping->shipping_prices, $this->total(2, '.', '')); + //sec by weight + //if(!$shipping_price){ + //} + } + //default + + }*/ + + } + + public static function shippingPriceByWeight($shipping_prices, $shipping_weight){ + foreach ($shipping_prices as $price){ + if($price->weight_from == 0 && $price->weight_to == 0){ + return $price; + } + if($price->weight_from > 0 && $price->weight_to > 0){ + if($shipping_weight >= $price->weight_from && $shipping_weight <= $price->weight_to){ + return $price; + } + } + } + abort(403, 'Fehler: Preis nach Gewicht im Versandland nicht gefunden'); + } + + public static function calculateUserShopMargins($userShop = null, $promotionUser = null){ //'shop' or 'prom' + // return; + if($userShop){ + $user = $userShop->user; + } + if($promotionUser){ + $user = $promotionUser->user; + } + if(!isset($user)){ + return; + } + Yard::setUser($user); + //get user monthy amount + $monthy_amount = UserMarign::getMontlyAmount($user); + $content = Yard::getCartContent(); + /*single + partner Commissions */ + //get price net commission, add amount, partner (total) from products is single_commission + $yard_commission = new Commission(); + $yard_commission = $content->reduce(function ($yard_commission, CartItem $cartItem) { + $price_net = $cartItem->price / ((100 + $cartItem->taxRate) / 100); + //nicht vom Staffelrabatt -> extra Rabatt / Provision + if($cartItem->options->single_commission){ + $value_commission = $price_net / 100 * $cartItem->options->value_commission; + $partner_commission = $price_net / 100 * $cartItem->options->partner_commission; + + $price_net_commission = ($cartItem->qty * $price_net) - ($cartItem->qty * $value_commission); + $yard_commission->single_price_net += ($cartItem->qty * $price_net); + $yard_commission->single_value_commission += ($cartItem->qty * $value_commission); + if(Yard::sponsorHasCommisson()){ + $yard_commission->single_partner_commission += ($cartItem->qty * $partner_commission); + } + $yard_commission->single_price_net_commission += $price_net_commission; + // + if($cartItem->options->amount_commission){ + $yard_commission->single_amount_commission += $price_net_commission; + } + }else{ + $yard_commission->price_net = $yard_commission->price_net + ($cartItem->qty * $price_net); + } + return $yard_commission; + }, $yard_commission); + + //dump($monthy_amount); + //add to $monthy_amount für max level margins + $start_monthy_amount = $monthy_amount + $yard_commission->single_amount_commission; + $end_monthy_amount = $start_monthy_amount + $yard_commission->price_net; + + //dump($start_monthy_amount); + //dump($end_monthy_amount); + + $margin = new Margin(); + $rest_amount = 0; + $range = 0; + $price_net = $yard_commission->price_net; + if($yard_commission->price_net > 0 && $user && $user->user_level && $user->user_level->user_level_margins){ + foreach ($user->user_level->user_level_margins_re as $user_level_margin) { + //total split? + if ($end_monthy_amount >= $user_level_margin->price_from) { + if(!isset($balance)){ + if($start_monthy_amount >= $user_level_margin->price_from){ + $balance = $yard_commission->price_net; + $rest_amount = 0; + }else{ + $balance = $end_monthy_amount - $user_level_margin->price_from; + $rest_amount = $end_monthy_amount - ($start_monthy_amount + $balance); + } + }else{ + if(isset($last_limit)){ + $range = $last_limit - $user_level_margin->price_from; + if($rest_amount >= $range){ + $balance = $range; + }else{ + $balance = $rest_amount; + } + $rest_amount = $rest_amount - $balance; + } + } + + $last_limit = $user_level_margin->price_from; + if($balance != 0){ + $commission = 0; + if($user->sponsorHasCommisson()){ + $commission = $user_level_margin->commission; + } + $margin->add($user_level_margin->price_from, [ + 'price_net' => $price_net, + 'range' => $range, + 'rest_amount' => $rest_amount, + 'balance' => $balance, + 'trading_margin' => $user_level_margin->trading_margin, + 'commission' => $commission, + ]); + } + } + } + } + + $margin->setCommission($yard_commission); + $margin->calculate(); + //$this->yard_margin = $margin; + $ret = new stdClass(); + + $ret->yard_margin = $margin; + $ret->yard_commission = $yard_commission; + return $ret; + } + } \ No newline at end of file diff --git a/app/Services/Stats/Sales.php b/app/Services/Stats/Sales.php new file mode 100644 index 0000000..0eefc3b --- /dev/null +++ b/app/Services/Stats/Sales.php @@ -0,0 +1,269 @@ +month = 0; + $this->year = 0; + $this->products = []; + $this->objects = []; + } + + public function setFilterVars($month = null, $year = null, $products = null){ + $this->month = $month ? $month : intval(date('m')); + $this->year = $year ? $year : intval(date('Y')); + $this->products = $products; + } + + public function setFilterProducts(){ + + $ShoppingOrders = $this->getShoppingOrdersBy($this->month, $this->year); + $products = []; + foreach($ShoppingOrders as $ShoppingOrder){ + foreach($ShoppingOrder->shopping_order_items as $shopping_order_item){ + if($shopping_order_item->product && !$shopping_order_item->product->exclude_stats_sales && !isset($products[$shopping_order_item->product->id])){ + $products[$shopping_order_item->product->id] = $shopping_order_item->product->name.' # '. + ($shopping_order_item->product->single_commission ? $shopping_order_item->product->value_commission.' / '.$shopping_order_item->product->partner_commission : 'Staffelrabatt'); + } + } + } + return $products; + } + + private function getShoppingOrdersBy($month, $year){ + if($month == '13'){ //all the year + $date_start = Carbon::parse('01.01.'.$year)->format('Y-m-d H:i:s'); + $date_end = Carbon::parse('31.12.'.$year)->endOfMonth()->format('Y-m-d H:i:s'); + }else{ + $date_start = Carbon::parse('01.'.$month.'.'.$year)->format('Y-m-d H:i:s'); + $date_end = Carbon::parse('01.'.$month.'.'.$year)->endOfMonth()->format('Y-m-d H:i:s'); + } + return ShoppingOrder::where('paid', 1)->where('mode', 'live')->whereBetween('created_at', [$date_start, $date_end])->get(); + } + + public function getCollection(){ + + $this->getObjects(); + $collection = collect(); + + foreach($this->objects as $key => $obj){ + $collection->push([ + 'id' => $key, + 'name' => $obj['name'], + 'number' => $obj['number'], + 'qty' => $obj['qty'], + 'total' => $obj['total'], + 'pre_qty' => $obj['pre_qty'], + 'pre_total' => $obj['pre_total'], + 'single_commission' => $obj['single_commission'], + 'value_commission' => $obj['value_commission'], + 'partner_commission' => $obj['partner_commission'], + + ]); + } + return $collection; + } + + public function getObjects(){ + $this->readObjects(); + $this->readObjectsPreview(); + return $this->objects; + } + + private function readObjects() + { + $shoppingOrders = $this->getShoppingOrdersBy($this->month, $this->year); + $this->objects = []; + + $subtotal_full = 0; // gesamtumsatz + $subtotal = 0; // gesamtumsatz ohne rabatte + $discount = 0; // gesamtrabatte + $subtotal_hide = 0; // ausgeschlossene Produkte + + foreach($shoppingOrders as $ShoppingOrder){ + $subtotal_full += $ShoppingOrder->subtotal_full; + $subtotal += $ShoppingOrder->subtotal; + $discount += $ShoppingOrder->discount; + + foreach($ShoppingOrder->shopping_order_items as $shopping_order_item){ + + if($shopping_order_item->product){ + if(!in_array($shopping_order_item->product->id, $this->products) && !$shopping_order_item->product->exclude_stats_sales){ //ausschließen der Produkte über filter und exclude_stats_sales + if(isset($this->objects[$shopping_order_item->product->id])){ + $qty = intval($this->objects[$shopping_order_item->product->id]['qty'] + $shopping_order_item->qty); + $total = round($this->objects[$shopping_order_item->product->id]['total'] + ($shopping_order_item->price_net * $shopping_order_item->qty), 3); + $this->objects[$shopping_order_item->product->id]['qty'] = $qty; + $this->objects[$shopping_order_item->product->id]['total'] = $total; + }else{ + $this->objects[$shopping_order_item->product->id] = [ + 'name' => $shopping_order_item->product->name, + 'number' => $shopping_order_item->product->number, + 'qty' => $shopping_order_item->qty, + 'total' => round($shopping_order_item->price_net * $shopping_order_item->qty, 3), + 'pre_qty' => 0, + 'pre_total' => 0, + 'single_commission' => $shopping_order_item->product->single_commission ? 'Ja' : 'Nein', + 'value_commission' => $shopping_order_item->product->single_commission ? $shopping_order_item->product->value_commission : '', + 'partner_commission' => $shopping_order_item->product->single_commission ? $shopping_order_item->product->partner_commission : '', + + ]; + } + }else{ + $subtotal_hide += $shopping_order_item->price_net * $shopping_order_item->qty; + } + } + } + } + + + + + $this->objects[9990] = [ + 'name' => 'Angezeigter Umsatz netto €', + 'number' => '', + 'qty' => '', + 'total' => round($subtotal_full - $subtotal_hide, 2), + 'pre_qty' => 0, + 'pre_total' => 0, + 'single_commission' => '', + 'value_commission' => '', + 'partner_commission' => '', + + ]; + + $this->objects[9991] = [ + 'name' => 'Ausgeblendeter Umsatz netto €', + 'number' => '', + 'qty' => '', + 'total' => $subtotal_hide, + 'pre_qty' => 0, + 'pre_total' => 0, + 'single_commission' => '', + 'value_commission' => '', + 'partner_commission' => '', + + ]; + + $this->objects[9992] = [ + 'name' => 'Gesamter Umsatz netto € (alle Verkäufe)', + 'number' => '', + 'qty' => '', + 'total' => $subtotal_full, + 'pre_qty' => 0, + 'pre_total' => 0, + 'single_commission' => '', + 'value_commission' => '', + 'partner_commission' => '', + + ]; + + $this->objects[9998] = [ + 'name' => 'Gesamte Rabatte netto € (alle Verkäufe)', + 'number' => '', + 'qty' => '', + 'total' => ($discount), + 'pre_qty' => 0, + 'pre_total' => 0, + 'single_commission' => '', + 'value_commission' => '', + 'partner_commission' => '', + + ]; + + $this->objects[9999] = [ + 'name' => 'Gesamt netto € (alle Verkäufe)', + 'number' => '', + 'qty' => '', + 'total' => ($subtotal), + 'pre_qty' => 0, + 'pre_total' => 0, + 'single_commission' => '', + 'value_commission' => '', + 'partner_commission' => '', + + ]; + + //format total + foreach($this->objects as $key => $obj){ + $this->objects[$key]['total'] = formatNumber($obj['total']); + } + + } + + private function readObjectsPreview(){ + + + $shoppingOrders = $this->getShoppingOrdersBy($this->month, $this->year-1); + + $subtotal_full = 0; // gesamtumsatz + $subtotal = 0; // gesamtumsatz ohne rabatte + $discount = 0; // gesamtrabatte + $subtotal_hide = 0; // ausgeschlossene Produkte + + foreach($shoppingOrders as $ShoppingOrder){ + $subtotal_full += $ShoppingOrder->subtotal_full; + $subtotal += $ShoppingOrder->subtotal; + $discount += $ShoppingOrder->discount; + + foreach($ShoppingOrder->shopping_order_items as $shopping_order_item){ + + if($shopping_order_item->product){ + if(!in_array($shopping_order_item->product->id, $this->products) && !$shopping_order_item->product->exclude_stats_sales){ //ausschließen der Produkte über filter und exclude_stats_sales + if(isset($this->objects[$shopping_order_item->product->id])){ //einsetzen der Zahlen, wenn vorhanden + $qty = intval($this->objects[$shopping_order_item->product->id]['pre_qty'] + $shopping_order_item->qty); + $total = round($this->objects[$shopping_order_item->product->id]['pre_total'] + ($shopping_order_item->price_net * $shopping_order_item->qty), 3); + $this->objects[$shopping_order_item->product->id]['pre_qty'] = $qty; + $this->objects[$shopping_order_item->product->id]['pre_total'] = $total; + }else{ // nicht vorhanden, anlegen + $this->objects[$shopping_order_item->product->id] = [ + 'name' => $shopping_order_item->product->name, + 'number' => $shopping_order_item->product->number, + 'qty' => 0, + 'total' => 0, + 'pre_qty' => $shopping_order_item->qty, + 'pre_total' => round($shopping_order_item->price_net * $shopping_order_item->qty, 3), + 'single_commission' => $shopping_order_item->product->single_commission ? 'Ja' : 'Nein', + 'value_commission' => $shopping_order_item->product->single_commission ? $shopping_order_item->product->value_commission : '', + 'partner_commission' => $shopping_order_item->product->single_commission ? $shopping_order_item->product->partner_commission : '', + + ]; + } + }else{ + //ausgeschlossene Produkte + $subtotal_hide += $shopping_order_item->price_net * $shopping_order_item->qty; + } + } + } + } + + + + + $this->objects[9990]['pre_total'] = round($subtotal_full - $subtotal_hide, 2); + $this->objects[9991]['pre_total'] = $subtotal_hide; + $this->objects[9992]['pre_total'] = $subtotal_full; + $this->objects[9998]['pre_total'] = ($discount); + $this->objects[9999]['pre_total'] = ($subtotal); + + //format total + foreach($this->objects as $key => $obj){ + $this->objects[$key]['pre_total'] = formatNumber($obj['pre_total']); + } + + + } + +} \ No newline at end of file diff --git a/app/Services/Type.php b/app/Services/Type.php index 3955601..758b60e 100644 --- a/app/Services/Type.php +++ b/app/Services/Type.php @@ -14,6 +14,7 @@ class Type 4 => 'Nur Mitgliedschaft Vertriebspartner', //5 => 'Onboarding Vertriebspartner', 6 => 'Guthaben aufladen', + 8 => 'Shop', 7 => 'zur internen Berechnung', ]; @@ -25,7 +26,10 @@ class Type 4 => 'Registrierung Vertriebspartner', 5 => 'Mitgliedschaft Vertriebspartner', 6 => 'Guthaben aufladen', + 8 => 'Shop', 10 => 'zur internen Berechnung', + 11 => 'Kompensationprodukt beim Versand', + ]; @@ -50,4 +54,13 @@ class Type ]; + public static $shoppingIsFor = [ + 'ME' => 'Ware ist für mich und wird an meine Adresse versandt', + 'OT' => 'Ware ist für einen Kunden und wird an den Kunden versandt', + 'MP' => 'Ware ist für mich und ich hole die Ware selbst ab', + 'CR' => 'Mein Guthaben aufladen', + 'pr' => 'promoation', + 'us' => 'shops', + ]; + } \ No newline at end of file diff --git a/app/Services/PromotionCart.php b/app/Services/UserCart.php similarity index 61% rename from app/Services/PromotionCart.php rename to app/Services/UserCart.php index b455536..d55d3e0 100644 --- a/app/Services/PromotionCart.php +++ b/app/Services/UserCart.php @@ -5,7 +5,8 @@ use Yard; use App\Models\Product; use App\Models\ShippingCountry; -class PromotionCart + +class UserCart { public static $points = 0; @@ -13,18 +14,25 @@ class PromotionCart public static $price_net = 0; public static $ek_price = 0; public static $income_price = 0; + public static $max_qty= 100; + + public static $yard_margin; + public static $yard_commission; + - public static function initYard(){ + public static function initYard($for='shop', $userShop = null, $promotionUser = null){ $id = 1; if($ShippingCountry = ShippingCountry::all()->first()){ $id = $ShippingCountry->id; } - Yard::instance('shopping')->setShippingCountryWithPrice($id, 'shop'); + // Yard::instance('shopping')->destroy(); + + Yard::instance('shopping')->setShippingCountryWithPrice($id, $for); //'shop' or 'prom' } - public static function getCurrentShippingPrice($shipping_for = 2) //shipping_for === microsite + public static function getCurrentShippingPrice($shipping_for = 2) //shipping_for === 2 promotion , 3 shop { $shipping = Yard::instance('shopping')->shipping(); if($shipping > 0){ @@ -56,19 +64,19 @@ class PromotionCart } - public static function changeStateShipping($data) + public static function changeStateShipping($data, $for='shop') { $id = 1; if($ShippingCountry = ShippingCountry::find($data['shipping_country_id'])){ $id = $ShippingCountry->id; } - Yard::instance('shopping')->setShippingCountryWithPrice($id, 'shop'); + Yard::instance('shopping')->setShippingCountryWithPrice($id, $for); //'shop' or 'prom' } - public static function updateProduct($data, $add=false) + public static function updateProduct($data, $add=false, $minus=false) { if($product = Product::find($data['product_id'])){ $image = ""; @@ -76,23 +84,46 @@ class PromotionCart $image = $product->images->first()->slug; } - //get the card item + //get the card item or add 1 $cartItem = Yard::instance('shopping')->add($product->id, $product->getLang('name'), 1, $product->price, $product->tax, [ 'image' => $image, 'slug' => $product->slug, 'weight' => $product->weight, + 'single_commission' => $product->single_commission, + 'amount_commission' => $product->amount_commission, + 'value_commission' => $product->value_commission, + 'partner_commission' => $product->partner_commission, ]); - Yard::setTax($cartItem->rowId, $product->tax); - if(!$add){ + Yard::setTax($cartItem->rowId, $product->tax); + //remove one from Card or remove it + if($minus){ + if(intval($cartItem->qty) <= 2){ + Yard::instance('shopping')->update($cartItem->rowId, intval($cartItem->qty)-2); + + //Yard::instance('shopping')->remove($cartItem->rowId); + }else{ + // > 1 + Yard::instance('shopping')->update($cartItem->rowId, intval($cartItem->qty)-2); + + } + } + //update Card set product by qty or remove it + if(!$add && !$minus){ if(isset($data['qty']) && $data['qty'] > 0){ Yard::instance('shopping')->update($cartItem->rowId, $data['qty']); }else{ //if 0 get the item by qty:1 and remove it - Yard::instance('shopping')->remove($cartItem->rowId); + Yard::instance('shopping')->update($cartItem->rowId, $data['qty']); + + //Yard::instance('shopping')->remove($cartItem->rowId); } } + //max 100 + if($cartItem->qty > self::$max_qty){ + Yard::instance('shopping')->update($cartItem->rowId, self::$max_qty); + } Yard::instance('shopping')->reCalculate(); return $cartItem->qty; } @@ -117,12 +148,16 @@ class PromotionCart } $cartItem = Yard::instance('shopping')->add($product->id, $product->getLang('name'), 1, 0, 0, [ - 'image' => $image, - 'slug' => $product->slug, - //'weight' => $product->weight, - 'weight' => 1, - 'free_product_id' => intval($data['free_product_id']), - 'product_id' => $product->id + 'image' => $image, + 'slug' => $product->slug, + //'weight' => $product->weight, + 'weight' => 1, + 'free_product_id' => intval($data['free_product_id']), + 'product_id' => $product->id, + 'single_commission' => 0, + 'amount_commission' => 0, + 'value_commission' => 0, + 'partner_commission' => 0, ]); Yard::setTax($cartItem->rowId, 0); Yard::instance('shopping')->reCalculate(); @@ -131,5 +166,4 @@ class PromotionCart } } - } \ No newline at end of file diff --git a/app/Services/UserHelper.php b/app/Services/UserHelper.php new file mode 100644 index 0000000..83b6796 --- /dev/null +++ b/app/Services/UserHelper.php @@ -0,0 +1,40 @@ +active == 1 && $user->blocked == 0) ? true : false; + } + + + public static function isActiveAccount(User $user){ + + if(self::isActive($user) && $user->payment_account){ + return Carbon::parse($user->payment_account)->gt(Carbon::now()); + } + return false; + } + + public static function isActiveAccountByID($user_id){ + $user = User::find($user_id); + return self::isActiveAccount($user); + } + + public static function isActiveByID($user_id){ + $user = User::find($user_id); + return self::isActive($user); + } + +} \ No newline at end of file diff --git a/app/Services/UserMarign.php b/app/Services/UserMarign.php index 1160505..4cdd071 100644 --- a/app/Services/UserMarign.php +++ b/app/Services/UserMarign.php @@ -18,7 +18,7 @@ class UserMarign $sum_net_amount = ShoppingOrderMargin::whereUserId($user->id) ->whereBetween('from', [$startDay, $endDay]) - ->wherePaid(true) + ->whereOrderPaid(true) ->whereCancellation(false) ->sum('net_price'); if($format){ @@ -35,7 +35,7 @@ class UserMarign $sum_net_amount = ShoppingOrderMargin::whereUserId($user->id) ->whereBetween('from', [$startDay, $endDay]) - ->wherePaid(false) + ->whereOrderPaid(false) ->whereCancellation(false) ->sum('net_price'); if($format){ @@ -52,7 +52,7 @@ class UserMarign $sum_net_amount = ShoppingOrderMargin::whereUserId($user->id) ->whereBetween('from', [$startDay, $endDay]) - ->wherePaid(true) + ->whereOrderPaid(true) ->whereCancellation(false) ->sum('net_amount'); if($format){ @@ -73,7 +73,7 @@ class UserMarign $sum_net_amount = ShoppingOrderMargin::whereMSponsorId($user->id) ->whereBetween('from', [$startDay, $endDay]) - ->wherePaid(true) + ->whereOrderPaid(true) ->whereCancellation(false) ->sum('net_partner_commission'); if($format){ @@ -99,7 +99,7 @@ class UserMarign $sum_net_amount = ShoppingOrderMargin::whereMSponsorId($user->id) ->whereBetween('from', [$startDay, $endDay]) - ->wherePaid(true) + ->whereOrderPaid(true) ->whereCancellation(false) ->wherePartnerCommissionPaid(false) ->where('partner_commission_pending_to', '<', Carbon::now()) @@ -109,11 +109,37 @@ class UserMarign } return $sum_net_amount; } + public static function getMontlyPartnerCommissionPending(User $user, $date = null, $format = false){ + if(!$date){ + $start = Carbon::parse('01.01.2021'); + $end = Carbon::now(); + $startDay = $start->startOfMonth()->toDateString(); + $endDay = $end->endOfMonth()->toDateString(); + }else{ + $now = $date ? Carbon::parse($date) : Carbon::now(); + $startDay = $now->startOfMonth()->toDateString(); + $endDay = $now->endOfMonth()->toDateString(); + } + + $sum_net_amount = ShoppingOrderMargin::whereMSponsorId($user->id) + ->whereBetween('from', [$startDay, $endDay]) + ->whereOrderPaid(true) + ->whereCancellation(false) + ->wherePartnerCommissionPaid(false) + ->where('partner_commission_pending_to', '>=', Carbon::now()) + ->sum('net_partner_commission'); + if($format){ + $sum_net_amount = Util::formatNumber($sum_net_amount); + } + + return $sum_net_amount; + } + /* public static function getMontlyPartnerCommissionOpenByID($user_id, $date = null, $format = false, $addUserCreditMargin = false){ $sum_net_amount = ShoppingOrderMargin::whereMSponsorId($user_id) - ->wherePaid(true) + ->whereOrderPaid(true) ->whereCancellation(false) ->wherePartnerCommissionPaid(false) ->where('partner_commission_pending_to', '<', Carbon::now()) @@ -131,38 +157,14 @@ class UserMarign return $sum_net_amount; } + */ + - public static function getMontlyPartnerCommissionPending(User $user, $date = null, $format = false){ - - if(!$date){ - $start = Carbon::parse('01.01.2021'); - $end = Carbon::now(); - $startDay = $start->startOfMonth()->toDateString(); - $endDay = $end->endOfMonth()->toDateString(); - }else{ - $now = $date ? Carbon::parse($date) : Carbon::now(); - $startDay = $now->startOfMonth()->toDateString(); - $endDay = $now->endOfMonth()->toDateString(); - } - - $sum_net_amount = ShoppingOrderMargin::whereMSponsorId($user->id) - ->whereBetween('from', [$startDay, $endDay]) - ->wherePaid(true) - ->whereCancellation(false) - ->wherePartnerCommissionPaid(false) - ->where('partner_commission_pending_to', '>=', Carbon::now()) - ->sum('net_partner_commission'); - if($format){ - $sum_net_amount = Util::formatNumber($sum_net_amount); - } - - return $sum_net_amount; - } - + /* public static function getMontlyPartnerCommissionPendingByID($user_id, $date = null, $format = false){ $sum_net_amount = ShoppingOrderMargin::whereMSponsorId($user_id) - ->wherePaid(true) + ->whereOrderPaid(true) ->whereCancellation(false) ->wherePartnerCommissionPaid(false) ->where('partner_commission_pending_to', '>=', Carbon::now()) @@ -173,33 +175,53 @@ class UserMarign return $sum_net_amount; } + */ + public static function getPartnerCommissionItems($user_id, $isPending = false){ - public static function getOrderFromPartnerCommissionByID($user_id){ - - $ShoppingOrderMargins = ShoppingOrderMargin::whereMSponsorId($user_id) - ->wherePaid(true) + $query = ShoppingOrderMargin::whereMSponsorId($user_id) + ->whereOrderPaid(true) + ->whereOutPaid(false) ->whereCancellation(false) ->wherePartnerCommissionPaid(false) - ->where('partner_commission_pending_to', '<', Carbon::now()) - ->get(); - - return $ShoppingOrderMargins; + ->whereNotNull('partner_commission_pending_to'); + + if ($isPending) { + $query->where('partner_commission_pending_to', '>=', Carbon::now()); + } else { + $query->where('partner_commission_pending_to', '<', Carbon::now()); + } + + return $query->get(); } - public static function getUserCreditMarginByID($user_id){ + public static function getShopCommissionItems($user_id, $isPending = false){ - $UserCreditMargin = UserCreditMargin::whereUserId($user_id) - ->wherePaid(false) - ->get(); - - return $UserCreditMargin; + $query = ShoppingOrderMargin::whereUserId($user_id) + ->whereOrderPaid(true) + ->whereOutPaid(false) + ->whereCancellation(false) + ->whereMarginPaid(false) + ->whereNotNull('margin_pending_to'); + + if ($isPending) { + $query->where('margin_pending_to', '>=', Carbon::now()); + } else { + $query->where('margin_pending_to', '<', Carbon::now()); + } + return $query->get(); } - public static function getOrderFromPartnerCommissionPendingByID($user_id){ + public static function getUserCreditMarginByUserID($user_id){ + $query = UserCreditMargin::whereUserId($user_id) + ->wherePaid(false); + return $query->get(); + } + + /*public static function getOrderFromPartnerCommissionPendingByID($user_id){ $ShoppingOrderMargins = ShoppingOrderMargin::whereMSponsorId($user_id) - ->wherePaid(true) + ->whereOrderPaid(true) ->whereCancellation(false) ->wherePartnerCommissionPaid(false) ->where('partner_commission_pending_to', '>=', Carbon::now()) @@ -207,4 +229,19 @@ class UserMarign return $ShoppingOrderMargins; } + */ + /* + public static function getOrderFromShopPendingByID($user_id){ + + $ShoppingOrderMargins = ShoppingOrderMargin::whereUserId($user_id) + ->whereOrderPaid(true) + ->whereCancellation(false) + ->wherePartnerCommissionPaid(false) + ->whereIn('status', [7, 8]) + ->where('partner_commission_pending_to', '>=', Carbon::now()) + ->get(); + + return $ShoppingOrderMargins; + } + */ } \ No newline at end of file diff --git a/app/Services/UserService.php b/app/Services/UserService.php index 794d3a7..5992539 100644 --- a/app/Services/UserService.php +++ b/app/Services/UserService.php @@ -1,12 +1,20 @@ $lang){ + $ret[strtolower($code)] = strtolower($lang['native']); + } + return $ret; + } + + + public static function initCustomerYard($shopping_user, $for){ + self::$user_tax_free = false; + if($shopping_user->same_as_billing){ + self::$user_country = $shopping_user->billing_country; + self::$shipping_country = $shopping_user->billing_country; + }else{ + self::$user_country = $shopping_user->billing_country; + self::$shipping_country = $shopping_user->shipping_country; + } + if(self::$user_country->supply_country && self::$shipping_country->supply_country){ + self::$user_tax_free = true; + } + $ShippingCountry = ShippingCountry::whereCountryId(self::$shipping_country->id)->first(); + self::$shipping_free = $ShippingCountry->shipping ? $ShippingCountry->shipping->free : false; + self::$shipping_free = self::$shipping_free !== null ? self::$shipping_free : false; + Yard::instance('shopping')->setShippingCountryWithPrice($ShippingCountry->id, $for); + Yard::instance('shopping')->setUserPriceInfos(self::getYardInfo()); + } + + public static function initUserYard(User $user, $shipping_country_id, $for){ + self::$shipping_free = false; + self::checkUserTaxShippingCountry($user, $shipping_country_id,); + Yard::instance('shopping')->setShippingCountryWithPrice($shipping_country_id, $for); + Yard::instance('shopping')->setUserPriceInfos(self::getYardInfo()); + } + + + public static function checkUserTaxShippingCountry(User $user, $shipping_country_id) { + + if(!$user->account || !$user->account->country_id){ + abort(403, 'Error: User hat kein Land!'); + } + $ShippingCountry = ShippingCountry::findOrFail($shipping_country_id); + self::$user_tax_free = self::performUserTaxShippingCountry($user, $ShippingCountry); + return $ShippingCountry; + /* + dump( self::$user_price_code ); + dump( self::$user_tax_free ); + dump( self::$user_reverse_charge ); + */ + } + + public static function performUserTaxShippingCountry($user, $ShippingCountry){ + //preise für das Land + self::$user_country = $user->account->country; + self::$shipping_country = $ShippingCountry->country; + //ausgehend vom Land des Rechnungsempfänger $user->account->country + //ist der Rechnungsempfänger im Drittland? + if($user->account->country->supply_country){ + if($ShippingCountry->country->supply_country){ + //Lieferadresse im Drittland? + return true; + } + } + //Rechnungsempfänger in der EU + + //Lieferland mit RSV + if($ShippingCountry->country->eu_country){ + //Rechnungsempfänger mit valid aktiv RSV + if($user->account->reverse_charge && $user->account->reverse_charge_valid){ + //Rechnungsland ist auch Lieferland, dann RSV + if(strtolower($user->account->reverse_charge_code) == strtolower($ShippingCountry->country->code)){ + self::$user_reverse_charge = true; + return true; + } + } + } + //Lieferland ohne RSV + + return false; + } + + public static function getYardInfo(){ + return [ + 'shipping_free' => self::$shipping_free, + 'user_tax_free' => self::$user_tax_free, + 'user_reverse_charge' => self::$user_reverse_charge, + 'user_country_id' => self::$user_country->id, + 'shipping_country_id' => self::$shipping_country->id, + ]; + } + + public static function getTaxFree(){ + return self::$user_tax_free ? true : false; + } + + public static function getUserPriceInfos(){ + return [ + 'user_tax_free' => self::$user_tax_free, + 'user_reverse_charge' => self::$user_reverse_charge, + 'user_country_id' => self::$user_country->id, + ]; + } + + public static function getShippingCountryNameById($id){ + $country = ShippingCountry::findOrFail($id); + return $country->country->getLocated(); + } + + public static function getOrderInfo($key = false){ + if(!self::$user_country){ + return ''; + } + switch ($key) { + case 'billing_state': + return self::$user_country->getLocated(); + break; + case 'shipping_state': + return self::$shipping_country->getLocated(); + break; + case 'tax_free': + return self::$user_tax_free ? __('no') : __('yes'); + break; + case 'user_reverse_charge': + return self::$user_reverse_charge ? __('yes') : __('no'); + break; + + } + } public static function hasActivePromotion($user) { diff --git a/app/Services/Util.php b/app/Services/Util.php index 9819607..c7977a4 100644 --- a/app/Services/Util.php +++ b/app/Services/Util.php @@ -4,6 +4,7 @@ namespace App\Services; use App\Models\UserHistory; use Illuminate\Support\Str; use Yard; +use Request; class Util { @@ -170,7 +171,17 @@ class Util return false; } - public static function getMyMivitaUrl($protocol = true){ + public static function isPromotionUrl($debug = false){ + if($debug && config('app.debug')){ + return false; + } + if(Request::getHost() === config('app.promo_domain')){ + return true; + } + return false; + } + + public static function getMyUrl($protocol = true){ $pro = $protocol ? config('app.protocol') : ""; return $pro.config('app.pre_url_crm').config('app.domain').config('app.tld_care'); } @@ -221,7 +232,7 @@ class Util return url($uri); } - public static function substr_ellipsis($str, $len=100, $clean, $ell="..."){ + public static function substr_ellipsis($str, $len=100, $clean=false, $ell="..."){ if($clean){ $str = strip_tags($str); } @@ -257,11 +268,7 @@ class Util $clean = (strlen($clean) > 20) ? substr($clean,-20) : $clean; } - return ($force_lowercase) ? - (function_exists('mb_strtolower')) ? - mb_strtolower($clean, 'UTF-8') : - strtolower($clean) : - $clean; + return ($force_lowercase) ? ((function_exists('mb_strtolower')) ? mb_strtolower($clean, 'UTF-8') : strtolower($clean)) : $clean; } } \ No newline at end of file diff --git a/app/Services/Yard.php b/app/Services/Yard.php index 5fbdd4d..4e84288 100644 --- a/app/Services/Yard.php +++ b/app/Services/Yard.php @@ -1,7 +1,10 @@ ysession = $session; @@ -105,6 +115,24 @@ class Yard extends Cart $this->shipping_option = $this->getYardExtra('shipping_option'); } + if($this->getYardExtra('user_tax_free')){ + $this->user_tax_free = $this->getYardExtra('user_tax_free'); + } + if($this->getYardExtra('shipping_free')){ + $this->shipping_free = $this->getYardExtra('shipping_free'); + } + if($this->getYardExtra('user_reverse_charge')){ + $this->user_reverse_charge = $this->getYardExtra('user_reverse_charge'); + } + if($this->getYardExtra('user_country_id')){ + $this->user_country_id = $this->getYardExtra('user_country_id'); + } + if($this->getYardExtra('user_country')){ + $this->user_country = $this->getYardExtra('user_country'); + } + + $this->events = $events; + parent::__construct($session, $events); @@ -194,6 +222,11 @@ class Yard extends Cart { return $this->shipping_country_id; } + + public function getShippingPrice() + { + return $this->shipping_price; + } public function getYContent() { @@ -203,6 +236,10 @@ class Yard extends Cart return $this->ysession->get($this->yinstance); } + public function getCartContent(){ + return $this->getContent(); + } + public function reCalculateShippingPrice(){ $this->calculateShippingPrice(); } @@ -314,6 +351,15 @@ class Yard extends Cart //dump($margin); } + public function setUser($user){ + $this->user = $user; + $this->putYardExtra('user', $user); + } + + public function sponsorHasCommisson(){ + return $this->user->sponsorHasCommisson(); + } + public function getYardMargin(){ return $this->yard_margin; } @@ -330,7 +376,24 @@ class Yard extends Cart $this->putYardExtra('shipping_is_for', $shipping_is_for); $this->calculateShippingPrice(); + } + public function setUserPriceInfos($setUserPriceInfos = []) + { + $this->shipping_free = isset($setUserPriceInfos['shipping_free']) ? $setUserPriceInfos['shipping_free'] : false; + $this->putYardExtra('shipping_free', $this->shipping_free); + + $this->user_tax_free = $setUserPriceInfos['user_tax_free']; + $this->putYardExtra('user_tax_free', $this->user_tax_free); + + $this->user_reverse_charge = $setUserPriceInfos['user_reverse_charge']; + $this->putYardExtra('user_reverse_charge', $this->user_reverse_charge); + + $this->user_country_id = $setUserPriceInfos['user_country_id']; + $this->putYardExtra('user_country_id', $this->user_country_id); + + $this->user_country = Country::findOrFail($setUserPriceInfos['user_country_id']); + $this->putYardExtra('user_country', $this->user_country); } public function setShoppingUser($user, $use_payment_credit = false){ @@ -345,6 +408,45 @@ class Yard extends Cart } + public function getUserPriceInfos(){ + return [ + 'user_tax_free' =>$this->user_tax_free, + 'user_reverse_charge' =>$this->user_reverse_charge, + 'user_country_id' =>$this->user_country_id, + 'shipping_free' => $this->shipping_free, + ]; + } + + public function getUserCountryId() + { + return $this->user_country_id; + } + + public function getUserCountry() + { + return $this->user_country; + } + + public function getUserTaxFree() + { + return $this->user_tax_free ? true : false; + } + + public function getShippingFree() + { + return $this->shipping_free; + } + + public function getShippingFreeMissingValue() + { + if($this->shipping_free && $this->total(2, '.', '') < $this->shipping_free){ + return $this->shipping_free - $this->total(2, '.', ''); + } + return 0; + } + + + public function setReducePaymentCredit($reduce_payment_credit){ $this->reduce_payment_credit = $reduce_payment_credit; $this->putYardExtra('reduce_payment_credit', $reduce_payment_credit); @@ -405,9 +507,12 @@ class Yard extends Cart if($this->shipping_is_for === 'me' || $this->shipping_is_for === 'ot'){ $shipping_price_for = 1; } - if($this->shipping_is_for === 'shop'){ + if($this->shipping_is_for === 'prom'){ $shipping_price_for = 2; } + if($this->shipping_is_for === 'shop'){ + $shipping_price_for = 3; + } if($this->weight() == 0){ $shipping_price = $shipping->getShippingPricesBy($shipping_price_for)->first(); if(!$shipping_price){ @@ -459,9 +564,12 @@ class Yard extends Cart } $shipping = $shippingCountry->shipping; $shipping_price_for = 1; - if($this->shipping_is_for === 'shop'){ + if($this->shipping_is_for === 'prom'){ $shipping_price_for = 2; } + if($this->shipping_is_for === 'shop'){ + $shipping_price_for = 3; + } if($this->weight() == 0){ $shipping_price = $shipping->getShippingPricesBy($shipping_price_for)->first(); if(!$shipping_price){ diff --git a/app/User.php b/app/User.php index c38d1ca..33d9c8b 100644 --- a/app/User.php +++ b/app/User.php @@ -20,7 +20,6 @@ use Util; * @method static \Illuminate\Database\Eloquent\Builder|User newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|User newQuery() * @method static \Illuminate\Database\Eloquent\Builder|User query() - * @mixin \Eloquent * @property int $id * @property string $email * @property \Illuminate\Support\Carbon|null $email_verified_at @@ -105,6 +104,13 @@ use Util; * @property-read int|null $clients_count * @property-read \Illuminate\Database\Eloquent\Collection|\Laravel\Passport\Token[] $tokens * @property-read int|null $tokens_count + * @property-read \App\Models\UserShop|null $shop + * @property int|null $lead_type_id + * @property-read \App\Models\LeadType|null $lead_type + * @property-read \Illuminate\Database\Eloquent\Collection $whitelabel_products + * @property-read int|null $whitelabel_products_count + * @method static \Illuminate\Database\Eloquent\Builder|User whereLeadTypeId($value) + * @mixin \Eloquent */ class User extends Authenticatable { @@ -146,6 +152,11 @@ class User extends Authenticatable return $this->belongsTo('App\Models\UserAccount', 'account_id'); } + public function shop() + { + return $this->hasOne('App\Models\UserShop', 'user_id', 'id'); + } + public function user_level(){ return $this->belongsTo('App\Models\UserLevel', 'm_level'); } @@ -158,6 +169,10 @@ class User extends Authenticatable return $this->belongsTo('App\User', 'm_sponsor'); } + public function lead_type(){ + return $this->belongsTo('App\Models\LeadType', 'lead_type_id'); + } + public function sponsorHasCommisson(){ if($this->user_sponsor && $this->user_sponsor->user_level && $this->user_sponsor->user_level->partner_provision){ return true; @@ -182,6 +197,10 @@ class User extends Authenticatable return $this->hasMany('App\Models\UserPayCredit', 'user_id', 'id')->orderBy('created_at', 'DESC'); } + public function whitelabel_products() + { + return $this->hasMany('App\Models\UserWhitelabelProduct', 'user_id', 'id'); + } public function getMUserSponsor(){ if($this->user_sponsor && $this->user_sponsor->account){ @@ -310,7 +329,10 @@ class User extends Authenticatable } public function isActiveAccount(){ - return $this->payment_account ? Carbon::parse($this->payment_account)->gt(Carbon::now()) : false; + if($this->isActive() && $this->payment_account){ + return Carbon::parse($this->payment_account)->gt(Carbon::now()); + } + return false; } diff --git a/app/helpers.php b/app/helpers.php index e579539..5952208 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -84,7 +84,7 @@ if (! function_exists('formatPlural')) { if (! function_exists('substr_ellipsis')) { - function substr_ellipsis($str, $len=100, $clean, $ell="...") + function substr_ellipsis($str, $len=100, $clean=false, $ell="...") { return Util::substr_ellipsis($str, $len, $clean, $ell); } diff --git a/composer.json b/composer.json index cb66750..66cd16a 100644 --- a/composer.json +++ b/composer.json @@ -8,28 +8,30 @@ ], "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", + "cocur/slugify": "^4.6.0", "askedio/laravel5-profanity-filter": "*", "barryvdh/laravel-dompdf": "*", "cviebrock/eloquent-sluggable": "*", - "digital-bird/shoppingcart": "^3.0", "doctrine/dbal": "*", "fideloper/proxy": "^4.4", "fruitcake/laravel-cors": "^2.0", "guzzlehttp/guzzle": "^7.0.1", - "intervention/image": "*", + "intervention/image": "^2.7", "jenssegers/date": "*", "laracasts/flash": "*", "laravel/framework": "^8.12", "laravel/helpers": "*", "laravel/passport": "*", "laravel/tinker": "^2.5", - "laravel/ui": "^3.1", + "laravel/ui": "^3.4", "laravelcollective/html": "*", + "maatwebsite/excel": "^3.1", "reliese/laravel": "*", "rguedes/pdfmerger": "^1.0", "setasign/fpdf": "*", "setasign/fpdi": "*", + "srmklive/paypal": "~3.0", "yajra/laravel-datatables-oracle": "*" }, "require-dev": { @@ -42,6 +44,9 @@ "barryvdh/laravel-debugbar": "*", "barryvdh/laravel-ide-helper": "*" }, + "conflict": { + "cocur/slugify": "4.5.0" + }, "config": { "optimize-autoloader": true, "preferred-install": "dist", @@ -58,6 +63,7 @@ ], "psr-4": { "App\\": "app/", + "Gloudemans\\Shoppingcart\\": "packages/digital-bird/shoppingcart/src", "Database\\Factories\\": "database/factories/", "Database\\Seeders\\": "database/seeders/" } diff --git a/composer.lock b/composer.lock index e1a1a28..100dd75 100644 --- a/composer.lock +++ b/composer.lock @@ -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": "9a9e6aad9041019ff4baba8deedd02c4", + "content-hash": "fcd1d14ceb1c76713615c0bd9b88a917", "packages": [ { "name": "askedio/laravel5-profanity-filter", @@ -58,31 +58,31 @@ }, { "name": "asm89/stack-cors", - "version": "v2.0.2", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/asm89/stack-cors.git", - "reference": "8d8f88b3b3830916be94292c1fbce84433efb1aa" + "reference": "acf3142e6c5eafa378dc8ef3c069ab4558993f70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/asm89/stack-cors/zipball/8d8f88b3b3830916be94292c1fbce84433efb1aa", - "reference": "8d8f88b3b3830916be94292c1fbce84433efb1aa", + "url": "https://api.github.com/repos/asm89/stack-cors/zipball/acf3142e6c5eafa378dc8ef3c069ab4558993f70", + "reference": "acf3142e6c5eafa378dc8ef3c069ab4558993f70", "shasum": "" }, "require": { - "php": "^7.0|^8.0", - "symfony/http-foundation": "~2.7|~3.0|~4.0|~5.0", - "symfony/http-kernel": "~2.7|~3.0|~4.0|~5.0" + "php": "^7.3|^8.0", + "symfony/http-foundation": "^5.3|^6|^7", + "symfony/http-kernel": "^5.3|^6|^7" }, "require-dev": { - "phpunit/phpunit": "^6|^7|^8|^9", + "phpunit/phpunit": "^9", "squizlabs/php_codesniffer": "^3.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "2.2-dev" } }, "autoload": { @@ -108,41 +108,48 @@ ], "support": { "issues": "https://github.com/asm89/stack-cors/issues", - "source": "https://github.com/asm89/stack-cors/tree/v2.0.2" + "source": "https://github.com/asm89/stack-cors/tree/v2.3.0" }, - "time": "2020-10-29T16:03:21+00:00" + "time": "2025-03-13T08:50:04+00:00" }, { "name": "barryvdh/laravel-dompdf", - "version": "v0.9.0", + "version": "v2.2.0", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-dompdf.git", - "reference": "5b99e1f94157d74e450f4c97e8444fcaffa2144b" + "reference": "c96f90c97666cebec154ca1ffb67afed372114d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/5b99e1f94157d74e450f4c97e8444fcaffa2144b", - "reference": "5b99e1f94157d74e450f4c97e8444fcaffa2144b", + "url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/c96f90c97666cebec154ca1ffb67afed372114d8", + "reference": "c96f90c97666cebec154ca1ffb67afed372114d8", "shasum": "" }, "require": { - "dompdf/dompdf": "^1", - "illuminate/support": "^5.5|^6|^7|^8", - "php": "^7.1 || ^8.0" + "dompdf/dompdf": "^2.0.7", + "illuminate/support": "^6|^7|^8|^9|^10|^11", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "larastan/larastan": "^1.0|^2.7.0", + "orchestra/testbench": "^4|^5|^6|^7|^8|^9", + "phpro/grumphp": "^1 || ^2.5", + "squizlabs/php_codesniffer": "^3.5" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "0.9-dev" - }, "laravel": { + "aliases": { + "PDF": "Barryvdh\\DomPDF\\Facade\\Pdf", + "Pdf": "Barryvdh\\DomPDF\\Facade\\Pdf" + }, "providers": [ "Barryvdh\\DomPDF\\ServiceProvider" - ], - "aliases": { - "PDF": "Barryvdh\\DomPDF\\Facade" - } + ] + }, + "branch-alias": { + "dev-master": "2.0-dev" } }, "autoload": { @@ -168,38 +175,41 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-dompdf/issues", - "source": "https://github.com/barryvdh/laravel-dompdf/tree/v0.9.0" + "source": "https://github.com/barryvdh/laravel-dompdf/tree/v2.2.0" }, "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, { "url": "https://github.com/barryvdh", "type": "github" } ], - "time": "2020-12-27T12:05:53+00:00" + "time": "2024-04-25T13:16:04+00:00" }, { "name": "brick/math", - "version": "0.9.1", + "version": "0.12.3", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "283a40c901101e66de7061bd359252c013dcc43c" + "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/283a40c901101e66de7061bd359252c013dcc43c", - "reference": "283a40c901101e66de7061bd359252c013dcc43c", + "url": "https://api.github.com/repos/brick/math/zipball/866551da34e9a618e64a819ee1e01c20d8a588ba", + "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba", "shasum": "" }, "require": { - "ext-json": "*", - "php": "^7.1|^8.0" + "php": "^8.1" }, "require-dev": { "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^7.5.15|^8.5", - "vimeo/psalm": "^3.5" + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "6.8.8" }, "type": "library", "autoload": { @@ -219,38 +229,112 @@ "arithmetic", "bigdecimal", "bignum", + "bignumber", "brick", - "math" + "decimal", + "integer", + "math", + "mathematics", + "rational" ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/master" + "source": "https://github.com/brick/math/tree/0.12.3" }, "funding": [ { - "url": "https://tidelift.com/funding/github/packagist/brick/math", - "type": "tidelift" + "url": "https://github.com/BenMorel", + "type": "github" } ], - "time": "2020-08-18T23:57:15+00:00" + "time": "2025-02-28T13:11:00+00:00" }, { - "name": "cocur/slugify", - "version": "v4.0.0", + "name": "carbonphp/carbon-doctrine-types", + "version": "2.1.0", "source": { "type": "git", - "url": "https://github.com/cocur/slugify.git", - "reference": "3f1ffc300f164f23abe8b64ffb3f92d35cec8307" + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cocur/slugify/zipball/3f1ffc300f164f23abe8b64ffb3f92d35cec8307", - "reference": "3f1ffc300f164f23abe8b64ffb3f92d35cec8307", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "doctrine/dbal": "<3.7.0 || >=4.0.0" + }, + "require-dev": { + "doctrine/dbal": "^3.7.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2023-12-11T17:09:12+00:00" + }, + { + "name": "cocur/slugify", + "version": "v4.6.0", + "source": { + "type": "git", + "url": "https://github.com/cocur/slugify.git", + "reference": "1d674022e9cbefa80b4f51aa3e2375b6e3c14fdb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cocur/slugify/zipball/1d674022e9cbefa80b4f51aa3e2375b6e3c14fdb", + "reference": "1d674022e9cbefa80b4f51aa3e2375b6e3c14fdb", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=7.0" + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "conflict": { "symfony/config": "<3.4 || >=4,<4.3", @@ -259,18 +343,18 @@ "twig/twig": "<2.12.1" }, "require-dev": { - "laravel/framework": "~5.1", + "laravel/framework": "^5.0|^6.0|^7.0|^8.0", "latte/latte": "~2.2", "league/container": "^2.2.0", "mikey179/vfsstream": "~1.6.8", "mockery/mockery": "^1.3", "nette/di": "~2.4", - "phpunit/phpunit": "^5.7.27", "pimple/pimple": "~1.1", "plumphp/plum": "~0.1", - "symfony/config": "^3.4 || ^4.3 || ^5.0", - "symfony/dependency-injection": "^3.4 || ^4.3 || ^5.0", - "symfony/http-kernel": "^3.4 || ^4.3 || ^5.0", + "symfony/config": "^3.4 || ^4.3 || ^5.0 || ^6.0", + "symfony/dependency-injection": "^3.4 || ^4.3 || ^5.0 || ^6.0", + "symfony/http-kernel": "^3.4 || ^4.3 || ^5.0 || ^6.0", + "symfony/phpunit-bridge": "^5.4 || ^6.0", "twig/twig": "^2.12.1 || ~3.0", "zendframework/zend-modulemanager": "~2.2", "zendframework/zend-servicemanager": "~2.2", @@ -304,46 +388,49 @@ ], "support": { "issues": "https://github.com/cocur/slugify/issues", - "source": "https://github.com/cocur/slugify/tree/master" + "source": "https://github.com/cocur/slugify/tree/v4.6.0" }, - "time": "2019-12-14T13:04:14+00:00" + "time": "2024-09-10T14:09:25+00:00" }, { - "name": "composer/package-versions-deprecated", - "version": "1.11.99.1", + "name": "composer/pcre", + "version": "3.3.2", "source": { "type": "git", - "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6" + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/7413f0b55a051e89485c5cb9f765fe24bb02a7b6", - "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7 || ^8" + "php": "^7.4 || ^8.0" }, - "replace": { - "ocramius/package-versions": "1.11.99" + "conflict": { + "phpstan/phpstan": "<1.11.10" }, "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13", - "phpunit/phpunit": "^6.5 || ^7" + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" }, - "type": "composer-plugin", + "type": "library", "extra": { - "class": "PackageVersions\\Installer", + "phpstan": { + "includes": [ + "extension.neon" + ] + }, "branch-alias": { - "dev-master": "1.x-dev" + "dev-main": "3.x-dev" } }, "autoload": { "psr-4": { - "PackageVersions\\": "src/PackageVersions" + "Composer\\Pcre\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -351,19 +438,22 @@ "MIT" ], "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - }, { "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" } ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.1" + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" }, "funding": [ { @@ -379,20 +469,101 @@ "type": "tidelift" } ], - "time": "2020-11-11T10:22:58+00:00" + "time": "2024-11-12T16:29:46+00:00" }, { - "name": "cviebrock/eloquent-sluggable", - "version": "8.0.2", + "name": "composer/semver", + "version": "3.4.3", "source": { "type": "git", - "url": "https://github.com/cviebrock/eloquent-sluggable.git", - "reference": "1b693b333de9080380340facf3806c644a949ad7" + "url": "https://github.com/composer/semver.git", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cviebrock/eloquent-sluggable/zipball/1b693b333de9080380340facf3806c644a949ad7", - "reference": "1b693b333de9080380340facf3806c644a949ad7", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-09-19T14:15:21+00:00" + }, + { + "name": "cviebrock/eloquent-sluggable", + "version": "8.0.8", + "source": { + "type": "git", + "url": "https://github.com/cviebrock/eloquent-sluggable.git", + "reference": "16e21db24d80180f870c3c7c4faf3d3af23f4117" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cviebrock/eloquent-sluggable/zipball/16e21db24d80180f870c3c7c4faf3d3af23f4117", + "reference": "16e21db24d80180f870c3c7c4faf3d3af23f4117", "shasum": "" }, "require": { @@ -407,7 +578,7 @@ "mockery/mockery": "^1.4.2", "orchestra/database": "^6.0", "orchestra/testbench": "^6.0", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.4" }, "type": "library", "extra": { @@ -444,32 +615,38 @@ ], "support": { "issues": "https://github.com/cviebrock/eloquent-sluggable/issues", - "source": "https://github.com/cviebrock/eloquent-sluggable/tree/8.0.2" + "source": "https://github.com/cviebrock/eloquent-sluggable/tree/8.0.8" }, - "time": "2020-11-29T18:53:58+00:00" + "funding": [ + { + "url": "https://github.com/cviebrock", + "type": "github" + } + ], + "time": "2021-06-12T01:05:33+00:00" }, { "name": "defuse/php-encryption", - "version": "v2.2.1", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/defuse/php-encryption.git", - "reference": "0f407c43b953d571421e0020ba92082ed5fb7620" + "reference": "f53396c2d34225064647a05ca76c1da9d99e5828" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/defuse/php-encryption/zipball/0f407c43b953d571421e0020ba92082ed5fb7620", - "reference": "0f407c43b953d571421e0020ba92082ed5fb7620", + "url": "https://api.github.com/repos/defuse/php-encryption/zipball/f53396c2d34225064647a05ca76c1da9d99e5828", + "reference": "f53396c2d34225064647a05ca76c1da9d99e5828", "shasum": "" }, "require": { "ext-openssl": "*", "paragonie/random_compat": ">= 2", - "php": ">=5.4.0" + "php": ">=5.6.0" }, "require-dev": { - "nikic/php-parser": "^2.0|^3.0|^4.0", - "phpunit/phpunit": "^4|^5" + "phpunit/phpunit": "^5|^6|^7|^8|^9|^10", + "yoast/phpunit-polyfills": "^2.0.0" }, "bin": [ "bin/generate-defuse-key" @@ -511,51 +688,43 @@ ], "support": { "issues": "https://github.com/defuse/php-encryption/issues", - "source": "https://github.com/defuse/php-encryption/tree/master" + "source": "https://github.com/defuse/php-encryption/tree/v2.4.0" }, - "time": "2018-07-24T23:27:56+00:00" + "time": "2023-06-19T06:10:36+00:00" }, { - "name": "digital-bird/shoppingcart", - "version": "3.0.4", + "name": "dflydev/dot-access-data", + "version": "v3.0.3", "source": { "type": "git", - "url": "https://github.com/digital-bird/LaravelShoppingcart.git", - "reference": "03f07813310df17368b1b3bfa15489ac9112b633" + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/digital-bird/LaravelShoppingcart/zipball/03f07813310df17368b1b3bfa15489ac9112b633", - "reference": "03f07813310df17368b1b3bfa15489ac9112b633", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", "shasum": "" }, "require": { - "illuminate/events": "5.1.*|5.2.*|5.3.*|5.4.*|5.5.*|5.6.*|5.7.*|5.8.*|6.*|7.*|8.*", - "illuminate/session": "5.1.*|5.2.*|5.3.*|5.4.*|5.5.*|5.6.*|5.7.*|5.8.*|6.*|7.*|8.*", - "illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*|5.5.*|5.6.*|5.7.*|5.8.*|6.*|7.*|8.*" + "php": "^7.1 || ^8.0" }, "require-dev": { - "mockery/mockery": "~0.9.0", - "orchestra/testbench": "~3.1", - "phpunit/phpunit": "~5.0|~6.0|~7.0|~8.0|~9,0" - }, - "suggest": { - "gloudemans/notify": "Simple flash notifications for Laravel" + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" }, "type": "library", "extra": { - "laravel": { - "providers": [ - "Gloudemans\\Shoppingcart\\ShoppingcartServiceProvider" - ], - "aliases": { - "Cart": "Gloudemans\\Shoppingcart\\Facades\\Cart" - } + "branch-alias": { + "dev-main": "3.x-dev" } }, "autoload": { "psr-4": { - "Gloudemans\\Shoppingcart\\": "src/" + "Dflydev\\DotAccessData\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -564,69 +733,52 @@ ], "authors": [ { - "name": "Rob Gloudemans", - "email": "info@robgloudemans.nl" + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" } ], - "description": "Laravel Shoppingcart", + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", "keywords": [ - "laravel", - "shoppingcart" + "access", + "data", + "dot", + "notation" ], "support": { - "source": "https://github.com/digital-bird/LaravelShoppingcart/tree/3.0.4" + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" }, - "time": "2020-10-23T07:09:33+00:00" - }, - { - "name": "dnoegel/php-xdg-base-dir", - "version": "v0.1.1", - "source": { - "type": "git", - "url": "https://github.com/dnoegel/php-xdg-base-dir.git", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "XdgBaseDir\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "implementation of xdg base directory specification for php", - "support": { - "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", - "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" - }, - "time": "2019-12-04T15:06:13+00:00" + "time": "2024-07-08T12:26:09+00:00" }, { "name": "doctrine/cache", - "version": "1.10.2", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "13e3381b25847283a91948d04640543941309727" + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727", - "reference": "13e3381b25847283a91948d04640543941309727", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", "shasum": "" }, "require": { @@ -636,21 +788,14 @@ "doctrine/common": ">2.2,<2.4" }, "require-dev": { - "alcaeus/mongo-php-adapter": "^1.1", - "doctrine/coding-standard": "^6.0", - "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0", - "predis/predis": "~1.0" - }, - "suggest": { - "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" @@ -697,7 +842,7 @@ ], "support": { "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/1.10.x" + "source": "https://github.com/doctrine/cache/tree/2.2.0" }, "funding": [ { @@ -713,37 +858,42 @@ "type": "tidelift" } ], - "time": "2020-07-07T18:54:01+00:00" + "time": "2022-05-20T20:07:39+00:00" }, { "name": "doctrine/dbal", - "version": "3.0.0", + "version": "3.9.4", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "ee6d1260d5cc20ec506455a585945d7bdb98662c" + "reference": "ec16c82f20be1a7224e65ac67144a29199f87959" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/ee6d1260d5cc20ec506455a585945d7bdb98662c", - "reference": "ee6d1260d5cc20ec506455a585945d7bdb98662c", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/ec16c82f20be1a7224e65ac67144a29199f87959", + "reference": "ec16c82f20be1a7224e65ac67144a29199f87959", "shasum": "" }, "require": { - "composer/package-versions-deprecated": "^1.11.99", - "doctrine/cache": "^1.0", - "doctrine/event-manager": "^1.0", - "php": "^7.3 || ^8.0" + "composer-runtime-api": "^2", + "doctrine/cache": "^1.11|^2.0", + "doctrine/deprecations": "^0.5.3|^1", + "doctrine/event-manager": "^1|^2", + "php": "^7.4 || ^8.0", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" }, "require-dev": { - "doctrine/coding-standard": "^8.1", - "jetbrains/phpstorm-stubs": "^2019.1", - "phpstan/phpstan": "^0.12.40", - "phpstan/phpstan-strict-rules": "^0.12.2", - "phpunit/phpunit": "^9.4", - "psalm/plugin-phpunit": "^0.10.0", - "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", - "vimeo/psalm": "^3.17.2" + "doctrine/coding-standard": "12.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "2.1.1", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "9.6.22", + "slevomat/coding-standard": "8.13.1", + "squizlabs/php_codesniffer": "3.10.2", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/console": "^4.4|^5.4|^6.0|^7.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -752,11 +902,6 @@ "bin/doctrine-dbal" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\DBAL\\": "src" @@ -808,7 +953,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.0.0" + "source": "https://github.com/doctrine/dbal/tree/3.9.4" }, "funding": [ { @@ -824,41 +969,83 @@ "type": "tidelift" } ], - "time": "2020-11-15T18:20:41+00:00" + "time": "2025-01-16T08:28:55+00:00" }, { - "name": "doctrine/event-manager", - "version": "1.1.1", + "name": "doctrine/deprecations", + "version": "1.1.4", "source": { "type": "git", - "url": "https://github.com/doctrine/event-manager.git", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" + "url": "https://github.com/doctrine/deprecations.git", + "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9", + "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, - "conflict": { - "doctrine/common": "<2.9@dev" - }, "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpunit/phpunit": "^7.0" + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "1.4.10 || 2.0.3", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" + "Doctrine\\Deprecations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.4" + }, + "time": "2024-12-07T21:18:45+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.24" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -902,7 +1089,7 @@ ], "support": { "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/1.1.x" + "source": "https://github.com/doctrine/event-manager/tree/2.0.1" }, "funding": [ { @@ -918,38 +1105,34 @@ "type": "tidelift" } ], - "time": "2020-05-29T18:28:51+00:00" + "time": "2024-05-22T20:47:39+00:00" }, { "name": "doctrine/inflector", - "version": "2.0.3", + "version": "2.0.10", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210" + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210", - "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^7.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-strict-rules": "^0.11", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" @@ -997,7 +1180,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.x" + "source": "https://github.com/doctrine/inflector/tree/2.0.10" }, "funding": [ { @@ -1013,36 +1196,32 @@ "type": "tidelift" } ], - "time": "2020-05-29T15:13:26+00:00" + "time": "2024-02-18T20:23:39+00:00" }, { "name": "doctrine/lexer", - "version": "1.2.1", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^8.2" + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.11" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" @@ -1077,7 +1256,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.1" + "source": "https://github.com/doctrine/lexer/tree/1.2.3" }, "funding": [ { @@ -1093,30 +1272,33 @@ "type": "tidelift" } ], - "time": "2020-05-25T17:44:05+00:00" + "time": "2022-02-28T11:07:21+00:00" }, { "name": "dompdf/dompdf", - "version": "v1.0.2", + "version": "v2.0.8", "source": { "type": "git", "url": "https://github.com/dompdf/dompdf.git", - "reference": "8768448244967a46d6e67b891d30878e0e15d25c" + "reference": "c20247574601700e1f7c8dab39310fca1964dc52" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dompdf/dompdf/zipball/8768448244967a46d6e67b891d30878e0e15d25c", - "reference": "8768448244967a46d6e67b891d30878e0e15d25c", + "url": "https://api.github.com/repos/dompdf/dompdf/zipball/c20247574601700e1f7c8dab39310fca1964dc52", + "reference": "c20247574601700e1f7c8dab39310fca1964dc52", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", - "phenx/php-font-lib": "^0.5.2", - "phenx/php-svg-lib": "^0.3.3", + "masterminds/html5": "^2.0", + "phenx/php-font-lib": ">=0.5.4 <1.0.0", + "phenx/php-svg-lib": ">=0.5.2 <1.0.0", "php": "^7.1 || ^8.0" }, "require-dev": { + "ext-json": "*", + "ext-zip": "*", "mockery/mockery": "^1.3", "phpunit/phpunit": "^7.5 || ^8 || ^9", "squizlabs/php_codesniffer": "^3.5" @@ -1128,11 +1310,6 @@ "ext-zlib": "Needed for pdf stream compression" }, "type": "library", - "extra": { - "branch-alias": { - "dev-develop": "0.7-dev" - } - }, "autoload": { "psr-4": { "Dompdf\\": "src/" @@ -1147,54 +1324,50 @@ ], "authors": [ { - "name": "Fabien Ménager", - "email": "fabien.menager@gmail.com" - }, - { - "name": "Brian Sweeney", - "email": "eclecticgeek@gmail.com" - }, - { - "name": "Gabriel Bull", - "email": "me@gabrielbull.com" + "name": "The Dompdf Community", + "homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md" } ], "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", "homepage": "https://github.com/dompdf/dompdf", "support": { "issues": "https://github.com/dompdf/dompdf/issues", - "source": "https://github.com/dompdf/dompdf/tree/v1.0.2" + "source": "https://github.com/dompdf/dompdf/tree/v2.0.8" }, - "time": "2021-01-08T14:18:52+00:00" + "time": "2024-04-29T13:06:17+00:00" }, { "name": "dragonmantank/cron-expression", - "version": "v3.1.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c" + "reference": "8c784d071debd117328803d86b2097615b457500" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c", - "reference": "7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500", + "reference": "8c784d071debd117328803d86b2097615b457500", "shasum": "" }, "require": { "php": "^7.2|^8.0", - "webmozart/assert": "^1.7.0" + "webmozart/assert": "^1.0" }, "replace": { "mtdowling/cron-expression": "^1.0" }, "require-dev": { "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-webmozart-assert": "^0.12.7", + "phpstan/phpstan": "^1.0", "phpunit/phpunit": "^7.0|^8.0|^9.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, "autoload": { "psr-4": { "Cron\\": "src/Cron/" @@ -1218,7 +1391,7 @@ ], "support": { "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v3.1.0" + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.4.0" }, "funding": [ { @@ -1226,7 +1399,7 @@ "type": "github" } ], - "time": "2020-11-24T19:55:57+00:00" + "time": "2024-10-09T13:47:03+00:00" }, { "name": "egulias/email-validator", @@ -1297,17 +1470,78 @@ "time": "2020-12-29T14:50:06+00:00" }, { - "name": "fideloper/proxy", - "version": "4.4.1", + "name": "ezyang/htmlpurifier", + "version": "v4.18.0", "source": { "type": "git", - "url": "https://github.com/fideloper/TrustedProxy.git", - "reference": "c073b2bd04d1c90e04dc1b787662b558dd65ade0" + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "cb56001e54359df7ae76dc522d08845dc741621b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/c073b2bd04d1c90e04dc1b787662b558dd65ade0", - "reference": "c073b2bd04d1c90e04dc1b787662b558dd65ade0", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/cb56001e54359df7ae76dc522d08845dc741621b", + "reference": "cb56001e54359df7ae76dc522d08845dc741621b", + "shasum": "" + }, + "require": { + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "require-dev": { + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-tidy": "Used for pretty-printing HTML" + }, + "type": "library", + "autoload": { + "files": [ + "library/HTMLPurifier.composer.php" + ], + "psr-0": { + "HTMLPurifier": "library/" + }, + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.18.0" + }, + "time": "2024-11-01T03:51:45+00:00" + }, + { + "name": "fideloper/proxy", + "version": "4.4.2", + "source": { + "type": "git", + "url": "https://github.com/fideloper/TrustedProxy.git", + "reference": "a751f2bc86dd8e6cfef12dc0cbdada82f5a18750" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/a751f2bc86dd8e6cfef12dc0cbdada82f5a18750", + "reference": "a751f2bc86dd8e6cfef12dc0cbdada82f5a18750", "shasum": "" }, "require": { @@ -1317,7 +1551,7 @@ "require-dev": { "illuminate/http": "^5.0|^6.0|^7.0|^8.0|^9.0", "mockery/mockery": "^1.0", - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^8.5.8|^9.3.3" }, "type": "library", "extra": { @@ -1350,29 +1584,38 @@ ], "support": { "issues": "https://github.com/fideloper/TrustedProxy/issues", - "source": "https://github.com/fideloper/TrustedProxy/tree/4.4.1" + "source": "https://github.com/fideloper/TrustedProxy/tree/4.4.2" }, - "time": "2020-10-22T13:48:01+00:00" + "time": "2022-02-09T13:33:34+00:00" }, { "name": "firebase/php-jwt", - "version": "v5.2.0", + "version": "v6.11.0", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb" + "reference": "8f718f4dfc9c5d5f0c994cdfd103921b43592712" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/feb0e820b8436873675fd3aca04f3728eb2185cb", - "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/8f718f4dfc9c5d5f0c994cdfd103921b43592712", + "reference": "8f718f4dfc9c5d5f0c994cdfd103921b43592712", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^8.0" }, "require-dev": { - "phpunit/phpunit": ">=4.8 <=9" + "guzzlehttp/guzzle": "^7.4", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psr/cache": "^2.0||^3.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" }, "type": "library", "autoload": { @@ -1404,42 +1647,40 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/master" + "source": "https://github.com/firebase/php-jwt/tree/v6.11.0" }, - "time": "2020-03-25T18:49:23+00:00" + "time": "2025-01-23T05:11:06+00:00" }, { "name": "fruitcake/laravel-cors", - "version": "v2.0.3", + "version": "v2.2.0", "source": { "type": "git", "url": "https://github.com/fruitcake/laravel-cors.git", - "reference": "01de0fe5f71c70d1930ee9a80385f9cc28e0f63a" + "reference": "783a74f5e3431d7b9805be8afb60fd0a8f743534" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fruitcake/laravel-cors/zipball/01de0fe5f71c70d1930ee9a80385f9cc28e0f63a", - "reference": "01de0fe5f71c70d1930ee9a80385f9cc28e0f63a", + "url": "https://api.github.com/repos/fruitcake/laravel-cors/zipball/783a74f5e3431d7b9805be8afb60fd0a8f743534", + "reference": "783a74f5e3431d7b9805be8afb60fd0a8f743534", "shasum": "" }, "require": { "asm89/stack-cors": "^2.0.1", "illuminate/contracts": "^6|^7|^8|^9", "illuminate/support": "^6|^7|^8|^9", - "php": ">=7.2", - "symfony/http-foundation": "^4|^5", - "symfony/http-kernel": "^4.3.4|^5" + "php": ">=7.2" }, "require-dev": { - "laravel/framework": "^6|^7|^8", - "orchestra/testbench-dusk": "^4|^5|^6", - "phpunit/phpunit": "^6|^7|^8", + "laravel/framework": "^6|^7.24|^8", + "orchestra/testbench-dusk": "^4|^5|^6|^7", + "phpunit/phpunit": "^6|^7|^8|^9", "squizlabs/php_codesniffer": "^3.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "2.1-dev" }, "laravel": { "providers": [ @@ -1475,43 +1716,43 @@ ], "support": { "issues": "https://github.com/fruitcake/laravel-cors/issues", - "source": "https://github.com/fruitcake/laravel-cors/tree/v2.0.3" + "source": "https://github.com/fruitcake/laravel-cors/tree/v2.2.0" }, "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, { "url": "https://github.com/barryvdh", "type": "github" } ], - "time": "2020-10-22T13:57:20+00:00" + "abandoned": true, + "time": "2022-02-23T14:25:13+00:00" }, { "name": "graham-campbell/result-type", - "version": "v1.0.1", + "version": "v1.1.3", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "7e279d2cd5d7fbb156ce46daada972355cea27bb" + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/7e279d2cd5d7fbb156ce46daada972355cea27bb", - "reference": "7e279d2cd5d7fbb156ce46daada972355cea27bb", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", "shasum": "" }, "require": { - "php": "^7.0|^8.0", - "phpoption/phpoption": "^1.7.3" + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" }, "require-dev": { - "phpunit/phpunit": "^6.5|^7.5|^8.5|^9.0" + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, "autoload": { "psr-4": { "GrahamCampbell\\ResultType\\": "src/" @@ -1524,7 +1765,8 @@ "authors": [ { "name": "Graham Campbell", - "email": "graham@alt-three.com" + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" } ], "description": "An Implementation Of The Result Type", @@ -1537,7 +1779,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.1" + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" }, "funding": [ { @@ -1549,37 +1791,40 @@ "type": "tidelift" } ], - "time": "2020-04-13T13:17:36+00:00" + "time": "2024-07-20T21:45:45+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.2.0", + "version": "7.9.2", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "0aa74dfb41ae110835923ef10a9d803a22d50e79" + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/0aa74dfb41ae110835923ef10a9d803a22d50e79", - "reference": "0aa74dfb41ae110835923ef10a9d803a22d50e79", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.4", - "guzzlehttp/psr7": "^1.7", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", "php": "^7.2.5 || ^8.0", - "psr/http-client": "^1.0" + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" }, "provide": { "psr/http-client-implementation": "1.0" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", - "php-http/client-integration-tests": "^3.0", - "phpunit/phpunit": "^8.5.5 || ^9.3.5", - "psr/log": "^1.1" + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { "ext-curl": "Required for CURL handler support", @@ -1588,36 +1833,61 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "7.1-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { - "psr-4": { - "GuzzleHttp\\": "src/" - }, "files": [ "src/functions_include.php" - ] + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, { "name": "Márk Sági-Kazár", "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", "keywords": [ "client", "curl", @@ -1631,7 +1901,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.2.0" + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" }, "funding": [ { @@ -1643,59 +1913,69 @@ "type": "github" }, { - "url": "https://github.com/alexeyshockov", - "type": "github" - }, - { - "url": "https://github.com/gmponos", - "type": "github" + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" } ], - "time": "2020-10-10T11:47:56+00:00" + "time": "2024-07-24T11:22:20+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.4.0", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "60d379c243457e073cff02bc323a2a86cb355631" + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/60d379c243457e073cff02bc323a2a86cb355631", - "reference": "60d379c243457e073cff02bc323a2a86cb355631", + "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", "shasum": "" }, "require": { - "php": ">=5.5" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.4-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { "psr-4": { "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], "description": "Guzzle promises library", @@ -1704,66 +1984,107 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.4.0" + "source": "https://github.com/guzzle/promises/tree/2.0.4" }, - "time": "2020-09-30T07:37:28+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2024-10-17T10:06:22+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.7.0", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3" + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3", - "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", "shasum": "" }, "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" }, "provide": { + "psr/http-factory-implementation": "1.0", "psr/http-message-implementation": "1.0" }, "require-dev": { - "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.7-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { "psr-4": { "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, { "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], "description": "PSR-7 message implementation that also provides common utility methods", @@ -1779,32 +2100,46 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.7.0" + "source": "https://github.com/guzzle/psr7/tree/2.7.0" }, - "time": "2020-09-30T07:37:11+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2024-07-18T11:15:46+00:00" }, { "name": "intervention/image", - "version": "2.5.1", + "version": "2.7.2", "source": { "type": "git", "url": "https://github.com/Intervention/image.git", - "reference": "abbf18d5ab8367f96b3205ca3c89fb2fa598c69e" + "reference": "04be355f8d6734c826045d02a1079ad658322dad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Intervention/image/zipball/abbf18d5ab8367f96b3205ca3c89fb2fa598c69e", - "reference": "abbf18d5ab8367f96b3205ca3c89fb2fa598c69e", + "url": "https://api.github.com/repos/Intervention/image/zipball/04be355f8d6734c826045d02a1079ad658322dad", + "reference": "04be355f8d6734c826045d02a1079ad658322dad", "shasum": "" }, "require": { "ext-fileinfo": "*", - "guzzlehttp/psr7": "~1.1", + "guzzlehttp/psr7": "~1.1 || ^2.0", "php": ">=5.4.0" }, "require-dev": { "mockery/mockery": "~0.9.2", - "phpunit/phpunit": "^4.8 || ^5.7" + "phpunit/phpunit": "^4.8 || ^5.7 || ^7.5.15" }, "suggest": { "ext-gd": "to use GD library based image processing.", @@ -1813,16 +2148,16 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - }, "laravel": { - "providers": [ - "Intervention\\Image\\ImageServiceProvider" - ], "aliases": { "Image": "Intervention\\Image\\Facades\\Image" - } + }, + "providers": [ + "Intervention\\Image\\ImageServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "2.4-dev" } }, "autoload": { @@ -1837,8 +2172,8 @@ "authors": [ { "name": "Oliver Vogel", - "email": "oliver@olivervogel.com", - "homepage": "http://olivervogel.com/" + "email": "oliver@intervention.io", + "homepage": "https://intervention.io/" } ], "description": "Image handling and manipulation library with support for Laravel integration", @@ -1853,9 +2188,19 @@ ], "support": { "issues": "https://github.com/Intervention/image/issues", - "source": "https://github.com/Intervention/image/tree/master" + "source": "https://github.com/Intervention/image/tree/2.7.2" }, - "time": "2019-11-02T09:15:47+00:00" + "funding": [ + { + "url": "https://paypal.me/interventionio", + "type": "custom" + }, + { + "url": "https://github.com/Intervention", + "type": "github" + } + ], + "time": "2022-05-21T17:30:32+00:00" }, { "name": "jenssegers/date", @@ -1880,16 +2225,16 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - }, "laravel": { - "providers": [ - "Jenssegers\\Date\\DateServiceProvider" - ], "aliases": { "Date": "Jenssegers\\Date\\Date" - } + }, + "providers": [ + "Jenssegers\\Date\\DateServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.1-dev" } }, "autoload": { @@ -1936,44 +2281,44 @@ }, { "name": "laracasts/flash", - "version": "3.2", + "version": "3.2.4", "source": { "type": "git", "url": "https://github.com/laracasts/flash.git", - "reference": "76c2e200498795bdbeda97b682536130316e8b97" + "reference": "0ea47bfbf12a33113247c367798a34e519020f8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laracasts/flash/zipball/76c2e200498795bdbeda97b682536130316e8b97", - "reference": "76c2e200498795bdbeda97b682536130316e8b97", + "url": "https://api.github.com/repos/laracasts/flash/zipball/0ea47bfbf12a33113247c367798a34e519020f8d", + "reference": "0ea47bfbf12a33113247c367798a34e519020f8d", "shasum": "" }, "require": { - "illuminate/support": "~5.0|^6.0|^7.0|^8.0", + "illuminate/support": "~5.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", "php": ">=5.4.0" }, "require-dev": { "mockery/mockery": "dev-master", - "phpunit/phpunit": "^6.1" + "phpunit/phpunit": "^6.1|^9.5.10|^10.5" }, "type": "library", "extra": { "laravel": { - "providers": [ - "Laracasts\\Flash\\FlashServiceProvider" - ], "aliases": { "Flash": "Laracasts\\Flash\\Flash" - } + }, + "providers": [ + "Laracasts\\Flash\\FlashServiceProvider" + ] } }, "autoload": { - "psr-0": { - "Laracasts\\Flash": "src/" - }, "files": [ "src/Laracasts/Flash/functions.php" - ] + ], + "psr-0": { + "Laracasts\\Flash": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1987,23 +2332,22 @@ ], "description": "Easy flash notifications", "support": { - "issues": "https://github.com/laracasts/flash/issues", - "source": "https://github.com/laracasts/flash/tree/master" + "source": "https://github.com/laracasts/flash/tree/3.2.4" }, - "time": "2020-09-07T13:25:35+00:00" + "time": "2025-02-06T14:43:27+00:00" }, { "name": "laravel/framework", - "version": "v8.22.1", + "version": "v8.83.29", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "5c70991b96c5722afed541a996479b5112654c8b" + "reference": "d841a226a50c715431952a10260ba4fac9e91cc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/5c70991b96c5722afed541a996479b5112654c8b", - "reference": "5c70991b96c5722afed541a996479b5112654c8b", + "url": "https://api.github.com/repos/laravel/framework/zipball/d841a226a50c715431952a10260ba4fac9e91cc4", + "reference": "d841a226a50c715431952a10260ba4fac9e91cc4", "shasum": "" }, "require": { @@ -2013,34 +2357,37 @@ "ext-json": "*", "ext-mbstring": "*", "ext-openssl": "*", - "league/commonmark": "^1.3", + "laravel/serializable-closure": "^1.0", + "league/commonmark": "^1.3|^2.0.2", "league/flysystem": "^1.1", "monolog/monolog": "^2.0", - "nesbot/carbon": "^2.31", + "nesbot/carbon": "^2.53.1", "opis/closure": "^3.6", "php": "^7.3|^8.0", "psr/container": "^1.0", + "psr/log": "^1.0|^2.0", "psr/simple-cache": "^1.0", - "ramsey/uuid": "^4.0", - "swiftmailer/swiftmailer": "^6.0", - "symfony/console": "^5.1.4", - "symfony/error-handler": "^5.1.4", - "symfony/finder": "^5.1.4", - "symfony/http-foundation": "^5.1.4", - "symfony/http-kernel": "^5.1.4", - "symfony/mime": "^5.1.4", - "symfony/process": "^5.1.4", - "symfony/routing": "^5.1.4", - "symfony/var-dumper": "^5.1.4", + "ramsey/uuid": "^4.2.2", + "swiftmailer/swiftmailer": "^6.3", + "symfony/console": "^5.4", + "symfony/error-handler": "^5.4", + "symfony/finder": "^5.4", + "symfony/http-foundation": "^5.4", + "symfony/http-kernel": "^5.4", + "symfony/mime": "^5.4", + "symfony/process": "^5.4", + "symfony/routing": "^5.4", + "symfony/var-dumper": "^5.4", "tijsverkoyen/css-to-inline-styles": "^2.2.2", - "vlucas/phpdotenv": "^5.2", - "voku/portable-ascii": "^1.4.8" + "vlucas/phpdotenv": "^5.4.1", + "voku/portable-ascii": "^1.6.1" }, "conflict": { "tightenco/collect": "<5.5.33" }, "provide": { - "psr/container-implementation": "1.0" + "psr/container-implementation": "1.0", + "psr/simple-cache-implementation": "1.0" }, "replace": { "illuminate/auth": "self.version", @@ -2076,21 +2423,24 @@ "illuminate/view": "self.version" }, "require-dev": { - "aws/aws-sdk-php": "^3.155", - "doctrine/dbal": "^2.6|^3.0", - "filp/whoops": "^2.8", + "aws/aws-sdk-php": "^3.198.1", + "doctrine/dbal": "^2.13.3|^3.1.4", + "filp/whoops": "^2.14.3", "guzzlehttp/guzzle": "^6.5.5|^7.0.1", "league/flysystem-cached-adapter": "^1.0", - "mockery/mockery": "^1.4.2", - "orchestra/testbench-core": "^6.8", + "mockery/mockery": "^1.4.4", + "orchestra/testbench-core": "^6.27", "pda/pheanstalk": "^4.0", - "phpunit/phpunit": "^8.5.8|^9.3.3", - "predis/predis": "^1.1.1", - "symfony/cache": "^5.1.4" + "phpunit/phpunit": "^8.5.19|^9.5.8", + "predis/predis": "^1.1.9", + "symfony/cache": "^5.4" }, "suggest": { - "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.155).", - "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6|^3.0).", + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.198.1).", + "brianium/paratest": "Required to run tests in parallel (^6.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.4).", + "ext-bcmath": "Required to use the multiple_of validation rule.", "ext-ftp": "Required to use the Flysystem FTP driver.", "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", "ext-memcached": "Required to use the memcache cache driver.", @@ -2098,21 +2448,21 @@ "ext-posix": "Required to use all features of the queue worker.", "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", - "filp/whoops": "Required for friendly error pages in development (^2.8).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", "guzzlehttp/guzzle": "Required to use the HTTP Client, Mailgun mail driver and the ping methods on schedules (^6.5.5|^7.0.1).", "laravel/tinker": "Required to use the tinker console command (^2.0).", "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", - "mockery/mockery": "Required to use mocking (^1.4.2).", + "mockery/mockery": "Required to use mocking (^1.4.4).", "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", - "phpunit/phpunit": "Required to use assertions and run tests (^8.5.8|^9.3.3).", - "predis/predis": "Required to use the predis connector (^1.1.2).", + "phpunit/phpunit": "Required to use assertions and run tests (^8.5.19|^9.5.8).", + "predis/predis": "Required to use the predis connector (^1.1.9).", "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", - "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^5.1.4).", - "symfony/filesystem": "Required to enable support for relative symbolic links (^5.1.4).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0|^5.0|^6.0|^7.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^5.4).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^5.4).", "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0).", "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)." }, @@ -2157,28 +2507,29 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-01-13T13:37:56+00:00" + "time": "2024-11-20T15:55:41+00:00" }, { "name": "laravel/helpers", - "version": "v1.4.0", + "version": "v1.7.2", "source": { "type": "git", "url": "https://github.com/laravel/helpers.git", - "reference": "cde8ea2427db4f37d67729846b70452499210a21" + "reference": "672d79d5b5f65dc821e57783fa11f22c4d762d70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/helpers/zipball/cde8ea2427db4f37d67729846b70452499210a21", - "reference": "cde8ea2427db4f37d67729846b70452499210a21", + "url": "https://api.github.com/repos/laravel/helpers/zipball/672d79d5b5f65dc821e57783fa11f22c4d762d70", + "reference": "672d79d5b5f65dc821e57783fa11f22c4d762d70", "shasum": "" }, "require": { - "illuminate/support": "~5.8.0|^6.0|^7.0|^8.0", - "php": "^7.1.3|^8.0" + "illuminate/support": "~5.8.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "php": "^7.2.0|^8.0" }, "require-dev": { - "phpunit/phpunit": "^7.0|^8.0|^9.0" + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^7.0|^8.0|^9.0|^10.0" }, "type": "library", "extra": { @@ -2202,7 +2553,7 @@ }, { "name": "Dries Vints", - "email": "dries.vints@gmail.com" + "email": "dries@laravel.com" } ], "description": "Provides backwards compatibility for helpers in the latest Laravel release.", @@ -2211,57 +2562,57 @@ "laravel" ], "support": { - "source": "https://github.com/laravel/helpers/tree/v1.4.0" + "source": "https://github.com/laravel/helpers/tree/v1.7.2" }, - "time": "2020-11-03T16:38:41+00:00" + "time": "2025-01-24T15:41:25+00:00" }, { "name": "laravel/passport", - "version": "v10.1.0", + "version": "v10.4.2", "source": { "type": "git", "url": "https://github.com/laravel/passport.git", - "reference": "c2b93a7d8d93cf303bb1eefbfa5610f084f9bdd4" + "reference": "4bfdb9610575a0c84a6810701f4fd45fb8ab3888" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/passport/zipball/c2b93a7d8d93cf303bb1eefbfa5610f084f9bdd4", - "reference": "c2b93a7d8d93cf303bb1eefbfa5610f084f9bdd4", + "url": "https://api.github.com/repos/laravel/passport/zipball/4bfdb9610575a0c84a6810701f4fd45fb8ab3888", + "reference": "4bfdb9610575a0c84a6810701f4fd45fb8ab3888", "shasum": "" }, "require": { "ext-json": "*", - "firebase/php-jwt": "^5.0", - "illuminate/auth": "^8.2", - "illuminate/console": "^8.2", - "illuminate/container": "^8.2", - "illuminate/contracts": "^8.2", - "illuminate/cookie": "^8.2", - "illuminate/database": "^8.2", - "illuminate/encryption": "^8.2", - "illuminate/http": "^8.2", - "illuminate/support": "^8.2", + "firebase/php-jwt": "^6.0", + "illuminate/auth": "^8.37|^9.0", + "illuminate/console": "^8.37|^9.0", + "illuminate/container": "^8.37|^9.0", + "illuminate/contracts": "^8.37|^9.0", + "illuminate/cookie": "^8.37|^9.0", + "illuminate/database": "^8.37|^9.0", + "illuminate/encryption": "^8.37|^9.0", + "illuminate/http": "^8.37|^9.0", + "illuminate/support": "^8.37|^9.0", "lcobucci/jwt": "^3.4|^4.0", "league/oauth2-server": "^8.2", "nyholm/psr7": "^1.3", "php": "^7.3|^8.0", - "phpseclib/phpseclib": "^2.0", + "phpseclib/phpseclib": "^2.0|^3.0", "symfony/psr-http-message-bridge": "^2.0" }, "require-dev": { "mockery/mockery": "^1.0", - "orchestra/testbench": "^6.0", + "orchestra/testbench": "^6.0|^7.0", "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "10.x-dev" - }, "laravel": { "providers": [ "Laravel\\Passport\\PassportServiceProvider" ] + }, + "branch-alias": { + "dev-master": "10.x-dev" } }, "autoload": { @@ -2290,42 +2641,101 @@ "issues": "https://github.com/laravel/passport/issues", "source": "https://github.com/laravel/passport" }, - "time": "2020-11-26T07:57:30+00:00" + "time": "2023-02-21T07:47:20+00:00" }, { - "name": "laravel/tinker", - "version": "v2.5.0", + "name": "laravel/serializable-closure", + "version": "v1.3.7", "source": { "type": "git", - "url": "https://github.com/laravel/tinker.git", - "reference": "45884b526e10a88a1b179fa1a1a24d5468c668c2" + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "4f48ade902b94323ca3be7646db16209ec76be3d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/45884b526e10a88a1b179fa1a1a24d5468c668c2", - "reference": "45884b526e10a88a1b179fa1a1a24d5468c668c2", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/4f48ade902b94323ca3be7646db16209ec76be3d", + "reference": "4f48ade902b94323ca3be7646db16209ec76be3d", "shasum": "" }, "require": { - "illuminate/console": "^6.0|^7.0|^8.0", - "illuminate/contracts": "^6.0|^7.0|^8.0", - "illuminate/support": "^6.0|^7.0|^8.0", - "php": "^7.2.5|^8.0", - "psy/psysh": "^0.10.4", - "symfony/var-dumper": "^4.3.4|^5.0" + "php": "^7.3|^8.0" }, "require-dev": { - "mockery/mockery": "~1.3.3|^1.4.2", - "phpunit/phpunit": "^8.5.8|^9.3.3" - }, - "suggest": { - "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0)." + "illuminate/support": "^8.0|^9.0|^10.0|^11.0", + "nesbot/carbon": "^2.61|^3.0", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11|^6.2.0|^7.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2024-11-14T18:34:49+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.10.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/22177cc71807d38f2810c6204d8f7183d88a57d3", + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." + }, + "type": "library", + "extra": { "laravel": { "providers": [ "Laravel\\Tinker\\TinkerServiceProvider" @@ -2356,39 +2766,43 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.5.0" + "source": "https://github.com/laravel/tinker/tree/v2.10.1" }, - "time": "2020-10-29T13:07:12+00:00" + "time": "2025-01-27T14:24:01+00:00" }, { "name": "laravel/ui", - "version": "v3.2.0", + "version": "v3.4.6", "source": { "type": "git", "url": "https://github.com/laravel/ui.git", - "reference": "a1f82c6283c8373ea1958b8a27c3d5c98cade351" + "reference": "65ec5c03f7fee2c8ecae785795b829a15be48c2c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/ui/zipball/a1f82c6283c8373ea1958b8a27c3d5c98cade351", - "reference": "a1f82c6283c8373ea1958b8a27c3d5c98cade351", + "url": "https://api.github.com/repos/laravel/ui/zipball/65ec5c03f7fee2c8ecae785795b829a15be48c2c", + "reference": "65ec5c03f7fee2c8ecae785795b829a15be48c2c", "shasum": "" }, "require": { - "illuminate/console": "^8.0", - "illuminate/filesystem": "^8.0", - "illuminate/support": "^8.0", + "illuminate/console": "^8.42|^9.0", + "illuminate/filesystem": "^8.42|^9.0", + "illuminate/support": "^8.82|^9.0", + "illuminate/validation": "^8.42|^9.0", "php": "^7.3|^8.0" }, + "require-dev": { + "orchestra/testbench": "^6.23|^7.0" + }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - }, "laravel": { "providers": [ "Laravel\\Ui\\UiServiceProvider" ] + }, + "branch-alias": { + "dev-master": "3.x-dev" } }, "autoload": { @@ -2413,37 +2827,36 @@ "ui" ], "support": { - "issues": "https://github.com/laravel/ui/issues", - "source": "https://github.com/laravel/ui/tree/v3.2.0" + "source": "https://github.com/laravel/ui/tree/v3.4.6" }, - "time": "2021-01-06T19:20:22+00:00" + "time": "2022-05-20T13:38:08+00:00" }, { "name": "laravelcollective/html", - "version": "v6.2.1", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/LaravelCollective/html.git", - "reference": "ae15b9c4bf918ec3a78f092b8555551dd693fde3" + "reference": "64ddfdcaeeb8d332bd98bef442bef81e39c3910b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/LaravelCollective/html/zipball/ae15b9c4bf918ec3a78f092b8555551dd693fde3", - "reference": "ae15b9c4bf918ec3a78f092b8555551dd693fde3", + "url": "https://api.github.com/repos/LaravelCollective/html/zipball/64ddfdcaeeb8d332bd98bef442bef81e39c3910b", + "reference": "64ddfdcaeeb8d332bd98bef442bef81e39c3910b", "shasum": "" }, "require": { - "illuminate/http": "^6.0|^7.0|^8.0", - "illuminate/routing": "^6.0|^7.0|^8.0", - "illuminate/session": "^6.0|^7.0|^8.0", - "illuminate/support": "^6.0|^7.0|^8.0", - "illuminate/view": "^6.0|^7.0|^8.0", + "illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/routing": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/session": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/view": "^6.0|^7.0|^8.0|^9.0|^10.0", "php": ">=7.2.5" }, "require-dev": { - "illuminate/database": "^6.0|^7.0|^8.0", + "illuminate/database": "^6.0|^7.0|^8.0|^9.0|^10.0", "mockery/mockery": "~1.0", - "phpunit/phpunit": "~8.5" + "phpunit/phpunit": "~8.5|^9.5.10" }, "type": "library", "extra": { @@ -2461,12 +2874,12 @@ } }, "autoload": { - "psr-4": { - "Collective\\Html\\": "src/" - }, "files": [ "src/helpers.php" - ] + ], + "psr-4": { + "Collective\\Html\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2488,72 +2901,60 @@ "issues": "https://github.com/LaravelCollective/html/issues", "source": "https://github.com/LaravelCollective/html" }, - "time": "2020-12-15T20:20:05+00:00" + "abandoned": "spatie/laravel-html", + "time": "2023-04-25T02:46:11+00:00" }, { - "name": "lcobucci/jwt", - "version": "3.4.2", + "name": "lcobucci/clock", + "version": "3.3.1", "source": { "type": "git", - "url": "https://github.com/lcobucci/jwt.git", - "reference": "17cb82dd625ccb17c74bf8f38563d3b260306483" + "url": "https://github.com/lcobucci/clock.git", + "reference": "db3713a61addfffd615b79bf0bc22f0ccc61b86b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/jwt/zipball/17cb82dd625ccb17c74bf8f38563d3b260306483", - "reference": "17cb82dd625ccb17c74bf8f38563d3b260306483", + "url": "https://api.github.com/repos/lcobucci/clock/zipball/db3713a61addfffd615b79bf0bc22f0ccc61b86b", + "reference": "db3713a61addfffd615b79bf0bc22f0ccc61b86b", "shasum": "" }, "require": { - "ext-mbstring": "*", - "ext-openssl": "*", - "php": "^5.6 || ^7.0" + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", + "psr/clock": "^1.0" + }, + "provide": { + "psr/clock-implementation": "1.0" }, "require-dev": { - "mikey179/vfsstream": "~1.5", - "phpmd/phpmd": "~2.2", - "phpunit/php-invoker": "~1.1", - "phpunit/phpunit": "^5.7 || ^7.3", - "squizlabs/php_codesniffer": "~2.3" - }, - "suggest": { - "lcobucci/clock": "*" + "infection/infection": "^0.29", + "lcobucci/coding-standard": "^11.1.0", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.10.25", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.13", + "phpstan/phpstan-strict-rules": "^1.5.1", + "phpunit/phpunit": "^11.3.6" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, "autoload": { "psr-4": { - "Lcobucci\\JWT\\": "src" - }, - "files": [ - "compat/class-aliases.php", - "compat/json-exception-polyfill.php", - "compat/lcobucci-clock-polyfill.php" - ] + "Lcobucci\\Clock\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Luís Otávio Cobucci Oblonczyk", - "email": "lcobucci@gmail.com", - "role": "Developer" + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com" } ], - "description": "A simple library to work with JSON Web Token and JSON Web Signature", - "keywords": [ - "JWS", - "jwt" - ], + "description": "Yet another clock abstraction", "support": { - "issues": "https://github.com/lcobucci/jwt/issues", - "source": "https://github.com/lcobucci/jwt/tree/3.4.2" + "issues": "https://github.com/lcobucci/clock/issues", + "source": "https://github.com/lcobucci/clock/tree/3.3.1" }, "funding": [ { @@ -2565,46 +2966,133 @@ "type": "patreon" } ], - "time": "2020-12-03T13:43:45+00:00" + "time": "2024-09-24T20:45:14+00:00" }, { - "name": "league/commonmark", - "version": "1.5.7", + "name": "lcobucci/jwt", + "version": "4.3.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/commonmark.git", - "reference": "11df9b36fd4f1d2b727a73bf14931d81373b9a54" + "url": "https://github.com/lcobucci/jwt.git", + "reference": "4d7de2fe0d51a96418c0d04004986e410e87f6b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/11df9b36fd4f1d2b727a73bf14931d81373b9a54", - "reference": "11df9b36fd4f1d2b727a73bf14931d81373b9a54", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/4d7de2fe0d51a96418c0d04004986e410e87f6b4", + "reference": "4d7de2fe0d51a96418c0d04004986e410e87f6b4", + "shasum": "" + }, + "require": { + "ext-hash": "*", + "ext-json": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-sodium": "*", + "lcobucci/clock": "^2.0 || ^3.0", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "infection/infection": "^0.21", + "lcobucci/coding-standard": "^6.0", + "mikey179/vfsstream": "^1.6.7", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/php-invoker": "^3.1", + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Lcobucci\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com", + "role": "Developer" + } + ], + "description": "A simple library to work with JSON Web Token and JSON Web Signature", + "keywords": [ + "JWS", + "jwt" + ], + "support": { + "issues": "https://github.com/lcobucci/jwt/issues", + "source": "https://github.com/lcobucci/jwt/tree/4.3.0" + }, + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2023-01-02T13:28:00+00:00" + }, + { + "name": "league/commonmark", + "version": "2.6.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "d990688c91cedfb69753ffc2512727ec646df2ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d990688c91cedfb69753ffc2512727ec646df2ad", + "reference": "d990688c91cedfb69753ffc2512727ec646df2ad", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": "^7.1 || ^8.0" - }, - "conflict": { - "scrutinizer/ocular": "1.7.*" + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" }, "require-dev": { - "cebe/markdown": "~1.0", - "commonmark/commonmark.js": "0.29.2", - "erusev/parsedown": "~1.0", + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", "ext-json": "*", "github/gfm": "0.29.0", - "michelf/php-markdown": "~1.4", - "mikehaertl/php-shellcommand": "^1.4", - "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.2", - "scrutinizer/ocular": "^1.5", - "symfony/finder": "^4.2" + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 | ^7.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" }, - "bin": [ - "bin/commonmark" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.7-dev" + } + }, "autoload": { "psr-4": { "League\\CommonMark\\": "src" @@ -2622,7 +3110,7 @@ "role": "Lead Developer" } ], - "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and Github-Flavored Markdown (GFM)", + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", "homepage": "https://commonmark.thephpleague.com", "keywords": [ "commonmark", @@ -2636,15 +3124,12 @@ ], "support": { "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", "issues": "https://github.com/thephpleague/commonmark/issues", "rss": "https://github.com/thephpleague/commonmark/releases.atom", "source": "https://github.com/thephpleague/commonmark" }, "funding": [ - { - "url": "https://enjoy.gitstore.app/repositories/thephpleague/commonmark", - "type": "custom" - }, { "url": "https://www.colinodell.com/sponsor", "type": "custom" @@ -2657,16 +3142,94 @@ "url": "https://github.com/colinodell", "type": "github" }, - { - "url": "https://www.patreon.com/colinodell", - "type": "patreon" - }, { "url": "https://tidelift.com/funding/github/packagist/league/commonmark", "type": "tidelift" } ], - "time": "2020-10-31T13:49:32+00:00" + "time": "2024-12-29T14:10:59+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" }, { "name": "league/event", @@ -2724,16 +3287,16 @@ }, { "name": "league/flysystem", - "version": "1.1.3", + "version": "1.1.10", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "9be3b16c877d477357c015cec057548cf9b2a14a" + "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/9be3b16c877d477357c015cec057548cf9b2a14a", - "reference": "9be3b16c877d477357c015cec057548cf9b2a14a", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/3239285c825c152bcc315fe0e87d6b55f5972ed1", + "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1", "shasum": "" }, "require": { @@ -2749,7 +3312,6 @@ "phpunit/phpunit": "^8.5.8" }, "suggest": { - "ext-fileinfo": "Required for MimeType", "ext-ftp": "Allows you to use FTP server storage", "ext-openssl": "Allows you to use FTPS server storage", "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", @@ -2807,7 +3369,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/1.x" + "source": "https://github.com/thephpleague/flysystem/tree/1.1.10" }, "funding": [ { @@ -2815,29 +3377,30 @@ "type": "other" } ], - "time": "2020-08-23T07:39:11+00:00" + "time": "2022-10-04T09:16:37+00:00" }, { "name": "league/mime-type-detection", - "version": "1.5.1", + "version": "1.16.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "353f66d7555d8a90781f6f5e7091932f9a4250aa" + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/353f66d7555d8a90781f6f5e7091932f9a4250aa", - "reference": "353f66d7555d8a90781f6f5e7091932f9a4250aa", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", "shasum": "" }, "require": { "ext-fileinfo": "*", - "php": "^7.2 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.36", - "phpunit/phpunit": "^8.5.8" + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" }, "type": "library", "autoload": { @@ -2858,7 +3421,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.5.1" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" }, "funding": [ { @@ -2870,40 +3433,41 @@ "type": "tidelift" } ], - "time": "2020-10-18T11:50:25+00:00" + "time": "2024-09-21T08:32:55+00:00" }, { "name": "league/oauth2-server", - "version": "8.2.4", + "version": "8.5.5", "source": { "type": "git", "url": "https://github.com/thephpleague/oauth2-server.git", - "reference": "622eaa1f28eb4a2dea0cfc7e4f5280fac794e83c" + "reference": "cc8778350f905667e796b3c2364a9d3bd7a73518" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth2-server/zipball/622eaa1f28eb4a2dea0cfc7e4f5280fac794e83c", - "reference": "622eaa1f28eb4a2dea0cfc7e4f5280fac794e83c", + "url": "https://api.github.com/repos/thephpleague/oauth2-server/zipball/cc8778350f905667e796b3c2364a9d3bd7a73518", + "reference": "cc8778350f905667e796b3c2364a9d3bd7a73518", "shasum": "" }, "require": { - "defuse/php-encryption": "^2.2.1", - "ext-json": "*", + "defuse/php-encryption": "^2.3", "ext-openssl": "*", - "lcobucci/jwt": "^3.4 || ^4.0", + "lcobucci/clock": "^2.2 || ^3.0", + "lcobucci/jwt": "^4.3 || ^5.0", "league/event": "^2.2", - "php": "^7.2 || ^8.0", - "psr/http-message": "^1.0.1" + "league/uri": "^6.7 || ^7.0", + "php": "^8.0", + "psr/http-message": "^1.0.1 || ^2.0" }, "replace": { "league/oauth2server": "*", "lncd/oauth2": "*" }, "require-dev": { - "laminas/laminas-diactoros": "^2.4.1", + "laminas/laminas-diactoros": "^3.0.0", "phpstan/phpstan": "^0.12.57", "phpstan/phpstan-phpunit": "^0.12.16", - "phpunit/phpunit": "^8.5.13", + "phpunit/phpunit": "^9.6.6", "roave/security-advisories": "dev-master" }, "type": "library", @@ -2949,7 +3513,7 @@ ], "support": { "issues": "https://github.com/thephpleague/oauth2-server/issues", - "source": "https://github.com/thephpleague/oauth2-server/tree/8.2.4" + "source": "https://github.com/thephpleague/oauth2-server/tree/8.5.5" }, "funding": [ { @@ -2957,56 +3521,569 @@ "type": "github" } ], - "time": "2020-12-10T11:35:44+00:00" + "time": "2024-12-20T23:06:10+00:00" }, { - "name": "monolog/monolog", - "version": "2.2.0", + "name": "league/uri", + "version": "7.5.1", "source": { "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084" + "url": "https://github.com/thephpleague/uri.git", + "reference": "81fb5145d2644324614cc532b28efd0215bda430" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1cb1cde8e8dd0f70cc0fe51354a59acad9302084", - "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/81fb5145d2644324614cc532b28efd0215bda430", + "reference": "81fb5145d2644324614cc532b28efd0215bda430", + "shasum": "" + }, + "require": { + "league/uri-interfaces": "^7.5", + "php": "^8.1" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", + "league/uri-components": "Needed to easily manipulate URI objects components", + "php-64bit": "to improve IPV4 host parsing", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "uri-template", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.5.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2024-12-08T08:40:02+00:00" + }, + { + "name": "league/uri-interfaces", + "version": "7.5.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", + "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1", + "psr/http-factory": "^1", + "psr/http-message": "^1.1 || ^2.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common interfaces and classes for URI representation and interaction", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.5.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2024-12-08T08:18:47+00:00" + }, + { + "name": "maatwebsite/excel", + "version": "3.1.64", + "source": { + "type": "git", + "url": "https://github.com/SpartnerNL/Laravel-Excel.git", + "reference": "e25d44a2d91da9179cd2d7fec952313548597a79" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/SpartnerNL/Laravel-Excel/zipball/e25d44a2d91da9179cd2d7fec952313548597a79", + "reference": "e25d44a2d91da9179cd2d7fec952313548597a79", + "shasum": "" + }, + "require": { + "composer/semver": "^3.3", + "ext-json": "*", + "illuminate/support": "5.8.*||^6.0||^7.0||^8.0||^9.0||^10.0||^11.0||^12.0", + "php": "^7.0||^8.0", + "phpoffice/phpspreadsheet": "^1.29.9", + "psr/simple-cache": "^1.0||^2.0||^3.0" + }, + "require-dev": { + "laravel/scout": "^7.0||^8.0||^9.0||^10.0", + "orchestra/testbench": "^6.0||^7.0||^8.0||^9.0||^10.0", + "predis/predis": "^1.1" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Excel": "Maatwebsite\\Excel\\Facades\\Excel" + }, + "providers": [ + "Maatwebsite\\Excel\\ExcelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Maatwebsite\\Excel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Patrick Brouwers", + "email": "patrick@spartner.nl" + } + ], + "description": "Supercharged Excel exports and imports in Laravel", + "keywords": [ + "PHPExcel", + "batch", + "csv", + "excel", + "export", + "import", + "laravel", + "php", + "phpspreadsheet" + ], + "support": { + "issues": "https://github.com/SpartnerNL/Laravel-Excel/issues", + "source": "https://github.com/SpartnerNL/Laravel-Excel/tree/3.1.64" + }, + "funding": [ + { + "url": "https://laravel-excel.com/commercial-support", + "type": "custom" + }, + { + "url": "https://github.com/patrickbrouwers", + "type": "github" + } + ], + "time": "2025-02-24T11:12:50+00:00" + }, + { + "name": "maennchen/zipstream-php", + "version": "3.1.2", + "source": { + "type": "git", + "url": "https://github.com/maennchen/ZipStream-PHP.git", + "reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/aeadcf5c412332eb426c0f9b4485f6accba2a99f", + "reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-zlib": "*", + "php-64bit": "^8.2" + }, + "require-dev": { + "brianium/paratest": "^7.7", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.16", + "guzzlehttp/guzzle": "^7.5", + "mikey179/vfsstream": "^1.6", + "php-coveralls/php-coveralls": "^2.5", + "phpunit/phpunit": "^11.0", + "vimeo/psalm": "^6.0" + }, + "suggest": { + "guzzlehttp/psr7": "^2.4", + "psr/http-message": "^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZipStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Duncan", + "email": "pabs@pablotron.org" + }, + { + "name": "Jonatan Männchen", + "email": "jonatan@maennchen.ch" + }, + { + "name": "Jesse Donat", + "email": "donatj@gmail.com" + }, + { + "name": "András Kolesár", + "email": "kolesar@kolesar.hu" + } + ], + "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", + "keywords": [ + "stream", + "zip" + ], + "support": { + "issues": "https://github.com/maennchen/ZipStream-PHP/issues", + "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.2" + }, + "funding": [ + { + "url": "https://github.com/maennchen", + "type": "github" + } + ], + "time": "2025-01-27T12:07:53+00:00" + }, + { + "name": "markbaker/complex", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPComplex/issues", + "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2" + }, + "time": "2022-12-06T16:21:08+00:00" + }, + { + "name": "markbaker/matrix", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPMatrix.git", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "^4.0", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "sebastian/phpcpd": "^4.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Matrix\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@demon-angel.eu" + } + ], + "description": "PHP Class for working with matrices", + "homepage": "https://github.com/MarkBaker/PHPMatrix", + "keywords": [ + "mathematics", + "matrix", + "vector" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPMatrix/issues", + "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1" + }, + "time": "2022-12-02T22:17:43+00:00" + }, + { + "name": "masterminds/html5", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" + }, + "time": "2024-03-31T07:05:07+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.10.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "5cf826f2991858b54d5c3809bee745560a1042a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/5cf826f2991858b54d5c3809bee745560a1042a7", + "reference": "5cf826f2991858b54d5c3809bee745560a1042a7", "shasum": "" }, "require": { "php": ">=7.2", - "psr/log": "^1.0.1" + "psr/log": "^1.0.1 || ^2.0 || ^3.0" }, "provide": { - "psr/log-implementation": "1.0.0" + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" }, "require-dev": { "aws/aws-sdk-php": "^2.4.9 || ^3.0", "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7", - "graylog2/gelf-php": "^1.4.2", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2@dev", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", - "php-amqplib/php-amqplib": "~2.4", - "php-console/php-console": "^3.1.3", - "phpspec/prophecy": "^1.6.1", - "phpstan/phpstan": "^0.12.59", - "phpunit/phpunit": "^8.5", - "predis/predis": "^1.1", - "rollbar/rollbar": "^1.3", - "ruflin/elastica": ">=0.90 <7.0.1", - "swiftmailer/swiftmailer": "^5.3|^6.0" + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.38 || ^9.6.19", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" }, "suggest": { "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", "doctrine/couchdb": "Allow sending log messages to a CouchDB server", "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", "ext-mbstring": "Allow to work properly with unicode symbols", "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "php-console/php-console": "Allow sending log messages to Google Chrome", "rollbar/rollbar": "Allow sending log messages to Rollbar", "ruflin/elastica": "Allow sending log messages to an Elastic Search server" }, @@ -3041,7 +4118,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.2.0" + "source": "https://github.com/Seldaek/monolog/tree/2.10.0" }, "funding": [ { @@ -3053,36 +4130,45 @@ "type": "tidelift" } ], - "time": "2020-12-14T13:15:25+00:00" + "time": "2024-11-12T12:43:37+00:00" }, { "name": "nesbot/carbon", - "version": "2.43.0", + "version": "2.73.0", "source": { "type": "git", - "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "d32c57d8389113742f4a88725a170236470012e2" + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "9228ce90e1035ff2f0db84b40ec2e023ed802075" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/d32c57d8389113742f4a88725a170236470012e2", - "reference": "d32c57d8389113742f4a88725a170236470012e2", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/9228ce90e1035ff2f0db84b40ec2e023ed802075", + "reference": "9228ce90e1035ff2f0db84b40ec2e023ed802075", "shasum": "" }, "require": { + "carbonphp/carbon-doctrine-types": "*", "ext-json": "*", "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", "symfony/polyfill-mbstring": "^1.0", - "symfony/translation": "^3.4 || ^4.0 || ^5.0" + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "provide": { + "psr/clock-implementation": "1.0" }, "require-dev": { - "doctrine/orm": "^2.7", - "friendsofphp/php-cs-fixer": "^2.14 || ^3.0", + "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0", + "doctrine/orm": "^2.7 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "<6", "phpmd/phpmd": "^2.9", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.54", - "phpunit/phpunit": "^7.5 || ^8.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", "squizlabs/php_codesniffer": "^3.4" }, "bin": [ @@ -3090,10 +4176,6 @@ ], "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.x-dev", - "dev-3.x": "3.x-dev" - }, "laravel": { "providers": [ "Carbon\\Laravel\\ServiceProvider" @@ -3103,6 +4185,10 @@ "includes": [ "extension.neon" ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" } }, "autoload": { @@ -3118,57 +4204,212 @@ { "name": "Brian Nesbitt", "email": "brian@nesbot.com", - "homepage": "http://nesbot.com" + "homepage": "https://markido.com" }, { "name": "kylekatarnls", - "homepage": "http://github.com/kylekatarnls" + "homepage": "https://github.com/kylekatarnls" } ], "description": "An API extension for DateTime that supports 281 different languages.", - "homepage": "http://carbon.nesbot.com", + "homepage": "https://carbon.nesbot.com", "keywords": [ "date", "datetime", "time" ], "support": { + "docs": "https://carbon.nesbot.com/docs", "issues": "https://github.com/briannesbitt/Carbon/issues", "source": "https://github.com/briannesbitt/Carbon" }, "funding": [ { - "url": "https://opencollective.com/Carbon", - "type": "open_collective" + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", "type": "tidelift" } ], - "time": "2020-12-17T20:55:32+00:00" + "time": "2025-01-08T20:10:23+00:00" }, { - "name": "nikic/php-parser", - "version": "v4.10.4", + "name": "nette/schema", + "version": "v1.3.2", "source": { "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e" + "url": "https://github.com/nette/schema.git", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e", - "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e", + "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d", "shasum": "" }, "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.4" + }, + "require-dev": { + "nette/tester": "^2.5.2", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.2" + }, + "time": "2024-10-06T23:10:23+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.5", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "shasum": "" + }, + "require": { + "php": "8.0 - 8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.5" + }, + "time": "2024-08-07T15:39:19+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.4" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^9.0" }, "bin": [ "bin/php-parse" @@ -3176,7 +4417,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -3200,44 +4441,45 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.4" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" }, - "time": "2020-12-20T10:01:03+00:00" + "time": "2024-12-30T11:07:19+00:00" }, { "name": "nyholm/psr7", - "version": "1.3.2", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/Nyholm/psr7.git", - "reference": "a272953743c454ac4af9626634daaf5ab3ce1173" + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a272953743c454ac4af9626634daaf5ab3ce1173", - "reference": "a272953743c454ac4af9626634daaf5ab3ce1173", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", "shasum": "" }, "require": { - "php": ">=7.1", - "php-http/message-factory": "^1.0", + "php": ">=7.2", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.1 || ^2.0" }, "provide": { + "php-http/message-factory-implementation": "1.0", "psr/http-factory-implementation": "1.0", "psr/http-message-implementation": "1.0" }, "require-dev": { - "http-interop/http-factory-tests": "^0.8", + "http-interop/http-factory-tests": "^0.9", + "php-http/message-factory": "^1.0", "php-http/psr7-integration-tests": "^1.0", - "phpunit/phpunit": "^7.5 || 8.5 || 9.4", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", "symfony/error-handler": "^4.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "1.8-dev" } }, "autoload": { @@ -3267,7 +4509,7 @@ ], "support": { "issues": "https://github.com/Nyholm/psr7/issues", - "source": "https://github.com/Nyholm/psr7/tree/1.3.2" + "source": "https://github.com/Nyholm/psr7/tree/1.8.2" }, "funding": [ { @@ -3279,20 +4521,20 @@ "type": "github" } ], - "time": "2020-11-14T17:35:34+00:00" + "time": "2024-09-09T07:06:30+00:00" }, { "name": "opis/closure", - "version": "3.6.1", + "version": "3.6.3", "source": { "type": "git", "url": "https://github.com/opis/closure.git", - "reference": "943b5d70cc5ae7483f6aff6ff43d7e34592ca0f5" + "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opis/closure/zipball/943b5d70cc5ae7483f6aff6ff43d7e34592ca0f5", - "reference": "943b5d70cc5ae7483f6aff6ff43d7e34592ca0f5", + "url": "https://api.github.com/repos/opis/closure/zipball/3d81e4309d2a927abbe66df935f4bb60082805ad", + "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad", "shasum": "" }, "require": { @@ -3309,12 +4551,12 @@ } }, "autoload": { - "psr-4": { - "Opis\\Closure\\": "src/" - }, "files": [ "functions.php" - ] + ], + "psr-4": { + "Opis\\Closure\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3342,9 +4584,76 @@ ], "support": { "issues": "https://github.com/opis/closure/issues", - "source": "https://github.com/opis/closure/tree/3.6.1" + "source": "https://github.com/opis/closure/tree/3.6.3" }, - "time": "2020-11-07T02:01:34+00:00" + "time": "2022-01-27T09:35:39+00:00" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "df1e7fde177501eee2037dd159cf04f5f301a512" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/df1e7fde177501eee2037dd159cf04f5f301a512", + "reference": "df1e7fde177501eee2037dd159cf04f5f301a512", + "shasum": "" + }, + "require": { + "php": "^8" + }, + "require-dev": { + "phpunit/phpunit": "^9", + "vimeo/psalm": "^4|^5" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2024-05-08T12:36:18+00:00" }, { "name": "paragonie/random_compat", @@ -3398,20 +4707,23 @@ }, { "name": "phenx/php-font-lib", - "version": "0.5.2", + "version": "0.5.6", "source": { "type": "git", - "url": "https://github.com/PhenX/php-font-lib.git", - "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8" + "url": "https://github.com/dompdf/php-font-lib.git", + "reference": "a1681e9793040740a405ac5b189275059e2a9863" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PhenX/php-font-lib/zipball/ca6ad461f032145fff5971b5985e5af9e7fa88d8", - "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8", + "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/a1681e9793040740a405ac5b189275059e2a9863", + "reference": "a1681e9793040740a405ac5b189275059e2a9863", "shasum": "" }, + "require": { + "ext-mbstring": "*" + }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5 || ^6 || ^7" + "symfony/phpunit-bridge": "^3 || ^4 || ^5 || ^6" }, "type": "library", "autoload": { @@ -3421,7 +4733,7 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "LGPL-3.0" + "LGPL-2.1-or-later" ], "authors": [ { @@ -3432,30 +4744,32 @@ "description": "A library to read, parse, export and make subsets of different types of font files.", "homepage": "https://github.com/PhenX/php-font-lib", "support": { - "issues": "https://github.com/PhenX/php-font-lib/issues", - "source": "https://github.com/PhenX/php-font-lib/tree/0.5.2" + "issues": "https://github.com/dompdf/php-font-lib/issues", + "source": "https://github.com/dompdf/php-font-lib/tree/0.5.6" }, - "time": "2020-03-08T15:31:32+00:00" + "time": "2024-01-29T14:45:26+00:00" }, { "name": "phenx/php-svg-lib", - "version": "v0.3.3", + "version": "0.5.4", "source": { "type": "git", - "url": "https://github.com/PhenX/php-svg-lib.git", - "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32" + "url": "https://github.com/dompdf/php-svg-lib.git", + "reference": "46b25da81613a9cf43c83b2a8c2c1bdab27df691" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PhenX/php-svg-lib/zipball/5fa61b65e612ce1ae15f69b3d223cb14ecc60e32", - "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32", + "url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/46b25da81613a9cf43c83b2a8c2c1bdab27df691", + "reference": "46b25da81613a9cf43c83b2a8c2c1bdab27df691", "shasum": "" }, "require": { - "sabberworm/php-css-parser": "^8.3" + "ext-mbstring": "*", + "php": "^7.1 || ^8.0", + "sabberworm/php-css-parser": "^8.4" }, "require-dev": { - "phpunit/phpunit": "^5.5|^6.5" + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5" }, "type": "library", "autoload": { @@ -3465,7 +4779,7 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "LGPL-3.0" + "LGPL-3.0-or-later" ], "authors": [ { @@ -3476,38 +4790,73 @@ "description": "A library to read, parse and export to PDF SVG files.", "homepage": "https://github.com/PhenX/php-svg-lib", "support": { - "issues": "https://github.com/PhenX/php-svg-lib/issues", - "source": "https://github.com/PhenX/php-svg-lib/tree/master" + "issues": "https://github.com/dompdf/php-svg-lib/issues", + "source": "https://github.com/dompdf/php-svg-lib/tree/0.5.4" }, - "time": "2019-09-11T20:02:13+00:00" + "time": "2024-04-08T12:52:34+00:00" }, { - "name": "php-http/message-factory", - "version": "v1.0.2", + "name": "phpoffice/phpspreadsheet", + "version": "1.29.10", "source": { "type": "git", - "url": "https://github.com/php-http/message-factory.git", - "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1" + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "c80041b1628c4f18030407134fe88303661d4e4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1", - "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/c80041b1628c4f18030407134fe88303661d4e4e", + "reference": "c80041b1628c4f18030407134fe88303661d4e4e", "shasum": "" }, "require": { - "php": ">=5.4", - "psr/http-message": "^1.0" + "composer/pcre": "^1||^2||^3", + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "ezyang/htmlpurifier": "^4.15", + "maennchen/zipstream-php": "^2.1 || ^3.0", + "markbaker/complex": "^3.0", + "markbaker/matrix": "^3.0", + "php": "^7.4 || ^8.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-main", + "dompdf/dompdf": "^1.0 || ^2.0 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.2", + "mitoteam/jpgraph": "^10.3", + "mpdf/mpdf": "^8.1.1", + "phpcompatibility/php-compatibility": "^9.3", + "phpstan/phpstan": "^1.1", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^8.5 || ^9.0", + "squizlabs/php_codesniffer": "^3.7", + "tecnickcom/tcpdf": "^6.5" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer", + "ext-intl": "PHP Internationalization Functions", + "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, "autoload": { "psr-4": { - "Http\\Message\\": "src/" + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" } }, "notification-url": "https://packagist.org/downloads/", @@ -3516,50 +4865,71 @@ ], "authors": [ { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "name": "Maarten Balliauw", + "homepage": "https://blog.maartenballiauw.be" + }, + { + "name": "Mark Baker", + "homepage": "https://markbakeruk.net" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" } ], - "description": "Factory interfaces for PSR-7 HTTP Message", - "homepage": "http://php-http.org", + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", "keywords": [ - "factory", - "http", - "message", - "stream", - "uri" + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" ], "support": { - "issues": "https://github.com/php-http/message-factory/issues", - "source": "https://github.com/php-http/message-factory/tree/master" + "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.10" }, - "time": "2015-12-19T14:08:53+00:00" + "time": "2025-02-08T02:56:14+00:00" }, { "name": "phpoption/phpoption", - "version": "1.7.5", + "version": "1.9.3", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525" + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/994ecccd8f3283ecf5ac33254543eb0ac946d525", - "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", "shasum": "" }, "require": { - "php": "^5.5.9 || ^7.0 || ^8.0" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "phpunit/phpunit": "^4.8.35 || ^5.7.27 || ^6.5.6 || ^7.0 || ^8.0 || ^9.0" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" }, "type": "library", "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, "branch-alias": { - "dev-master": "1.7-dev" + "dev-master": "1.9-dev" } }, "autoload": { @@ -3574,11 +4944,13 @@ "authors": [ { "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com" + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" }, { "name": "Graham Campbell", - "email": "graham@alt-three.com" + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" } ], "description": "Option Type for PHP", @@ -3590,7 +4962,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.7.5" + "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" }, "funding": [ { @@ -3602,31 +4974,32 @@ "type": "tidelift" } ], - "time": "2020-07-20T17:29:33+00:00" + "time": "2024-07-20T21:41:07+00:00" }, { "name": "phpseclib/phpseclib", - "version": "2.0.30", + "version": "3.0.43", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "136b9ca7eebef78be14abf90d65c5e57b6bc5d36" + "reference": "709ec107af3cb2f385b9617be72af8cf62441d02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/136b9ca7eebef78be14abf90d65c5e57b6bc5d36", - "reference": "136b9ca7eebef78be14abf90d65c5e57b6bc5d36", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/709ec107af3cb2f385b9617be72af8cf62441d02", + "reference": "709ec107af3cb2f385b9617be72af8cf62441d02", "shasum": "" }, "require": { - "php": ">=5.3.3" + "paragonie/constant_time_encoding": "^1|^2|^3", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" }, "require-dev": { - "phing/phing": "~2.7", - "phpunit/phpunit": "^4.8.35|^5.7|^6.0|^9.4", - "squizlabs/php_codesniffer": "~2.0" + "phpunit/phpunit": "*" }, "suggest": { + "ext-dom": "Install the DOM extension to load XML formatted public keys.", "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", @@ -3638,7 +5011,7 @@ "phpseclib/bootstrap.php" ], "psr-4": { - "phpseclib\\": "phpseclib/" + "phpseclib3\\": "phpseclib/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3695,7 +5068,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/2.0.30" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.43" }, "funding": [ { @@ -3711,24 +5084,24 @@ "type": "tidelift" } ], - "time": "2020-12-17T05:42:04+00:00" + "time": "2024-12-14T21:12:59+00:00" }, { - "name": "psr/container", - "version": "1.0.0", + "name": "psr/cache", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { @@ -3736,6 +5109,98 @@ "dev-master": "1.0.x-dev" } }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -3748,7 +5213,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common Container Interface (PHP FIG PSR-11)", @@ -3762,9 +5227,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/master" + "source": "https://github.com/php-fig/container/tree/1.1.2" }, - "time": "2017-02-14T16:28:37+00:00" + "time": "2021-11-05T16:50:12+00:00" }, { "name": "psr/event-dispatcher", @@ -3818,21 +5283,21 @@ }, { "name": "psr/http-client", - "version": "1.0.1", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -3852,7 +5317,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP clients", @@ -3864,27 +5329,27 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/master" + "source": "https://github.com/php-fig/http-client" }, - "time": "2020-06-29T06:28:15+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { "name": "psr/http-factory", - "version": "1.0.1", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": ">=7.0.0", - "psr/http-message": "^1.0" + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -3904,10 +5369,10 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], - "description": "Common interfaces for PSR-7 HTTP message factories", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", @@ -3919,31 +5384,31 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" + "source": "https://github.com/php-fig/http-factory" }, - "time": "2019-04-30T12:38:16+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { "name": "psr/http-message", - "version": "1.0.1", + "version": "2.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -3958,7 +5423,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP messages", @@ -3972,36 +5437,36 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/master" + "source": "https://github.com/php-fig/http-message/tree/2.0" }, - "time": "2016-08-06T14:39:51+00:00" + "time": "2023-04-04T09:54:51+00:00" }, { "name": "psr/log", - "version": "1.1.3", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -4011,7 +5476,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for logging libraries", @@ -4022,9 +5487,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.3" + "source": "https://github.com/php-fig/log/tree/2.0.0" }, - "time": "2020-03-23T09:12:05+00:00" + "time": "2021-07-14T16:41:46+00:00" }, { "name": "psr/simple-cache", @@ -4079,45 +5544,48 @@ }, { "name": "psy/psysh", - "version": "v0.10.5", + "version": "v0.12.7", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "7c710551d4a2653afa259c544508dc18a9098956" + "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/7c710551d4a2653afa259c544508dc18a9098956", - "reference": "7c710551d4a2653afa259c544508dc18a9098956", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", + "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", "shasum": "" }, "require": { - "dnoegel/php-xdg-base-dir": "0.1.*", "ext-json": "*", "ext-tokenizer": "*", - "nikic/php-parser": "~4.0|~3.0|~2.0|~1.3", - "php": "^8.0 || ^7.0 || ^5.5.9", - "symfony/console": "~5.0|~4.0|~3.0|^2.4.2|~2.3.10", - "symfony/var-dumper": "~5.0|~4.0|~3.0|~2.7" + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.2", - "hoa/console": "3.17.*" + "bamarni/composer-bin-plugin": "^1.2" }, "suggest": { "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", "ext-pdo-sqlite": "The doc command requires SQLite to work.", - "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", - "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.", - "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit." + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." }, "bin": [ "bin/psysh" ], "type": "library", "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, "branch-alias": { - "dev-master": "0.10.x-dev" + "dev-main": "0.12.x-dev" } }, "autoload": { @@ -4149,9 +5617,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.10.5" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.7" }, - "time": "2020-12-04T02:51:30+00:00" + "time": "2024-12-10T01:58:33+00:00" }, { "name": "ralouphie/getallheaders", @@ -4199,40 +5667,49 @@ }, { "name": "ramsey/collection", - "version": "1.1.1", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "24d93aefb2cd786b7edd9f45b554aea20b28b9b1" + "reference": "3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/24d93aefb2cd786b7edd9f45b554aea20b28b9b1", - "reference": "24d93aefb2cd786b7edd9f45b554aea20b28b9b1", + "url": "https://api.github.com/repos/ramsey/collection/zipball/3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109", + "reference": "3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109", "shasum": "" }, "require": { - "php": "^7.2 || ^8" + "php": "^8.1" }, "require-dev": { - "captainhook/captainhook": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "ergebnis/composer-normalize": "^2.6", - "fzaninotto/faker": "^1.5", - "hamcrest/hamcrest-php": "^2", - "jangregor/phpstan-prophecy": "^0.6", - "mockery/mockery": "^1.3", - "phpstan/extension-installer": "^1", - "phpstan/phpstan": "^0.12.32", - "phpstan/phpstan-mockery": "^0.12.5", - "phpstan/phpstan-phpunit": "^0.12.11", - "phpunit/phpunit": "^8.5", - "psy/psysh": "^0.10.4", - "slevomat/coding-standard": "^6.3", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^3.12.2" + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" }, "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, "autoload": { "psr-4": { "Ramsey\\Collection\\": "src/" @@ -4249,7 +5726,7 @@ "homepage": "https://benramsey.com" } ], - "description": "A PHP 7.2+ library for representing and manipulating collections.", + "description": "A PHP library for representing and manipulating collections.", "keywords": [ "array", "collection", @@ -4260,65 +5737,57 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/1.1.1" + "source": "https://github.com/ramsey/collection/tree/2.1.0" }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - } - ], - "time": "2020-09-10T20:58:17+00:00" + "time": "2025-03-02T04:48:29+00:00" }, { "name": "ramsey/uuid", - "version": "4.1.1", + "version": "4.7.6", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "cd4032040a750077205918c86049aa0f43d22947" + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/cd4032040a750077205918c86049aa0f43d22947", - "reference": "cd4032040a750077205918c86049aa0f43d22947", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", "shasum": "" }, "require": { - "brick/math": "^0.8 || ^0.9", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", "ext-json": "*", - "php": "^7.2 || ^8", - "ramsey/collection": "^1.0", - "symfony/polyfill-ctype": "^1.8" + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" }, "replace": { "rhumsaa/uuid": "self.version" }, "require-dev": { - "codeception/aspect-mock": "^3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7.0", + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", "doctrine/annotations": "^1.8", - "goaop/framework": "^2", + "ergebnis/composer-normalize": "^2.15", "mockery/mockery": "^1.3", - "moontoast/math": "^1.1", "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", "php-mock/php-mock-mockery": "^1.3", - "php-mock/php-mock-phpunit": "^2.5", "php-parallel-lint/php-parallel-lint": "^1.1", - "phpbench/phpbench": "^0.17.1", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-mockery": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^8.5", - "psy/psysh": "^0.10.0", - "slevomat/coding-standard": "^6.0", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "3.9.4" + "vimeo/psalm": "^4.9" }, "suggest": { "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", - "ext-ctype": "Enables faster processing of character classification using ctype functions.", "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", @@ -4326,24 +5795,23 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "4.x-dev" + "captainhook": { + "force-install": true } }, "autoload": { - "psr-4": { - "Ramsey\\Uuid\\": "src/" - }, "files": [ "src/functions.php" - ] + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", - "homepage": "https://github.com/ramsey/uuid", "keywords": [ "guid", "identifier", @@ -4351,29 +5819,32 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "rss": "https://github.com/ramsey/uuid/releases.atom", - "source": "https://github.com/ramsey/uuid" + "source": "https://github.com/ramsey/uuid/tree/4.7.6" }, "funding": [ { "url": "https://github.com/ramsey", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" } ], - "time": "2020-08-18T17:17:46+00:00" + "time": "2024-04-27T21:32:50+00:00" }, { "name": "reliese/laravel", - "version": "v0.0.19", + "version": "v1.3.5", "source": { "type": "git", "url": "https://github.com/reliese/laravel.git", - "reference": "1f10ed43802b2a07ee7f308e9a87ca875cfb02ba" + "reference": "2fc69cbd416ae762ae9791b5b58adcb66b7c5b6c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reliese/laravel/zipball/1f10ed43802b2a07ee7f308e9a87ca875cfb02ba", - "reference": "1f10ed43802b2a07ee7f308e9a87ca875cfb02ba", + "url": "https://api.github.com/repos/reliese/laravel/zipball/2fc69cbd416ae762ae9791b5b58adcb66b7c5b6c", + "reference": "2fc69cbd416ae762ae9791b5b58adcb66b7c5b6c", "shasum": "" }, "require": { @@ -4383,7 +5854,7 @@ "illuminate/database": ">=5.1", "illuminate/filesystem": ">=5.1", "illuminate/support": ">=5.1", - "php": ">=5.6.4" + "php": "^7.3|^8.0" }, "require-dev": { "fzaninotto/faker": "~1.4", @@ -4423,7 +5894,7 @@ "issues": "https://github.com/reliese/laravel/issues", "source": "https://github.com/reliese/laravel" }, - "time": "2020-12-07T02:35:15+00:00" + "time": "2024-09-26T13:33:01+00:00" }, { "name": "rguedes/pdfmerger", @@ -4472,33 +5943,42 @@ "issues": "https://github.com/rguedes/PDFMerger/issues", "source": "https://github.com/rguedes/PDFMerger/tree/1.0.4" }, + "abandoned": true, "time": "2019-01-04T09:47:31+00:00" }, { "name": "sabberworm/php-css-parser", - "version": "8.3.1", + "version": "v8.7.0", "source": { "type": "git", - "url": "https://github.com/sabberworm/PHP-CSS-Parser.git", - "reference": "d217848e1396ef962fb1997cf3e2421acba7f796" + "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git", + "reference": "f414ff953002a9b18e3a116f5e462c56f21237cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/d217848e1396ef962fb1997cf3e2421acba7f796", - "reference": "d217848e1396ef962fb1997cf3e2421acba7f796", + "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/f414ff953002a9b18e3a116f5e462c56f21237cf", + "reference": "f414ff953002a9b18e3a116f5e462c56f21237cf", "shasum": "" }, "require": { - "php": ">=5.3.2" + "ext-iconv": "*", + "php": "^5.6.20 || ^7.0.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { - "codacy/coverage": "^1.4", - "phpunit/phpunit": "~4.8" + "phpunit/phpunit": "5.7.27 || 6.5.14 || 7.5.20 || 8.5.40" + }, + "suggest": { + "ext-mbstring": "for parsing UTF-8 CSS" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.0.x-dev" + } + }, "autoload": { - "psr-0": { - "Sabberworm\\CSS": "lib/" + "psr-4": { + "Sabberworm\\CSS\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -4508,35 +5988,47 @@ "authors": [ { "name": "Raphael Schweikert" + }, + { + "name": "Oliver Klee", + "email": "github@oliverklee.de" + }, + { + "name": "Jake Hotson", + "email": "jake.github@qzdesign.co.uk" } ], "description": "Parser for CSS Files written in PHP", - "homepage": "http://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser", "keywords": [ "css", "parser", "stylesheet" ], "support": { - "issues": "https://github.com/sabberworm/PHP-CSS-Parser/issues", - "source": "https://github.com/sabberworm/PHP-CSS-Parser/tree/8.3.1" + "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues", + "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.7.0" }, - "time": "2020-06-01T09:10:00+00:00" + "time": "2024-10-27T17:38:32+00:00" }, { "name": "setasign/fpdf", - "version": "1.8.2", + "version": "1.8.6", "source": { "type": "git", "url": "https://github.com/Setasign/FPDF.git", - "reference": "d77904018090c17dc9f3ab6e944679a7a47e710a" + "reference": "0838e0ee4925716fcbbc50ad9e1799b5edfae0a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Setasign/FPDF/zipball/d77904018090c17dc9f3ab6e944679a7a47e710a", - "reference": "d77904018090c17dc9f3ab6e944679a7a47e710a", + "url": "https://api.github.com/repos/Setasign/FPDF/zipball/0838e0ee4925716fcbbc50ad9e1799b5edfae0a0", + "reference": "0838e0ee4925716fcbbc50ad9e1799b5edfae0a0", "shasum": "" }, + "require": { + "ext-gd": "*", + "ext-zlib": "*" + }, "type": "library", "autoload": { "classmap": [ @@ -4561,37 +6053,37 @@ "pdf" ], "support": { - "source": "https://github.com/Setasign/FPDF/tree/1.8.2" + "source": "https://github.com/Setasign/FPDF/tree/1.8.6" }, - "time": "2019-12-08T10:32:10+00:00" + "time": "2023-06-26T14:44:25+00:00" }, { "name": "setasign/fpdi", - "version": "v2.3.5", + "version": "v2.6.3", "source": { "type": "git", "url": "https://github.com/Setasign/FPDI.git", - "reference": "f2246c8669bd25834f5c264425eb0e250d7a9312" + "reference": "67c31f5e50c93c20579ca9e23035d8c540b51941" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Setasign/FPDI/zipball/f2246c8669bd25834f5c264425eb0e250d7a9312", - "reference": "f2246c8669bd25834f5c264425eb0e250d7a9312", + "url": "https://api.github.com/repos/Setasign/FPDI/zipball/67c31f5e50c93c20579ca9e23035d8c540b51941", + "reference": "67c31f5e50c93c20579ca9e23035d8c540b51941", "shasum": "" }, "require": { "ext-zlib": "*", - "php": "^5.6 || ^7.0 || ^8.0" + "php": "^7.1 || ^8.0" }, "conflict": { "setasign/tfpdf": "<1.31" }, "require-dev": { - "phpunit/phpunit": "~5.7", - "setasign/fpdf": "~1.8", - "setasign/tfpdf": "1.31", + "phpunit/phpunit": "^7", + "setasign/fpdf": "~1.8.6", + "setasign/tfpdf": "~1.33", "squizlabs/php_codesniffer": "^3.5", - "tecnickcom/tcpdf": "~6.2" + "tecnickcom/tcpdf": "^6.2" }, "suggest": { "setasign/fpdf": "FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured." @@ -4627,7 +6119,7 @@ ], "support": { "issues": "https://github.com/Setasign/FPDI/issues", - "source": "https://github.com/Setasign/FPDI/tree/v2.3.5" + "source": "https://github.com/Setasign/FPDI/tree/v2.6.3" }, "funding": [ { @@ -4635,24 +6127,90 @@ "type": "tidelift" } ], - "time": "2020-12-03T13:40:03+00:00" + "time": "2025-02-05T13:22:35+00:00" }, { - "name": "swiftmailer/swiftmailer", - "version": "v6.2.5", + "name": "srmklive/paypal", + "version": "3.0.40", "source": { "type": "git", - "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "698a6a9f54d7eb321274de3ad19863802c879fb7" + "url": "https://github.com/srmklive/laravel-paypal.git", + "reference": "1ddc49fd836a4785933ab953452152f3fedbac63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/698a6a9f54d7eb321274de3ad19863802c879fb7", - "reference": "698a6a9f54d7eb321274de3ad19863802c879fb7", + "url": "https://api.github.com/repos/srmklive/laravel-paypal/zipball/1ddc49fd836a4785933ab953452152f3fedbac63", + "reference": "1ddc49fd836a4785933ab953452152f3fedbac63", "shasum": "" }, "require": { - "egulias/email-validator": "^2.0", + "ext-curl": "*", + "guzzlehttp/guzzle": "~7.0", + "illuminate/support": "~6.0|~7.0|~8.0|~9.0|^10.0|^11.0|^12.0", + "nesbot/carbon": "~2.0|^3.0", + "php": ">=7.2|^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.0|^9.0|^10.0|^11.0", + "symfony/var-dumper": "~5.0|^6.0|^7.0" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "PayPal": "Srmklive\\PayPal\\Facades\\PayPal" + }, + "providers": [ + "Srmklive\\PayPal\\Providers\\PayPalServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Srmklive\\PayPal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raza Mehdi", + "email": "srmk@outlook.com" + } + ], + "description": "Laravel plugin For Processing Payments Through Paypal Express Checkout. Can Be Used Independently With Other Applications.", + "keywords": [ + "http", + "laravel paypal", + "paypal", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/srmklive/laravel-paypal/issues", + "source": "https://github.com/srmklive/laravel-paypal/tree/3.0.40" + }, + "time": "2025-02-25T21:38:18+00:00" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8a5d5072dca8f48460fce2f4131fcc495eec654c", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.0|^3.1", "php": ">=7.0.0", "symfony/polyfill-iconv": "^1.0", "symfony/polyfill-intl-idn": "^1.10", @@ -4660,7 +6218,7 @@ }, "require-dev": { "mockery/mockery": "^1.0", - "symfony/phpunit-bridge": "^4.4|^5.0" + "symfony/phpunit-bridge": "^4.4|^5.4" }, "suggest": { "ext-intl": "Needed to support internationalized email addresses" @@ -4698,7 +6256,7 @@ ], "support": { "issues": "https://github.com/swiftmailer/swiftmailer/issues", - "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.2.5" + "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.3.0" }, "funding": [ { @@ -4710,31 +6268,34 @@ "type": "tidelift" } ], - "time": "2021-01-12T09:35:59+00:00" + "abandoned": "symfony/mailer", + "time": "2021-10-18T15:26:12+00:00" }, { "name": "symfony/console", - "version": "v5.2.1", + "version": "v5.4.47", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "47c02526c532fb381374dab26df05e7313978976" + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/47c02526c532fb381374dab26df05e7313978976", - "reference": "47c02526c532fb381374dab26df05e7313978976", + "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2", - "symfony/string": "^5.1" + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" }, "conflict": { + "psr/log": ">=3", "symfony/dependency-injection": "<4.4", "symfony/dotenv": "<5.1", "symfony/event-dispatcher": "<4.4", @@ -4742,16 +6303,16 @@ "symfony/process": "<4.4" }, "provide": { - "psr/log-implementation": "1.0" + "psr/log-implementation": "1.0|2.0" }, "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "suggest": { "psr/log": "For using the console logger", @@ -4782,16 +6343,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Console Component", + "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", "keywords": [ "cli", - "command line", + "command-line", "console", "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.2.1" + "source": "https://github.com/symfony/console/tree/v5.4.47" }, "funding": [ { @@ -4807,24 +6368,24 @@ "type": "tidelift" } ], - "time": "2020-12-18T08:03:05+00:00" + "time": "2024-11-06T11:30:55+00:00" }, { "name": "symfony/css-selector", - "version": "v5.2.1", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "f789e7ead4c79e04ca9a6d6162fc629c89bd8054" + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/f789e7ead4c79e04ca9a6d6162fc629c89bd8054", - "reference": "f789e7ead4c79e04ca9a6d6162fc629c89bd8054", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -4853,10 +6414,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony CssSelector Component", + "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.2.1" + "source": "https://github.com/symfony/css-selector/tree/v7.2.0" }, "funding": [ { @@ -4872,33 +6433,33 @@ "type": "tidelift" } ], - "time": "2020-12-08T17:02:38+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.2.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" } }, "autoload": { @@ -4923,7 +6484,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/master" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" }, "funding": [ { @@ -4939,33 +6500,35 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/error-handler", - "version": "v5.2.1", + "version": "v5.4.46", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "59b190ce16ddf32771a22087b60f6dafd3407147" + "reference": "d19ede7a2cafb386be9486c580649d0f9e3d0363" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/59b190ce16ddf32771a22087b60f6dafd3407147", - "reference": "59b190ce16ddf32771a22087b60f6dafd3407147", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/d19ede7a2cafb386be9486c580649d0f9e3d0363", + "reference": "d19ede7a2cafb386be9486c580649d0f9e3d0363", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/log": "^1.0", - "symfony/polyfill-php80": "^1.15", - "symfony/var-dumper": "^4.4|^5.0" + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "require-dev": { - "symfony/deprecation-contracts": "^2.1", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0" + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/serializer": "^4.4|^5.0|^6.0" }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], "type": "library", "autoload": { "psr-4": { @@ -4989,10 +6552,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony ErrorHandler Component", + "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.2.1" + "source": "https://github.com/symfony/error-handler/tree/v5.4.46" }, "funding": [ { @@ -5008,48 +6571,43 @@ "type": "tidelift" } ], - "time": "2020-12-09T18:54:12+00:00" + "time": "2024-11-05T14:17:06+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.2.1", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "1c93f7a1dff592c252574c79a8635a8a80856042" + "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1c93f7a1dff592c252574c79a8635a8a80856042", - "reference": "1c93f7a1dff592c252574c79a8635a8a80856042", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", + "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/event-dispatcher-contracts": "^2", - "symfony/polyfill-php80": "^1.15" + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<4.4" + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0" + "symfony/event-dispatcher-implementation": "2.0|3.0" }, "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/error-handler": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^4.4|^5.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -5074,10 +6632,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony EventDispatcher Component", + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.2.1" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.13" }, "funding": [ { @@ -5093,37 +6651,34 @@ "type": "tidelift" } ], - "time": "2020-12-18T08:03:05+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.2.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2" + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ba7d54483095a198fa51781bc608d17e84dffa2", - "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "psr/event-dispatcher": "^1" }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" } }, "autoload": { @@ -5156,7 +6711,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.2.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" }, "funding": [ { @@ -5172,24 +6727,26 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/finder", - "version": "v5.2.1", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "0b9231a5922fd7287ba5b411893c0ecd2733e5ba" + "reference": "63741784cd7b9967975eec610b256eed3ede022b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/0b9231a5922fd7287ba5b411893c0ecd2733e5ba", - "reference": "0b9231a5922fd7287ba5b411893c0ecd2733e5ba", + "url": "https://api.github.com/repos/symfony/finder/zipball/63741784cd7b9967975eec610b256eed3ede022b", + "reference": "63741784cd7b9967975eec610b256eed3ede022b", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -5214,10 +6771,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Finder Component", + "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.2.1" + "source": "https://github.com/symfony/finder/tree/v5.4.45" }, "funding": [ { @@ -5233,112 +6790,36 @@ "type": "tidelift" } ], - "time": "2020-12-08T17:02:38+00:00" - }, - { - "name": "symfony/http-client-contracts", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "41db680a15018f9c1d4b23516059633ce280ca33" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/41db680a15018f9c1d4b23516059633ce280ca33", - "reference": "41db680a15018f9c1d4b23516059633ce280ca33", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "suggest": { - "symfony/http-client-implementation": "" - }, - "type": "library", - "extra": { - "branch-version": "2.3", - "branch-alias": { - "dev-main": "2.3-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\HttpClient\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to HTTP clients", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v2.3.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-14T17:08:19+00:00" + "time": "2024-09-28T13:32:08+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.2.1", + "version": "v5.4.48", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "a1f6218b29897ab52acba58cfa905b83625bef8d" + "reference": "3f38b8af283b830e1363acd79e5bc3412d055341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a1f6218b29897ab52acba58cfa905b83625bef8d", - "reference": "a1f6218b29897ab52acba58cfa905b83625bef8d", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3f38b8af283b830e1363acd79e5bc3412d055341", + "reference": "3f38b8af283b830e1363acd79e5bc3412d055341", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "require-dev": { - "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0" + "predis/predis": "^1.0|^2.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" }, "suggest": { "symfony/mime": "To use the file extension guesser" @@ -5366,10 +6847,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpFoundation Component", + "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.2.1" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.48" }, "funding": [ { @@ -5385,40 +6866,39 @@ "type": "tidelift" } ], - "time": "2020-12-18T10:00:10+00:00" + "time": "2024-11-13T18:58:02+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.2.1", + "version": "v5.4.48", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "1feb619286d819180f7b8bc0dc44f516d9c62647" + "reference": "c2dbfc92b851404567160d1ecf3fb7d9b7bde9b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1feb619286d819180f7b8bc0dc44f516d9c62647", - "reference": "1feb619286d819180f7b8bc0dc44f516d9c62647", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/c2dbfc92b851404567160d1ecf3fb7d9b7bde9b0", + "reference": "c2dbfc92b851404567160d1ecf3fb7d9b7bde9b0", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/log": "~1.0", - "symfony/deprecation-contracts": "^2.1", - "symfony/error-handler": "^4.4|^5.0", - "symfony/event-dispatcher": "^5.0", - "symfony/http-client-contracts": "^1.1|^2", - "symfony/http-foundation": "^4.4|^5.0", + "psr/log": "^1|^2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^5.0|^6.0", + "symfony/http-foundation": "^5.4.21|^6.2.7", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { - "symfony/browser-kit": "<4.4", + "symfony/browser-kit": "<5.4", "symfony/cache": "<5.0", "symfony/config": "<5.0", "symfony/console": "<4.4", - "symfony/dependency-injection": "<5.1.8", + "symfony/dependency-injection": "<5.3", "symfony/doctrine-bridge": "<5.0", "symfony/form": "<5.0", "symfony/http-client": "<5.0", @@ -5427,27 +6907,29 @@ "symfony/translation": "<5.0", "symfony/twig-bridge": "<5.0", "symfony/validator": "<5.0", - "twig/twig": "<2.4" + "twig/twig": "<2.13" }, "provide": { - "psr/log-implementation": "1.0" + "psr/log-implementation": "1.0|2.0" }, "require-dev": { - "psr/cache": "~1.0", - "symfony/browser-kit": "^4.4|^5.0", - "symfony/config": "^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/css-selector": "^4.4|^5.0", - "symfony/dependency-injection": "^5.1.8", - "symfony/dom-crawler": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/routing": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^2.4|^3.0" + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/config": "^5.0|^6.0", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.3|^6.0", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/translation": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2|^3", + "symfony/var-dumper": "^4.4.31|^5.4", + "twig/twig": "^2.13|^3.0.4" }, "suggest": { "symfony/browser-kit": "", @@ -5478,10 +6960,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpKernel Component", + "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.2.1" + "source": "https://github.com/symfony/http-kernel/tree/v5.4.48" }, "funding": [ { @@ -5497,39 +6979,44 @@ "type": "tidelift" } ], - "time": "2020-12-18T13:49:39+00:00" + "time": "2024-11-27T12:43:17+00:00" }, { "name": "symfony/mime", - "version": "v5.2.1", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "de97005aef7426ba008c46ba840fc301df577ada" + "reference": "8c1b9b3e5b52981551fc6044539af1d974e39064" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/de97005aef7426ba008c46ba840fc301df577ada", - "reference": "de97005aef7426ba008c46ba840fc301df577ada", + "url": "https://api.github.com/repos/symfony/mime/zipball/8c1b9b3e5b52981551fc6044539af1d974e39064", + "reference": "8c1b9b3e5b52981551fc6044539af1d974e39064", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { - "symfony/mailer": "<4.4" + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4", + "symfony/serializer": "<5.4.35|>=6,<6.3.12|>=6.4,<6.4.3" }, "require-dev": { - "egulias/email-validator": "^2.1.10", + "egulias/email-validator": "^2.1.10|^3.1|^4", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/property-access": "^4.4|^5.1", - "symfony/property-info": "^4.4|^5.1", - "symfony/serializer": "^5.2" + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/process": "^5.4|^6.4", + "symfony/property-access": "^4.4|^5.1|^6.0", + "symfony/property-info": "^4.4|^5.1|^6.0", + "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3" }, "type": "library", "autoload": { @@ -5554,14 +7041,14 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "A library to manipulate MIME messages", + "description": "Allows manipulating MIME messages", "homepage": "https://symfony.com", "keywords": [ "mime", "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.2.1" + "source": "https://github.com/symfony/mime/tree/v5.4.45" }, "funding": [ { @@ -5577,45 +7064,45 @@ "type": "tidelift" } ], - "time": "2020-12-09T18:54:12+00:00" + "time": "2024-10-23T20:18:32+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.22.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e" + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5640,7 +7127,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" }, "funding": [ { @@ -5656,45 +7143,45 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-iconv", - "version": "v1.22.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "b34bfb8c4c22650ac080d2662ae3502e5f2f4ae6" + "reference": "48becf00c920479ca2e910c22a5a39e5d47ca956" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/b34bfb8c4c22650ac080d2662ae3502e5f2f4ae6", - "reference": "b34bfb8c4c22650ac080d2662ae3502e5f2f4ae6", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/48becf00c920479ca2e910c22a5a39e5d47ca956", + "reference": "48becf00c920479ca2e910c22a5a39e5d47ca956", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" + }, + "provide": { + "ext-iconv": "*" }, "suggest": { "ext-iconv": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Iconv\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5720,7 +7207,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.31.0" }, "funding": [ { @@ -5736,45 +7223,42 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.22.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "267a9adeb8ecb8071040a740930e077cdfb987af" + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/267a9adeb8ecb8071040a740930e077cdfb987af", - "reference": "267a9adeb8ecb8071040a740930e077cdfb987af", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5801,7 +7285,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, "funding": [ { @@ -5817,47 +7301,43 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.22.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "0eb8293dbbcd6ef6bf81404c9ce7d95bcdf34f44" + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/0eb8293dbbcd6ef6bf81404c9ce7d95bcdf34f44", - "reference": "0eb8293dbbcd6ef6bf81404c9ce7d95bcdf34f44", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5888,7 +7368,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" }, "funding": [ { @@ -5904,45 +7384,42 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.22.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "6e971c891537eb617a00bb07a43d182a6915faba" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/6e971c891537eb617a00bb07a43d182a6915faba", - "reference": "6e971c891537eb617a00bb07a43d182a6915faba", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -5972,7 +7449,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { @@ -5988,45 +7465,45 @@ "type": "tidelift" } ], - "time": "2021-01-07T17:09:11+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.22.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "f377a3dd1fde44d37b9831d68dc8dea3ffd28e13" + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/f377a3dd1fde44d37b9831d68dc8dea3ffd28e13", - "reference": "f377a3dd1fde44d37b9831d68dc8dea3ffd28e13", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6052,7 +7529,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { @@ -6068,118 +7545,39 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.22.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9", - "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.22.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.22.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2" + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -6207,7 +7605,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" }, "funding": [ { @@ -6223,42 +7621,39 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.22.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91" + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -6290,7 +7685,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -6306,25 +7701,25 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/process", - "version": "v5.2.1", + "version": "v5.4.47", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "bd8815b8b6705298beaa384f04fabd459c10bedd" + "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/bd8815b8b6705298beaa384f04fabd459c10bedd", - "reference": "bd8815b8b6705298beaa384f04fabd459c10bedd", + "url": "https://api.github.com/repos/symfony/process/zipball/5d1662fb32ebc94f17ddb8d635454a776066733d", + "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -6349,10 +7744,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Process Component", + "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.2.1" + "source": "https://github.com/symfony/process/tree/v5.4.47" }, "funding": [ { @@ -6368,30 +7763,37 @@ "type": "tidelift" } ], - "time": "2020-12-08T17:03:37+00:00" + "time": "2024-11-06T11:36:42+00:00" }, { "name": "symfony/psr-http-message-bridge", - "version": "v2.0.2", + "version": "v2.3.1", "source": { "type": "git", "url": "https://github.com/symfony/psr-http-message-bridge.git", - "reference": "51a21cb3ba3927d4b4bf8f25cc55763351af5f2e" + "reference": "581ca6067eb62640de5ff08ee1ba6850a0ee472e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/51a21cb3ba3927d4b4bf8f25cc55763351af5f2e", - "reference": "51a21cb3ba3927d4b4bf8f25cc55763351af5f2e", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/581ca6067eb62640de5ff08ee1ba6850a0ee472e", + "reference": "581ca6067eb62640de5ff08ee1ba6850a0ee472e", "shasum": "" }, "require": { - "php": ">=7.1", - "psr/http-message": "^1.0", - "symfony/http-foundation": "^4.4 || ^5.0" + "php": ">=7.2.5", + "psr/http-message": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0", + "symfony/http-foundation": "^5.4 || ^6.0" }, "require-dev": { "nyholm/psr7": "^1.1", - "symfony/phpunit-bridge": "^4.4 || ^5.0" + "psr/log": "^1.1 || ^2 || ^3", + "symfony/browser-kit": "^5.4 || ^6.0", + "symfony/config": "^5.4 || ^6.0", + "symfony/event-dispatcher": "^5.4 || ^6.0", + "symfony/framework-bundle": "^5.4 || ^6.0", + "symfony/http-kernel": "^5.4 || ^6.0", + "symfony/phpunit-bridge": "^6.2" }, "suggest": { "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" @@ -6399,7 +7801,7 @@ "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "2.3-dev" } }, "autoload": { @@ -6434,7 +7836,7 @@ ], "support": { "issues": "https://github.com/symfony/psr-http-message-bridge/issues", - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.0.2" + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.3.1" }, "funding": [ { @@ -6450,43 +7852,43 @@ "type": "tidelift" } ], - "time": "2020-09-29T08:17:46+00:00" + "time": "2023-07-26T11:53:26+00:00" }, { "name": "symfony/routing", - "version": "v5.2.1", + "version": "v5.4.48", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "934ac2720dcc878a47a45c986b483a7ee7193620" + "reference": "dd08c19879a9b37ff14fd30dcbdf99a4cf045db1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/934ac2720dcc878a47a45c986b483a7ee7193620", - "reference": "934ac2720dcc878a47a45c986b483a7ee7193620", + "url": "https://api.github.com/repos/symfony/routing/zipball/dd08c19879a9b37ff14fd30dcbdf99a4cf045db1", + "reference": "dd08c19879a9b37ff14fd30dcbdf99a4cf045db1", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15" + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" }, "conflict": { - "symfony/config": "<5.0", + "doctrine/annotations": "<1.12", + "symfony/config": "<5.3", "symfony/dependency-injection": "<4.4", "symfony/yaml": "<4.4" }, "require-dev": { - "doctrine/annotations": "^1.7", - "psr/log": "~1.0", - "symfony/config": "^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" + "doctrine/annotations": "^1.12|^2", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.3|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0" }, "suggest": { - "doctrine/annotations": "For using the annotation loader", "symfony/config": "For using the all-in-one router or any loader", "symfony/expression-language": "For using expression matching", "symfony/http-foundation": "For using a Symfony Request object", @@ -6515,7 +7917,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Routing Component", + "description": "Maps an HTTP request to a set of configuration variables", "homepage": "https://symfony.com", "keywords": [ "router", @@ -6524,7 +7926,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.2.1" + "source": "https://github.com/symfony/routing/tree/v5.4.48" }, "funding": [ { @@ -6540,43 +7942,47 @@ "type": "tidelift" } ], - "time": "2020-12-08T17:03:37+00:00" + "time": "2024-11-12T18:20:21+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.2.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.0" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, - "suggest": { - "symfony/service-implementation": "" + "conflict": { + "ext-psr": "<1.1|>=2" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" } }, "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6603,7 +8009,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/master" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" }, "funding": [ { @@ -6619,44 +8025,47 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/string", - "version": "v5.2.1", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed" + "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed", - "reference": "5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed", + "url": "https://api.github.com/repos/symfony/string/zipball/73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", + "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/intl": "^6.2|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { - "psr-4": { - "Symfony\\Component\\String\\": "" - }, "files": [ "Resources/functions.php" ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, "exclude-from-classmap": [ "/Tests/" ] @@ -6675,7 +8084,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony String component", + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", "homepage": "https://symfony.com", "keywords": [ "grapheme", @@ -6686,7 +8095,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.2.1" + "source": "https://github.com/symfony/string/tree/v6.4.15" }, "funding": [ { @@ -6702,53 +8111,55 @@ "type": "tidelift" } ], - "time": "2020-12-05T07:33:16+00:00" + "time": "2024-11-13T13:31:12+00:00" }, { "name": "symfony/translation", - "version": "v5.2.1", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "a04209ba0d1391c828e5b2373181dac63c52ee70" + "reference": "3b9bf9f33997c064885a7bfc126c14b9daa0e00e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/a04209ba0d1391c828e5b2373181dac63c52ee70", - "reference": "a04209ba0d1391c828e5b2373181dac63c52ee70", + "url": "https://api.github.com/repos/symfony/translation/zipball/3b9bf9f33997c064885a7bfc126c14b9daa0e00e", + "reference": "3b9bf9f33997c064885a7bfc126c14b9daa0e00e", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15", - "symfony/translation-contracts": "^2.3" + "symfony/translation-contracts": "^2.5|^3.0" }, "conflict": { - "symfony/config": "<4.4", - "symfony/dependency-injection": "<5.0", - "symfony/http-kernel": "<5.0", - "symfony/twig-bundle": "<5.0", - "symfony/yaml": "<4.4" + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" }, "provide": { - "symfony/translation-implementation": "2.0" + "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^4.4|^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/dependency-injection": "^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/http-kernel": "^5.0", - "symfony/intl": "^4.4|^5.0", - "symfony/service-contracts": "^1.1.2|^2", - "symfony/yaml": "^4.4|^5.0" - }, - "suggest": { - "psr/log-implementation": "To use logging capability in translator", - "symfony/config": "", - "symfony/yaml": "" + "nikic/php-parser": "^4.18|^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -6776,10 +8187,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Translation Component", + "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v5.2.1" + "source": "https://github.com/symfony/translation/tree/v6.4.19" }, "funding": [ { @@ -6795,42 +8206,42 @@ "type": "tidelift" } ], - "time": "2020-12-08T17:03:37+00:00" + "time": "2025-02-13T10:18:43+00:00" }, { "name": "symfony/translation-contracts", - "version": "v2.3.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105" + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/e2eaa60b558f26a4b0354e1bbb25636efaaad105", - "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", "shasum": "" }, "require": { - "php": ">=7.2.5" - }, - "suggest": { - "symfony/translation-implementation": "" + "php": ">=8.1" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" } }, "autoload": { "psr-4": { "Symfony\\Contracts\\Translation\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6857,7 +8268,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v2.3.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" }, "funding": [ { @@ -6873,36 +8284,37 @@ "type": "tidelift" } ], - "time": "2020-09-28T13:05:58+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.2.1", + "version": "v5.4.48", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "13e7e882eaa55863faa7c4ad7c60f12f1a8b5089" + "reference": "42f18f170aa86d612c3559cfb3bd11a375df32c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/13e7e882eaa55863faa7c4ad7c60f12f1a8b5089", - "reference": "13e7e882eaa55863faa7c4ad7c60f12f1a8b5089", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/42f18f170aa86d612c3559cfb3bd11a375df32c8", + "reference": "42f18f170aa86d612c3559cfb3bd11a375df32c8", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { - "phpunit/phpunit": "<5.4.3", "symfony/console": "<4.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "twig/twig": "^2.4|^3.0" + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/uid": "^5.1|^6.0", + "twig/twig": "^2.13|^3.0.4" }, "suggest": { "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", @@ -6938,14 +8350,14 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony mechanism for exploring and dumping PHP variables", + "description": "Provides mechanisms for walking through any arbitrary PHP variable", "homepage": "https://symfony.com", "keywords": [ "debug", "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.2.1" + "source": "https://github.com/symfony/var-dumper/tree/v5.4.48" }, "funding": [ { @@ -6961,35 +8373,37 @@ "type": "tidelift" } ], - "time": "2020-12-16T17:02:19+00:00" + "time": "2024-11-08T15:21:10+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", - "version": "2.2.3", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5" + "reference": "0d72ac1c00084279c1816675284073c5a337c20d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/b43b05cf43c1b6d849478965062b6ef73e223bb5", - "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0d72ac1c00084279c1816675284073c5a337c20d", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", - "php": "^5.5 || ^7.0 || ^8.0", - "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0" + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5" + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2.x-dev" + "dev-master": "2.x-dev" } }, "autoload": { @@ -7012,45 +8426,49 @@ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", "support": { "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", - "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.3" + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.3.0" }, - "time": "2020-07-13T06:12:54+00:00" + "time": "2024-12-21T16:25:41+00:00" }, { "name": "vlucas/phpdotenv", - "version": "v5.2.0", + "version": "v5.6.1", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "fba64139db67123c7a57072e5f8d3db10d160b66" + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/fba64139db67123c7a57072e5f8d3db10d160b66", - "reference": "fba64139db67123c7a57072e5f8d3db10d160b66", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", "shasum": "" }, "require": { "ext-pcre": "*", - "graham-campbell/result-type": "^1.0.1", - "php": "^7.1.3 || ^8.0", - "phpoption/phpoption": "^1.7.4", - "symfony/polyfill-ctype": "^1.17", - "symfony/polyfill-mbstring": "^1.17", - "symfony/polyfill-php80": "^1.17" + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", + "bamarni/composer-bin-plugin": "^1.8.2", "ext-filter": "*", - "phpunit/phpunit": "^7.5.20 || ^8.5.2 || ^9.0" + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" }, "suggest": { "ext-filter": "Required to use the boolean validator." }, "type": "library", "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, "branch-alias": { - "dev-master": "5.2-dev" + "dev-master": "5.6-dev" } }, "autoload": { @@ -7065,13 +8483,13 @@ "authors": [ { "name": "Graham Campbell", - "email": "graham@alt-three.com", - "homepage": "https://gjcampbell.co.uk/" + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" }, { "name": "Vance Lucas", "email": "vance@vancelucas.com", - "homepage": "https://vancelucas.com/" + "homepage": "https://github.com/vlucas" } ], "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", @@ -7082,7 +8500,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.2.0" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" }, "funding": [ { @@ -7094,20 +8512,20 @@ "type": "tidelift" } ], - "time": "2020-09-14T15:57:31+00:00" + "time": "2024-07-20T21:52:34+00:00" }, { "name": "voku/portable-ascii", - "version": "1.5.6", + "version": "1.6.1", "source": { "type": "git", "url": "https://github.com/voku/portable-ascii.git", - "reference": "80953678b19901e5165c56752d087fc11526017c" + "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c", - "reference": "80953678b19901e5165c56752d087fc11526017c", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/87337c91b9dfacee02452244ee14ab3c43bc485a", + "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a", "shasum": "" }, "require": { @@ -7144,7 +8562,7 @@ ], "support": { "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/1.5.6" + "source": "https://github.com/voku/portable-ascii/tree/1.6.1" }, "funding": [ { @@ -7168,34 +8586,39 @@ "type": "tidelift" } ], - "time": "2020-11-12T00:07:28+00:00" + "time": "2022-01-24T18:55:24+00:00" }, { "name": "webmozart/assert", - "version": "1.9.1", + "version": "1.11.0", "source": { "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0 || ^8.0", - "symfony/polyfill-ctype": "^1.8" + "ext-ctype": "*", + "php": "^7.2 || ^8.0" }, "conflict": { "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<3.9.1" + "vimeo/psalm": "<4.6.1 || 4.6.2" }, "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^7.5.13" + "phpunit/phpunit": "^8.5.13" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, "autoload": { "psr-4": { "Webmozart\\Assert\\": "src/" @@ -7218,35 +8641,35 @@ "validate" ], "support": { - "issues": "https://github.com/webmozart/assert/issues", - "source": "https://github.com/webmozart/assert/tree/master" + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" }, - "time": "2020-07-08T17:02:28+00:00" + "time": "2022-06-03T18:03:27+00:00" }, { "name": "yajra/laravel-datatables-oracle", - "version": "v9.15.2", + "version": "v9.21.2", "source": { "type": "git", "url": "https://github.com/yajra/laravel-datatables.git", - "reference": "e0b416d8b7d4472b16217c40e74284074cc34dde" + "reference": "a7fd01f06282923e9c63fa27fe6b391e21dc321a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/yajra/laravel-datatables/zipball/e0b416d8b7d4472b16217c40e74284074cc34dde", - "reference": "e0b416d8b7d4472b16217c40e74284074cc34dde", + "url": "https://api.github.com/repos/yajra/laravel-datatables/zipball/a7fd01f06282923e9c63fa27fe6b391e21dc321a", + "reference": "a7fd01f06282923e9c63fa27fe6b391e21dc321a", "shasum": "" }, "require": { - "illuminate/database": "5.8.*|^6|^7|^8", - "illuminate/filesystem": "5.8.*|^6|^7|^8", - "illuminate/http": "5.8.*|^6|^7|^8", - "illuminate/support": "5.8.*|^6|^7|^8", - "illuminate/view": "5.8.*|^6|^7|^8", + "illuminate/database": "5.8.*|^6|^7|^8|^9", + "illuminate/filesystem": "5.8.*|^6|^7|^8|^9", + "illuminate/http": "5.8.*|^6|^7|^8|^9", + "illuminate/support": "5.8.*|^6|^7|^8|^9", + "illuminate/view": "5.8.*|^6|^7|^8|^9", "php": "^7.1.3|^8" }, "require-dev": { - "orchestra/testbench": "^3.8" + "orchestra/testbench": "^3.8|^4.0|^5.0|^6.0|^7.0" }, "suggest": { "yajra/laravel-datatables-buttons": "Plugin for server-side exporting of dataTables.", @@ -7256,25 +8679,25 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "9.0-dev" - }, "laravel": { - "providers": [ - "Yajra\\DataTables\\DataTablesServiceProvider" - ], "aliases": { "DataTables": "Yajra\\DataTables\\Facades\\DataTables" - } + }, + "providers": [ + "Yajra\\DataTables\\DataTablesServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "9.0-dev" } }, "autoload": { - "psr-4": { - "Yajra\\DataTables\\": "src/" - }, "files": [ "src/helper.php" - ] + ], + "psr-4": { + "Yajra\\DataTables\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7286,7 +8709,7 @@ "email": "aqangeles@gmail.com" } ], - "description": "jQuery DataTables API for Laravel 4|5|6|7", + "description": "jQuery DataTables API for Laravel 5|6|7|8|9", "keywords": [ "datatables", "jquery", @@ -7294,7 +8717,7 @@ ], "support": { "issues": "https://github.com/yajra/laravel-datatables/issues", - "source": "https://github.com/yajra/laravel-datatables/tree/v9.15.2" + "source": "https://github.com/yajra/laravel-datatables/tree/v9.21.2" }, "funding": [ { @@ -7306,60 +8729,59 @@ "type": "patreon" } ], - "time": "2020-12-09T15:42:04+00:00" + "time": "2022-07-12T04:48:03+00:00" } ], "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v3.5.2", + "version": "v3.7.0", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "cae0a8d1cb89b0f0522f65e60465e16d738e069b" + "reference": "3372ed65e6d2039d663ed19aa699956f9d346271" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/cae0a8d1cb89b0f0522f65e60465e16d738e069b", - "reference": "cae0a8d1cb89b0f0522f65e60465e16d738e069b", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/3372ed65e6d2039d663ed19aa699956f9d346271", + "reference": "3372ed65e6d2039d663ed19aa699956f9d346271", "shasum": "" }, "require": { - "illuminate/routing": "^6|^7|^8", - "illuminate/session": "^6|^7|^8", - "illuminate/support": "^6|^7|^8", - "maximebf/debugbar": "^1.16.3", - "php": ">=7.2", - "symfony/debug": "^4.3|^5", - "symfony/finder": "^4.3|^5" + "illuminate/routing": "^7|^8|^9", + "illuminate/session": "^7|^8|^9", + "illuminate/support": "^7|^8|^9", + "maximebf/debugbar": "^1.17.2", + "php": ">=7.2.5", + "symfony/finder": "^5|^6" }, "require-dev": { "mockery/mockery": "^1.3.3", - "orchestra/testbench-dusk": "^4|^5|^6", + "orchestra/testbench-dusk": "^5|^6|^7", "phpunit/phpunit": "^8.5|^9.0", "squizlabs/php_codesniffer": "^3.5" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "3.5-dev" - }, "laravel": { + "aliases": { + "Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar" + }, "providers": [ "Barryvdh\\Debugbar\\ServiceProvider" - ], - "aliases": { - "Debugbar": "Barryvdh\\Debugbar\\Facade" - } + ] + }, + "branch-alias": { + "dev-master": "3.6-dev" } }, "autoload": { - "psr-4": { - "Barryvdh\\Debugbar\\": "src/" - }, "files": [ "src/helpers.php" - ] + ], + "psr-4": { + "Barryvdh\\Debugbar\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7381,61 +8803,69 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.5.2" + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.7.0" }, "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, { "url": "https://github.com/barryvdh", "type": "github" } ], - "time": "2021-01-06T14:21:44+00:00" + "time": "2022-07-11T09:26:42+00:00" }, { "name": "barryvdh/laravel-ide-helper", - "version": "v2.9.0", + "version": "v2.14.0", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-ide-helper.git", - "reference": "64a6b902583802c162cdccf7e76dc8619368bf1a" + "reference": "485c756f6cff408d6b273274c5e86112c3973d98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/64a6b902583802c162cdccf7e76dc8619368bf1a", - "reference": "64a6b902583802c162cdccf7e76dc8619368bf1a", + "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/485c756f6cff408d6b273274c5e86112c3973d98", + "reference": "485c756f6cff408d6b273274c5e86112c3973d98", "shasum": "" }, "require": { "barryvdh/reflection-docblock": "^2.0.6", - "composer/composer": "^1.6 || ^2", + "composer/class-map-generator": "^1.0", "doctrine/dbal": "^2.6 || ^3", "ext-json": "*", - "illuminate/console": "^8", - "illuminate/filesystem": "^8", - "illuminate/support": "^8", + "illuminate/console": "^8 || ^9 || ^10", + "illuminate/filesystem": "^8 || ^9 || ^10", + "illuminate/support": "^8 || ^9 || ^10", + "nikic/php-parser": "^4.18 || ^5", "php": "^7.3 || ^8.0", "phpdocumentor/type-resolver": "^1.1.0" }, "require-dev": { "ext-pdo_sqlite": "*", "friendsofphp/php-cs-fixer": "^2", - "illuminate/config": "^8", - "illuminate/view": "^8", + "illuminate/config": "^8 || ^9 || ^10", + "illuminate/view": "^8 || ^9 || ^10", "mockery/mockery": "^1.4", - "orchestra/testbench": "^6", + "orchestra/testbench": "^6 || ^7 || ^8", "phpunit/phpunit": "^8.5 || ^9", "spatie/phpunit-snapshot-assertions": "^3 || ^4", - "vimeo/psalm": "^3.12" + "vimeo/psalm": "^5.4" + }, + "suggest": { + "illuminate/events": "Required for automatic helper generation (^6|^7|^8|^9|^10)." }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.9-dev" - }, "laravel": { "providers": [ "Barryvdh\\LaravelIdeHelper\\IdeHelperServiceProvider" ] + }, + "branch-alias": { + "dev-master": "2.14-dev" } }, "autoload": { @@ -7467,35 +8897,39 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-ide-helper/issues", - "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v2.9.0" + "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v2.14.0" }, "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, { "url": "https://github.com/barryvdh", "type": "github" } ], - "time": "2020-12-29T10:11:05+00:00" + "time": "2024-02-05T08:16:36+00:00" }, { "name": "barryvdh/reflection-docblock", - "version": "v2.0.6", + "version": "v2.3.1", "source": { "type": "git", "url": "https://github.com/barryvdh/ReflectionDocBlock.git", - "reference": "6b69015d83d3daf9004a71a89f26e27d27ef6a16" + "reference": "b6ff9f93603561f50e53b64310495d20b8dff5d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/6b69015d83d3daf9004a71a89f26e27d27ef6a16", - "reference": "6b69015d83d3daf9004a71a89f26e27d27ef6a16", + "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/b6ff9f93603561f50e53b64310495d20b8dff5d8", + "reference": "b6ff9f93603561f50e53b64310495d20b8dff5d8", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "require-dev": { - "phpunit/phpunit": "~4.0,<4.5" + "phpunit/phpunit": "^8.5.14|^9" }, "suggest": { "dflydev/markdown": "~1.0", @@ -7504,7 +8938,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "2.3.x-dev" } }, "autoload": { @@ -7525,34 +8959,36 @@ } ], "support": { - "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.0.6" + "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.3.1" }, - "time": "2018-12-13T10:34:14+00:00" + "time": "2025-01-18T19:26:32+00:00" }, { - "name": "composer/ca-bundle", - "version": "1.2.9", + "name": "composer/class-map-generator", + "version": "1.6.0", "source": { "type": "git", - "url": "https://github.com/composer/ca-bundle.git", - "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5" + "url": "https://github.com/composer/class-map-generator.git", + "reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/78a0e288fdcebf92aa2318a8d3656168da6ac1a5", - "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/ffe442c5974c44a9343e37a0abcb1cc37319f5b9", + "reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9", "shasum": "" }, "require": { - "ext-openssl": "*", - "ext-pcre": "*", - "php": "^5.3.2 || ^7.0 || ^8.0" + "composer/pcre": "^2.1 || ^3.1", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" }, "require-dev": { - "phpstan/phpstan": "^0.12.55", - "psr/log": "^1.0", - "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0" + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-deprecation-rules": "^1 || ^2", + "phpstan/phpstan-phpunit": "^1 || ^2", + "phpstan/phpstan-strict-rules": "^1.1 || ^2", + "phpunit/phpunit": "^8", + "symfony/filesystem": "^5.4 || ^6" }, "type": "library", "extra": { @@ -7562,7 +8998,7 @@ }, "autoload": { "psr-4": { - "Composer\\CaBundle\\": "src" + "Composer\\ClassMapGenerator\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -7570,121 +9006,19 @@ "MIT" ], "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", - "keywords": [ - "cabundle", - "cacert", - "certificate", - "ssl", - "tls" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.2.9" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-01-12T12:10:35+00:00" - }, - { - "name": "composer/composer", - "version": "2.0.8", - "source": { - "type": "git", - "url": "https://github.com/composer/composer.git", - "reference": "62139b2806178adb979d76bd3437534a1a9fd490" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/62139b2806178adb979d76bd3437534a1a9fd490", - "reference": "62139b2806178adb979d76bd3437534a1a9fd490", - "shasum": "" - }, - "require": { - "composer/ca-bundle": "^1.0", - "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.2", - "composer/xdebug-handler": "^1.1", - "justinrainbow/json-schema": "^5.2.10", - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0", - "react/promise": "^1.2 || ^2.7", - "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.0", - "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", - "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", - "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", - "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0" - }, - "require-dev": { - "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^4.2 || ^5.0" - }, - "suggest": { - "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", - "ext-zip": "Enabling the zip extension allows you to unzip archives", - "ext-zlib": "Allow gzip compression of HTTP requests" - }, - "bin": [ - "bin/composer" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\": "src/Composer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "https://www.naderman.de" - }, { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "https://seld.be" } ], - "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", - "homepage": "https://getcomposer.org/", + "description": "Utilities to scan PHP code and generate class maps.", "keywords": [ - "autoload", - "dependency", - "package" + "classmap" ], "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.0.8" + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.6.0" }, "funding": [ { @@ -7700,256 +9034,34 @@ "type": "tidelift" } ], - "time": "2020-12-03T16:20:39+00:00" - }, - { - "name": "composer/semver", - "version": "3.2.4", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/a02fdf930a3c1c3ed3a49b5f63859c0c20e10464", - "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.54", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.2.4" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2020-11-13T08:59:24+00:00" - }, - { - "name": "composer/spdx-licenses", - "version": "1.5.5", - "source": { - "type": "git", - "url": "https://github.com/composer/spdx-licenses.git", - "reference": "de30328a7af8680efdc03e396aad24befd513200" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200", - "reference": "de30328a7af8680efdc03e396aad24befd513200", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Spdx\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "SPDX licenses list and validation library.", - "keywords": [ - "license", - "spdx", - "validator" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.5" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2020-12-03T16:04:16+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "1.4.5", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "f28d44c286812c714741478d968104c5e604a1d4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f28d44c286812c714741478d968104c5e604a1d4", - "reference": "f28d44c286812c714741478d968104c5e604a1d4", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/1.4.5" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2020-11-13T08:04:11+00:00" + "time": "2025-02-05T10:05:34+00:00" }, { "name": "doctrine/instantiator", - "version": "1.4.0", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^8.0", + "doctrine/coding-standard": "^11", "ext-pdo": "*", "ext-phar": "*", - "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" }, "type": "library", "autoload": { @@ -7976,7 +9088,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.0" + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" }, "funding": [ { @@ -7992,20 +9104,20 @@ "type": "tidelift" } ], - "time": "2020-11-10T18:47:58+00:00" + "time": "2022-12-30T00:23:10+00:00" }, { "name": "facade/flare-client-php", - "version": "1.3.7", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/facade/flare-client-php.git", - "reference": "fd688d3c06658f2b3b5f7bb19f051ee4ddf02492" + "reference": "213fa2c69e120bca4c51ba3e82ed1834ef3f41b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facade/flare-client-php/zipball/fd688d3c06658f2b3b5f7bb19f051ee4ddf02492", - "reference": "fd688d3c06658f2b3b5f7bb19f051ee4ddf02492", + "url": "https://api.github.com/repos/facade/flare-client-php/zipball/213fa2c69e120bca4c51ba3e82ed1834ef3f41b8", + "reference": "213fa2c69e120bca4c51ba3e82ed1834ef3f41b8", "shasum": "" }, "require": { @@ -8018,7 +9130,7 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "^2.14", - "phpunit/phpunit": "^7.5.16", + "phpunit/phpunit": "^7.5", "spatie/phpunit-snapshot-assertions": "^2.0" }, "type": "library", @@ -8028,12 +9140,12 @@ } }, "autoload": { - "psr-4": { - "Facade\\FlareClient\\": "src" - }, "files": [ "src/helpers.php" - ] + ], + "psr-4": { + "Facade\\FlareClient\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -8049,7 +9161,7 @@ ], "support": { "issues": "https://github.com/facade/flare-client-php/issues", - "source": "https://github.com/facade/flare-client-php/tree/1.3.7" + "source": "https://github.com/facade/flare-client-php/tree/1.10.0" }, "funding": [ { @@ -8057,28 +9169,28 @@ "type": "github" } ], - "time": "2020-10-21T16:02:39+00:00" + "time": "2022-08-09T11:23:57+00:00" }, { "name": "facade/ignition", - "version": "2.5.8", + "version": "2.17.7", "source": { "type": "git", "url": "https://github.com/facade/ignition.git", - "reference": "8e907d81244649c5ea746e2ec30c32c5f59df472" + "reference": "b4f5955825bb4b74cba0f94001761c46335c33e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facade/ignition/zipball/8e907d81244649c5ea746e2ec30c32c5f59df472", - "reference": "8e907d81244649c5ea746e2ec30c32c5f59df472", + "url": "https://api.github.com/repos/facade/ignition/zipball/b4f5955825bb4b74cba0f94001761c46335c33e9", + "reference": "b4f5955825bb4b74cba0f94001761c46335c33e9", "shasum": "" }, "require": { + "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "facade/flare-client-php": "^1.3.7", + "facade/flare-client-php": "^1.9.1", "facade/ignition-contracts": "^1.0.2", - "filp/whoops": "^2.4", "illuminate/support": "^7.0|^8.0", "monolog/monolog": "^2.0", "php": "^7.2.5|^8.0", @@ -8087,6 +9199,7 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "^2.14", + "livewire/livewire": "^2.4", "mockery/mockery": "^1.3", "orchestra/testbench": "^5.0|^6.0", "psalm/plugin-laravel": "^1.2" @@ -8096,25 +9209,25 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - }, "laravel": { - "providers": [ - "Facade\\Ignition\\IgnitionServiceProvider" - ], "aliases": { "Flare": "Facade\\Ignition\\Facades\\Flare" - } + }, + "providers": [ + "Facade\\Ignition\\IgnitionServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "2.x-dev" } }, "autoload": { - "psr-4": { - "Facade\\Ignition\\": "src" - }, "files": [ "src/helpers.php" - ] + ], + "psr-4": { + "Facade\\Ignition\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -8134,7 +9247,7 @@ "issues": "https://github.com/facade/ignition/issues", "source": "https://github.com/facade/ignition" }, - "time": "2020-12-29T09:12:55+00:00" + "time": "2023-01-26T12:34:59+00:00" }, { "name": "facade/ignition-contracts", @@ -8191,28 +9304,39 @@ }, { "name": "fakerphp/faker", - "version": "v1.13.0", + "version": "v1.24.1", "source": { "type": "git", "url": "https://github.com/FakerPHP/Faker.git", - "reference": "ab3f5364d01f2c2c16113442fb987d26e4004913" + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/ab3f5364d01f2c2c16113442fb987d26e4004913", - "reference": "ab3f5364d01f2c2c16113442fb987d26e4004913", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" }, "conflict": { "fzaninotto/faker": "*" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", "ext-intl": "*", - "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.4.2" + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." }, "type": "library", "autoload": { @@ -8237,32 +9361,32 @@ ], "support": { "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v1.13.0" + "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" }, - "time": "2020-12-18T16:50:48+00:00" + "time": "2024-11-21T13:46:39+00:00" }, { "name": "filp/whoops", - "version": "2.9.1", + "version": "2.17.0", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "307fb34a5ab697461ec4c9db865b20ff2fd40771" + "reference": "075bc0c26631110584175de6523ab3f1652eb28e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/307fb34a5ab697461ec4c9db865b20ff2fd40771", - "reference": "307fb34a5ab697461ec4c9db865b20ff2fd40771", + "url": "https://api.github.com/repos/filp/whoops/zipball/075bc0c26631110584175de6523ab3f1652eb28e", + "reference": "075bc0c26631110584175de6523ab3f1652eb28e", "shasum": "" }, "require": { - "php": "^5.5.9 || ^7.0 || ^8.0", - "psr/log": "^1.0.1" + "php": "^7.1 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" }, "require-dev": { - "mockery/mockery": "^0.9 || ^1.0", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", - "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" }, "suggest": { "symfony/var-dumper": "Pretty print complex values better with var-dumper available", @@ -8302,9 +9426,15 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.9.1" + "source": "https://github.com/filp/whoops/tree/2.17.0" }, - "time": "2020-11-01T12:00:00+00:00" + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2025-01-25T12:00:00+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -8357,107 +9487,43 @@ }, "time": "2020-07-09T08:09:16+00:00" }, - { - "name": "justinrainbow/json-schema", - "version": "5.2.10", - "source": { - "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", - "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" - }, - "bin": [ - "bin/validate-json" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "JsonSchema\\": "src/JsonSchema/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" - } - ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", - "keywords": [ - "json", - "schema" - ], - "support": { - "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.10" - }, - "time": "2020-05-27T16:41:55+00:00" - }, { "name": "laravel/sail", - "version": "v1.1.0", + "version": "v1.25.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "277d868441b49898caf0ce3cb4e19b439e419133" + "reference": "e81a7bd7ac1a745ccb25572830fecf74a89bb48a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/277d868441b49898caf0ce3cb4e19b439e419133", - "reference": "277d868441b49898caf0ce3cb4e19b439e419133", + "url": "https://api.github.com/repos/laravel/sail/zipball/e81a7bd7ac1a745ccb25572830fecf74a89bb48a", + "reference": "e81a7bd7ac1a745ccb25572830fecf74a89bb48a", "shasum": "" }, "require": { - "illuminate/contracts": "^8.0|^9.0", - "illuminate/support": "^8.0|^9.0", - "php": "^7.3|^8.0" + "illuminate/console": "^8.0|^9.0|^10.0", + "illuminate/contracts": "^8.0|^9.0|^10.0", + "illuminate/support": "^8.0|^9.0|^10.0", + "php": "^8.0", + "symfony/yaml": "^6.0" + }, + "require-dev": { + "orchestra/testbench": "^6.0|^7.0|^8.0", + "phpstan/phpstan": "^1.10" }, "bin": [ "bin/sail" ], "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - }, "laravel": { "providers": [ "Laravel\\Sail\\SailServiceProvider" ] + }, + "branch-alias": { + "dev-master": "1.x-dev" } }, "autoload": { @@ -8484,29 +9550,32 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2021-01-05T16:40:11+00:00" + "time": "2023-09-11T17:37:09+00:00" }, { "name": "maximebf/debugbar", - "version": "v1.16.4", + "version": "v1.23.6", "source": { "type": "git", - "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "c86c717e4bf3c6d98422da5c38bfa7b0f494b04c" + "url": "https://github.com/php-debugbar/php-debugbar.git", + "reference": "4b3d5f1afe09a7db5a9d3282890f49f6176d6542" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/c86c717e4bf3c6d98422da5c38bfa7b0f494b04c", - "reference": "c86c717e4bf3c6d98422da5c38bfa7b0f494b04c", + "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/4b3d5f1afe09a7db5a9d3282890f49f6176d6542", + "reference": "4b3d5f1afe09a7db5a9d3282890f49f6176d6542", "shasum": "" }, "require": { - "php": "^7.1|^8", - "psr/log": "^1.0", - "symfony/var-dumper": "^2.6|^3|^4|^5" + "php": "^7.2|^8", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4|^5|^6|^7" }, "require-dev": { - "phpunit/phpunit": "^7.5.20 || ^9.4.2" + "dbrekelmans/bdi": "^1", + "phpunit/phpunit": "^8|^9", + "symfony/panther": "^1|^2.1", + "twig/twig": "^1.38|^2.7|^3.0" }, "suggest": { "kriswallsmith/assetic": "The best way to manage assets", @@ -8516,7 +9585,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.16-dev" + "dev-master": "1.23-dev" } }, "autoload": { @@ -8546,45 +9615,46 @@ "debugbar" ], "support": { - "issues": "https://github.com/maximebf/php-debugbar/issues", - "source": "https://github.com/maximebf/php-debugbar/tree/v1.16.4" + "issues": "https://github.com/php-debugbar/php-debugbar/issues", + "source": "https://github.com/php-debugbar/php-debugbar/tree/v1.23.6" }, - "time": "2020-12-07T10:48:48+00:00" + "abandoned": "php-debugbar/php-debugbar", + "time": "2025-02-13T12:22:36+00:00" }, { "name": "mockery/mockery", - "version": "1.4.2", + "version": "1.6.12", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "20cab678faed06fac225193be281ea0fddb43b93" + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/20cab678faed06fac225193be281ea0fddb43b93", - "reference": "20cab678faed06fac225193be281ea0fddb43b93", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", "shasum": "" }, "require": { "hamcrest/hamcrest-php": "^2.0.1", "lib-pcre": ">=7.0", - "php": "^7.3 || ^8.0" + "php": ">=7.3" }, "conflict": { "phpunit/phpunit": "<8.0" }, "require-dev": { - "phpunit/phpunit": "^8.5 || ^9.3" + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, "autoload": { - "psr-0": { - "Mockery": "library/" + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" } }, "notification-url": "https://packagist.org/downloads/", @@ -8595,12 +9665,20 @@ { "name": "Pádraic Brady", "email": "padraic.brady@gmail.com", - "homepage": "http://blog.astrumfutura.com" + "homepage": "https://github.com/padraic", + "role": "Author" }, { "name": "Dave Marshall", "email": "dave.marshall@atstsolutions.co.uk", - "homepage": "http://davedevelopment.co.uk" + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" } ], "description": "Mockery is a simple yet flexible PHP mock object framework", @@ -8618,44 +9696,49 @@ "testing" ], "support": { + "docs": "https://docs.mockery.io/", "issues": "https://github.com/mockery/mockery/issues", - "source": "https://github.com/mockery/mockery/tree/master" + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" }, - "time": "2020-08-11T18:10:13+00:00" + "time": "2024-05-16T03:13:13+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.10.2", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" + "reference": "024473a478be9df5fdaca2c793f2232fe788e414" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", + "reference": "024473a478be9df5fdaca2c793f2232fe788e414", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, - "replace": { - "myclabs/deep-copy": "self.version" + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, "files": [ "src/DeepCopy/deep_copy.php" - ] + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -8671,7 +9754,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" }, "funding": [ { @@ -8679,37 +9762,36 @@ "type": "tidelift" } ], - "time": "2020-11-13T09:40:50+00:00" + "time": "2025-02-12T12:17:51+00:00" }, { "name": "nunomaduro/collision", - "version": "v5.2.0", + "version": "v5.11.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "aca954fd03414ba0dd85d7d8e42ba9b251893d1f" + "reference": "8b610eef8582ccdc05d8f2ab23305e2d37049461" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/aca954fd03414ba0dd85d7d8e42ba9b251893d1f", - "reference": "aca954fd03414ba0dd85d7d8e42ba9b251893d1f", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/8b610eef8582ccdc05d8f2ab23305e2d37049461", + "reference": "8b610eef8582ccdc05d8f2ab23305e2d37049461", "shasum": "" }, "require": { "facade/ignition-contracts": "^1.0", - "filp/whoops": "^2.7.2", + "filp/whoops": "^2.14.3", "php": "^7.3 || ^8.0", "symfony/console": "^5.0" }, "require-dev": { "brianium/paratest": "^6.1", "fideloper/proxy": "^4.4.1", - "friendsofphp/php-cs-fixer": "^2.17.3", "fruitcake/laravel-cors": "^2.0.3", - "laravel/framework": "^9.0", + "laravel/framework": "8.x-dev", "nunomaduro/larastan": "^0.6.2", "nunomaduro/mock-final-classes": "^1.0", - "orchestra/testbench": "^7.0", + "orchestra/testbench": "^6.0", "phpstan/phpstan": "^0.12.64", "phpunit/phpunit": "^9.5.0" }, @@ -8755,7 +9837,7 @@ }, "funding": [ { - "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "url": "https://www.paypal.com/paypalme/enunomaduro", "type": "custom" }, { @@ -8767,24 +9849,25 @@ "type": "patreon" } ], - "time": "2021-01-13T10:00:08+00:00" + "time": "2022-01-10T16:22:52+00:00" }, { "name": "phar-io/manifest", - "version": "2.0.1", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133" + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", - "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", @@ -8825,22 +9908,28 @@ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/master" + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, - "time": "2020-06-27T14:33:11+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" }, { "name": "phar-io/version", - "version": "3.0.4", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", - "reference": "e4782611070e50613683d2b9a57730e9a3ba5451" + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/e4782611070e50613683d2b9a57730e9a3ba5451", - "reference": "e4782611070e50613683d2b9a57730e9a3ba5451", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "shasum": "" }, "require": { @@ -8876,9 +9965,9 @@ "description": "Library for handling version information and constraints", "support": { "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.0.4" + "source": "https://github.com/phar-io/version/tree/3.2.1" }, - "time": "2020-12-13T23:18:30+00:00" + "time": "2022-02-21T01:04:05+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -8933,82 +10022,35 @@ }, "time": "2020-06-27T09:03:43+00:00" }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.2.2", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" - }, - "time": "2020-09-03T19:13:55+00:00" - }, { "name": "phpdocumentor/type-resolver", - "version": "1.4.0", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.18|^2.0" }, "require-dev": { - "ext-tokenizer": "*" + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" }, "type": "library", "extra": { @@ -9034,117 +10076,97 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0" }, - "time": "2020-09-17T18:55:26+00:00" + "time": "2024-11-09T15:12:26+00:00" }, { - "name": "phpspec/prophecy", - "version": "1.12.2", + "name": "phpstan/phpdoc-parser", + "version": "2.1.0", "source": { "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "245710e971a030f42e08f4912863805570f23d39" + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/245710e971a030f42e08f4912863805570f23d39", - "reference": "245710e971a030f42e08f4912863805570f23d39", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.1", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" + "php": "^7.4 || ^8.0" }, "require-dev": { - "phpspec/phpspec": "^6.0", - "phpunit/phpunit": "^8.0 || ^9.0" + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^5.3.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "symfony/process": "^5.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11.x-dev" - } - }, "autoload": { "psr-4": { - "Prophecy\\": "src/Prophecy" + "PHPStan\\PhpDocParser\\": [ + "src/" + ] } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.12.2" + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.1.0" }, - "time": "2020-12-19T10:15:11+00:00" + "time": "2025-02-19T13:28:12+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.5", + "version": "9.2.32", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1" + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f3e026641cc91909d421802dd3ac7827ebfd97e1", - "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.10.2", + "nikic/php-parser": "^4.19.1 || ^5.1.0", "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", - "theseer/tokenizer": "^1.2.0" + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.6" }, "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "9.2-dev" + "dev-main": "9.2.x-dev" } }, "autoload": { @@ -9172,7 +10194,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.5" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" }, "funding": [ { @@ -9180,20 +10203,20 @@ "type": "github" } ], - "time": "2020-11-28T06:44:49+00:00" + "time": "2024-08-22T04:23:01+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "3.0.5", + "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8" + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "shasum": "" }, "require": { @@ -9232,7 +10255,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" }, "funding": [ { @@ -9240,7 +10263,7 @@ "type": "github" } ], - "time": "2020-09-28T05:57:25+00:00" + "time": "2021-12-02T12:48:52+00:00" }, { "name": "phpunit/php-invoker", @@ -9425,55 +10448,50 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.0", + "version": "9.6.22", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "8e16c225d57c3d6808014df6b1dd7598d0a5bbbe" + "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/8e16c225d57c3d6808014df6b1dd7598d0a5bbbe", - "reference": "8e16c225d57c3d6808014df6b1dd7598d0a5bbbe", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f80235cb4d3caa59ae09be3adf1ded27521d1a9c", + "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1", + "doctrine/instantiator": "^1.5.0 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.1", - "phar-io/version": "^3.0.2", + "myclabs/deep-copy": "^1.12.1", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", "php": ">=7.3", - "phpspec/prophecy": "^1.12.1", - "phpunit/php-code-coverage": "^9.2.3", - "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-code-coverage": "^9.2.32", + "phpunit/php-file-iterator": "^3.0.6", "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.5", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.3", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^2.3", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.6", + "sebastian/global-state": "^5.0.7", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", "sebastian/version": "^3.0.2" }, - "require-dev": { - "ext-pdo": "*", - "phpspec/prophecy-phpunit": "^2.0.1" - }, "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "bin": [ "phpunit" @@ -9481,15 +10499,15 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.5-dev" + "dev-master": "9.6-dev" } }, "autoload": { - "classmap": [ - "src/" - ], "files": [ "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -9512,82 +10530,37 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.0" + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.22" }, "funding": [ { - "url": "https://phpunit.de/donate.html", + "url": "https://phpunit.de/sponsors.html", "type": "custom" }, { "url": "https://github.com/sebastianbergmann", "type": "github" - } - ], - "time": "2020-12-04T05:05:53+00:00" - }, - { - "name": "react/promise", - "version": "v2.8.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4", - "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Promise\\": "src/" }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com" + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" } ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", - "keywords": [ - "promise", - "promises" - ], - "support": { - "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.8.0" - }, - "time": "2020-05-12T15:16:56+00:00" + "time": "2024-12-05T13:48:26+00:00" }, { "name": "sebastian/cli-parser", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", "shasum": "" }, "require": { @@ -9622,7 +10595,7 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" }, "funding": [ { @@ -9630,7 +10603,7 @@ "type": "github" } ], - "time": "2020-09-28T06:08:49+00:00" + "time": "2024-03-02T06:27:43+00:00" }, { "name": "sebastian/code-unit", @@ -9745,16 +10718,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.6", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382" + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { @@ -9807,7 +10780,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" }, "funding": [ { @@ -9815,24 +10788,24 @@ "type": "github" } ], - "time": "2020-10-26T15:49:45+00:00" + "time": "2022-09-14T12:41:17+00:00" }, { "name": "sebastian/complexity", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", "shasum": "" }, "require": { - "nikic/php-parser": "^4.7", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3" }, "require-dev": { @@ -9864,7 +10837,7 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" }, "funding": [ { @@ -9872,20 +10845,20 @@ "type": "github" } ], - "time": "2020-10-26T15:52:27+00:00" + "time": "2023-12-22T06:19:30+00:00" }, { "name": "sebastian/diff", - "version": "4.0.4", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", "shasum": "" }, "require": { @@ -9930,7 +10903,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" }, "funding": [ { @@ -9938,20 +10911,20 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2024-03-02T06:30:58+00:00" }, { "name": "sebastian/environment", - "version": "5.1.3", + "version": "5.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac" + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", "shasum": "" }, "require": { @@ -9993,7 +10966,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" }, "funding": [ { @@ -10001,20 +10974,20 @@ "type": "github" } ], - "time": "2020-09-28T05:52:38+00:00" + "time": "2023-02-03T06:03:51+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.3", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65" + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65", - "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", "shasum": "" }, "require": { @@ -10063,14 +11036,14 @@ } ], "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", + "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" }, "funding": [ { @@ -10078,20 +11051,20 @@ "type": "github" } ], - "time": "2020-09-28T05:24:23+00:00" + "time": "2024-03-02T06:33:00+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.2", + "version": "5.0.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "a90ccbddffa067b51f574dea6eb25d5680839455" + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/a90ccbddffa067b51f574dea6eb25d5680839455", - "reference": "a90ccbddffa067b51f574dea6eb25d5680839455", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", "shasum": "" }, "require": { @@ -10134,7 +11107,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" }, "funding": [ { @@ -10142,24 +11115,24 @@ "type": "github" } ], - "time": "2020-10-26T15:55:19+00:00" + "time": "2024-03-02T06:35:11+00:00" }, { "name": "sebastian/lines-of-code", - "version": "1.0.3", + "version": "1.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", "shasum": "" }, "require": { - "nikic/php-parser": "^4.6", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3" }, "require-dev": { @@ -10191,7 +11164,7 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" }, "funding": [ { @@ -10199,7 +11172,7 @@ "type": "github" } ], - "time": "2020-11-28T06:42:11+00:00" + "time": "2023-12-22T06:20:34+00:00" }, { "name": "sebastian/object-enumerator", @@ -10315,16 +11288,16 @@ }, { "name": "sebastian/recursion-context", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", "shasum": "" }, "require": { @@ -10363,10 +11336,10 @@ } ], "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" }, "funding": [ { @@ -10374,20 +11347,20 @@ "type": "github" } ], - "time": "2020-10-26T13:17:30+00:00" + "time": "2023-02-03T06:07:39+00:00" }, { "name": "sebastian/resource-operations", - "version": "3.0.3", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", "shasum": "" }, "require": { @@ -10399,7 +11372,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -10420,8 +11393,7 @@ "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" }, "funding": [ { @@ -10429,32 +11401,32 @@ "type": "github" } ], - "time": "2020-09-28T06:45:17+00:00" + "time": "2024-03-14T16:00:52+00:00" }, { "name": "sebastian/type", - "version": "2.3.1", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2" + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/81cd61ab7bbf2de744aba0ea61fae32f721df3d2", - "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -10477,7 +11449,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/2.3.1" + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" }, "funding": [ { @@ -10485,7 +11457,7 @@ "type": "github" } ], - "time": "2020-10-26T13:18:59+00:00" + "time": "2023-02-03T06:13:03+00:00" }, { "name": "sebastian/version", @@ -10541,145 +11513,37 @@ "time": "2020-09-28T06:39:44+00:00" }, { - "name": "seld/jsonlint", - "version": "1.8.3", + "name": "symfony/yaml", + "version": "v6.4.18", "source": { "type": "git", - "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" + "url": "https://github.com/symfony/yaml.git", + "reference": "bf598c9d9bb4a22f495a4e26e4c4fce2f8ecefc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "url": "https://api.github.com/repos/symfony/yaml/zipball/bf598c9d9bb4a22f495a4e26e4c4fce2f8ecefc5", + "reference": "bf598c9d9bb4a22f495a4e26e4c4fce2f8ecefc5", "shasum": "" }, "require": { - "php": "^5.3 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" - }, - "bin": [ - "bin/jsonlint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Seld\\JsonLint\\": "src/Seld/JsonLint/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "JSON Linter", - "keywords": [ - "json", - "linter", - "parser", - "validator" - ], - "support": { - "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" - }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", - "type": "tidelift" - } - ], - "time": "2020-11-11T09:19:24+00:00" - }, - { - "name": "seld/phar-utils", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8674b1d84ffb47cc59a101f5d5a3b61e87d23796", - "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\PharUtils\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "PHAR file format utilities, for when PHP phars you up", - "keywords": [ - "phar" - ], - "support": { - "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/master" - }, - "time": "2020-07-07T18:42:57+00:00" - }, - { - "name": "symfony/debug", - "version": "v4.4.18", - "source": { - "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "5dfc7825f3bfe9bb74b23d8b8ce0e0894e32b544" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/5dfc7825f3bfe9bb74b23d8b8ce0e0894e32b544", - "reference": "5dfc7825f3bfe9bb74b23d8b8ce0e0894e32b544", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "psr/log": "~1.0", - "symfony/polyfill-php80": "^1.15" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/http-kernel": "<3.4" + "symfony/console": "<5.4" }, "require-dev": { - "symfony/http-kernel": "^3.4|^4.0|^5.0" + "symfony/console": "^5.4|^6.0|^7.0" }, + "bin": [ + "Resources/bin/yaml-lint" + ], "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Debug\\": "" + "Symfony\\Component\\Yaml\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -10699,10 +11563,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Debug Component", + "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/debug/tree/v4.4.18" + "source": "https://github.com/symfony/yaml/tree/v6.4.18" }, "funding": [ { @@ -10718,82 +11582,20 @@ "type": "tidelift" } ], - "time": "2020-12-10T16:34:26+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v5.2.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "fa8f8cab6b65e2d99a118e082935344c5ba8c60d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/fa8f8cab6b65e2d99a118e082935344c5ba8c60d", - "reference": "fa8f8cab6b65e2d99a118e082935344c5ba8c60d", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Filesystem Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.2.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-11-30T17:05:38+00:00" + "time": "2025-01-07T09:44:41+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.0", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "75a63c33a8577608444246075ea0af0d052e452a" + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", - "reference": "75a63c33a8577608444246075ea0af0d052e452a", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { @@ -10822,7 +11624,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/master" + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" }, "funding": [ { @@ -10830,17 +11632,17 @@ "type": "github" } ], - "time": "2020-07-12T23:59:07+00:00" + "time": "2024-03-03T12:36:25+00:00" } ], "aliases": [], "minimum-stability": "dev", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^7.3|^8.0" + "php": "^7.4|^8.0" }, - "platform-dev": [], - "plugin-api-version": "2.0.0" + "platform-dev": {}, + "plugin-api-version": "2.6.0" } diff --git a/config/PaymentCredit.php b/config/PaymentCredit.php new file mode 100644 index 0000000..b4825df --- /dev/null +++ b/config/PaymentCredit.php @@ -0,0 +1,385 @@ + "bezahlt", + 'appointed' => "offen", + 'failed' => "abbruch", + 'extern' => "extern", + 'open' => "offen", + 'invoice_open' => "Re. offen", + 'invoice_paid' => "Re. bezahlt", + 'invoice_non' => "Re. keine Zahlung", + 'non' => "keine Zahlung", + 'NULL' => 'keine Zahlung', + ]; + + public static $txaction_invoice = [ + 'open' => "offen", + 'paid' => "bezahlt", + 'non' => "keine Zahlung", + /*'open_vor' => "Vorkasse offen", + 'paid_vor' => "Vorkasse bezahlt", + 'non_vor' => "Vorkasse keine Zahlung", + 'invoice_open' => "Rechung offen", + 'invoice_paid' => "Rechung bezahlt", + 'invoice_non' => 'Rechung keine Zahlung',*/ + + ]; + + public static $txaction_color = [ + 'appointed' => "warning", + 'failed' => "danger", + 'extern' => "success", + 'open' => "warning", + 'paid' => "success", + 'non' => "danger", + 'open_vor' => "warning", + 'paid_vor' => "success", + 'non_vor' => "danger", + 'invoice_open' => "warning", + 'invoice_paid' => "success", + 'invoice_non' => "danger", + + ]; + + + public static function getFormattedTxaction($txaction){ + if($txaction && isset(self::$txaction_text[$txaction])){ + return self::$txaction_text[$txaction]; + } + return self::$txaction_text['NULL']; + } + + public static function getFormattedTxactionColor($txaction){ + if($txaction && isset(self::$txaction_color[$txaction])){ + return self::$txaction_color[$txaction]; + } + return "warning"; + } + public static function generateNextInvoiceNumber(){ + $invoice_number = \App\Models\Setting::getContentBySlug('invoice-number'); + return $invoice_number; + + } + + public static function getShoppingOrderBadge(ShoppingOrder $shopping_order){ + if($shopping_order->mode === 'test'){ + return ''.strtoupper($shopping_order->mode).' - '.self::getFormattedTxaction($shopping_order->txaction).''; + } + if($shopping_order->mode === 'dev'){ + return ''.strtoupper($shopping_order->mode).' - '.self::getFormattedTxaction($shopping_order->txaction).''; + } + return ''.self::getFormattedTxaction($shopping_order->txaction).''; + } + + public static function getPaymentForTypeBadge(ShoppingOrder $shopping_order){ + return ''.$shopping_order->getPaymentForType().''; + + } + + public static function getShoppingPaymentBadge(ShoppingPayment $shopping_payment){ + if($shopping_payment->mode === 'test'){ + return ''.strtoupper($shopping_payment->mode).' - '.self::getFormattedTxaction($shopping_payment->txaction).''; + } + return ''.self::getFormattedTxaction($shopping_payment->txaction).''; + } + + public static function addUserPayCredits(User $user, $credit, $status, $message, $shopping_order_id = null){ + UserPayCredit::create([ + 'user_id' => $user->id, + 'credit' => $credit, + 'old_credit_total' => $user->payment_credit, + 'new_credit_total' => $user->payment_credit + $credit, + 'message' => $message, + 'status' => $status, + 'shopping_order_id' => $shopping_order_id, + ]); + $user->payment_credit = $user->payment_credit + $credit; + $user->save(); + } + + + public static function addUserCreditMargin(User $user, $credit, $status, $message){ + UserCreditMargin::create([ + 'user_id' => $user->id, + 'credit' => $credit, + 'message' => $message, + 'status' => $status, + ]); + } + + public static function addProductBuy(User $user, Product $product){ + + if($product->max_buy && $product->max_buy_num > 0){ + $ProductBuy = ProductBuy::where('auth_user_id', $user->id)->where('product_id', $product->id)->first(); + if(!$ProductBuy){ + ProductBuy::create([ + 'auth_user_id' => $user->id, + 'product_id' => $product->id, + 'num' => 1, + ]); + }else{ + $ProductBuy->num = $ProductBuy->num+1; + $ProductBuy->save(); + } + } + } + /**/ + public static function paymentStatusPaidAction(ShoppingOrder $shopping_order, $paid){ + $send_link = false; + + $shopping_order->setUserHistoryValue(['status' => 8]); + Shop::userOrders(); + $shopping_order->paid = $paid; + $shopping_order->save(); + + //if product has actions + if($shopping_order->shopping_order_items && $shopping_order->auth_user_id){ + foreach($shopping_order->shopping_order_items as $shopping_order_item){ + if($shopping_order_item->product){ + //add product when buy + $user = User::findOrFail($shopping_order->auth_user_id); + + if($shopping_order_item->product->max_buy && $shopping_order_item->product->max_buy_num > 0){ + self::addProductBuy($user, $shopping_order_item->product); + } + //product action + if($shopping_order_item->product->action){ + $user->save(); + $send_link = true; + //new date + $date = \Carbon::now()->modify('1 year'); + if($user->payment_account && $user->daysActiveAccount()>0){ + $date = \Carbon::parse($user->payment_account)->modify('1 year'); + } + foreach ($shopping_order_item->product->action as $do){ + if($shopping_order_item->product->getActionName($do) === 'payment_for_account' && !$shopping_order_item->handle){ + // $user->payment_order_id = $shopping_order_item->product->id; //34 + $user->payment_account = $date; + $user->wizard = 100; + $user->save(); + self::addUserPayCredits($user, $shopping_order_item->product->price, 1, 'payment_for_account', $shopping_order->id); + $shopping_order_item->handle = true; + $shopping_order_item->save(); + $shopping_order->setUserHistoryValue(['status' => 9]); + + } + if($shopping_order_item->product->getActionName($do) === 'charging_credits' && !$shopping_order_item->handle){ + self::addUserPayCredits($user, ($shopping_order_item->product->price * $shopping_order_item->qty), 7, 'charging_credits_add', $shopping_order->id); + $shopping_order_item->handle = true; + $shopping_order_item->save(); + $shopping_order->setUserHistoryValue(['status' => 9]); + } + + /*if($shopping_order_item->product->getActionName($do) === 'payment_for_shop'){ + $user->payment_order_id = $shopping_order_item->product->id; //35 + $user->payment_shop = $date; + $user->wizard = 100; + $shopping_order->setUserHistoryValue(['status' => 9]); + } + if($shopping_order_item->product->getActionName($do) === 'payment_for_shop_upgrade'){ + if($shopping_order_item->product->upgrade_to_id){ + $user->payment_order_id = $shopping_order_item->product->upgrade_to_id; + } + $user->payment_shop = $user->payment_account; //same Date, is upgrade + $shopping_order->setUserHistoryValue(['status' => 9]); + } + if($shopping_order_item->product->getActionName($do) === 'payment_for_lead_upgrade'){ + if($shopping_order_item->product->upgrade_to_id){ + $user->m_level = $shopping_order_item->product->upgrade_to_id; + } + }*/ + //$user->save(); + } + } + } + + } + } + //if the order has action + if(($shopping_order->shopping_user->is_from === 'user_order' || $shopping_order->shopping_user->is_from === 'shopping') && $shopping_order->shopping_order_margin){ + //is margin -> set paid + $shopping_order->shopping_order_margin->order_paid = true; + $shopping_order->shopping_order_margin->save(); + } + return $send_link; + } + + public static function handelPromotionProduct(ShoppingOrder $shopping_order){ + //add the Promotion Product to Order + $shopping_order = ShoppingOrder::find($shopping_order->id); + foreach($shopping_order->shopping_order_items as $shopping_order_item){ + if($shopping_order_item->isFreeProduct()){ + if($promotion_user_product = $shopping_order_item->promotion_user_product){ + $promotion_admin_product = $promotion_user_product->promotion_admin_product; + $PromotionUserOrder = PromotionUserOrder::create([ + 'promotion_admin_id' => $promotion_user_product->promotion_admin_id, + 'promotion_user_id' => $shopping_order->promotion_user_id, + 'promotion_user_product_id' => $promotion_user_product->id, + 'product_id' => $promotion_user_product->product_id, + 'shopping_order_item_id' => $shopping_order_item->id, + 'shopping_order_id' => $shopping_order->id, + 'shopping_user_id' => $shopping_order->shopping_user_id, + 'qty' => $shopping_order_item->qty, + 'price' => $promotion_admin_product->getPriceWith(false), + 'price_net' => $promotion_admin_product->getPriceWith(true), + 'tax_rate' => $promotion_admin_product->product->tax, + 'status' => 0, + 'pick_up' => $shopping_order->isPickUp() + ]); + + $promotion_user_product->open_items -= $PromotionUserOrder->qty; + $promotion_user_product->sell_items += $PromotionUserOrder->qty; + $promotion_user_product->used_budget_total += $PromotionUserOrder->price; + $promotion_user_product->save(); + + //Guthaben abziehen wenn nicht abholung + if(!$shopping_order->isPickUp()){ + self::addUserPayCredits($promotion_user_product->promotion_user->user, ($PromotionUserOrder->price*-1), 5, 'promotion_order_deduction', $shopping_order->id); + } + } + } + } + } + + //remove or add form credit, is from Charging credits, handle is true (by paymentStatusPaidAction first action by paid) + public static function handelUserPayChargingCredits(ShoppingOrder $shopping_order, $action){ + //only from cr <- credit Charging + if($shopping_order->shopping_user->is_for !== 'cr'){ + return; + } + if($shopping_order->shopping_order_items && $shopping_order->auth_user_id){ + foreach($shopping_order->shopping_order_items as $shopping_order_item){ + if($shopping_order_item->product){ + $user = User::findOrFail($shopping_order->auth_user_id); + //product action + if($shopping_order_item->product->action){ + foreach ($shopping_order_item->product->action as $do){ + if($shopping_order_item->product->getActionName($do) === 'charging_credits' && $shopping_order_item->handle){ + if($action === 'remove'){ + self::addUserPayCredits($user, ($shopping_order_item->product->price*-1), 8, 'charging_credits_remove', $shopping_order->id); + } + if($action === 'add'){ + self::addUserPayCredits($user, $shopping_order_item->product->price, 7, 'charging_credits_add', $shopping_order->id); + } + } + } + } + } + } + } + } + + //remove form credit, every sale fnc / vor / etc from CheckoutController + //when done, put it back SalesController + public static function handelUserPayCredits(ShoppingOrder $shopping_order, $do){ + //is payment credit, deduction or return + if(!$shopping_order->shopping_order_margin){ + return; + } + if($do === 'deduction'){ + if($shopping_order->shopping_order_margin->from_payment_credit > 0){ + $credit = $shopping_order->shopping_order_margin->from_payment_credit * -1; + self::addUserPayCredits($shopping_order->auth_user, $credit, 2, 'user_order_deduction', $shopping_order->id); + } + } + if($do === 'return'){ + if($shopping_order->shopping_order_margin->from_payment_credit > 0){ + $credit = $shopping_order->shopping_order_margin->from_payment_credit; + self::addUserPayCredits($shopping_order->auth_user, $credit, 4, 'user_order_return', $shopping_order->id); + } + } + } + + public static function handelUserPromotionOrder(ShoppingOrder $shopping_order){ + //no user promotion + if($shopping_order->payment_for !== 7 || !$shopping_order->promotion_user){ + return; + } + if($shopping_order->promotion_user->promotion_user_orders){ + foreach($shopping_order->promotion_user->getPromotionUserOrders($shopping_order->id) as $promotion_user_order){ + $promotion_user_order->setStatusShipped($shopping_order->getAPIShippedType()); + if(!$promotion_user_order->pick_up){ // keine abholung handel credit + $last_UserPayCredit = UserPayCredit::where('shopping_order_id', $shopping_order->id)->whereIn('status', [5, 6])->orderBy('id', 'DESC')->first(); + if($last_UserPayCredit && $promotion_user_order->status === 10 && $last_UserPayCredit->status === 5){ + Payment::handelUserPayCreditsPromotion($promotion_user_order, 'return'); + } + //Status Zahlung, voher gab es eine Storno, Guthaben abziehen wenn status 6 / return from order + if($last_UserPayCredit && $promotion_user_order->status === 0 && $last_UserPayCredit->status === 6){ + Payment::handelUserPayCreditsPromotion($promotion_user_order, 'deduction'); + } + } + } + } + } + + public static function handelUserShopOrder(ShoppingOrder $shopping_order){ + //no user shop + if($shopping_order->payment_for !== 8 || !$shopping_order->user_shop){ + return; + } + // need something to do? + } + + //add or remove form credit, + //when done, put it back SalesController + public static function handelUserPayCreditsPromotion(PromotionUserOrder $promotion_user_order, $do){ + //is promotion pick up, dont + if($promotion_user_order->pick_up){ + return; + } + if($do === 'deduction'){ + if($promotion_user_order->price > 0){ + $credit = $promotion_user_order->price * -1; + self::addUserPayCredits($promotion_user_order->promotion_user->user, $credit, 5, 'promotion_order_deduction', $promotion_user_order->shopping_order->id); + } + } + if($do === 'return'){ + if($promotion_user_order->price > 0){ + $credit = $promotion_user_order->price; + self::addUserPayCredits($promotion_user_order->promotion_user->user, $credit, 6, 'promotion_order_return', $promotion_user_order->shopping_order->id); + } + } + + } + + public static function paymentStatusSendMail(ShoppingOrder $shopping_order, $shopping_payment, $data){ + $bcc = []; + $billing_email = $shopping_order->shopping_user->billing_email; + if(!$billing_email){ + if($data['mode'] === 'test'){ + $billing_email = config('app.checkout_test_mail'); + }else{ + $billing_email = config('app.checkout_mail'); + } + } + if($data['mode'] === 'test'){ + $bcc[] = config('app.checkout_test_mail'); + }else{ + $bcc[] = config('app.checkout_mail'); + } + + if(!$shopping_order->shopping_user->is_like && $shopping_order->shopping_user->member){ + $bcc[] = $shopping_order->shopping_user->member->email; + } + + Mail::to($billing_email)->bcc($bcc)->send(new MailCheckout($data['txaction'], $shopping_order, $shopping_payment, $data['send_link'], $data['mode'])); + } +} diff --git a/config/app.php b/config/app.php index 2054c5a..a653628 100644 --- a/config/app.php +++ b/config/app.php @@ -59,6 +59,8 @@ return [ 'promo_url' => env('APP_PROMO_URL', 'https://www.testemich.jetzt'), 'promo_domain' => env('APP_PROMO_DOMAIN', 'www.testemich.jetzt'), + 'shop_url' => env('APP_SHOP_URL', 'https://www.grueneseele.bio'), + 'shop_domain' => env('APP_SHOP_DOMAIN', 'www.grueneseele.bio'), 'checkout_mail' => env('APP_CHECKOUT_MAIL', 'kevin.adametz@me.com'), 'checkout_test_mail' => env('APP_CHECKOUT_TEST_MAIL', 'kevin.adametz@me.com'), @@ -70,6 +72,10 @@ return [ 'asset_url' => env('ASSET_URL', null), + 'main_user_id' => env('APP_MAIN_USER_ID', 1), + + 'exception_mail' => env('EXCEPTION_MAIL', 'exception@adametz.media'), + /* |-------------------------------------------------------------------------- | Application Timezone diff --git a/config/services.php b/config/services.php index 2a1d616..7cdb3bb 100644 --- a/config/services.php +++ b/config/services.php @@ -29,5 +29,9 @@ return [ 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), ], + 'recaptcha' => [ + 'site_key' => env('RECAPTCHA_SITE_KEY'), + 'secret_key' => env('RECAPTCHA_SECRET_KEY'), + ], ]; diff --git a/database/migrations/2018_09_29_145909_create_countries_table.php b/database/migrations/2018_09_29_145909_create_countries_table.php index 3961b54..a83997e 100644 --- a/database/migrations/2018_09_29_145909_create_countries_table.php +++ b/database/migrations/2018_09_29_145909_create_countries_table.php @@ -24,7 +24,11 @@ class CreateCountriesTable extends Migration $table->string('it', 100); $table->string('ru', 100); + $table->boolean('active')->default(true); + $table->boolean('supply_country')->default(false); + $table->boolean('eu_country')->default(false); $table->boolean('switch')->default(false); + $table->boolean('translate')->default(false); $table->boolean('own_eur')->default(false); $table->boolean('currency')->default(false); $table->string('currency_unit', 10)->nullable(); diff --git a/database/migrations/2018_09_29_170559_create_user_accounts_table.php b/database/migrations/2018_09_29_170559_create_user_accounts_table.php index cf76e35..8e64851 100644 --- a/database/migrations/2018_09_29_170559_create_user_accounts_table.php +++ b/database/migrations/2018_09_29_170559_create_user_accounts_table.php @@ -43,6 +43,10 @@ class CreateUserAccountsTable extends Migration $table->string('tax_identification_number', 20)->nullable(); $table->unsignedTinyInteger('taxable_sales')->nullable(); + $table->boolean('reverse_charge')->default(false); + $table->char('reverse_charge_code', 2)->nullable(); + $table->timestamp('reverse_charge_valid')->nullable(); + $table->boolean('same_as_billing')->default(true); $table->char('shipping_salutation', 2)->nullable(); diff --git a/database/migrations/2018_10_21_163956_create_attributes_table.php b/database/migrations/2018_10_21_163956_create_attributes_table.php index a2636ed..aa0b9fa 100644 --- a/database/migrations/2018_10_21_163956_create_attributes_table.php +++ b/database/migrations/2018_10_21_163956_create_attributes_table.php @@ -15,12 +15,13 @@ class CreateAttributesTable extends Migration { Schema::create('attributes', function (Blueprint $table) { $table->increments('id'); + $table->unsignedInteger('attribute_type_id'); $table->unsignedInteger('parent_id')->index()->nullable(); $table->string('name')->index(); $table->text('trans_name')->nullable(); $table->tinyInteger('pos')->unsigned()->nullable(); - $table->boolean('active')->default(false); + $table->boolean('active')->default(true); $table->string('slug')->unique()->index(); @@ -30,6 +31,10 @@ class CreateAttributesTable extends Migration $table->foreign('parent_id') ->references('id') ->on('attributes'); + + $table->foreign('attribute_type_id') + ->references('id') + ->on('attribute_types'); }); } diff --git a/database/migrations/2018_10_21_164001_create_products_table.php b/database/migrations/2018_10_21_164001_create_products_table.php index 306f7a3..7f6d9b4 100644 --- a/database/migrations/2018_10_21_164001_create_products_table.php +++ b/database/migrations/2018_10_21_164001_create_products_table.php @@ -19,6 +19,9 @@ class CreateProductsTable extends Migration $table->string('name')->index(); $table->text('trans_name')->nullable(); + $table->boolean('whitelabel')->default(false); + $table->text('whitelabel_name')->nullable(); + $table->string('title')->nullable()->index(); $table->text('trans_title')->nullable(); @@ -71,6 +74,7 @@ class CreateProductsTable extends Migration $table->decimal('value_commission', 5, 2)->nullable(); $table->decimal('partner_commission', 5, 2)->nullable(); + $table->boolean('exclude_stats_sales')->default(false); $table->string('identifier', 20)->nullable(); $table->boolean('shipping_addon')->default(false); diff --git a/database/migrations/2018_10_21_164003_create_product_attributes_table.php b/database/migrations/2018_10_21_164003_create_product_attributes_table.php index 44a3776..b1998ff 100644 --- a/database/migrations/2018_10_21_164003_create_product_attributes_table.php +++ b/database/migrations/2018_10_21_164003_create_product_attributes_table.php @@ -17,19 +17,26 @@ class CreateProductAttributesTable extends Migration $table->increments('id'); $table->unsignedInteger('product_id')->index(); + $table->unsignedInteger('type_id')->index(); $table->unsignedInteger('attribute_id')->index(); $table->timestamps(); $table->foreign('product_id') ->references('id') - ->on('products'); + ->on('products') + ->onDelete('cascade'); $table->foreign('attribute_id') ->references('id') ->on('attributes') ->onDelete('cascade'); + $table->foreign('type_id') + ->references('id') + ->on('attribute_types') + ->onDelete('cascade'); + }); } diff --git a/database/migrations/2018_10_21_164007_create_product_images_table.php b/database/migrations/2018_10_21_164007_create_product_images_table.php index e1a5183..fb2e23f 100644 --- a/database/migrations/2018_10_21_164007_create_product_images_table.php +++ b/database/migrations/2018_10_21_164007_create_product_images_table.php @@ -17,23 +17,30 @@ class CreateProductImagesTable extends Migration $table->increments('id'); $table->unsignedInteger('product_id')->nullable()->index(); + $table->unsignedInteger('user_wl_product_id')->nullable()->index(); $table->string('filename')->index(); $table->string('original_name')->index(); + $table->string('type', 100)->nullable(); $table->string('ext')->index(); $table->string('mine')->index(); $table->unsignedInteger('size'); $table->boolean('active')->default(true); $table->string('slug')->unique()->index(); $table->unsignedTinyInteger('pos')->nullable()->default(0); - - + $table->text('attributes')->nullable(); + $table->timestamps(); $table->foreign('product_id') ->references('id') ->on('products') ->onDelete('cascade'); + + $table->foreign('user_wl_product_id') + ->references('id') + ->on('user_whitelabel_products') + ->onDelete('cascade'); }); } diff --git a/database/migrations/2020_12_23_163527_create_shopping_orders_table.php b/database/migrations/2020_12_23_163527_create_shopping_orders_table.php index fd4ba5d..f90dced 100644 --- a/database/migrations/2020_12_23_163527_create_shopping_orders_table.php +++ b/database/migrations/2020_12_23_163527_create_shopping_orders_table.php @@ -19,6 +19,9 @@ class CreateShoppingOrdersTable extends Migration $table->unsignedInteger('shopping_user_id'); $table->unsignedInteger('auth_user_id'); + $table->unsignedInteger('promotion_user_id')->nullable(); + $table->unsignedInteger('user_shop_id')->nullable(); + $table->unsignedInteger('country_id'); $table->unsignedInteger('member_id')->nullable(); @@ -45,9 +48,11 @@ class CreateShoppingOrdersTable extends Migration $table->unsignedInteger('weight')->nullable(); $table->boolean('paid')->default(false); - $table->text('invoice')->nullable(); - + $table->string('invoice_number', 255)->nullable(); + $table->text('invoice')->nullable(); + $table->text('delivery')->nullable(); + $table->string('wp_invoice_path', 255)->nullable(); $table->text('wp_notice')->nullable(); diff --git a/database/migrations/2021_01_21_170707_create_shopping_order_margins_table.php b/database/migrations/2021_01_21_170707_create_shopping_order_margins_table.php index fc0abd5..00c9500 100644 --- a/database/migrations/2021_01_21_170707_create_shopping_order_margins_table.php +++ b/database/migrations/2021_01_21_170707_create_shopping_order_margins_table.php @@ -32,6 +32,9 @@ class CreateShoppingOrderMarginsTable extends Migration $table->boolean('cancellation')->default(false); $table->unsignedTinyInteger('status')->index()->default(0); + $table->timestamp('margin_pending_to')->nullable(); + $table->boolean('margin_paid')->default(false); + $table->timestamp('partner_commission_pending_to')->nullable(); $table->boolean('partner_commission_paid')->default(false); $table->unsignedBigInteger('user_credit_id')->nullable(); diff --git a/database/migrations/2023_11_14_153214_create_user_shops_table.php b/database/migrations/2023_11_14_153214_create_user_shops_table.php new file mode 100644 index 0000000..8fea4db --- /dev/null +++ b/database/migrations/2023_11_14_153214_create_user_shops_table.php @@ -0,0 +1,55 @@ +increments('id'); + $table->unsignedInteger('user_id'); + + $table->string('url', 255)->nullable(); + + $table->string('name', 255)->nullable(); + $table->text('description')->nullable(); + $table->text('about_you')->nullable(); + $table->text('user_address')->nullable(); + + $table->text('trans')->nullable(); + + $table->boolean('pick_up')->default(true); + $table->boolean('active')->default(false); + $table->timestamp('active_date')->nullable(); + + $table->string('featured')->nullable(); + + $table->timestamps(); + $table->softDeletes(); + + $table->foreign('user_id') + ->references('id') + ->on('users') + ->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_shops'); + } +} diff --git a/database/migrations/2023_11_22_174609_create_user_registers_table.php b/database/migrations/2023_11_22_174609_create_user_registers_table.php new file mode 100644 index 0000000..a8d2387 --- /dev/null +++ b/database/migrations/2023_11_22_174609_create_user_registers_table.php @@ -0,0 +1,31 @@ +string('identifier'); + $table->string('instance'); + $table->longText('content'); + $table->nullableTimestamps(); + + $table->primary(['identifier', 'instance']); + }); + } + /** + * Reverse the migrations. + */ + public function down() + { + Schema::drop('user_registers'); + } +} + diff --git a/database/migrations/2024_03_26_131447_create_lead_type_table.php b/database/migrations/2024_03_26_131447_create_lead_type_table.php new file mode 100644 index 0000000..7c92e04 --- /dev/null +++ b/database/migrations/2024_03_26_131447_create_lead_type_table.php @@ -0,0 +1,33 @@ +increments('id'); + $table->string('name')->index(); + $table->boolean('active')->default(false); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lead_type'); + } +} diff --git a/database/migrations/2024_06_18_171231_create_attribute_types_table.php b/database/migrations/2024_06_18_171231_create_attribute_types_table.php new file mode 100644 index 0000000..d10f7a8 --- /dev/null +++ b/database/migrations/2024_06_18_171231_create_attribute_types_table.php @@ -0,0 +1,48 @@ +increments('id'); + + $table->unsignedInteger('parent_id')->index()->nullable(); + $table->string('name')->index(); + $table->string('description')->nullable(); + $table->text('trans_name')->nullable(); + $table->tinyInteger('pos')->unsigned()->nullable(); + $table->boolean('active')->default(true); + + $table->string('slug')->unique()->index(); + + + $table->timestamps(); + + $table->foreign('parent_id') + ->references('id') + ->on('attributes'); + + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('attribute_types'); + } +} diff --git a/database/migrations/2024_06_19_163044_create_user_whitelabel_products_table.php b/database/migrations/2024_06_19_163044_create_user_whitelabel_products_table.php new file mode 100644 index 0000000..59031b6 --- /dev/null +++ b/database/migrations/2024_06_19_163044_create_user_whitelabel_products_table.php @@ -0,0 +1,50 @@ +increments('id'); + + $table->unsignedInteger('user_id'); + $table->unsignedInteger('product_id')->index(); + $table->string('info')->nullable(); + $table->text('attributes')->nullable(); + $table->text('options')->nullable(); + + $table->boolean('active')->default(true); + + $table->timestamps(); + + $table->foreign('user_id') + ->references('id') + ->on('users') + ->onDelete('cascade'); + + $table->foreign('product_id') + ->references('id') + ->on('products') + ->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_whitelabel_products'); + } +} diff --git a/packages/digital-bird-mivita/shoppingcart/.editorconfig b/packages/digital-bird-mivita/shoppingcart/.editorconfig new file mode 100644 index 0000000..6d2b9ea --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.scss] +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false + +[*.yml] +indent_size = 2 diff --git a/packages/digital-bird-mivita/shoppingcart/.gitignore b/packages/digital-bird-mivita/shoppingcart/.gitignore new file mode 100644 index 0000000..0b27101 --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/.gitignore @@ -0,0 +1,5 @@ +/vendor +composer.phar +composer.lock +.DS_Store +/.idea diff --git a/packages/digital-bird-mivita/shoppingcart/.travis.yml b/packages/digital-bird-mivita/shoppingcart/.travis.yml new file mode 100644 index 0000000..6a80a0b --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/.travis.yml @@ -0,0 +1,10 @@ +language: php + +php: + - 7.0 + +before_script: + - composer self-update + - composer install --prefer-source --no-interaction + +script: vendor/bin/phpunit diff --git a/packages/digital-bird-mivita/shoppingcart/LICENSE b/packages/digital-bird-mivita/shoppingcart/LICENSE new file mode 100644 index 0000000..61c6afc --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Rob Gloudemans + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/packages/digital-bird-mivita/shoppingcart/README.md b/packages/digital-bird-mivita/shoppingcart/README.md new file mode 100644 index 0000000..c03bb4c --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/README.md @@ -0,0 +1,491 @@ +## LaravelShoppingcart +[![License](https://poser.pugx.org/gloudemans/shoppingcart/license)](https://packagist.org/packages/gloudemans/shoppingcart) + +A simple shoppingcart implementation for Laravel. + +## Installation + +Install the package through [Composer](http://getcomposer.org/). + +Run the Composer require command from the Terminal: + + composer require digital-bird/shoppingcart + +If you're using Laravel 5.5, this is all there is to do. + +Should you still be on version 5.4 of Laravel, the final steps for you are to add the service provider of the package and alias the package. To do this open your `config/app.php` file. + +Add a new line to the `providers` array: + + Gloudemans\Shoppingcart\ShoppingcartServiceProvider::class + +And optionally add a new line to the `aliases` array: + + 'Cart' => Gloudemans\Shoppingcart\Facades\Cart::class, + +Now you're ready to start using the shoppingcart in your application. + +**As of version 2 of this package it's possibly to use dependency injection to inject an instance of the Cart class into your controller or other class** + +## Overview +Look at one of the following topics to learn more about LaravelShoppingcart + +* [Usage](#usage) +* [Collections](#collections) +* [Instances](#instances) +* [Models](#models) +* [Database](#database) +* [Exceptions](#exceptions) +* [Events](#events) +* [Example](#example) + +## Usage + +The shoppingcart gives you the following methods to use: + +### Cart::add() + +Adding an item to the cart is really simple, you just use the `add()` method, which accepts a variety of parameters. + +In its most basic form you can specify the id, name, quantity, price, and tax rate of the product you'd like to add to the cart. + +```php +Cart::add('293ad', 'Product 1', 1, 9.99, 10); +``` + +As an optional sixth parameter you can pass it options, so you can add multiple items with the same id, but with (for instance) a different size. + +The fifth parameter is the tax rate. Eg 10 for 10%. + +```php +Cart::add('293ad', 'Product 1', 1, 9.99, 10, ['size' => 'large']); +``` + +**The `add()` method will return an CartItem instance of the item you just added to the cart.** + +Maybe you prefer to add the item using an array? As long as the array contains the required keys, you can pass it to the method. The options key is optional. + +```php +Cart::add(['id' => '293ad', 'name' => 'Product 1', 'qty' => 1, 'price' => 9.99, 'taxRate' => 10, 'options' => ['size' => 'large']]); +``` + +New in version 2 of the package is the possibility to work with the [Buyable](#buyable) interface. The way this works is that you have a model implement the `Buyable` interface, which will make you implement a few methods so the package knows how to get the id, name and price from your model. +This way you can just pass the `add()` method a model and the quantity and it will automatically add it to the cart. + +The path to the `Buyable` interface is: + + Gloudemans\Shoppingcart\Contracts\Buyable; + +**As an added bonus it will automatically associate the model with the CartItem** + +```php +Cart::add($product, 1, ['size' => 'large']); +``` +As an optional third parameter you can add options. +```php +Cart::add($product, 1, ['size' => 'large']); +``` + +Finally, you can also add multipe items to the cart at once. +You can just pass the `add()` method an array of arrays, or an array of Buyables and they will be added to the cart. + +**When adding multiple items to the cart, the `add()` method will return an array of CartItems.** + +```php +Cart::add([ + ['id' => '293ad', 'name' => 'Product 1', 'qty' => 1, 'price' => 10.00, 'taxRate' => 10], + ['id' => '4832k', 'name' => 'Product 2', 'qty' => 1, 'price' => 10.00, 'taxRate' => 10, 'options' => ['size' => 'large']] +]); + +Cart::add([$product1, $product2]); + +``` + +### Cart::update() + +To update an item in the cart, you'll first need the rowId of the item. +Next you can use the `update()` method to update it. + +If you simply want to update the quantity, you'll pass the update method the rowId and the new quantity: + +```php +$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709'; + +Cart::update($rowId, 2); // Will update the quantity +``` + +If you want to update more attributes of the item, you can either pass the update method an array or a `Buyable` as the second parameter. This way you can update all information of the item with the given rowId. + +```php +Cart::update($rowId, ['name' => 'Product 1']); // Will update the name + +Cart::update($rowId, $product); // Will update the id, name and price + +``` + +### Cart::remove() + +To remove an item for the cart, you'll again need the rowId. This rowId you simply pass to the `remove()` method and it will remove the item from the cart. + +```php +$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709'; + +Cart::remove($rowId); +``` + +### Cart::get() + +If you want to get an item from the cart using its rowId, you can simply call the `get()` method on the cart and pass it the rowId. + +```php +$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709'; + +Cart::get($rowId); +``` + +### Cart::content() + +Of course you also want to get the carts content. This is where you'll use the `content` method. This method will return a Collection of CartItems which you can iterate over and show the content to your customers. + +```php +Cart::content(); +``` + +This method will return the content of the current cart instance, if you want the content of another instance, simply chain the calls. + +```php +Cart::instance('wishlist')->content(); +``` + +### Cart::destroy() + +If you want to completely remove the content of a cart, you can call the destroy method on the cart. This will remove all CartItems from the cart for the current cart instance. + +```php +Cart::destroy(); +``` + +### Cart::total() + +The `total()` method can be used to get the calculated total of all items in the cart, given there price and quantity. + +```php +Cart::total(); +``` + +The method will automatically format the result, which you can tweak using the three optional parameters + +```php +Cart::total($decimals, $decimalSeperator, $thousandSeperator); +``` + +You can set the default number format in the config file. + +**If you're not using the Facade, but use dependency injection in your (for instance) Controller, you can also simply get the total property `$cart->total`** + +### Cart::tax() + +The `tax()` method can be used to get the calculated amount of tax for all items in the cart, given there price and quantity. + +```php +Cart::tax(); +``` + +The method will automatically format the result, which you can tweak using the three optional parameters + +```php +Cart::tax($decimals, $decimalSeperator, $thousandSeperator); +``` + +You can set the default number format in the config file. + +**If you're not using the Facade, but use dependency injection in your (for instance) Controller, you can also simply get the tax property `$cart->tax`** + +### Cart::subtotal() + +The `subtotal()` method can be used to get the total of all items in the cart, minus the total amount of tax. + +```php +Cart::subtotal(); +``` + +The method will automatically format the result, which you can tweak using the three optional parameters + +```php +Cart::subtotal($decimals, $decimalSeperator, $thousandSeperator); +``` + +You can set the default number format in the config file. + +**If you're not using the Facade, but use dependency injection in your (for instance) Controller, you can also simply get the subtotal property `$cart->subtotal`** + +### Cart::count() + +If you want to know how many items there are in your cart, you can use the `count()` method. This method will return the total number of items in the cart. So if you've added 2 books and 1 shirt, it will return 3 items. + +```php +Cart::count(); +``` + +### Cart::search() + +To find an item in the cart, you can use the `search()` method. + +**This method was changed on version 2** + +Behind the scenes, the method simply uses the filter method of the Laravel Collection class. This means you must pass it a Closure in which you'll specify you search terms. + +If you for instance want to find all items with an id of 1: + +```php +$cart->search(function ($cartItem, $rowId) { + return $cartItem->id === 1; +}); +``` + +As you can see the Closure will receive two parameters. The first is the CartItem to perform the check against. The second parameter is the rowId of this CartItem. + +**The method will return a Collection containing all CartItems that where found** + +This way of searching gives you total control over the search process and gives you the ability to create very precise and specific searches. + +## Collections + +On multiple instances the Cart will return to you a Collection. This is just a simple Laravel Collection, so all methods you can call on a Laravel Collection are also available on the result. + +As an example, you can quicky get the number of unique products in a cart: + +```php +Cart::content()->count(); +``` + +Or you can group the content by the id of the products: + +```php +Cart::content()->groupBy('id'); +``` + +## Instances + +The packages supports multiple instances of the cart. The way this works is like this: + +You can set the current instance of the cart by calling `Cart::instance('newInstance')`. From this moment, the active instance of the cart will be `newInstance`, so when you add, remove or get the content of the cart, you're work with the `newInstance` instance of the cart. +If you want to switch instances, you just call `Cart::instance('otherInstance')` again, and you're working with the `otherInstance` again. + +So a little example: + +```php +Cart::instance('shopping')->add('192ao12', 'Product 1', 1, 9.99); + +// Get the content of the 'shopping' cart +Cart::content(); + +Cart::instance('wishlist')->add('sdjk922', 'Product 2', 1, 19.95, ['size' => 'medium']); + +// Get the content of the 'wishlist' cart +Cart::content(); + +// If you want to get the content of the 'shopping' cart again +Cart::instance('shopping')->content(); + +// And the count of the 'wishlist' cart again +Cart::instance('wishlist')->count(); +``` + +**N.B. Keep in mind that the cart stays in the last set instance for as long as you don't set a different one during script execution.** + +**N.B.2 The default cart instance is called `default`, so when you're not using instances,`Cart::content();` is the same as `Cart::instance('default')->content()`.** + +## Models + +Because it can be very convenient to be able to directly access a model from a CartItem is it possible to associate a model with the items in the cart. Let's say you have a `Product` model in your application. With the `associate()` method, you can tell the cart that an item in the cart, is associated to the `Product` model. + +That way you can access your model right from the `CartItem`! + +The model can be accessed via the `model` property on the CartItem. + +**If your model implements the `Buyable` interface and you used your model to add the item to the cart, it will associate automatically.** + +Here is an example: + +```php + +// First we'll add the item to the cart. +$cartItem = Cart::add('293ad', 'Product 1', 1, 9.99, ['size' => 'large']); + +// Next we associate a model with the item. +Cart::associate($cartItem->rowId, 'Product'); + +// Or even easier, call the associate method on the CartItem! +$cartItem->associate('Product'); + +// You can even make it a one-liner +Cart::add('293ad', 'Product 1', 1, 9.99, ['size' => 'large'])->associate('Product'); + +// Now, when iterating over the content of the cart, you can access the model. +foreach(Cart::content() as $row) { + echo 'You have ' . $row->qty . ' items of ' . $row->model->name . ' with description: "' . $row->model->description . '" in your cart.'; +} +``` + +### Buyable + +For the convenience of faster adding items to cart and their automatic association, your model can implement `Buyable` interface. To do so, it must implement such functions: + +```php + public function getBuyableIdentifier(){ + return $this->id; + } + + public function getBuyableDescription(){ + return $this->name; + } + + public function getBuyablePrice(){ + return $this->price; + } +``` + +Example: + +```php +id; + } + + public function getBuyableDescription($options = null) { + return $this->name; + } + + public function getBuyablePrice($options = null) { + return $this->price; + } +} +``` + + +## Database + +- [Config](#configuration) +- [Storing the cart](#storing-the-cart) +- [Restoring the cart](#restoring-the-cart) + +### Configuration +To save cart into the database so you can retrieve it later, the package needs to know which database connection to use and what the name of the table is. +By default the package will use the default database connection and use a table named `shoppingcart`. +If you want to change these options, you'll have to publish the `config` file. + + php artisan vendor:publish --provider="Gloudemans\Shoppingcart\ShoppingcartServiceProvider" --tag="config" + +This will give you a `cart.php` config file in which you can make the changes. + +To make your life easy, the package also includes a ready to use `migration` which you can publish by running: + + php artisan vendor:publish --provider="Gloudemans\Shoppingcart\ShoppingcartServiceProvider" --tag="migrations" + +This will place a `shoppingcart` table's migration file into `database/migrations` directory. Now all you have to do is run `php artisan migrate` to migrate your database. + +### Storing the cart +To store your cart instance into the database, you have to call the `store($identifier) ` method. Where `$identifier` is a random key, for instance the id or username of the user. + + Cart::store('username'); + + // To store a cart instance named 'wishlist' + Cart::instance('wishlist')->store('username'); + +### Restoring the cart +If you want to retrieve the cart from the database and restore it, all you have to do is call the `restore($identifier)` where `$identifier` is the key you specified for the `store` method. + + Cart::restore('username'); + + // To restore a cart instance named 'wishlist' + Cart::instance('wishlist')->restore('username'); + +## Exceptions + +The Cart package will throw exceptions if something goes wrong. This way it's easier to debug your code using the Cart package or to handle the error based on the type of exceptions. The Cart packages can throw the following exceptions: + +| Exception | Reason | +| ---------------------------- | ---------------------------------------------------------------------------------- | +| *CartAlreadyStoredException* | When trying to store a cart that was already stored using the specified identifier | +| *InvalidRowIDException* | When the rowId that got passed doesn't exists in the current cart instance | +| *UnknownModelException* | When you try to associate an none existing model to a CartItem. | + +## Events + +The cart also has events build in. There are five events available for you to listen for. + +| Event | Fired | Parameter | +| ------------- | ---------------------------------------- | -------------------------------- | +| cart.added | When an item was added to the cart. | The `CartItem` that was added. | +| cart.updated | When an item in the cart was updated. | The `CartItem` that was updated. | +| cart.removed | When an item is removed from the cart. | The `CartItem` that was removed. | +| cart.stored | When the content of a cart was stored. | - | +| cart.restored | When the content of a cart was restored. | - | + +## Example + +Below is a little example of how to list the cart content in a table: + +```php + +// Add some items in your Controller. +Cart::add('192ao12', 'Product 1', 1, 9.99); +Cart::add('1239ad0', 'Product 2', 2, 5.95, ['size' => 'large']); + +// Display the content in a View. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProductQtyPriceSubtotal
+

name; ?>

+

options->has('size') ? $row->options->size : ''); ?>

+
$price; ?>$total; ?>
 Subtotal
 Tax
 Total
+``` diff --git a/packages/digital-bird-mivita/shoppingcart/composer.json b/packages/digital-bird-mivita/shoppingcart/composer.json new file mode 100644 index 0000000..8f66a16 --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/composer.json @@ -0,0 +1,49 @@ +{ + "name": "digital-bird/shoppingcart", + "description": "Laravel Shoppingcart", + "keywords": [ + "laravel", + "shoppingcart" + ], + "license": "MIT", + "authors": [ + { + "name": "Rob Gloudemans", + "email": "info@robgloudemans.nl" + } + ], + "require": { + "illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*|5.5.*|5.6.*|5.7.*|5.8.*|6.*|7.*|8.*", + "illuminate/session": "5.1.*|5.2.*|5.3.*|5.4.*|5.5.*|5.6.*|5.7.*|5.8.*|6.*|7.*|8.*", + "illuminate/events": "5.1.*|5.2.*|5.3.*|5.4.*|5.5.*|5.6.*|5.7.*|5.8.*|6.*|7.*|8.*" + }, + "require-dev": { + "phpunit/phpunit": "~5.0|~6.0|~7.0|~8.0|~9,0", + "mockery/mockery": "~0.9.0", + "orchestra/testbench": "~3.1" + }, + "autoload": { + "psr-4": { + "Gloudemans\\Shoppingcart\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Gloudemans\\Tests\\Shoppingcart\\": "tests/" + } + }, + "suggest": { + "gloudemans/notify": "Simple flash notifications for Laravel" + }, + "minimum-stability": "stable", + "extra": { + "laravel": { + "providers": [ + "Gloudemans\\Shoppingcart\\ShoppingcartServiceProvider" + ], + "aliases": { + "Cart": "Gloudemans\\Shoppingcart\\Facades\\Cart" + } + } + } +} diff --git a/packages/digital-bird-mivita/shoppingcart/config/cart.php b/packages/digital-bird-mivita/shoppingcart/config/cart.php new file mode 100644 index 0000000..51b34cf --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/config/cart.php @@ -0,0 +1,105 @@ + 10, + + /* + |-------------------------------------------------------------------------- + | Allow multiple rows with the same ID + |-------------------------------------------------------------------------- + | + | By default, the row ID is generated to a MD5 based on ID + Options array. + | If you want to have more than one unique product in a cart, you either have + | to set a unique value in the Options array (eg Reason = X), or you can simply + | enable this option, and each time you add a new Cart row, it will add to the cart. + | + */ + 'allow_multiple_same_id' => false, + + /* + |-------------------------------------------------------------------------- + | Shoppingcart database settings + |-------------------------------------------------------------------------- + | + | Here you can set the connection that the shoppingcart should use when + | storing and restoring a cart. + | + */ + + 'database' => [ + + 'connection' => null, + + 'table' => 'shoppingcart', + + ], + + /* + |-------------------------------------------------------------------------- + | Destroy the cart on user logout + |-------------------------------------------------------------------------- + | + | When this option is set to 'true' the cart will automatically + | destroy all cart instances when the user logs out. + | + */ + + 'destroy_on_logout' => false, + + /* + |-------------------------------------------------------------------------- + | Default number format + |-------------------------------------------------------------------------- + | + | This defaults will be used for the formated numbers if you don't + | set them in the method call. + | + */ + + 'format' => [ + + // General rule with decimal points is that if it's a unit price then it should be 2 decimals, + // as that's what is displayed to the user. Once it's multiplied by quantity, it should be 4 decimals to + // account for that multiplication of qty, and the total tax, subtotal inc tax, and total should all reflect that, + // and only round to show the user at the absolute final stage. + + 'price_ex_tax_decimals' => 2, // base unit price shown to user ex gst should be 2 by default. + 'price_inc_tax_decimals' => 2, // base unit price shown to user ex gst should be 2 by default. + 'fee_ex_tax_decimals' => 4, // fee ex tax should be 4 decimals. + 'fee_inc_tax_decimals' => 4, // fee inc tax should be 4 decimals. + 'fee_total_tax_decimals' => 4, // fee total tax should be 4 decimals. + 'tax_decimals' => 4, // unit price tax can be 4 decimals. Eg. $2.81 * 1.1 = $3.091 inc tax = $0.281 tax. + 'tax_total_decimals' => 4, // total tax can be 4 decimals. Eg. $0.281 * 12 qty = $3.372 total tax. + 'subtotal_ex_tax_decimals' => 4, // subtotal ex tax after qty should be 4 decimals by default, then round to show user after qty. + 'subtotal_inc_tax_decimals' => 4, // subtotal inc tax after qty should be 4 decimals by default, then round to show user after qty + 'total_decimals' => 4, // total after tax should be 4 decimals by default, then round to show user after qty. + + // @deprecated + 'decimals' => 4, + + 'decimal_point' => '.', + + 'thousand_seperator' => '' + + ], + + /* + |-------------------------------------------------------------------------- + | Allows you to choose if the discounts applied to fees + |-------------------------------------------------------------------------- + | + */ + 'discountOnFees' => false, + +]; diff --git a/packages/digital-bird-mivita/shoppingcart/database/migrations/0000_00_00_000000_create_shoppingcart_table.php b/packages/digital-bird-mivita/shoppingcart/database/migrations/0000_00_00_000000_create_shoppingcart_table.php new file mode 100644 index 0000000..fc5bb26 --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/database/migrations/0000_00_00_000000_create_shoppingcart_table.php @@ -0,0 +1,30 @@ +string('identifier'); + $table->string('instance'); + $table->longText('content'); + $table->nullableTimestamps(); + + $table->primary(['identifier', 'instance']); + }); + } + /** + * Reverse the migrations. + */ + public function down() + { + Schema::drop(config('cart.database.table')); + } +} diff --git a/packages/digital-bird-mivita/shoppingcart/phpunit.xml b/packages/digital-bird-mivita/shoppingcart/phpunit.xml new file mode 100644 index 0000000..655d24e --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/phpunit.xml @@ -0,0 +1,16 @@ + + + + + ./tests/ + + + \ No newline at end of file diff --git a/packages/digital-bird-mivita/shoppingcart/src/CanBeBought.php b/packages/digital-bird-mivita/shoppingcart/src/CanBeBought.php new file mode 100644 index 0000000..e122d1f --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/src/CanBeBought.php @@ -0,0 +1,54 @@ +getKey() : + $this->id; + } + + /** + * Get the description or title of the Buyable item. + * + * @return string + */ + public function getBuyableDescription($options = null) + { + if (property_exists($this, 'name')) { + return $this->name; + } + + if (property_exists($this, 'title')) { + return $this->title; + } + + if (property_exists($this, 'description')) { + return $this->description; + } + + return null; + } + + /** + * Get the price of the Buyable item. + * + * @return float + */ + public function getBuyablePrice($options = null) + { + if (property_exists($this, 'price')) { + return $this->price; + } + + return null; + } +} diff --git a/packages/digital-bird-mivita/shoppingcart/src/Cart.php b/packages/digital-bird-mivita/shoppingcart/src/Cart.php new file mode 100644 index 0000000..23a30c0 --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/src/Cart.php @@ -0,0 +1,843 @@ +items = new Collection; + $this->fees = new Collection; + $this->session = $session; + $this->events = $events; + + $this->instance(self::DEFAULT_INSTANCE); + } + + /** + * Set the current cart instance. + * + * @param string|null $instance + * @return \Gloudemans\Shoppingcart\Cart + */ + public function instance($instance = null) + { + $instance = $instance ?: self::DEFAULT_INSTANCE; + + $this->instance = sprintf('%s.%s', 'cart', $instance); + + return $this; + } + + /** + * Get the current cart instance. + * + * @return string + */ + public function currentInstance() + { + return str_replace('cart.', '', $this->instance); + } + + /** + * Add an item to the cart. + * + * @param $id + * @param $name + * @param $qty + * @param $price + * @param $taxRate + * @param $taxIncluded + * @param array $options + * @param array $eventOptions + * @return array|array[]|CartItem|CartItem[] + */ + public function add($id, $name = null, $qty = null, $price = null, $taxRate = null, $taxIncluded = false, array $options = [], array $eventOptions = []) + { + + if ($this->isMulti($id)) { + return array_map(function ($item) { + return $this->add($item); + }, $id); + } + + if ($id instanceof CartItem) { + $cartItem = $id; + } else { + $cartItem = $this->createCartItem($id, $name, $qty, $price, $taxRate, $taxIncluded, $options); + } + + $content = $this->getContent(); + + if ($content->has($cartItem->rowId)) { + $cartItem->qty += $content->get($cartItem->rowId)->qty; + } + + $content->put($cartItem->rowId, $cartItem); + + $this->items = $content; + + $this->session->put($this->instance, $this->toArray()); + + $eventOptions = array_merge([ + 'cartInstance' => $this->currentInstance(), + 'cartItem' => $cartItem, + ], $eventOptions); + + $this->events->dispatch('cart.added', [ + $eventOptions, + ]); + + return $cartItem; + } + + /** + * Update the cart item with the given rowId. + * + * @param $rowId + * @param $qty + * @param array $eventOptions + * @return CartItem|void + */ + public function update($rowId, $qty, array $eventOptions = []) + { + $cartItem = $this->get($rowId); + + if ($qty instanceof Buyable) { + $cartItem->updateFromBuyable($qty); + } elseif (is_array($qty)) { + $cartItem->updateFromArray($qty); + } else { + $cartItem->qty = $qty; + } + + $content = $this->getContent(); + + if ($rowId !== $cartItem->rowId) { + if ($content->has($cartItem->rowId)) { + $existingCartItem = $this->get($cartItem->rowId); + $cartItem->setQuantity($existingCartItem->qty + $cartItem->qty); + } + + $content = $content->mapWithKeys(function ($val, $key) use ($rowId, $cartItem) { + if ($key === $rowId) { + return [ $cartItem->rowId => $cartItem ]; + } + + return [ $key => $val ]; + }); + + $this->items = $content; + } + + if ($cartItem->qty <= 0) { + $this->remove($cartItem->rowId); + + return; + } + + $this->session->put($this->instance, $this->toArray()); + + $eventOptions = array_merge([ + 'cartInstance' => $this->currentInstance(), + 'cartItem' => $cartItem, + ], $eventOptions); + + $this->events->dispatch('cart.updated', [ + $eventOptions + ]); + + return $cartItem; + } + + /** + * Remove the cart item with the given rowId from the cart. + * + * @param $rowId + * @param array $eventOptions + * @return void + */ + public function remove($rowId, array $eventOptions = []) + { + $cartItem = $this->get($rowId); + + $content = $this->getContent(); + + $content->pull($cartItem->rowId); + + $this->items = $content; + + $this->session->put($this->instance, $this->toArray()); + + $eventOptions = array_merge([ + 'cartInstance' => $this->currentInstance(), + 'cartItem' => $cartItem, + ], $eventOptions); + + $this->events->dispatch('cart.removed', [ + $eventOptions + ]); + } + + /** + * Get a cart item from the cart by its rowId. + * + * @param string $rowId + * @return \Gloudemans\Shoppingcart\CartItem + */ + public function get($rowId) + { + $content = $this->getContent(); + + if ($content->has($rowId) === false) { + throw new InvalidRowIDException("The cart does not contain rowId {$rowId}."); + } + + return $content->get($rowId); + } + + /** + * Destroy the current cart instance. + * + * @return void + */ + public function destroy() + { + $this->session->remove($this->instance); + } + + /** + * Get the content of the cart. + * + * @return \Illuminate\Support\Collection + */ + public function content() + { + return $this->getContent(); + } + + /** + * Get the number of items in the cart. + * + * @return int|float + */ + public function count() + { + $content = $this->getContent(); + + return $content->sum('qty'); + } + + /** + * Get the total price of the items in the cart. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return string + */ + public function total($decimals = null, $decimalPoint = null, $thousandSeperator = null, $withFees = true) + { + $content = $this->getContent(); + + $total = $content->reduce(function ($total, CartItem $cartItem) { + return $total + ($cartItem->total); + }, 0); + + if ($withFees === true) { + $fees = $this->feeTotal(null, null, null, true); + + $total = $total + $fees; + } + + $decimals = is_null($decimals) ? config('cart.format.total_decimals') : $decimals; + + return $this->numberFormat($total, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Get the total tax of the items in the cart. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return float + */ + public function tax($decimals = null, $decimalPoint = null, $thousandSeperator = null, $withFees = true) + { + $content = $this->getContent(); + + $tax = $content->reduce(function ($tax, CartItem $cartItem) { + return $tax + ($cartItem->taxTotal); + }, 0); + + if ($withFees === true) { + $fees = $this->feeTax(); + + $tax = $tax + floatval($fees); + } + + $decimals = is_null($decimals) ? config('cart.format.tax_decimals') : $decimals; + + return $this->numberFormat($tax, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Get the total tax of the items in the cart. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return float + */ + public function feeTax($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + $content = $this->getContent(); + + $tax = 0; + + foreach ($this->getFees() as $fee) { + $tax += $fee->tax; + } + + $decimals = is_null($decimals) ? config('cart.format.fee_total_tax_decimals') : $decimals; + + return $this->numberFormat($tax, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Get the subtotal (ex tax) of the items in the cart. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return float + */ + public function subtotal($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + $content = $this->getContent(); + + $subTotal = $content->reduce(function ($subTotal, CartItem $cartItem) { + return $subTotal + ($cartItem->subtotal); + }, 0); + + $decimals = is_null($decimals) ? config('cart.format.subtotal_ex_tax_decimals') : $decimals; + + return $this->numberFormat($subTotal, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Get the subtotal (total - tax) of the items in the cart. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return float + */ + public function subtotalTax($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + $content = $this->getContent(); + + $subTotal = $content->reduce(function ($subTotal, CartItem $cartItem) { + return $subTotal + ($cartItem->subtotalTax); + }, 0); + + $decimals = is_null($decimals) ? config('cart.format.subtotal_inc_tax_decimals') : $decimals; + + return $this->numberFormat($subTotal, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Search the cart content for a cart item matching the given search closure. + * + * @param Closure $search + * @return \Illuminate\Support\Collection + */ + public function search(Closure $search) + { + $content = $this->getContent(); + + return $content->filter($search); + } + + /** + * Associate the cart item with the given rowId with the given model. + * + * @param string $rowId + * @param mixed $model + * @return void + */ + public function associate($rowId, $model) + { + if ( + is_string($model) === true && + class_exists($model) === false + ) { + throw new UnknownModelException("The supplied model {$model} does not exist."); + } + + $cartItem = $this->get($rowId); + + $cartItem->associate($model); + + $content = $this->getContent(); + + $content->put($cartItem->rowId, $cartItem); + + $this->session->put($this->instance, $this->toArray()); + } + + /** + * Set the tax rate for the cart item with the given rowId. + * + * @param string $rowId + * @param int|float $taxRate + * @return void + */ + public function setTax($rowId, $taxRate) + { + $cartItem = $this->get($rowId); + + $cartItem->setTaxRate($taxRate); + + $content = $this->getContent(); + + $content->put($cartItem->rowId, $cartItem); + + $this->items = $content; + + $this->session->put($this->instance, $this->toArray()); + } + + /** + * Store an the current instance of the cart. + * + * @param $identifier + * @param array $eventOptions + * @return void + */ + public function store($identifier, array $eventOptions = []) + { + // Remove any existing identifiers + // Although possibly first or update could work in future + $this + ->getConnection() + ->table($this->getTableName()) + ->where('identifier', $identifier) + ->delete(); + + // Insert into the database with the new cart + $content = $this->getContent(); + + $this + ->getConnection() + ->table($this->getTableName()) + ->insert([ + 'identifier' => $identifier, + 'instance' => $this->currentInstance(), + 'content' => serialize($content), + 'created_at'=> new DateTime(), + ]); + + $eventOptions = array_merge([ + 'cartInstance' => $this->currentInstance(), + ], $eventOptions); + + $this->events->dispatch('cart.stored', [ + $eventOptions, + ]); + } + + /** + * Restore the cart with the given identifier. + * + * @param $identifier + * @param array $eventOptions + * @return void + */ + public function restore($identifier, array $eventOptions = []) + { + if ($this->storedCartWithIdentifierExists($identifier) === false) { + return; + } + + // Find any existing carts by identifier + $stored = $this + ->getConnection() + ->table($this->getTableName()) + ->where('identifier', $identifier) + ->first(); + + // Unserialize the content (either array if new, or collection if old) + $storedContent = unserialize($stored->content); + + $currentInstance = $this->currentInstance(); + + $this->instance($stored->instance); + + $content = $this->getContent(); + + // If the new approach and is array, set this class up. + // Note that it overrides any existing items in cart + // Does not add to existing. + if (is_array($storedContent)) { + $this->fromArray($storedContent); + } + + // If the old approach and is Collection, push into existing items + if ($storedContent instanceof Collection) { + foreach ($storedContent as $cartItem) { + $content->put($cartItem->rowId, $cartItem); + } + } + + $eventOptions = array_merge([ + 'cartInstance' => $this->currentInstance(), + ], $eventOptions); + + $this->events->dispatch('cart.restored', [ + $eventOptions, + ]); + + $this->session->put($this->instance, $content); + + $this->instance($currentInstance); + + $this->getConnection()->table($this->getTableName()) + ->where('identifier', $identifier)->delete(); + + } + + /** + * Gets a specific fee from the fees array. + * + * @param $name + * + * @return mixed + */ + public function getFee($name) + { + return $this->fees->get($name, new CartFee(null, null)); + } + + /** + * Allows to charge for additional fees that may or may not be taxable + * ex - service fee , delivery fee, tips. + * + * Because it uses ->put, the name must be unique otherwise will be overwritten. + * + * @param $name + * @param $amount + * @param $taxRate + * @param array $options + */ + public function addFee($name, $amount, $taxRate = null, array $options = []) + { + $this->fees->put($name, new CartFee($amount, $taxRate, $options)); + + $this->session->put($this->instance, $this->toArray()); + } + + /** + * Removes a fee from the fee array. + * + * @todo test to see if i need to restore this + * + * @param $name + */ + public function removeFee($name) + { + $this->fees->forget($name); + + $this->session->put($this->instance, $this->toArray()); + } + + /** + * Removes all the fees set in the cart. + */ + public function removeFees() + { + $this->fees = new Collection; + + $this->session->put($this->instance, $this->toArray()); + } + + /** + * Gets all the fee totals. + * + * @param bool $format + * @param bool $withTax + * + * @return string + */ + public function feeTotal($decimals = null, $decimalPoint = null, $thousandSeperator = null, $withTax = true) + { + $feeTotal = 0; + + foreach ($this->getFees() as $fee) { + $feeTotal += $fee->amount; + + if ($withTax === true && $fee->taxRate > 0) { + $feeTotal += $fee->tax; + } + } + + return $this->numberFormat($feeTotal, null, null, null); + } + + /** + * Gets all the fees on the cart object. + * + * @return mixed + */ + public function getFees() + { + return $this->fees; + } + + /** + * Magic method to make accessing the total, tax and subtotal properties possible. + * + * @param string $attribute + * @return float|null + */ + public function __get($attribute) + { + if ($attribute === 'total') { + return $this->total(); + } + + if ($attribute === 'feeTotal') { + return $this->feeTotal(null, null, null, false); + } + + if ($attribute === 'feeTotalTax') { + return $this->feeTotal(null, null, null, true); + } + + if ($attribute === 'tax') { + return $this->tax(); + } + + if ($attribute === 'feeTax') { + return $this->feeTax(); + } + + if ($attribute === 'subtotal') { + return $this->subtotal(); + } + + if ($attribute === 'subtotalTax') { + return $this->subtotalTax(); + } + + return null; + } + + /** + * @return array + */ + public function toArray() + { + return [ + 'items' => $this->items, + 'fees' => $this->fees, + ]; + } + + /** + * @param $array + * @return $this + */ + public function fromArray($array) + { + $this->items = $array['items']; + $this->fees = $array['fees']; + + return $this; + } + + /** + * Deletes the stored cart with given identifier + * + * @param mixed $identifier + */ + protected function deleteStoredCart($identifier) + { + $this + ->getConnection() + ->table($this->getTableName()) + ->where('identifier', $identifier) + ->delete(); + } + + /** + * Get the carts content, if there is no cart content set yet, return a new empty Collection + * + * @return \Illuminate\Support\Collection + */ + protected function getContent(): Collection + { + $instanceExists = $this->session->has($this->instance); + + if ($instanceExists === false) { + $this->items = new Collection; + + return $this->items; + } + + $instance = $this->session->get($this->instance); + + // If new approach, set $this variables + if (is_array($instance) === true) { + $this->items = $instance['items']; + $this->fees = $instance['fees']; + } + + if ($instance instanceof Collection) { + $this->items = $instance; + } + + return $this->items; + } + + /** + * Create a new CartItem from the supplied attributes. + * + * @param mixed $id + * @param mixed $name + * @param int|float $qty + * @param float $price + * @param array $options + * @return \Gloudemans\Shoppingcart\CartItem + */ + private function createCartItem($id, $name, $qty, $price, $taxRate, bool $taxIncluded, array $options): CartItem + { + if ($id instanceof Buyable) { + $cartItem = CartItem::fromBuyable($id, $qty ?: []); + $cartItem->setQuantity($name ?: 1); + $cartItem->associate($id); + } elseif (is_array($id)) { + $cartItem = CartItem::fromArray($id); + $cartItem->setQuantity($id['qty']); + } else { + $cartItem = CartItem::fromAttributes($id, $name, $price, $options); + $cartItem->setQuantity($qty); + } + + $taxRate = is_int($taxRate) ? $taxRate : config('cart.tax'); + + $cartItem->setTaxRate($taxRate); + $cartItem->setTaxIncluded($taxIncluded); + + return $cartItem; + } + + /** + * Check if the item is a multidimensional array or an array of Buyables. + * + * @param mixed $item + * @return bool + */ + private function isMulti($item): bool + { + if (is_array($item) === false) { + return false; + } + + return is_array(head($item)) || head($item) instanceof Buyable === true; + } + + /** + * @param $identifier + * @return bool + */ + protected function storedCartWithIdentifierExists($identifier): bool + { + return $this + ->getConnection() + ->table($this->getTableName()) + ->where('identifier', $identifier) + ->exists(); + } + + /** + * Get the database connection. + * + * @return \Illuminate\Database\Connection + */ + protected function getConnection() + { + $connectionName = $this->getConnectionName(); + + return app(DatabaseManager::class)->connection($connectionName); + } + + /** + * Get the database table name. + * + * @return string + */ + protected function getTableName() + { + return config('cart.database.table', 'shoppingcart'); + } + + /** + * Get the database connection name. + * + * @return string + */ + private function getConnectionName() + { + $connection = config('cart.database.connection'); + + return is_null($connection) ? config('database.default') : $connection; + } +} diff --git a/packages/digital-bird-mivita/shoppingcart/src/CartFee.php b/packages/digital-bird-mivita/shoppingcart/src/CartFee.php new file mode 100644 index 0000000..8694fc4 --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/src/CartFee.php @@ -0,0 +1,118 @@ +amount = floatval($amount); + $this->taxRate = is_null($taxRate) ? config('cart.tax') : $taxRate; + $this->options = new CartFeeOptions($options); + } + + /** + * Returns the formatted fee amount without TAX. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return string + */ + public function amountWithouTax($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + $decimals = is_null($decimals) ? config('cart.format.fee_ex_tax_decimals') : $decimals; + + return $this->numberFormat($this->price, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Returns the formatted fee amount with TAX. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return string + */ + public function amountTax($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + $priceTax = $this->amount + $this->tax; + $decimals = is_null($decimals) ? config('cart.format.fee_inc_tax_decimals') : $decimals; + + return $this->numberFormat($priceTax, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Gets the formatted amount. + * + * @param bool $format + * @param bool $withTax + * + * @return string + */ + public function getAmount($format = true, $withTax = false) + { + $total = $this->amount; + + if ($withTax) { + $total += $this->taxRate * $total; + } + + return $this->numberFormat($total); + } + + /** + * @return string + */ + public function tax() + { + $tax = $this->amount * $this->taxRate / 100; + + return $this->numberFormat($tax); + } + + /** + * Magic method to make accessing the total, tax and subtotal properties possible. + * + * @param string $attribute + * @return float|null + */ + public function __get($attribute) + { + if (property_exists($this, $attribute)) { + return $this->{$attribute}; + } + + if ($attribute === 'amountWithouTax') { + return $this->amountWithouTax(); + } + + if ($attribute === 'amountTax') { + return $this->amountTax(); + } + + if ($attribute === 'tax') { + return $this->tax(); + } + + return null; + } +} diff --git a/packages/digital-bird-mivita/shoppingcart/src/CartFeeOptions.php b/packages/digital-bird-mivita/shoppingcart/src/CartFeeOptions.php new file mode 100644 index 0000000..dd91b92 --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/src/CartFeeOptions.php @@ -0,0 +1,19 @@ +get($key); + } +} diff --git a/packages/digital-bird-mivita/shoppingcart/src/CartItem.php b/packages/digital-bird-mivita/shoppingcart/src/CartItem.php new file mode 100644 index 0000000..132411e --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/src/CartItem.php @@ -0,0 +1,470 @@ +id = $id; + $this->name = $name; + $this->price = floatval($price); + $this->options = new CartItemOptions($options); + $this->rowId = $this->generateRowId($id, $options); + } + + /** + * Returns the formatted price without TAX. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return string + */ + public function price($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + $decimals = is_null($decimals) ? config('cart.format.price_ex_tax_decimals') : $decimals; + + return $this->numberFormat($this->price, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Returns the formatted price with TAX. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return string + */ + public function priceTax($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + if ($this->taxIncluded === true) { + $priceTax = $this->price; + } else { + $priceTax = $this->price + $this->tax; + } + + $decimals = is_null($decimals) ? config('cart.format.price_inc_tax_decimals') : $decimals; + + return $this->numberFormat($priceTax, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Returns the formatted subtotal. + * Subtotal is price for whole CartItem without TAX + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return string + */ + public function subtotal($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + $subtotal = $this->qty * $this->price; + $decimals = is_null($decimals) ? config('cart.format.subtotal_ex_tax_decimals') : $decimals; + + return $this->numberFormat($subtotal, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Returns the formatted subtotal. + * Subtotal is price for whole CartItem with TAX + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return string + */ + public function subtotalTax($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + if ($this->taxIncluded === true) { + $subtotal = $this->subtotal; + } else { + $subtotal = $this->subtotal + $this->taxTotal; + } + + $decimals = is_null($decimals) ? config('cart.format.subtotal_inc_tax_decimals') : $decimals; + + return $this->numberFormat($subtotal, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Returns the formatted total. + * Total is price for whole CartItem with tax + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return string + */ + public function total($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + $total = $this->subtotalTax; + $decimals = is_null($decimals) ? config('cart.format.total_decimals') : $decimals; + + return $this->numberFormat($total, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Returns the formatted tax. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return string + */ + public function tax($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + if ($this->taxIncluded === true) { + $tax = $this->price / (1 + $this->taxRate); + } else { + $tax = $this->price * ($this->taxRate / 100); + } + + $decimals = is_null($decimals) ? config('cart.format.tax_decimals') : $decimals; + + return $this->numberFormat($tax, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Returns the formatted tax. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return string + */ + public function taxTotal($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + $taxTotal = $this->tax * $this->qty; + $decimals = is_null($decimals) ? config('cart.format.tax_total_decimals') : $decimals; + + return $this->numberFormat($taxTotal, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Set the quantity for this cart item. + * + * @param int|float $qty + */ + public function setQuantity($qty) + { + if(empty($qty) || ! is_numeric($qty)) + throw new \InvalidArgumentException('Please supply a valid quantity.'); + + $this->qty = $qty; + } + + /** + * Update the cart item from a Buyable. + * + * @param \Gloudemans\Shoppingcart\Contracts\Buyable $item + * @return void + */ + public function updateFromBuyable(Buyable $item) + { + $this->id = $item->getBuyableIdentifier($this->options); + $this->name = $item->getBuyableDescription($this->options); + $this->price = $item->getBuyablePrice($this->options); + $this->priceTax = $this->price + $this->tax; + } + + /** + * Update the cart item from an array. + * + * @param array $attributes + * @return void + */ + public function updateFromArray(array $attributes) + { + $this->id = array_get($attributes, 'id', $this->id); + $this->qty = array_get($attributes, 'qty', $this->qty); + $this->name = array_get($attributes, 'name', $this->name); + $this->price = array_get($attributes, 'price', $this->price); + $this->priceTax = $this->price + $this->tax; + $this->options = new CartItemOptions(array_get($attributes, 'options', $this->options)); + + $this->rowId = $this->generateRowId($this->id, $this->options->all()); + } + + /** + * Associate the cart item with the given model. + * + * @param mixed $model + * @return \Gloudemans\Shoppingcart\CartItem + */ + public function associate($model) + { + $this->associatedModel = is_string($model) ? $model : get_class($model); + + return $this; + } + + /** + * Set the tax rate. + * + * @param int|float $taxRate + * @return \Gloudemans\Shoppingcart\CartItem + */ + public function setTaxRate($taxRate) + { + $this->taxRate = $taxRate; + + return $this; + } + + /** + * Set the tax rate. + * + * @param bool $taxIncluded + * @return \Gloudemans\Shoppingcart\CartItem + */ + public function setTaxIncluded(bool $taxIncluded) + { + $this->taxIncluded = $taxIncluded; + + return $this; + } + + /** + * Set saved state. + * + * @param bool $bool + * @return \Gloudemans\Shoppingcart\CartItem + */ + public function setSaved($bool) + { + $this->isSaved = $bool; + + return $this; + } + + /** + * Get an attribute from the cart item or get the associated model. + * + * @param string $attribute + * @return mixed + */ + public function __get($attribute) + { + if (property_exists($this, $attribute)) { + return $this->{$attribute}; + } + + if ($attribute === 'priceTax') { + return $this->priceTax(); + } + + if ($attribute === 'subtotal') { + return $this->subtotal(); + } + + if ($attribute === 'subtotalTax') { + return $this->subtotalTax(); + } + + if ($attribute === 'total') { + return $this->total(); + } + + if ($attribute === 'tax') { + return $this->tax(); + } + + if ($attribute === 'taxTotal') { + return $this->taxTotal(); + } + + if ($attribute === 'model' && isset($this->associatedModel)) { + return with(new $this->associatedModel)->find($this->id); + } + + return null; + } + + /** + * Create a new instance from a Buyable. + * + * @param \Gloudemans\Shoppingcart\Contracts\Buyable $item + * @param array $options + * @return \Gloudemans\Shoppingcart\CartItem + */ + public static function fromBuyable(Buyable $item, array $options = []) + { + return new self($item->getBuyableIdentifier($options), $item->getBuyableDescription($options), $item->getBuyablePrice($options), $options); + } + + /** + * Create a new instance from the given array. + * + * @param array $attributes + * @return \Gloudemans\Shoppingcart\CartItem + */ + public static function fromArray(array $attributes) + { + $options = array_get($attributes, 'options', []); + + return new self($attributes['id'], $attributes['name'], $attributes['price'], $options); + } + + /** + * Create a new instance from the given attributes. + * + * @param int|string $id + * @param string $name + * @param float $price + * @param array $options + * @return \Gloudemans\Shoppingcart\CartItem + */ + public static function fromAttributes($id, $name, $price, array $options = []) + { + return new self($id, $name, $price, $options); + } + + /** + * Generate a unique id for the cart item. + * + * @param string $id + * @param array $options + * @return string + */ + protected function generateRowId($id, array $options) + { + ksort($options); + + $uniqueString = ''; + + if (config('cart.allow_multiple_same_id') === true) { + $uniqueString = microtime(true); + } + + return md5($id . $uniqueString . serialize($options)); + } + + /** + * Get the instance as an array. + * + * @return array + */ + public function toArray() + { + return [ + 'rowId' => $this->rowId, + 'id' => $this->id, + 'name' => $this->name, + 'qty' => $this->qty, + 'price' => $this->price, + 'options' => $this->options->toArray(), + 'tax' => $this->tax, + 'isSaved' => $this->isSaved, + 'subtotal' => $this->subtotal + ]; + } + + /** + * Convert the object to its JSON representation. + * + * @param int $options + * @return string + */ + public function toJson($options = 0) + { + return json_encode($this->toArray(), $options); + } +} diff --git a/packages/digital-bird-mivita/shoppingcart/src/CartItemOptions.php b/packages/digital-bird-mivita/shoppingcart/src/CartItemOptions.php new file mode 100644 index 0000000..1b80205 --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/src/CartItemOptions.php @@ -0,0 +1,19 @@ +get($key); + } +} diff --git a/packages/digital-bird-mivita/shoppingcart/src/Contracts/Buyable.php b/packages/digital-bird-mivita/shoppingcart/src/Contracts/Buyable.php new file mode 100644 index 0000000..f5bfeb7 --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/src/Contracts/Buyable.php @@ -0,0 +1,27 @@ +app->bind('cart', 'Gloudemans\Shoppingcart\Cart'); + + $config = __DIR__ . '/../config/cart.php'; + $this->mergeConfigFrom($config, 'cart'); + + $this->publishes([__DIR__ . '/../config/cart.php' => config_path('cart.php')], 'config'); + + $this->app['events']->listen(Logout::class, function () { + if ($this->app['config']->get('cart.destroy_on_logout')) { + $this->app->make(SessionManager::class)->forget('cart'); + } + }); + + if ( ! class_exists('CreateShoppingcartTable')) { + // Publish the migration + $timestamp = date('Y_m_d_His', time()); + + $this->publishes([ + __DIR__.'/../database/migrations/0000_00_00_000000_create_shoppingcart_table.php' => database_path('migrations/'.$timestamp.'_create_shoppingcart_table.php'), + ], 'migrations'); + } + } +} diff --git a/packages/digital-bird-mivita/shoppingcart/src/Traits/CartHelper.php b/packages/digital-bird-mivita/shoppingcart/src/Traits/CartHelper.php new file mode 100644 index 0000000..cb7968c --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/src/Traits/CartHelper.php @@ -0,0 +1,35 @@ +count(); + + PHPUnit::assertEquals($items, $cart->count(), "Expected the cart to contain {$items} items, but got {$actual}."); + } + + /** + * Assert that the cart contains the given number of rows. + * + * @param int $rows + * @param \Gloudemans\Shoppingcart\Cart $cart + */ + public function assertRowsInCart($rows, Cart $cart) + { + $actual = $cart->content()->count(); + + PHPUnit::assertCount($rows, $cart->content(), "Expected the cart to contain {$rows} rows, but got {$actual}."); + } +} diff --git a/packages/digital-bird-mivita/shoppingcart/tests/CartItemTest.php b/packages/digital-bird-mivita/shoppingcart/tests/CartItemTest.php new file mode 100644 index 0000000..2a01714 --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/tests/CartItemTest.php @@ -0,0 +1,56 @@ + 'XL', 'color' => 'red']); + $cartItem->setQuantity(2); + + $this->assertEquals([ + 'id' => 1, + 'name' => 'Some item', + 'price' => 10.00, + 'rowId' => '07d5da5550494c62daf9993cf954303f', + 'qty' => 2, + 'options' => [ + 'size' => 'XL', + 'color' => 'red' + ], + 'tax' => 0.0, + 'subtotal' => 20.00, + 'isSaved' => false + ], $cartItem->toArray()); + } + + /** @test */ + public function it_can_be_cast_to_json() + { + $cartItem = new CartItem(1, 'Some item', 10.00, ['size' => 'XL', 'color' => 'red']); + $cartItem->setQuantity(2); + + $this->assertJson($cartItem->toJson()); + + $json = '{"rowId":"07d5da5550494c62daf9993cf954303f","id":1,"name":"Some item","qty":2,"price":10,"options":{"size":"XL","color":"red"},"tax":"0.00","isSaved":false,"subtotal":"20.00"}'; + + $this->assertEquals($json, $cartItem->toJson()); + } +} diff --git a/packages/digital-bird-mivita/shoppingcart/tests/CartTest.php b/packages/digital-bird-mivita/shoppingcart/tests/CartTest.php new file mode 100644 index 0000000..4df29f0 --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/tests/CartTest.php @@ -0,0 +1,945 @@ +set('cart.database.connection', 'testing'); + + $app['config']->set('session.driver', 'array'); + + $app['config']->set('database.default', 'testing'); + $app['config']->set('database.connections.testing', [ + 'driver' => 'sqlite', + 'database' => ':memory:', + 'prefix' => '', + ]); + } + + /** + * Setup the test environment. + * + * @return void + */ + protected function setUp() + { + parent::setUp(); + + $this->app->afterResolving('migrator', function ($migrator) { + $migrator->path(realpath(__DIR__.'/../database/migrations')); + }); + } + + /** @test */ + public function it_has_a_default_instance() + { + $cart = $this->getCart(); + + $this->assertEquals(Cart::DEFAULT_INSTANCE, $cart->currentInstance()); + } + + /** @test */ + public function it_can_have_multiple_instances() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'First item')); + + $cart->instance('wishlist')->add(new BuyableProduct(2, 'Second item')); + + $this->assertItemsInCart(1, $cart->instance(Cart::DEFAULT_INSTANCE)); + $this->assertItemsInCart(1, $cart->instance('wishlist')); + } + + /** @test */ + public function it_can_add_an_item() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $this->assertEquals(1, $cart->count()); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_will_return_the_cartitem_of_the_added_item() + { + Event::fake(); + + $cart = $this->getCart(); + + $cartItem = $cart->add(new BuyableProduct); + + $this->assertInstanceOf(CartItem::class, $cartItem); + $this->assertEquals('027c91341fd5cf4d2579b49c4b6a90da', $cartItem->rowId); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_can_add_multiple_buyable_items_at_once() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add([new BuyableProduct(1), new BuyableProduct(2)]); + + $this->assertEquals(2, $cart->count()); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_will_return_an_array_of_cartitems_when_you_add_multiple_items_at_once() + { + Event::fake(); + + $cart = $this->getCart(); + + $cartItems = $cart->add([new BuyableProduct(1), new BuyableProduct(2)]); + + $this->assertTrue(is_array($cartItems)); + $this->assertCount(2, $cartItems); + $this->assertContainsOnlyInstancesOf(CartItem::class, $cartItems); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_can_add_an_item_from_attributes() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(1, 'Test item', 1, 10.00); + + $this->assertEquals(1, $cart->count()); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_can_add_an_item_from_an_array() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(['id' => 1, 'name' => 'Test item', 'qty' => 1, 'price' => 10.00]); + + $this->assertEquals(1, $cart->count()); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_can_add_multiple_array_items_at_once() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add([ + ['id' => 1, 'name' => 'Test item 1', 'qty' => 1, 'price' => 10.00], + ['id' => 2, 'name' => 'Test item 2', 'qty' => 1, 'price' => 10.00] + ]); + + $this->assertEquals(2, $cart->count()); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_can_add_an_item_with_options() + { + Event::fake(); + + $cart = $this->getCart(); + + $options = ['size' => 'XL', 'color' => 'red']; + + $cart->add(new BuyableProduct, 1, $options); + + $cartItem = $cart->get('07d5da5550494c62daf9993cf954303f'); + + $this->assertInstanceOf(CartItem::class, $cartItem); + $this->assertEquals('XL', $cartItem->options->size); + $this->assertEquals('red', $cartItem->options->color); + + Event::assertDispatched('cart.added'); + } + + /** + * @test + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Please supply a valid identifier. + */ + public function it_will_validate_the_identifier() + { + $cart = $this->getCart(); + + $cart->add(null, 'Some title', 1, 10.00); + } + + /** + * @test + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Please supply a valid name. + */ + public function it_will_validate_the_name() + { + $cart = $this->getCart(); + + $cart->add(1, null, 1, 10.00); + } + + /** + * @test + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Please supply a valid quantity. + */ + public function it_will_validate_the_quantity() + { + $cart = $this->getCart(); + + $cart->add(1, 'Some title', 'invalid', 10.00); + } + + /** + * @test + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Please supply a valid price. + */ + public function it_will_validate_the_price() + { + $cart = $this->getCart(); + + $cart->add(1, 'Some title', 1, 'invalid'); + } + + /** @test */ + public function it_will_update_the_cart_if_the_item_already_exists_in_the_cart() + { + $cart = $this->getCart(); + + $item = new BuyableProduct; + + $cart->add($item); + $cart->add($item); + + $this->assertItemsInCart(2, $cart); + $this->assertRowsInCart(1, $cart); + } + + /** @test */ + public function it_will_keep_updating_the_quantity_when_an_item_is_added_multiple_times() + { + $cart = $this->getCart(); + + $item = new BuyableProduct; + + $cart->add($item); + $cart->add($item); + $cart->add($item); + + $this->assertItemsInCart(3, $cart); + $this->assertRowsInCart(1, $cart); + } + + /** @test */ + public function it_can_update_the_quantity_of_an_existing_item_in_the_cart() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->update('027c91341fd5cf4d2579b49c4b6a90da', 2); + + $this->assertItemsInCart(2, $cart); + $this->assertRowsInCart(1, $cart); + + Event::assertDispatched('cart.updated'); + } + + /** @test */ + public function it_can_update_an_existing_item_in_the_cart_from_a_buyable() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->update('027c91341fd5cf4d2579b49c4b6a90da', new BuyableProduct(1, 'Different description')); + + $this->assertItemsInCart(1, $cart); + $this->assertEquals('Different description', $cart->get('027c91341fd5cf4d2579b49c4b6a90da')->name); + + Event::assertDispatched('cart.updated'); + } + + /** @test */ + public function it_can_update_an_existing_item_in_the_cart_from_an_array() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->update('027c91341fd5cf4d2579b49c4b6a90da', ['name' => 'Different description']); + + $this->assertItemsInCart(1, $cart); + $this->assertEquals('Different description', $cart->get('027c91341fd5cf4d2579b49c4b6a90da')->name); + + Event::assertDispatched('cart.updated'); + } + + /** + * @test + * @expectedException \Gloudemans\Shoppingcart\Exceptions\InvalidRowIDException + */ + public function it_will_throw_an_exception_if_a_rowid_was_not_found() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->update('none-existing-rowid', new BuyableProduct(1, 'Different description')); + } + + /** @test */ + public function it_will_regenerate_the_rowid_if_the_options_changed() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct, 1, ['color' => 'red']); + + $cart->update('ea65e0bdcd1967c4b3149e9e780177c0', ['options' => ['color' => 'blue']]); + + $this->assertItemsInCart(1, $cart); + $this->assertEquals('7e70a1e9aaadd18c72921a07aae5d011', $cart->content()->first()->rowId); + $this->assertEquals('blue', $cart->get('7e70a1e9aaadd18c72921a07aae5d011')->options->color); + } + + /** @test */ + public function it_will_add_the_item_to_an_existing_row_if_the_options_changed_to_an_existing_rowid() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct, 1, ['color' => 'red']); + $cart->add(new BuyableProduct, 1, ['color' => 'blue']); + + $cart->update('7e70a1e9aaadd18c72921a07aae5d011', ['options' => ['color' => 'red']]); + + $this->assertItemsInCart(2, $cart); + $this->assertRowsInCart(1, $cart); + } + + /** @test */ + public function it_can_remove_an_item_from_the_cart() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->remove('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertItemsInCart(0, $cart); + $this->assertRowsInCart(0, $cart); + + Event::assertDispatched('cart.removed'); + } + + /** @test */ + public function it_will_remove_the_item_if_its_quantity_was_set_to_zero() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->update('027c91341fd5cf4d2579b49c4b6a90da', 0); + + $this->assertItemsInCart(0, $cart); + $this->assertRowsInCart(0, $cart); + + Event::assertDispatched('cart.removed'); + } + + /** @test */ + public function it_will_remove_the_item_if_its_quantity_was_set_negative() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->update('027c91341fd5cf4d2579b49c4b6a90da', -1); + + $this->assertItemsInCart(0, $cart); + $this->assertRowsInCart(0, $cart); + + Event::assertDispatched('cart.removed'); + } + + /** @test */ + public function it_can_get_an_item_from_the_cart_by_its_rowid() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertInstanceOf(CartItem::class, $cartItem); + } + + /** @test */ + public function it_can_get_the_content_of_the_cart() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1)); + $cart->add(new BuyableProduct(2)); + + $content = $cart->content(); + + $this->assertInstanceOf(Collection::class, $content); + $this->assertCount(2, $content); + } + + /** @test */ + public function it_will_return_an_empty_collection_if_the_cart_is_empty() + { + $cart = $this->getCart(); + + $content = $cart->content(); + + $this->assertInstanceOf(Collection::class, $content); + $this->assertCount(0, $content); + } + + /** @test */ + public function it_will_include_the_tax_and_subtotal_when_converted_to_an_array() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1)); + $cart->add(new BuyableProduct(2)); + + $content = $cart->content(); + + $this->assertInstanceOf(Collection::class, $content); + $this->assertEquals([ + '027c91341fd5cf4d2579b49c4b6a90da' => [ + 'rowId' => '027c91341fd5cf4d2579b49c4b6a90da', + 'id' => 1, + 'name' => 'Item name', + 'qty' => 1, + 'price' => 10.00, + 'tax' => 2.10, + 'subtotal' => 10.0, + 'isSaved' => false, + 'options' => [], + ], + '370d08585360f5c568b18d1f2e4ca1df' => [ + 'rowId' => '370d08585360f5c568b18d1f2e4ca1df', + 'id' => 2, + 'name' => 'Item name', + 'qty' => 1, + 'price' => 10.00, + 'tax' => 2.10, + 'subtotal' => 10.0, + 'isSaved' => false, + 'options' => [], + ] + ], $content->toArray()); + } + + /** @test */ + public function it_can_destroy_a_cart() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $this->assertItemsInCart(1, $cart); + + $cart->destroy(); + + $this->assertItemsInCart(0, $cart); + } + + /** @test */ + public function it_can_get_the_total_price_of_the_cart_content() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'First item', 10.00)); + $cart->add(new BuyableProduct(2, 'Second item', 25.00), 2); + + $this->assertItemsInCart(3, $cart); + $this->assertEquals(60.00, $cart->subtotal()); + } + + /** @test */ + public function it_can_return_a_formatted_total() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'First item', 1000.00)); + $cart->add(new BuyableProduct(2, 'Second item', 2500.00), 2); + + $this->assertItemsInCart(3, $cart); + $this->assertEquals('6.000,00', $cart->subtotal(2, ',', '.')); + } + + /** @test */ + public function it_can_search_the_cart_for_a_specific_item() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some item')); + $cart->add(new BuyableProduct(2, 'Another item')); + + $cartItem = $cart->search(function ($cartItem, $rowId) { + return $cartItem->name == 'Some item'; + }); + + $this->assertInstanceOf(Collection::class, $cartItem); + $this->assertCount(1, $cartItem); + $this->assertInstanceOf(CartItem::class, $cartItem->first()); + $this->assertEquals(1, $cartItem->first()->id); + } + + /** @test */ + public function it_can_search_the_cart_for_multiple_items() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some item')); + $cart->add(new BuyableProduct(2, 'Some item')); + $cart->add(new BuyableProduct(3, 'Another item')); + + $cartItem = $cart->search(function ($cartItem, $rowId) { + return $cartItem->name == 'Some item'; + }); + + $this->assertInstanceOf(Collection::class, $cartItem); + } + + /** @test */ + public function it_can_search_the_cart_for_a_specific_item_with_options() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some item'), 1, ['color' => 'red']); + $cart->add(new BuyableProduct(2, 'Another item'), 1, ['color' => 'blue']); + + $cartItem = $cart->search(function ($cartItem, $rowId) { + return $cartItem->options->color == 'red'; + }); + + $this->assertInstanceOf(Collection::class, $cartItem); + $this->assertCount(1, $cartItem); + $this->assertInstanceOf(CartItem::class, $cartItem->first()); + $this->assertEquals(1, $cartItem->first()->id); + } + + /** @test */ + public function it_will_associate_the_cart_item_with_a_model_when_you_add_a_buyable() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertContains(BuyableProduct::class, Assert::readAttribute($cartItem, 'associatedModel')); + } + + /** @test */ + public function it_can_associate_the_cart_item_with_a_model() + { + $cart = $this->getCart(); + + $cart->add(1, 'Test item', 1, 10.00); + + $cart->associate('027c91341fd5cf4d2579b49c4b6a90da', new ProductModel); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals(ProductModel::class, Assert::readAttribute($cartItem, 'associatedModel')); + } + + /** + * @test + * @expectedException \Gloudemans\Shoppingcart\Exceptions\UnknownModelException + * @expectedExceptionMessage The supplied model SomeModel does not exist. + */ + public function it_will_throw_an_exception_when_a_non_existing_model_is_being_associated() + { + $cart = $this->getCart(); + + $cart->add(1, 'Test item', 1, 10.00); + + $cart->associate('027c91341fd5cf4d2579b49c4b6a90da', 'SomeModel'); + } + + /** @test */ + public function it_can_get_the_associated_model_of_a_cart_item() + { + $cart = $this->getCart(); + + $cart->add(1, 'Test item', 1, 10.00); + + $cart->associate('027c91341fd5cf4d2579b49c4b6a90da', new ProductModel); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertInstanceOf(ProductModel::class, $cartItem->model); + $this->assertEquals('Some value', $cartItem->model->someValue); + } + + /** @test */ + public function it_can_calculate_the_subtotal_of_a_cart_item() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 9.99), 3); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals(29.97, $cartItem->subtotal); + } + + /** @test */ + public function it_can_return_a_formatted_subtotal() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 500), 3); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals('1.500,00', $cartItem->subtotal(2, ',', '.')); + } + + /** @test */ + public function it_can_calculate_tax_based_on_the_default_tax_rate_in_the_config() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 10.00), 1); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals(2.10, $cartItem->tax); + } + + /** @test */ + public function it_can_calculate_tax_based_on_the_specified_tax() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 10.00), 1); + + $cart->setTax('027c91341fd5cf4d2579b49c4b6a90da', 19); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals(1.90, $cartItem->tax); + } + + /** @test */ + public function it_can_return_the_calculated_tax_formatted() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 10000.00), 1); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals('2.100,00', $cartItem->tax(2, ',', '.')); + } + + /** @test */ + public function it_can_calculate_the_total_tax_for_all_cart_items() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 10.00), 1); + $cart->add(new BuyableProduct(2, 'Some title', 20.00), 2); + + $this->assertEquals(10.50, $cart->tax); + } + + /** @test */ + public function it_can_return_formatted_total_tax() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 1000.00), 1); + $cart->add(new BuyableProduct(2, 'Some title', 2000.00), 2); + + $this->assertEquals('1.050,00', $cart->tax(2, ',', '.')); + } + + /** @test */ + public function it_can_return_the_subtotal() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 10.00), 1); + $cart->add(new BuyableProduct(2, 'Some title', 20.00), 2); + + $this->assertEquals(50.00, $cart->subtotal); + } + + /** @test */ + public function it_can_return_formatted_subtotal() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 1000.00), 1); + $cart->add(new BuyableProduct(2, 'Some title', 2000.00), 2); + + $this->assertEquals('5000,00', $cart->subtotal(2, ',', '')); + } + + /** @test */ + public function it_can_return_cart_formated_numbers_by_config_values() + { + $this->setConfigFormat(2, ',', ''); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 1000.00), 1); + $cart->add(new BuyableProduct(2, 'Some title', 2000.00), 2); + + $this->assertEquals('5000,00', $cart->subtotal()); + $this->assertEquals('1050,00', $cart->tax()); + $this->assertEquals('6050,00', $cart->total()); + + $this->assertEquals('5000,00', $cart->subtotal); + $this->assertEquals('1050,00', $cart->tax); + $this->assertEquals('6050,00', $cart->total); + } + + /** @test */ + public function it_can_return_cartItem_formated_numbers_by_config_values() + { + $this->setConfigFormat(2, ',', ''); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 2000.00), 2); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals('2000,00', $cartItem->price()); + $this->assertEquals('2420,00', $cartItem->priceTax()); + $this->assertEquals('4000,00', $cartItem->subtotal()); + $this->assertEquals('4840,00', $cartItem->total()); + $this->assertEquals('420,00', $cartItem->tax()); + $this->assertEquals('840,00', $cartItem->taxTotal()); + } + + /** @test */ + public function it_can_store_the_cart_in_a_database() + { + $this->artisan('migrate', [ + '--database' => 'testing', + ]); + + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->store($identifier = 123); + + $serialized = serialize($cart->content()); + + $this->assertDatabaseHas('shoppingcart', ['identifier' => $identifier, 'instance' => 'default', 'content' => $serialized]); + + Event::assertDispatched('cart.stored'); + } + + /** @test */ + public function it_can_update_the_cart_in_database() + { + $this->artisan('migrate', [ + '--database' => 'testing', + ]); + + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->store($identifier = 123); + + $serialized = serialize($cart->content()); + + $this->assertDatabaseHas('shoppingcart', ['identifier' => $identifier, 'instance' => 'default', 'content' => $serialized]); + + Event::assertDispatched('cart.stored'); + } + + /** @test */ + public function it_can_restore_a_cart_from_the_database() + { + $this->artisan('migrate', [ + '--database' => 'testing', + ]); + + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->store($identifier = 123); + + $cart->destroy(); + + $this->assertItemsInCart(0, $cart); + + $cart->restore($identifier); + + $this->assertItemsInCart(1, $cart); + + Event::assertDispatched('cart.restored'); + } + + /** @test */ + public function it_will_just_keep_the_current_instance_if_no_cart_with_the_given_identifier_was_stored() + { + $this->artisan('migrate', [ + '--database' => 'testing', + ]); + + $cart = $this->getCart(); + + $cart->restore($identifier = 123); + + $this->assertItemsInCart(0, $cart); + } + + /** @test */ + public function it_can_calculate_all_values() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'First item', 10.00), 2); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $cart->setTax('027c91341fd5cf4d2579b49c4b6a90da', 19); + + $this->assertEquals(10.00, $cartItem->price(2)); + $this->assertEquals(11.90, $cartItem->priceTax(2)); + $this->assertEquals(20.00, $cartItem->subtotal(2)); + $this->assertEquals(23.80, $cartItem->total(2)); + $this->assertEquals(1.90, $cartItem->tax(2)); + $this->assertEquals(3.80, $cartItem->taxTotal(2)); + + $this->assertEquals(20.00, $cart->subtotal(2)); + $this->assertEquals(23.80, $cart->total(2)); + $this->assertEquals(3.80, $cart->tax(2)); + } + + /** @test */ + public function it_will_destroy_the_cart_when_the_user_logs_out_and_the_config_setting_was_set_to_true() + { + $this->app['config']->set('cart.destroy_on_logout', true); + + $this->app->instance(SessionManager::class, Mockery::mock(SessionManager::class, function ($mock) { + $mock->shouldReceive('forget')->once()->with('cart'); + })); + + $user = Mockery::mock(Authenticatable::class); + + $guard = $this->app->make('auth'); + + event(new Logout($guard, $user)); + } + + /** + * Get an instance of the cart. + * + * @return \Gloudemans\Shoppingcart\Cart + */ + private function getCart() + { + $session = $this->app->make('session'); + $events = $this->app->make('events'); + + return new Cart($session, $events); + } + + /** + * Set the config number format. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + */ + private function setConfigFormat($decimals, $decimalPoint, $thousandSeperator) + { + $this->app['config']->set('cart.format.decimals', $decimals); + $this->app['config']->set('cart.format.decimal_point', $decimalPoint); + $this->app['config']->set('cart.format.thousand_seperator', $thousandSeperator); + } +} diff --git a/packages/digital-bird-mivita/shoppingcart/tests/Fixtures/BuyableProduct.php b/packages/digital-bird-mivita/shoppingcart/tests/Fixtures/BuyableProduct.php new file mode 100644 index 0000000..a58e830 --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/tests/Fixtures/BuyableProduct.php @@ -0,0 +1,67 @@ +id = $id; + $this->name = $name; + $this->price = $price; + } + + /** + * Get the identifier of the Buyable item. + * + * @return int|string + */ + public function getBuyableIdentifier($options = null) + { + return $this->id; + } + + /** + * Get the description or title of the Buyable item. + * + * @return string + */ + public function getBuyableDescription($options = null) + { + return $this->name; + } + + /** + * Get the price of the Buyable item. + * + * @return float + */ + public function getBuyablePrice($options = null) + { + return $this->price; + } +} \ No newline at end of file diff --git a/packages/digital-bird-mivita/shoppingcart/tests/Fixtures/ProductModel.php b/packages/digital-bird-mivita/shoppingcart/tests/Fixtures/ProductModel.php new file mode 100644 index 0000000..70494ca --- /dev/null +++ b/packages/digital-bird-mivita/shoppingcart/tests/Fixtures/ProductModel.php @@ -0,0 +1,13 @@ + + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/packages/digital-bird/shoppingcart/README.md b/packages/digital-bird/shoppingcart/README.md new file mode 100644 index 0000000..c03bb4c --- /dev/null +++ b/packages/digital-bird/shoppingcart/README.md @@ -0,0 +1,491 @@ +## LaravelShoppingcart +[![License](https://poser.pugx.org/gloudemans/shoppingcart/license)](https://packagist.org/packages/gloudemans/shoppingcart) + +A simple shoppingcart implementation for Laravel. + +## Installation + +Install the package through [Composer](http://getcomposer.org/). + +Run the Composer require command from the Terminal: + + composer require digital-bird/shoppingcart + +If you're using Laravel 5.5, this is all there is to do. + +Should you still be on version 5.4 of Laravel, the final steps for you are to add the service provider of the package and alias the package. To do this open your `config/app.php` file. + +Add a new line to the `providers` array: + + Gloudemans\Shoppingcart\ShoppingcartServiceProvider::class + +And optionally add a new line to the `aliases` array: + + 'Cart' => Gloudemans\Shoppingcart\Facades\Cart::class, + +Now you're ready to start using the shoppingcart in your application. + +**As of version 2 of this package it's possibly to use dependency injection to inject an instance of the Cart class into your controller or other class** + +## Overview +Look at one of the following topics to learn more about LaravelShoppingcart + +* [Usage](#usage) +* [Collections](#collections) +* [Instances](#instances) +* [Models](#models) +* [Database](#database) +* [Exceptions](#exceptions) +* [Events](#events) +* [Example](#example) + +## Usage + +The shoppingcart gives you the following methods to use: + +### Cart::add() + +Adding an item to the cart is really simple, you just use the `add()` method, which accepts a variety of parameters. + +In its most basic form you can specify the id, name, quantity, price, and tax rate of the product you'd like to add to the cart. + +```php +Cart::add('293ad', 'Product 1', 1, 9.99, 10); +``` + +As an optional sixth parameter you can pass it options, so you can add multiple items with the same id, but with (for instance) a different size. + +The fifth parameter is the tax rate. Eg 10 for 10%. + +```php +Cart::add('293ad', 'Product 1', 1, 9.99, 10, ['size' => 'large']); +``` + +**The `add()` method will return an CartItem instance of the item you just added to the cart.** + +Maybe you prefer to add the item using an array? As long as the array contains the required keys, you can pass it to the method. The options key is optional. + +```php +Cart::add(['id' => '293ad', 'name' => 'Product 1', 'qty' => 1, 'price' => 9.99, 'taxRate' => 10, 'options' => ['size' => 'large']]); +``` + +New in version 2 of the package is the possibility to work with the [Buyable](#buyable) interface. The way this works is that you have a model implement the `Buyable` interface, which will make you implement a few methods so the package knows how to get the id, name and price from your model. +This way you can just pass the `add()` method a model and the quantity and it will automatically add it to the cart. + +The path to the `Buyable` interface is: + + Gloudemans\Shoppingcart\Contracts\Buyable; + +**As an added bonus it will automatically associate the model with the CartItem** + +```php +Cart::add($product, 1, ['size' => 'large']); +``` +As an optional third parameter you can add options. +```php +Cart::add($product, 1, ['size' => 'large']); +``` + +Finally, you can also add multipe items to the cart at once. +You can just pass the `add()` method an array of arrays, or an array of Buyables and they will be added to the cart. + +**When adding multiple items to the cart, the `add()` method will return an array of CartItems.** + +```php +Cart::add([ + ['id' => '293ad', 'name' => 'Product 1', 'qty' => 1, 'price' => 10.00, 'taxRate' => 10], + ['id' => '4832k', 'name' => 'Product 2', 'qty' => 1, 'price' => 10.00, 'taxRate' => 10, 'options' => ['size' => 'large']] +]); + +Cart::add([$product1, $product2]); + +``` + +### Cart::update() + +To update an item in the cart, you'll first need the rowId of the item. +Next you can use the `update()` method to update it. + +If you simply want to update the quantity, you'll pass the update method the rowId and the new quantity: + +```php +$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709'; + +Cart::update($rowId, 2); // Will update the quantity +``` + +If you want to update more attributes of the item, you can either pass the update method an array or a `Buyable` as the second parameter. This way you can update all information of the item with the given rowId. + +```php +Cart::update($rowId, ['name' => 'Product 1']); // Will update the name + +Cart::update($rowId, $product); // Will update the id, name and price + +``` + +### Cart::remove() + +To remove an item for the cart, you'll again need the rowId. This rowId you simply pass to the `remove()` method and it will remove the item from the cart. + +```php +$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709'; + +Cart::remove($rowId); +``` + +### Cart::get() + +If you want to get an item from the cart using its rowId, you can simply call the `get()` method on the cart and pass it the rowId. + +```php +$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709'; + +Cart::get($rowId); +``` + +### Cart::content() + +Of course you also want to get the carts content. This is where you'll use the `content` method. This method will return a Collection of CartItems which you can iterate over and show the content to your customers. + +```php +Cart::content(); +``` + +This method will return the content of the current cart instance, if you want the content of another instance, simply chain the calls. + +```php +Cart::instance('wishlist')->content(); +``` + +### Cart::destroy() + +If you want to completely remove the content of a cart, you can call the destroy method on the cart. This will remove all CartItems from the cart for the current cart instance. + +```php +Cart::destroy(); +``` + +### Cart::total() + +The `total()` method can be used to get the calculated total of all items in the cart, given there price and quantity. + +```php +Cart::total(); +``` + +The method will automatically format the result, which you can tweak using the three optional parameters + +```php +Cart::total($decimals, $decimalSeperator, $thousandSeperator); +``` + +You can set the default number format in the config file. + +**If you're not using the Facade, but use dependency injection in your (for instance) Controller, you can also simply get the total property `$cart->total`** + +### Cart::tax() + +The `tax()` method can be used to get the calculated amount of tax for all items in the cart, given there price and quantity. + +```php +Cart::tax(); +``` + +The method will automatically format the result, which you can tweak using the three optional parameters + +```php +Cart::tax($decimals, $decimalSeperator, $thousandSeperator); +``` + +You can set the default number format in the config file. + +**If you're not using the Facade, but use dependency injection in your (for instance) Controller, you can also simply get the tax property `$cart->tax`** + +### Cart::subtotal() + +The `subtotal()` method can be used to get the total of all items in the cart, minus the total amount of tax. + +```php +Cart::subtotal(); +``` + +The method will automatically format the result, which you can tweak using the three optional parameters + +```php +Cart::subtotal($decimals, $decimalSeperator, $thousandSeperator); +``` + +You can set the default number format in the config file. + +**If you're not using the Facade, but use dependency injection in your (for instance) Controller, you can also simply get the subtotal property `$cart->subtotal`** + +### Cart::count() + +If you want to know how many items there are in your cart, you can use the `count()` method. This method will return the total number of items in the cart. So if you've added 2 books and 1 shirt, it will return 3 items. + +```php +Cart::count(); +``` + +### Cart::search() + +To find an item in the cart, you can use the `search()` method. + +**This method was changed on version 2** + +Behind the scenes, the method simply uses the filter method of the Laravel Collection class. This means you must pass it a Closure in which you'll specify you search terms. + +If you for instance want to find all items with an id of 1: + +```php +$cart->search(function ($cartItem, $rowId) { + return $cartItem->id === 1; +}); +``` + +As you can see the Closure will receive two parameters. The first is the CartItem to perform the check against. The second parameter is the rowId of this CartItem. + +**The method will return a Collection containing all CartItems that where found** + +This way of searching gives you total control over the search process and gives you the ability to create very precise and specific searches. + +## Collections + +On multiple instances the Cart will return to you a Collection. This is just a simple Laravel Collection, so all methods you can call on a Laravel Collection are also available on the result. + +As an example, you can quicky get the number of unique products in a cart: + +```php +Cart::content()->count(); +``` + +Or you can group the content by the id of the products: + +```php +Cart::content()->groupBy('id'); +``` + +## Instances + +The packages supports multiple instances of the cart. The way this works is like this: + +You can set the current instance of the cart by calling `Cart::instance('newInstance')`. From this moment, the active instance of the cart will be `newInstance`, so when you add, remove or get the content of the cart, you're work with the `newInstance` instance of the cart. +If you want to switch instances, you just call `Cart::instance('otherInstance')` again, and you're working with the `otherInstance` again. + +So a little example: + +```php +Cart::instance('shopping')->add('192ao12', 'Product 1', 1, 9.99); + +// Get the content of the 'shopping' cart +Cart::content(); + +Cart::instance('wishlist')->add('sdjk922', 'Product 2', 1, 19.95, ['size' => 'medium']); + +// Get the content of the 'wishlist' cart +Cart::content(); + +// If you want to get the content of the 'shopping' cart again +Cart::instance('shopping')->content(); + +// And the count of the 'wishlist' cart again +Cart::instance('wishlist')->count(); +``` + +**N.B. Keep in mind that the cart stays in the last set instance for as long as you don't set a different one during script execution.** + +**N.B.2 The default cart instance is called `default`, so when you're not using instances,`Cart::content();` is the same as `Cart::instance('default')->content()`.** + +## Models + +Because it can be very convenient to be able to directly access a model from a CartItem is it possible to associate a model with the items in the cart. Let's say you have a `Product` model in your application. With the `associate()` method, you can tell the cart that an item in the cart, is associated to the `Product` model. + +That way you can access your model right from the `CartItem`! + +The model can be accessed via the `model` property on the CartItem. + +**If your model implements the `Buyable` interface and you used your model to add the item to the cart, it will associate automatically.** + +Here is an example: + +```php + +// First we'll add the item to the cart. +$cartItem = Cart::add('293ad', 'Product 1', 1, 9.99, ['size' => 'large']); + +// Next we associate a model with the item. +Cart::associate($cartItem->rowId, 'Product'); + +// Or even easier, call the associate method on the CartItem! +$cartItem->associate('Product'); + +// You can even make it a one-liner +Cart::add('293ad', 'Product 1', 1, 9.99, ['size' => 'large'])->associate('Product'); + +// Now, when iterating over the content of the cart, you can access the model. +foreach(Cart::content() as $row) { + echo 'You have ' . $row->qty . ' items of ' . $row->model->name . ' with description: "' . $row->model->description . '" in your cart.'; +} +``` + +### Buyable + +For the convenience of faster adding items to cart and their automatic association, your model can implement `Buyable` interface. To do so, it must implement such functions: + +```php + public function getBuyableIdentifier(){ + return $this->id; + } + + public function getBuyableDescription(){ + return $this->name; + } + + public function getBuyablePrice(){ + return $this->price; + } +``` + +Example: + +```php +id; + } + + public function getBuyableDescription($options = null) { + return $this->name; + } + + public function getBuyablePrice($options = null) { + return $this->price; + } +} +``` + + +## Database + +- [Config](#configuration) +- [Storing the cart](#storing-the-cart) +- [Restoring the cart](#restoring-the-cart) + +### Configuration +To save cart into the database so you can retrieve it later, the package needs to know which database connection to use and what the name of the table is. +By default the package will use the default database connection and use a table named `shoppingcart`. +If you want to change these options, you'll have to publish the `config` file. + + php artisan vendor:publish --provider="Gloudemans\Shoppingcart\ShoppingcartServiceProvider" --tag="config" + +This will give you a `cart.php` config file in which you can make the changes. + +To make your life easy, the package also includes a ready to use `migration` which you can publish by running: + + php artisan vendor:publish --provider="Gloudemans\Shoppingcart\ShoppingcartServiceProvider" --tag="migrations" + +This will place a `shoppingcart` table's migration file into `database/migrations` directory. Now all you have to do is run `php artisan migrate` to migrate your database. + +### Storing the cart +To store your cart instance into the database, you have to call the `store($identifier) ` method. Where `$identifier` is a random key, for instance the id or username of the user. + + Cart::store('username'); + + // To store a cart instance named 'wishlist' + Cart::instance('wishlist')->store('username'); + +### Restoring the cart +If you want to retrieve the cart from the database and restore it, all you have to do is call the `restore($identifier)` where `$identifier` is the key you specified for the `store` method. + + Cart::restore('username'); + + // To restore a cart instance named 'wishlist' + Cart::instance('wishlist')->restore('username'); + +## Exceptions + +The Cart package will throw exceptions if something goes wrong. This way it's easier to debug your code using the Cart package or to handle the error based on the type of exceptions. The Cart packages can throw the following exceptions: + +| Exception | Reason | +| ---------------------------- | ---------------------------------------------------------------------------------- | +| *CartAlreadyStoredException* | When trying to store a cart that was already stored using the specified identifier | +| *InvalidRowIDException* | When the rowId that got passed doesn't exists in the current cart instance | +| *UnknownModelException* | When you try to associate an none existing model to a CartItem. | + +## Events + +The cart also has events build in. There are five events available for you to listen for. + +| Event | Fired | Parameter | +| ------------- | ---------------------------------------- | -------------------------------- | +| cart.added | When an item was added to the cart. | The `CartItem` that was added. | +| cart.updated | When an item in the cart was updated. | The `CartItem` that was updated. | +| cart.removed | When an item is removed from the cart. | The `CartItem` that was removed. | +| cart.stored | When the content of a cart was stored. | - | +| cart.restored | When the content of a cart was restored. | - | + +## Example + +Below is a little example of how to list the cart content in a table: + +```php + +// Add some items in your Controller. +Cart::add('192ao12', 'Product 1', 1, 9.99); +Cart::add('1239ad0', 'Product 2', 2, 5.95, ['size' => 'large']); + +// Display the content in a View. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProductQtyPriceSubtotal
+

name; ?>

+

options->has('size') ? $row->options->size : ''); ?>

+
$price; ?>$total; ?>
 Subtotal
 Tax
 Total
+``` diff --git a/packages/digital-bird/shoppingcart/composer.json b/packages/digital-bird/shoppingcart/composer.json new file mode 100644 index 0000000..8f66a16 --- /dev/null +++ b/packages/digital-bird/shoppingcart/composer.json @@ -0,0 +1,49 @@ +{ + "name": "digital-bird/shoppingcart", + "description": "Laravel Shoppingcart", + "keywords": [ + "laravel", + "shoppingcart" + ], + "license": "MIT", + "authors": [ + { + "name": "Rob Gloudemans", + "email": "info@robgloudemans.nl" + } + ], + "require": { + "illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*|5.5.*|5.6.*|5.7.*|5.8.*|6.*|7.*|8.*", + "illuminate/session": "5.1.*|5.2.*|5.3.*|5.4.*|5.5.*|5.6.*|5.7.*|5.8.*|6.*|7.*|8.*", + "illuminate/events": "5.1.*|5.2.*|5.3.*|5.4.*|5.5.*|5.6.*|5.7.*|5.8.*|6.*|7.*|8.*" + }, + "require-dev": { + "phpunit/phpunit": "~5.0|~6.0|~7.0|~8.0|~9,0", + "mockery/mockery": "~0.9.0", + "orchestra/testbench": "~3.1" + }, + "autoload": { + "psr-4": { + "Gloudemans\\Shoppingcart\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Gloudemans\\Tests\\Shoppingcart\\": "tests/" + } + }, + "suggest": { + "gloudemans/notify": "Simple flash notifications for Laravel" + }, + "minimum-stability": "stable", + "extra": { + "laravel": { + "providers": [ + "Gloudemans\\Shoppingcart\\ShoppingcartServiceProvider" + ], + "aliases": { + "Cart": "Gloudemans\\Shoppingcart\\Facades\\Cart" + } + } + } +} diff --git a/packages/digital-bird/shoppingcart/config/cart.php b/packages/digital-bird/shoppingcart/config/cart.php new file mode 100644 index 0000000..3546b0c --- /dev/null +++ b/packages/digital-bird/shoppingcart/config/cart.php @@ -0,0 +1,75 @@ + 10, + + /* + |-------------------------------------------------------------------------- + | Shoppingcart database settings + |-------------------------------------------------------------------------- + | + | Here you can set the connection that the shoppingcart should use when + | storing and restoring a cart. + | + */ + + 'database' => [ + + 'connection' => null, + + 'table' => 'shoppingcart', + + ], + + /* + |-------------------------------------------------------------------------- + | Destroy the cart on user logout + |-------------------------------------------------------------------------- + | + | When this option is set to 'true' the cart will automatically + | destroy all cart instances when the user logs out. + | + */ + + 'destroy_on_logout' => false, + + /* + |-------------------------------------------------------------------------- + | Default number format + |-------------------------------------------------------------------------- + | + | This defaults will be used for the formated numbers if you don't + | set them in the method call. + | + */ + + 'format' => [ + + 'decimals' => 2, + + 'decimal_point' => '.', + + 'thousand_seperator' => '' + + ], + + /* + |-------------------------------------------------------------------------- + | Allows you to choose if the discounts applied to fees + |-------------------------------------------------------------------------- + | + */ + 'discountOnFees' => false, + +]; diff --git a/packages/digital-bird/shoppingcart/database/migrations/0000_00_00_000000_create_shoppingcart_table.php b/packages/digital-bird/shoppingcart/database/migrations/0000_00_00_000000_create_shoppingcart_table.php new file mode 100644 index 0000000..fc5bb26 --- /dev/null +++ b/packages/digital-bird/shoppingcart/database/migrations/0000_00_00_000000_create_shoppingcart_table.php @@ -0,0 +1,30 @@ +string('identifier'); + $table->string('instance'); + $table->longText('content'); + $table->nullableTimestamps(); + + $table->primary(['identifier', 'instance']); + }); + } + /** + * Reverse the migrations. + */ + public function down() + { + Schema::drop(config('cart.database.table')); + } +} diff --git a/packages/digital-bird/shoppingcart/phpunit.xml b/packages/digital-bird/shoppingcart/phpunit.xml new file mode 100644 index 0000000..655d24e --- /dev/null +++ b/packages/digital-bird/shoppingcart/phpunit.xml @@ -0,0 +1,16 @@ + + + + + ./tests/ + + + \ No newline at end of file diff --git a/packages/digital-bird/shoppingcart/src/CanBeBought.php b/packages/digital-bird/shoppingcart/src/CanBeBought.php new file mode 100644 index 0000000..e122d1f --- /dev/null +++ b/packages/digital-bird/shoppingcart/src/CanBeBought.php @@ -0,0 +1,54 @@ +getKey() : + $this->id; + } + + /** + * Get the description or title of the Buyable item. + * + * @return string + */ + public function getBuyableDescription($options = null) + { + if (property_exists($this, 'name')) { + return $this->name; + } + + if (property_exists($this, 'title')) { + return $this->title; + } + + if (property_exists($this, 'description')) { + return $this->description; + } + + return null; + } + + /** + * Get the price of the Buyable item. + * + * @return float + */ + public function getBuyablePrice($options = null) + { + if (property_exists($this, 'price')) { + return $this->price; + } + + return null; + } +} diff --git a/packages/digital-bird/shoppingcart/src/Cart.php b/packages/digital-bird/shoppingcart/src/Cart.php new file mode 100644 index 0000000..12fbadc --- /dev/null +++ b/packages/digital-bird/shoppingcart/src/Cart.php @@ -0,0 +1,798 @@ +items = new Collection; + $this->fees = new Collection; + $this->session = $session; + $this->events = $events; + + $this->instance(self::DEFAULT_INSTANCE); + } + + /** + * Set the current cart instance. + * + * @param string|null $instance + * @return \Gloudemans\Shoppingcart\Cart + */ + public function instance($instance = null) + { + $instance = $instance ?: self::DEFAULT_INSTANCE; + + $this->instance = sprintf('%s.%s', 'cart', $instance); + + return $this; + } + + /** + * Get the current cart instance. + * + * @return string + */ + public function currentInstance() + { + return str_replace('cart.', '', $this->instance); + } + + /** + * Add an item to the cart. + * + * @param mixed $id + * @param mixed $name + * @param int|float $qty + * @param float $price + * @param array $options + * @return \Gloudemans\Shoppingcart\CartItem + */ + public function add($id, $name = null, $qty = null, $price = null, $taxRate = null, array $options = []) + { + if ($this->isMulti($id)) { + return array_map(function ($item) { + return $this->add($item); + }, $id); + } + + if ($id instanceof CartItem) { + $cartItem = $id; + } else { + $cartItem = $this->createCartItem($id, $name, $qty, $price, $taxRate, $options); + } + + $content = $this->getContent(); + + if ($content->has($cartItem->rowId)) { + $cartItem->qty += $content->get($cartItem->rowId)->qty; + } + + $content->put($cartItem->rowId, $cartItem); + + $this->items = $content; + + $this->session->put($this->instance, $this->toArray()); + + $this->events->dispatch('cart.added', [ + [ + 'cartInstance' => $this->currentInstance(), + 'cartItem' => $cartItem, + ] + ]); + + return $cartItem; + } + + /** + * Update the cart item with the given rowId. + * + * @param string $rowId + * @param mixed $qty + * @return \Gloudemans\Shoppingcart\CartItem + */ + public function update($rowId, $qty) + { + $cartItem = $this->get($rowId); + + if ($qty instanceof Buyable) { + $cartItem->updateFromBuyable($qty); + } elseif (is_array($qty)) { + $cartItem->updateFromArray($qty); + } else { + $cartItem->qty = $qty; + } + + $content = $this->getContent(); + + if ($rowId !== $cartItem->rowId) { + if ($content->has($cartItem->rowId)) { + $existingCartItem = $this->get($cartItem->rowId); + $cartItem->setQuantity($existingCartItem->qty + $cartItem->qty); + } + + $content = $content->mapWithKeys(function ($val, $key) use ($rowId, $cartItem) { + if ($key === $rowId) { + return [ $cartItem->rowId => $cartItem ]; + } + + return [ $key => $val ]; + }); + + $this->items = $content; + } + + if ($cartItem->qty <= 0) { + $this->remove($cartItem->rowId); + return; + } + + $this->session->put($this->instance, $this->toArray()); + + $this->events->dispatch('cart.updated', [ + [ + 'cartInstance' => $this->currentInstance(), + 'cartItem' => $cartItem, + ] + ]); + + return $cartItem; + } + + /** + * Remove the cart item with the given rowId from the cart. + * + * @param string $rowId + * @return void + */ + public function remove($rowId) + { + $cartItem = $this->get($rowId); + + $content = $this->getContent(); + + $content->pull($cartItem->rowId); + + $this->items = $content; + + $this->session->put($this->instance, $this->toArray()); + + $this->events->dispatch('cart.removed', [ + [ + 'cartInstance' => $this->currentInstance(), + 'cartItem' => $cartItem, + ] + ]); + } + + /** + * Get a cart item from the cart by its rowId. + * + * @param string $rowId + * @return \Gloudemans\Shoppingcart\CartItem + */ + public function get($rowId) + { + $content = $this->getContent(); + + if ($content->has($rowId) === false) { + throw new InvalidRowIDException("The cart does not contain rowId {$rowId}."); + } + + return $content->get($rowId); + } + + /** + * Destroy the current cart instance. + * + * @return void + */ + public function destroy() + { + $this->session->remove($this->instance); + } + + /** + * Get the content of the cart. + * + * @return \Illuminate\Support\Collection + */ + public function content() + { + return $this->getContent(); + } + + /** + * Get the number of items in the cart. + * + * @return int|float + */ + public function count() + { + $content = $this->getContent(); + + return $content->sum('qty'); + } + + /** + * Get the total price of the items in the cart. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return string + */ + public function total($decimals = null, $decimalPoint = null, $thousandSeperator = null, $withFees = true) + { + $content = $this->getContent(); + + $total = $content->reduce(function ($total, CartItem $cartItem) { + return $total + ($cartItem->qty * $cartItem->priceTax); + }, 0); + + if ($withFees === true) { + $fees = $this->feeTotal(null, null, null, true); + + $total = $total + $fees; + } + + return $this->numberFormat($total, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Get the total tax of the items in the cart. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return float + */ + public function tax($decimals = null, $decimalPoint = null, $thousandSeperator = null, $withFees = true) + { + $content = $this->getContent(); + + $tax = $content->reduce(function ($tax, CartItem $cartItem) { + return $tax + ($cartItem->qty * $cartItem->tax); + }, 0); + + if ($withFees === true) { + $fees = $this->feeTax(); + + $tax = $tax + floatval($fees); + } + + return $this->numberFormat($tax, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Get the total tax of the items in the cart. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return float + */ + public function feeTax($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + $content = $this->getContent(); + + $tax = 0; + + foreach ($this->getFees() as $fee) { + $tax += $fee->tax; + } + + return $this->numberFormat($tax, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Get the subtotal (total - tax) of the items in the cart. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return float + */ + public function subtotal($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + $content = $this->getContent(); + + $subTotal = $content->reduce(function ($subTotal, CartItem $cartItem) { + return $subTotal + ($cartItem->qty * $cartItem->price); + }, 0); + + return $this->numberFormat($subTotal, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Get the subtotal (total - tax) of the items in the cart. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return float + */ + public function subtotalTax($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + $content = $this->getContent(); + + $subTotal = $content->reduce(function ($subTotal, CartItem $cartItem) { + return $subTotal + ($cartItem->qty * $cartItem->priceTax); + }, 0); + + return $this->numberFormat($subTotal, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Search the cart content for a cart item matching the given search closure. + * + * @param Closure $search + * @return \Illuminate\Support\Collection + */ + public function search(Closure $search) + { + $content = $this->getContent(); + + return $content->filter($search); + } + + /** + * Associate the cart item with the given rowId with the given model. + * + * @param string $rowId + * @param mixed $model + * @return void + */ + public function associate($rowId, $model) + { + if ( + is_string($model) === true && + class_exists($model) === false + ) { + throw new UnknownModelException("The supplied model {$model} does not exist."); + } + + $cartItem = $this->get($rowId); + + $cartItem->associate($model); + + $content = $this->getContent(); + + $content->put($cartItem->rowId, $cartItem); + + $this->session->put($this->instance, $this->toArray()); + } + + /** + * Set the tax rate for the cart item with the given rowId. + * + * @param string $rowId + * @param int|float $taxRate + * @return void + */ + public function setTax($rowId, $taxRate) + { + $cartItem = $this->get($rowId); + + $cartItem->setTaxRate($taxRate); + + $content = $this->getContent(); + + $content->put($cartItem->rowId, $cartItem); + + $this->items = $content; + + $this->session->put($this->instance, $this->toArray()); + } + + /** + * Store an the current instance of the cart. + * + * @param mixed $identifier + * @return void + */ + public function store($identifier) + { + // Remove any existing identifiers + // Although possibly first or update could work in future + $this + ->getConnection() + ->table($this->getTableName()) + ->where('identifier', $identifier) + ->delete(); + + // Insert into the database with the new cart + $this + ->getConnection() + ->table($this->getTableName()) + ->insert([ + 'identifier' => $identifier, + 'instance' => $this->currentInstance(), + 'content' => serialize($this->toArray()), + 'created_at'=> new DateTime(), + ]); + + $this->events->dispatch('cart.stored', $this->currentInstance()); + } + + /** + * Restore the cart with the given identifier. + * + * @param mixed $identifier + * @return void + */ + public function restore($identifier) + { + if ($this->storedCartWithIdentifierExists($identifier) === false) { + return; + } + + // Find any existing carts by identifier + $stored = $this + ->getConnection() + ->table($this->getTableName()) + ->where('identifier', $identifier) + ->first(); + + // Unserialize the content (either array if new, or collection if old) + $storedContent = unserialize($stored->content); + + $currentInstance = $this->currentInstance(); + + $this->instance($stored->instance); + + $content = $this->getContent(); + + // If the new approach and is array, set this class up. + // Note that it overrides any existing items in cart + // Does not add to existing. + if (is_array($storedContent)) { + $this->fromArray($storedContent); + } + + // If the old approach and is Collection, push into existing items + if ($storedContent instanceof Collection) { + foreach ($storedContent as $cartItem) { + $content->put($cartItem->rowId, $cartItem); + } + } + + $this->events->dispatch('cart.restored', $this->currentInstance()); + + $this->session->put($this->instance, $this->toArray()); + + $this->instance($currentInstance); + } + + /** + * Gets a specific fee from the fees array. + * + * @param $name + * + * @return mixed + */ + public function getFee($name) + { + return $this->fees->get($name, new CartFee(null, null)); + } + + /** + * Allows to charge for additional fees that may or may not be taxable + * ex - service fee , delivery fee, tips. + * + * Because it uses ->put, the name must be unique otherwise will be overwritten. + * + * @param $name + * @param $amount + * @param $taxRate + * @param array $options + */ + public function addFee($name, $amount, $taxRate = null, array $options = []) + { + $this->fees->put($name, new CartFee($amount, $taxRate, $options)); + + $this->session->put($this->instance, $this->toArray()); + } + + /** + * Removes a fee from the fee array. + * + * @todo test to see if i need to restore this + * + * @param $name + */ + public function removeFee($name) + { + $this->fees->forget($name); + + $this->session->put($this->instance, $this->toArray()); + } + + /** + * Removes all the fees set in the cart. + */ + public function removeFees() + { + $this->fees = new Collection; + + $this->session->put($this->instance, $this->toArray()); + } + + /** + * Gets all the fee totals. + * + * @param bool $format + * @param bool $withTax + * + * @return string + */ + public function feeTotal($decimals = null, $decimalPoint = null, $thousandSeperator = null, $withTax = true) + { + $feeTotal = 0; + + foreach ($this->getFees() as $fee) { + $feeTotal += $fee->amount; + + if ($withTax === true && $fee->taxRate > 0) { + $feeTotal += $fee->tax; + } + } + + return $this->numberFormat($feeTotal, null, null, null); + } + + /** + * Gets all the fees on the cart object. + * + * @return mixed + */ + public function getFees() + { + return $this->fees; + } + + /** + * Magic method to make accessing the total, tax and subtotal properties possible. + * + * @param string $attribute + * @return float|null + */ + public function __get($attribute) + { + if ($attribute === 'total') { + return $this->total(); + } + + if ($attribute === 'feeTotal') { + return $this->feeTotal(null, null, null, false); + } + + if ($attribute === 'feeTotalTax') { + return $this->feeTotal(null, null, null, true); + } + + if ($attribute === 'tax') { + return $this->tax(); + } + + if ($attribute === 'feeTax') { + return $this->feeTax(); + } + + if ($attribute === 'subtotal') { + return $this->subtotal(); + } + + if ($attribute === 'subtotalTax') { + return $this->subtotalTax(); + } + + return null; + } + + /** + * @return array + */ + public function toArray() + { + return [ + 'items' => $this->items, + 'fees' => $this->fees, + ]; + } + + /** + * @param $array + * @return $this + */ + public function fromArray($array) + { + $this->items = $array['items']; + $this->fees = $array['fees']; + + return $this; + } + + /** + * Deletes the stored cart with given identifier + * + * @param mixed $identifier + */ + protected function deleteStoredCart($identifier) + { + $this + ->getConnection() + ->table($this->getTableName()) + ->where('identifier', $identifier) + ->delete(); + } + + /** + * Get the carts content, if there is no cart content set yet, return a new empty Collection + * + * @return \Illuminate\Support\Collection + */ + protected function getContent(): Collection + { + $instanceExists = $this->session->has($this->instance); + + if ($instanceExists === false) { + $this->items = new Collection; + + return $this->items; + } + + $instance = $this->session->get($this->instance); + + // If new approach, set $this variables + if (is_array($instance) === true) { + $this->items = $instance['items']; + $this->fees = $instance['fees']; + } + + if ($instance instanceof Collection) { + $this->items = $instance; + } + + return $this->items; + } + + /** + * Create a new CartItem from the supplied attributes. + * + * @param mixed $id + * @param mixed $name + * @param int|float $qty + * @param float $price + * @param array $options + * @return \Gloudemans\Shoppingcart\CartItem + */ + private function createCartItem($id, $name, $qty, $price, $taxRate, array $options): CartItem + { + if ($id instanceof Buyable) { + $cartItem = CartItem::fromBuyable($id, $qty ?: []); + $cartItem->setQuantity($name ?: 1); + $cartItem->associate($id); + } elseif (is_array($id)) { + $cartItem = CartItem::fromArray($id); + $cartItem->setQuantity($id['qty']); + } else { + $cartItem = CartItem::fromAttributes($id, $name, $price, $options); + $cartItem->setQuantity($qty); + } + $taxRate = $taxRate != null ? $taxRate : config('cart.tax'); + + $cartItem->setTaxRate($taxRate); + + return $cartItem; + } + + /** + * Check if the item is a multidimensional array or an array of Buyables. + * + * @param mixed $item + * @return bool + */ + private function isMulti($item): bool + { + if (is_array($item) === false) { + return false; + } + + return is_array(head($item)) || head($item) instanceof Buyable === true; + } + + /** + * @param $identifier + * @return bool + */ + protected function storedCartWithIdentifierExists($identifier): bool + { + return $this + ->getConnection() + ->table($this->getTableName()) + ->where('identifier', $identifier) + ->exists(); + } + + /** + * Get the database connection. + * + * @return \Illuminate\Database\Connection + */ + protected function getConnection() + { + $connectionName = $this->getConnectionName(); + + return app(DatabaseManager::class)->connection($connectionName); + } + + /** + * Get the database table name. + * + * @return string + */ + protected function getTableName() + { + return config('cart.database.table', 'shoppingcart'); + } + + /** + * Get the database connection name. + * + * @return string + */ + private function getConnectionName() + { + $connection = config('cart.database.connection'); + + return is_null($connection) ? config('database.default') : $connection; + } +} diff --git a/packages/digital-bird/shoppingcart/src/CartFee.php b/packages/digital-bird/shoppingcart/src/CartFee.php new file mode 100644 index 0000000..0aff34c --- /dev/null +++ b/packages/digital-bird/shoppingcart/src/CartFee.php @@ -0,0 +1,75 @@ +amount = floatval($amount); + $this->taxRate = is_null($taxRate) ? config('cart.tax') : $taxRate; + $this->options = new CartFeeOptions($options); + } + + /** + * Gets the formatted amount. + * + * @param bool $format + * @param bool $withTax + * + * @return string + */ + public function getAmount($format = true, $withTax = false) + { + $total = $this->amount; + + if ($withTax) { + $total += $this->taxRate * $total; + } + + return $this->numberFormat($total); + } + + /** + * @return string + */ + public function tax() + { + $tax = $this->amount * $this->taxRate / 100; + + return $this->numberFormat($tax); + } + + /** + * Magic method to make accessing the total, tax and subtotal properties possible. + * + * @param string $attribute + * @return float|null + */ + public function __get($attribute) + { + if ($attribute === 'tax') { + return $this->tax(); + } + + return null; + } +} diff --git a/packages/digital-bird/shoppingcart/src/CartFeeOptions.php b/packages/digital-bird/shoppingcart/src/CartFeeOptions.php new file mode 100644 index 0000000..dd91b92 --- /dev/null +++ b/packages/digital-bird/shoppingcart/src/CartFeeOptions.php @@ -0,0 +1,19 @@ +get($key); + } +} diff --git a/packages/digital-bird/shoppingcart/src/CartItem.php b/packages/digital-bird/shoppingcart/src/CartItem.php new file mode 100644 index 0000000..d01361b --- /dev/null +++ b/packages/digital-bird/shoppingcart/src/CartItem.php @@ -0,0 +1,422 @@ +id = $id; + $this->name = $name; + $this->price = floatval($price); + $this->options = new CartItemOptions($options); + $this->rowId = $this->generateRowId($id, $options); + } + + /** + * Returns the formatted price without TAX. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return string + */ + public function price($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + return $this->numberFormat($this->price, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Returns the formatted price with TAX. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return string + */ + public function priceTax($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + $priceTax = number_format(($this->price + $this->tax), $decimals, '.', ''); + + return $this->numberFormat($priceTax, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Returns the formatted subtotal. + * Subtotal is price for whole CartItem without TAX + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return string + */ + public function subtotal($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + $subtotal = number_format(($this->qty * $this->price), $decimals, '.', ''); + + return $this->numberFormat($subtotal, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Returns the formatted subtotal. + * Subtotal is price for whole CartItem with TAX + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return string + */ + public function subtotalTax($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + $subtotal = number_format(($this->qty * $this->priceTax), $decimals, '.', ''); + + return $this->numberFormat($subtotal, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Returns the formatted total. + * Total is price for whole CartItem with tax + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return string + */ + public function total($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + $total = number_format(($this->qty * $this->priceTax), $decimals, '.', ''); + + return $this->numberFormat($total, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Returns the formatted tax. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return string + */ + public function tax($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + $tax = number_format(($this->price * ($this->taxRate / 100)), $decimals, '.', ''); + + return $this->numberFormat($tax, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Returns the formatted tax. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + * @return string + */ + public function taxTotal($decimals = null, $decimalPoint = null, $thousandSeperator = null) + { + $taxTotal = number_format(($this->tax * $this->qty), $decimals, '.', ''); + + return $this->numberFormat($taxTotal, $decimals, $decimalPoint, $thousandSeperator); + } + + /** + * Set the quantity for this cart item. + * + * @param int|float $qty + */ + public function setQuantity($qty) + { + if(empty($qty) || ! is_numeric($qty)) + throw new \InvalidArgumentException('Please supply a valid quantity.'); + + $this->qty = $qty; + } + + /** + * Update the cart item from a Buyable. + * + * @param \Gloudemans\Shoppingcart\Contracts\Buyable $item + * @return void + */ + public function updateFromBuyable(Buyable $item) + { + $this->id = $item->getBuyableIdentifier($this->options); + $this->name = $item->getBuyableDescription($this->options); + $this->price = $item->getBuyablePrice($this->options); + $this->priceTax = $this->price + $this->tax; + } + + /** + * Update the cart item from an array. + * + * @param array $attributes + * @return void + */ + public function updateFromArray(array $attributes) + { + $this->id = array_get($attributes, 'id', $this->id); + $this->qty = array_get($attributes, 'qty', $this->qty); + $this->name = array_get($attributes, 'name', $this->name); + $this->price = array_get($attributes, 'price', $this->price); + $this->priceTax = $this->price + $this->tax; + $this->options = new CartItemOptions(array_get($attributes, 'options', $this->options)); + + $this->rowId = $this->generateRowId($this->id, $this->options->all()); + } + + /** + * Associate the cart item with the given model. + * + * @param mixed $model + * @return \Gloudemans\Shoppingcart\CartItem + */ + public function associate($model) + { + $this->associatedModel = is_string($model) ? $model : get_class($model); + + return $this; + } + + /** + * Set the tax rate. + * + * @param int|float $taxRate + * @return \Gloudemans\Shoppingcart\CartItem + */ + public function setTaxRate($taxRate) + { + $this->taxRate = floatval($taxRate); + + return $this; + } + + /** + * Set saved state. + * + * @param bool $bool + * @return \Gloudemans\Shoppingcart\CartItem + */ + public function setSaved($bool) + { + $this->isSaved = $bool; + + return $this; + } + + /** + * Get an attribute from the cart item or get the associated model. + * + * @param string $attribute + * @return mixed + */ + public function __get($attribute) + { + if(property_exists($this, $attribute)) { + return $this->{$attribute}; + } + + $decimals = config('cart.format.decimals') ?? 2; + + if ($attribute === 'priceTax') { + return $this->priceTax($decimals); + } + + if ($attribute === 'subtotal') { + return $this->subtotal($decimals); + } + + if ($attribute === 'subtotalTax') { + return $this->subtotalTax($decimals); + } + + if ($attribute === 'total') { + return $this->total($decimals); + } + + if ($attribute === 'tax') { + return $this->tax($decimals); + } + + if ($attribute === 'taxTotal') { + return $this->taxTotal($decimals); + } + + if($attribute === 'model' && isset($this->associatedModel)) { + return with(new $this->associatedModel)->find($this->id); + } + + return null; + } + + /** + * Create a new instance from a Buyable. + * + * @param \Gloudemans\Shoppingcart\Contracts\Buyable $item + * @param array $options + * @return \Gloudemans\Shoppingcart\CartItem + */ + public static function fromBuyable(Buyable $item, array $options = []) + { + return new self($item->getBuyableIdentifier($options), $item->getBuyableDescription($options), $item->getBuyablePrice($options), $options); + } + + /** + * Create a new instance from the given array. + * + * @param array $attributes + * @return \Gloudemans\Shoppingcart\CartItem + */ + public static function fromArray(array $attributes) + { + $options = array_get($attributes, 'options', []); + + return new self($attributes['id'], $attributes['name'], $attributes['price'], $options); + } + + /** + * Create a new instance from the given attributes. + * + * @param int|string $id + * @param string $name + * @param float $price + * @param array $options + * @return \Gloudemans\Shoppingcart\CartItem + */ + public static function fromAttributes($id, $name, $price, array $options = []) + { + return new self($id, $name, $price, $options); + } + + /** + * Generate a unique id for the cart item. + * + * @param string $id + * @param array $options + * @return string + */ + protected function generateRowId($id, array $options) + { + ksort($options); + + return md5($id . serialize($options)); + } + + /** + * Get the instance as an array. + * + * @return array + */ + public function toArray() + { + return [ + 'rowId' => $this->rowId, + 'id' => $this->id, + 'name' => $this->name, + 'qty' => $this->qty, + 'price' => $this->price, + 'options' => $this->options->toArray(), + 'tax' => $this->tax, + 'isSaved' => $this->isSaved, + 'subtotal' => $this->subtotal + ]; + } + + /** + * Convert the object to its JSON representation. + * + * @param int $options + * @return string + */ + public function toJson($options = 0) + { + return json_encode($this->toArray(), $options); + } +} diff --git a/packages/digital-bird/shoppingcart/src/CartItemOptions.php b/packages/digital-bird/shoppingcart/src/CartItemOptions.php new file mode 100644 index 0000000..1b80205 --- /dev/null +++ b/packages/digital-bird/shoppingcart/src/CartItemOptions.php @@ -0,0 +1,19 @@ +get($key); + } +} diff --git a/packages/digital-bird/shoppingcart/src/Contracts/Buyable.php b/packages/digital-bird/shoppingcart/src/Contracts/Buyable.php new file mode 100644 index 0000000..f5bfeb7 --- /dev/null +++ b/packages/digital-bird/shoppingcart/src/Contracts/Buyable.php @@ -0,0 +1,27 @@ +app->bind('cart', 'Gloudemans\Shoppingcart\Cart'); + + $config = __DIR__ . '/../config/cart.php'; + $this->mergeConfigFrom($config, 'cart'); + + $this->publishes([__DIR__ . '/../config/cart.php' => config_path('cart.php')], 'config'); + + $this->app['events']->listen(Logout::class, function () { + if ($this->app['config']->get('cart.destroy_on_logout')) { + $this->app->make(SessionManager::class)->forget('cart'); + } + }); + + if ( ! class_exists('CreateShoppingcartTable')) { + // Publish the migration + $timestamp = date('Y_m_d_His', time()); + + $this->publishes([ + __DIR__.'/../database/migrations/0000_00_00_000000_create_shoppingcart_table.php' => database_path('migrations/'.$timestamp.'_create_shoppingcart_table.php'), + ], 'migrations'); + } + } +} diff --git a/packages/digital-bird/shoppingcart/src/Traits/CartHelper.php b/packages/digital-bird/shoppingcart/src/Traits/CartHelper.php new file mode 100644 index 0000000..cb7968c --- /dev/null +++ b/packages/digital-bird/shoppingcart/src/Traits/CartHelper.php @@ -0,0 +1,35 @@ +count(); + + PHPUnit::assertEquals($items, $cart->count(), "Expected the cart to contain {$items} items, but got {$actual}."); + } + + /** + * Assert that the cart contains the given number of rows. + * + * @param int $rows + * @param \Gloudemans\Shoppingcart\Cart $cart + */ + public function assertRowsInCart($rows, Cart $cart) + { + $actual = $cart->content()->count(); + + PHPUnit::assertCount($rows, $cart->content(), "Expected the cart to contain {$rows} rows, but got {$actual}."); + } +} diff --git a/packages/digital-bird/shoppingcart/tests/CartItemTest.php b/packages/digital-bird/shoppingcart/tests/CartItemTest.php new file mode 100644 index 0000000..2a01714 --- /dev/null +++ b/packages/digital-bird/shoppingcart/tests/CartItemTest.php @@ -0,0 +1,56 @@ + 'XL', 'color' => 'red']); + $cartItem->setQuantity(2); + + $this->assertEquals([ + 'id' => 1, + 'name' => 'Some item', + 'price' => 10.00, + 'rowId' => '07d5da5550494c62daf9993cf954303f', + 'qty' => 2, + 'options' => [ + 'size' => 'XL', + 'color' => 'red' + ], + 'tax' => 0.0, + 'subtotal' => 20.00, + 'isSaved' => false + ], $cartItem->toArray()); + } + + /** @test */ + public function it_can_be_cast_to_json() + { + $cartItem = new CartItem(1, 'Some item', 10.00, ['size' => 'XL', 'color' => 'red']); + $cartItem->setQuantity(2); + + $this->assertJson($cartItem->toJson()); + + $json = '{"rowId":"07d5da5550494c62daf9993cf954303f","id":1,"name":"Some item","qty":2,"price":10,"options":{"size":"XL","color":"red"},"tax":"0.00","isSaved":false,"subtotal":"20.00"}'; + + $this->assertEquals($json, $cartItem->toJson()); + } +} diff --git a/packages/digital-bird/shoppingcart/tests/CartTest.php b/packages/digital-bird/shoppingcart/tests/CartTest.php new file mode 100644 index 0000000..4df29f0 --- /dev/null +++ b/packages/digital-bird/shoppingcart/tests/CartTest.php @@ -0,0 +1,945 @@ +set('cart.database.connection', 'testing'); + + $app['config']->set('session.driver', 'array'); + + $app['config']->set('database.default', 'testing'); + $app['config']->set('database.connections.testing', [ + 'driver' => 'sqlite', + 'database' => ':memory:', + 'prefix' => '', + ]); + } + + /** + * Setup the test environment. + * + * @return void + */ + protected function setUp() + { + parent::setUp(); + + $this->app->afterResolving('migrator', function ($migrator) { + $migrator->path(realpath(__DIR__.'/../database/migrations')); + }); + } + + /** @test */ + public function it_has_a_default_instance() + { + $cart = $this->getCart(); + + $this->assertEquals(Cart::DEFAULT_INSTANCE, $cart->currentInstance()); + } + + /** @test */ + public function it_can_have_multiple_instances() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'First item')); + + $cart->instance('wishlist')->add(new BuyableProduct(2, 'Second item')); + + $this->assertItemsInCart(1, $cart->instance(Cart::DEFAULT_INSTANCE)); + $this->assertItemsInCart(1, $cart->instance('wishlist')); + } + + /** @test */ + public function it_can_add_an_item() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $this->assertEquals(1, $cart->count()); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_will_return_the_cartitem_of_the_added_item() + { + Event::fake(); + + $cart = $this->getCart(); + + $cartItem = $cart->add(new BuyableProduct); + + $this->assertInstanceOf(CartItem::class, $cartItem); + $this->assertEquals('027c91341fd5cf4d2579b49c4b6a90da', $cartItem->rowId); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_can_add_multiple_buyable_items_at_once() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add([new BuyableProduct(1), new BuyableProduct(2)]); + + $this->assertEquals(2, $cart->count()); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_will_return_an_array_of_cartitems_when_you_add_multiple_items_at_once() + { + Event::fake(); + + $cart = $this->getCart(); + + $cartItems = $cart->add([new BuyableProduct(1), new BuyableProduct(2)]); + + $this->assertTrue(is_array($cartItems)); + $this->assertCount(2, $cartItems); + $this->assertContainsOnlyInstancesOf(CartItem::class, $cartItems); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_can_add_an_item_from_attributes() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(1, 'Test item', 1, 10.00); + + $this->assertEquals(1, $cart->count()); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_can_add_an_item_from_an_array() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(['id' => 1, 'name' => 'Test item', 'qty' => 1, 'price' => 10.00]); + + $this->assertEquals(1, $cart->count()); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_can_add_multiple_array_items_at_once() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add([ + ['id' => 1, 'name' => 'Test item 1', 'qty' => 1, 'price' => 10.00], + ['id' => 2, 'name' => 'Test item 2', 'qty' => 1, 'price' => 10.00] + ]); + + $this->assertEquals(2, $cart->count()); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_can_add_an_item_with_options() + { + Event::fake(); + + $cart = $this->getCart(); + + $options = ['size' => 'XL', 'color' => 'red']; + + $cart->add(new BuyableProduct, 1, $options); + + $cartItem = $cart->get('07d5da5550494c62daf9993cf954303f'); + + $this->assertInstanceOf(CartItem::class, $cartItem); + $this->assertEquals('XL', $cartItem->options->size); + $this->assertEquals('red', $cartItem->options->color); + + Event::assertDispatched('cart.added'); + } + + /** + * @test + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Please supply a valid identifier. + */ + public function it_will_validate_the_identifier() + { + $cart = $this->getCart(); + + $cart->add(null, 'Some title', 1, 10.00); + } + + /** + * @test + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Please supply a valid name. + */ + public function it_will_validate_the_name() + { + $cart = $this->getCart(); + + $cart->add(1, null, 1, 10.00); + } + + /** + * @test + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Please supply a valid quantity. + */ + public function it_will_validate_the_quantity() + { + $cart = $this->getCart(); + + $cart->add(1, 'Some title', 'invalid', 10.00); + } + + /** + * @test + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Please supply a valid price. + */ + public function it_will_validate_the_price() + { + $cart = $this->getCart(); + + $cart->add(1, 'Some title', 1, 'invalid'); + } + + /** @test */ + public function it_will_update_the_cart_if_the_item_already_exists_in_the_cart() + { + $cart = $this->getCart(); + + $item = new BuyableProduct; + + $cart->add($item); + $cart->add($item); + + $this->assertItemsInCart(2, $cart); + $this->assertRowsInCart(1, $cart); + } + + /** @test */ + public function it_will_keep_updating_the_quantity_when_an_item_is_added_multiple_times() + { + $cart = $this->getCart(); + + $item = new BuyableProduct; + + $cart->add($item); + $cart->add($item); + $cart->add($item); + + $this->assertItemsInCart(3, $cart); + $this->assertRowsInCart(1, $cart); + } + + /** @test */ + public function it_can_update_the_quantity_of_an_existing_item_in_the_cart() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->update('027c91341fd5cf4d2579b49c4b6a90da', 2); + + $this->assertItemsInCart(2, $cart); + $this->assertRowsInCart(1, $cart); + + Event::assertDispatched('cart.updated'); + } + + /** @test */ + public function it_can_update_an_existing_item_in_the_cart_from_a_buyable() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->update('027c91341fd5cf4d2579b49c4b6a90da', new BuyableProduct(1, 'Different description')); + + $this->assertItemsInCart(1, $cart); + $this->assertEquals('Different description', $cart->get('027c91341fd5cf4d2579b49c4b6a90da')->name); + + Event::assertDispatched('cart.updated'); + } + + /** @test */ + public function it_can_update_an_existing_item_in_the_cart_from_an_array() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->update('027c91341fd5cf4d2579b49c4b6a90da', ['name' => 'Different description']); + + $this->assertItemsInCart(1, $cart); + $this->assertEquals('Different description', $cart->get('027c91341fd5cf4d2579b49c4b6a90da')->name); + + Event::assertDispatched('cart.updated'); + } + + /** + * @test + * @expectedException \Gloudemans\Shoppingcart\Exceptions\InvalidRowIDException + */ + public function it_will_throw_an_exception_if_a_rowid_was_not_found() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->update('none-existing-rowid', new BuyableProduct(1, 'Different description')); + } + + /** @test */ + public function it_will_regenerate_the_rowid_if_the_options_changed() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct, 1, ['color' => 'red']); + + $cart->update('ea65e0bdcd1967c4b3149e9e780177c0', ['options' => ['color' => 'blue']]); + + $this->assertItemsInCart(1, $cart); + $this->assertEquals('7e70a1e9aaadd18c72921a07aae5d011', $cart->content()->first()->rowId); + $this->assertEquals('blue', $cart->get('7e70a1e9aaadd18c72921a07aae5d011')->options->color); + } + + /** @test */ + public function it_will_add_the_item_to_an_existing_row_if_the_options_changed_to_an_existing_rowid() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct, 1, ['color' => 'red']); + $cart->add(new BuyableProduct, 1, ['color' => 'blue']); + + $cart->update('7e70a1e9aaadd18c72921a07aae5d011', ['options' => ['color' => 'red']]); + + $this->assertItemsInCart(2, $cart); + $this->assertRowsInCart(1, $cart); + } + + /** @test */ + public function it_can_remove_an_item_from_the_cart() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->remove('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertItemsInCart(0, $cart); + $this->assertRowsInCart(0, $cart); + + Event::assertDispatched('cart.removed'); + } + + /** @test */ + public function it_will_remove_the_item_if_its_quantity_was_set_to_zero() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->update('027c91341fd5cf4d2579b49c4b6a90da', 0); + + $this->assertItemsInCart(0, $cart); + $this->assertRowsInCart(0, $cart); + + Event::assertDispatched('cart.removed'); + } + + /** @test */ + public function it_will_remove_the_item_if_its_quantity_was_set_negative() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->update('027c91341fd5cf4d2579b49c4b6a90da', -1); + + $this->assertItemsInCart(0, $cart); + $this->assertRowsInCart(0, $cart); + + Event::assertDispatched('cart.removed'); + } + + /** @test */ + public function it_can_get_an_item_from_the_cart_by_its_rowid() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertInstanceOf(CartItem::class, $cartItem); + } + + /** @test */ + public function it_can_get_the_content_of_the_cart() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1)); + $cart->add(new BuyableProduct(2)); + + $content = $cart->content(); + + $this->assertInstanceOf(Collection::class, $content); + $this->assertCount(2, $content); + } + + /** @test */ + public function it_will_return_an_empty_collection_if_the_cart_is_empty() + { + $cart = $this->getCart(); + + $content = $cart->content(); + + $this->assertInstanceOf(Collection::class, $content); + $this->assertCount(0, $content); + } + + /** @test */ + public function it_will_include_the_tax_and_subtotal_when_converted_to_an_array() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1)); + $cart->add(new BuyableProduct(2)); + + $content = $cart->content(); + + $this->assertInstanceOf(Collection::class, $content); + $this->assertEquals([ + '027c91341fd5cf4d2579b49c4b6a90da' => [ + 'rowId' => '027c91341fd5cf4d2579b49c4b6a90da', + 'id' => 1, + 'name' => 'Item name', + 'qty' => 1, + 'price' => 10.00, + 'tax' => 2.10, + 'subtotal' => 10.0, + 'isSaved' => false, + 'options' => [], + ], + '370d08585360f5c568b18d1f2e4ca1df' => [ + 'rowId' => '370d08585360f5c568b18d1f2e4ca1df', + 'id' => 2, + 'name' => 'Item name', + 'qty' => 1, + 'price' => 10.00, + 'tax' => 2.10, + 'subtotal' => 10.0, + 'isSaved' => false, + 'options' => [], + ] + ], $content->toArray()); + } + + /** @test */ + public function it_can_destroy_a_cart() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $this->assertItemsInCart(1, $cart); + + $cart->destroy(); + + $this->assertItemsInCart(0, $cart); + } + + /** @test */ + public function it_can_get_the_total_price_of_the_cart_content() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'First item', 10.00)); + $cart->add(new BuyableProduct(2, 'Second item', 25.00), 2); + + $this->assertItemsInCart(3, $cart); + $this->assertEquals(60.00, $cart->subtotal()); + } + + /** @test */ + public function it_can_return_a_formatted_total() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'First item', 1000.00)); + $cart->add(new BuyableProduct(2, 'Second item', 2500.00), 2); + + $this->assertItemsInCart(3, $cart); + $this->assertEquals('6.000,00', $cart->subtotal(2, ',', '.')); + } + + /** @test */ + public function it_can_search_the_cart_for_a_specific_item() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some item')); + $cart->add(new BuyableProduct(2, 'Another item')); + + $cartItem = $cart->search(function ($cartItem, $rowId) { + return $cartItem->name == 'Some item'; + }); + + $this->assertInstanceOf(Collection::class, $cartItem); + $this->assertCount(1, $cartItem); + $this->assertInstanceOf(CartItem::class, $cartItem->first()); + $this->assertEquals(1, $cartItem->first()->id); + } + + /** @test */ + public function it_can_search_the_cart_for_multiple_items() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some item')); + $cart->add(new BuyableProduct(2, 'Some item')); + $cart->add(new BuyableProduct(3, 'Another item')); + + $cartItem = $cart->search(function ($cartItem, $rowId) { + return $cartItem->name == 'Some item'; + }); + + $this->assertInstanceOf(Collection::class, $cartItem); + } + + /** @test */ + public function it_can_search_the_cart_for_a_specific_item_with_options() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some item'), 1, ['color' => 'red']); + $cart->add(new BuyableProduct(2, 'Another item'), 1, ['color' => 'blue']); + + $cartItem = $cart->search(function ($cartItem, $rowId) { + return $cartItem->options->color == 'red'; + }); + + $this->assertInstanceOf(Collection::class, $cartItem); + $this->assertCount(1, $cartItem); + $this->assertInstanceOf(CartItem::class, $cartItem->first()); + $this->assertEquals(1, $cartItem->first()->id); + } + + /** @test */ + public function it_will_associate_the_cart_item_with_a_model_when_you_add_a_buyable() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertContains(BuyableProduct::class, Assert::readAttribute($cartItem, 'associatedModel')); + } + + /** @test */ + public function it_can_associate_the_cart_item_with_a_model() + { + $cart = $this->getCart(); + + $cart->add(1, 'Test item', 1, 10.00); + + $cart->associate('027c91341fd5cf4d2579b49c4b6a90da', new ProductModel); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals(ProductModel::class, Assert::readAttribute($cartItem, 'associatedModel')); + } + + /** + * @test + * @expectedException \Gloudemans\Shoppingcart\Exceptions\UnknownModelException + * @expectedExceptionMessage The supplied model SomeModel does not exist. + */ + public function it_will_throw_an_exception_when_a_non_existing_model_is_being_associated() + { + $cart = $this->getCart(); + + $cart->add(1, 'Test item', 1, 10.00); + + $cart->associate('027c91341fd5cf4d2579b49c4b6a90da', 'SomeModel'); + } + + /** @test */ + public function it_can_get_the_associated_model_of_a_cart_item() + { + $cart = $this->getCart(); + + $cart->add(1, 'Test item', 1, 10.00); + + $cart->associate('027c91341fd5cf4d2579b49c4b6a90da', new ProductModel); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertInstanceOf(ProductModel::class, $cartItem->model); + $this->assertEquals('Some value', $cartItem->model->someValue); + } + + /** @test */ + public function it_can_calculate_the_subtotal_of_a_cart_item() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 9.99), 3); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals(29.97, $cartItem->subtotal); + } + + /** @test */ + public function it_can_return_a_formatted_subtotal() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 500), 3); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals('1.500,00', $cartItem->subtotal(2, ',', '.')); + } + + /** @test */ + public function it_can_calculate_tax_based_on_the_default_tax_rate_in_the_config() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 10.00), 1); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals(2.10, $cartItem->tax); + } + + /** @test */ + public function it_can_calculate_tax_based_on_the_specified_tax() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 10.00), 1); + + $cart->setTax('027c91341fd5cf4d2579b49c4b6a90da', 19); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals(1.90, $cartItem->tax); + } + + /** @test */ + public function it_can_return_the_calculated_tax_formatted() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 10000.00), 1); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals('2.100,00', $cartItem->tax(2, ',', '.')); + } + + /** @test */ + public function it_can_calculate_the_total_tax_for_all_cart_items() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 10.00), 1); + $cart->add(new BuyableProduct(2, 'Some title', 20.00), 2); + + $this->assertEquals(10.50, $cart->tax); + } + + /** @test */ + public function it_can_return_formatted_total_tax() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 1000.00), 1); + $cart->add(new BuyableProduct(2, 'Some title', 2000.00), 2); + + $this->assertEquals('1.050,00', $cart->tax(2, ',', '.')); + } + + /** @test */ + public function it_can_return_the_subtotal() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 10.00), 1); + $cart->add(new BuyableProduct(2, 'Some title', 20.00), 2); + + $this->assertEquals(50.00, $cart->subtotal); + } + + /** @test */ + public function it_can_return_formatted_subtotal() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 1000.00), 1); + $cart->add(new BuyableProduct(2, 'Some title', 2000.00), 2); + + $this->assertEquals('5000,00', $cart->subtotal(2, ',', '')); + } + + /** @test */ + public function it_can_return_cart_formated_numbers_by_config_values() + { + $this->setConfigFormat(2, ',', ''); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 1000.00), 1); + $cart->add(new BuyableProduct(2, 'Some title', 2000.00), 2); + + $this->assertEquals('5000,00', $cart->subtotal()); + $this->assertEquals('1050,00', $cart->tax()); + $this->assertEquals('6050,00', $cart->total()); + + $this->assertEquals('5000,00', $cart->subtotal); + $this->assertEquals('1050,00', $cart->tax); + $this->assertEquals('6050,00', $cart->total); + } + + /** @test */ + public function it_can_return_cartItem_formated_numbers_by_config_values() + { + $this->setConfigFormat(2, ',', ''); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 2000.00), 2); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals('2000,00', $cartItem->price()); + $this->assertEquals('2420,00', $cartItem->priceTax()); + $this->assertEquals('4000,00', $cartItem->subtotal()); + $this->assertEquals('4840,00', $cartItem->total()); + $this->assertEquals('420,00', $cartItem->tax()); + $this->assertEquals('840,00', $cartItem->taxTotal()); + } + + /** @test */ + public function it_can_store_the_cart_in_a_database() + { + $this->artisan('migrate', [ + '--database' => 'testing', + ]); + + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->store($identifier = 123); + + $serialized = serialize($cart->content()); + + $this->assertDatabaseHas('shoppingcart', ['identifier' => $identifier, 'instance' => 'default', 'content' => $serialized]); + + Event::assertDispatched('cart.stored'); + } + + /** @test */ + public function it_can_update_the_cart_in_database() + { + $this->artisan('migrate', [ + '--database' => 'testing', + ]); + + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->store($identifier = 123); + + $serialized = serialize($cart->content()); + + $this->assertDatabaseHas('shoppingcart', ['identifier' => $identifier, 'instance' => 'default', 'content' => $serialized]); + + Event::assertDispatched('cart.stored'); + } + + /** @test */ + public function it_can_restore_a_cart_from_the_database() + { + $this->artisan('migrate', [ + '--database' => 'testing', + ]); + + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->store($identifier = 123); + + $cart->destroy(); + + $this->assertItemsInCart(0, $cart); + + $cart->restore($identifier); + + $this->assertItemsInCart(1, $cart); + + Event::assertDispatched('cart.restored'); + } + + /** @test */ + public function it_will_just_keep_the_current_instance_if_no_cart_with_the_given_identifier_was_stored() + { + $this->artisan('migrate', [ + '--database' => 'testing', + ]); + + $cart = $this->getCart(); + + $cart->restore($identifier = 123); + + $this->assertItemsInCart(0, $cart); + } + + /** @test */ + public function it_can_calculate_all_values() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'First item', 10.00), 2); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $cart->setTax('027c91341fd5cf4d2579b49c4b6a90da', 19); + + $this->assertEquals(10.00, $cartItem->price(2)); + $this->assertEquals(11.90, $cartItem->priceTax(2)); + $this->assertEquals(20.00, $cartItem->subtotal(2)); + $this->assertEquals(23.80, $cartItem->total(2)); + $this->assertEquals(1.90, $cartItem->tax(2)); + $this->assertEquals(3.80, $cartItem->taxTotal(2)); + + $this->assertEquals(20.00, $cart->subtotal(2)); + $this->assertEquals(23.80, $cart->total(2)); + $this->assertEquals(3.80, $cart->tax(2)); + } + + /** @test */ + public function it_will_destroy_the_cart_when_the_user_logs_out_and_the_config_setting_was_set_to_true() + { + $this->app['config']->set('cart.destroy_on_logout', true); + + $this->app->instance(SessionManager::class, Mockery::mock(SessionManager::class, function ($mock) { + $mock->shouldReceive('forget')->once()->with('cart'); + })); + + $user = Mockery::mock(Authenticatable::class); + + $guard = $this->app->make('auth'); + + event(new Logout($guard, $user)); + } + + /** + * Get an instance of the cart. + * + * @return \Gloudemans\Shoppingcart\Cart + */ + private function getCart() + { + $session = $this->app->make('session'); + $events = $this->app->make('events'); + + return new Cart($session, $events); + } + + /** + * Set the config number format. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + */ + private function setConfigFormat($decimals, $decimalPoint, $thousandSeperator) + { + $this->app['config']->set('cart.format.decimals', $decimals); + $this->app['config']->set('cart.format.decimal_point', $decimalPoint); + $this->app['config']->set('cart.format.thousand_seperator', $thousandSeperator); + } +} diff --git a/packages/digital-bird/shoppingcart/tests/Fixtures/BuyableProduct.php b/packages/digital-bird/shoppingcart/tests/Fixtures/BuyableProduct.php new file mode 100644 index 0000000..a58e830 --- /dev/null +++ b/packages/digital-bird/shoppingcart/tests/Fixtures/BuyableProduct.php @@ -0,0 +1,67 @@ +id = $id; + $this->name = $name; + $this->price = $price; + } + + /** + * Get the identifier of the Buyable item. + * + * @return int|string + */ + public function getBuyableIdentifier($options = null) + { + return $this->id; + } + + /** + * Get the description or title of the Buyable item. + * + * @return string + */ + public function getBuyableDescription($options = null) + { + return $this->name; + } + + /** + * Get the price of the Buyable item. + * + * @return float + */ + public function getBuyablePrice($options = null) + { + return $this->price; + } +} \ No newline at end of file diff --git a/packages/digital-bird/shoppingcart/tests/Fixtures/ProductModel.php b/packages/digital-bird/shoppingcart/tests/Fixtures/ProductModel.php new file mode 100644 index 0000000..70494ca --- /dev/null +++ b/packages/digital-bird/shoppingcart/tests/Fixtures/ProductModel.php @@ -0,0 +1,13 @@ +getKey() : $this->id; + } + + /** + * Get the description or title of the Buyable item. + * + * @return string + */ + public function getBuyableDescription($options = null) + { + if(property_exists($this, 'name')) return $this->name; + if(property_exists($this, 'title')) return $this->title; + if(property_exists($this, 'description')) return $this->description; + + return null; + } + + /** + * Get the price of the Buyable item. + * + * @return float + */ + public function getBuyablePrice($options = null) + { + if(property_exists($this, 'price')) return $this->price; + + return null; + } +} \ No newline at end of file diff --git a/packages/shoppingcart/Cart.php b/packages/shoppingcart/Cart.php new file mode 100644 index 0000000..eaaf942 --- /dev/null +++ b/packages/shoppingcart/Cart.php @@ -0,0 +1,686 @@ +session = $session; + $this->events = $events; + $this->extraCosts = new Collection(); + + $this->instance(self::DEFAULT_INSTANCE); + } + + /** + * Set the current cart instance. + * + * @param string|null $instance + * @return Cart + */ + public function instance($instance = null) + { + $instance = $instance ?: self::DEFAULT_INSTANCE; + + $this->instance = sprintf('%s.%s', 'cart', $instance); + + return $this; + } + + /** + * Get the current cart instance. + * + * @return string + */ + public function currentInstance() + { + return str_replace('cart.', '', $this->instance); + } + + /** + * Add an item to the cart. + * + * @param mixed $id + * @param mixed $name + * @param int|float $qty + * @param float $price + * @param array $options + * @return CartItem + */ + public function add($id, $name = null, $qty = null, $price = null, array $options = []) + { + if ($this->isMulti($id)) { + return array_map(function ($item) { + return $this->add($item); + }, $id); + } + + $cartItem = $this->createCartItem($id, $name, $qty, $price, $options); + + $content = $this->getContent(); + + if ($content->has($cartItem->rowId)) { + $cartItem->qty += $content->get($cartItem->rowId)->qty; + } + + $content->put($cartItem->rowId, $cartItem); + + $this->events->dispatch('cart.added', $cartItem); + + $this->session->put($this->instance, $content); + + return $cartItem; + } + + /** + * Sets/adds an additional cost on the cart. + * + * @param string $name + * @param float $price + * @todo add in session + */ + public function addCost($name, $price) + { + $oldCost = $this->extraCosts->pull($name, 0); + + $this->extraCosts->put($name, $price + $oldCost); + } + + /** + * Gets an additional cost by name + * + * @param $name + * @param int|null $decimals + * @param string|null $decimalPoint + * @param string|null $thousandSeparator + * @return string + */ + public function getCost($name) + { + $cost = $this->extraCosts->get($name, 0); + + return $this->numberFormat($cost); + } + + /** + * Update the cart item with the given rowId. + * + * @param string $rowId + * @param mixed $qty + * @return CartItem + */ + public function update($rowId, $qty) + { + $cartItem = $this->get($rowId); + + if ($qty instanceof Buyable) { + $cartItem->updateFromBuyable($qty); + } elseif (is_array($qty)) { + $cartItem->updateFromArray($qty); + } else { + $cartItem->qty = $qty; + } + + $content = $this->getContent(); + + if ($rowId !== $cartItem->rowId) { + $content->pull($rowId); + + if ($content->has($cartItem->rowId)) { + $existingCartItem = $this->get($cartItem->rowId); + $cartItem->setQuantity($existingCartItem->qty + $cartItem->qty); + } + } + + if ($cartItem->qty <= 0) { + $this->remove($cartItem->rowId); + return; + } else { + $content->put($cartItem->rowId, $cartItem); + } + + $this->events->dispatch('cart.updated', $cartItem); + + $this->session->put($this->instance, $content); + + return $cartItem; + } + + /** + * Remove the cart item with the given rowId from the cart. + * + * @param string $rowId + * @return void + */ + public function remove($rowId) + { + $cartItem = $this->get($rowId); + + $content = $this->getContent(); + + $content->pull($cartItem->rowId); + + $this->events->dispatch('cart.removed', $cartItem); + + $this->session->put($this->instance, $content); + } + + /** + * Get a cart item from the cart by its rowId. + * + * @param string $rowId + * @return CartItem + */ + public function get($rowId) + { + $content = $this->getContent(); + + if ( ! $content->has($rowId)) + throw new InvalidRowIDException("The cart does not contain rowId {$rowId}."); + + return $content->get($rowId); + } + + /** + * Destroy the current cart instance. + * + * @return void + */ + public function destroy() + { + $this->session->remove($this->instance); + } + + /** + * Get the content of the cart. + * + * @return Collection + */ + public function content() + { + if (is_null($this->session->get($this->instance))) { + return new Collection(); + } + + return $this->session->get($this->instance); + } + + /** + * Get the number of items in the cart. + * + * @return int|float + */ + public function count() + { + $content = $this->getContent(); + + return $content->sum('qty'); + } + + /** + * Get the total price of the items in the cart. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeparator + * @return string + */ + public function total() + { + $content = $this->getContent(); + + $total = $content->reduce(function ($total, CartItem $cartItem) { + return $total + ($cartItem->qty * $cartItem->priceTax); + }, 0); + + $totalCost = $this->extraCosts->reduce(function ($total, $cost) { + return $total + $cost; + }, 0); + + $total += $totalCost; + + return $this->numberFormat($total); + } + + /** + * Get the total tax of the items in the cart. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeparator + * @return float + */ + public function tax() + { + $content = $this->getContent(); + + $tax = $content->reduce(function ($tax, CartItem $cartItem) { + return $tax + ($cartItem->qty * $cartItem->tax); + }, 0); + + return $this->numberFormat($tax); + } + + /** + * Get the subtotal (total - tax) of the items in the cart. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeparator + * @return float + */ + public function subtotal() + { + $content = $this->getContent(); + + $subTotal = $content->reduce(function ($subTotal, CartItem $cartItem) { + return $subTotal + ($cartItem->qty * $cartItem->price); + }, 0); + + return $this->numberFormat($subTotal); + } + + /** + * Search the cart content for a cart item matching the given search closure. + * + * @param \Closure $search + * @return Collection + */ + public function search(Closure $search) + { + $content = $this->getContent(); + + return $content->filter($search); + } + + /** + * Associate the cart item with the given rowId with the given model. + * + * @param string $rowId + * @param mixed $model + * @return void + */ + public function associate($rowId, $model) + { + if(is_string($model) && ! class_exists($model)) { + throw new UnknownModelException("The supplied model {$model} does not exist."); + } + + $cartItem = $this->get($rowId); + + $cartItem->associate($model); + + $content = $this->getContent(); + + $content->put($cartItem->rowId, $cartItem); + + $this->session->put($this->instance, $content); + } + + /** + * Set the tax rate for the cart item with the given rowId. + * + * @param string $rowId + * @param int|float $taxRate + * @return void + */ + public function setTax($rowId, $taxRate) + { + $cartItem = $this->get($rowId); + + $cartItem->setTaxRate($taxRate); + + $content = $this->getContent(); + + $content->put($cartItem->rowId, $cartItem); + + $this->session->put($this->instance, $content); + } + + /** + * Store an the current instance of the cart. + * + * @param mixed $identifier + * @return void + */ + public function store($identifier) + { + $content = $this->getContent(); + + if ($identifier instanceof InstanceIdentifier) { + $identifier = $identifier->getInstanceIdentifier(); + } + + $instance = $this->currentInstance(); + + if ($this->storedCartInstanceWithIdentifierExists($instance, $identifier)) { + throw new CartAlreadyStoredException("A cart with identifier {$identifier} was already stored."); + } + + $this->getConnection()->table($this->getTableName())->insert([ + 'identifier' => $identifier, + 'instance' => $instance, + 'content' => serialize($content), + 'created_at' => $this->createdAt ?: Carbon::now(), + 'updated_at' => Carbon::now(), + ]); + + $this->events->dispatch('cart.stored'); + + } + + /** + * @param $identifier + * + * @return bool + */ + private function storedCartInstanceWithIdentifierExists($instance, $identifier) + { + return $this->getConnection()->table($this->getTableName())->where(['identifier' => $identifier, 'instance'=> $instance])->exists(); + } + + + /** + * Restore the cart with the given identifier. + * + * @param mixed $identifier + * @return void + */ + public function restore($identifier) + { + if ($identifier instanceof InstanceIdentifier) { + $identifier = $identifier->getInstanceIdentifier(); + } + + $currentInstance = $this->currentInstance(); + + if (!$this->storedCartInstanceWithIdentifierExists($currentInstance, $identifier)) { + return; + } + + $stored = $this->getConnection()->table($this->getTableName()) + ->where(['identifier'=> $identifier, 'instance' => $currentInstance])->first(); + + $storedContent = unserialize(data_get($stored, 'content')); + + $this->instance(data_get($stored, 'instance')); + + $content = $this->getContent(); + + foreach ($storedContent as $cartItem) { + $content->put($cartItem->rowId, $cartItem); + } + + $this->events->dispatch('cart.restored'); + + $this->session->put($this->instance, $content); + + $this->instance($currentInstance); + + $this->createdAt = Carbon::parse(data_get($stored, 'created_at')); + $this->updatedAt = Carbon::parse(data_get($stored, 'updated_at')); + + $this->getConnection()->table($this->getTableName())->where(['identifier' => $identifier, 'instance' => $currentInstance])->delete(); + + } + + /** + * Merges the contents of another cart into this cart. + * + * @param mixed $identifier Identifier of the Cart to merge with. + * @param bool $keepDiscount Keep the discount of the CartItems. + * @param bool $keepTax Keep the tax of the CartItems. + * @param bool $dispatchAdd Flag to dispatch the add events. + * + * @return bool + */ + public function merge($identifier, $keepTax = false, $dispatchAdd = true, $instance = self::DEFAULT_INSTANCE) + { + if (!$this->storedCartInstanceWithIdentifierExists($instance, $identifier)) { + return false; + } + + $stored = $this->getConnection()->table($this->getTableName()) + ->where(['identifier'=> $identifier, 'instance'=> $instance])->first(); + + $storedContent = unserialize($stored->content); + + foreach ($storedContent as $cartItem) { + $this->addCartItem($cartItem, $keepTax, $dispatchAdd); + } + + $this->events->dispatch('cart.merged'); + + return true; + } + + /** + * Add an item to the cart. + * + * @param \Gloudemans\Shoppingcart\CartItem $item Item to add to the Cart + * @param bool $keepDiscount Keep the discount rate of the Item + * @param bool $keepTax Keep the Tax rate of the Item + * @param bool $dispatchEvent + * + * @return \Gloudemans\Shoppingcart\CartItem The CartItem + */ + public function addCartItem($item, $keepTax = false, $dispatchEvent = true) + { + if (!$keepTax) { + $item->setTaxRate($this->taxRate); + } + + $content = $this->getContent(); + + if ($content->has($item->rowId)) { + $item->qty += $content->get($item->rowId)->qty; + } + + $content->put($item->rowId, $item); + + if ($dispatchEvent) { + $this->events->dispatch('cart.adding', $item); + } + + $this->session->put($this->instance, $content); + + if ($dispatchEvent) { + $this->events->dispatch('cart.added', $item); + } + + return $item; + } + + /** + * Magic method to make accessing the total, tax and subtotal properties possible. + * + * @param string $attribute + * @return float|null + */ + public function __get($attribute) + { + if($attribute === 'total') { + return $this->total(); + } + + if($attribute === 'tax') { + return $this->tax(); + } + + if($attribute === 'subtotal') { + return $this->subtotal(); + } + + return null; + } + + /** + * Get the carts content, if there is no cart content set yet, return a new empty Collection + * + * @return Collection + */ + protected function getContent() + { + $content = $this->session->has($this->instance) + ? $this->session->get($this->instance) + : new Collection; + + return $content; + } + + /** + * Create a new CartItem from the supplied attributes. + * + * @param mixed $id + * @param mixed $name + * @param int|float $qty + * @param float $price + * @param array $options + * @return CartItem + */ + private function createCartItem($id, $name, $qty, $price, array $options) + { + if ($id instanceof Buyable) { + $cartItem = CartItem::fromBuyable($id, $qty ?: []); + $cartItem->setQuantity($name ?: 1); + $cartItem->associate($id); + } elseif (is_array($id)) { + $cartItem = CartItem::fromArray($id); + $cartItem->setQuantity($id['qty']); + } else { + $cartItem = CartItem::fromAttributes($id, $name, $price, $options); + $cartItem->setQuantity($qty); + } + + $cartItem->setTaxRate(config('cart.tax')); + + return $cartItem; + } + + /** + * Check if the item is a multidimensional array or an array of Buyables. + * + * @param mixed $item + * @return bool + */ + private function isMulti($item) + { + if ( ! is_array($item)) return false; + + return is_array(head($item)) || head($item) instanceof Buyable; + } + + /** + * @param $identifier + * @return bool + */ + private function storedCartWithIdentifierExists($identifier) + { + return $this->getConnection()->table($this->getTableName())->where('identifier', $identifier)->exists(); + } + + /** + * Get the database connection. + * + * @return Connection + */ + private function getConnection() + { + $connectionName = $this->getConnectionName(); + + return app(DatabaseManager::class)->connection($connectionName); + } + + /** + * Get the database table name. + * + * @return string + */ + private function getTableName() + { + return 'shopping_cart'; + } + + /** + * Get the database connection name. + * + * @return string + */ + private function getConnectionName() + { + $connection = config('cart.database.connection'); + + return is_null($connection) ? config('database.default') : $connection; + } + + /** + * Get the Formated number + * + * @param $value + * @param $decimals + * @param $decimalPoint + * @param $thousandSeparator + * @return string + */ + private function numberFormat($value) + { + $decimals = is_null(config('cart.format.decimals')) ? 2 : config('cart.format.decimals'); + $decimalPoint = is_null(config('cart.format.decimal_point')) ? '.' : config('cart.format.decimal_point'); + $thousandSeparator = ''; + + return number_format($value, $decimals, $decimalPoint, $thousandSeparator); + } +} diff --git a/packages/shoppingcart/CartItem.php b/packages/shoppingcart/CartItem.php new file mode 100644 index 0000000..4e74020 --- /dev/null +++ b/packages/shoppingcart/CartItem.php @@ -0,0 +1,386 @@ +id = $id; + $this->name = $name; + $this->price = floatval($price); + $this->options = new CartItemOptions($options); + $this->rowId = $this->generateRowId($id, $options); + } + + /** + * Returns the formatted price without TAX. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeparator + * @return string + */ + public function price() + { + return $this->numberFormat($this->price); + } + + /** + * Returns the formatted price with TAX. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeparator + * @return string + */ + public function priceTax() + { + return $this->numberFormat($this->priceTax); + } + + /** + * Returns the formatted subtotal. + * Subtotal is price for whole CartItem without TAX + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeparator + * @return string + */ + public function subtotal() + { + return $this->numberFormat($this->subtotal); + } + + /** + * Returns the formatted total. + * Total is price for whole CartItem with TAX + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeparator + * @return string + */ + public function total() + { + return $this->numberFormat($this->total); + } + + /** + * Returns the formatted tax. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeparator + * @return string + */ + public function tax() + { + return $this->numberFormat($this->tax); + } + + /** + * Returns the formatted tax. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeparator + * @return string + */ + public function taxTotal() + { + return $this->numberFormat($this->taxTotal); + } + + /** + * Set the quantity for this cart item. + * + * @param int|float $qty + */ + public function setQuantity($qty) + { + if(empty($qty) || ! is_numeric($qty)) + throw new \InvalidArgumentException('Please supply a valid quantity.'); + + $this->qty = $qty; + } + + /** + * Update the cart item from a Buyable. + * + * @param Buyable $item + * @return void + */ + public function updateFromBuyable(Buyable $item) + { + $this->id = $item->getBuyableIdentifier($this->options); + $this->name = $item->getBuyableDescription($this->options); + $this->price = $item->getBuyablePrice($this->options); + $this->priceTax = $this->price + $this->tax; + } + + /** + * Update the cart item from an array. + * + * @param array $attributes + * @return void + */ + public function updateFromArray(array $attributes) + { + $this->id = Arr::get($attributes, 'id', $this->id); + $this->qty = Arr::get($attributes, 'qty', $this->qty); + $this->name = Arr::get($attributes, 'name', $this->name); + $this->price = Arr::get($attributes, 'price', $this->price); + $this->priceTax = $this->price + $this->tax; + $this->options = new CartItemOptions(Arr::get($attributes, 'options', $this->options)); + + $this->rowId = $this->generateRowId($this->id, $this->options->all()); + } + + /** + * Associate the cart item with the given model. + * + * @param mixed $model + * @return CartItem + */ + public function associate($model) + { + $this->associatedModel = is_string($model) ? $model : get_class($model); + + return $this; + } + + /** + * Set the tax rate. + * + * @param int|float $taxRate + * @return CartItem + */ + public function setTaxRate($taxRate) + { + $this->taxRate = $taxRate; + + return $this; + } + + /** + * Get an attribute from the cart item or get the associated model. + * + * @param string $attribute + * @return mixed + */ + public function __get($attribute) + { + if(property_exists($this, $attribute)) { + return $this->{$attribute}; + } + + if($attribute === 'priceTax') { + return number_format($this->price + $this->tax, 2, '.', ''); + } + + if($attribute === 'subtotal') { + return number_format($this->qty * $this->price, 2, '.', ''); + } + + if($attribute === 'total') { + return number_format($this->qty * $this->priceTax, 2, '.', ''); + } + + if($attribute === 'tax') { + return number_format($this->price * ($this->taxRate / 100), 2, '.', ''); + } + + if($attribute === 'taxTotal') { + return number_format($this->tax * $this->qty, 2, '.', ''); + } + + if($attribute === 'model' && isset($this->associatedModel)) { + return with(new $this->associatedModel)->find($this->id); + } + + return null; + } + + /** + * Create a new instance from a Buyable. + * + * @param Buyable $item + * @param array $options + * @return CartItem + */ + public static function fromBuyable(Buyable $item, array $options = []) + { + return new self($item->getBuyableIdentifier($options), $item->getBuyableDescription($options), $item->getBuyablePrice($options), $options); + } + + /** + * Create a new instance from the given array. + * + * @param array $attributes + * @return CartItem + */ + public static function fromArray(array $attributes) + { + $options = Arr::get($attributes, 'options', []); + + return new self($attributes['id'], $attributes['name'], $attributes['price'], $options); + } + + /** + * Create a new instance from the given attributes. + * + * @param int|string $id + * @param string $name + * @param float $price + * @param array $options + * @return CartItem + */ + public static function fromAttributes($id, $name, $price, array $options = []) + { + return new self($id, $name, $price, $options); + } + + /** + * Generate a unique id for the cart item. + * + * @param string $id + * @param array $options + * @return string + */ + protected function generateRowId($id, array $options) + { + ksort($options); + + return md5($id . serialize($options)); + } + + /** + * Get the instance as an array. + * + * @return array + */ + public function toArray() + { + return [ + 'rowId' => $this->rowId, + 'id' => $this->id, + 'name' => $this->name, + 'qty' => $this->qty, + 'price' => $this->price, + 'options' => $this->options->toArray(), + 'tax' => $this->tax, + 'subtotal' => $this->subtotal + ]; + } + + /** + * Convert the object to its JSON representation. + * + * @param int $options + * @return string + */ + public function toJson($options = 0) + { + return json_encode($this->toArray(), $options); + } + + /** + * Get the formatted number. + * + * @param float $value + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeparator + * @return string + */ + private function numberFormat($value) + { + $decimals = is_null(config('cart.format.decimals')) ? 2 : config('cart.format.decimals'); + $decimalPoint = is_null(config('cart.format.decimal_point')) ? '.' : config('cart.format.decimal_point'); + $thousandSeparator = ''; + + return number_format($value, $decimals, $decimalPoint, $thousandSeparator); + } +} diff --git a/packages/shoppingcart/CartItemOptions.php b/packages/shoppingcart/CartItemOptions.php new file mode 100644 index 0000000..18b9552 --- /dev/null +++ b/packages/shoppingcart/CartItemOptions.php @@ -0,0 +1,19 @@ +get($key); + } +} \ No newline at end of file diff --git a/packages/shoppingcart/Contracts/Buyable.php b/packages/shoppingcart/Contracts/Buyable.php new file mode 100644 index 0000000..aeb9509 --- /dev/null +++ b/packages/shoppingcart/Contracts/Buyable.php @@ -0,0 +1,27 @@ +app->bind('cart', 'Gloudemans\Shoppingcart\Cart'); + + $config = __DIR__ . '/../config/cart.php'; + $this->mergeConfigFrom($config, 'cart'); + + $this->publishes([__DIR__ . '/../config/cart.php' => config_path('cart.php')], 'config'); + + $this->app['events']->listen(Logout::class, function () { + if ($this->app['config']->get('cart.destroy_on_logout')) { + $this->app->make(SessionManager::class)->forget('cart'); + } + }); + + if ( ! class_exists('CreateShoppingcartTable')) { + // Publish the migration + $timestamp = date('Y_m_d_His', time()); + + $this->publishes([ + __DIR__ . '/../database/migrations/0000_00_00_000000_create_shopping_cart_table.php' => database_path('migrations/'.$timestamp.'_create_shoppingcart_table.php'), + ], 'migrations'); + } + } +} diff --git a/packages/shoppingcart/_info/LICENSE b/packages/shoppingcart/_info/LICENSE new file mode 100644 index 0000000..61c6afc --- /dev/null +++ b/packages/shoppingcart/_info/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Rob Gloudemans + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/packages/shoppingcart/_info/README.md b/packages/shoppingcart/_info/README.md new file mode 100644 index 0000000..de8f5ab --- /dev/null +++ b/packages/shoppingcart/_info/README.md @@ -0,0 +1,477 @@ +## LaravelShoppingcart + +A simple shopping cart implementation for Laravel 7 & 8 & 9 & 10. + +## Installation + +Install the package through [Composer](http://getcomposer.org/). + +Run the Composer require command from the Terminal: + + composer require mindscms/laravelshoppingcart + +### Laravel <= 7.0 + +Should you still be on version 7.0 of Laravel, the final steps for you are to add the service provider of the package and alias the package. To do this open your `config/app.php` file. + +Add a new line to the `providers` array: + + Gloudemans\Shoppingcart\ShoppingcartServiceProvider::class + +And optionally add a new line to the `aliases` array: + + 'Cart' => Gloudemans\Shoppingcart\Facades\Cart::class, + +Now you're ready to start using the shopping cart in your application. + +**As of version 2 of this package it's possibly to use dependency injection to inject an instance of the Cart class into your controller or other class** + +## Overview +Look at one of the following topics to learn more about LaravelShoppingcart + +* [Usage](#usage) +* [Collections](#collections) +* [Instances](#instances) +* [Models](#models) +* [Database](#database) +* [Exceptions](#exceptions) +* [Events](#events) +* [Example](#example) + +## Usage + +The shoppingcart gives you the following methods to use: + +### Cart::add() + +Adding an item to the cart is really simple, you just use the `add()` method, which accepts a variety of parameters. + +In its most basic form you can specify the id, name, quantity, price of the product you'd like to add to the cart. + +```php +Cart::add('293ad', 'Product 1', 1, 9.99); +``` + +As an optional fifth parameter you can pass it options, so you can add multiple items with the same id, but with (for instance) a different size. + +```php +Cart::add('293ad', 'Product 1', 1, 9.99, ['size' => 'large']); +``` + +**The `add()` method will return an CartItem instance of the item you just added to the cart.** + +Maybe you prefer to add the item using an array? As long as the array contains the required keys, you can pass it to the method. The options key is optional. + +```php +Cart::add(['id' => '293ad', 'name' => 'Product 1', 'qty' => 1, 'price' => 9.99, 'options' => ['size' => 'large']]); +``` + +New in version 2 of the package is the possibility to work with the `Buyable` interface. The way this works is that you have a model implement the `Buyable` interface, which will make you implement a few methods so the package knows how to get the id, name and price from your model. +This way you can just pass the `add()` method a model and the quantity and it will automatically add it to the cart. + +**As an added bonus it will automatically associate the model with the CartItem** + +```php +Cart::add($product, 1, ['size' => 'large']); +``` +As an optional third parameter you can add options. +```php +Cart::add($product, 1, ['size' => 'large']); +``` + +Finally, you can also add multipe items to the cart at once. +You can just pass the `add()` method an array of arrays, or an array of Buyables and they will be added to the cart. + +**When adding multiple items to the cart, the `add()` method will return an array of CartItems.** + +```php +Cart::add([ + ['id' => '293ad', 'name' => 'Product 1', 'qty' => 1, 'price' => 10.00], + ['id' => '4832k', 'name' => 'Product 2', 'qty' => 1, 'price' => 10.00, 'options' => ['size' => 'large']] +]); + +Cart::add([$product1, $product2]); + +``` + +### Cart::update() + +To update an item in the cart, you'll first need the rowId of the item. +Next you can use the `update()` method to update it. + +If you simply want to update the quantity, you'll pass the update method the rowId and the new quantity: + +```php +$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709'; + +Cart::update($rowId, 2); // Will update the quantity +``` + +If you want to update more attributes of the item, you can either pass the update method an array or a `Buyable` as the second parameter. This way you can update all information of the item with the given rowId. + +```php +Cart::update($rowId, ['name' => 'Product 1']); // Will update the name + +Cart::update($rowId, $product); // Will update the id, name and price + +``` + +### Cart::remove() + +To remove an item for the cart, you'll again need the rowId. This rowId you simply pass to the `remove()` method and it will remove the item from the cart. + +```php +$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709'; + +Cart::remove($rowId); +``` + +### Cart::get() + +If you want to get an item from the cart using its rowId, you can simply call the `get()` method on the cart and pass it the rowId. + +```php +$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709'; + +Cart::get($rowId); +``` + +### Cart::content() + +Of course you also want to get the carts content. This is where you'll use the `content` method. This method will return a Collection of CartItems which you can iterate over and show the content to your customers. + +```php +Cart::content(); +``` + +This method will return the content of the current cart instance, if you want the content of another instance, simply chain the calls. + +```php +Cart::instance('wishlist')->content(); +``` + +### Cart::destroy() + +If you want to completely remove the content of a cart, you can call the destroy method on the cart. This will remove all CartItems from the cart for the current cart instance. + +```php +Cart::destroy(); +``` + +### Cart::total() + +The `total()` method can be used to get the calculated total of all items in the cart, given there price and quantity. Includes any additional costs too. + +```php +Cart::total(); +``` + +The method will automatically format the result, which you can tweak using the three optional parameters + +```php +Cart::total($decimals, $decimalSeperator, $thousandSeperator); +``` + +You can set the default number format in the config file. + +**If you're not using the Facade, but use dependency injection in your (for instance) Controller, you can also simply get the total property `$cart->total`** + +### Cart::tax() + +The `tax()` method can be used to get the calculated amount of tax for all items in the cart, given there price and quantity. + +```php +Cart::tax(); +``` + +The method will automatically format the result, which you can tweak using the three optional parameters + +```php +Cart::tax($decimals, $decimalSeperator, $thousandSeperator); +``` + +You can set the default number format in the config file. + +**If you're not using the Facade, but use dependency injection in your (for instance) Controller, you can also simply get the tax property `$cart->tax`** + +### Cart::subtotal() + +The `subtotal()` method can be used to get the total of all items in the cart, minus the total amount of tax. + +```php +Cart::subtotal(); +``` + +The method will automatically format the result, which you can tweak using the three optional parameters + +```php +Cart::subtotal($decimals, $decimalSeperator, $thousandSeperator); +``` + +You can set the default number format in the config file. + +**If you're not using the Facade, but use dependency injection in your (for instance) Controller, you can also simply get the subtotal property `$cart->subtotal`** + +### Cart::count() + +If you want to know how many items there are in your cart, you can use the `count()` method. This method will return the total number of items in the cart. So if you've added 2 books and 1 shirt, it will return 3 items. + +```php +Cart::count(); +``` + +### Cart::search() + +To find an item in the cart, you can use the `search()` method. + +**This method was changed on version 2** + +Behind the scenes, the method simply uses the filter method of the Laravel Collection class. This means you must pass it a Closure in which you'll specify you search terms. + +If you for instance want to find all items with an id of 1: + +```php +$cart->search(function ($cartItem, $rowId) { + return $cartItem->id === 1; +}); +``` + +As you can see the Closure will receive two parameters. The first is the CartItem to perform the check against. The second parameter is the rowId of this CartItem. + +**The method will return a Collection containing all CartItems that where found** + +This way of searching gives you total control over the search process and gives you the ability to create very precise and specific searches. + +### Cart::addCost() + +If you want to add additional costs to the cart you can use the `addCost()` method. The method accepts a cost name and the price of the cost. This can be used for eg shipping or transaction costs. + +```php +Cart::addCost($name, $price) +``` + +**Add this method before summarizing the whole cart. The costs are not saved in the session (yet).** + +### Cart::getCost() + +Get an addition cost you added by `addCost()`. Accepts the cost name. Returns the formatted price of the cost. + +```php +Cart::getCost($name, $decimals, $decimalPoint, $thousandSeperator) +``` + +## Collections + +On multiple instances the Cart will return to you a Collection. This is just a simple Laravel Collection, so all methods you can call on a Laravel Collection are also available on the result. + +As an example, you can quicky get the number of unique products in a cart: + +```php +Cart::content()->count(); +``` + +Or you can group the content by the id of the products: + +```php +Cart::content()->groupBy('id'); +``` + +## Instances + +The packages supports multiple instances of the cart. The way this works is like this: + +You can set the current instance of the cart by calling `Cart::instance('newInstance')`. From this moment, the active instance of the cart will be `newInstance`, so when you add, remove or get the content of the cart, you're work with the `newInstance` instance of the cart. +If you want to switch instances, you just call `Cart::instance('otherInstance')` again, and you're working with the `otherInstance` again. + +So a little example: + +```php +Cart::instance('shopping')->add('192ao12', 'Product 1', 1, 9.99); + +// Get the content of the 'shopping' cart +Cart::content(); + +Cart::instance('wishlist')->add('sdjk922', 'Product 2', 1, 19.95, ['size' => 'medium']); + +// Get the content of the 'wishlist' cart +Cart::content(); + +// If you want to get the content of the 'shopping' cart again +Cart::instance('shopping')->content(); + +// And the count of the 'wishlist' cart again +Cart::instance('wishlist')->count(); +``` + +**N.B. Keep in mind that the cart stays in the last set instance for as long as you don't set a different one during script execution.** + +**N.B.2 The default cart instance is called `default`, so when you're not using instances,`Cart::content();` is the same as `Cart::instance('default')->content()`.** + +## Models + +Because it can be very convenient to be able to directly access a model from a CartItem is it possible to associate a model with the items in the cart. Let's say you have a `Product` model in your application. With the `associate()` method, you can tell the cart that an item in the cart, is associated to the `Product` model. + +That way you can access your model right from the `CartItem`! + +The model can be accessed via the `model` property on the CartItem. + +**If your model implements the `Buyable` interface and you used your model to add the item to the cart, it will associate automatically.** + +Here is an example: + +```php + +// First we'll add the item to the cart. +$cartItem = Cart::add('293ad', 'Product 1', 1, 9.99, ['size' => 'large']); + +// Next we associate a model with the item. +Cart::associate($cartItem->rowId, 'Product'); + +// Or even easier, call the associate method on the CartItem! +$cartItem->associate('Product'); + +// You can even make it a one-liner +Cart::add('293ad', 'Product 1', 1, 9.99, ['size' => 'large'])->associate('Product'); + +// Now, when iterating over the content of the cart, you can access the model. +foreach(Cart::content() as $row) { + echo 'You have ' . $row->qty . ' items of ' . $row->model->name . ' with description: "' . $row->model->description . '" in your cart.'; +} +``` +## Database + +- [Config](#configuration) +- [Storing the cart](#save-cart-to-database) +- [Restoring the cart](#retrieve-cart-from-database) + +### Configuration +To save cart into the database so you can retrieve it later, the package needs to know which database connection to use and what the name of the table is. +By default the package will use the default database connection and use a table named `shopping_cart`. +If you want to change these options, you'll have to publish the `config` file. + + php artisan vendor:publish --provider="Gloudemans\Shoppingcart\ShoppingcartServiceProvider" --tag="config" + +This will give you a `cart.php` config file in which you can make the changes. + +To make your life easy, the package also includes a ready to use `migration` which you can publish by running: + + php artisan vendor:publish --provider="Gloudemans\Shoppingcart\ShoppingcartServiceProvider" --tag="migrations" + +This will place a `shopping_cart` table's migration file into `database/migrations` directory. Now all you have to do is run `php artisan migrate` to migrate your database. + +### Storing the cart +To store your cart instance into the database, you have to call the `store($identifier) ` method. Where `$identifier` is a random key, for instance the id or username of the user. + + Cart::store('username'); + + // To store a cart instance named 'wishlist' + Cart::instance('wishlist')->store('username'); + +### Restoring the cart +If you want to retrieve the cart from the database and restore it, all you have to do is call the `restore($identifier)` where `$identifier` is the key you specified for the `store` method. + + Cart::restore('username'); + + // To restore a cart instance named 'wishlist' + Cart::instance('wishlist')->restore('username'); + +## Exceptions + +The Cart package will throw exceptions if something goes wrong. This way it's easier to debug your code using the Cart package or to handle the error based on the type of exceptions. The Cart packages can throw the following exceptions: + +| Exception | Reason | +| ---------------------------- | ---------------------------------------------------------------------------------- | +| *CartAlreadyStoredException* | When trying to store a cart that was already stored using the specified identifier | +| *InvalidRowIDException* | When the rowId that got passed doesn't exists in the current cart instance | +| *UnknownModelException* | When you try to associate an none existing model to a CartItem. | + +## Events + +The cart also has events build in. There are five events available for you to listen for. + +| Event | Fired | Parameter | +| ------------- | ---------------------------------------- | -------------------------------- | +| cart.added | When an item was added to the cart. | The `CartItem` that was added. | +| cart.updated | When an item in the cart was updated. | The `CartItem` that was updated. | +| cart.removed | When an item is removed from the cart. | The `CartItem` that was removed. | +| cart.stored | When the content of a cart was stored. | - | +| cart.restored | When the content of a cart was restored. | - | + +## Example + +Below is a little example of how to list the cart content in a table: + +```php + +// Add some items in your Controller. +Cart::add('192ao12', 'Product 1', 1, 9.99); +Cart::add('1239ad0', 'Product 2', 2, 5.95, ['size' => 'large']); + +// Set an additional cost (on the same page where you display your cart content) +Cart::addCost(Cart::COST_TRANSACTION, 0.10); +Cart::addCost(Cart::COST_SHIPPING, 5.00); +Cart::addCost('somethingelse', 1.11); + +// Display the content in a View. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProductQtyPriceSubtotal
+

name; ?>

+

options->has('size') ? $row->options->size : ''); ?>

+
$price; ?>$total; ?>
 Subtotal
 Tax
 Transaction cost
 Transaction cost
 Transaction cost
 Total
+``` diff --git a/packages/shoppingcart/_info/composer.json b/packages/shoppingcart/_info/composer.json new file mode 100644 index 0000000..ee51015 --- /dev/null +++ b/packages/shoppingcart/_info/composer.json @@ -0,0 +1,51 @@ +{ + "name": "mindscms/laravelshoppingcart", + "description": "Laravel Shopping cart", + "keywords": ["laravel", "shoppingcart"], + "license": "MIT", + "authors": [ + { + "name": "Rob Gloudemans", + "email": "info@robgloudemans.nl" + }, + { + "name": "Michael V.", + "email": "michael@michaelbelgium.me" + }, + { + "name": "Sami Mansour", + "email": "mindscms@gmail.com" + } + ], + "require": { + "illuminate/support": "^7.0|^8.0|^9.0|^10.0", + "illuminate/session": "^7.0|^8.0|^9.0|^10.0", + "illuminate/events": "^7.0|^8.0|^9.0|^10.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5|^10.1", + "mockery/mockery": "^1.4", + "orchestra/testbench": "^7" + }, + "autoload": { + "psr-4": { + "Gloudemans\\Shoppingcart\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Gloudemans\\Tests\\Shoppingcart\\": "tests/" + } + }, + "minimum-stability": "stable", + "extra": { + "laravel": { + "providers": [ + "Gloudemans\\Shoppingcart\\ShoppingcartServiceProvider" + ], + "aliases": { + "Cart": "Gloudemans\\Shoppingcart\\Facades\\Cart" + } + } + } +} diff --git a/packages/shoppingcart/_info/phpunit.xml b/packages/shoppingcart/_info/phpunit.xml new file mode 100644 index 0000000..f994f39 --- /dev/null +++ b/packages/shoppingcart/_info/phpunit.xml @@ -0,0 +1,17 @@ + + + + + ./tests/ + + + \ No newline at end of file diff --git a/packages/shoppingcart/_info/tests/CartAssertions.php b/packages/shoppingcart/_info/tests/CartAssertions.php new file mode 100644 index 0000000..c351f40 --- /dev/null +++ b/packages/shoppingcart/_info/tests/CartAssertions.php @@ -0,0 +1,35 @@ +count(); + + PHPUnit::assertEquals($items, $cart->count(), "Expected the cart to contain {$items} items, but got {$actual}."); + } + + /** + * Assert that the cart contains the given number of rows. + * + * @param int $rows + * @param \Gloudemans\Shoppingcart\Cart $cart + */ + public function assertRowsInCart($rows, Cart $cart) + { + $actual = $cart->content()->count(); + + PHPUnit::assertCount($rows, $cart->content(), "Expected the cart to contain {$rows} rows, but got {$actual}."); + } +} diff --git a/packages/shoppingcart/_info/tests/CartItemTest.php b/packages/shoppingcart/_info/tests/CartItemTest.php new file mode 100644 index 0000000..ac0bdf4 --- /dev/null +++ b/packages/shoppingcart/_info/tests/CartItemTest.php @@ -0,0 +1,55 @@ + 'XL', 'color' => 'red']); + $cartItem->setQuantity(2); + + $this->assertEquals([ + 'id' => 1, + 'name' => 'Some item', + 'price' => 10.00, + 'rowId' => '07d5da5550494c62daf9993cf954303f', + 'qty' => 2, + 'options' => [ + 'size' => 'XL', + 'color' => 'red' + ], + 'tax' => 0, + 'subtotal' => 20.00, + ], $cartItem->toArray()); + } + + /** @test */ + public function it_can_be_cast_to_json() + { + $cartItem = new CartItem(1, 'Some item', 10.00, ['size' => 'XL', 'color' => 'red']); + $cartItem->setQuantity(2); + + $this->assertJson($cartItem->toJson()); + + $json = '{"rowId":"07d5da5550494c62daf9993cf954303f","id":1,"name":"Some item","qty":2,"price":10,"options":{"size":"XL","color":"red"},"tax":"0.00","subtotal":"20.00"}'; + + $this->assertEquals($json, $cartItem->toJson()); + } +} \ No newline at end of file diff --git a/packages/shoppingcart/_info/tests/CartTest.php b/packages/shoppingcart/_info/tests/CartTest.php new file mode 100644 index 0000000..ae2f878 --- /dev/null +++ b/packages/shoppingcart/_info/tests/CartTest.php @@ -0,0 +1,945 @@ +set('cart.database.connection', 'testing'); + + $app['config']->set('session.driver', 'array'); + + $app['config']->set('database.default', 'testing'); + $app['config']->set('database.connections.testing', [ + 'driver' => 'sqlite', + 'database' => ':memory:', + 'prefix' => '', + ]); + } + + /** + * Setup the test environment. + * + * @return void + */ + protected function setUp() + { + parent::setUp(); + + $this->app->afterResolving('migrator', function ($migrator) { + $migrator->path(realpath(__DIR__.'/../database/migrations')); + }); + } + + /** @test */ + public function it_has_a_default_instance() + { + $cart = $this->getCart(); + + $this->assertEquals(Cart::DEFAULT_INSTANCE, $cart->currentInstance()); + } + + /** @test */ + public function it_can_have_multiple_instances() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'First item')); + + $cart->instance('wishlist')->add(new BuyableProduct(2, 'Second item')); + + $this->assertItemsInCart(1, $cart->instance(Cart::DEFAULT_INSTANCE)); + $this->assertItemsInCart(1, $cart->instance('wishlist')); + } + + /** @test */ + public function it_can_add_an_item() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $this->assertEquals(1, $cart->count()); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_will_return_the_cartitem_of_the_added_item() + { + Event::fake(); + + $cart = $this->getCart(); + + $cartItem = $cart->add(new BuyableProduct); + + $this->assertInstanceOf(CartItem::class, $cartItem); + $this->assertEquals('027c91341fd5cf4d2579b49c4b6a90da', $cartItem->rowId); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_can_add_multiple_buyable_items_at_once() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add([new BuyableProduct(1), new BuyableProduct(2)]); + + $this->assertEquals(2, $cart->count()); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_will_return_an_array_of_cartitems_when_you_add_multiple_items_at_once() + { + Event::fake(); + + $cart = $this->getCart(); + + $cartItems = $cart->add([new BuyableProduct(1), new BuyableProduct(2)]); + + $this->assertTrue(is_array($cartItems)); + $this->assertCount(2, $cartItems); + $this->assertContainsOnlyInstancesOf(CartItem::class, $cartItems); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_can_add_an_item_from_attributes() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(1, 'Test item', 1, 10.00); + + $this->assertEquals(1, $cart->count()); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_can_add_an_item_from_an_array() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(['id' => 1, 'name' => 'Test item', 'qty' => 1, 'price' => 10.00]); + + $this->assertEquals(1, $cart->count()); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_can_add_multiple_array_items_at_once() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add([ + ['id' => 1, 'name' => 'Test item 1', 'qty' => 1, 'price' => 10.00], + ['id' => 2, 'name' => 'Test item 2', 'qty' => 1, 'price' => 10.00] + ]); + + $this->assertEquals(2, $cart->count()); + + Event::assertDispatched('cart.added'); + } + + /** @test */ + public function it_can_add_an_item_with_options() + { + Event::fake(); + + $cart = $this->getCart(); + + $options = ['size' => 'XL', 'color' => 'red']; + + $cart->add(new BuyableProduct, 1, $options); + + $cartItem = $cart->get('07d5da5550494c62daf9993cf954303f'); + + $this->assertInstanceOf(CartItem::class, $cartItem); + $this->assertEquals('XL', $cartItem->options->size); + $this->assertEquals('red', $cartItem->options->color); + + Event::assertDispatched('cart.added'); + } + + /** + * @test + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Please supply a valid identifier. + */ + public function it_will_validate_the_identifier() + { + $cart = $this->getCart(); + + $cart->add(null, 'Some title', 1, 10.00); + } + + /** + * @test + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Please supply a valid name. + */ + public function it_will_validate_the_name() + { + $cart = $this->getCart(); + + $cart->add(1, null, 1, 10.00); + } + + /** + * @test + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Please supply a valid quantity. + */ + public function it_will_validate_the_quantity() + { + $cart = $this->getCart(); + + $cart->add(1, 'Some title', 'invalid', 10.00); + } + + /** + * @test + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Please supply a valid price. + */ + public function it_will_validate_the_price() + { + $cart = $this->getCart(); + + $cart->add(1, 'Some title', 1, 'invalid'); + } + + /** @test */ + public function it_will_update_the_cart_if_the_item_already_exists_in_the_cart() + { + $cart = $this->getCart(); + + $item = new BuyableProduct; + + $cart->add($item); + $cart->add($item); + + $this->assertItemsInCart(2, $cart); + $this->assertRowsInCart(1, $cart); + } + + /** @test */ + public function it_will_keep_updating_the_quantity_when_an_item_is_added_multiple_times() + { + $cart = $this->getCart(); + + $item = new BuyableProduct; + + $cart->add($item); + $cart->add($item); + $cart->add($item); + + $this->assertItemsInCart(3, $cart); + $this->assertRowsInCart(1, $cart); + } + + /** @test */ + public function it_can_update_the_quantity_of_an_existing_item_in_the_cart() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->update('027c91341fd5cf4d2579b49c4b6a90da', 2); + + $this->assertItemsInCart(2, $cart); + $this->assertRowsInCart(1, $cart); + + Event::assertDispatched('cart.updated'); + } + + /** @test */ + public function it_can_update_an_existing_item_in_the_cart_from_a_buyable() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->update('027c91341fd5cf4d2579b49c4b6a90da', new BuyableProduct(1, 'Different description')); + + $this->assertItemsInCart(1, $cart); + $this->assertEquals('Different description', $cart->get('027c91341fd5cf4d2579b49c4b6a90da')->name); + + Event::assertDispatched('cart.updated'); + } + + /** @test */ + public function it_can_update_an_existing_item_in_the_cart_from_an_array() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->update('027c91341fd5cf4d2579b49c4b6a90da', ['name' => 'Different description']); + + $this->assertItemsInCart(1, $cart); + $this->assertEquals('Different description', $cart->get('027c91341fd5cf4d2579b49c4b6a90da')->name); + + Event::assertDispatched('cart.updated'); + } + + /** + * @test + * @expectedException \Gloudemans\Shoppingcart\Exceptions\InvalidRowIDException + */ + public function it_will_throw_an_exception_if_a_rowid_was_not_found() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->update('none-existing-rowid', new BuyableProduct(1, 'Different description')); + } + + /** @test */ + public function it_will_regenerate_the_rowid_if_the_options_changed() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct, 1, ['color' => 'red']); + + $cart->update('ea65e0bdcd1967c4b3149e9e780177c0', ['options' => ['color' => 'blue']]); + + $this->assertItemsInCart(1, $cart); + $this->assertEquals('7e70a1e9aaadd18c72921a07aae5d011', $cart->content()->first()->rowId); + $this->assertEquals('blue', $cart->get('7e70a1e9aaadd18c72921a07aae5d011')->options->color); + } + + /** @test */ + public function it_will_add_the_item_to_an_existing_row_if_the_options_changed_to_an_existing_rowid() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct, 1, ['color' => 'red']); + $cart->add(new BuyableProduct, 1, ['color' => 'blue']); + + $cart->update('7e70a1e9aaadd18c72921a07aae5d011', ['options' => ['color' => 'red']]); + + $this->assertItemsInCart(2, $cart); + $this->assertRowsInCart(1, $cart); + } + + /** @test */ + public function it_can_remove_an_item_from_the_cart() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->remove('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertItemsInCart(0, $cart); + $this->assertRowsInCart(0, $cart); + + Event::assertDispatched('cart.removed'); + } + + /** @test */ + public function it_will_remove_the_item_if_its_quantity_was_set_to_zero() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->update('027c91341fd5cf4d2579b49c4b6a90da', 0); + + $this->assertItemsInCart(0, $cart); + $this->assertRowsInCart(0, $cart); + + Event::assertDispatched('cart.removed'); + } + + /** @test */ + public function it_will_remove_the_item_if_its_quantity_was_set_negative() + { + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->update('027c91341fd5cf4d2579b49c4b6a90da', -1); + + $this->assertItemsInCart(0, $cart); + $this->assertRowsInCart(0, $cart); + + Event::assertDispatched('cart.removed'); + } + + /** @test */ + public function it_can_get_an_item_from_the_cart_by_its_rowid() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertInstanceOf(CartItem::class, $cartItem); + } + + /** @test */ + public function it_can_get_the_content_of_the_cart() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1)); + $cart->add(new BuyableProduct(2)); + + $content = $cart->content(); + + $this->assertInstanceOf(Collection::class, $content); + $this->assertCount(2, $content); + } + + /** @test */ + public function it_will_return_an_empty_collection_if_the_cart_is_empty() + { + $cart = $this->getCart(); + + $content = $cart->content(); + + $this->assertInstanceOf(Collection::class, $content); + $this->assertCount(0, $content); + } + + /** @test */ + public function it_will_include_the_tax_and_subtotal_when_converted_to_an_array() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1)); + $cart->add(new BuyableProduct(2)); + + $content = $cart->content(); + + $this->assertInstanceOf(Collection::class, $content); + $this->assertEquals([ + '027c91341fd5cf4d2579b49c4b6a90da' => [ + 'rowId' => '027c91341fd5cf4d2579b49c4b6a90da', + 'id' => 1, + 'name' => 'Item name', + 'qty' => 1, + 'price' => 10.00, + 'tax' => 2.10, + 'subtotal' => 10.0, + 'options' => [], + ], + '370d08585360f5c568b18d1f2e4ca1df' => [ + 'rowId' => '370d08585360f5c568b18d1f2e4ca1df', + 'id' => 2, + 'name' => 'Item name', + 'qty' => 1, + 'price' => 10.00, + 'tax' => 2.10, + 'subtotal' => 10.0, + 'options' => [], + ] + ], $content->toArray()); + } + + /** @test */ + public function it_can_destroy_a_cart() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $this->assertItemsInCart(1, $cart); + + $cart->destroy(); + + $this->assertItemsInCart(0, $cart); + } + + /** @test */ + public function it_can_get_the_total_price_of_the_cart_content() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'First item', 10.00)); + $cart->add(new BuyableProduct(2, 'Second item', 25.00), 2); + + $this->assertItemsInCart(3, $cart); + $this->assertEquals(60.00, $cart->subtotal()); + } + + /** @test */ + public function it_can_return_a_formatted_total() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'First item', 1000.00)); + $cart->add(new BuyableProduct(2, 'Second item', 2500.00), 2); + + $this->assertItemsInCart(3, $cart); + $this->assertEquals('6.000,00', $cart->subtotal(2, ',', '.')); + } + + /** @test */ + public function it_can_search_the_cart_for_a_specific_item() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some item')); + $cart->add(new BuyableProduct(2, 'Another item')); + + $cartItem = $cart->search(function ($cartItem, $rowId) { + return $cartItem->name == 'Some item'; + }); + + $this->assertInstanceOf(Collection::class, $cartItem); + $this->assertCount(1, $cartItem); + $this->assertInstanceOf(CartItem::class, $cartItem->first()); + $this->assertEquals(1, $cartItem->first()->id); + } + + /** @test */ + public function it_can_search_the_cart_for_multiple_items() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some item')); + $cart->add(new BuyableProduct(2, 'Some item')); + $cart->add(new BuyableProduct(3, 'Another item')); + + $cartItem = $cart->search(function ($cartItem, $rowId) { + return $cartItem->name == 'Some item'; + }); + + $this->assertInstanceOf(Collection::class, $cartItem); + } + + /** @test */ + public function it_can_search_the_cart_for_a_specific_item_with_options() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some item'), 1, ['color' => 'red']); + $cart->add(new BuyableProduct(2, 'Another item'), 1, ['color' => 'blue']); + + $cartItem = $cart->search(function ($cartItem, $rowId) { + return $cartItem->options->color == 'red'; + }); + + $this->assertInstanceOf(Collection::class, $cartItem); + $this->assertCount(1, $cartItem); + $this->assertInstanceOf(CartItem::class, $cartItem->first()); + $this->assertEquals(1, $cartItem->first()->id); + } + + /** @test */ + public function it_will_associate_the_cart_item_with_a_model_when_you_add_a_buyable() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertContains(BuyableProduct::class, Assert::readAttribute($cartItem, 'associatedModel')); + } + + /** @test */ + public function it_can_associate_the_cart_item_with_a_model() + { + $cart = $this->getCart(); + + $cart->add(1, 'Test item', 1, 10.00); + + $cart->associate('027c91341fd5cf4d2579b49c4b6a90da', new ProductModel); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals(ProductModel::class, Assert::readAttribute($cartItem, 'associatedModel')); + } + + /** + * @test + * @expectedException \Gloudemans\Shoppingcart\Exceptions\UnknownModelException + * @expectedExceptionMessage The supplied model SomeModel does not exist. + */ + public function it_will_throw_an_exception_when_a_non_existing_model_is_being_associated() + { + $cart = $this->getCart(); + + $cart->add(1, 'Test item', 1, 10.00); + + $cart->associate('027c91341fd5cf4d2579b49c4b6a90da', 'SomeModel'); + } + + /** @test */ + public function it_can_get_the_associated_model_of_a_cart_item() + { + $cart = $this->getCart(); + + $cart->add(1, 'Test item', 1, 10.00); + + $cart->associate('027c91341fd5cf4d2579b49c4b6a90da', new ProductModel); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertInstanceOf(ProductModel::class, $cartItem->model); + $this->assertEquals('Some value', $cartItem->model->someValue); + } + + /** @test */ + public function it_can_calculate_the_subtotal_of_a_cart_item() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 9.99), 3); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals(29.97, $cartItem->subtotal); + } + + /** @test */ + public function it_can_return_a_formatted_subtotal() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 500), 3); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals('1.500,00', $cartItem->subtotal(2, ',', '.')); + } + + /** @test */ + public function it_can_calculate_tax_based_on_the_default_tax_rate_in_the_config() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 10.00), 1); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals(2.10, $cartItem->tax); + } + + /** @test */ + public function it_can_calculate_tax_based_on_the_specified_tax() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 10.00), 1); + + $cart->setTax('027c91341fd5cf4d2579b49c4b6a90da', 19); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals(1.90, $cartItem->tax); + } + + /** @test */ + public function it_can_return_the_calculated_tax_formatted() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 10000.00), 1); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals('2.100,00', $cartItem->tax(2, ',', '.')); + } + + /** @test */ + public function it_can_calculate_the_total_tax_for_all_cart_items() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 10.00), 1); + $cart->add(new BuyableProduct(2, 'Some title', 20.00), 2); + + $this->assertEquals(10.50, $cart->tax); + } + + /** @test */ + public function it_can_return_formatted_total_tax() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 1000.00), 1); + $cart->add(new BuyableProduct(2, 'Some title', 2000.00), 2); + + $this->assertEquals('1.050,00', $cart->tax(2, ',', '.')); + } + + /** @test */ + public function it_can_return_the_subtotal() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 10.00), 1); + $cart->add(new BuyableProduct(2, 'Some title', 20.00), 2); + + $this->assertEquals(50.00, $cart->subtotal); + } + + /** @test */ + public function it_can_return_formatted_subtotal() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 1000.00), 1); + $cart->add(new BuyableProduct(2, 'Some title', 2000.00), 2); + + $this->assertEquals('5000,00', $cart->subtotal(2, ',', '')); + } + + /** @test */ + public function it_can_return_cart_formated_numbers_by_config_values() + { + $this->setConfigFormat(2, ',', ''); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 1000.00), 1); + $cart->add(new BuyableProduct(2, 'Some title', 2000.00), 2); + + $this->assertEquals('5000,00', $cart->subtotal()); + $this->assertEquals('1050,00', $cart->tax()); + $this->assertEquals('6050,00', $cart->total()); + + $this->assertEquals('5000,00', $cart->subtotal); + $this->assertEquals('1050,00', $cart->tax); + $this->assertEquals('6050,00', $cart->total); + } + + /** @test */ + public function it_can_return_cartItem_formated_numbers_by_config_values() + { + $this->setConfigFormat(2, ',', ''); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'Some title', 2000.00), 2); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $this->assertEquals('2000,00', $cartItem->price()); + $this->assertEquals('2420,00', $cartItem->priceTax()); + $this->assertEquals('4000,00', $cartItem->subtotal()); + $this->assertEquals('4840,00', $cartItem->total()); + $this->assertEquals('420,00', $cartItem->tax()); + $this->assertEquals('840,00', $cartItem->taxTotal()); + } + + /** @test */ + public function it_can_store_the_cart_in_a_database() + { + $this->artisan('migrate', [ + '--database' => 'testing', + ]); + + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->store($identifier = 123); + + $serialized = serialize($cart->content()); + + $this->assertDatabaseHas('shopping_cart', ['identifier' => $identifier, 'instance' => 'default', 'content' => $serialized]); + + Event::assertDispatched('cart.stored'); + } + + /** + * @test + * @expectedException \Gloudemans\Shoppingcart\Exceptions\CartAlreadyStoredException + * @expectedExceptionMessage A cart with identifier 123 was already stored. + */ + public function it_will_throw_an_exception_when_a_cart_was_already_stored_using_the_specified_identifier() + { + $this->artisan('migrate', [ + '--database' => 'testing', + ]); + + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->store($identifier = 123); + + $cart->store($identifier); + + Event::assertDispatched('cart.stored'); + } + + /** @test */ + public function it_can_restore_a_cart_from_the_database() + { + $this->artisan('migrate', [ + '--database' => 'testing', + ]); + + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct); + + $cart->store($identifier = 123); + + $cart->destroy(); + + $this->assertItemsInCart(0, $cart); + + $cart->restore($identifier); + + $this->assertItemsInCart(1, $cart); + + $this->assertDatabaseMissing('shopping_cart', ['identifier' => $identifier, 'instance' => 'default']); + + Event::assertDispatched('cart.restored'); + } + + /** @test */ + public function it_will_just_keep_the_current_instance_if_no_cart_with_the_given_identifier_was_stored() + { + $this->artisan('migrate', [ + '--database' => 'testing', + ]); + + $cart = $this->getCart(); + + $cart->restore($identifier = 123); + + $this->assertItemsInCart(0, $cart); + } + + /** @test */ + public function it_can_calculate_all_values() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'First item', 10.00), 2); + + $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); + + $cart->setTax('027c91341fd5cf4d2579b49c4b6a90da', 19); + + $this->assertEquals(10.00, $cartItem->price(2)); + $this->assertEquals(11.90, $cartItem->priceTax(2)); + $this->assertEquals(20.00, $cartItem->subtotal(2)); + $this->assertEquals(23.80, $cartItem->total(2)); + $this->assertEquals(1.90, $cartItem->tax(2)); + $this->assertEquals(3.80, $cartItem->taxTotal(2)); + + $this->assertEquals(20.00, $cart->subtotal(2)); + $this->assertEquals(23.80, $cart->total(2)); + $this->assertEquals(3.80, $cart->tax(2)); + } + + /** @test */ + public function it_will_destroy_the_cart_when_the_user_logs_out_and_the_config_setting_was_set_to_true() + { + $this->app['config']->set('cart.destroy_on_logout', true); + + $this->app->instance(SessionManager::class, Mockery::mock(SessionManager::class, function ($mock) { + $mock->shouldReceive('forget')->once()->with('cart'); + })); + + $user = Mockery::mock(Authenticatable::class); + + event(new Logout($user)); + } + + /** + * Get an instance of the cart. + * + * @return \Gloudemans\Shoppingcart\Cart + */ + private function getCart() + { + $session = $this->app->make('session'); + $events = $this->app->make('events'); + + return new Cart($session, $events); + } + + /** + * Set the config number format. + * + * @param int $decimals + * @param string $decimalPoint + * @param string $thousandSeperator + */ + private function setConfigFormat($decimals, $decimalPoint, $thousandSeperator) + { + $this->app['config']->set('cart.format.decimals', $decimals); + $this->app['config']->set('cart.format.decimal_point', $decimalPoint); + $this->app['config']->set('cart.format.thousand_separator', $thousandSeperator); + } +} diff --git a/packages/shoppingcart/_info/tests/Fixtures/BuyableProduct.php b/packages/shoppingcart/_info/tests/Fixtures/BuyableProduct.php new file mode 100644 index 0000000..a58e830 --- /dev/null +++ b/packages/shoppingcart/_info/tests/Fixtures/BuyableProduct.php @@ -0,0 +1,67 @@ +id = $id; + $this->name = $name; + $this->price = $price; + } + + /** + * Get the identifier of the Buyable item. + * + * @return int|string + */ + public function getBuyableIdentifier($options = null) + { + return $this->id; + } + + /** + * Get the description or title of the Buyable item. + * + * @return string + */ + public function getBuyableDescription($options = null) + { + return $this->name; + } + + /** + * Get the price of the Buyable item. + * + * @return float + */ + public function getBuyablePrice($options = null) + { + return $this->price; + } +} \ No newline at end of file diff --git a/packages/shoppingcart/_info/tests/Fixtures/ProductModel.php b/packages/shoppingcart/_info/tests/Fixtures/ProductModel.php new file mode 100644 index 0000000..70494ca --- /dev/null +++ b/packages/shoppingcart/_info/tests/Fixtures/ProductModel.php @@ -0,0 +1,13 @@ + 15, + + /* + |-------------------------------------------------------------------------- + | Shopping cart database settings + |-------------------------------------------------------------------------- + | + | Here you can set the connection that the shopping cart should use when + | storing and restoring a cart. + | + */ + + 'database' => [ + + 'connection' => env('DB_CONNECTION', 'mysql'), + + 'table' => 'shopping_cart', + + ], + + /* + |-------------------------------------------------------------------------- + | Destroy the cart on user logout + |-------------------------------------------------------------------------- + | + | When this option is set to 'true' the cart will automatically + | destroy all cart instances when the user logs out. + | + */ + + 'destroy_on_logout' => false, + + /* + |-------------------------------------------------------------------------- + | Default number format + |-------------------------------------------------------------------------- + | + | This defaults will be used for the formated numbers if you don't + | set them in the method call. + | + */ + + 'format' => [ + + 'decimals' => 2, + + 'decimal_point' => '.', + + 'thousand_separator' => '' + + ], + +]; \ No newline at end of file diff --git a/packages/shoppingcart/database/migrations/0000_00_00_000000_create_shopping_cart_table.php b/packages/shoppingcart/database/migrations/0000_00_00_000000_create_shopping_cart_table.php new file mode 100644 index 0000000..891afc7 --- /dev/null +++ b/packages/shoppingcart/database/migrations/0000_00_00_000000_create_shopping_cart_table.php @@ -0,0 +1,30 @@ +string('identifier'); + $table->string('instance'); + $table->longText('content'); + $table->nullableTimestamps(); + + $table->primary(['identifier', 'instance']); + }); + } + /** + * Reverse the migrations. + */ + public function down() + { + Schema::drop('shopping_cart'); + } +} diff --git a/public/css/application.css b/public/css/application.css index adc3295..759988b 100644 --- a/public/css/application.css +++ b/public/css/application.css @@ -89,4 +89,8 @@ a[aria-expanded='true'] > .fa-caret-expand:before { .switcher-label { cursor: pointer; + } + + .dtp { + z-index: 1100; } \ No newline at end of file diff --git a/public/css/shop.css b/public/css/shop.css index 5e68b51..0b99d2d 100644 --- a/public/css/shop.css +++ b/public/css/shop.css @@ -11,7 +11,7 @@ html { body.custom-background { background-color: #f4f1ef; color: rgb(119, 119, 119); - font-size: 17px; + font-size: 16px; } .text-body { @@ -62,9 +62,9 @@ a.btn { } .contact-phone-icon { color: rgb(119, 111, 95); - font-size: 33px; - height: 33px; - line-height: 33px; + font-size: 30px; + height: 30px; + line-height: 30px; float: left; width: 38px; padding-right: 5px; @@ -81,8 +81,14 @@ a.contact-phone-link { } .img-brand { - width: 190px; + width: 200px; } +@media ((max-width: 767px)){ + .img-brand { + width: 175px; + } +} + .navbar-nav { font-size: 0.85em;} .nav-link { padding: 0.225rem 0.625rem; } @@ -101,11 +107,22 @@ h1, h2, h3, h4, .typo-heading { color: rgb(64, 65, 66); } p { - font-size: 17px; + font-size: 16px; +} + +.product-item { + border: 0 solid #fff; + background-color: transparent; +} + +.product-item:hover { + border: 0 solid #fff; + background-color: #fff; + box-shadow: 0 3px 7.92px 0.08px rgba(0, 0, 0, 0.08); } h4.product-title { - height: 2.9rem; + height: 4.35rem; overflow: hidden; margin-bottom: .5rem; } @@ -130,13 +147,17 @@ h4.product-title { font-size: 0.85rem; } .badge-cart { - background: #659a87 !important; - border-color: #659a87 !important; + background: #426c5d !important; + border-color: #426c5d !important; color: #fff !important; } +.more_details { + font-size: 16px; +} + .switcher-holder { - background-color: #46564d; + background-color: #426c5d; padding: .6rem 1.4rem .8rem; font-size: 1rem; line-height: 2; @@ -148,7 +169,7 @@ h4.product-title { background-color: rgb(114, 104, 86); } .switcher-success.switcher .switcher-input:checked ~ .switcher-indicator { - background: #659a87; + background: #426c5d; color: #fff; } .switcher .switcher-indicator { @@ -178,7 +199,6 @@ h4.product-title { opacity: 0.75; } @media (min-width: 992px) { - .swiper-button-next, .swiper-button-prev { padding: 25px; } @@ -202,14 +222,14 @@ h4.product-title { opacity: 1; } .swiper-pagination-bullet-active { - background-color: #46564d; + background-color: #426c5d; outline: 0; } .btn-primary { padding: .6rem 1.4rem .8rem; border-color: transparent; - background: #46564d; + background: #426c5d; color: #fff; } @@ -226,18 +246,18 @@ h4.product-title { .dropdown-item { - color: #46564d; + color: #426c5d; } .dropdown-item:hover, .dropdown-item:focus { background-color: #d6d6d6; - color: #46564d; + color: #426c5d; } .dropdown-item.active, .dropdown-item:active { - background-color: #46564d; + background-color: #426c5d; color:#fff !important; } @@ -249,7 +269,7 @@ label .required { } .form-control:focus { - border-color: #46564d; + border-color: #426c5d; } .checkout-order { transition: box-shadow 0.4s ease; @@ -283,11 +303,11 @@ label .required { table.table-payment td { padding: 1rem 0; border-top: none; - border-bottom: 1px solid #c6c2bf; + border-bottom: 0 solid #c6c2bf; } .yard-items-head { - border-bottom: 1px solid #c6c2bf; + border-bottom: 0 solid #c6c2bf; padding-bottom: 8px; margin-bottom: 8px; } @@ -407,33 +427,33 @@ table.table-payment td { font-size: 16px; } -@media (max-width: 991px) { - - .intro-media .media { - display: block; - text-align: center; - } - - .intro-media .media img.d-block { - display: inline-block !important; - margin-bottom: 1em; - } +small, .small { + font-size: 90%; } + + +.ui-w-100-140 { + width: 140px !important; + height: auto; +} + + + .media-body ul { padding-left: 1.8rem; } -.media-body .table { - font-size:16px; - color: rgb(119, 119, 119); -} .modal-body .table { - font-size:16px; + font-size:15px; color: rgb(119, 119, 119); } .media-body table th, .media-body .table td { padding: 0.4rem; } +.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(24, 28, 33, 0.05); + +} .no-border { border: none; } @@ -457,4 +477,446 @@ table.table-payment td { .ui-w-150 { width: 150px !important; height: auto; +} + +.card .nav-tabs .nav-link { + border-color: #f4f1ef; + border: 0; +} +.card .nav-tabs .nav-link { + text-decoration: none; +} + + +.card .nav-tabs .nav-link.active { + border-color: rgba(24, 28, 33, 0.1); + border: 0; + background-color: rgba(24, 28, 33, 0.06); +} + +.card .nav-tabs .nav-link:hover { + background-color: rgba(24, 28, 33, 0.03); +} + +.tab-content .card { + border-color: #f4f1ef; + border-top: 0 solid rgba(24, 28, 33, 0.1); + +} + +.modal-shop .tab-content .card { + background-color: rgba(24, 28, 33, 0.03); + +} + + +.side-bar { + position: fixed; + overflow: hidden; + top: 0; + right: -100%; + width: 465px; + padding: 40px 30px; + padding-top: 50px; + height: 100%; + display: block; + background-color: white; + backdrop-filter: blur(7px); + z-index: 1900; + transition: all 600ms ease; + display: flex; + flex-direction: column; + overflow-y: auto; + overflow: visible; + width: 320px; +} +.inner-main-wrapper-desk .inner-content{ + text-align: center; + margin-top: 30px; +} +.inner-main-wrapper-desk p{ + max-width: 95%; + text-align: center; + margin: auto; +} +.inner-main-wrapper-desk .title{ + font-weight: 600; +} +.inner-main-wrapper-desk .footer{ + padding-top: 50px; + margin-top: 80px; + border-top: 1px solid #c2c2c2; +} +.inner-main-wrapper-desk .title{ + font-weight: 500; +} +.inner-main-wrapper-desk a.rts-btn{ + margin: auto; +} + +.side-bar.show { + right: 0; + overflow-y: auto; +} +.side-bar button { + max-width: max-content; + margin-right: auto; + margin-left: -53px; + margin-top: 0; + position: absolute; + border: 0; + background-color: transparent; +} +.side-bar button i{ + color: #000; + height: 50px; + width: 50px; + border-radius: 0; + display: flex; + align-items: center; + justify-content: center; + margin-left: 14px; + margin-top: -48px; + font-size: 27px; +} +#anywhere-home.bgshow { + background: #0e1013; + opacity: 70%; + visibility: visible; + pointer-events: visible; + z-index: 999; + top: 0; +} +#anywhere-home { + cursor: url(../images/close.png), auto; + background: #0e1013; + position: fixed; + width: 100%; + height: 100%; + opacity: 0; + visibility: hidden; + transition: opacity 500ms ease-in-out; + pointer-events: none; + z-index: 50; +} + +#shop-action { + position: fixed; + z-index: 1800; + top: 0; + right: 0; +} + +#shop-action .group-action { + position: absolute; + top: 60px; + left: 0; + z-index: -1; + display: block; + width: 50px; + height: 200px; + background: #fff; + color: #000 !important; + opacity: 0.8; + -webkit-transform: translateX(-50px); + -ms-transform: translateX(-50px); + transform: translateX(-50px); + border-top-left-radius: 8px; + border-bottom-left-radius: 8px; + color: #fff !important; + text-align: center; + -webkit-box-shadow: 0 0 20px 0 rgba(0,0,0,0.2); + box-shadow: 0 0 20px 0 rgba(0,0,0,0.2); + +} + +#shop-action .group-action.small{ + height: 120px; + +} + +#shop-action .group-action .shop-action-btn { + display: block; + width: 50px; + height: 40px; + padding-top: 5px; + color: #606060; +} + +#shop-action .group-action .shop-action-btn:hover { + color: #426c5d; +} + + + + +@media ((max-width: 767px)) { + .product-description { + font-size: 14px; + height: 3.9rem; + } + .more_details { + font-size: 15px; + } + .btn-add-product-shop { + font-size: 13px; + margin: 0 8px; + } + + .btn-sm-only-xs { + padding: 0.188rem 0.6875rem; + font-size: 0.75rem; + line-height: 1.5; + border-radius: 0.25rem; + } + + h4, .h4 { + font-size: 1.3rem; + } + h4.product-title { + height: 4.25rem; + } + +} + + +@media (max-width: 991px) { + + .intro-media .media { + text-align: center; + } + + .intro-media .media img.d-block { + display: inline-block !important; + margin-bottom: 1em; + } + .intro-media .media p { + font-size: 0.875rem; + } + + p { + font-size: 0.875rem; + } + + .intro-media .media h6 { + font-size: 0.875rem; + } + + .ui-w-100-140 { + width: 100px !important; + height: auto; + } + + .more_details { + font-size: 0.875rem; + } + + body.custom-background { + font-size: 0.875rem; + } + .modal-body .table { + font-size: 0.875rem; + color: rgb(119, 119, 119); + + } + + .switcher-label { + font-size: 0.875rem; + } + +} + + +.shop-products .col-1, +.shop-products .col-2, +.shop-products .col-3, +.shop-products .col-4, +.shop-products .col-5, +.shop-products .col-6, +.shop-products .col-7, +.shop-products .col-8, +.shop-products .col-9, +.shop-products .col-10, +.shop-products .col-11, +.shop-products .col-12, +.shop-products .col, +.shop-products .col-auto, +.shop-products .col-sm-1, +.shop-products .col-sm-2, +.shop-products .col-sm-3, +.shop-products .col-sm-4, +.shop-products .col-sm-5, +.shop-products .col-sm-6, +.shop-products .col-sm-7, +.shop-products .col-sm-8, +.shop-products .col-sm-9, +.shop-products .col-sm-10, +.shop-products .col-sm-11, +.shop-products .col-sm-12, +.shop-products .col-sm, +.shop-products .col-sm-auto, +.shop-products .col-md-1, +.shop-products .col-md-2, +.shop-products .col-md-3, +.shop-products .col-md-4, +.shop-products .col-md-5, +.shop-products .col-md-6, +.shop-products .col-md-7, +.shop-products .col-md-8, +.shop-products .col-md-9, +.shop-products .col-md-10, +.shop-products .col-md-11, +.shop-products .col-md-12, +.shop-products .col-md, +.shop-products .col-md-auto, +.shop-products .col-lg-1, +.shop-products .col-lg-2, +.shop-products .col-lg-3, +.shop-products .col-lg-4, +.shop-products .col-lg-5, +.shop-products .col-lg-6, +.shop-products .col-lg-7, +.shop-products .col-lg-8, +.shop-products .col-lg-9, +.shop-products .col-lg-10, +.shop-products .col-lg-11, +.shop-products .col-lg-12, +.shop-products .col-lg, +.shop-products .col-lg-auto, +.shop-products .col-xl-1, +.shop-products .col-xl-2, +.shop-products .col-xl-3, +.shop-products .col-xl-4, +.shop-products .col-xl-5, +.shop-products .col-xl-6, +.shop-products .col-xl-7, +.shop-products .col-xl-8, +.shop-products .col-xl-9, +.shop-products .col-xl-10, +.shop-products .col-xl-11, +.shop-products .col-xl-12, +.shop-products .col-xl, +.shop-products .col-xl-auto { + padding-right: 0.35rem; + padding-left: 0.35rem; +} + +.ui-w-90 { + width: 85px !important; + height: auto; +} + +.modal-shop { + background-color: #f4f1ef ; +} + +.modal-shop .card { + background-color: #f4f1ef ; +} + +.media-body ul { + padding-left: 1.2em; +} + +.modal-header { + padding: 1.25rem 1.25rem 0; + border-bottom: 0; +} + +.modal-footer { + border-top: 0; + +} + + +.ui-basket-card { + display: block; + margin-top: -36px; +} +.ui-basket-item { + z-index: 1; + display: inline-flex; + vertical-align: top; + align-items: center; + background-color: #fff; + border-radius: 9999px; + border: 1px solid rgba(24, 28, 33, 0.1); + transform: scale(1) translateZ(0); + transition:background-color .25s cubic-bezier(.4, 0, .2, 1), transform .25s cubic-bezier(.4, 0, .2, 1); + box-shadow: 0 3px 3px 0.08px rgba(0, 0, 0, 0.05); + +} + +.ui-basket-item:hover { + background-color: #fafafa; + border: 1px solid rgba(24, 28, 33, 0.2); +} + +.ui-basket-item button { + display: inline-block; + width: 40px; + height: 40px; + border-color: transparent; + background:transparent; + text-align: center; + vertical-align: middle; + margin: 0; + line-height: 38px; + outline: none; + opacity: 1; +} + +.ui-basket-item button:disabled, +.ui-basket-item button[disabled]{ + opacity: 0.6; +} + + +.ui-basket-item button .fa { + color: #426c5d; + font-size: 150%; + transform: scale(1) translateZ(0); + transition: background-color .25s cubic-bezier(.4, 0, .2, 1), transform .25s cubic-bezier(.4, 0, .2, 1); +} + +.ui-basket-item button:hover .fa { + color: rgb(114, 104, 86); + transform: scale(1.1) translateZ(0); + +} + +.ui-basket-btn-minus { + border-radius: 9999px 0 0 9999px; +} + +.ui-basket-btn-plus { + border-radius: 0 9999px 9999px 0; +} + +.ui-basket-quantity { + display: inline-block; + width: auto; + height: 40px; + padding: 0 6px; +} + +.ui-basket-quantity .indicator { + display: inline-block; + color: #4E5155; + font-weight: 700; + line-height: 36px; + font-size: 1.1rem; + width: auto; + padding: 0 2px; + +} + +.ui-basket-quantity .ion { + font-size: 110%; + color: #606060; +} + +.badge.indicator:not(.badge-dot) { + font-size: 0.7em; + top:38px; } \ No newline at end of file diff --git a/public/images/close.png b/public/images/close.png new file mode 100644 index 0000000..d2687f8 Binary files /dev/null and b/public/images/close.png differ diff --git a/public/images/lazy.png b/public/images/lazy.png new file mode 100644 index 0000000..8ca9d88 Binary files /dev/null and b/public/images/lazy.png differ diff --git a/public/images/placeholder.png b/public/images/placeholder.png new file mode 100755 index 0000000..81159a8 Binary files /dev/null and b/public/images/placeholder.png differ diff --git a/public/js/datatables-de.json b/public/js/datatables-de.json new file mode 100644 index 0000000..32635ed --- /dev/null +++ b/public/js/datatables-de.json @@ -0,0 +1,243 @@ +{ + "emptyTable": "Keine Daten in der Tabelle vorhanden", + "info": "_START_ bis _END_ von _TOTAL_ Einträgen", + "infoEmpty": "Keine Daten vorhanden", + "infoFiltered": "(gefiltert von _MAX_ Einträgen)", + "infoThousands": ".", + "loadingRecords": "Wird geladen ..", + "processing": "Bitte warten ..", + "paginate": { + "first": "Erste", + "next": "Nächste", + "last": "Letzte", + "previous": "Vorherige" + }, + "aria": { + "sortAscending": ": aktivieren, um Spalte aufsteigend zu sortieren", + "sortDescending": ": aktivieren, um Spalte absteigend zu sortieren" + }, + "select": { + "rows": { + "_": "%d Zeilen ausgewählt", + "1": "1 Zeile ausgewählt" + }, + "cells": { + "1": "1 Zelle ausgewählt", + "_": "%d Zellen ausgewählt" + }, + "columns": { + "1": "1 Spalte ausgewählt", + "_": "%d Spalten ausgewählt" + } + }, + "buttons": { + "print": "Drucken", + "copy": "Kopieren", + "copyTitle": "In Zwischenablage kopieren", + "copySuccess": { + "_": "%d Zeilen kopiert", + "1": "1 Zeile kopiert" + }, + "collection": "Aktionen <\/span>", + "colvis": "Spaltensichtbarkeit", + "colvisRestore": "Sichtbarkeit wiederherstellen", + "csv": "CSV", + "excel": "Excel", + "pageLength": { + "-1": "Alle Zeilen anzeigen", + "1": "Zeige 1 Zeile", + "_": "Zeige %d Zeilen" + }, + "pdf": "PDF", + "createState": "Ansicht erstellen", + "removeAllStates": "Alle Ansichten entfernen", + "removeState": "Entfernen", + "renameState": "Umbenennen", + "savedStates": "Gespeicherte Ansicht", + "stateRestore": "Ansicht %d", + "updateState": "Aktualisieren", + "copyKeys": "Taste STRG<\\\/i> oder ⌘<\\\/i> + C<\\\/i> drücken um die Tabelle
in den Zwischenspeicher zu kopieren.

Um den Vorgang abzubrechen, Nachricht anklicken oder Escape-Taste drücken.<\/i><\/i><\/i>" + }, + "autoFill": { + "cancel": "Abbrechen", + "fill": "Alle Zellen mit %d füllen<\/i><\/i>", + "fillHorizontal": "Alle horizontalen Zellen füllen", + "fillVertical": "Alle vertikalen Zellen füllen", + "info": "Automatische Vervollständigung" + }, + "decimal": ",", + "search": "Suche:", + "searchBuilder": { + "add": "Bedingung hinzufügen", + "button": { + "0": "Such-Baukasten", + "_": "Such-Baukasten (%d)" + }, + "condition": "Bedingung", + "conditions": { + "date": { + "after": "Nach", + "before": "Vor", + "between": "Zwischen", + "empty": "Leer", + "not": "Nicht", + "notBetween": "Nicht zwischen", + "notEmpty": "Nicht leer", + "equals": "Gleich" + }, + "number": { + "between": "Zwischen", + "empty": "Leer", + "equals": "Entspricht", + "gt": "Größer als", + "gte": "Größer als oder gleich", + "lt": "Kleiner als", + "lte": "Kleiner als oder gleich", + "not": "Nicht", + "notBetween": "Nicht zwischen", + "notEmpty": "Nicht leer" + }, + "string": { + "contains": "Beinhaltet", + "empty": "Leer", + "endsWith": "Endet mit", + "equals": "Entspricht", + "not": "Nicht", + "notEmpty": "Nicht leer", + "startsWith": "Startet mit", + "notContains": "enthält nicht", + "notStartsWith": "startet nicht mit", + "notEndsWith": "endet nicht mit" + }, + "array": { + "equals": "ist gleich", + "empty": "ist leer", + "contains": "enthält", + "not": "ist ungleich", + "notEmpty": "ist nicht leer", + "without": "aber nicht" + } + }, + "data": "Daten", + "deleteTitle": "Filterregel entfernen", + "leftTitle": "Äußere Kriterien", + "rightTitle": "Innere Kriterien", + "title": { + "0": "Such-Baukasten", + "_": "Such-Baukasten (%d)" + }, + "value": "Wert", + "clearAll": "Alle entfernen", + "logicAnd": "Und", + "logicOr": "Oder" + }, + "searchPanes": { + "clearMessage": "Leeren", + "collapse": { + "0": "Suchmasken", + "_": "Suchmasken (%d)" + }, + "countFiltered": "{shown} ({total})", + "emptyPanes": "Keine Suchmasken", + "title": "Aktive Filter: %d", + "showMessage": "zeige Alle", + "collapseMessage": "Alle einklappen", + "count": "{total}", + "loadMessage": "Lade Suchmasken .." + }, + "thousands": ".", + "zeroRecords": "Keine passenden Einträge gefunden", + "lengthMenu": "_MENU_ Zeilen anzeigen", + "datetime": { + "previous": "Vorher", + "next": "Nachher", + "hours": "Stunden", + "minutes": "Minuten", + "seconds": "Sekunden", + "unknown": "Unbekannt", + "weekdays": [ + "Sonntag", + "Montag", + "Dienstag", + "Mittwoch", + "Donnerstag", + "Freitag", + "Samstag" + ], + "months": [ + "Januar", + "Februar", + "März", + "April", + "Mai", + "Juni", + "Juli", + "August", + "September", + "Oktober", + "November", + "Dezember" + ] + }, + "editor": { + "close": "Schließen", + "create": { + "button": "Neu", + "title": "Neuen Eintrag erstellen", + "submit": "Erstellen" + }, + "remove": { + "confirm": { + "_": "Sollen %d Zeilen gelöscht werden?", + "1": "Soll diese Zeile gelöscht werden?" + }, + "button": "Entfernen", + "title": "Entfernen", + "submit": "Entfernen" + }, + "error": { + "system": "Ein Systemfehler ist aufgetreten" + }, + "multi": { + "title": "Mehrere Werte", + "restore": "Änderungen zurücksetzen", + "noMulti": "Dieses Feld kann nur einzeln bearbeitet werden, nicht als Teil einer Mengen-Änderung.", + "info": "Die ausgewählten Elemente enthalten mehrere Werte für dieses Feld. Um alle Elemente für dieses Feld zu bearbeiten und auf denselben Wert zu setzen, hier klicken oder tippen, andernfalls behalten diese ihre individuellen Werte bei." + }, + "edit": { + "button": "Bearbeiten", + "title": "Eintrag bearbeiten", + "submit": "Bearbeiten" + } + }, + "searchPlaceholder": "Suchen...", + "stateRestore": { + "creationModal": { + "button": "Erstellen", + "columns": { + "search": "Spalten Suche", + "visible": "Spalten Sichtbarkeit" + }, + "name": "Name:", + "order": "Sortieren", + "paging": "Seiten", + "scroller": "Scroll Position", + "search": "Suche", + "searchBuilder": "Such-Baukasten", + "select": "Auswahl", + "title": "Neue Ansicht erstellen", + "toggleLabel": "Inkludiert:" + }, + "duplicateError": "Eine Ansicht mit diesem Namen existiert bereits.", + "emptyError": "Name darf nicht leer sein.", + "emptyStates": "Keine gespeicherten Ansichten", + "removeError": "Entfernen der Ansicht fehlgeschlagen.", + "removeJoiner": " und ", + "removeSubmit": "Entfernen", + "removeTitle": "Ansicht entfernen", + "renameButton": "Umbenennen", + "renameLabel": "Neuer Name für %s:", + "renameTitle": "Ansicht umbenennen", + "removeConfirm": "Sicher dass %s entfernt werden soll?" + } +} \ No newline at end of file diff --git a/public/js/datatables-en.json b/public/js/datatables-en.json new file mode 100644 index 0000000..f08fcb0 --- /dev/null +++ b/public/js/datatables-en.json @@ -0,0 +1,243 @@ +{ + "emptyTable": "No data available in table", + "info": "Showing _START_ to _END_ of _TOTAL_ entries", + "infoEmpty": "Showing 0 to 0 of 0 entries", + "infoFiltered": "(filtered from _MAX_ total entries)", + "infoThousands": ",", + "lengthMenu": "Show _MENU_ entries", + "loadingRecords": "Loading...", + "processing": "Processing...", + "search": "Search:", + "zeroRecords": "No matching records found", + "thousands": ",", + "paginate": { + "first": "First", + "last": "Last", + "next": "Next", + "previous": "Previous" + }, + "aria": { + "sortAscending": ": activate to sort column ascending", + "sortDescending": ": activate to sort column descending" + }, + "autoFill": { + "cancel": "Cancel", + "fill": "Fill all cells with %d<\/i>", + "fillHorizontal": "Fill cells horizontally", + "fillVertical": "Fill cells vertically" + }, + "buttons": { + "collection": "Collection ", + "colvis": "Column Visibility", + "colvisRestore": "Restore visibility", + "copy": "Copy", + "copyKeys": "Press ctrl or u2318 + C to copy the table data to your system clipboard.

To cancel, click this message or press escape.", + "copySuccess": { + "1": "Copied 1 row to clipboard", + "_": "Copied %d rows to clipboard" + }, + "copyTitle": "Copy to Clipboard", + "csv": "CSV", + "excel": "Excel", + "pageLength": { + "-1": "Show all rows", + "_": "Show %d rows" + }, + "pdf": "PDF", + "print": "Print", + "updateState": "Update", + "stateRestore": "State %d", + "savedStates": "Saved States", + "renameState": "Rename", + "removeState": "Remove", + "removeAllStates": "Remove All States", + "createState": "Create State" + }, + "searchBuilder": { + "add": "Add Condition", + "button": { + "0": "Search Builder", + "_": "Search Builder (%d)" + }, + "clearAll": "Clear All", + "condition": "Condition", + "conditions": { + "date": { + "after": "After", + "before": "Before", + "between": "Between", + "empty": "Empty", + "equals": "Equals", + "not": "Not", + "notBetween": "Not Between", + "notEmpty": "Not Empty" + }, + "number": { + "between": "Between", + "empty": "Empty", + "equals": "Equals", + "gt": "Greater Than", + "gte": "Greater Than Equal To", + "lt": "Less Than", + "lte": "Less Than Equal To", + "not": "Not", + "notBetween": "Not Between", + "notEmpty": "Not Empty" + }, + "string": { + "contains": "Contains", + "empty": "Empty", + "endsWith": "Ends With", + "equals": "Equals", + "not": "Not", + "notEmpty": "Not Empty", + "startsWith": "Starts With", + "notContains": "Does Not Contain", + "notStartsWith": "Does Not Start With", + "notEndsWith": "Does Not End With" + }, + "array": { + "without": "Without", + "notEmpty": "Not Empty", + "not": "Not", + "contains": "Contains", + "empty": "Empty", + "equals": "Equals" + } + }, + "data": "Data", + "deleteTitle": "Delete filtering rule", + "leftTitle": "Outdent Criteria", + "logicAnd": "And", + "logicOr": "Or", + "rightTitle": "Indent Criteria", + "title": { + "0": "Search Builder", + "_": "Search Builder (%d)" + }, + "value": "Value" + }, + "searchPanes": { + "clearMessage": "Clear All", + "collapse": { + "0": "SearchPanes", + "_": "SearchPanes (%d)" + }, + "count": "{total}", + "countFiltered": "{shown} ({total})", + "emptyPanes": "No SearchPanes", + "loadMessage": "Loading SearchPanes", + "title": "Filters Active - %d", + "showMessage": "Show All", + "collapseMessage": "Collapse All" + }, + "select": { + "cells": { + "1": "1 cell selected", + "_": "%d cells selected" + }, + "columns": { + "1": "1 column selected", + "_": "%d columns selected" + }, + "rows": { + "1": "1 row selected", + "_": "%d rows selected" + } + }, + "datetime": { + "previous": "Previous", + "next": "Next", + "hours": "Hour", + "minutes": "Minute", + "seconds": "Second", + "unknown": "-", + "amPm": [ + "am", + "pm" + ], + "weekdays": [ + "Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat" + ], + "months": [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December" + ] + }, + "editor": { + "close": "Close", + "create": { + "button": "New", + "title": "Create new entry", + "submit": "Create" + }, + "edit": { + "button": "Edit", + "title": "Edit Entry", + "submit": "Update" + }, + "remove": { + "button": "Delete", + "title": "Delete", + "submit": "Delete", + "confirm": { + "_": "Are you sure you wish to delete %d rows?", + "1": "Are you sure you wish to delete 1 row?" + } + }, + "error": { + "system": "A system error has occurred (More information<\/a>)." + }, + "multi": { + "title": "Multiple Values", + "info": "The selected items contain different values for this input. To edit and set all items for this input to the same value, click or tap here, otherwise they will retain their individual values.", + "restore": "Undo Changes", + "noMulti": "This input can be edited individually, but not part of a group. " + } + }, + "stateRestore": { + "renameTitle": "Rename State", + "renameLabel": "New Name for %s:", + "renameButton": "Rename", + "removeTitle": "Remove State", + "removeSubmit": "Remove", + "removeJoiner": " and ", + "removeError": "Failed to remove state.", + "removeConfirm": "Are you sure you want to remove %s?", + "emptyStates": "No saved states", + "emptyError": "Name cannot be empty.", + "duplicateError": "A state with this name already exists.", + "creationModal": { + "toggleLabel": "Includes:", + "title": "Create New State", + "select": "Select", + "searchBuilder": "SearchBuilder", + "search": "Search", + "scroller": "Scroll Position", + "paging": "Paging", + "order": "Sorting", + "name": "Name:", + "columns": { + "visible": "Column Visibility", + "search": "Column Search" + }, + "button": "Create" + } + } +} \ No newline at end of file diff --git a/public/js/datatables-es.json b/public/js/datatables-es.json new file mode 100644 index 0000000..fca3755 --- /dev/null +++ b/public/js/datatables-es.json @@ -0,0 +1,244 @@ +{ + "processing": "Procesando...", + "lengthMenu": "Mostrar _MENU_ registros", + "zeroRecords": "No se encontraron resultados", + "emptyTable": "Ningún dato disponible en esta tabla", + "infoEmpty": "Mostrando registros del 0 al 0 de un total de 0 registros", + "infoFiltered": "(filtrado de un total de _MAX_ registros)", + "search": "Buscar:", + "loadingRecords": "Cargando...", + "paginate": { + "first": "Primero", + "last": "Último", + "next": "Siguiente", + "previous": "Anterior" + }, + "aria": { + "sortAscending": ": Activar para ordenar la columna de manera ascendente", + "sortDescending": ": Activar para ordenar la columna de manera descendente" + }, + "buttons": { + "copy": "Copiar", + "colvis": "Visibilidad", + "collection": "Colección", + "colvisRestore": "Restaurar visibilidad", + "copyKeys": "Presione ctrl o u2318 + C para copiar los datos de la tabla al portapapeles del sistema.

Para cancelar, haga clic en este mensaje o presione escape.", + "copySuccess": { + "1": "Copiada 1 fila al portapapeles", + "_": "Copiadas %ds fila al portapapeles" + }, + "copyTitle": "Copiar al portapapeles", + "csv": "CSV", + "excel": "Excel", + "pageLength": { + "-1": "Mostrar todas las filas", + "_": "Mostrar %d filas" + }, + "pdf": "PDF", + "print": "Imprimir", + "renameState": "Cambiar nombre", + "updateState": "Actualizar", + "createState": "Crear Estado", + "removeAllStates": "Remover Estados", + "removeState": "Remover", + "savedStates": "Estados Guardados", + "stateRestore": "Estado %d" + }, + "autoFill": { + "cancel": "Cancelar", + "fill": "Rellene todas las celdas con %d<\/i>", + "fillHorizontal": "Rellenar celdas horizontalmente", + "fillVertical": "Rellenar celdas verticalmente" + }, + "decimal": ",", + "searchBuilder": { + "add": "Añadir condición", + "button": { + "0": "Constructor de búsqueda", + "_": "Constructor de búsqueda (%d)" + }, + "clearAll": "Borrar todo", + "condition": "Condición", + "conditions": { + "date": { + "before": "Antes", + "between": "Entre", + "empty": "Vacío", + "equals": "Igual a", + "notBetween": "No entre", + "not": "Diferente de", + "after": "Después", + "notEmpty": "No Vacío" + }, + "number": { + "between": "Entre", + "equals": "Igual a", + "gt": "Mayor a", + "gte": "Mayor o igual a", + "lt": "Menor que", + "lte": "Menor o igual que", + "notBetween": "No entre", + "notEmpty": "No vacío", + "not": "Diferente de", + "empty": "Vacío" + }, + "string": { + "contains": "Contiene", + "empty": "Vacío", + "endsWith": "Termina en", + "equals": "Igual a", + "startsWith": "Empieza con", + "not": "Diferente de", + "notContains": "No Contiene", + "notStartsWith": "No empieza con", + "notEndsWith": "No termina con", + "notEmpty": "No Vacío" + }, + "array": { + "not": "Diferente de", + "equals": "Igual", + "empty": "Vacío", + "contains": "Contiene", + "notEmpty": "No Vacío", + "without": "Sin" + } + }, + "data": "Data", + "deleteTitle": "Eliminar regla de filtrado", + "leftTitle": "Criterios anulados", + "logicAnd": "Y", + "logicOr": "O", + "rightTitle": "Criterios de sangría", + "title": { + "0": "Constructor de búsqueda", + "_": "Constructor de búsqueda (%d)" + }, + "value": "Valor" + }, + "searchPanes": { + "clearMessage": "Borrar todo", + "collapse": { + "0": "Paneles de búsqueda", + "_": "Paneles de búsqueda (%d)" + }, + "count": "{total}", + "countFiltered": "{shown} ({total})", + "emptyPanes": "Sin paneles de búsqueda", + "loadMessage": "Cargando paneles de búsqueda", + "title": "Filtros Activos - %d", + "showMessage": "Mostrar Todo", + "collapseMessage": "Colapsar Todo" + }, + "select": { + "cells": { + "1": "1 celda seleccionada", + "_": "%d celdas seleccionadas" + }, + "columns": { + "1": "1 columna seleccionada", + "_": "%d columnas seleccionadas" + }, + "rows": { + "1": "1 fila seleccionada", + "_": "%d filas seleccionadas" + } + }, + "thousands": ".", + "datetime": { + "previous": "Anterior", + "hours": "Horas", + "minutes": "Minutos", + "seconds": "Segundos", + "unknown": "-", + "amPm": [ + "AM", + "PM" + ], + "months": { + "0": "Enero", + "1": "Febrero", + "10": "Noviembre", + "11": "Diciembre", + "2": "Marzo", + "3": "Abril", + "4": "Mayo", + "5": "Junio", + "6": "Julio", + "7": "Agosto", + "8": "Septiembre", + "9": "Octubre" + }, + "weekdays": { + "0": "Dom", + "1": "Lun", + "2": "Mar", + "4": "Jue", + "5": "Vie", + "3": "Mié", + "6": "Sáb" + }, + "next": "Próximo" + }, + "editor": { + "close": "Cerrar", + "create": { + "button": "Nuevo", + "title": "Crear Nuevo Registro", + "submit": "Crear" + }, + "edit": { + "button": "Editar", + "title": "Editar Registro", + "submit": "Actualizar" + }, + "remove": { + "button": "Eliminar", + "title": "Eliminar Registro", + "submit": "Eliminar", + "confirm": { + "_": "¿Está seguro de que desea eliminar %d filas?", + "1": "¿Está seguro de que desea eliminar 1 fila?" + } + }, + "error": { + "system": "Ha ocurrido un error en el sistema (
Más información<\\\/a>).<\/a>" + }, + "multi": { + "title": "Múltiples Valores", + "restore": "Deshacer Cambios", + "noMulti": "Este registro puede ser editado individualmente, pero no como parte de un grupo.", + "info": "Los elementos seleccionados contienen diferentes valores para este registro. Para editar y establecer todos los elementos de este registro con el mismo valor, haga clic o pulse aquí, de lo contrario conservarán sus valores individuales." + } + }, + "info": "Mostrando _START_ a _END_ de _TOTAL_ registros", + "stateRestore": { + "creationModal": { + "button": "Crear", + "name": "Nombre:", + "order": "Clasificación", + "paging": "Paginación", + "select": "Seleccionar", + "columns": { + "search": "Búsqueda de Columna", + "visible": "Visibilidad de Columna" + }, + "title": "Crear Nuevo Estado", + "toggleLabel": "Incluir:", + "scroller": "Posición de desplazamiento", + "search": "Búsqueda", + "searchBuilder": "Búsqueda avanzada" + }, + "removeJoiner": "y", + "removeSubmit": "Eliminar", + "renameButton": "Cambiar Nombre", + "duplicateError": "Ya existe un Estado con este nombre.", + "emptyStates": "No hay Estados guardados", + "removeTitle": "Remover Estado", + "renameTitle": "Cambiar Nombre Estado", + "emptyError": "El nombre no puede estar vacío.", + "removeConfirm": "¿Seguro que quiere eliminar %s?", + "removeError": "Error al eliminar el Estado", + "renameLabel": "Nuevo nombre para %s:" + }, + "infoThousands": "." +} \ No newline at end of file diff --git a/public/js/iq-homeparty-cart.js b/public/js/iq-homeparty-cart.js index d6a5967..0c7ad2e 100755 --- a/public/js/iq-homeparty-cart.js +++ b/public/js/iq-homeparty-cart.js @@ -193,8 +193,8 @@ var IqHomepartyCart = { if(number < 1 || isNaN(number)){ return 1; } - if(number >= 100){ - return 100; + if(number >= 300){ + return 300; } return number; } diff --git a/public/js/iq-promotion-cart.js b/public/js/iq-promotion-cart.js index 76849ee..bec4994 100644 --- a/public/js/iq-promotion-cart.js +++ b/public/js/iq-promotion-cart.js @@ -62,8 +62,8 @@ var IqPromotionCart = { if(number < 0 || isNaN(number)){ return 0; } - if(number >= 100){ - return 100; + if(number >= 300){ + return 300; } return number; }, diff --git a/public/js/iq-shopping-cart.js b/public/js/iq-shopping-cart.js index fab23da..28eb92c 100755 --- a/public/js/iq-shopping-cart.js +++ b/public/js/iq-shopping-cart.js @@ -154,8 +154,8 @@ var IqShoppingCart = { if(number < 0 || isNaN(number)){ return 0; } - if(number >= 100){ - return 100; + if(number >= 300){ + return 300; } return number; }, diff --git a/public/js/iq-promotion-shop-cart.js b/public/js/iq-user-shop-cart.js similarity index 81% rename from public/js/iq-promotion-shop-cart.js rename to public/js/iq-user-shop-cart.js index d1577fe..b733546 100644 --- a/public/js/iq-promotion-shop-cart.js +++ b/public/js/iq-user-shop-cart.js @@ -3,29 +3,28 @@ function _log(msg){ console.log(msg); } -var IqPromotionShopCart = { +var IqUserShopCart = { btn_add_free: '.btn-add-free-product', input_free: '.switcher-input', btn_shop_add: '.btn-add-product-shop', - //btn_add: '.add-product-shop', + btn_shop_minus: '.btn-minus-product-shop', btn_remove: '.remove-product-shop', - //input_event: '.input-event-promotion-onchange', btn_clear: '#clear-products-basket', cart_input: '.cart-input-event-onchange', remove_item: '.remove_item_form_cart', url: null, action: null, - cart_holder: '#promotion_cart_holder', + cart_holder: '#user_cart_holder', invoice_holder: '#invoice_details_holder', - checkout_holder: '#promotion_checkout_holder', + checkout_holder: '#user_checkout_holder', show_products_holder: '#show_products_holder', - + badge_basket_indicator : '#badge_basket_indicator', free_product_id: null, shipping_option: null, show_products_option: null, - + init: function () { var _self = this; _self.url = $('input[name=load_url]').val(); @@ -44,6 +43,10 @@ var IqPromotionShopCart = { event.preventDefault(); _self.addShopProduct($(this)); }); + $(_self.btn_shop_minus).on('click', function(event){ + event.preventDefault(); + _self.minusShopProduct($(this)); + }); $('input[name=switchers_shipping]').on('change', function(event){ event.preventDefault(); @@ -85,7 +88,6 @@ var IqPromotionShopCart = { _self.changeStateShipping($(this).val()); } }); - }, changeStateShipping: function(_state_id){ var _self = this; @@ -109,6 +111,13 @@ var IqPromotionShopCart = { .done(_self.refreshItemsAndView); } }, + minusShopProduct: function(_ele){ + var _self = this; + if(_ele.data('product_id')){ + _self.performRequest({product_id: _ele.data('product_id'), action: 'minus-shop-product'}) + .done(_self.refreshItemsAndView); + } + }, switchShipping: function(_ele){ var _self = this; _self.shipping_option = _ele.val(); @@ -121,8 +130,20 @@ var IqPromotionShopCart = { _self.performRequest({show_products_option: _self.show_products_option, action: 'switch-show_products'}) .done(_self.refreshShowProducts); }, + refreshButtonDisabled: function (data){ + if(data.response.qty >= 100){ + $('#cart_btn_plus_'+data.response.product_id).prop("disabled",true); + }else{ + $('#cart_btn_plus_'+data.response.product_id).prop("disabled",false); + } + if(data.response.qty <= 0){ + $('#cart_btn_minus_'+data.response.product_id).prop("disabled",true); + }else{ + $('#cart_btn_minus_'+data.response.product_id).prop("disabled",false); + } + }, refreshShowProducts: function (data){ - var _self = IqPromotionShopCart; + var _self = IqUserShopCart; if(data.shop_products_view){ $(_self.show_products_holder).html(data.shop_products_view); } @@ -143,20 +164,22 @@ var IqPromotionShopCart = { if(number < 0 || isNaN(number)){ return 0; } - if(number >= 100){ - return 100; + if(number >= 300){ + return 300; } return number; }, refreshItemsAndView: function (data){ - var _self = IqPromotionShopCart; - //_log(data); + var _self = IqUserShopCart; + _log(data); if(data.response.action == 'clear-cart'){ location.reload(); } - if(data.response.action == 'add-shop-product' || data.response.action == 'update-shop-product' || data.response.action == 'remove-shop-product'){ + if(data.response.action == 'add-shop-product' || data.response.action == 'update-shop-product' || data.response.action == 'remove-shop-product' || data.response.action == 'minus-shop-product'){ var qty = data.response.qty > 0 ? "x"+data.response.qty : 0; - $('#badge_cart_indicator_'+data.response.product_id).html(qty); + $('#badge_cart_indicator_'+data.response.product_id).html(' '+qty); + //on off buttons + _self.refreshButtonDisabled(data); } if(data.cart){ $(_self.cart_holder).html(data.cart); @@ -167,11 +190,12 @@ var IqPromotionShopCart = { if(data.checkout){ $(_self.checkout_holder).html(data.checkout); } + if(data.basketqty){ + $(_self.badge_basket_indicator).html(data.basketqty); + } if(data.response.shipping_price_formated){ $('#shipping_price_holder').html(data.response.shipping_price_formated); } - - _self.showInit(); }, performRequest : function(data) { diff --git a/public/js/jquery.lazyload.js b/public/js/jquery.lazyload.js new file mode 100644 index 0000000..5a22d8e --- /dev/null +++ b/public/js/jquery.lazyload.js @@ -0,0 +1,242 @@ +/* + * Lazy Load - jQuery plugin for lazy loading images + * + * Copyright (c) 2007-2013 Mika Tuupola + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/mit-license.php + * + * Project home: + * http://www.appelsiini.net/projects/lazyload + * + * Version: 1.9.3 + * + */ + +(function($, window, document, undefined) { + var $window = $(window); + + $.fn.lazyload = function(options) { + var elements = this; + var $container; + var settings = { + threshold : 0, + failure_limit : 0, + event : "scroll", + effect : "show", + container : window, + data_attribute : "original", + skip_invisible : true, + appear : null, + load : null, + placeholder : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" + }; + + function update() { + var counter = 0; + + elements.each(function() { + var $this = $(this); + if (settings.skip_invisible && !$this.is(":visible")) { + return; + } + if ($.abovethetop(this, settings) || + $.leftofbegin(this, settings)) { + /* Nothing. */ + } else if (!$.belowthefold(this, settings) && + !$.rightoffold(this, settings)) { + $this.trigger("appear"); + /* if we found an image we'll load, reset the counter */ + counter = 0; + } else { + if (++counter > settings.failure_limit) { + return false; + } + } + }); + + } + + if(options) { + /* Maintain BC for a couple of versions. */ + if (undefined !== options.failurelimit) { + options.failure_limit = options.failurelimit; + delete options.failurelimit; + } + if (undefined !== options.effectspeed) { + options.effect_speed = options.effectspeed; + delete options.effectspeed; + } + + $.extend(settings, options); + } + + /* Cache container as jQuery as object. */ + $container = (settings.container === undefined || + settings.container === window) ? $window : $(settings.container); + + /* Fire one scroll event per scroll. Not one scroll event per image. */ + if (0 === settings.event.indexOf("scroll")) { + $container.bind(settings.event, function() { + return update(); + }); + } + + this.each(function() { + var self = this; + var $self = $(self); + + self.loaded = false; + + /* If no src attribute given use data:uri. */ + if ($self.attr("src") === undefined || $self.attr("src") === false) { + if ($self.is("img")) { + $self.attr("src", settings.placeholder); + } + } + + /* When appear is triggered load original image. */ + $self.one("appear", function() { + if (!this.loaded) { + if (settings.appear) { + var elements_left = elements.length; + settings.appear.call(self, elements_left, settings); + } + $("") + .bind("load", function() { + + var original = $self.attr("data-" + settings.data_attribute); + $self.hide(); + if ($self.is("img")) { + $self.attr("src", original); + } else { + $self.css("background-image", "url('" + original + "')"); + } + $self[settings.effect](settings.effect_speed); + + self.loaded = true; + + /* Remove image from array so it is not looped next time. */ + var temp = $.grep(elements, function(element) { + return !element.loaded; + }); + elements = $(temp); + + if (settings.load) { + var elements_left = elements.length; + settings.load.call(self, elements_left, settings); + } + }) + .attr("src", $self.attr("data-" + settings.data_attribute)); + } + }); + + /* When wanted event is triggered load original image */ + /* by triggering appear. */ + if (0 !== settings.event.indexOf("scroll")) { + $self.bind(settings.event, function() { + if (!self.loaded) { + $self.trigger("appear"); + } + }); + } + }); + + /* Check if something appears when window is resized. */ + $window.bind("resize", function() { + update(); + }); + + /* With IOS5 force loading images when navigating with back button. */ + /* Non optimal workaround. */ + if ((/(?:iphone|ipod|ipad).*os 5/gi).test(navigator.appVersion)) { + $window.bind("pageshow", function(event) { + if (event.originalEvent && event.originalEvent.persisted) { + elements.each(function() { + $(this).trigger("appear"); + }); + } + }); + } + + /* Force initial check if images should appear. */ + $(document).ready(function() { + update(); + }); + + return this; + }; + + /* Convenience methods in jQuery namespace. */ + /* Use as $.belowthefold(element, {threshold : 100, container : window}) */ + + $.belowthefold = function(element, settings) { + var fold; + + if (settings.container === undefined || settings.container === window) { + fold = (window.innerHeight ? window.innerHeight : $window.height()) + $window.scrollTop(); + } else { + fold = $(settings.container).offset().top + $(settings.container).height(); + } + + return fold <= $(element).offset().top - settings.threshold; + }; + + $.rightoffold = function(element, settings) { + var fold; + + if (settings.container === undefined || settings.container === window) { + fold = $window.width() + $window.scrollLeft(); + } else { + fold = $(settings.container).offset().left + $(settings.container).width(); + } + + return fold <= $(element).offset().left - settings.threshold; + }; + + $.abovethetop = function(element, settings) { + var fold; + + if (settings.container === undefined || settings.container === window) { + fold = $window.scrollTop(); + } else { + fold = $(settings.container).offset().top; + } + + return fold >= $(element).offset().top + settings.threshold + $(element).height(); + }; + + $.leftofbegin = function(element, settings) { + var fold; + + if (settings.container === undefined || settings.container === window) { + fold = $window.scrollLeft(); + } else { + fold = $(settings.container).offset().left; + } + + return fold >= $(element).offset().left + settings.threshold + $(element).width(); + }; + + $.inviewport = function(element, settings) { + return !$.rightoffold(element, settings) && !$.leftofbegin(element, settings) && + !$.belowthefold(element, settings) && !$.abovethetop(element, settings); + }; + + /* Custom selectors for your convenience. */ + /* Use as $("img:below-the-fold").something() or */ + /* $("img").filter(":below-the-fold").something() which is faster */ + + $.extend($.expr[":"], { + "below-the-fold" : function(a) { return $.belowthefold(a, {threshold : 0}); }, + "above-the-top" : function(a) { return !$.belowthefold(a, {threshold : 0}); }, + "right-of-screen": function(a) { return $.rightoffold(a, {threshold : 0}); }, + "left-of-screen" : function(a) { return !$.rightoffold(a, {threshold : 0}); }, + "in-viewport" : function(a) { return $.inviewport(a, {threshold : 0}); }, + /* Maintain BC for couple of versions. */ + "above-the-fold" : function(a) { return !$.belowthefold(a, {threshold : 0}); }, + "right-of-fold" : function(a) { return $.rightoffold(a, {threshold : 0}); }, + "left-of-fold" : function(a) { return !$.rightoffold(a, {threshold : 0}); } + }); + +})(jQuery, window, document); diff --git a/public/js/jquery.lazyload.min.js b/public/js/jquery.lazyload.min.js new file mode 100644 index 0000000..615b90e --- /dev/null +++ b/public/js/jquery.lazyload.min.js @@ -0,0 +1,2 @@ +/*! Lazy Load 1.9.3 - MIT license - Copyright 2010-2013 Mika Tuupola */ +!function(a,b,c,d){var e=a(b);a.fn.lazyload=function(f){function g(){var b=0;i.each(function(){var c=a(this);if(!j.skip_invisible||c.is(":visible"))if(a.abovethetop(this,j)||a.leftofbegin(this,j));else if(a.belowthefold(this,j)||a.rightoffold(this,j)){if(++b>j.failure_limit)return!1}else c.trigger("appear"),b=0})}var h,i=this,j={threshold:0,failure_limit:0,event:"scroll",effect:"show",container:b,data_attribute:"original",skip_invisible:!0,appear:null,load:null,placeholder:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC"};return f&&(d!==f.failurelimit&&(f.failure_limit=f.failurelimit,delete f.failurelimit),d!==f.effectspeed&&(f.effect_speed=f.effectspeed,delete f.effectspeed),a.extend(j,f)),h=j.container===d||j.container===b?e:a(j.container),0===j.event.indexOf("scroll")&&h.bind(j.event,function(){return g()}),this.each(function(){var b=this,c=a(b);b.loaded=!1,(c.attr("src")===d||c.attr("src")===!1)&&c.is("img")&&c.attr("src",j.placeholder),c.one("appear",function(){if(!this.loaded){if(j.appear){var d=i.length;j.appear.call(b,d,j)}a("").bind("load",function(){var d=c.attr("data-"+j.data_attribute);c.hide(),c.is("img")?c.attr("src",d):c.css("background-image","url('"+d+"')"),c[j.effect](j.effect_speed),b.loaded=!0;var e=a.grep(i,function(a){return!a.loaded});if(i=a(e),j.load){var f=i.length;j.load.call(b,f,j)}}).attr("src",c.attr("data-"+j.data_attribute))}}),0!==j.event.indexOf("scroll")&&c.bind(j.event,function(){b.loaded||c.trigger("appear")})}),e.bind("resize",function(){g()}),/(?:iphone|ipod|ipad).*os 5/gi.test(navigator.appVersion)&&e.bind("pageshow",function(b){b.originalEvent&&b.originalEvent.persisted&&i.each(function(){a(this).trigger("appear")})}),a(c).ready(function(){g()}),this},a.belowthefold=function(c,f){var g;return g=f.container===d||f.container===b?(b.innerHeight?b.innerHeight:e.height())+e.scrollTop():a(f.container).offset().top+a(f.container).height(),g<=a(c).offset().top-f.threshold},a.rightoffold=function(c,f){var g;return g=f.container===d||f.container===b?e.width()+e.scrollLeft():a(f.container).offset().left+a(f.container).width(),g<=a(c).offset().left-f.threshold},a.abovethetop=function(c,f){var g;return g=f.container===d||f.container===b?e.scrollTop():a(f.container).offset().top,g>=a(c).offset().top+f.threshold+a(c).height()},a.leftofbegin=function(c,f){var g;return g=f.container===d||f.container===b?e.scrollLeft():a(f.container).offset().left,g>=a(c).offset().left+f.threshold+a(c).width()},a.inviewport=function(b,c){return!(a.rightoffold(b,c)||a.leftofbegin(b,c)||a.belowthefold(b,c)||a.abovethetop(b,c))},a.extend(a.expr[":"],{"below-the-fold":function(b){return a.belowthefold(b,{threshold:0})},"above-the-top":function(b){return!a.belowthefold(b,{threshold:0})},"right-of-screen":function(b){return a.rightoffold(b,{threshold:0})},"left-of-screen":function(b){return!a.rightoffold(b,{threshold:0})},"in-viewport":function(b){return a.inviewport(b,{threshold:0})},"above-the-fold":function(b){return!a.belowthefold(b,{threshold:0})},"right-of-fold":function(b){return a.rightoffold(b,{threshold:0})},"left-of-fold":function(b){return!a.rightoffold(b,{threshold:0})}})}(jQuery,window,document); \ No newline at end of file diff --git a/public/js/jquery.scrollstop.js b/public/js/jquery.scrollstop.js new file mode 100644 index 0000000..a0bb637 --- /dev/null +++ b/public/js/jquery.scrollstop.js @@ -0,0 +1,72 @@ +/* http://james.padolsey.com/javascript/special-scroll-events-for-jquery/ */ + +(function(){ + + var special = jQuery.event.special, + uid1 = "D" + (+new Date()), + uid2 = "D" + (+new Date() + 1); + + special.scrollstart = { + setup: function() { + + var timer, + handler = function(evt) { + + var _self = this, + _args = arguments; + + if (timer) { + clearTimeout(timer); + } else { + evt.type = "scrollstart"; + jQuery.event.dispatch.apply(_self, _args); + } + + timer = setTimeout( function(){ + timer = null; + }, special.scrollstop.latency); + + }; + + jQuery(this).bind("scroll", handler).data(uid1, handler); + + }, + teardown: function(){ + jQuery(this).unbind( "scroll", jQuery(this).data(uid1) ); + } + }; + + special.scrollstop = { + latency: 300, + setup: function() { + + var timer, + handler = function(evt) { + + var _self = this, + _args = arguments; + + if (timer) { + clearTimeout(timer); + } + + timer = setTimeout( function(){ + + timer = null; + evt.type = "scrollstop"; + jQuery.event.dispatch.apply(_self, _args); + + + }, special.scrollstop.latency); + + }; + + jQuery(this).bind("scroll", handler).data(uid2, handler); + + }, + teardown: function() { + jQuery(this).unbind( "scroll", jQuery(this).data(uid2) ); + } + }; + +})(); \ No newline at end of file diff --git a/public/js/jquery.scrollstop.min.js b/public/js/jquery.scrollstop.min.js new file mode 100644 index 0000000..3b8c8ca --- /dev/null +++ b/public/js/jquery.scrollstop.min.js @@ -0,0 +1,2 @@ +/*! Lazy Load 1.9.3 - MIT license - Copyright 2010-2013 Mika Tuupola */ +!function(){var a=jQuery.event.special,b="D"+ +new Date,c="D"+(+new Date+1);a.scrollstart={setup:function(){var c,d=function(b){var d=this,e=arguments;c?clearTimeout(c):(b.type="scrollstart",jQuery.event.dispatch.apply(d,e)),c=setTimeout(function(){c=null},a.scrollstop.latency)};jQuery(this).bind("scroll",d).data(b,d)},teardown:function(){jQuery(this).unbind("scroll",jQuery(this).data(b))}},a.scrollstop={latency:300,setup:function(){var b,d=function(c){var d=this,e=arguments;b&&clearTimeout(b),b=setTimeout(function(){b=null,c.type="scrollstop",jQuery.event.dispatch.apply(d,e)},a.scrollstop.latency)};jQuery(this).bind("scroll",d).data(c,d)},teardown:function(){jQuery(this).unbind("scroll",jQuery(this).data(c))}}}(); \ No newline at end of file diff --git a/public/js/lazyload.jquery.json b/public/js/lazyload.jquery.json new file mode 100644 index 0000000..b6db399 --- /dev/null +++ b/public/js/lazyload.jquery.json @@ -0,0 +1,36 @@ +{ + "name": "lazyload", + "version": "1.9.3", + "title": "Lazy Load", + "author": { + "name": "Mika Tuupola", + "email": "tuupola@appelsiini.net", + "url": "http://www.appelsiini.net/" + }, + "licenses": [ + { + "type": "MIT", + "url": "http://www.opensource.org/licenses/mit-license.php" + } + ], + "dependencies": { + "jquery": ">=1.5" + }, + "description": "Delay loading of images in long web pages. Images outside of viewport wont be loaded before user scrolls to them.", + "keywords": [ + "lazyload", + "lazy", + "load", + "image" + ], + "homepage": "http://www.appelsiini.net/projects/lazyload", + "bugs": "https://github.com/tuupola/jquery_lazyload/issues", + "docs": "http://www.appelsiini.net/projects/lazyload", + "demo": "http://www.appelsiini.net/projects/lazyload/enabled_fadein.html", + "files": [ + "jquery.lazyload.js", + "jquery.lazyload.min.js", + "jquery.scrollstop.js", + "jquery.scrollstop.min.js" + ] +} \ No newline at end of file diff --git a/public/js/shop.js b/public/js/shop.js index 76b5d80..15eb215 100644 --- a/public/js/shop.js +++ b/public/js/shop.js @@ -2,7 +2,6 @@ $(function() { $('select').selectpicker(); - $('#modals-load-content').on('show.bs.modal', function (event) { var button = $(event.relatedTarget); if (!button.data('id')) { @@ -56,3 +55,30 @@ function loadModalInner(self, data){ function _scrollTo(to, offset) { $('html,body').animate({scrollTop: $(to).offset().top - offset}, 800); } + +$(document).on('click', '.open-icon-menu', function () { + $("#side-bar").addClass("show"); + $("#anywhere-home").addClass("bgshow"); + }); + $(document).on('click', '.close-icon-menu', function () { + $("#side-bar").removeClass("show"); + $("#anywhere-home").removeClass("bgshow"); + }); + $(document).on('click', '#anywhere-home', function () { + $("#side-bar").removeClass("show"); + $("#anywhere-home").removeClass("bgshow"); + }); + + $(document).on('click', '.scroll-to-top', function () { + $("html, body").animate({ + scrollTop: 0 + }, 600); + }); + + $(document).on('click', '.scroll-to-basket', function () { + _scrollTo('#user_cart_holder', 10) + }); + + + + diff --git a/public/pdf/template_delivery_de-1.pdf b/public/pdf/template_delivery_de-1.pdf new file mode 100644 index 0000000..e9ad70e Binary files /dev/null and b/public/pdf/template_delivery_de-1.pdf differ diff --git a/public/pdf/template_delivery_de-2.pdf b/public/pdf/template_delivery_de-2.pdf new file mode 100644 index 0000000..e9ad70e Binary files /dev/null and b/public/pdf/template_delivery_de-2.pdf differ diff --git a/public/phpinfo.php b/public/phpinfo.php new file mode 100644 index 0000000..e974c40 --- /dev/null +++ b/public/phpinfo.php @@ -0,0 +1 @@ + '', + 'BIC' => 'BIC', + 'IBAN' => 'IBAN', + 'VAT_ID_number' => 'USt-ID Nummer', + 'VAT_copy_1' => 'Wähle Kleinunternehmer, wenn Du nicht mehr als 22.000 EUR Umsatz pro Jahr mit Deinem Gewerbe erwirtschaftest.', + 'VAT_liability' => 'Umsatzsteuerpflicht', + 'account_holder' => 'Kontoinhaber', + 'bank_data' => 'Bankdaten', + 'delivery_address' => 'Lieferadresse', + 'firstname_lastname' => 'Vorname Nachname', + 'invoice_address' => 'Rechnungsadresse', + 'my_credit' => 'Mein Guthaben', + 'vat_data' => 'Steuerdaten', + 'info_vat_numbers' => 'Hinweis: Bitte Steuernummer und/oder USt-ID Nummer angeben!*', + 'new_vat_validate' => 'Neue UST-ID validieren und Reverse Charge Verfahren aktivieren', + 'btn_vat_validate' => 'USt-ID Nummer validieren', + 'phone_need_error' => 'Fehler: Bitte Telefon und/oder Mobiltelefon angeben!*', + 'phone_need_note' => 'Hinweis: Bitte Telefon und/oder Mobiltelefon angeben!*', + 'required_for_commission_payments' => 'Wird für die Auszahlungen von Provisionen benötigt', + 'reverse_charge_action_1' => 'Reverse Charge Verfahren und UST-ID löschen', + 'reverse_charge_action_2' => 'UST-ID validieren und Reverse Charge Verfahren aktivieren', + 'reverse_charge_copy_1' => 'Umkehrung der Steuerschuldnerschaft oder auch Abzugsverfahren. In diesem Spezialfall muss der Leistungsempfänger (Berater) und nicht der leistende Unternehmer (mivita) die Umsatzsteuer entrichten.', + 'reverse_charge_note_1' => 'Bei der Aktivierung wird die USt-ID benötigt und validiert.', + 'reverse_charge_procedure' => 'Reverse Charge Verfahren', + 'tax_number' => 'Steuernummer', + 'taxable_sales_1' => 'umsatzsteuerpflichtig (Ich mache eine UST-Voranmeldung pro Monat / Quartal / Jahr ans Finanzamt)', + 'taxable_sales_2' => 'nicht umsatzsteuerpflichtig (Kleinunternehmer im Sinne von $ 19', + 'validator_creditcard' => 'Geben Sie bitte eine gültige Kreditkarten-Nummer ein', + 'validator_date' => 'Bitte geben Sie ein gültiges Datum ein.', + 'validator_digits' => 'Geben Sie bitte nur Ziffern ein.', + 'validator_email' => 'Geben Sie bitte eine gültige E-Mail Adresse ein.', + 'validator_equalTo' => 'Bitte denselben Wert wiederholen.', + 'validator_max' => 'Geben Sie bitte einen Wert kleiner oder gleich {0} ein.', + 'validator_maxlength' => 'Geben Sie bitte maximal {0} Zeichen ein.', + 'validator_min' => 'Geben Sie bitte einen Wert größer oder gleich {0} ein.', + 'validator_minlength' => 'Geben Sie bitte mindestens {0} Zeichen ein.', + 'validator_number' => 'Geben Sie bitte eine Nummer ein.', + 'validator_range' => 'Geben Sie bitte einen Wert zwischen {0} und {1} ein.', + 'validator_rangelength' => 'Geben Sie bitte mindestens {0} und maximal {1} Zeichen ein.', + 'validator_required' => 'Dieses Feld ist ein Pflichtfeld.', + 'validator_url' => 'Geben Sie bitte eine gültige URL ein.', +); diff --git a/resources/lang/de/cal.php b/resources/lang/de/cal.php index 3a46d61..bfd8db4 100755 --- a/resources/lang/de/cal.php +++ b/resources/lang/de/cal.php @@ -1,58 +1,65 @@ [ - 'January' =>'Januar', - 'February' =>'Februar', - 'March' =>'März', - 'April' => 'April', - 'May' => 'Mai', - 'June' =>'Juni', - 'July' =>'Juli', - 'August' =>'August', - 'September' =>'September', - 'October' =>'Oktober', - 'November' =>'November', - 'December' =>'Dezember', - ], - 'months_short' => [ - 'Jan' => 'Jan', - 'Feb' => 'Feb', - 'Mar' => 'Mär', - 'Apr' => 'Apr', - 'May' => 'Mai', - 'Jun' => 'Jun', - 'Jul' => 'Jul', - 'Aug' => 'Aug', - 'Sep' => 'Sep', - 'Oct' => 'Okt', - 'Nov' => 'Nov', - 'Dec' =>'Dez' - ], - 'weekdays' => [ - 'Sunday' =>'Sonntag', - 'Monday' =>'Montag', - 'Tuesday' =>'Dienstag', - 'Wednesday' =>'Mittwoch', - 'Thursday' =>'Donnerstag', - 'Friday' =>'Freitag', - 'Saturday' =>'Samstag' - ], - 'weekdays_short' => [ - 'Sun' => 'So.', - 'Mon' => 'Mo.', - 'Tue' => 'Di.', - 'Wed' => 'Mi.', - 'Thu' => 'Do.', - 'Fri' => 'Fr.', - 'Sat' => 'Sa.'], - 'weekdays_min' => [ - 'Su' =>'So', - 'Mo' =>'Mo', - 'Tu' =>'Di', - 'We' =>'Mi', - 'Th' =>'Do', - 'Fr' =>'Fr', - 'Sa' =>'Sa' - ] -]; \ No newline at end of file +return array ( + 'months' => + array ( + 'April' => 'April', + 'August' => 'August', + 'December' => 'Dezember', + 'February' => 'Februar', + 'January' => 'Januar', + 'July' => 'Juli', + 'June' => 'Juni', + 'March' => 'März', + 'May' => 'Mai', + 'November' => 'November', + 'October' => 'Oktober', + 'September' => 'September', + 'full_year' => 'ganzes Jahr', + ), + 'months_short' => + array ( + 'Apr' => 'Apr', + 'Aug' => 'Aug', + 'Dec' => 'Dez', + 'Feb' => 'Feb', + 'Jan' => 'Jan', + 'Jul' => 'Jul', + 'Jun' => 'Jun', + 'Mar' => 'Mär', + 'May' => 'Mai', + 'Nov' => 'Nov', + 'Oct' => 'Okt', + 'Sep' => 'Sep', + ), + 'weekdays' => + array ( + 'Friday' => 'Freitag', + 'Monday' => 'Montag', + 'Saturday' => 'Samstag', + 'Sunday' => 'Sonntag', + 'Thursday' => 'Donnerstag', + 'Tuesday' => 'Dienstag', + 'Wednesday' => 'Mittwoch', + ), + 'weekdays_min' => + array ( + 'Fr' => 'Fr', + 'Mo' => 'Mo', + 'Sa' => 'Sa', + 'Su' => 'So', + 'Th' => 'Do', + 'Tu' => 'Di', + 'We' => 'Mi', + ), + 'weekdays_short' => + array ( + 'Fri' => 'Fr.', + 'Mon' => 'Mo.', + 'Sat' => 'Sa.', + 'Sun' => 'So.', + 'Thu' => 'Do.', + 'Tue' => 'Di.', + 'Wed' => 'Mi.', + ), +); diff --git a/resources/lang/de/msg.php b/resources/lang/de/msg.php new file mode 100644 index 0000000..a37da64 --- /dev/null +++ b/resources/lang/de/msg.php @@ -0,0 +1,44 @@ + 'Fehler: Das Versandland wurde nicht gefunden', + 'shipping_country_was_not_correctly' => 'Fehler: Das Versandland wurde dem Warenkorb nicht richtig verarbeitet', + 'shopping_cart_was_shipping_free' => 'Fehler: Der Warenkorb wurde als Versandkostenfrei angegeben', + 'shipping_cost_cannot_be_0' => 'Fehler: Die Versandkosten können nicht 0 sein', + 'shipping_costs_were_not_calculated_correctly' => 'Fehler: Die Versandkosten wurden nicht richtig berechnet', + 'compensation_products_cannot_be_0' => 'Fehler: Die Kompensationsprodukte können nicht 0 sein.', + 'link_for_homeparty_not_found' => 'Link für die Auszeitparty wurde nicht gefunden, oder ist nicht mehr aktiv.', + 'contact_delete' => 'Kontakt gelöscht', + 'error_occurred_with_order' => 'Es ist ein Fehler bei der Bestellung aufgetreten', + 'abo_deaktivert' => 'Abo-Option deaktiviert', + 'error_checkbox_not_confirm' => 'Fehler: Checkbox nicht bestätigt', + 'no_change_made' => 'keine Änderung vorgenommen', + 'booked_package_has_been_changed' => 'gebuchtes Paket wurde geändert.', + 'cancel_membership_is_requested' => 'Mitgliedschaft beenden ist beantragt', + 'file_uploaded' => 'Datei hochgeladen', + 'file_empty' => 'Datei leer"', + 'file_deleted' => 'Datei gelöscht', + 'file_not_found' => 'Datei nicht gefunden', + 'country_account_has_been_changed__cost_has_been_reset' => 'Das Rechnungsland wurde geändert und der Warenkrob zurückgesetzt', + 'your_shopping_cart_is_empty_please_add_products_first.' => 'Dein Warenkorb ist leer, bitte füge erst Produkte hinzu', + 'homeparty_guest_delete' => 'Auszeitparty Gast gelöscht', + 'homeparty_delete' => 'Auszeitparty gelöscht', + 'VATID_could_not_be_validated' => 'Die UST-ID konnte nicht validiert werden, Eingabe bitte prüfen und erneut eingegeben', + 'VATID_successfully_entered' => 'UST-ID erfolgreich eingetragen', + 'reverse_charge_procedure_and_VATID_deleted' => 'Reverse Charge Verfahren und UST-ID gelöscht', + 'no_id_card_deposited_please_upload_first' => 'Kein Ausweis hinterlegt, bitte erst hochladen', + 'no_trade_licence_deposited_please_upload_first' => 'Kein Gewerbeschein hinterlegt, bitte erst hochladen', + 'please_enter_reason_why_you_not_need_trade_licence' => 'Bitte gib eine Begründung ein, warum Du keinen Gewerbeschein benötigst', + 'please_select_compensation_product' => 'Bitte wähle ein Kompensationsprodukt aus', + 'please_select_count_compensation_products' => ' Bitte wähle :count Kompensationsprodukte aus', + 'user_not_found' => 'Der Berater wurde nicht gefunden.
Der Account wurde deaktiviert oder gelöscht.', + 'shopping_cart_was_not_user_shop' => 'Fehler: Der Berater hat keinen Shop, die Bestellung kann nicht fortgesetzt werden', + 'shopping_instance_not_found' => 'Fehler: Es wurde keine ShoppingInstance gefunden', + 'shopping_user_not_found' => 'Fehler: Es wurde kein ShoppingUser gefunden', +]; +/* +{{ __('msg.') }} +__('msg.') +msg.name +*/ + diff --git a/resources/lang/de/navigation.php b/resources/lang/de/navigation.php index 0a10c8e..6f9ad6c 100755 --- a/resources/lang/de/navigation.php +++ b/resources/lang/de/navigation.php @@ -50,5 +50,8 @@ return [ 'my_promotions' => 'Meine Promotions', 'my_profile' => 'Mein Profil', 'recharge_credit'=>'Guthaben aufladen', - + 'clients_orders' => 'Kunden Bestellungen', + 'my' => 'Meine', + 'sales_volumes' => 'Absatzmengen', + 'evaluation' => 'Auswertungen' ]; diff --git a/resources/lang/de/order.php b/resources/lang/de/order.php new file mode 100644 index 0000000..8ee513f --- /dev/null +++ b/resources/lang/de/order.php @@ -0,0 +1,112 @@ + 'Kunden hinzufügen', + 'advertising_material' => 'Werbemittel', + 'adviser_collective_invoice' => 'Berater Sammelrechnung', + 'adviser_order_for_membership' => 'Beraterbestellung für Mitgliedschaft', + 'adviser_order_for_registration' => 'Beraterbestellung für Registrierung', + 'art_no' => 'Art-Nr.', + 'article' => 'Artikel', + 'article_remove' => 'Artikel entfernen', + 'assigned_advisor' => 'Berater zuordnen', + 'assigned_counsellor' => 'Zugewiesener Berater', + 'billing_address_of_client' => 'Rechnungsadresse des Kunden', + 'billing_address_of_the_advisor' => 'Rechnungsadresse des Beraters', + 'client_order_via_shop' => 'Kundenbestellung über Shop', + 'collective_invoice' => 'Sammelrechnung', + 'collective_invoice_contains_orders' => 'Sammelrechnung behinhaltet folgende Kundenbestellungen', + 'compensation_product' => 'Kompensationsprodukt', + 'confirm_and_proceed_to_checkout' => 'bestätigen und weiter zur Kasse', + 'confirm_and_proceed_to_order' => 'bestätigen und weiter zur Bestellung', + 'consultant_order_for_home_party' => 'Beraterbestellung für eine Homeparty', + 'content' => 'Inhalt', + 'contents' => 'Inhalte', + 'create_invoice' => 'Rechnung erstellen', + 'date' => 'Datum', + 'delivery_address_of_the_client' => 'Lieferadresse des Kunden', + 'delivery_address_of_the_consultant' => 'Lieferadresse des Berater', + 'delivery_country_can_no_longer_be_changed' => 'Das Lieferland kann nicht mehr geändert werden', + 'delivery_country_changed_customer_info' => 'Das Lieferland kann nur beim Kunden unter
Meine Kunden geändert werden.', + 'delivery_country_changed_info' => 'Das Lieferland kann nur unter Meine Daten geändert werden.', + 'delivery_note' => 'Lieferschein', + 'delivery_to_me' => 'Lieferung an mich', + 'delivery_to_the_customer' => 'Lieferung an den Kunden', + 'deliverydata' => 'Lieferdaten', + 'different_delivery_address' => 'Abweichende Lieferadresse', + 'error_no_address_data_found' => 'Fehler: Keine Adressdaten gefunden!', + 'external_orders' => 'Externe Bestellungen', + 'external_orders_info_pay' => 'bezahlen = Sammelrechnung erstellen und zum Checkout', + 'external_orders_info_remove' => 'entfernen = Bestellungen werden nach entfernt verschoben, für Stornos etc.', + 'external_orders_info_reset' => ' zurücksetzen = Bestellungen werden nur nach offen verschoben, Sammelrechnung werden nicht geändert', + 'goods_are_for_customer_and_shipped' => 'Ware ist für einen Kunden und wird an den Kunden versendet', + 'goods_are_for_me_and_shipped' => 'Ware ist für mich und wird an meine Adresse versendet', + 'gross' => 'brutto', + 'gross_price' => 'Preis brutto', + 'incentives' => 'Incentives', + 'included_VAT' => 'Enthaltene MwSt', + 'invoice' => 'Rechnung', + 'invoice_address' => 'Rechnungsadresse', + 'land_can_no_longer_be_changed' => 'Das Land kann nicht mehr geändert werden', + 'link_to_the_invoice' => 'Link zur Rechnung', + 'my_delivery_address' => 'Meine Lieferadresse', + 'net' => 'netto', + 'net_price' => 'Preis netto', + 'no_address_created' => 'Keine Adresse angelegt', + 'no_career_level_info' => 'Hinweis: Dir wurde noch kein Karriere-Level zugewisen. Bitte wende dich an info@mivita.care', + 'no_delivery_address' => 'Keine Lieferadresse angelegt ', + 'no_order' => 'Keine Bestellung', + 'number_of_items' => 'Anzahl Artikel', + 'order' => 'Bestellung', + 'order_consultant' => 'Bestellung Berater', + 'order_date' => 'Bestelldatum', + 'order_for_client' => 'Bestellung für Kunde', + 'order_for_consultant' => 'Bestellung für Berater', + 'order_number' => 'Bestellnummer', + 'order_via_external_shop' => 'Bestellung über externen SHOP', + 'plus_VAT' => 'zzgl. MwSt', + 'points' => 'Points', + 'points_total' => 'Points gesamt', + 'points_turnover_assigned' => 'Punkte / Umsatz zugewiesen', + 'product' => 'Produkt', + 'product_prices_career_level_info' => 'Die Produktpreise (Mein Preis) werden entsprechend Deinem Karriere-Level :user_level_name abzüglich :user_level_margin % Marge angezeigt und brechnet.
Hinweis: Wenn Du den die Seite verlässt, wird der Warenkorb zurückgesetzt.', + 'product_prices_career_level_cpay_info' => 'Die Produktpreise werden als Kunden VK-Preise angezeigt, nach Abschluss der Kundenzahlung erhälst du Deine Provision entsprechend Deinem Karriere-Level :user_level_name Provision :user_level_margin %.
Hinweis: Wenn Du den die Seite verlässt, wird der Warenkorb zurückgesetzt.', + 'purchased_from_shop' => 'Gekauft im Shop', + 'quantity' => 'Anzahl', + 'ship_to_existing_customer_select_customer' => 'An bestehenden Kunden versenden | Kunden auswählen', + 'ship_to_new_customer' => 'An neuen Kunden versenden', + 'ship_to_this_customer' => 'An diesen Kunde versenden', + 'ship_to_this_customer_check' => 'Mir ist bekannt, dass dieser Bestellvorgang nur für Kundenbestellungen ist und nicht für meine eigenen Bestellungen', + 'ship_to_this_customer_info' => 'Sollten unten stehende Angaben nicht korrekt sein oder aktualisiert werden müssen, ändere diese bitte vorerst unter', + 'shipping' => 'Versand', + 'shipping_compensation_product' => 'Versand Kompensationsprodukt', + 'shipping_costs' => 'Versandkosten', + 'shopping_cart' => 'Warenkorb', + 'shopping_cart_delete' => 'Warenkorb löschen', + 'shopping_cart_update' => 'Warenkorb aktualisieren', + 'subtotal' => 'Zwischensumme', + 'sum' => 'Summe', + 'sums' => 'Summen', + 'total' => 'Gesamt', + 'total_gross' => 'Gesamtsumme brutto', + 'total_net' => 'Gesamtsumme netto', + 'total_price' => 'Preis gesamt', + 'total_shipping_costs' => 'Gesamte Versandkosten', + 'total_sum' => 'Gesamtsumme', + 'total_sums' => 'Gesamtsummen', + 'total_without_VAT' => 'Summe ohne MwSt', + 'turnover' => 'Umsatz', + 'unit_price' => 'Einzelpreis', + 'weight' => 'Gewicht', + 'you_has_article_in_shopping_cart' => 'Du hast :num Artikel in Deinem Warenkorb', + 'excl' => 'zzgl.', + 'ipay' => 'ich zahle', + 'cpay' => 'Kunde zahlt', + 'ipay_text' => 'Ich zahle abzüglich meiner Marge und rechne den VK mit meinem Kunden ab', + 'cpay_text' => 'Mein Kunden bekommt einen Zahlungslink und ich erhalten meine Provision', + 'sum_net' => 'Summe netto', + 'confirm_and_send_order' => 'Bestellung abschließen und Zahlungslink versenden', + 'confirm_send_order_info' => 'Mit dem Abschließen der Bestellung wird ein Zahlungslink erstellt und per E-Mail an Deinen Kunden versendet.
Dein Kunde kann dann die Zahlung abschließen und die Ware wird versendet, Deine Provision wird mit dem Abschluss der Zahlung gutgeschrieben.', + 'order_was_placed_successfully' => 'Die Bestellung wurde erfolgreich aufgegeben.', + 'payment_link_for_your_customer' => 'Der Bezahllink für Deinen Kunden', +); diff --git a/resources/lang/de/payment.php b/resources/lang/de/payment.php index 1f7342d..c5237ef 100755 --- a/resources/lang/de/payment.php +++ b/resources/lang/de/payment.php @@ -1,6 +1,136 @@ '', + 'BIC' => 'BIC', + 'IBAN' => 'IBAN', + 'Mastercard' => 'Mastercard', + 'VAT' => 'MwSt', + 'VISA' => 'VISA', + 'accepted_data_checkbox_customer' => 'Mit Klick auf "Jetzt kaufen" akzeptiere ich die :gtc, die :c_policy und die :p_policy damit für die Bestellung meine Daten verarbeitet werden können.', + 'accepted_data_checkbox_user' => 'Mit Klick auf "Jetzt kaufen" akzeptiere ich die Allgemeinen Geschäftsbedingungen und die Datenschutzbelehrung, damit für die Bestellung meine Daten verarbeitet werden können.', + 'account_holder' => 'Kontoinhaber', + 'agree_SEPA_complete_purchase' => 'SEPA-Lastschriftmandat zustimmen und kauf abschließen', + 'auto_renewal_hl' => 'Automatische Verlängerung', + 'auto_renewal_line_1' => 'Sicher ist sicher! Wir empfehlen, diese Option zu aktivieren, wenn Du Deine jährliche Mitgliedschaft dauerhaft bestehen lassen möchtest. Denn geht eine manuelle Zahlung nach Ablauf der Jahresmitgliedschaft nicht zeitig ein, deaktiviert das System Deinen Onlineshop bzw. Deinen Zugang zum Salescenter. Dann kannst Du keine Bestellungen mehr tätigen oder Einblick in Deinen Statistiken erhalten, bis eine erneute Zahlung Deinen Account reaktiviert. Daher raten wir Dir, die Zahlung per SEPA-Lastschrift zu tätigen. Wir speichern dieses Mandat und buchen 14 Tage vor Ablauf Deine Jahresgebühr automatisch ab. So hast Du einen reibungslosen Prozess, ohne dass Du darauf achten musst.', + 'auto_renewal_line_2' => 'Du kannst diese Option natürlich jederzeit in Deinem Account rückgängig machen bzw. Deinen Account / Deine Vertriebspartnerschaft bei MIVITA kündigen.', + 'automatic_SEPA_mandate_type_was_selected' => 'Automatische Verlängerung wurde ausgewählt. Dein SEPA-Mandart wird gespeichert und die jährliche Zahlung automatisch ausgeführt.', + 'back_to_shop' => 'zurück zum Shop', + 'back_to_shop_shopping_cart' => 'zurück zum Warenkorb', + 'bank' => 'Bank', + 'billing_address' => 'Rechnungsadresse', + 'billing_address_can_only_changed_in_salescentre' => 'Deine Rechnungsadresse kann nur im Salescenter geändert werden.', + 'buy_now' => 'Jetzt kaufen', + 'buy_now_copy' => 'Sind alle Deine Angaben vollständig ausgefüllt, klicke auf "Jetzt kaufen" und Du wirst zu unserem Zahlungsanbieter weitergeleitet, die Verbindung ist SSL verschlüsselt.', + 'c_policy' => 'Widerrufsbelehrung', + 'checkout_ssl_server' => 'Du wirst auf unseren checkout Server weitergeletet, die Verbindung ist SSL verschlüsselt.', + 'country_of_delivery' => 'Lieferland', + 'credit_card' => 'Kreditkarte', + 'credit_card_number' => 'Kreditkartennummer', + 'delivery_country_can_only_changed_in_salescentre' => 'Das Lieferland kann nur im Salescenter geändert werden.', + 'delivery_country_cannot_change' => 'Das Lieferland kann nicht geändert werden.', + 'excl' => 'zzgl.', + 'firstname_lastname' => 'Vorname Nachname', + 'gtc' => 'Allgemeinen Geschäftsbedingungen', + 'month' => 'Monat', + 'months' => 'Monate', + 'ordering_country' => 'Bestellland', + 'owner' => 'Inhaber', + 'p_policy' => 'Datenschutzerklärung', + 'payment_by_SEPA' => 'Bezahlung per SEPA', + 'payment_by_SEPA_info' => 'Deine Zahlung wird bearbeitet, eine Bestätigung zur Zahlungsabwicklung wird automatisch erstellt.', + 'payment_by_credit_card' => 'Bezahlung per Kreditkarte:', + 'payment_by_credit_card_info' => 'Deine Zahlung wurde genehmigt, eine Bestätigung der Zahlung wird automatisch erstellt.', + 'payment_by_invoice' => 'Bezahlung per Rechnung', + 'payment_by_invoice_info' => 'Deine Bestellung wird bearbeitet, eine Bestätigung zur Bestellungsabwicklung wird automatisch erstellt', + 'payment_in_advance' => 'Bezahlung per Vorkasse', + 'payment_method' => 'Zahlungsart', + 'payment_method_not_enabled_please_contact' => 'Zahlungsmethode nicht freigeschaltet, bitte wende dich an', + 'paypal' => 'PayPal', + 'please_check_form_and_complete' => ' Bitte überprüfe das Formular und vervollständigen alle Angaben.', + 'please_transfer_amount_following_account' => 'Bitte überweise :amount EUR auf die folgende Kontoverbindung, um den Kauf abzuschließen.', + 'prepayment' => 'Vorkasse', + 'purchase_on_account' => 'Rechnungskauf', + 'reason_for_payment' => 'Verwendungszweck', + 'remaining_time' => 'Restlaufzeit', + 'reverse_charge_procedure' => 'Reverse Charge Verfahren', + 'select_and_proceed_to_checkout' => 'wählen und weiter zur Kasse', + 'select_and_save' => 'auswählen und speichern', + 'sepa_direct_debit' => 'SEPA Lastschrift', + 'sofort_bank_transfer' => 'Sofort -Überweisung', + 'status' => + array ( + 'checkout_cancel' => ' Zahlungsvorgang Abbruch', + 'checkout_error' => 'Zahlungsvorgang Fehler', + 'checkout_payment' => 'Checkout', + 'payment_approved' => 'Zahlung genehmigt - bitte auf E-Mail warten', + 'payment_error' => 'Zahlung Fehler', + 'payment_not_found' => 'Zahlung nicht gefunden', + 'payment_redirect' => 'Zahlung in Bearbeitung - bitte auf E-Mail warten', + 'store_payment' => 'Zahlung gespeichert', + 'success' => 'Erflogreich ausgeführt', + 'success_payment' => 'Zahlung erflogreich', + 'txaction_appointed' => 'Zahlung genehmigt - E-Mail wurde gesendet, bitte warten auf Bestätigung', + 'txaction_failed' => 'Zahlung fehlgeschlagen - E-Mail wurde gesendet', + 'txaction_paid' => 'Zahlung bestätigt - E-Mail wurde gesendet', + ), + 'thank_you_very_much' => 'Vielen Dank,', + 'total_amount' => 'Gesamtbetrag', + 'valid until' => 'Gültis bis', + 'verification_no' => 'Prüfnr.', + 'we_have_received_your_order_get_email' => 'Deine Bestellung ist bei uns eingegangen. In Kürze erhälst Du von uns eine Bestellbestätigungsmail.', + 'your_mivita_team' => 'Dein Team von mivita.care', + 'your_order_number_is' => 'Deine Bestellnummer ist', + 'open'=>'offen', + 'paid'=>'bezahlt', + 'check'=>'prüfen', + 'cancelled'=>'storniert', + + 'failed' => 'abbruch', + 'no_payment' => 'keine Zahlung', + + 'paymend_paid' => 'Zahlung bezahlt', + 'paymend_open' => 'Zahlung offen', + 'paymend_failed' => 'Zahlung abbruch', + 'extern_open' => 'Extern offen', //offen + 'extern_paid' => 'Extern bezahlt', + 'invoice_open' => 'Rechnung offen', + 'invoice_paid' => 'Rechnung bezahlt', + 'invoice_no_payment' => 'Rechnung keine Zahlung', + + 'to_sales_tax_de'=> 'umsatzsteuerpflichtig / DE', + 'not_to_sales_tax_de'=> 'nicht umsatzsteuerpflichtig / DE', + 'not_to_sales_tax_foreign'=> 'nicht umsatzsteuerpflichtig / Ausland', + + 'ordered'=> 'bestellt', + 'paid'=> 'bezahlt', + 'removed'=> 'entfernt', + 'registration'=> 'Registrierung', + + 'not_assigned' => 'nicht zugewiesen', + 'advisor_order' => 'Beraterbestellung', + 'credit'=> 'Gutschrift', + 'shoporder' => 'Shopbestellung', + 'shoporder_pending' => 'Shopbestellung / pending', + 'membership'=> 'Mitgliedschaft', + 'order'=> 'Bestellung', + 'customer_order'=> 'Kundenbestellung', + 'homeparty'=> 'Homeparty', + 'shop'=> 'Shop', + 'external'=> 'extern', + 'collective_invoice'=> 'Sammelrechnung', + + 'in_process'=> 'in Bearbeitung', + 'shipped'=> 'versendet', + 'completed'=> 'abgeschlossen', + 'trade_fair'=> 'Messe', + 'commission_shop'=> 'Provision Shop', + 'commission_payline'=> 'Provision Payline', + 'commission_growth_bonus'=> 'Provision Wachstumsbonus', + 'commission_team' => 'Provision Team', + 'credit_added' => 'Guthaben hinzugefügt', + 'commission' => 'Provision', + 'status' => [ 'store_payment' => 'Zahlung gespeichert', @@ -25,5 +155,7 @@ return [ 'user_order_return' => 'Rückführung durch Storno', 'promotion_order_deduction' => 'Abzug durch Promotion Produkt', 'promotion_order_return' => 'Rückführung durch Promotion Produkt', + 'charging_credits_add' => 'Guthaben aufgeladen', + 'charging_credits_remove' => 'Guthaben abgezogen', +]; -]; \ No newline at end of file diff --git a/resources/lang/de/pdf.php b/resources/lang/de/pdf.php new file mode 100644 index 0000000..db03a24 --- /dev/null +++ b/resources/lang/de/pdf.php @@ -0,0 +1,52 @@ + 'mivita e.K. • Leinfeld 2 • 87755 Kirchhaslach', + 'adviser_id' => 'Berater-ID', + 'date' => 'Datum', + 'credit_no' => 'Gutschrifts-Nr.', + 'tax_no' => 'Steuer-Nr', + 'vat_no' => 'USt-IdNr.', + 'credit_note' => 'GUTSCHRIFT', + 'credit_note_from' => 'Gutschrift aus', + 'amount' => 'Betrag', + 'vat_text' => 'Mehrwertsteuer', + 'amount_paid_out_gross' => 'Auszahlungsbetrag (Brutto)', + 'net_amount' => 'Nettobeträge', + 'as_a_small_entrepreneur_info' => 'Als Kleinunternehmer im Sinne von § 19 Abs. 1 UStG wird keine Umsatzsteuer berechnet.', + 'reverse_charge_procedure_info' => 'Reverse-Charge-Verfahren, Umkehr der Steuerschuldnerschaft.', + 'delivery_note_no' => 'Lieferschein-Nr.', + 'order_no' => 'Bestell-Nr.', + 'delivery_note' => 'LIEFERSCHEIN', + 'we_are_always_there_for_questions' => 'Bei Fragen sind wir jederzeit für Dich da.', + 'your_advisor' => 'Dein Berater', + 'eprice' => 'E-Preis', + 'off' => 'aus', + 'net' => 'netto', + 'total_incl_VAT' => 'Summe inkl. der gesetzlichen MwSt.', + 'ek' => 'EK', + 'invoice_nr' => 'Rechnungs-Nr.', + 'points' => 'Points', + 'points_order' => 'Points Bestellung', + 'points_shop' => 'Points Shop', + 'invoice' => 'RECHNUNG', + 'payment_type' => 'Zahlungsart', + 'status_of_invoice' => 'Status der Rechnung', + 'delivery_date_is_invoice_date' => 'Lieferdatum entspricht dem Rechnungsdatum.', + 'prices_net' => 'Preise netto', + 'vat_id_of_the_recipient_of_the_service' => 'USt-ID des Leistungsempfängers', + 'vat_of_the_recipient_of_the_service' => 'Steuernummer des Leistungsempfängers', + 'invoice_does_not_include_vat' => 'Die Rechnung erfolgt ohne Umsatzsteuer, da vorliegend der Wechsel der Steuerschuldnerschaft (Reverse-Charge-Verfahren) greift.', + 'vat_is_declared_and_paid_by_recipient' => 'Die Umsatzsteuer ist vom Leistungsempfänger anzumelden und abzuführen.', + 'tax_free_export_delivery_noteu' => 'Steuerfreie Ausfuhrlieferung ins Drittland', + 'tax_free_export_delivery_eu' => 'Steuerfreie Ausfuhrlieferung ins EU-Ausland', + + 'intended_use' => 'Verwendungszweck', + 'invoice_footer_info' => ' Bei Kauf auf Rechnung / Vorauskasse, bitte den Gesamtbetrag innerhalb von 5 Werktagen auf unten stehendes Konto überweisen.' + +]; +/* +{{ __('pdf.') }} + {{ __('pdf.name') }} +pdf.name +*/ diff --git a/resources/lang/de/register.php b/resources/lang/de/register.php index 8f67ffc..d461c4f 100644 --- a/resources/lang/de/register.php +++ b/resources/lang/de/register.php @@ -24,5 +24,11 @@ return [ 'business_license_now' => 'Gewerbeschein jetzt hochladen', 'business_license_later' => 'Ich reiche meinen Gewerbeschein innerhalb der nächsten 4 Wochen nach', 'business_license_non' => 'Ich benötige keinen Gewerbeschein', - 'business_license_non_text' => 'Außerhalb Deutschlands gibt es unterschiedliche Regelungen um Thema Gewerbeschein (z. B. Österreich oder Schweiz). Solltest Du für dieses Business oder zur Zeit keinen Gewerbeschein haben müssen, begründe dies hier bitte kurz:' + 'business_license_non_text' => 'Außerhalb Deutschlands gibt es unterschiedliche Regelungen um Thema Gewerbeschein (z. B. Österreich oder Schweiz). Solltest Du für dieses Business oder zur Zeit keinen Gewerbeschein haben müssen, begründe dies hier bitte kurz:', + 'reg_verify_info' => 'Für die Registrierung verifizieren wir Deine E-Mail-Adresse. Im nächsten Schritt bekommst Du eine E-Mail gesendet, mit der Du Deine Registrierung bestätigst. Erst dann ist deine Registrierung abgeschlossen.', + 'verify_exists-info1' => 'Deine E-Mail-Adresse :email wurde bereits registriert', + 'verify_exists-info2' => 'Für Deine Registrierung musst Du deine E-Mail-Adresse verifizieren.', + 'verify_exists-info3' => 'Du kannst Dir erneut eine E-Mail senden lassen, mit der Du Deine Registrierung bestätigst. Erst dann ist deine Registrierung abgeschlossen.', + 'verify_email' => 'E-Mail verifizieren', + 'verify_email_again' => 'E-Mail erneut senden' ]; diff --git a/resources/lang/de/shop.php b/resources/lang/de/shop.php new file mode 100644 index 0000000..f13f7c1 --- /dev/null +++ b/resources/lang/de/shop.php @@ -0,0 +1,11 @@ + 'Ich freue mich über Deinen Besuch in meinem grueneseele.bio Onlineshop. Ich bin Deine persönliche Beratung rund um die Produkte und ihrer Anwendung.', + 'default_user_open' => "Mo-Fr: 9.00 - 18.00 Uhr\nSa: 11.00 - 17.00 Uhr", + 'headline' => 'Willkommen', + 'description' => 'Ich freue mich über Deinen Besuch in meinem Partnershop von GRÜNE SEELE. Viel Spaß beim Stöbern und Shoppen!', + 'greetings' => 'Liebe Grüße', + 'personal_infos' => 'Weitere persönliche Infos ...', + 'incl_VAT_plus_shipping' => '* inkl. gesetzl. MwSt. | zzgl. Versandkosten' +]; diff --git a/resources/lang/de/tables.php b/resources/lang/de/tables.php new file mode 100644 index 0000000..d893c6f --- /dev/null +++ b/resources/lang/de/tables.php @@ -0,0 +1,79 @@ + '', + 'VAT' => 'MwSt', + 'account' => 'Account', + 'account_to' => 'Account bis', + 'activ' => 'Aktiv', + 'addition' => 'Zusatz', + 'address' => 'Adresse', + 'adviser_no' => 'Berater Nr.', + 'amount' => 'Betrag', + 'art' => 'Art', + 'article_no' => 'Artikel-Nr.', + 'assigned_advisor' => 'zugewiesener Berater', + 'birthday' => 'Geburtstag', + 'c_no' => 'G.Nr.', + 'city' => 'Ort', + 'commission' => 'Provision', + 'contents' => 'Inhalt', + 'country' => 'Land', + 'created' => 'erstellt', + 'credit_note' => 'Gutschrift', + 'customer' => 'Kunde', + 'date' => 'Datum', + 'detail' => 'Detail', + 'earnings' => 'Verdienst', + 'ek_price' => 'EK-Preis', + 'email' => 'E-Mail', + 'firstname' => 'Vorname', + 'from_credit_balance' => 'aus Guthaben', + 'gross' => 'brutto', + 'image' => 'Bild', + 'in_no' => 'Rechnung-Nr.', + 'info' => 'Info', + 'invoice' => 'Rechnung', + 'label' => 'Bezeichnung', + 'lastname' => 'Nachname', + 'level' => 'Level', + 'line' => 'Linie', + 'margin' => 'Marge', + 'mobil' => 'Mobil', + 'my_price_gross' => 'Mein Preis brutto', + 'my_price_net' => 'Mein Preis netto', + 'net' => 'netto', + 'net_price' => 'Netto-Preis', + 'net_sales' => 'Umsatz netto', + 'net_sum' => 'Summe Netto', + 'newsletter' => 'Newsletter', + 'note' => 'Notiz', + 'number' => 'Nummer', + 'order' => 'Bestellung', + 'payline_qualification' => 'Payline Qualifikation', + 'payment' => 'Zahlung', + 'payment_type' => 'Zahlungsart', + 'phone' => 'Tel', + 'points' => 'Points', + 'postcode' => 'PLZ', + 'price' => 'Preis', + 'product' => 'Produkt', + 'products' => 'Produkte', + 'purchased_in_the_shop' => 'Gekauft im Shop', + 'purchases' => 'Käufe', + 'qualification' => 'Qualifikation', + 'quantity' => 'Anzahl', + 'reference_number' => 'Referenznummer', + 'rf_no' => 'Rf-Nr.', + 'shipping' => 'Versand', + 'shop' => 'Shop', + 'shop_commission' => 'Shop Provision', + 'sponsor' => 'Sponsor', + 'status' => 'Status', + 'subject' => 'Betreff', + 'sum' => 'Summe', + 'total' => 'Gesamt', + 'type' => 'Art', + 've' => 'VE', + 'vk_price' => 'VK-Preis', +); diff --git a/resources/lang/de/validation.php b/resources/lang/de/validation.php index bc985cd..30447d6 100755 --- a/resources/lang/de/validation.php +++ b/resources/lang/de/validation.php @@ -213,6 +213,7 @@ return [ 'sales_partnership_message' => 'Vertriebspartnerschaft Hinweis', 'tax_number' => 'Steuernummer', 'tax_identification_number' => 'USt-ID Nummer', - 'user_promotion_url' => "Promotion Domain" + 'user_promotion_url' => "Promotion Domain", + 'user_shop_url' => "Shop Domain" ], ]; diff --git a/resources/views/admin/attribute/index.blade.php b/resources/views/admin/attribute/index.blade.php index 220b649..982a84a 100755 --- a/resources/views/admin/attribute/index.blade.php +++ b/resources/views/admin/attribute/index.blade.php @@ -1,7 +1,7 @@ @extends('layouts.layout-2') @section('content') -
+
{{__('Attribute')}}
@@ -12,56 +12,118 @@   {{__('Pos')}} {{__('Description')}} - {{__('Translate') }} + {{__('Wert') }} + {{__('Type') }} {{__('Status')}} - @foreach($values as $value) + @foreach($attributes as $value) - {{ $value->pos }} {{ $value->name }} - {{ $value->getTranNames() }} + {{ $value->value }} + {{ $value->attribute_type->name }} @if($value->active) @else@endif - + @endforeach
- +
+
+ +
+ +
+
+ {{__('Attribute')}} {{__('Types')}}
+ + Neue Attribute Typen müssen müssen je nach Funktion und Anforderungen einprogrammiert werden + +
+

+
+ + + + + + + + + + + + + @foreach($attribute_types as $value) + + + + + + + + + + @endforeach + +
 {{__('Pos')}}{{__('Description')}}{{__('Beschreibung')}}{{__('Status')}}
+ + {{ $value->pos }}{{ $value->name }}{{ $value->description }}@if($value->active) @else@endif
+
+ + >{{__('Neuen Attribute Type erstellen')}}
- - +
+
+ {{ __('White-Label') }} +
+
+
+
+ +
+
+ + {{ Form::text('whitelabel_name', $product->whitelabel_name, array('placeholder'=>__('Bezeichnung'), 'class'=>'form-control', 'id'=>'whitelabel_name')) }} +
+
+ + +
+ Die nur die möglichen Varianten die ausgewählt sind, können einzelnen VP und Etiketten zugeordnet werden. +
+ +
+
+
+ + @foreach($product->whitelabel_images as $image) +
+
+
+
+ +
+
+ + + Etikett löschen +
+ @endforeach + +
+
+ + +   +
+
+
+
- {{ __('Inhalte') }} + {{ __('Details') }}
@@ -274,6 +342,7 @@ {{ Form::text('icons', $product->icons, array('placeholder'=>__('icons'), 'class'=>'form-control', 'id'=>'icons')) }}
+ {{--
+ --}}
@@ -295,12 +365,20 @@ {{ Form::textarea('ingredients', $product->ingredients , array('placeholder'=>__('ingredients'), 'class'=>'form-control summernote', 'id'=>'ingredients')) }}
+ +
+
+
+   + +
+
- {{ __('Inhalte') }} + {{ __('Inhaltsstoffe') }}
@@ -333,10 +411,15 @@ Inhaltsstoffe anlegen
-
-   -
+
+
+
+
+   + +
+
@if(Auth::user()->isSySAdmin()) @@ -365,6 +448,13 @@ {{ Form::text('wp_number', $product->wp_number, array('placeholder'=>__('WP Number'), 'class'=>'form-control', 'id'=>'wp_number')) }} +
+
+
+   + +
+
@endif \ No newline at end of file diff --git a/resources/views/admin/product/images.blade.php b/resources/views/admin/product/images.blade.php index dccaa9b..f4a51b5 100755 --- a/resources/views/admin/product/images.blade.php +++ b/resources/views/admin/product/images.blade.php @@ -50,6 +50,8 @@
@csrf + +
{{__('Grundpreis')}} {{__('Gewicht')}} {{__('sichbar')}} +
{{__('WL')}}
{{__('KP')}}
{{__('MK')}}
{{__('ER')}}
+
{{__('AA')}}
+ {{__('Status')}} @@ -59,10 +62,12 @@ {{ $value->getUnitType() }} {{ $value->getBasePriceFormatted() }} {{ $value->weight }} - {!! implode($value->getShowOnTypes(), '
') !!} + {!! $value->getShowOnTypes('
') !!} + {!! get_active_badge($value->whitelabel, $value->whitelabel_name) !!} {!! get_active_badge($value->shipping_addon) !!} {!! get_active_badge($value->max_buy) !!} {!! get_active_badge($value->single_commission) !!} + {!! get_active_badge($value->exclude_stats_sales) !!} {!! get_active_badge($value->active) !!}   diff --git a/resources/views/admin/product/upload_whitelabel.blade.php b/resources/views/admin/product/upload_whitelabel.blade.php new file mode 100644 index 0000000..732a152 --- /dev/null +++ b/resources/views/admin/product/upload_whitelabel.blade.php @@ -0,0 +1,68 @@ + + + diff --git a/resources/views/admin/sales/_detail.blade.php b/resources/views/admin/sales/_detail.blade.php index 0a5dcaf..8a343e3 100644 --- a/resources/views/admin/sales/_detail.blade.php +++ b/resources/views/admin/sales/_detail.blade.php @@ -3,13 +3,14 @@
-
+
Status: - {!! \App\Services\Payment::getShoppingOrderBadge($shopping_order); !!} - + {!! \App\Services\Payment::getPaymentForTypeBadge($shopping_order) !!} + {!! \App\Services\Payment::getShoppingOrderBadge($shopping_order) !!} +
-
+
Versand: @if($isAdmin)
-
+
Rechnung: @if($isAdmin) @if(App\Services\Invoice::isInvoice($shopping_order)) - @if(false && Auth::user()->isSySAdmin()) - @endif @else @@ -57,6 +58,22 @@ @endif @endif
+ +
+ @if ($isAdmin) + Lieferschein: + @if (App\Services\Invoice::isDelivery($shopping_order)) + + + + + @endif + + @endif +
@@ -504,6 +521,45 @@

+ @if($shopping_order->shopping_order_margin) + +
+ +
+ Provisionen / Handelspanne +
+
+ +
+
Einzelrabatt
+ {{ number_format( $shopping_order->shopping_order_margin->getRestoreContent('commission')->single_value_commission, 2, ",", ".") }} +
+
+
Staffelrabatt
+ @foreach ($shopping_order->shopping_order_margin->getRestoreContent('items') as $item) + ab {{ $item->price_from }} / {{ $item->trading_margin }}% : + {{ number_format($item->value_margin , 2, ",", ".") }} €*
+ @endforeach +
+ @if($isAdmin) +
+
Provisionen Vertriebspartner
@if($shopping_order->member){{ $shopping_order->member->getFullName(false) }} @endif
+ {{$shopping_order->shopping_order_margin->getFormattedNetDiscount()}} € +
+
+
Provisionen Sponsor
@if($shopping_order->member && $shopping_order->member->user_sponsor) {{ $shopping_order->member->user_sponsor->getFullName(false) }} @endif
+ @if($shopping_order->shopping_order_margin->net_partner_commission) + {{ $shopping_order->shopping_order_margin->getFormattedNetPartnerCommission() }} € + @endif +
+ @endif +
+
+ +
+ + @endif + @if($shopping_order->txaction === 'extern')
@if($shopping_order->wp_invoice_path) @@ -669,7 +725,7 @@
diff --git a/resources/views/admin/settings/index.blade.php b/resources/views/admin/settings/index.blade.php index e356257..2a0a9ff 100755 --- a/resources/views/admin/settings/index.blade.php +++ b/resources/views/admin/settings/index.blade.php @@ -66,6 +66,13 @@ {{ Form::text('settings[pending_partner_commissions_in_days][val]', \App\Models\Setting::getContentBySlug('pending_partner_commissions_in_days'), array('class'=>'form-control')) }} {{ Form::hidden('settings[pending_partner_commissions_in_days][type]', 'int') }}
+
+ + {{ Form::text('settings[pending_order_margins_in_days][val]', \App\Models\Setting::getContentBySlug('pending_order_margins_in_days'), array('class'=>'form-control')) }} + {{ Form::hidden('settings[pending_order_margins_in_days][type]', 'int') }} +
+ +
@@ -102,7 +109,7 @@
-

Promotion

+

Promotion / Shop

diff --git a/resources/views/admin/stats/salesvolume.blade.php b/resources/views/admin/stats/salesvolume.blade.php new file mode 100755 index 0000000..1184deb --- /dev/null +++ b/resources/views/admin/stats/salesvolume.blade.php @@ -0,0 +1,146 @@ +@extends('layouts.layout-2') + +@section('content') + + @if ($errors->any()) +
+
+
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+
+
+ @endif + +
+
+ {{ __('navigation.products') }} {{ __('navigation.sales_volumes') }} +
+
+ {!! Form::open(['url' => route('admin_stats_sales_volumes_download'), 'class' => '']) !!} + {!! Form::hidden('key', 'value') !!} + +
+
+
+ +
+
+ +
+
+
+
+
+ Die Produktliste erst nach der Filtern von Monat und Jahr aktualisieren +
+
+ +
+
+ {!! Form::close() !!} + +
+
+ + + + + + + + + + + + + + + + + + + +
{{__('#') }}{{__('tables.product')}}{{__('tables.article_no')}}{{__('tables.quantity')}}{{__('tables.total')}} netto €Vorjahr {{__('tables.quantity')}}Vorjahr {{__('tables.total')}} netto €{{__('Einzelrabatt')}}{{__('Einzelrabatt %')}}{{__('VP Einzelrabatt in %')}}
+
+
+
+ Bei "Gesamter Umsatz", "Gesamte Rabatte", "Gesamt netto", sind die ausgeschlossenen Produkte einberechnet, da Rabatte auf Warenkorb-Ebene verrechnet werden und nicht auf Produkt-Ebene. +
+ +
+
+
+ + + +@endsection diff --git a/resources/views/admin/user/index.blade.php b/resources/views/admin/user/index.blade.php index 362edc5..2702779 100644 --- a/resources/views/admin/user/index.blade.php +++ b/resources/views/admin/user/index.blade.php @@ -18,10 +18,12 @@ {{__('Last name')}} {{__('E-Mail')}} {{__('Zugang')}} + {{__('Rolle')}} {{__('verified')}} (seit) {{__('active')}} (seit) {{__('Account')}} (bis) {{__('Zahlungsarten')}} + {{__('Land')}} {{__('Test Modus')}} {{__('login')}} {{__('delete')}} @@ -406,10 +408,12 @@ { data: 'last_name', name: 'account.last_name' }, { data: 'email', name: 'email' }, { data: 'admin', name: 'admin' }, + { data: 'role', name: 'role' }, { data: 'confirmed', name: 'confirmed' }, { data: 'active', name: 'active' }, { data: 'account', name: 'account' }, { data: 'my_payment_methods', name: 'my_payment_methods' }, + { data: 'country', name: 'country' }, { data: 'test_mode', name: 'test_mode' }, { data: 'action_login', orderable: false, searchable: false}, { data: 'action_delete', orderable: false, searchable: false}, diff --git a/resources/views/auth/existing.blade.php b/resources/views/auth/existing.blade.php new file mode 100644 index 0000000..0461893 --- /dev/null +++ b/resources/views/auth/existing.blade.php @@ -0,0 +1,50 @@ +@extends('layouts.auth') + +@section('content') + + +
+
+ +
+ +
+
+ +
+
+
+ gruene-seele-logo +
+
+
+ + +
{{ __('Register') }}
+ +
+ @csrf + {!! Form::hidden('register_email', $register_email) !!} +

{{ __('register.verify_exists-info1', ['email'=> $register_email ]) }}

+

{{ __('register.verify_exists-info2') }}

+

{{ __('register.verify_exists-info3') }}

+
+ +
+ + + +
+
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index 78e117b..c70e119 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -63,7 +63,7 @@
+@endsection + +@section('scripts') + @if(session('recaptcha_consent')) + + @endif @endsection \ No newline at end of file diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php index ba06811..d5f6707 100755 --- a/resources/views/dashboard.blade.php +++ b/resources/views/dashboard.blade.php @@ -21,7 +21,7 @@ {{-- --}}
Willkommen zurück, {{$user->account->first_name}}! -
Heute ist {{__('cal.weekdays.'.$now->format('l'))}}, {{$now->format('j')}}. {{__('cal.months.'.$now->format('F'))}} {{$now->format('Y')}}
+
Heute ist {{__('cal.weekdays.'.$now->format('l'))}} der {{$now->format('j')}}. {{__('cal.months.'.$now->format('F'))}} {{$now->format('Y')}}
@@ -141,6 +141,25 @@
--}} + @if($user->isActiveAccount()) +
+ +
+
+
Mein Shop
+
+
+ @if(!Auth::user()->shop) + Jetzt Deinen Shop einrichten + @else + Deinen Shop verwalten + @endif +
+
+
+ @endif + +
diff --git a/resources/views/layouts/auth.blade.php b/resources/views/layouts/auth.blade.php index b3020a2..7b5b962 100644 --- a/resources/views/layouts/auth.blade.php +++ b/resources/views/layouts/auth.blade.php @@ -112,6 +112,7 @@
+ @@ -123,7 +124,7 @@ - +@yield('scripts') \ No newline at end of file diff --git a/resources/views/layouts/includes/layout-sidenav.blade.php b/resources/views/layouts/includes/layout-sidenav.blade.php index 0dca677..7cd0f96 100644 --- a/resources/views/layouts/includes/layout-sidenav.blade.php +++ b/resources/views/layouts/includes/layout-sidenav.blade.php @@ -29,7 +29,6 @@
  • {{ __('navigation.revenue') }}
  • -
  • {{ __('navigation.my_data') }}
  • @@ -42,6 +41,34 @@ + @if(Auth::user()->isActiveAccount()) +
  • + + +
    {{ __('navigation.my_shop') }}
    +
    +
    +
    +
  • + @endif + + @if(Auth::user()->isActiveAccount()) +
  • + + +
    {{ __('navigation.my_promotions') }}
    +
    + +
  • + @endif + @if(Auth::user()->isActiveAccount())
  • @@ -55,6 +82,7 @@
  • @endif + @if(Auth::user()->isActiveAccount())
  • @@ -68,42 +96,31 @@
  • {{ __('navigation.add') }}
  • -
  • -
    {{ __('navigation.orders') }}
    -
  • + @endif + @if(Auth::user()->isActiveAccount()) -
  • - - -
    {{ __('navigation.my_orders') }}
    -
    - -
  • +
  • +
    {{ __('navigation.do_order') }}
    +
  • @endif - {{-- TODO Remove isAdmin --}} + @if(Auth::user()->isActiveAccount()) -
  • +
  • - -
    {{ __('navigation.my_promotions') }}
    + +
    {{ __('navigation.orders') }}
  • @endif @@ -127,10 +144,10 @@
  • {{ __('navigation.ingredients') }}
  • - {{--
  • +
  • {{ __('navigation.attribute') }}
  • - --}} + @@ -175,7 +192,6 @@
    {{ __('navigation.invoice') }}
    -
  • @@ -187,7 +203,17 @@
  • - +
  • + + +
    {{ __('navigation.evaluation') }}
    +
    + +
  • {{--
  • @@ -237,11 +263,12 @@
  • {{ __('navigation.user_level') }}
  • - +
  • +
    Arten {{ __('navigation.member') }}
    +
  • {{ __('navigation.countries') }}
  • -
  • {{ __('navigation.settings') }}
  • diff --git a/resources/views/pdf/delivery.blade.php b/resources/views/pdf/delivery.blade.php new file mode 100644 index 0000000..0e17712 --- /dev/null +++ b/resources/views/pdf/delivery.blade.php @@ -0,0 +1,424 @@ + + + + + partner.gruene-seele.bio + + + +
    + +
    +
    Lieferschein
    +
    + +
    + Rechnungsadresse
    + @if($shopping_order->shopping_user->billing_company) + {{ $shopping_order->shopping_user->billing_company }}
    + @else + @if($shopping_order->payment_for !== 7) + Firma
    + @endif + @endif + {{ \App\Services\HTMLHelper::getSalutationLang($shopping_order->shopping_user->billing_salutation) }} + {{ $shopping_order->shopping_user->billing_firstname }} {{ $shopping_order->shopping_user->billing_lastname }}
    + {{ $shopping_order->shopping_user->billing_address }}
    + @if($shopping_order->shopping_user->billing_address_2) + {{ $shopping_order->shopping_user->billing_address_2 }}
    + @endif + {{ $shopping_order->shopping_user->billing_zipcode }} {{ $shopping_order->shopping_user->billing_city }}
    + @if($shopping_order->shopping_user->billing_country) + {{ $shopping_order->shopping_user->billing_country->getLocated() }} + @endif +
    + +
    + Lieferadresse
    + @if($shopping_order->shopping_user->same_as_billing) + + {{__('email.checkout_mail_same_address')}} + @else + + @if($shopping_order->shopping_user->shipping_company) + {{ $shopping_order->shopping_user->shipping_company }}
    + @else + @if($shopping_order->payment_for !== 7) + Firma
    + @endif + @endif + {{ \App\Services\HTMLHelper::getSalutationLang($shopping_order->shopping_user->shipping_salutation) }} + {{ $shopping_order->shopping_user->shipping_firstname }} {{ $shopping_order->shopping_user->shipping_lastname }}
    + {{ $shopping_order->shopping_user->shipping_address }}
    + @if($shopping_order->shopping_user->shipping_address_2) + {{ $shopping_order->shopping_user->shipping_address_2 }}
    + @endif + {{ $shopping_order->shopping_user->shipping_zipcode }} {{ $shopping_order->shopping_user->shipping_city }}
    + @if($shopping_order->shopping_user->shipping_country) + {{ $shopping_order->shopping_user->shipping_country->getLocated() }} + @endif + @endif +
    +
    + + + + + + + +
    + {{ __('Rechnungsnummer') }}: {{ $invoice_number }} +
    + {{ __('Bestellnummer') }}: {{ $shopping_order->getLastShoppingPayment('reference') }} +
    +
    +
    + + + + + + + +
    + {{ __('Datum') }}: {{ $invoice_date }} +
    + {{ __(' Umsatzsteuer-ID') }}: DE296797691 +
    +
    + +
    +
    + + + + + + + + + + @if($delivery_items) + @foreach($delivery_items as $shopping_order_item) + @php($varinations = "") + + + + + + @endforeach + @endif + + + + + + + + +
    EtikettBezeichnungAnzahl
    + @if(isset($shopping_order_item->labels) && is_array($shopping_order_item->labels)) + @foreach($shopping_order_item->labels as $product_image) +
    + +
    + {{ $product_image->varinat['size'] }}cm / {{ $product_image->varinat['vol'] }}ml + @php($varinations .= "
    Tiegel: ".$product_image->varinat['name']) + @endforeach + @endif +
    + + {{ $shopping_order_item->product->getWhiteLableName() }} + + {!! $varinations !!} + + + {{ $shopping_order_item->qty }} + +
    + Gesamt: + + {{ $shopping_order->getItemsCount() }} +
    +
    + + + \ No newline at end of file diff --git a/resources/views/pdf/invoice.blade.php b/resources/views/pdf/invoice.blade.php index 7e042b9..bea23d5 100644 --- a/resources/views/pdf/invoice.blade.php +++ b/resources/views/pdf/invoice.blade.php @@ -476,10 +476,42 @@
    + + + \ No newline at end of file diff --git a/resources/views/user/_user_form.blade.php b/resources/views/user/_user_form.blade.php index 1e2a0b0..746ba69 100644 --- a/resources/views/user/_user_form.blade.php +++ b/resources/views/user/_user_form.blade.php @@ -62,8 +62,8 @@ {{ Form::text('address_2', $user->account->address_2, array('placeholder'=>__('Wohnung / Gebäude (optional)'), 'class'=>'form-control', 'id'=>'address_2', 'tabindex' => 6)) }}
    - - {{ Form::text('birthday', $user->account->birthday, array('placeholder'=>Util::formatDate(), 'data-date-format'=>Util::formatDate(), 'data-start_view'=>2, 'required'=>true, 'class'=>'form-control datepicker-birthday')) }} + + {{ Form::text('birthday', $user->account->birthday, array('placeholder'=>Util::formatDate(), 'data-date-format'=>Util::formatDate(), 'data-start_view'=>2, 'required'=>false, 'class'=>'form-control datepicker-birthday')) }}
    @@ -170,6 +170,69 @@
    + + +
    +
    +
    +
    + + +

    {{ __('account.VAT_copy_1') }}

    +
    + +
    + + {{ Form::text('tax_number', $user->account->tax_number, array('placeholder'=>__('account.tax_number'), 'class'=>'form-control', 'id'=>'tax_number', $user->account->getCountryAttrAs('tax_number','required'))) }} +
    + {{-- !isset($step) && --}} + @if($user->account->country_id && $user->account->country->eu_country) +
    +
    +
    +
    + + + {{ Form::text('tax_identification_number', $user->account-> tax_identification_number, array('placeholder'=>__('account.VAT_ID_number'), 'class'=>'form-control', 'id'=>'tax_identification_number', $user->account->getCountryAttrAs('tax_id_number','required'), ($user->account->reverse_charge_valid ? 'readonly' : ''))) }} + @if ($errors->has('tax_identification_number')) + + {{ $errors->first('tax_identification_number') }} + + @endif +
    +
    + + @if($user->account->reverse_charge_valid) +
    Aktiv seit: {{ $user->account->getReverseChargeValidFormat() }}
    + + + @endif + @if ($errors->has('reverse_charge')) + + {{ $errors->first('reverse_charge') }} + + @endif +
    + @if(!$user->account->reverse_charge_valid) + + @endif + @else +
    + + {{ Form::text('tax_identification_number', $user->account-> tax_identification_number, array('placeholder'=>__('account.VAT_ID_number'), 'class'=>'form-control', 'id'=>'tax_identification_number', $user->account->getCountryAttrAs('tax_id_number','required'))) }} +
    + @endif +
    +
    +
    +
    diff --git a/resources/views/user/checkout/checkout.blade.php b/resources/views/user/checkout/checkout.blade.php index c4f7bcb..16fccc8 100644 --- a/resources/views/user/checkout/checkout.blade.php +++ b/resources/views/user/checkout/checkout.blade.php @@ -450,13 +450,19 @@
    - + @if($is_from === 'shopping') + + @else + {{ Form::hidden('shipping_country_id', $shopping_user->shipping_state) }} + {{ Form::text('shipping_country_show', $shopping_user->shipping_country->getLocated(), array('readonly'=>true, 'class'=>'form-control', 'id'=>'shipping_country_show')) }} +

    Dei das Lieferland kann nur vor der Bestellung in den Daten geändert werden.

    + @endif @if ($errors->has('shipping_country_id')) - {{ $errors->first('shipping_country_id') }} - + {{ $errors->first('shipping_country_id') }} + @endif
    diff --git a/resources/views/user/edit.blade.php b/resources/views/user/edit.blade.php index 732e1cc..e17a3cc 100644 --- a/resources/views/user/edit.blade.php +++ b/resources/views/user/edit.blade.php @@ -26,4 +26,45 @@ {{ __('back') }}
    {!! Form::close() !!} + + + + + + + @endsection diff --git a/resources/views/user/form.blade.php b/resources/views/user/form.blade.php index 0f27dd0..431db96 100644 --- a/resources/views/user/form.blade.php +++ b/resources/views/user/form.blade.php @@ -105,8 +105,8 @@
    - - {{ Form::text('birthday', $user->account->birthday, array('placeholder'=>Util::formatDate(), 'data-date-format'=>Util::formatDate(), 'data-start_view'=>2, 'required'=>true, 'class'=>'form-control datepicker-birthday')) }} + + {{ Form::text('birthday', $user->account->birthday, array('placeholder'=>Util::formatDate(), 'data-date-format'=>Util::formatDate(), 'data-start_view'=>2, 'required'=>false, 'class'=>'form-control datepicker-birthday')) }}

    diff --git a/resources/views/user/order/delivery.blade.php b/resources/views/user/order/delivery.blade.php index 8a8caca..e3d6da5 100644 --- a/resources/views/user/order/delivery.blade.php +++ b/resources/views/user/order/delivery.blade.php @@ -48,7 +48,13 @@

    - + @if(Session::has('custom-error')) +
    + + {{ Session::get('custom-error') }} +
    + @endif +
    @@ -364,19 +372,26 @@ +
    +
    +
    +   + +
    +
    +
    Steuerdaten -
    - +
    -
    +
    @@ -385,27 +400,89 @@

    Wähle Kleinunternehmer, wenn Du nicht mehr als 22.000 EUR Umsatz pro Jahr mit Deinem Gewerbe erwirtschaftest.

    -
    + +
    {{ Form::text('tax_number', $user->account->tax_number, array('placeholder'=>__('Steuernummer'), 'class'=>'form-control', 'id'=>'tax_number', $user->account->getCountryAttrAs('tax_number','required'))) }} + @if ($errors->has('tax_number')) + + {{ $errors->first('tax_number') }} + + @endif
    + @if($user->account->country_id && $user->account->country->eu_country) +
    +
    +
    +
    + + {{ Form::text('tax_identification_number', $user->account-> tax_identification_number, array('placeholder'=>__('USt-ID Nummer'), 'class'=>'form-control', 'id'=>'tax_identification_number', $user->account->getCountryAttrAs('tax_id_number','required'), 'readonly')) }} + @if ($errors->has('tax_identification_number')) + + {{ $errors->first('tax_identification_number') }} + + @endif + @if($user->account->reverse_charge_valid) +
    +
    Aktiv seit: {{ $user->account->getReverseChargeValidFormat() }}
    + +
    + @endif + + {{-- ($user->account->reverse_charge_valid ? 'readonly' : '') --}} + @if(!$user->account->reverse_charge_valid) + + @endif +
    + @else
    - {{ Form::text('tax_identification_number', $user->account->tax_identification_number, array('placeholder'=>__('USt-ID Nummer'), 'class'=>'form-control', 'id'=>'tax_identification_number', $user->account->getCountryAttrAs('tax_id_number','required'))) }} + {{ Form::text('tax_identification_number', $user->account-> tax_identification_number, array('placeholder'=>__('USt-ID Nummer'), 'class'=>'form-control', 'id'=>'tax_identification_number', $user->account->getCountryAttrAs('tax_id_number','required'))) }}
    + @endif
    +
    - @if($errors->has('tax_number') || $errors->has('tax_identification_number')) -
    Fehler: Bitte {{ __('Steuernummer') }} und/oder {{ __('USt-ID Nummer') }} angeben!*
    + + @if($errors->has('tax_identification_number_validated')) +
    +
      + @foreach ($errors->all() as $error) +
    • {{ $error }}
    • + @endforeach +
    +
    @else -
    Hinweis: Bitte {{ __('Steuernummer') }} und/oder {{ __('USt-ID Nummer') }} angeben!*
    + @if(!$user->account-> tax_identification_number && !$user->account->tax_number) +
    Hinweis: Bitte {{ __('Steuernummer') }} und/oder {{ __('USt-ID Nummer') }} angeben!*
    + @endif + {{-- @if($errors->has('tax_number') || $errors->has('tax_identification_number')) +
    Fehler: Bitte {{ __('Steuernummer') }} und/oder {{ __('USt-ID Nummer') }} angeben!*
    + @else +
    Hinweis: Bitte {{ __('Steuernummer') }} und/oder {{ __('USt-ID Nummer') }} angeben!*
    + @endif + --}} @endif
    +
    +
    +
    +   + +
    +
    +
    + + + + \ No newline at end of file diff --git a/resources/views/web/components/_invoice_details_quick.blade.php b/resources/views/web/components/_invoice_details_quick.blade.php new file mode 100644 index 0000000..4a4176b --- /dev/null +++ b/resources/views/web/components/_invoice_details_quick.blade.php @@ -0,0 +1,132 @@ +

    Rechnungsdetails

    +
    +
    +
    + + {!! Form::text('billing_firstname', '', ['class' => 'form-control ' . ($errors->has('billing_firstname') ? 'error' : ''), 'id' => 'billing_firstname', 'required' => true]) !!} + @if ($errors->has('billing_firstname')) + + @endif +
    +
    +
    +
    + + {!! Form::text('billing_lastname', '', ['class' => 'form-control ' . ($errors->has('billing_lastname') ? 'error' : ''), 'id' => 'billing_lastname', 'required' => true]) !!} + @if ($errors->has('billing_lastname')) + + @endif +
    +
    +
    +
    + + +
    +
    +
    +
    + + {!! Form::text('billing_address', '', ['class' => 'form-control ' . ($errors->has('billing_address') ? 'error' : ''), 'id' => 'billing_address', 'required' => true]) !!} + @if ($errors->has('billing_address')) + + @endif +
    +
    + +
    +
    + + {!! Form::text('billing_zipcode', '', ['class' => 'form-control ' . ($errors->has('billing_zipcode') ? 'error' : ''), 'id' => 'billing_zipcode', 'required' => true]) !!} + @if ($errors->has('billing_zipcode')) + + @endif +
    +
    +
    +
    + + {!! Form::text('billing_city', '', ['class' => 'form-control ' . ($errors->has('billing_city') ? 'error' : ''), 'id' => 'billing_city', 'required' => true]) !!} + @if ($errors->has('billing_city')) + + @endif +
    +
    +
    +
    + + {!! Form::email('billing_email', '', ['class' => 'form-control ' . ($errors->has('billing_email') ? 'error' : ''), 'id' => 'billing_email', 'required' => true]) !!} + @if ($errors->has('billing_email')) + + @endif +
    +
    + +
    + + + \ No newline at end of file diff --git a/resources/views/web/components/_margin_cart.blade.php b/resources/views/web/components/_margin_cart.blade.php new file mode 100644 index 0000000..7674ff4 --- /dev/null +++ b/resources/views/web/components/_margin_cart.blade.php @@ -0,0 +1,62 @@ +@if(config('app.debug')) + + +@if(isset($userMargin)) +
    +
    +

    Provision / DEBUG

    + +
    + + + + + + + @dump($userMargin) + @if($userMargin->yard_margin && $userMargin->yard_margin->isMargin()) + @foreach($userMargin->yard_margin->items as $item) + + + + + @endforeach + @endif + @if($userMargin->yard_commission && $userMargin->yard_commission->isCommission()) + + + + + @endif + + + + + + @if($userMargin->yard_margin && $userMargin->yard_margin->net_partner_commission > 0) + + + + + @endif +
    Summe netto: + {{ Yard::instance('shopping')->subtotal(null, null, null, false) }} €* +
    Staffelrabatt +
    ab {{ $item->getFormatted('price_from') }} / {{ $item->getFormatted('trading_margin') }}% :
    + - {{ $item->getFormatted('value_margin') }} €* +
    Einzelrabatt: + - {{ $userMargin->yard_commission->getFormatted('single_value_commission') }} €* +
    Summe (Netto): + {{ Yard::instance('shopping')->subtotal() }} €* +
    Provision Vertriebspartern: + {{ $userMargin->yard_margin->getFormatted('net_partner_commission') }} €* +
    + +
    +
    +
    + +
    + @endif + +@endif \ No newline at end of file diff --git a/resources/views/web/layouts/application.blade.php b/resources/views/web/layouts/application.blade.php index 6ff3e0d..2affeda 100644 --- a/resources/views/web/layouts/application.blade.php +++ b/resources/views/web/layouts/application.blade.php @@ -25,25 +25,28 @@ @yield('styles') - - + @if(Util::isPromotionUrl(true)) + + @endif - - - - + @if(Util::isPromotionUrl(true)) + + + + + @endif @yield('layout-content') @@ -58,6 +61,7 @@ + @yield('scripts') diff --git a/resources/views/web/layouts/includes/layout-footer.blade.php b/resources/views/web/layouts/includes/layout-footer.blade.php index bbf535f..adaff06 100644 --- a/resources/views/web/layouts/includes/layout-footer.blade.php +++ b/resources/views/web/layouts/includes/layout-footer.blade.php @@ -1,6 +1,5 @@ + + +
    +
    + @if(isset($categories_by_show_on)) + + + {{ Yard::instance('shopping')->count() }} + @endif + + + +
    +
    +
    + diff --git a/resources/views/web/layouts/includes/layout-header.blade.php b/resources/views/web/layouts/includes/layout-header.blade.php index 87e3b1f..7b742af 100644 --- a/resources/views/web/layouts/includes/layout-header.blade.php +++ b/resources/views/web/layouts/includes/layout-header.blade.php @@ -3,7 +3,7 @@ \ No newline at end of file + + + @if(isset($categories_by_show_on)) + + @endif diff --git a/resources/views/web/legal/datenschutzerklaerung.blade.php b/resources/views/web/legal/datenschutzerklaerung.blade.php new file mode 100644 index 0000000..6d2ae2f --- /dev/null +++ b/resources/views/web/legal/datenschutzerklaerung.blade.php @@ -0,0 +1,448 @@ +@extends('web.layouts.layout') + +@section('content') +
    + +
    + + +
    +

    Datenschutzerklärung

    +
    +
    +

    Stand: 01. April 2022

    +

    Einleitung

    +

    Mit der folgenden Datenschutzerklärung möchten wir Sie darüber aufklären, welche Arten Ihrer personenbezogenen Daten (nachfolgend auch kurz als “Daten“ bezeichnet) wir zu welchen Zwecken und in welchem Umfang verarbeiten. Die Datenschutzerklärung gilt für alle von uns durchgeführten Verarbeitungen personenbezogener Daten, sowohl im Rahmen der Erbringung unserer Leistungen als auch insbesondere auf unseren Webseiten, in mobilen Applikationen sowie innerhalb externer Onlinepräsenzen, wie z.B. unserer Social-Media-Profile (nachfolgend zusammenfassend bezeichnet als “Onlineangebot“).

    +

    Die verwendeten Begriffe sind nicht geschlechtsspezifisch.

    +

    Inhaltsübersicht

    + +

    Verantwortlicher

    +

    GRÜNE SEELE GmbH
    +Hauptstr. 174
    +51143 Köln
    +Nordrhein-Westfalen
    +Deutschland

    +

    Geschaftsführung:
    +
    Ruth Krummel

    +

    Registereintrag
    +Eintragung im Handelsregister
    +Registergericht: Amtsgericht Köln
    +Registernummer: HRB87173

    +

    UST-ID:
    +DE296797691

    +

    E-Mail-Adresse: service@gruene-seele.bio

    +

    Telefon: +491622514871 • +4922031869014

    +

    Impressum: https://testemich.test/impressum/

    +

    Übersicht der Verarbeitungen

    +

    Die nachfolgende Übersicht fasst die Arten der verarbeiteten Daten und die Zwecke ihrer Verarbeitung zusammen und verweist auf die betroffenen Personen.

    +

    Arten der verarbeiteten Daten

    +
      +
    • Bestandsdaten (z.B. Namen, Adressen).
    • +
    • Inhaltsdaten (z.B. Texteingaben, Fotografien, Videos).
    • +
    • Kontaktdaten (z.B. E-Mail, Telefonnummern).
    • +
    • Meta-/Kommunikationsdaten (z.B. Geräte-Informationen, IP-Adressen).
    • +
    • Nutzungsdaten (z.B. besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten).
    • +
    • Standortdaten (Daten, die den Standort des Endgeräts eines Endnutzers angeben).
    • +
    • Vertragsdaten (z.B. Vertragsgegenstand, Laufzeit, Kundenkategorie).
    • +
    • Zahlungsdaten (z.B. Bankverbindungen, Rechnungen, Zahlungshistorie).
    • +
    +

    Kategorien betroffener Personen

    +
      +
    • Beschäftigte (z.B. Angestellte, Bewerber, ehemalige Mitarbeiter).
    • +
    • Geschäfts- und Vertragspartner.
    • +
    • Interessenten.
    • +
    • Kommunikationspartner.
    • +
    • Kunden.
    • +
    • Nutzer (z.B. Webseitenbesucher, Nutzer von Onlinediensten).
    • +
    +

    Zwecke der Verarbeitung

    +
      +
    • Affiliate-Nachverfolgung.
    • +
    • Bereitstellung unseres Onlineangebotes und Nutzerfreundlichkeit.
    • +
    • Besuchsaktionsauswertung.
    • +
    • Büro- und Organisationsverfahren.
    • +
    • Direktmarketing (z.B. per E-Mail oder postalisch).
    • +
    • Feedback (z.B. Sammeln von Feedback via Online-Formular).
    • +
    • Interessenbasiertes und verhaltensbezogenes Marketing.
    • +
    • Kontaktanfragen und Kommunikation.
    • +
    • Konversionsmessung (Messung der Effektivität von Marketingmaßnahmen).
    • +
    • Profiling (Erstellen von Nutzerprofilen).
    • +
    • Remarketing.
    • +
    • Reichweitenmessung (z.B. Zugriffsstatistiken, Erkennung wiederkehrender Besucher).
    • +
    • Sicherheitsmaßnahmen.
    • +
    • Tracking (z.B. interessens-/verhaltensbezogenes Profiling, Nutzung von Cookies).
    • +
    • Vertragliche Leistungen und Service.
    • +
    • Verwaltung und Beantwortung von Anfragen.
    • +
    +

    Maßgebliche Rechtsgrundlagen

    +

    Im Folgenden teilen wir die Rechtsgrundlagen der Datenschutzgrundverordnung (DSGVO), auf deren Basis wir die personenbezogenen Daten verarbeiten, mit. Bitte beachten Sie, dass zusätzlich zu den Regelungen der DSGVO die nationalen Datenschutzvorgaben in Ihrem bzw. unserem Wohn- und Sitzland gelten können. Sollten ferner im Einzelfall speziellere Rechtsgrundlagen maßgeblich sein, teilen wir Ihnen diese in der Datenschutzerklärung mit.

    +
      +
    • Einwilligung (Art. 6 Abs. 1 S. 1 lit. a DSGVO) – Die betroffene Person hat ihre Einwilligung in die Verarbeitung der sie betreffenden personenbezogenen Daten für einen spezifischen Zweck oder mehrere bestimmte Zwecke gegeben.
    • +
    • Vertragserfüllung und vorvertragliche Anfragen (Art. 6 Abs. 1 S. 1 lit. b. DSGVO) – Die Verarbeitung ist für die Erfüllung eines Vertrags, dessen Vertragspartei die betroffene Person ist, oder zur Durchführung vorvertraglicher Maßnahmen erforderlich, die auf Anfrage der betroffenen Person erfolgen.
    • +
    • Rechtliche Verpflichtung (Art. 6 Abs. 1 S. 1 lit. c. DSGVO) – Die Verarbeitung ist zur Erfüllung einer rechtlichen Verpflichtung erforderlich, der der Verantwortliche unterliegt.
    • +
    • Schutz lebenswichtiger Interessen (Art. 6 Abs. 1 S. 1 lit. d. DSGVO) – Die Verarbeitung ist erforderlich, um lebenswichtige Interessen der betroffenen Person oder einer anderen natürlichen Person zu schützen.
    • +
    • Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f. DSGVO) – Die Verarbeitung ist zur Wahrung der berechtigten Interessen des Verantwortlichen oder eines Dritten erforderlich, sofern nicht die Interessen oder Grundrechte und Grundfreiheiten der betroffenen Person, die den Schutz personenbezogener Daten erfordern, überwiegen.
    • +
    +

    Nationale Datenschutzregelungen in Deutschland: Zusätzlich zu den Datenschutzregelungen der Datenschutz-Grundverordnung gelten nationale Regelungen zum Datenschutz in Deutschland. Hierzu gehört insbesondere das Gesetz zum Schutz vor Missbrauch personenbezogener Daten bei der Datenverarbeitung (Bundesdatenschutzgesetz – BDSG). Das BDSG enthält insbesondere Spezialregelungen zum Recht auf Auskunft, zum Recht auf Löschung, zum Widerspruchsrecht, zur Verarbeitung besonderer Kategorien personenbezogener Daten, zur Verarbeitung für andere Zwecke und zur Übermittlung sowie automatisierten Entscheidungsfindung im Einzelfall einschließlich Profiling. Des Weiteren regelt es die Datenverarbeitung für Zwecke des Beschäftigungsverhältnisses (§ 26 BDSG), insbesondere im Hinblick auf die Begründung, Durchführung oder Beendigung von Beschäftigungsverhältnissen sowie die Einwilligung von Beschäftigten. Ferner können Landesdatenschutzgesetze der einzelnen Bundesländer zur Anwendung gelangen.

    +

    Sicherheitsmaßnahmen

    +

    Wir treffen nach Maßgabe der gesetzlichen Vorgaben unter Berücksichtigung des Stands der Technik, der Implementierungskosten und der Art, des Umfangs, der Umstände und der Zwecke der Verarbeitung sowie der unterschiedlichen Eintrittswahrscheinlichkeiten und des Ausmaßes der Bedrohung der Rechte und Freiheiten natürlicher Personen geeignete technische und organisatorische Maßnahmen, um ein dem Risiko angemessenes Schutzniveau zu gewährleisten.

    +

    Zu den Maßnahmen gehören insbesondere die Sicherung der Vertraulichkeit, Integrität und Verfügbarkeit von Daten durch Kontrolle des physischen und elektronischen Zugangs zu den Daten als auch des sie betreffenden Zugriffs, der Eingabe, der Weitergabe, der Sicherung der Verfügbarkeit und ihrer Trennung. Des Weiteren haben wir Verfahren eingerichtet, die eine Wahrnehmung von Betroffenenrechten, die Löschung von Daten und Reaktionen auf die Gefährdung der Daten gewährleisten. Ferner berücksichtigen wir den Schutz personenbezogener Daten bereits bei der Entwicklung bzw. Auswahl von Hardware, Software sowie Verfahren entsprechend dem Prinzip des Datenschutzes, durch Technikgestaltung und durch datenschutzfreundliche Voreinstellungen.

    +

    SSL-Verschlüsselung (https): Um Ihre via unser Online-Angebot übermittelten Daten zu schützen, nutzen wir eine SSL-Verschlüsselung. Sie erkennen derart verschlüsselte Verbindungen an dem Präfix https:// in der Adresszeile Ihres Browsers.

    +

    Übermittlung und Offenbarung von personenbezogenen Daten

    +

    Im Rahmen unserer Verarbeitung von personenbezogenen Daten kommt es vor, dass die Daten an andere Stellen, Unternehmen, rechtlich selbstständige Organisationseinheiten oder Personen übermittelt oder sie ihnen gegenüber offengelegt werden. Zu den Empfängern dieser Daten können z.B. Zahlungsinstitute im Rahmen von Zahlungsvorgängen, mit IT-Aufgaben beauftragte Dienstleister oder Anbieter von Diensten und Inhalten, die in eine Webseite eingebunden werden, gehören. In solchen Fall beachten wir die gesetzlichen Vorgaben und schließen insbesondere entsprechende Verträge bzw. Vereinbarungen, die dem Schutz Ihrer Daten dienen, mit den Empfängern Ihrer Daten ab.

    +

    DHL und Deutsche Post
    +Die Zustellung der Ware erfolgt durch die Transportdienstleister DHL oder Deutsche Post (Deutsche Post AG, Charles-de-Gaulle-Straße 20, 53113 Bonn), womit wir Ihre E-Mail- und Lieferadresse gemäß Art. 6 Abs. 1 lit. a DSGVO vor der Zustellung der Ware zum Zweck der Abstimmung eines Liefertermins bzw. zur Lieferankündigung an DHL weitergeben. Im Zuge des Abschlusses des Bestellprozess geben Sie Ihre ausdrückliche Einwilligung dafür ab. Die Weitergabe erfolgt nur, soweit dies für die Warenlieferung notwendig ist.

    +

    Die Einwilligung zur Weitergabe der Email-Adresse kann jederzeit mit Wirkung für die Zukunft gegenüber dem oben bezeichneten Verantwortlichen oder gegenüber dem Transportdienstleister DHL widerrufen werden. In dem Falle ist eine Benachrichtigung über die Zustellung bzw. den Zustelltermin nicht möglich.

    +

    Datenübermittlung innerhalb der Unternehmensgruppe: Wir können personenbezogene Daten an andere Unternehmen innerhalb unserer Unternehmensgruppe übermitteln oder ihnen den Zugriff auf diese Daten gewähren. Sofern diese Weitergabe zu administrativen Zwecken erfolgt, beruht die Weitergabe der Daten auf unseren berechtigten unternehmerischen und betriebswirtschaftlichen Interessen oder erfolgt, sofern sie zur Erfüllung unserer vertragsbezogenen Verpflichtungen erforderlich ist oder wenn eine Einwilligung der Betroffenen oder eine gesetzliche Erlaubnis vorliegt.

    +

    Wir sind vertraglicher Vertriebspartner im Auftrag der mivita e.K. • Leinfeld 2 • 87755 Kirchhaslach

    +

    Teile eingehender Bestellungen inkl. der für die Bestellabwicklung erforderlichen Kundendaten (Rechnungsadresse, Lieferadresse, Email-Adresse) gehen systemseitig an die MIVITA e. K. für die Abwicklung des Warenversandes.

    +

    Datenverarbeitung in Drittländern

    +

    Sofern wir Daten in einem Drittland (d.h., außerhalb der Europäischen Union (EU), des Europäischen Wirtschaftsraums (EWR)) verarbeiten oder die Verarbeitung im Rahmen der Inanspruchnahme von Diensten Dritter oder der Offenlegung bzw. Übermittlung von Daten an andere Personen, Stellen oder Unternehmen stattfindet, erfolgt dies nur im Einklang mit den gesetzlichen Vorgaben.

    +

    Vorbehaltlich ausdrücklicher Einwilligung oder vertraglich oder gesetzlich erforderlicher Übermittlung verarbeiten oder lassen wir die Daten nur in Drittländern mit einem anerkannten Datenschutzniveau, vertraglichen Verpflichtung durch sogenannte Standardschutzklauseln der EU-Kommission, beim Vorliegen von Zertifizierungen oder verbindlicher internen Datenschutzvorschriften verarbeiten (Art. 44 bis 49 DSGVO, Informationsseite der EU-Kommission: https://ec.europa.eu/info/law/law-topic/data-protection/international-dimension-data-protection_de ).

    +

    Einsatz von Cookies

    +

    Cookies sind Textdateien, die Daten von besuchten Websites oder Domains enthalten und von einem Browser auf dem Computer des Benutzers gespeichert werden. Ein Cookie dient in erster Linie dazu, die Informationen über einen Benutzer während oder nach seinem Besuch innerhalb eines Onlineangebotes zu speichern. Zu den gespeicherten Angaben können z.B. die Spracheinstellungen auf einer Webseite, der Loginstatus, ein Warenkorb oder die Stelle, an der ein Video geschaut wurde, gehören. Zu dem Begriff der Cookies zählen wir ferner andere Technologien, die die gleichen Funktionen wie Cookies erfüllen (z.B., wenn Angaben der Nutzer anhand pseudonymer Onlinekennzeichnungen gespeichert werden, auch als “Nutzer-IDs” bezeichnet)

    +

    Die folgenden Cookie-Typen und Funktionen werden unterschieden:

    +
      +
    • Temporäre Cookies (auch: Session- oder Sitzungs-Cookies): Temporäre Cookies werden spätestens gelöscht, nachdem ein Nutzer ein Online-Angebot verlassen und seinen Browser geschlossen hat.
    • +
    • Permanente Cookies: Permanente Cookies bleiben auch nach dem Schließen des Browsers gespeichert. So kann beispielsweise der Login-Status gespeichert oder bevorzugte Inhalte direkt angezeigt werden, wenn der Nutzer eine Website erneut besucht. Ebenso können die Interessen von Nutzern, die zur Reichweitenmessung oder zu Marketingzwecken verwendet werden, in einem solchen Cookie gespeichert werden.
    • +
    • First-Party-Cookies: First-Party-Cookies werden von uns selbst gesetzt.
    • +
    • Third-Party-Cookies (auch: Drittanbieter-Cookies): Drittanbieter-Cookies werden hauptsächlich von Werbetreibenden (sog. Dritten) verwendet, um Benutzerinformationen zu verarbeiten.
    • +
    • Notwendige (auch: essentielle oder unbedingt erforderliche) Cookies: Cookies können zum einen für den Betrieb einer Webseite unbedingt erforderlich sein (z.B. um Logins oder andere Nutzereingaben zu speichern oder aus Gründen der Sicherheit).
    • +
    • Statistik-, Marketing- und Personalisierungs-Cookies: Ferner werden Cookies im Regelfall auch im Rahmen der Reichweitenmessung eingesetzt sowie dann, wenn die Interessen eines Nutzers oder sein Verhalten (z.B. Betrachten bestimmter Inhalte, Nutzen von Funktionen etc.) auf einzelnen Webseiten in einem Nutzerprofil gespeichert werden. Solche Profile dienen dazu, den Nutzern z.B. Inhalte anzuzeigen, die ihren potentiellen Interessen entsprechen. Dieses Verfahren wird auch als “Tracking”, d.h., Nachverfolgung der potentiellen Interessen der Nutzer bezeichnet. . Soweit wir Cookies oder “Tracking”-Technologien einsetzen, informieren wir Sie gesondert in unserer Datenschutzerklärung oder im Rahmen der Einholung einer Einwilligung.
    • +
    +

    Hinweise zu Rechtsgrundlagen: Auf welcher Rechtsgrundlage wir Ihre personenbezogenen Daten mit Hilfe von Cookies verarbeiten, hängt davon ab, ob wir Sie um eine Einwilligung bitten. Falls dies zutrifft und Sie in die Nutzung von Cookies einwilligen, ist die Rechtsgrundlage der Verarbeitung Ihrer Daten die erklärte Einwilligung. Andernfalls werden die mithilfe von Cookies verarbeiteten Daten auf Grundlage unserer berechtigten Interessen (z.B. an einem betriebswirtschaftlichen Betrieb unseres Onlineangebotes und dessen Verbesserung) verarbeitet oder, wenn der Einsatz von Cookies erforderlich ist, um unsere vertraglichen Verpflichtungen zu erfüllen.

    +

    Speicherdauer: Sofern wir Ihnen keine expliziten Angaben zur Speicherdauer von permanenten Cookies mitteilen (z. B. im Rahmen eines sog. Cookie-Opt-Ins), gehen Sie bitte davon aus, dass die Speicherdauer bis zu zwei Jahre betragen kann.

    +

    Allgemeine Hinweise zum Widerruf und Widerspruch (Opt-Out): Abhängig davon, ob die Verarbeitung auf Grundlage einer Einwilligung oder gesetzlichen Erlaubnis erfolgt, haben Sie jederzeit die Möglichkeit, eine erteilte Einwilligung zu widerrufen oder der Verarbeitung Ihrer Daten durch Cookie-Technologien zu widersprechen (zusammenfassend als “Opt-Out” bezeichnet). Sie können Ihren Widerspruch zunächst mittels der Einstellungen Ihres Browsers erklären, z.B., indem Sie die Nutzung von Cookies deaktivieren (wobei hierdurch auch die Funktionsfähigkeit unseres Onlineangebotes eingeschränkt werden kann). Ein Widerspruch gegen den Einsatz von Cookies zu Zwecken des Onlinemarketings kann auch mittels einer Vielzahl von Diensten, vor allem im Fall des Trackings, über die Webseiten https://optout.aboutads.info und https://www.youronlinechoices.com/ erklärt werden. Daneben können Sie weitere Widerspruchshinweise im Rahmen der Angaben zu den eingesetzten Dienstleistern und Cookies erhalten.

    +

    Verarbeitung von Cookie-Daten auf Grundlage einer Einwilligung: Bevor wir Daten im Rahmen der Nutzung von Cookies verarbeiten oder verarbeiten lassen, bitten wir die Nutzer um eine jederzeit widerrufbare Einwilligung. Bevor die Einwilligung nicht ausgesprochen wurde, werden allenfalls Cookies eingesetzt, die für den Betrieb unseres Onlineangebotes unbedingt erforderlich sind.

    +

    Cookie-Einstellungen/ -Widerspruchsmöglichkeit:

    +Cookie Einstellungen +
      +
    • Verarbeitete Datenarten: Nutzungsdaten (z.B. besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten), Meta-/Kommunikationsdaten (z.B. Geräte-Informationen, IP-Adressen).
    • +
    • Betroffene Personen: Nutzer (z.B. Webseitenbesucher, Nutzer von Onlinediensten).
    • +
    • Rechtsgrundlagen: Einwilligung (Art. 6 Abs. 1 S. 1 lit. a DSGVO), Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f. DSGVO).
    • +
    + +

    ………………………………

    +

    Kommerzielle und geschäftliche Leistungen

    +

    Wir verarbeiten Daten unserer Vertrags- und Geschäftspartner, z.B. Kunden und Interessenten (zusammenfassend bezeichnet als “Vertragspartner”) im Rahmen von vertraglichen und vergleichbaren Rechtsverhältnissen sowie damit verbundenen Maßnahmen und im Rahmen der Kommunikation mit den Vertragspartnern (oder vorvertraglich), z.B., um Anfragen zu beantworten.

    +

    Diese Daten verarbeiten wir zur Erfüllung unserer vertraglichen Pflichten, zur Sicherung unserer Rechte und zu Zwecken der mit diesen Angaben einhergehenden Verwaltungsaufgaben sowie der unternehmerischen Organisation. Die Daten der Vertragspartner geben wir im Rahmen des geltenden Rechts nur insoweit an Dritte weiter, als dies zu den vorgenannten Zwecken oder zur Erfüllung gesetzlicher Pflichten erforderlich ist oder mit Einwilligung der betroffenen Personen erfolgt (z.B. an beteiligte Telekommunikations-, Transport- und sonstige Hilfsdienste sowie Subunternehmer, Banken, Steuer- und Rechtsberater, Zahlungsdienstleister oder Steuerbehörden). Über weitere Verarbeitungsformen, z.B. zu Zwecken des Marketings, werden die Vertragspartner im Rahmen dieser Datenschutzerklärung informiert.

    +

    Welche Daten für die vorgenannten Zwecke erforderlich sind, teilen wir den Vertragspartnern vor oder im Rahmen der Datenerhebung, z.B. in Onlineformularen, durch besondere Kennzeichnung (z.B. Farben) bzw. Symbole (z.B. Sternchen o.ä.), oder persönlich mit.

    +

    Wir löschen die Daten nach Ablauf gesetzlicher Gewährleistungs- und vergleichbarer Pflichten, d.h., grundsätzlich nach Ablauf von 4 Jahren, es sei denn, dass die Daten in einem Kundenkonto gespeichert werden, z.B., solange sie aus gesetzlichen Gründen der Archivierung aufbewahrt werden müssen (z.B. für Steuerzwecke im Regelfall 10 Jahre). Daten, die uns im Rahmen eines Auftrags durch den Vertragspartner offengelegt wurden, löschen wir entsprechend den Vorgaben des Auftrags, grundsätzlich nach Ende des Auftrags.

    +

    Soweit wir zur Erbringung unserer Leistungen Drittanbieter oder Plattformen einsetzen, gelten im Verhältnis zwischen den Nutzern und den Anbietern die Geschäftsbedingungen und Datenschutzhinweise der jeweiligen Drittanbieter oder Plattformen.

    +

    Kundenkonto: Vertragspartner können innerhalb unseres Onlineangebotes ein Konto anlegen (z.B. Kunden- bzw. Nutzerkonto, kurz “Kundenkonto”). Falls die Registrierung eines Kundenkontos erforderlich ist, werden Vertragspartner hierauf ebenso hingewiesen wie auf die für die Registrierung erforderlichen Angaben. Die Kundenkonten sind nicht öffentlich und können von Suchmaschinen nicht indexiert werden. Im Rahmen der Registrierung sowie anschließender Anmeldungen und Nutzungen des Kundenkontos speichern wir die IP-Adressen der Kunden nebst den Zugriffszeitpunkten, um die Registrierung nachweisen und etwaigem Missbrauch des Kundenkontos vorbeugen zu können.

    +

    Wenn Kunden ihr Kundenkonto gekündigt haben, werden die das Kundenkonto betreffenden Daten gelöscht, vorbehaltlich, deren Aufbewahrung ist aus gesetzlichen Gründen erforderlich. Es obliegt den Kunden, ihre Daten bei erfolgter Kündigung des Kundenkontos zu sichern.

    +

    Shop und E-Commerce: Wir verarbeiten die Daten unserer Kunden, um ihnen die Auswahl, den Erwerb, bzw. die Bestellung der gewählten Produkte, Waren sowie verbundener Leistungen, als auch deren Bezahlung und Zustellung, bzw. Ausführung zu ermöglichen.

    +

    Die erforderlichen Angaben sind als solche im Rahmen des Bestell- bzw. vergleichbaren Erwerbsvorgangs gekennzeichnet und umfassen die zur Auslieferung, bzw. Zurverfügungstellung und Abrechnung benötigten Angaben sowie Kontaktinformationen, um etwaige Rücksprache halten zu können.

    +

    Weitere Informationen zu kommerziellen Dienstleistungen: Wir verarbeiten die Daten unserer Kunden sowie Auftraggeber (nachfolgend einheitlich als “Kunden” bezeichnet), um ihnen die Auswahl, den Erwerb bzw. die Beauftragung der gewählten Leistungen oder Werke sowie verbundener Tätigkeiten als auch deren Bezahlung und Zustellung bzw. Ausführung oder Erbringung zu ermöglichen.

    +

    Die erforderlichen Angaben sind als solche im Rahmen des Auftrags-, Bestell- bzw. vergleichbaren Vertragsschlusses gekennzeichnet und umfassen die zur Leistungserbringung und Abrechnung benötigten Angaben sowie Kontaktinformationen, um etwaige Rücksprachen halten zu können.

    +
      +
    • Verarbeitete Datenarten: Bestandsdaten (z.B. Namen, Adressen), Zahlungsdaten (z.B. Bankverbindungen, Rechnungen, Zahlungshistorie), Kontaktdaten (z.B. E-Mail, Telefonnummern), Vertragsdaten (z.B. Vertragsgegenstand, Laufzeit, Kundenkategorie), Nutzungsdaten (z.B. besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten), Meta-/Kommunikationsdaten (z.B. Geräte-Informationen, IP-Adressen).
    • +
    • Betroffene Personen: Interessenten, Geschäfts- und Vertragspartner, Kunden.
    • +
    • Zwecke der Verarbeitung: Vertragliche Leistungen und Service, Kontaktanfragen und Kommunikation, Büro- und Organisationsverfahren, Verwaltung und Beantwortung von Anfragen, Sicherheitsmaßnahmen.
    • +
    • Rechtsgrundlagen: Vertragserfüllung und vorvertragliche Anfragen (Art. 6 Abs. 1 S. 1 lit. b. DSGVO), Rechtliche Verpflichtung (Art. 6 Abs. 1 S. 1 lit. c. DSGVO), Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f. DSGVO).
    • +
    +

    Nutzung von Online-Marktplätzen für E-Commerce

    +

    Wir bieten unsere Leistungen auf Online-Plattformen, die von anderen Dienstanbietern betrieben werden, an. In diesem Zusammenhang gelten zusätzlich zu unseren Datenschutzhinweisen die Datenschutzhinweise der jeweiligen Plattformen. Dies gilt insbesondere im Hinblick auf die auf den Plattformen eingesetzten Verfahren zur Reichweitemessung und zum interessensbezogenen Marketing.

    +
      +
    • Verarbeitete Datenarten: Bestandsdaten (z.B. Namen, Adressen), Zahlungsdaten (z.B. Bankverbindungen, Rechnungen, Zahlungshistorie), Kontaktdaten (z.B. E-Mail, Telefonnummern), Vertragsdaten (z.B. Vertragsgegenstand, Laufzeit, Kundenkategorie), Nutzungsdaten (z.B. besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten), Meta-/Kommunikationsdaten (z.B. Geräte-Informationen, IP-Adressen).
    • +
    • Betroffene Personen: Kunden.
    • +
    • Zwecke der Verarbeitung: Vertragliche Leistungen und Service.
    • +
    • Rechtsgrundlagen: Vertragserfüllung und vorvertragliche Anfragen (Art. 6 Abs. 1 S. 1 lit. b. DSGVO), Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f. DSGVO).
    • +
    +

    https://biodaloe.mivita.care

    +

    https://ruth.mivita.care

    +

    https://thomas.mivita.care

    +

    Zahlungsdienstleister

    +

    Im Rahmen von Vertrags- und sonstigen Rechtsbeziehungen, aufgrund gesetzlicher Pflichten oder sonst auf Grundlage unserer berechtigten Interessen bieten wir den betroffenen Personen effiziente und sichere Zahlungsmöglichkeiten an und setzen hierzu neben Banken und Kreditinstituten weitere Zahlungsdienstleister ein (zusammenfassend “Zahlungsdienstleister”).

    +

    Zu den durch die Zahlungsdienstleister verarbeiteten Daten gehören Bestandsdaten, wie z.B. der Name und die Adresse, Bankdaten, wie z.B. Kontonummern oder Kreditkartennummern, Passwörter, TANs und Prüfsummen sowie die Vertrags-, Summen- und empfängerbezogenen Angaben. Die Angaben sind erforderlich, um die Transaktionen durchzuführen. Die eingegebenen Daten werden jedoch nur durch die Zahlungsdienstleister verarbeitet und bei diesen gespeichert. D.h., wir erhalten keine konto- oder kreditkartenbezogenen Informationen, sondern lediglich Informationen mit Bestätigung oder Negativbeauskunftung der Zahlung. Unter Umständen werden die Daten seitens der Zahlungsdienstleister an Wirtschaftsauskunfteien übermittelt. Diese Übermittlung bezweckt die Identitäts- und Bonitätsprüfung. Hierzu verweisen wir auf die AGB und die Datenschutzhinweise der Zahlungsdienstleister.

    +

    Für die Zahlungsgeschäfte gelten die Geschäftsbedingungen und die Datenschutzhinweise der jeweiligen Zahlungsdienstleister, welche innerhalb der jeweiligen Webseiten bzw. Transaktionsapplikationen abrufbar sind. Wir verweisen auf diese ebenfalls zwecks weiterer Informationen und Geltendmachung von Widerrufs-, Auskunfts- und anderen Betroffenenrechten.

    +
      +
    • Verarbeitete Datenarten: Bestandsdaten (z.B. Namen, Adressen), Zahlungsdaten (z.B. Bankverbindungen, Rechnungen, Zahlungshistorie), Vertragsdaten (z.B. Vertragsgegenstand, Laufzeit, Kundenkategorie), Nutzungsdaten (z.B. besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten), Meta-/Kommunikationsdaten (z.B. Geräte-Informationen, IP-Adressen).
    • +
    • Betroffene Personen: Kunden, Interessenten.
    • +
    • Zwecke der Verarbeitung: Vertragliche Leistungen und Service, Kontaktanfragen und Kommunikation, Affiliate-Nachverfolgung.
    • +
    • Rechtsgrundlagen: Vertragserfüllung und vorvertragliche Anfragen (Art. 6 Abs. 1 S. 1 lit. b. DSGVO), Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f. DSGVO).
    • +
    +

    Eingesetzte Dienste und Diensteanbieter:

    + +
      +
    • Novalnet AG: Novalnet AG • Zahlungsinstitut (ZAG); Feringastraße 4 • 85774 Unterföhring • Deutschland (sh. im Folgenden)
    • +
    +

    Zusammenarbeit mit dem Zahlungsanbieter Novalnet und Paypal:

    +

    Der für die Verarbeitung Verantwortliche hat auf dieser Internetseite Komponenten von der Novalnet AG und der PayPal (Europe) S.à r.l. et Cie, S.C.A. integriert. Die Novalnet AG und PayPal (Europe) S.à r.l. et Cie, S.C.A. sind Full Payment Service Provider, die u.a. die Zahlungsabwicklung übernehmen.

    +

    Wählt die betroffene Person während des Bestellvorgangs in dem Online-Shop eine Zahlungsart aus, werden bei bestimmten Zahlungsarten automatisiert Daten der betroffenen Person an die Novalnet AG bzw. der PayPal (Europe) S.à r.l. et Cie, S.C.A. übermittelt. Mit der Auswahl einer Zahlungsoption willigt die betroffene Person in diese, zur Abwicklung der Zahlung, Übermittlung personenbezogener Daten ein.

    +

    Bei den an Novalnet übermittelten personenbezogenen Daten handelt es sich in der Regel um Vorname, Nachname, Adresse, Geburtsdatum, Geschlecht, Email-Adresse, IP-Adresse, Telefonnummer, Mobiltelefonnummer sowie um andere Daten, die zur Abwicklung einer Zahlung notwendig sind. Zur Abwicklung des Kaufvertrages notwendig sind auch solche personenbezogenen Daten, die im Zusammenhang mit der jeweiligen Bestellung stehen. Insbesondere kann es zum wechselseitigen Austausch von Zahlungsinformationen, wie Bankverbindung, Kartennummer, Gültigkeitsdatum und CVC-Code, Daten zu Waren und Dienstleistungen, Preise kommen.

    +

    Die Übermittlung der Daten bezweckt insbesondere die Identitätsüberprüfung, die Zahlungsadministration und die Betrugsprävention. Der für die Verarbeitung Verantwortliche wird der Novalnet AG personenbezogene Daten insbesondere dann übermitteln, wenn ein berechtigtes Interesse für die Übermittlung gegeben ist. Die zwischen der Novalnet AG bzw. der PayPal (Europe) S.à r.l. et Cie, S.C.A. und dem für die Verarbeitung Verantwortlichen ausgetauschten personenbezogenen Daten werden ggfs. an Wirtschaftsauskunfteien übermittelt. Diese Übermittlung bezweckt die Identitäts- und Bonitätsprüfung.

    +

    Die Novalnet AG gibt die personenbezogenen Daten auch an Leistungserbringer oder Subunternehmer weiter, soweit dies zur Erfüllung der vertraglichen Verpflichtungen erforderlich ist oder die Daten verarbeitet werden sollen.

    +

    Bei Bezahlung über die Zahlungsarten „Kauf auf Rechnung“, „Lastschrift“, (je nachdem welche Zahlungsart(en) angeboten werden) wird die Kaufpreisforderung über die Novalnet AG als Zahlungsinstitut an die Financial Management Solutions GmbH (unter der Marke InfinitePay), (im Folgenden „InfinitePay“ genannt) abgetreten. Die zur Zahlungsabwicklung erforderlichen Daten werden dabei an die InfinitePay übermittelt. Die Datenübermittelung dient u a dem Zweck , dass InfinitePay zur Abwicklung Ihres Einkaufs mit der von Ihnen gewünschten Zahlungsart eine Identitäts- und Bonitätsprüfung durchführen kann. Die Verarbeitung erfolgt auf Grundlage des Art. 6 Abs. 1 lit. f DSGVO aus dem berechtigten Interesse an einem Angebot von verschiedenen Zahlarten sowie dem berechtigten Interesse am Schutz vor Zahlungsausfall. Sie haben das Recht aus Gründen, die sich aus Ihrer besonderen Situation ergeben, jederzeit gegen diese auf Art. 6 Abs. 1 lit. f DSGVO beruhende Verarbeitung der Sie betreffenden personenbezogenen Daten durch eine Mitteilung an uns zu widersprechen. Die Datenschutzerklärung von InfinitePay finden Sie hier: https://www.infinitepay.de/datenschutzhinweise

    +

    Sollten Sie Auskunft über die Verwendung der Sie betreffenden personenbezogenen Daten erhalten wollen, können Sie sich jederzeit an datenschutz@fms-mainz.de wenden. Die Bereitstellung der Daten ist für den Vertragsschluss mit der von Ihnen gewünschten Zahlungsart erforderlich. Eine Nichtbereitstellung hat zur Folge, dass der Vertrag nicht mit der von Ihnen gewünschten Zahlungsart geschlossen werden kann.

    +

    Die betroffene Person hat die Möglichkeit, die Einwilligung zum Umgang mit personenbezogenen Daten jederzeit gegenüber der Novalnet AG oder der PayPal (Europe) S.à r.l. et Cie, S.C.A. zu widerrufen. Ein Widerruf wirkt sich nicht auf personenbezogene Daten aus, die zwingend zur (vertragsgemäßen) Zahlungsabwicklung verarbeitet, genutzt oder übermittelt werden müssen.

    +

    Bereitstellung des Onlineangebotes und Webhosting

    +

    Um unser Onlineangebot sicher und effizient bereitstellen zu können, nehmen wir die Leistungen von einem oder mehreren Webhosting-Anbietern in Anspruch, von deren Servern (bzw. von ihnen verwalteten Servern) das Onlineangebot abgerufen werden kann. Zu diesen Zwecken können wir Infrastruktur- und Plattformdienstleistungen, Rechenkapazität, Speicherplatz und Datenbankdienste sowie Sicherheitsleistungen und technische Wartungsleistungen in Anspruch nehmen.

    +

    Zu den im Rahmen der Bereitstellung des Hostingangebotes verarbeiteten Daten können alle die Nutzer unseres Onlineangebotes betreffenden Angaben gehören, die im Rahmen der Nutzung und der Kommunikation anfallen. Hierzu gehören regelmäßig die IP-Adresse, die notwendig ist, um die Inhalte von Onlineangeboten an Browser ausliefern zu können, und alle innerhalb unseres Onlineangebotes oder von Webseiten getätigten Eingaben.

    +

    E-Mail-Versand und -Hosting: Die von uns in Anspruch genommenen Webhosting-Leistungen umfassen ebenfalls den Versand, den Empfang sowie die Speicherung von E-Mails. Zu diesen Zwecken werden die Adressen der Empfänger sowie Absender als auch weitere Informationen betreffend den E-Mailversand (z.B. die beteiligten Provider) sowie die Inhalte der jeweiligen E-Mails verarbeitet. Die vorgenannten Daten können ferner zu Zwecken der Erkennung von SPAM verarbeitet werden. Wir bitten darum, zu beachten, dass E-Mails im Internet grundsätzlich nicht verschlüsselt versendet werden. Im Regelfall werden E-Mails zwar auf dem Transportweg verschlüsselt, aber (sofern kein sogenanntes Ende-zu-Ende-Verschlüsselungsverfahren eingesetzt wird) nicht auf den Servern, von denen sie abgesendet und empfangen werden. Wir können daher für den Übertragungsweg der E-Mails zwischen dem Absender und dem Empfang auf unserem Server keine Verantwortung übernehmen.

    +

    Erhebung von Zugriffsdaten und Logfiles: Wir selbst (bzw. unser Webhostinganbieter) erheben Daten zu jedem Zugriff auf den Server (sogenannte Serverlogfiles). Zu den Serverlogfiles können die Adresse und Name der abgerufenen Webseiten und Dateien, Datum und Uhrzeit des Abrufs, übertragene Datenmengen, Meldung über erfolgreichen Abruf, Browsertyp nebst Version, das Betriebssystem des Nutzers, Referrer URL (die zuvor besuchte Seite) und im Regelfall IP-Adressen und der anfragende Provider gehören.

    +

    Die Serverlogfiles können zum einen zu Zwecken der Sicherheit eingesetzt werden, z.B., um eine Überlastung der Server zu vermeiden (insbesondere im Fall von missbräuchlichen Angriffen, sogenannten DDoS-Attacken) und zum anderen, um die Auslastung der Server und ihre Stabilität sicherzustellen.

    +
      +
    • Verarbeitete Datenarten: Inhaltsdaten (z.B. Texteingaben, Fotografien, Videos), Nutzungsdaten (z.B. besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten), Meta-/Kommunikationsdaten (z.B. Geräte-Informationen, IP-Adressen).
    • +
    • Betroffene Personen: Nutzer (z.B. Webseitenbesucher, Nutzer von Onlinediensten).
    • +
    • Rechtsgrundlagen: Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f. DSGVO).
    • +
    +

    Registrierung, Anmeldung und Nutzerkonto

    +

    Nutzer können ein Nutzerkonto anlegen. Im Rahmen der Registrierung werden den Nutzern die erforderlichen Pflichtangaben mitgeteilt und zu Zwecken der Bereitstellung des Nutzerkontos auf Grundlage vertraglicher Pflichterfüllung verarbeitet. Zu den verarbeiteten Daten gehören insbesondere die Login-Informationen (Name, Passwort sowie eine E-Mail-Adresse). Die im Rahmen der Registrierung eingegebenen Daten werden für die Zwecke der Nutzung des Nutzerkontos und dessen Zwecks verwendet.

    +

    Die Nutzer können über Vorgänge, die für deren Nutzerkonto relevant sind, wie z.B. technische Änderungen, per E-Mail informiert werden. Wenn Nutzer ihr Nutzerkonto gekündigt haben, werden deren Daten im Hinblick auf das Nutzerkonto, vorbehaltlich einer gesetzlichen Aufbewahrungspflicht, gelöscht. Es obliegt den Nutzern, ihre Daten bei erfolgter Kündigung vor dem Vertragsende zu sichern. Wir sind berechtigt, sämtliche während der Vertragsdauer gespeicherte Daten des Nutzers unwiederbringlich zu löschen.

    +

    Im Rahmen der Inanspruchnahme unserer Registrierungs- und Anmeldefunktionen sowie der Nutzung des Nutzerkontos speichern wir die IP-Adresse und den Zeitpunkt der jeweiligen Nutzerhandlung. Die Speicherung erfolgt auf Grundlage unserer berechtigten Interessen als auch jener der Nutzer an einem Schutz vor Missbrauch und sonstiger unbefugter Nutzung. Eine Weitergabe dieser Daten an Dritte erfolgt grundsätzlich nicht, es sei denn, sie ist zur Verfolgung unserer Ansprüche erforderlich oder es besteht eine gesetzliche Verpflichtung hierzu.

    +
      +
    • Verarbeitete Datenarten: Bestandsdaten (z.B. Namen, Adressen), Kontaktdaten (z.B. E-Mail, Telefonnummern), Inhaltsdaten (z.B. Texteingaben, Fotografien, Videos), Meta-/Kommunikationsdaten (z.B. Geräte-Informationen, IP-Adressen).
    • +
    • Betroffene Personen: Nutzer (z.B. Webseitenbesucher, Nutzer von Onlinediensten).
    • +
    • Zwecke der Verarbeitung: Vertragliche Leistungen und Service, Sicherheitsmaßnahmen, Verwaltung und Beantwortung von Anfragen.
    • +
    • Rechtsgrundlagen: Einwilligung (Art. 6 Abs. 1 S. 1 lit. a DSGVO), Vertragserfüllung und vorvertragliche Anfragen (Art. 6 Abs. 1 S. 1 lit. b. DSGVO), Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f. DSGVO).
    • +
    +

    Blogs und Publikationsmedien

    +

    Wir nutzen Blogs oder vergleichbare Mittel der Onlinekommunikation und Publikation (nachfolgend “Publikationsmedium”). Die Daten der Leser werden für die Zwecke des Publikationsmediums nur insoweit verarbeitet, als es für dessen Darstellung und die Kommunikation zwischen Autoren und Lesern oder aus Gründen der Sicherheit erforderlich ist. Im Übrigen verweisen wir auf die Informationen zur Verarbeitung der Besucher unseres Publikationsmediums im Rahmen dieser Datenschutzhinweise.

    +

    Kommentare und Beiträge: Wenn Nutzer Kommentare oder sonstige Beiträge hinterlassen, können ihre IP-Adressen auf Grundlage unserer berechtigten Interessen gespeichert werden. Das erfolgt zu unserer Sicherheit, falls jemand in Kommentaren und Beiträgen widerrechtliche Inhalte hinterlässt (Beleidigungen, verbotene politische Propaganda etc.). In diesem Fall können wir selbst für den Kommentar oder Beitrag belangt werden und sind daher an der Identität des Verfassers interessiert.

    +

    Des Weiteren behalten wir uns vor, auf Grundlage unserer berechtigten Interessen die Angaben der Nutzer zwecks Spamerkennung zu verarbeiten.

    +

    Auf derselben Rechtsgrundlage behalten wir uns vor, im Fall von Umfragen die IP-Adressen der Nutzer für deren Dauer zu speichern und Cookies zu verwenden, um Mehrfachabstimmungen zu vermeiden.

    +

    Die im Rahmen der Kommentare und Beiträge mitgeteilten Informationen zur Person, etwaige Kontakt- sowie Webseiteninformationen als auch die inhaltlichen Angaben werden von uns bis zum Widerspruch der Nutzer dauerhaft gespeichert.

    +

    Akismet Anti-Spam-Prüfung: Wir nutzen auf Grundlage unserer berechtigten Interessen den Dienst “Akismet“. Mit Hilfe von Akismet werden Kommentare echter Menschen von Spam-Kommentaren unterschieden. Dazu werden alle Kommentarangaben an einen Server in den USA verschickt, wo sie analysiert und für Vergleichszwecke vier Tage lang gespeichert werden. Ist ein Kommentar als Spam eingestuft worden, werden die Daten über diese Zeit hinaus gespeichert. Zu diesen Angaben gehören der eingegebene Name, die E-Mailadresse, die IP-Adresse, der Kommentarinhalt, der Referrer, Angaben zum verwendeten Browser sowie zum Computersystem und die Zeit des Eintrags.

    +

    Die Nutzer können gerne Pseudonyme nutzen oder auf die Eingabe des Namens oder der Emailadresse verzichten. Sie können die Übertragung der Daten komplett verhindern, indem sie unser Kommentarsystem nicht nutzen. Das wäre schade, aber leider sehen wir keine Alternativen, die ebenso effektiv funktionieren.

    +

    Profilbilder von Gravatar: Wir setzen innerhalb unseres Onlineangebotes und insbesondere im Blog den Dienst Gravatar ein.

    +

    Gravatar ist ein Dienst, bei dem sich Nutzer anmelden und Profilbilder und ihre E-Mail-Adressen hinterlegen können. Wenn Nutzer mit der jeweiligen E-Mail-Adresse auf anderen Onlinepräsenzen (vor allem in Blogs) Beiträge oder Kommentare hinterlassen, können deren Profilbilder neben den Beiträgen oder Kommentaren dargestellt werden. Hierzu wird die von den Nutzern mitgeteilte E-Mail-Adresse an Gravatar zwecks Prüfung, ob zu ihr ein Profil gespeichert ist, verschlüsselt übermittelt. Dies ist der einzige Zweck der Übermittlung der E-Mail-Adresse. Sie wird nicht für andere Zwecke verwendet, sondern danach gelöscht.

    +

    Die Nutzung von Gravatar erfolgt auf Grundlage unserer berechtigten Interessen, da wir mit Hilfe von Gravatar den Beitrags- und Kommentarverfassern die Möglichkeit bieten, ihre Beiträge mit einem Profilbild zu personalisieren.

    +

    Durch die Anzeige der Bilder bringt Gravatar die IP-Adresse der Nutzer in Erfahrung, da dies für eine Kommunikation zwischen einem Browser und einem Onlineservice notwendig ist.

    +

    Wenn Nutzer nicht möchten, dass ein mit ihrer E-Mail-Adresse bei Gravatar verknüpftes Benutzerbild in den Kommentaren erscheint, sollten sie zum Kommentieren eine E-Mail-Adresse nutzen, welche nicht bei Gravatar hinterlegt ist. Wir weisen ferner darauf hin, dass es auch möglich ist eine anonyme oder gar keine E-Mail-Adresse zu verwenden, falls die Nutzer nicht wünschen, dass die eigene E-Mail-Adresse an Gravatar übersendet wird. Nutzer können die Übertragung der Daten komplett verhindern, indem sie unser Kommentarsystem nicht nutzen.

    +
      +
    • Verarbeitete Datenarten: Bestandsdaten (z.B. Namen, Adressen), Kontaktdaten (z.B. E-Mail, Telefonnummern), Inhaltsdaten (z.B. Texteingaben, Fotografien, Videos), Nutzungsdaten (z.B. besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten), Meta-/Kommunikationsdaten (z.B. Geräte-Informationen, IP-Adressen).
    • +
    • Betroffene Personen: Nutzer (z.B. Webseitenbesucher, Nutzer von Onlinediensten).
    • +
    • Zwecke der Verarbeitung: Vertragliche Leistungen und Service, Feedback (z.B. Sammeln von Feedback via Online-Formular), Sicherheitsmaßnahmen, Verwaltung und Beantwortung von Anfragen, Bereitstellung unseres Onlineangebotes und Nutzerfreundlichkeit.
    • +
    • Rechtsgrundlagen: Vertragserfüllung und vorvertragliche Anfragen (Art. 6 Abs. 1 S. 1 lit. b. DSGVO), Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f. DSGVO), Einwilligung (Art. 6 Abs. 1 S. 1 lit. a DSGVO), Schutz lebenswichtiger Interessen (Art. 6 Abs. 1 S. 1 lit. d. DSGVO).
    • +
    +

    Eingesetzte Dienste und Diensteanbieter:

    + +

    Kontaktaufnahme

    +

    Bei der Kontaktaufnahme mit uns (z.B. per Kontaktformular, E-Mail, Telefon oder via soziale Medien) werden die Angaben der anfragenden Personen verarbeitet, soweit dies zur Beantwortung der Kontaktanfragen und etwaiger angefragter Maßnahmen erforderlich ist.

    +

    Die Beantwortung der Kontaktanfragen im Rahmen von vertraglichen oder vorvertraglichen Beziehungen erfolgt zur Erfüllung unserer vertraglichen Pflichten oder zur Beantwortung von (vor)vertraglichen Anfragen und im Übrigen auf Grundlage der berechtigten Interessen an der Beantwortung der Anfragen.

    +
      +
    • Verarbeitete Datenarten: Bestandsdaten (z.B. Namen, Adressen), Kontaktdaten (z.B. E-Mail, Telefonnummern), Inhaltsdaten (z.B. Texteingaben, Fotografien, Videos).
    • +
    • Betroffene Personen: Kommunikationspartner.
    • +
    • Zwecke der Verarbeitung: Kontaktanfragen und Kommunikation.
    • +
    • Rechtsgrundlagen: Vertragserfüllung und vorvertragliche Anfragen (Art. 6 Abs. 1 S. 1 lit. b. DSGVO), Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f. DSGVO).
    • +
    +

    Videokonferenzen, Onlinemeetings, Webinare und Bildschirm-Sharing

    +

    Wir setzen Plattformen und Anwendungen anderer Anbieter (nachfolgend bezeichnet als “Drittanbieter”) zu Zwecken der Durchführung von Video und Audio-Konferenzen, Webinaren und sonstigen Arten von Video und Audio-Meetings ein. Bei der Auswahl der Drittanbieter und ihrer Leistungen beachten wir die gesetzlichen Vorgaben.

    +

    In diesem Rahmen werden Daten der Kommunikationsteilnehmer verarbeitet und auf den Servern der Drittanbieter gespeichert, soweit diese Bestandteil von Kommunikationsvorgängen mit uns sind. Zu diesen Daten können insbesondere Anmelde- und Kontaktdaten, visuelle sowie stimmliche Beiträge sowie Eingaben in Chats und geteilte Bildschirminhalte gehören.

    +

    Sofern Nutzer im Rahmen der Kommunikation, Geschäfts- oder anderen Beziehungen mit uns auf die Drittanbieter, bzw. deren Software oder Plattformen verwiesen werden, können die Drittanbieter Nutzungsdaten und Metadaten zu Sicherheitszwecken, Serviceoptimierung oder Marketingzwecken verarbeiten. Wir bitten daher, die Datenschutzhinweise der jeweiligen Drittanbieter zu beachten.

    +

    Hinweise zu Rechtsgrundlagen: Sofern wir die Nutzer um deren Einwilligung in den Einsatz der Drittanbieter oder bestimmter Funktionen bitten (z. B. Einverständnis mit einer Aufzeichnung von Gesprächen), ist die Rechtsgrundlage der Verarbeitung die Einwilligung. Ferner kann deren Einsatz ein Bestandteil unserer (vor)vertraglichen Leistungen sein, sofern der Einsatz der Drittanbieter in diesem Rahmen vereinbart wurde. Ansonsten werden die Daten der Nutzer auf Grundlage unserer berechtigten Interessen an einer effizienten und sicheren Kommunikation mit unseren unser Kommunikationspartnern verarbeitet. In diesem Zusammenhang möchten wir Sie zusätzlich auf die Informationen zur Verwendung von Cookies in dieser Datenschutzerklärung verweisen.

    +
      +
    • Verarbeitete Datenarten: Bestandsdaten (z.B. Namen, Adressen), Kontaktdaten (z.B. E-Mail, Telefonnummern), Inhaltsdaten (z.B. Texteingaben, Fotografien, Videos), Nutzungsdaten (z.B. besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten), Meta-/Kommunikationsdaten (z.B. Geräte-Informationen, IP-Adressen).
    • +
    • Betroffene Personen: Kommunikationspartner, Nutzer (z.B. Webseitenbesucher, Nutzer von Onlinediensten).
    • +
    • Zwecke der Verarbeitung: Vertragliche Leistungen und Service, Kontaktanfragen und Kommunikation, Büro- und Organisationsverfahren, Direktmarketing (z.B. per E-Mail oder postalisch).
    • +
    • Rechtsgrundlagen: Einwilligung (Art. 6 Abs. 1 S. 1 lit. a DSGVO), Vertragserfüllung und vorvertragliche Anfragen (Art. 6 Abs. 1 S. 1 lit. b. DSGVO), Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f. DSGVO).
    • +
    +

    Eingesetzte Dienste und Diensteanbieter:

    + +

    Cloud-Dienste

    +

    Wir nutzen über das Internet zugängliche und auf den Servern ihrer Anbieter ausgeführte Softwaredienste (sogenannte “Cloud-Dienste”, auch bezeichnet als “Software as a Service”) für die folgenden Zwecke: Dokumentenspeicherung und Verwaltung, Kalenderverwaltung, E-Mail-Versand, Tabellenkalkulationen und Präsentationen, Austausch von Dokumenten, Inhalten und Informationen mit bestimmten Empfängern oder Veröffentlichung von Webseiten, Formularen oder sonstigen Inhalten und Informationen sowie Chats und Teilnahme an Audio- und Videokonferenzen.

    +

    In diesem Rahmen können personenbezogenen Daten verarbeitet und auf den Servern der Anbieter gespeichert werden, soweit diese Bestandteil von Kommunikationsvorgängen mit uns sind oder von uns sonst, wie im Rahmen dieser Datenschutzerklärung dargelegt, verarbeitet werden. Zu diesen Daten können insbesondere Stammdaten und Kontaktdaten der Nutzer, Daten zu Vorgängen, Verträgen, sonstigen Prozessen und deren Inhalte gehören. Die Anbieter der Cloud-Dienste verarbeiten ferner Nutzungsdaten und Metadaten, die von ihnen zu Sicherheitszwecken und zur Serviceoptimierung verwendet werden.

    +

    Sofern wir mit Hilfe der Cloud-Dienste für andere Nutzer oder öffentlich zugängliche Webseiten Formulare o.a. Dokumente und Inhalte bereitstellen, können die Anbieter Cookies auf den Geräten der Nutzer für Zwecke der Webanalyse oder, um sich Einstellungen der Nutzer (z.B. im Fall der Mediensteuerung) zu merken, speichern.

    +

    Hinweise zu Rechtsgrundlagen: Sofern wir um eine Einwilligung in den Einsatz der Cloud-Dienste bitten, ist die Rechtsgrundlage der Verarbeitung die Einwilligung. Ferner kann deren Einsatz ein Bestandteil unserer (vor)vertraglichen Leistungen sein, sofern der Einsatz der Cloud-Dienste in diesem Rahmen vereinbart wurde. Ansonsten werden die Daten der Nutzer auf Grundlage unserer berechtigten Interessen (d.h., Interesse an effizienten und sicheren Verwaltungs- und Kollaborationsprozessen) verarbeitet

    +
      +
    • Verarbeitete Datenarten: Bestandsdaten (z.B. Namen, Adressen), Kontaktdaten (z.B. E-Mail, Telefonnummern), Inhaltsdaten (z.B. Texteingaben, Fotografien, Videos), Nutzungsdaten (z.B. besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten), Meta-/Kommunikationsdaten (z.B. Geräte-Informationen, IP-Adressen).
    • +
    • Betroffene Personen: Kunden, Beschäftigte (z.B. Angestellte, Bewerber, ehemalige Mitarbeiter), Interessenten, Kommunikationspartner.
    • +
    • Zwecke der Verarbeitung: Büro- und Organisationsverfahren.
    • +
    • Rechtsgrundlagen: Einwilligung (Art. 6 Abs. 1 S. 1 lit. a DSGVO), Vertragserfüllung und vorvertragliche Anfragen (Art. 6 Abs. 1 S. 1 lit. b. DSGVO), Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f. DSGVO).
    • +
    +

    Eingesetzte Dienste und Diensteanbieter:

    + +

    Der gewählte Standort für die Speicherorte: Europa.

    +

    Newsletter und elektronische Benachrichtigungen

    +

    Wir versenden Newsletter, E-Mails und weitere elektronische Benachrichtigungen (nachfolgend “Newsletter“) nur mit der Einwilligung der Empfänger oder einer gesetzlichen Erlaubnis. Sofern im Rahmen einer Anmeldung zum Newsletter dessen Inhalte konkret umschrieben werden, sind sie für die Einwilligung der Nutzer maßgeblich. Im Übrigen enthalten unsere Newsletter Informationen zu unseren Leistungen und uns.

    +

    Um sich zu unseren Newslettern anzumelden, reicht es grundsätzlich aus, wenn Sie Ihre E-Mail-Adresse angeben. Wir können Sie jedoch bitten, einen Namen, zwecks persönlicher Ansprache im Newsletter, oder weitere Angaben, sofern diese für die Zwecke des Newsletters erforderlich sind, zu tätigen.

    +

    Double-Opt-In-Verfahren: Die Anmeldung zu unserem Newsletter erfolgt grundsätzlich in einem sogenannte Double-Opt-In-Verfahren. D.h., Sie erhalten nach der Anmeldung eine E-Mail, in der Sie um die Bestätigung Ihrer Anmeldung gebeten werden. Diese Bestätigung ist notwendig, damit sich niemand mit fremden E-Mail-Adressen anmelden kann. Die Anmeldungen zum Newsletter werden protokolliert, um den Anmeldeprozess entsprechend den rechtlichen Anforderungen nachweisen zu können. Hierzu gehört die Speicherung des Anmelde- und des Bestätigungszeitpunkts als auch der IP-Adresse. Ebenso werden die Änderungen Ihrer bei dem Versanddienstleister gespeicherten Daten protokolliert.

    +

    Löschung und Einschränkung der Verarbeitung: Wir können die ausgetragenen E-Mail-Adressen bis zu drei Jahren auf Grundlage unserer berechtigten Interessen speichern, bevor wir sie löschen, um eine ehemals gegebene Einwilligung nachweisen zu können. Die Verarbeitung dieser Daten wird auf den Zweck einer möglichen Abwehr von Ansprüchen beschränkt. Ein individueller Löschungsantrag ist jederzeit möglich, sofern zugleich das ehemalige Bestehen einer Einwilligung bestätigt wird. Im Fall von Pflichten zur dauerhaften Beachtung von Widersprüchen behalten wir uns die Speicherung der E-Mail-Adresse alleine zu diesem Zweck in einer Sperrliste (sogenannte “Blacklist”) vor.

    +

    Die Protokollierung des Anmeldeverfahrens erfolgt auf Grundlage unserer berechtigten Interessen zu Zwecken des Nachweises seines ordnungsgemäßen Ablaufs. Soweit wir einen Dienstleister mit dem Versand von E-Mails beauftragen, erfolgt dies auf Grundlage unserer berechtigten Interessen an einem effizienten und sicheren Versandsystem.

    +

    Hinweise zu Rechtsgrundlagen: Der Versand der Newsletter erfolgt auf Grundlage einer Einwilligung der Empfänger oder, falls eine Einwilligung nicht erforderlich ist, auf Grundlage unserer berechtigten Interessen am Direktmarketing, sofern und soweit diese gesetzlich, z.B. im Fall von Bestandskundenwerbung, erlaubt ist. Soweit wir einen Dienstleister mit dem Versand von E-Mails beauftragen, geschieht dies auf der Grundlage unserer berechtigten Interessen. Das Registrierungsverfahren wird auf der Grundlage unserer berechtigten Interessen aufgezeichnet, um nachzuweisen, dass es in Übereinstimmung mit dem Gesetz durchgeführt wurde.

    +

    Inhalte: Informationen zu uns, unseren Leistungen, Aktionen und Angeboten.

    +

    Analyse und Erfolgsmessung: Die Newsletter enthalten einen sogenannte “web-beacon“, d.h., eine pixelgroße Datei, die beim Öffnen des Newsletters von unserem Server, bzw., sofern wir einen Versanddienstleister einsetzen, von dessen Server abgerufen wird. Im Rahmen dieses Abrufs werden zunächst technische Informationen, wie Informationen zum Browser und Ihrem System, als auch Ihre IP-Adresse und der Zeitpunkt des Abrufs, erhoben.

    +

    Diese Informationen werden zur technischen Verbesserung unseres Newsletters anhand der technischen Daten oder der Zielgruppen und ihres Leseverhaltens auf Basis ihrer Abruforte (die mit Hilfe der IP-Adresse bestimmbar sind) oder der Zugriffszeiten genutzt. Diese Analyse beinhaltet ebenfalls die Feststellung, ob die Newsletter geöffnet werden, wann sie geöffnet werden und welche Links geklickt werden. Diese Informationen können aus technischen Gründen zwar den einzelnen Newsletterempfängern zugeordnet werden. Es ist jedoch weder unser Bestreben noch, sofern eingesetzt, das des Versanddienstleisters, einzelne Nutzer zu beobachten. Die Auswertungen dienen uns vielmehr dazu, die Lesegewohnheiten unserer Nutzer zu erkennen und unsere Inhalte an sie anzupassen oder unterschiedliche Inhalte entsprechend den Interessen unserer Nutzer zu versenden.

    +

    Die Auswertung des Newsletters und die Erfolgsmessung erfolgen, vorbehaltlich einer ausdrücklichen Einwilligung der Nutzer, auf Grundlage unserer berechtigten Interessen zu Zwecken des Einsatzes eines nutzerfreundlichen sowie sicheren Newslettersystems, welches sowohl unseren geschäftlichen Interessen dient, als auch den Erwartungen der Nutzer entspricht.

    +

    Ein getrennter Widerruf der Erfolgsmessung ist leider nicht möglich, in diesem Fall muss das gesamte Newsletterabonnement gekündigt, bzw. muss ihm widersprochen werden.

    +
      +
    • Verarbeitete Datenarten: Bestandsdaten (z.B. Namen, Adressen), Kontaktdaten (z.B. E-Mail, Telefonnummern), Meta-/Kommunikationsdaten (z.B. Geräte-Informationen, IP-Adressen), Nutzungsdaten (z.B. besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten).
    • +
    • Betroffene Personen: Kommunikationspartner.
    • +
    • Zwecke der Verarbeitung: Direktmarketing (z.B. per E-Mail oder postalisch).
    • +
    • Rechtsgrundlagen: Einwilligung (Art. 6 Abs. 1 S. 1 lit. a DSGVO), Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f. DSGVO).
    • +
    • Widerspruchsmöglichkeit (Opt-Out): Sie können den Empfang unseres Newsletters jederzeit kündigen, d.h. Ihre Einwilligungen widerrufen, bzw. dem weiteren Empfang widersprechen. Einen Link zur Kündigung des Newsletters finden Sie entweder am Ende eines jeden Newsletters oder können sonst eine der oben angegebenen Kontaktmöglichkeiten, vorzugswürdig E-Mail, hierzu nutzen.
    • +
    +

    Eingesetzte Dienste und Diensteanbieter:

    + +

    Werbliche Kommunikation via E-Mail, Post, Fax oder Telefon

    +

    Wir verarbeiten personenbezogene Daten zu Zwecken der werblichen Kommunikation, die über diverse Kanäle, wie z.B. E-Mail, Telefon, Post oder Fax, entsprechend den gesetzlichen Vorgaben erfolgen kann.

    +

    Die Empfänger haben das Recht, erteilte Einwilligungen jederzeit zu widerrufen oder der werblichen Kommunikation jederzeit zu widersprechen.

    +

    Nach Widerruf bzw. Widerspruch können wir die zum Nachweis der Einwilligung erforderlichen Daten bis zu drei Jahren auf Grundlage unserer berechtigten Interessen speichern, bevor wir sie löschen. Die Verarbeitung dieser Daten wird auf den Zweck einer möglichen Abwehr von Ansprüchen beschränkt. Ein individueller Löschungsantrag ist jederzeit möglich, sofern zugleich das ehemalige Bestehen einer Einwilligung bestätigt wird.

    +
      +
    • Verarbeitete Datenarten: Bestandsdaten (z.B. Namen, Adressen), Kontaktdaten (z.B. E-Mail, Telefonnummern).
    • +
    • Betroffene Personen: Kommunikationspartner.
    • +
    • Zwecke der Verarbeitung: Direktmarketing (z.B. per E-Mail oder postalisch).
    • +
    • Rechtsgrundlagen: Einwilligung (Art. 6 Abs. 1 S. 1 lit. a DSGVO), Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f. DSGVO).
    • +
    +

    Onlinemarketing

    +

    Wir verarbeiten personenbezogene Daten zu Zwecken des Onlinemarketings, worunter insbesondere die Vermarktung von Werbeflächen oder Darstellung von werbenden und sonstigen Inhalten (zusammenfassend als “Inhalte” bezeichnet) anhand potentieller Interessen der Nutzer sowie die Messung ihrer Effektivität fallen kann.

    +

    Zu diesen Zwecken werden sogenannte Nutzerprofile angelegt und in einer Datei (sogenannte “Cookie”) gespeichert oder ähnliche Verfahren genutzt, mittels derer die für die Darstellung der vorgenannten Inhalte relevante Angaben zum Nutzer gespeichert werden. Zu diesen Angaben können z.B. betrachtete Inhalte, besuchte Webseiten, genutzte Onlinenetzwerke, aber auch Kommunikationspartner und technische Angaben, wie der verwendete Browser, das verwendete Computersystem sowie Angaben zu Nutzungszeiten gehören. Sofern Nutzer in die Erhebung ihrer Standortdaten eingewilligt haben, können auch diese verarbeitet werden.

    +

    Es werden ebenfalls die IP-Adressen der Nutzer gespeichert. Jedoch nutzen wir zur Verfügung stehende IP-Masking-Verfahren (d.h., Pseudonymisierung durch Kürzung der IP-Adresse) zum Schutz der Nutzer. Generell werden im Rahmen des Onlinemarketingverfahren keine Klardaten der Nutzer (wie z.B. E-Mail-Adressen oder Namen) gespeichert, sondern Pseudonyme. D.h., wir als auch die Anbieter der Onlinemarketingverfahren kennen nicht die tatsächlich Identität der Nutzer, sondern nur die in deren Profilen gespeicherten Angaben.

    +

    Die Angaben in den Profilen werden im Regelfall in den Cookies oder mittels ähnlicher Verfahren gespeichert. Diese Cookies können später generell auch auf anderen Webseiten die dasselbe Onlinemarketingverfahren einsetzen, ausgelesen und zu Zwecken der Darstellung von Inhalten analysiert als auch mit weiteren Daten ergänzt und auf dem Server des Onlinemarketingverfahrensanbieters gespeichert werden.

    +

    Ausnahmsweise können Klardaten den Profilen zugeordnet werden. Das ist der Fall, wenn die Nutzer z.B. Mitglieder eines sozialen Netzwerks sind, dessen Onlinemarketingverfahren wir einsetzen und das Netzwerk die Profile der Nutzer mit den vorgenannten Angaben verbindet. Wir bitten darum, zu beachten, dass Nutzer mit den Anbietern zusätzliche Abreden, z.B. durch Einwilligung im Rahmen der Registrierung, treffen können.

    +

    Wir erhalten grundsätzlich nur Zugang zu zusammengefassten Informationen über den Erfolg unserer Werbeanzeigen. Jedoch können wir im Rahmen sogenannter Konversionsmessungen prüfen, welche unserer Onlinemarketingverfahren zu einer sogenannten Konversion geführt haben, d.h. z.B., zu einem Vertragsschluss mit uns. Die Konversionsmessung wird alleine zur Analyse des Erfolgs unserer Marketingmaßnahmen verwendet.

    +

    Solange nicht anders angegeben, bitten wir Sie davon auszugehen, dass verwendete Cookies für einen Zeitraum von zwei Jahren gespeichert werden.

    +

    Hinweise zu Rechtsgrundlagen: Sofern wir die Nutzer um deren Einwilligung in den Einsatz der Drittanbieter bitten, ist die Rechtsgrundlage der Verarbeitung von Daten die Einwilligung. Ansonsten werden die Daten der Nutzer auf Grundlage unserer berechtigten Interessen (d.h. Interesse an effizienten, wirtschaftlichen und empfängerfreundlichen Leistungen) verarbeitet. In diesem Zusammenhang möchten wir Sie auch auf die Informationen zur Verwendung von Cookies in dieser Datenschutzerklärung hinweisen.

    +
      +
    • Verarbeitete Datenarten: Nutzungsdaten (z.B. besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten), Meta-/Kommunikationsdaten (z.B. Geräte-Informationen, IP-Adressen).
    • +
    • Betroffene Personen: Nutzer (z.B. Webseitenbesucher, Nutzer von Onlinediensten), Interessenten.
    • +
    • Zwecke der Verarbeitung: Tracking (z.B. interessens-/verhaltensbezogenes Profiling, Nutzung von Cookies), Remarketing, Besuchsaktionsauswertung, Interessenbasiertes und verhaltensbezogenes Marketing, Profiling (Erstellen von Nutzerprofilen), Konversionsmessung (Messung der Effektivität von Marketingmaßnahmen), Reichweitenmessung (z.B. Zugriffsstatistiken, Erkennung wiederkehrender Besucher).
    • +
    • Sicherheitsmaßnahmen: IP-Masking (Pseudonymisierung der IP-Adresse).
    • +
    • Rechtsgrundlagen: Einwilligung (Art. 6 Abs. 1 S. 1 lit. a DSGVO), Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f. DSGVO).
    • +
    • Widerspruchsmöglichkeit (Opt-Out): Wir verweisen auf die Datenschutzhinweise der jeweiligen Anbieter und die zu den Anbietern angegebenen Widerspruchsmöglichkeiten (sog. “Opt-Out”). Sofern keine explizite Opt-Out-Möglichkeit angegeben wurde, besteht zum einen die Möglichkeit, dass Sie Cookies in den Einstellungen Ihres Browsers abschalten. Hierdurch können jedoch Funktionen unseres Onlineangebotes eingeschränkt werden. Wir empfehlen daher zusätzlich die folgenden Opt-Out-Möglichkeiten, die zusammenfassend auf jeweilige Gebiete gerichtet angeboten werden:a) Europa: https://www.youronlinechoices.eu.
      +b) Kanada: https://www.youradchoices.ca/choices.
      +c) USA: https://www.aboutads.info/choices.
      +d) Gebietsübergreifend: https://optout.aboutads.info.
    • +
    +

    Eingesetzte Dienste und Diensteanbieter:

    +
      +
    • Google Tag Manager: Google Tag Manager ist eine Lösung, mit der wir sog. Website-Tags über eine Oberfläche verwalten und so andere Dienste in unser Onlineangebot einbinden können. Der Tag Manager selbst (welches die Tags implementiert) verarbeitet keine personenbezogenen Daten der Nutzer. Im Hinblick auf die Verarbeitung der personenbezogenen Daten der Nutzer wird auf die folgenden Angaben zu den Google-Diensten verwiesen. Dienstanbieter: Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Irland, Mutterunternehmen: Google LLC, 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA; Website: https://marketingplatform.google.com; Datenschutzerklärung: https://policies.google.com/privacy.
    • +
    • Google Analytics: Onlinemarketing und Webanalyse; Dienstanbieter: Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Irland, Mutterunternehmen: Google LLC, 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA; Website: https://marketingplatform.google.com/intl/de/about/analytics/; Datenschutzerklärung: https://policies.google.com/privacy; Widerspruchsmöglichkeit (Opt-Out): Opt-Out-Plugin: https://tools.google.com/dlpage/gaoptout?hl=de, Einstellungen für die Darstellung von Werbeeinblendungen: https://adssettings.google.com/authenticated.
    • +
    • Google Ads und Konversionsmessung: Wir nutzen das Onlinemarketingverfahren “Google Ads”, um Anzeigen im Google-Werbe-Netzwerk zu platzieren (z.B., in Suchergebnissen, in Videos, auf Webseiten, etc.), damit sie Nutzern angezeigt werden, die ein mutmaßliches Interesse an den Anzeigen haben. Ferner messen wir die Konversion der Anzeigen. Wir erfahren jedoch nur die anonyme Gesamtanzahl der Nutzer, die auf unsere Anzeige geklickt haben und zu einer mit einem sog “Conversion-Tracking-Tag” versehenen Seite weitergeleitet wurden. Wir selbst erhalten jedoch keine Informationen, mit denen sich Nutzer identifizieren lassen. Dienstanbieter: Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Ireland, parent company: Google LLC, 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA; Website: https://marketingplatform.google.com; Datenschutzerklärung: https://policies.google.com/privacy.
    • +
    +

    Bewertungsplattformen

    +

    Wir nehmen an Bewertungsverfahren teil, um unsere Leistungen zu evaluieren, zu optimieren und zu bewerben. Wenn Nutzer uns über die beteiligten Bewertungsplattformen oder -verfahren bewerten oder anderweitig Feedback geben, gelten zusätzlich die Allgemeinen Geschäfts- oder Nutzungsbedingungen und die Datenschutzhinweise der Anbieter. Im Regelfall setzt die Bewertung zudem eine Registrierung bei den jeweiligen Anbietern voraus.

    +

    Um sicherzustellen, dass die bewertenden Personen tatsächlich unsere Leistungen in Anspruch genommen haben, übermitteln wir mit Einwilligung der Kunden die hierzu erforderlichen Daten im Hinblick auf den Kunden und die in Anspruch genommene Leistung an die jeweilige Bewertungsplattform (einschließlich Name, E-Mail-Adresse und Bestellnummer bzw. Artikelnummer). Diese Daten werden alleine zur Verifizierung der Authentizität des Nutzers verwendet.

    +

    Bewertungs-Widget: Wir binden in unser Onlineangebot sogenannte “Bewertungs-Widgets“ ein. Ein Widget ist ein in unser Onlineangebot eingebundenes Funktions- und Inhaltselement, das veränderliche Informationen anzeigt. Es kann z.B. in Form eines Siegels oder vergleichbaren Elements, zum Teil auch “Badge” genannt, dargestellt werden. Dabei wird der entsprechende Inhalt des Widgets zwar innerhalb unseres Onlineangebotes dargestellt, er wird aber in diesem Moment von den Servern des jeweiligen Widgets-Anbieters abgerufen. Nur so kann immer der aktuelle Inhalt gezeigt werden, vor allem die jeweils aktuelle Bewertung. Dafür muss eine Datenverbindung von der innerhalb unseres Onlineangebotes aufgerufenen Webseite zu dem Server des Widgets-Anbieters aufgebaut werden und der Widgets-Anbieter erhält gewisse technische Daten (Zugriffsdaten, inklusive IP-Adresse), die nötig sind, damit der Inhalt des Widgets an den Browser des Nutzers ausgeliefert werden kann.

    +

    Des Weiteren erhält der Widgets-Anbieter Informationen darüber, dass Nutzer unser Onlineangebot besucht haben. Diese Informationen können in einem Cookie gespeichert und von dem Widgets-Anbieter verwendet werden, um zu erkennen, welche Onlineangebote, die am dem Bewertungsverfahren teilnehmen, von dem Nutzer besucht worden sind. Die Informationen können in einem Nutzerprofil gespeichert und für Werbe- oder Marktforschungszwecke verwendet werden.

    +
      +
    • Verarbeitete Datenarten: Vertragsdaten (z.B. Vertragsgegenstand, Laufzeit, Kundenkategorie), Nutzungsdaten (z.B. besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten), Meta-/Kommunikationsdaten (z.B. Geräte-Informationen, IP-Adressen).
    • +
    • Betroffene Personen: Kunden, Nutzer (z.B. Webseitenbesucher, Nutzer von Onlinediensten).
    • +
    • Zwecke der Verarbeitung: Feedback (z.B. Sammeln von Feedback via Online-Formular), Reichweitenmessung (z.B. Zugriffsstatistiken, Erkennung wiederkehrender Besucher), Besuchsaktionsauswertung, Interessenbasiertes und verhaltensbezogenes Marketing, Profiling (Erstellen von Nutzerprofilen).
    • +
    • Rechtsgrundlagen: Einwilligung (Art. 6 Abs. 1 S. 1 lit. a DSGVO), Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f. DSGVO).
    • +
    +

    Präsenzen in sozialen Netzwerken (Social Media)

    +

    Wir unterhalten Onlinepräsenzen innerhalb sozialer Netzwerke und verarbeiten in diesem Rahmen Daten der Nutzer, um mit den dort aktiven Nutzern zu kommunizieren oder um Informationen über uns anzubieten.

    +

    Wir weisen darauf hin, dass dabei Daten der Nutzer außerhalb des Raumes der Europäischen Union verarbeitet werden können. Hierdurch können sich für die Nutzer Risiken ergeben, weil so z.B. die Durchsetzung der Rechte der Nutzer erschwert werden könnte.

    +

    Ferner werden die Daten der Nutzer innerhalb sozialer Netzwerke im Regelfall für Marktforschungs- und Werbezwecke verarbeitet. So können z.B. anhand des Nutzungsverhaltens und sich daraus ergebender Interessen der Nutzer Nutzungsprofile erstellt werden. Die Nutzungsprofile können wiederum verwendet werden, um z.B. Werbeanzeigen innerhalb und außerhalb der Netzwerke zu schalten, die mutmaßlich den Interessen der Nutzer entsprechen. Zu diesen Zwecken werden im Regelfall Cookies auf den Rechnern der Nutzer gespeichert, in denen das Nutzungsverhalten und die Interessen der Nutzer gespeichert werden. Ferner können in den Nutzungsprofilen auch Daten unabhängig der von den Nutzern verwendeten Geräte gespeichert werden (insbesondere, wenn die Nutzer Mitglieder der jeweiligen Plattformen sind und bei diesen eingeloggt sind).

    +

    Für eine detaillierte Darstellung der jeweiligen Verarbeitungsformen und der Widerspruchsmöglichkeiten (Opt-Out) verweisen wir auf die Datenschutzerklärungen und Angaben der Betreiber der jeweiligen Netzwerke.

    +

    Auch im Fall von Auskunftsanfragen und der Geltendmachung von Betroffenenrechten weisen wir darauf hin, dass diese am effektivsten bei den Anbietern geltend gemacht werden können. Nur die Anbieter haben jeweils Zugriff auf die Daten der Nutzer und können direkt entsprechende Maßnahmen ergreifen und Auskünfte geben. Sollten Sie dennoch Hilfe benötigen, dann können Sie sich an uns wenden.

    +
      +
    • Verarbeitete Datenarten: Bestandsdaten (z.B. Namen, Adressen), Kontaktdaten (z.B. E-Mail, Telefonnummern), Inhaltsdaten (z.B. Texteingaben, Fotografien, Videos), Nutzungsdaten (z.B. besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten), Meta-/Kommunikationsdaten (z.B. Geräte-Informationen, IP-Adressen).
    • +
    • Betroffene Personen: Nutzer (z.B. Webseitenbesucher, Nutzer von Onlinediensten).
    • +
    • Zwecke der Verarbeitung: Kontaktanfragen und Kommunikation, Tracking (z.B. interessens-/verhaltensbezogenes Profiling, Nutzung von Cookies), Remarketing, Reichweitenmessung (z.B. Zugriffsstatistiken, Erkennung wiederkehrender Besucher).
    • +
    • Rechtsgrundlagen: Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f. DSGVO).
    • +
    +

    Eingesetzte Dienste und Diensteanbieter:

    + +

    Plugins und eingebettete Funktionen sowie Inhalte

    +

    Wir binden in unser Onlineangebot Funktions- und Inhaltselemente ein, die von den Servern ihrer jeweiligen Anbieter (nachfolgend bezeichnet als “Drittanbieter”) bezogen werden. Dabei kann es sich zum Beispiel um Grafiken, Videos oder Social-Media-Schaltflächen sowie Beiträge handeln (nachfolgend einheitlich bezeichnet als “Inhalte”).

    +

    Die Einbindung setzt immer voraus, dass die Drittanbieter dieser Inhalte die IP-Adresse der Nutzer verarbeiten, da sie ohne die IP-Adresse die Inhalte nicht an deren Browser senden könnten. Die IP-Adresse ist damit für die Darstellung dieser Inhalte oder Funktionen erforderlich. Wir bemühen uns, nur solche Inhalte zu verwenden, deren jeweilige Anbieter die IP-Adresse lediglich zur Auslieferung der Inhalte verwenden. Drittanbieter können ferner sogenannte Pixel-Tags (unsichtbare Grafiken, auch als “Web Beacons” bezeichnet) für statistische oder Marketingzwecke verwenden. Durch die “Pixel-Tags” können Informationen, wie der Besucherverkehr auf den Seiten dieser Webseite, ausgewertet werden. Die pseudonymen Informationen können ferner in Cookies auf dem Gerät der Nutzer gespeichert werden und unter anderem technische Informationen zum Browser und zum Betriebssystem, zu verweisenden Webseiten, zur Besuchszeit sowie weitere Angaben zur Nutzung unseres Onlineangebotes enthalten als auch mit solchen Informationen aus anderen Quellen verbunden werden.

    +

    Hinweise zu Rechtsgrundlagen: Sofern wir die Nutzer um deren Einwilligung in den Einsatz der Drittanbieter bitten, ist die Rechtsgrundlage der Verarbeitung von Daten die Einwilligung. Ansonsten werden die Daten der Nutzer auf Grundlage unserer berechtigten Interessen (d.h. Interesse an effizienten, wirtschaftlichen und empfängerfreundlichen Leistungen) verarbeitet. In diesem Zusammenhang möchten wir Sie auch auf die Informationen zur Verwendung von Cookies in dieser Datenschutzerklärung hinweisen.

    +

    Einbindung von Drittsoftware, Skripten oder Frameworks (z. B. jQuery): Wir binden in unser Onlineangebot Software ein, die wir von Servern anderer Anbieter abrufen (z.B. Funktions-Bibliotheken, die wir zwecks Darstellung oder Nutzerfreundlichkeit unseres Onlineangebotes verwenden). Hierbei erheben die jeweiligen Anbieter die IP-Adresse der Nutzer und können diese zu Zwecken der Übermittlung der Software an den Browser der Nutzer sowie zu Zwecken der Sicherheit, als auch zur Auswertung und Optimierung ihres Angebotes verarbeiten.

    +
      +
    • Verarbeitete Datenarten: Nutzungsdaten (z.B. besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten), Meta-/Kommunikationsdaten (z.B. Geräte-Informationen, IP-Adressen), Standortdaten (Daten, die den Standort des Endgeräts eines Endnutzers angeben), Kontaktdaten (z.B. E-Mail, Telefonnummern), Inhaltsdaten (z.B. Texteingaben, Fotografien, Videos), Bestandsdaten (z.B. Namen, Adressen).
    • +
    • Betroffene Personen: Nutzer (z.B. Webseitenbesucher, Nutzer von Onlinediensten), Kommunikationspartner.
    • +
    • Zwecke der Verarbeitung: Bereitstellung unseres Onlineangebotes und Nutzerfreundlichkeit, Vertragliche Leistungen und Service, Kontaktanfragen und Kommunikation, Direktmarketing (z.B. per E-Mail oder postalisch), Tracking (z.B. interessens-/verhaltensbezogenes Profiling, Nutzung von Cookies), Interessenbasiertes und verhaltensbezogenes Marketing, Profiling (Erstellen von Nutzerprofilen), Sicherheitsmaßnahmen, Verwaltung und Beantwortung von Anfragen.
    • +
    • Rechtsgrundlagen: Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f. DSGVO), Einwilligung (Art. 6 Abs. 1 S. 1 lit. a DSGVO), Vertragserfüllung und vorvertragliche Anfragen (Art. 6 Abs. 1 S. 1 lit. b. DSGVO).
    • +
    +

    Eingesetzte Dienste und Diensteanbieter:

    +
      +
    • Google Fonts: Wir binden die Schriftarten (“Google Fonts”) des Anbieters Google ein, wobei die Daten der Nutzer allein zu Zwecken der Darstellung der Schriftarten im Browser der Nutzer verwendet werden. Die Einbindung erfolgt auf Grundlage unserer berechtigten Interessen an einer technisch sicheren, wartungsfreien und effizienten Nutzung von Schriftarten, deren einheitlicher Darstellung sowie unter Berücksichtigung möglicher lizenzrechtlicher Restriktionen für deren Einbindung. Dienstanbieter: Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Irland, Mutterunternehmen: Google LLC, 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA; Website: https://fonts.google.com/; Datenschutzerklärung: https://policies.google.com/privacy.
    • +
    • Google Maps: Wir binden die Landkarten des Dienstes “Google Maps” des Anbieters Google ein. Zu den verarbeiteten Daten können insbesondere IP-Adressen und Standortdaten der Nutzer gehören, die jedoch nicht ohne deren Einwilligung (im Regelfall im Rahmen der Einstellungen ihrer Mobilgeräte vollzogen), erhoben werden; Dienstanbieter: Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Irland, Mutterunternehmen: Google LLC, 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA; Website: https://cloud.google.com/maps-platform; Datenschutzerklärung: https://policies.google.com/privacy; Widerspruchsmöglichkeit (Opt-Out): Opt-Out-Plugin: https://tools.google.com/dlpage/gaoptout?hl=de, Einstellungen für die Darstellung von Werbeeinblendungen: https://adssettings.google.com/authenticated.
    • +
    • Instagram-Plugins und -Inhalte: Instagram Plugins und -Inhalte – Hierzu können z.B. Inhalte wie Bilder, Videos oder Texte und Schaltflächen gehören, mit denen Nutzer Inhalte dieses Onlineangebotes innerhalb von Instagram teilen können. Dienstanbieter: https://www.instagram.com, Instagram Inc., 1601 Willow Road, Menlo Park, CA, 94025, USA; Website: https://www.instagram.com; Datenschutzerklärung: https://instagram.com/about/legal/privacy.
    • +
    • ReCaptcha: Wir binden die Funktion “ReCaptcha” zur Erkennung von Bots, z.B. bei Eingaben in Onlineformularen, ein. Die Verhaltensangaben der Nutzer (z.B. Mausbewegungen oder Abfragen) werden ausgewertet, um Menschen von Bots unterscheiden zu können. Dienstanbieter: Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Irland, Mutterunternehmen: Google LLC, 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA; Website: https://www.google.com/recaptcha/; Datenschutzerklärung: https://policies.google.com/privacy; Widerspruchsmöglichkeit (Opt-Out): Opt-Out-Plugin: https://tools.google.com/dlpage/gaoptout?hl=de, Einstellungen für die Darstellung von Werbeeinblendungen: https://adssettings.google.com/authenticated.
    • +
    • YouTube-Videos: Videoinhalte; Dienstanbieter: Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Irland, Mutterunternehmen: Google LLC, 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA; Website: https://www.youtube.com; Datenschutzerklärung: https://policies.google.com/privacy; Widerspruchsmöglichkeit (Opt-Out): Opt-Out-Plugin: https://tools.google.com/dlpage/gaoptout?hl=de, Einstellungen für die Darstellung von Werbeeinblendungen: https://adssettings.google.com/authenticated.
    • +
    +

    Analyse-Tools und Werbung - Facebook Pixel

    +

    Diese Website nutzt zur Konversionsmessung der Besucheraktions-Pixel von Facebook. Anbieter diesesDienstes ist die Facebook Ireland Limited, 4 Grand Canal Square, Dublin 2, Irland. Die erfassten Datenwerden nach Aussage von Facebook jedoch auch in die USA und in andere Drittländer übertragen.So kann das Verhalten der Seitenbesucher nachverfolgt werden, nachdem diese durch Klick auf eineFacebook-Werbeanzeige auf die Website des Anbieters weitergeleitet wurden. Dadurch können dieWirksamkeit der Facebook-Werbeanzeigen für statistische und Marktforschungszwecke ausgewertetwerden und zukünftige Werbemaßnahmen optimiert werden.Die erhobenen Daten sind für uns als Betreiber dieser Website anonym, wir können keine Rückschlüsse aufdie Identität der Nutzer ziehen. Die Daten werden aber von Facebook gespeichert und verarbeitet, sodasseine Verbindung zum jeweiligen Nutzerprofil möglich ist und Facebook die Daten für eigene Werbezwecke,entsprechend derFacebook-Datenverwendungsrichtlinie verwenden kann. Dadurch kann Facebook das Schalten vonWerbeanzeigen auf Seiten von Facebook sowie außerhalb von Facebook ermöglichen. Diese Verwendungder Daten kann von uns als Seitenbetreiber nicht beeinflusst werden.Die Nutzung von Facebook-Pixel erfolgt auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO. Der Websitebetreiberhat ein berechtigtes Interesse an effektiven Werbemaßnahmen unter Einschluss der sozialen Medien.Sofern eine entsprechende Einwilligung abgefragt wurde (z. B. eine Einwilligung zur Speicherung vonCookies), erfolgt die Verarbeitung ausschließlich auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO; dieEinwilligung ist jederzeit widerrufbar.Die Datenübertragung in die USA wird auf die Standardvertragsklauseln der EU-Kommission gestützt.Details finden Sie hier:https://www.facebook.com/legal/EU_data_transfer_addendum undhttps://de-de.facebook.com/help/566994660333381

    +

    Soweit mit Hilfe des hier beschriebenen Tools personenbezogene Daten auf unserer Website erfasst und anFacebook weitergeleitet werden, sind wir und die Facebook Ireland Limited, 4 Grand Canal Square, GrandCanal Harbour, Dublin 2, Irland gemeinsam für diese Datenverarbeitung verantwortlich (Art. 26 DSGVO).Die gemeinsame Verantwortlichkeit beschränkt sich dabei ausschließlich auf die Erfassung der Daten undderen Weitergabe an Facebook. Die nach der Weiterleitung erfolgende Verarbeitung durch Facebook istnicht Teil der gemeinsamen Verantwortung. Die uns gemeinsam obliegenden Verpflichtungen wurden ineiner Vereinbarung über gemeinsame Verarbeitung festgehalten. Den Wortlaut der Vereinbarung finden Sieunter:https://www.facebook.com/legal/controller_addendum. Laut dieser Vereinbarung sind wir für die Erteilungder Datenschutzinformationen beim Einsatz des Facebook-Tools und für die datenschutzrechtlich sichereImplementierung des Tools auf unserer Website verantwortlich. Für die Datensicherheit der Facebook-Produkte ist Facebook verantwortlich. Betroffenenrechte (z.B. Auskunftsersuchen) hinsichtlich der beiFacebook verarbeiteten Daten können Sie direkt bei Facebook geltend machen. Wenn Sie dieBetroffenenrechte bei uns geltend machen, sind wir verpflichtet, diese an Facebook weiterzuleiten.In den Datenschutzhinweisen von Facebook finden Sie weitere Hinweise zum Schutz Ihrer Privatsphäre:https://de-de.facebook.com/about/privacy/.Sie können außerdem die Remarketing-Funktion „Custom Audiences“ im Bereich Einstellungen fürWerbeanzeigen unterhttps://www.facebook.com/ads/preferences/?entry_product=ad_settings_screen deaktivieren. Dazumüssen Sie bei Facebook angemeldet sein.Wenn Sie kein Facebook Konto besitzen, können Sie nutzungsbasierte Werbung von Facebook auf derWebsite der European Interactive Digital Advertising Alliance deaktivieren:http://www.youronlinechoices.com/de/praferenzmanagement/.

    +

    Löschung von Daten

    +

    Die von uns verarbeiteten Daten werden nach Maßgabe der gesetzlichen Vorgaben gelöscht, sobald deren zur Verarbeitung erlaubten Einwilligungen widerrufen werden oder sonstige Erlaubnisse entfallen (z.B., wenn der Zweck der Verarbeitung dieser Daten entfallen ist oder sie für den Zweck nicht erforderlich sind).

    +

    Sofern die Daten nicht gelöscht werden, weil sie für andere und gesetzlich zulässige Zwecke erforderlich sind, wird deren Verarbeitung auf diese Zwecke beschränkt. D.h., die Daten werden gesperrt und nicht für andere Zwecke verarbeitet. Das gilt z.B. für Daten, die aus handels- oder steuerrechtlichen Gründen aufbewahrt werden müssen oder deren Speicherung zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen oder zum Schutz der Rechte einer anderen natürlichen oder juristischen Person erforderlich ist.

    +

    Weitere Hinweise zu der Löschung von personenbezogenen Daten können ferner im Rahmen der einzelnen Datenschutzhinweise dieser Datenschutzerklärung erfolgen.

    +

    Änderung und Aktualisierung der Datenschutzerklärung

    +

    Wir bitten Sie, sich regelmäßig über den Inhalt unserer Datenschutzerklärung zu informieren. Wir passen die Datenschutzerklärung an, sobald die Änderungen der von uns durchgeführten Datenverarbeitungen dies erforderlich machen. Wir informieren Sie, sobald durch die Änderungen eine Mitwirkungshandlung Ihrerseits (z.B. Einwilligung) oder eine sonstige individuelle Benachrichtigung erforderlich wird.

    +

    Sofern wir in dieser Datenschutzerklärung Adressen und Kontaktinformationen von Unternehmen und Organisationen angeben, bitten wir zu beachten, dass die Adressen sich über die Zeit ändern können und bitten die Angaben vor Kontaktaufnahme zu prüfen.

    +

    Rechte der betroffenen Personen

    +

    Ihnen stehen als Betroffene nach der DSGVO verschiedene Rechte zu, die sich insbesondere aus Art. 15 bis 21 DSGVO ergeben:

    +
      +
    • Widerspruchsrecht: Sie haben das Recht, aus Gründen, die sich aus Ihrer besonderen Situation ergeben, jederzeit gegen die Verarbeitung der Sie betreffenden personenbezogenen Daten, die aufgrund von Art. 6 Abs. 1 lit. e oder f DSGVO erfolgt, Widerspruch einzulegen; dies gilt auch für ein auf diese Bestimmungen gestütztes Profiling. Werden die Sie betreffenden personenbezogenen Daten verarbeitet, um Direktwerbung zu betreiben, haben Sie das Recht, jederzeit Widerspruch gegen die Verarbeitung der Sie betreffenden personenbezogenen Daten zum Zwecke derartiger Werbung einzulegen; dies gilt auch für das Profiling, soweit es mit solcher Direktwerbung in Verbindung steht.
    • +
    • Widerrufsrecht bei Einwilligungen: Sie haben das Recht, erteilte Einwilligungen jederzeit zu widerrufen.
    • +
    • Auskunftsrecht: Sie haben das Recht, eine Bestätigung darüber zu verlangen, ob betreffende Daten verarbeitet werden und auf Auskunft über diese Daten sowie auf weitere Informationen und Kopie der Daten entsprechend den gesetzlichen Vorgaben.
    • +
    • Recht auf Berichtigung: Sie haben entsprechend den gesetzlichen Vorgaben das Recht, die Vervollständigung der Sie betreffenden Daten oder die Berichtigung der Sie betreffenden unrichtigen Daten zu verlangen.
    • +
    • Recht auf Löschung und Einschränkung der Verarbeitung: Sie haben nach Maßgabe der gesetzlichen Vorgaben das Recht, zu verlangen, dass Sie betreffende Daten unverzüglich gelöscht werden, bzw. alternativ nach Maßgabe der gesetzlichen Vorgaben eine Einschränkung der Verarbeitung der Daten zu verlangen.
    • +
    • Recht auf Datenübertragbarkeit: Sie haben das Recht, Sie betreffende Daten, die Sie uns bereitgestellt haben, nach Maßgabe der gesetzlichen Vorgaben in einem strukturierten, gängigen und maschinenlesbaren Format zu erhalten oder deren Übermittlung an einen anderen Verantwortlichen zu fordern.
    • +
    • Beschwerde bei Aufsichtsbehörde: Sie haben ferner nach Maßgabe der gesetzlichen Vorgaben das Recht, bei einer Aufsichtsbehörde, insbesondere in dem Mitgliedstaat Ihres gewöhnlichen Aufenthaltsorts, Ihres Arbeitsplatzes oder des Orts des mutmaßlichen Verstoßes Beschwerde einzulegen, wenn Sie der Ansicht sind, dass die Verarbeitung der Sie betreffenden personenbezogenen Daten gegen die DSGVO verstößt.
    • +
    +

    Begriffsdefinitionen

    +

    In diesem Abschnitt erhalten Sie eine Übersicht über die in dieser Datenschutzerklärung verwendeten Begrifflichkeiten. Viele der Begriffe sind dem Gesetz entnommen und vor allem im Art. 4 DSGVO definiert. Die gesetzlichen Definitionen sind verbindlich. Die nachfolgenden Erläuterungen sollen dagegen vor allem dem Verständnis dienen. Die Begriffe sind alphabetisch sortiert.

    +
      +
    • Affiliate-Nachverfolgung: Im Rahmen der Affiliate-Nachverfolgung werden Links, mit deren Hilfe die verlinkenden Webseiten Nutzer zu Webseiten mit Produkt- oder sonstigen Angeboten verweisen, protokolliert. Die Betreiber der jeweils verlinkenden Webseiten können eine Provision erhalten, wenn Nutzer diesen sogenannten Affiliate-Links folgen und anschließend die Angebote wahrnehmen (z.B. Waren kaufen oder Dienstleistungen in Anspruch nehmen). Hierzu ist es erforderlich, dass die Anbieter nachverfolgen können, ob Nutzer, die sich für bestimmte Angebote interessieren, diese anschließend auf die Veranlassung der Affiliate-Links wahrnehmen. Daher ist es für die Funktionsfähigkeit von Affiliate-Links erforderlich, dass sie um bestimmte Werte ergänzt werden, die ein Bestandteil des Links werden oder anderweitig, z.B. in einem Cookie, gespeichert werden. Zu den Werten gehören insbesondere die Ausgangswebseite (Referrer), der Zeitpunkt, eine Online-Kennung der Betreiber der Webseite, auf der sich der Affiliate-Link befand, eine Online-Kennung des jeweiligen Angebotes, eine Online-Kennung des Nutzers als auch nachverfolgungsspezifische Werte, wie, z.B. Werbemittel-ID, Partner-ID und Kategorisierungen.
    • +
    • Besuchsaktionsauswertung: “Besuchsaktionsauswertung” (englisch “Conversion Tracking”) bezeichnet ein Verfahren, mit dem die Wirksamkeit von Marketingmaßnahmen festgestellt werden kann. Dazu wird im Regelfall ein Cookie auf den Geräten der Nutzer innerhalb der Webseiten, auf denen die Marketingmaßnahmen erfolgen, gespeichert und dann erneut auf der Zielwebseite abgerufen. Beispielsweise können wir so nachvollziehen, ob die von uns auf anderen Webseiten geschalteten Anzeigen erfolgreich waren).
    • +
    • IP-Masking: Als “IP-Masking” wird eine Methode bezeichnet, bei der das letzte Oktett, d.h., die letzten beiden Zahlen einer IP-Adresse, gelöscht wird, damit die IP-Adresse nicht mehr der eindeutigen Identifizierung einer Person dienen kann. Daher ist das IP-Masking ein Mittel zur Pseudonymisierung von Verarbeitungsverfahren, insbesondere im Onlinemarketing
    • +
    • Interessenbasiertes und verhaltensbezogenes Marketing: Von interessens- und/oder verhaltensbezogenem Marketing spricht man, wenn potentielle Interessen von Nutzern an Anzeigen und sonstigen Inhalten möglichst genau vorbestimmt werden. Dies geschieht anhand von Angaben zu deren Vorverhalten (z.B. Aufsuchen von bestimmten Webseiten und Verweilen auf diesen, Kaufverhaltens oder Interaktion mit anderen Nutzern), die in einem sogenannten Profil gespeichert werden. Zu diesen Zwecken werden im Regelfall Cookies eingesetzt.
    • +
    • Konversionsmessung: Die Konversionsmessung ist ein Verfahren, mit dem die Wirksamkeit von Marketingmaßnahmen festgestellt werden kann. Dazu wird im Regelfall ein Cookie auf den Geräten der Nutzer innerhalb der Webseiten, auf denen die Marketingmaßnahmen erfolgen, gespeichert und dann erneut auf der Zielwebseite abgerufen. Beispielsweise können wir so nachvollziehen, ob die von uns auf anderen Webseiten geschalteten Anzeigen erfolgreich waren.
    • +
    • Personenbezogene Daten: “Personenbezogene Daten“ sind alle Informationen, die sich auf eine identifizierte oder identifizierbare natürliche Person (im Folgenden “betroffene Person“) beziehen; als identifizierbar wird eine natürliche Person angesehen, die direkt oder indirekt, insbesondere mittels Zuordnung zu einer Kennung wie einem Namen, zu einer Kennnummer, zu Standortdaten, zu einer Online-Kennung (z.B. Cookie) oder zu einem oder mehreren besonderen Merkmalen identifiziert werden kann, die Ausdruck der physischen, physiologischen, genetischen, psychischen, wirtschaftlichen, kulturellen oder sozialen Identität dieser natürlichen Person sind.
    • +
    • Profiling: Als “Profiling“ wird jede Art der automatisierten Verarbeitung personenbezogener Daten bezeichnet, die darin besteht, dass diese personenbezogenen Daten verwendet werden, um bestimmte persönliche Aspekte, die sich auf eine natürliche Person beziehen (je nach Art des Profilings gehören dazu Informationen betreffend das Alter, das Geschlecht, Standortdaten und Bewegungsdaten, Interaktion mit Webseiten und deren Inhalten, Einkaufsverhalten, soziale Interaktionen mit anderen Menschen) zu analysieren, zu bewerten oder, um sie vorherzusagen (z.B. die Interessen an bestimmten Inhalten oder Produkten, das Klickverhalten auf einer Webseite oder den Aufenthaltsort). Zu Zwecken des Profilings werden häufig Cookies und Web-Beacons eingesetzt.
    • +
    • Reichweitenmessung: Die Reichweitenmessung (auch als Web Analytics bezeichnet) dient der Auswertung der Besucherströme eines Onlineangebotes und kann das Verhalten oder Interessen der Besucher an bestimmten Informationen, wie z.B. Inhalten von Webseiten, umfassen. Mit Hilfe der Reichweitenanalyse können Webseiteninhaber z.B. erkennen, zu welcher Zeit Besucher ihre Webseite besuchen und für welche Inhalte sie sich interessieren. Dadurch können sie z.B. die Inhalte der Webseite besser an die Bedürfnisse ihrer Besucher anpassen. Zu Zwecken der Reichweitenanalyse werden häufig pseudonyme Cookies und Web-Beacons eingesetzt, um wiederkehrende Besucher zu erkennen und so genauere Analysen zur Nutzung eines Onlineangebotes zu erhalten.
    • +
    • Remarketing: Vom “Remarketing“ bzw. “Retargeting“ spricht man, wenn z.B. zu Werbezwecken vermerkt wird, für welche Produkte sich ein Nutzer auf einer Webseite interessiert hat, um den Nutzer auf anderen Webseiten an diese Produkte, z.B. in Werbeanzeigen, zu erinnern.
    • +
    • Tracking: Vom “Tracking“ spricht man, wenn das Verhalten von Nutzern über mehrere Onlineangebote hinweg nachvollzogen werden kann. Im Regelfall werden im Hinblick auf die genutzten Onlineangebote Verhaltens- und Interessensinformationen in Cookies oder auf Servern der Anbieter der Trackingtechnologien gespeichert (sogenanntes Profiling). Diese Informationen können anschließend z.B. eingesetzt werden, um den Nutzern Werbeanzeigen anzuzeigen, die voraussichtlich deren Interessen entsprechen.
    • +
    • Verantwortlicher: Als “Verantwortlicher“ wird die natürliche oder juristische Person, Behörde, Einrichtung oder andere Stelle, die allein oder gemeinsam mit anderen über die Zwecke und Mittel der Verarbeitung von personenbezogenen Daten entscheidet, bezeichnet.
    • +
    • Verarbeitung: “Verarbeitung” ist jeder mit oder ohne Hilfe automatisierter Verfahren ausgeführte Vorgang oder jede solche Vorgangsreihe im Zusammenhang mit personenbezogenen Daten. Der Begriff reicht weit und umfasst praktisch jeden Umgang mit Daten, sei es das Erheben, das Auswerten, das Speichern, das Übermitteln oder das Löschen.
    • +
    +

    Rechtstext von Dr. Schwenke - für weitere Informationen bitte anklicken.

    +
    +
    + +
    +
    + {!! Form::close() !!} + +@endsection diff --git a/resources/views/web/legal/impressum.blade.php b/resources/views/web/legal/impressum.blade.php new file mode 100644 index 0000000..aeba25c --- /dev/null +++ b/resources/views/web/legal/impressum.blade.php @@ -0,0 +1,50 @@ +@extends('web.layouts.layout') + +@section('content') +
    + +
    + + +
    +

    Impressum

    +
    +
    +

    GRÜNE SEELE Naturkosmetik
    +Hauptstrasse 174
    +51143 Köln
    +Nordrhein-Westfalen
    +Deutschland

    +

    Betreiber:
    +GRÜNE SEELE GmbH

    +

    Geschäftsführung:
    +
    Ruth Krummel

    +

    Registereintrag
    +Eintragung im Handelsregister
    +Registergericht: Amtsgericht Köln
    +Registernummer: HRB87173

    +

    UST-ID:
    +DE296797691

    +

    Tel.: (+49) 2203 183 86 14
    +Mail: service@gruene-seele.bio

    +

    Haftungsausschluss & Datenschutzbestimmungen

    +

    1. Inhalt des Onlineangebotes
    +Der Autor übernimmt keinerlei Gewähr für die Aktualität, Korrektheit, Vollständigkeit oder Qualität der bereitgestellten Informationen. Haftungsansprüche gegen den Autor, welche sich auf Schäden materieller oder ideeller Art beziehen, die durch die Nutzung oder Nichtnutzung der dargebotenen Informationen bzw. durch die Nutzung fehlerhafter und unvollständiger Informationen verursacht wurden, sind grundsätzlich ausgeschlossen, sofern seitens des Autors kein nachweislich vorsätzliches oder grob fahrlässiges Verschulden vorliegt. Alle Angebote sind freibleibend und unverbindlich. Der Autor behält es sich ausdrücklich vor, Teile der Seiten oder das gesamte Angebot ohne gesonderte Ankündigung zu verändern, zu ergänzen, zu löschen oder die Veröffentlichung zeitweise oder endgültig einzustellen.

    +

    2. Verweise und Links
    +Bei direkten oder indirekten Verweisen auf fremde Internetseiten (“Links”), die außerhalb des Verantwortungsbereiches des Autors liegen, würde eine Haftungsverpflichtung ausschließlich in dem Fall in Kraft treten, in dem der Autor von den Inhalten Kenntnis hat und es ihm technisch möglich und zumutbar wäre, die Nutzung im Falle rechtswidriger Inhalte zu verhindern. Der Autor erklärt hiermit ausdrücklich, dass zum Zeitpunkt der Linksetzung keine illegalen Inhalte auf den zu verlinkenden Seiten erkennbar waren. Auf die aktuelle und zukünftige Gestaltung, die Inhalte oder die Urheberschaft der gelinkten/verknüpften Seiten hat der Autor keinerlei Einfluss. Deshalb distanziert er sich hiermit ausdrücklich von allen Inhalten aller gelinkten /verknüpften Seiten, die nach der Linksetzung verändert wurden. Diese Feststellung gilt für alle innerhalb des eigenen Internetangebotes gesetzten Links und Verweise sowie für Fremdeinträge in vom Autor eingerichteten Gästebüchern, Diskussionsforen und Mailinglisten. Für illegale, fehlerhafte oder unvollständige Inhalte und insbesondere für Schäden, die aus der Nutzung oder Nichtnutzung solcherart dargebotener Informationen entstehen, haftet allein der Anbieter der Seite, auf welche verwiesen wurde, nicht derjenige, der über Links auf die jeweilige Veröffentlichung lediglich verweist.

    +

    3. Urheber- und Kennzeichenrecht
    +Der Autor ist bestrebt, in allen Publikationen die Urheberrechte der verwendeten Grafiken, Tondokumente, Videosequenzen und Texte zu beachten, von ihm selbst erstellte Grafiken, Tondokumente, Videosequenzen und Texte zu nutzen oder auf lizenzfreie Grafiken, Tondokumente, Videosequenzen und Texte zurückzugreifen. Alle innerhalb des Internetangebotes genannten und ggf. durch Dritte geschützten Marken- und Warenzeichen unterliegen uneingeschränkt den Bestimmungen des jeweils gültigen Kennzeichenrechts und den Besitzrechten der jeweiligen eingetragenen Eigentümer. Allein aufgrund der bloßen Nennung ist nicht der Schluß zu ziehen, dass Markenzeichen nicht durch Rechte Dritter geschützt sind! Das Copyright für veröffentlichte, vom Autor selbst erstellte Objekte bleibt allein beim Autor der Seiten. Eine Vervielfältigung oder Verwendung solcher Grafiken, Tondokumente, Videosequenzen und Texte in anderen elektronischen oder gedruckten Publikationen ist ohne ausdrückliche Zustimmung des Autors nicht gestattet.

    +

    4. Rechtswirksamkeit dieses Haftungsausschlusses
    +Dieser Haftungsausschluss ist als Teil des Internetangebotes zu betrachten, von dem aus auf diese Seite verwiesen wurde. Sofern Teile oder einzelne Formulierungen dieses Textes der geltenden Rechtslage nicht, nicht mehr oder nicht vollständig entsprechen sollten, bleiben die übrigen Teile des Dokumentes in ihrem Inhalt und ihrer Gültigkeit davon unberührt.

    +
    +

    Alternative Streitbeilegung gemäß Art. 14 Abs. 1 ODR-VO und § 36 VSBG:

    + +

    Die Europäische Kommission stellt eine Plattform zur Online-Streitbeilegung (OS) bereit, die du unter https://ec.europa.eu/consumers/odr findest. Wir sind bereit, an einem außergerichtlichen Schlichtungsverfahren teilzunehmen.

    +
    +
    +
    + +
    +
    + +@endsection diff --git a/resources/views/web/legal/versandarten.blade.php b/resources/views/web/legal/versandarten.blade.php new file mode 100644 index 0000000..cc88005 --- /dev/null +++ b/resources/views/web/legal/versandarten.blade.php @@ -0,0 +1,104 @@ +@extends('web.layouts.layout') + +@section('content') +
    + +
    + + +
    +

    Versandkosten & Versandkosten - + innerhalb Deutschlands, der EU und Drittländer

    +
    +
    + + +

    Wir berechnen eine Versandkostenpauschale, die alle Kosten für den Versand Deiner Ware beinhalten:

    + +
      +
    • Gebühren des Versanddienstleisters (DHL, DPD, Deutsche Post)
    • +
    • Verpackungsmaterial (Kartonagen, Label, Füllmaterial etc.)
    • +
    • Fullfillment (externe Verpackungsdienstleister)
    • +
    +

    + + Wir bitten um Verständnis, dass wir als Vermittler der Produkte keine versandkostenfreien Mindestumsätze anbieten können. Material und Abwicklung des Versands kosten gutes Geld, vor allem seit den erhöhten Gebühren von DHL & Co. sowie den deutlich teureren Kartonagen durch die Rohstoffknappheit am Weltmarkt. + +

    +


    +
    +
    + + + + +
    +
    + +

    Dienstleister und Dauer des Versands

    +

    Deine Produkte werden wahlweise mit den Paketdienstleistern DHL als Paket oder mit der Deutschen Post als Bücher- und Warensendung versandt. Je nach Umfang der Bestellung (Gewicht und Maße) bieten wir Dir im Warenkorb diese beiden Optionen zur Auswahl an. Solltest Du die Option „Bücher- und Warensendung“ im Warenkorb nicht auswählen können, dann nur, weil die Maße oder das Gewicht hierfür überschritten wurden.

    + +

    Nach Eingang der Bestellung wird diese innerhalb eines Werktages bearbeitet und versendet.

    + +

    Besonderheiten bei den Versandoptionen:

    +

    OPTION 1:
    + Als Bücher- und Warensendung mit der Deutschen Post
    + Lieferzeit von 5–7 Werktagen
    + Verschlossener Versand

    + +

    OPTION 2:
    + Als Paket bzw. Warenpost mit DHL
    + Standardversand
    + Lieferzeit von 2-4 Werktagen
    + Verschlossener Versand

    +
    +
    +


    + +
    +
    + + + +
    +
    + +

    Welche Kosten entstehen beim Versand?

    +

    Wir versenden innerhalb von Deutschland, EU-weit und weltweit. Folgende Versandkosten werden erhoben:

    +

    Bücher- und Warensendung Deutschland mit Deutsche Post
    + bis 1 kg und Sendung bis 5 cm Dicke – Versandkostenpauschale 4,50 €

    +

    Bei kleineren Tuben nicht dicker als 4 cm (zzgl. Verpackung etc.) können wir mit „Bücher- und Warensendung” versenden. Wir können so also z. B. bis zu 4 Gel 99% mit einer Versandpauschale von 4,50 EUR versenden. Bei „dickeren“ Produkten, also über 4 cm Dicke (zzgl. Verpackung dann bei über 5 cm) nimmt die Deutsche Post das nicht mehr als „Bücher- und Warensendung“ an. Dann versenden wir als Paket für 5,90 EUR Versandkostenpauschale mit DHL.

    +

    Wie oben erwähnt, hast Du bei entsprechenden Konstellationen die Auswahl im Warenkorb.

    +

    DHL Deutschland

    +

    1. Paket bis 2 kg – Versandkostenpauschale 5,90 €
    + 2. Paket 3,01 bis 5 kg – Versandkostenpauschale 7,50 €
    + 3. Paket 5,01 bis 10 kg – Versandkostenpauschale 10,50 €

    +

    Österreich und Niederlande:
    + 1. Paket bis 5 kg – Versandkostenpauschale 11,90 €
    + 2. Paket 5,01 bis 10 kg – Versandkostenpauschale 14,90 €
    + 3. Paket 10,01 bis 20 kg – Versandkostenpauschale 18,90 €
    + 4. 20,01-31,5 kg – Versandkostenpauschale 35,90 €

    +

    DHL EU für folgende Länder:

    +

    Belgien, Italien, Tschechien, Zypern, Bulgarien, Dänemark, Estland, Finnland, Frankreich, Griechenland, Irland, Kroatien, Lettland, Litauen, Luxemburg, Malta, Polen, Portugal, Rumänien, Schweden, Slowakei, Slowenien, Spanien, Ungarn, Vereinigtes Königreich, Zypern:

    +

    1. Paket bis 5 kg – Versandkostenpauschale 18,90 €
    + 2. Paket 5,01 bis 10 kg – Versandkostenpauschale 22,90 €
    + 3. Paket 10,01 bis 20 kg – Versandkostenpauschale 26,90 €
    + 4. 20,01-31,5 kg – Versandkostenpauschale 35,90 €

    +

    Weltweit außerhalb der EU

    +

    z. B. Schweiz, Lichtenstein etc.
    + 1. Paket bis 5 kg – Versandkostenpauschale 18,90 €
    + 2. Paket 5,01 bis 10 kg – Versandkostenpauschale 22,90 €
    + 3. Paket 10,01 bis 20 kg – Versandkostenpauschale 28,90 €
    + 4. 20,01-31,5 kg – Versandkostenpauschale 35,90 €

    +
    +
    + + + + +
    + +
    +
    + +@endsection diff --git a/resources/views/web/legal/widerrufsbelehrung.blade.php b/resources/views/web/legal/widerrufsbelehrung.blade.php new file mode 100644 index 0000000..f221fad --- /dev/null +++ b/resources/views/web/legal/widerrufsbelehrung.blade.php @@ -0,0 +1,47 @@ +@extends('web.layouts.layout') + +@section('content') +
    + +
    +
    +

    Widerrufsbelehrung

    +
    +
    +

    Widerrufsrecht für Verbraucher

    +

    (Verbraucher ist jede natürliche Person, die ein Rechtsgeschäft zu Zwecken abschließt, die überwiegend weder ihrer gewerblichen noch ihrer selbstständigen beruflichen Tätigkeit zugerechnet werden kann.)

    +

    Widerrufsrecht

    +

    Sie haben das Recht, binnen vierzehn Tagen ohne Angabe von Gründen diesen Vertrag zu widerrufen.

    +

    Die Widerrufsfrist beträgt vierzehn Tage ab dem Tag,

    +
      +
    • an dem Sie oder ein von Ihnen benannter Dritter, der nicht der Beförderer ist, die Waren in Besitz genommen haben bzw. hat, sofern Sie eine oder mehrere Waren im Rahmen einer einheitlichen Bestellung bestellt haben und diese einheitlich geliefert wird bzw. werden, oder
    • +
    • an dem Sie oder ein von Ihnen benannter Dritter, der nicht der Beförderer ist, die letzte Ware in Besitz genommen haben bzw. hat, sofern Sie mehrere Waren im Rahmen einer einheitlichen Bestellung bestellt haben und diese getrennt geliefert werden, oder
    • +
    • an dem Sie oder ein von Ihnen benannter Dritter, der nicht der Beförderer ist, die letzte Teilsendung oder das letzte Stück in Besitz genommen haben bzw. hat, sofern Sie eine Ware bestellt haben, die in mehreren Teilsendungen oder Stücken geliefert wird, oder
    • +
    • an dem Sie oder ein von Ihnen benannter Dritter, der nicht der Beförderer ist, die erste Ware in Besitz genommen haben bzw. hat, sofern Sie einen Vertrag zur regelmäßigen Lieferung von Waren über einen festgelegten Zeitraum hinweg geschlossen haben.
    • +
    +

    Um Ihr Widerrufsrecht auszuüben, müssen Sie uns (Grüne Seele GbR, Hauptstr. 174, 51143 Köln, Deutschland, Deutschland, Telefonnummer: +49 (0)2203 186 90 14, E-Mail-Adresse: service@gruene-seele.bio) mittels einer eindeutigen Erklärung (z.B. ein mit der Post versandter Brief, E-Mail) über Ihren Entschluss, diesen Vertrag zu widerrufen, informieren. Sie können dafür das beigefügte Muster-Widerrufsformular verwenden, das jedoch nicht vorgeschrieben ist.

    +

    Zur Wahrung der Widerrufsfrist reicht es aus, dass Sie die Mitteilung über die Ausübung des Widerrufsrechts vor Ablauf der Widerrufsfrist absenden.

    +

    Folgen des Widerrufs

    +

    Wenn Sie diesen Vertrag widerrufen, haben wir Ihnen alle Zahlungen, die wir von Ihnen erhalten haben, einschließlich der Lieferkosten (mit Ausnahme der zusätzlichen Kosten, die sich daraus ergeben, dass Sie eine andere Art der Lieferung als die von uns angebotene, günstigste Standardlieferung gewählt haben), unverzüglich und spätestens binnen vierzehn Tagen ab dem Tag zurückzuzahlen, an dem die Mitteilung über Ihren Widerruf dieses Vertrags bei uns eingegangen ist. Für diese Rückzahlung verwenden wir dasselbe Zahlungsmittel, das Sie bei der ursprünglichen Transaktion eingesetzt haben, es sei denn, mit Ihnen wurde ausdrücklich etwas anderes vereinbart; in keinem Fall werden Ihnen wegen dieser Rückzahlung Entgelte berechnet.

    +

    Wir können die Rückzahlung verweigern, bis wir die Waren wieder zurückerhalten haben oder bis Sie den Nachweis erbracht haben, dass Sie die Waren zurückgesandt haben, je nachdem, welches der frühere Zeitpunkt ist.

    +

    Sie haben die Waren unverzüglich und in jedem Fall spätestens binnen vierzehn Tagen ab dem Tag, an dem Sie uns über den Widerruf dieses Vertrags unterrichten, an uns zurückzusenden oder zu übergeben. Die Frist ist gewahrt, wenn Sie die Waren vor Ablauf der Frist von vierzehn Tagen absenden.

    +

    Wir tragen die Kosten der Rücksendung der Waren.

    +

    Sie müssen für einen etwaigen Wertverlust der Waren nur aufkommen, wenn dieser Wertverlust auf einen zur Prüfung der Beschaffenheit, Eigenschaften und Funktionsweise der Waren nicht notwendigen Umgang mit ihnen zurückzuführen ist.

    +

    Muster-Widerrufsformular

    +

    (Wenn Sie den Vertrag widerrufen wollen, dann füllen Sie bitte dieses Formular aus und senden Sie es zurück.)

    +

    – An

    +

    Grüne Seele GbR, Hauptstr. 174, 51143 Köln, Deutschland, Deutschland, Telefonnummer: +49 (0)2203 186 90 14, E-Mail-Adresse: service@gruene-seele.bio

    +

    – Hiermit widerrufe(n) ich/wir (*) den von mir/uns (*) abgeschlossenen Vertrag über den Kauf der folgenden Waren (*)/ die Erbringung der folgenden Dienstleistung (*)

    +

    – Bestellt am (*)/erhalten am (*)

    +

    – Name des/der Verbraucher(s)

    +

    – Anschrift des/der Verbraucher(s)

    +

    – Unterschrift des/der Verbraucher(s) (nur bei Mitteilung auf Papier)

    +

    – Datum

    +

    ___________
    +(*) Unzutreffendes streichen.

    +
    +
    +
    +
    + +@endsection diff --git a/resources/views/web/promotion/_invoice_details.blade.php b/resources/views/web/promotion/_invoice_details.blade.php index a9e51e8..479881f 100644 --- a/resources/views/web/promotion/_invoice_details.blade.php +++ b/resources/views/web/promotion/_invoice_details.blade.php @@ -256,7 +256,6 @@ form.submit(); }, errorPlacement: function errorPlacement(error, element) { - console.log(error); var placement = $(element).data('error'); if (placement) { $(placement).append(error.addClass('invalid-feedback d-block')); diff --git a/resources/views/web/promotion/_invoice_details_quick.blade.php b/resources/views/web/promotion/_invoice_details_quick.blade.php index e0cf5aa..5b3f421 100644 --- a/resources/views/web/promotion/_invoice_details_quick.blade.php +++ b/resources/views/web/promotion/_invoice_details_quick.blade.php @@ -87,7 +87,6 @@ form.submit(); }, errorPlacement: function errorPlacement(error, element) { - console.log(error); var placement = $(element).data('error'); if (placement) { $(placement).append(error.addClass('invalid-feedback d-block')); diff --git a/resources/views/web/promotion/_shipping.blade.php b/resources/views/web/promotion/_shipping.blade.php index 85699bb..6eeb6cb 100644 --- a/resources/views/web/promotion/_shipping.blade.php +++ b/resources/views/web/promotion/_shipping.blade.php @@ -26,7 +26,7 @@ - {{ \App\Services\PromotionCart::getCurrentShippingPrice() }} € - Versand mit DHL (1-3 Werktage) + {{ \App\Services\UserCart::getCurrentShippingPrice() }} € - Versand mit DHL (1-3 Werktage)
    diff --git a/resources/views/web/promotion/_shop_products.blade.php b/resources/views/web/promotion/_shop_products.blade.php index ec6483c..3f42c63 100644 --- a/resources/views/web/promotion/_shop_products.blade.php +++ b/resources/views/web/promotion/_shop_products.blade.php @@ -5,7 +5,7 @@
    diff --git a/resources/views/web/promotion/_shop_products_inner.blade.php b/resources/views/web/promotion/_shop_products_inner.blade.php index 768d0fb..0b768f5 100644 --- a/resources/views/web/promotion/_shop_products_inner.blade.php +++ b/resources/views/web/promotion/_shop_products_inner.blade.php @@ -2,7 +2,7 @@
    @foreach ($shop_products as $product) - @php($cartItem = Yard::instance('shopping')->getCartItemByProduct($product->id, false, false)) + @php($cartItem = Yard::instance('shopping')->getCartItemByProduct($product->id, false, true)) @php($qty = isset($cartItem->qty) ? "x".$cartItem->qty : 0) @php($rowId = isset($cartItem->rowId) ? $cartItem->rowId : '') @@ -34,7 +34,7 @@
    diff --git a/resources/views/web/promotion/index.blade.php b/resources/views/web/promotion/index.blade.php index c81c9be..74deb2c 100755 --- a/resources/views/web/promotion/index.blade.php +++ b/resources/views/web/promotion/index.blade.php @@ -16,7 +16,7 @@
    @endif - {!! Form::open(['url' => route('web_promotion_store', $promotion_user->id), 'class' => 'form-horizontal form-prevent-multiple-submits', 'id' => 'user-promotion-form-validations']) !!} + {!! Form::open(['url' => route('web_promotion_store', $promotion_user->id), 'class' => 'form-horizontal form-prevent-multiple-submits', 'id' => 'shop-form-validations']) !!}
    @include('web.promotion._intro') @@ -29,24 +29,29 @@ @include('web.promotion._shipping') @include('web.promotion._fairplay') -
    + +
    @include('web.promotion._promotion_cart')
    +
    + @include('web.components._margin_cart') +
    +
    @if(Yard::instance('shopping')->isQuickShipping()) - @include('web.promotion._invoice_details_quick') + @include('web.components._invoice_details_quick') @else - @include('web.promotion._invoice_details') + @include('web.components._invoice_details') @endif
    -
    - @include('web.promotion._checkout') +
    + @include('web.components._checkout')
    @@ -57,11 +62,11 @@ @endsection @section('scripts') - + @endsection diff --git a/resources/views/web/promotion/outofstock.blade.php b/resources/views/web/promotion/outofstock.blade.php index aa21d55..b6c0f25 100644 --- a/resources/views/web/promotion/outofstock.blade.php +++ b/resources/views/web/promotion/outofstock.blade.php @@ -43,7 +43,6 @@ form.submit(); }, errorPlacement: function errorPlacement(error, element) { - console.log(error); var placement = $(element).data('error'); if (placement) { $(placement).append(error.addClass('invalid-feedback d-block')); diff --git a/resources/views/web/promotion/thanksorder.blade.php b/resources/views/web/promotion/thanksorder.blade.php index 54971ea..b49750b 100644 --- a/resources/views/web/promotion/thanksorder.blade.php +++ b/resources/views/web/promotion/thanksorder.blade.php @@ -15,7 +15,7 @@
    @endif - {!! Form::open(['url' => route('web_promotion_store', $promotion_user->id), 'class' => 'form-horizontal form-prevent-multiple-submits', 'id' => 'user-promotion-form-validations']) !!} + {!! Form::open(['url' => route('web_promotion_store', $promotion_user->id), 'class' => 'form-horizontal form-prevent-multiple-submits', 'id' => 'shop-form-validations']) !!}
    diff --git a/resources/views/web/promotion/thanksreminder.blade.php b/resources/views/web/promotion/thanksreminder.blade.php index c5520cd..101f41e 100644 --- a/resources/views/web/promotion/thanksreminder.blade.php +++ b/resources/views/web/promotion/thanksreminder.blade.php @@ -16,7 +16,7 @@
    @endif - {!! Form::open(['url' => route('web_promotion_store', $promotion_user->id), 'class' => 'form-horizontal form-prevent-multiple-submits', 'id' => 'user-promotion-form-validations']) !!} + {!! Form::open(['url' => route('web_promotion_store', $promotion_user->id), 'class' => 'form-horizontal form-prevent-multiple-submits', 'id' => 'shop-form-validations']) !!}
    diff --git a/resources/views/web/shop/_checkout.blade.php b/resources/views/web/shop/_checkout.blade.php new file mode 100644 index 0000000..e11ce5d --- /dev/null +++ b/resources/views/web/shop/_checkout.blade.php @@ -0,0 +1,167 @@ +@if (isset($shopping_mode) && $shopping_mode === 'test') + #### TEST MODE #### TEST MODE #### +@endif +
    + @if(Yard::instance('shopping')->isWithPayments()) +

    Zahlungsart auswählen

    +
    +
    + + + @if (true || \App\Models\PaymentMethod::isShowPaymentMethod('PP', $user_payment_methods, 0)) + + + + + + @endif + {{-- + @if (true || \App\Models\PaymentMethod::isShowPaymentMethod('SB', $user_payment_methods, 0)) + + + + + @endif + @if (true || \App\Models\PaymentMethod::isShowPaymentMethod('CC', $user_payment_methods, 0)) + + + + + @endif + --}} + @if (true || \App\Models\PaymentMethod::isShowPaymentMethod('VOR', $user_payment_methods, 0)) + + + + + @endif + +
    + + + PayPal +
    + + + Sofort +
    + + + Mastercard + Visa +
    + + + Vorkasse +
    +
    + @endif +

    Warenkorb

    +
    +
    + {{ Yard::instance('shopping')->total() }} € + Zwischensumme: +
    +
    +
    + {{ Yard::instance('shopping')->shipping() }} € + Versandkosten: +
    +
    + {{ Yard::instance('shopping')->getShippingCountryName() }} + Lieferland: +
    +
    +
    + {{ Yard::instance('shopping')->subtotalWithShipping() }} € + Summe ohne MwSt: +
    +
    + {{ Yard::instance('shopping')->taxWithShipping() }} € + zzgl. {{-- Yard::getTaxRate() --}} MwSt: +
    +
    +
    + {{ Yard::instance('shopping')->totalWithShipping() }} € + Gesamtsumme: +
    +
    +
    + +
    + +
    + {!! Form::hidden("action", "submit-shop-order") !!} + +
    + @if(Yard::instance('shopping')->isWithPayments()) +

    Sind alle Deine Angaben vollständig ausgefüllt, + klicke auf "Jetzt kaufen" und Du wirst zu unserer Zahlung/Zahlungsabieter weitergeleitet, + die Verbindungen sind SSL verschlüsselt.

    + @else +

    Sind alle Deine Angaben vollständig ausgefüllt, + klicke auf "Jetzt kaufen" und die Bestellung wird abgeschlossen, + die Verbindungen sind SSL verschlüsselt.

    + @endif +
    + +
    diff --git a/resources/views/web/shop/_intro.blade.php b/resources/views/web/shop/_intro.blade.php new file mode 100644 index 0000000..613b8a3 --- /dev/null +++ b/resources/views/web/shop/_intro.blade.php @@ -0,0 +1,26 @@ + + +
    +
    + @if($user_shop->user->hasProfileImage()) + + @endif +
    +

    {{ __('shop.headline') }}

    +

    + {{ __('shop.description') }} +
    + {!! nl2br($user_shop->name) !!}

    +
    + +
    +
    +

    {!! nl2br($user_shop->about_you) !!}

    +
    +
    +
    +
    diff --git a/resources/views/web/shop/_invoice_details.blade.php b/resources/views/web/shop/_invoice_details.blade.php new file mode 100644 index 0000000..256eef0 --- /dev/null +++ b/resources/views/web/shop/_invoice_details.blade.php @@ -0,0 +1,334 @@ +

    Rechnungsdetails

    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + + +
    + @if ($errors->has('billing_salutation')) + + @endif +
    +
    +
    +
    + + {!! Form::text('billing_firstname', '', ['class' => 'form-control ' . ($errors->has('billing_firstname') ? 'error' : ''), 'id' => 'billing_firstname', 'required' => true]) !!} + @if ($errors->has('billing_firstname')) + + @endif +
    +
    +
    +
    + + {!! Form::text('billing_lastname', '', ['class' => 'form-control ' . ($errors->has('billing_lastname') ? 'error' : ''), 'id' => 'billing_lastname', 'required' => true]) !!} + @if ($errors->has('billing_lastname')) + + @endif +
    +
    +
    +
    + + {!! Form::text('billing_company', '', ['class' => 'form-control', 'id' => 'billing_company']) !!} +
    +
    +
    +
    + + +
    +
    +
    +
    + + {!! Form::text('billing_address', '', ['class' => 'form-control ' . ($errors->has('billing_address') ? 'error' : ''), 'id' => 'billing_address', 'required' => true]) !!} + @if ($errors->has('billing_address')) + + @endif +
    +
    +
    +
    + {!! Form::text('billing_address_2', '', ['placeholder' => 'Zusätzliche Angaben / Hinweise (optional)', 'class' => 'form-control ' . ($errors->has('billing_address_2') ? 'error' : ''), 'id' => 'billing_address_2']) !!} + @if ($errors->has('billing_address_2')) + + @endif +
    +
    +
    +
    + + {!! Form::text('billing_zipcode', '', ['class' => 'form-control ' . ($errors->has('billing_zipcode') ? 'error' : ''), 'id' => 'billing_zipcode', 'required' => true]) !!} + @if ($errors->has('billing_zipcode')) + + @endif +
    +
    +
    +
    + + {!! Form::text('billing_city', '', ['class' => 'form-control ' . ($errors->has('billing_city') ? 'error' : ''), 'id' => 'billing_city', 'required' => true]) !!} + @if ($errors->has('billing_city')) + + @endif +
    +
    +
    +
    + + {!! Form::email('billing_email', '', ['class' => 'form-control ' . ($errors->has('billing_email') ? 'error' : ''), 'id' => 'billing_email', 'required' => true]) !!} + @if ($errors->has('billing_email')) + + @endif +
    +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    +

    Lieferadresse

    +
    +
    +
    + + +
    + @if ($errors->has('shipping_salutation')) + + @endif +
    +
    +
    +
    + + {!! Form::text('shipping_firstname', '', ['class' => 'form-control ' . ($errors->has('shipping_firstname') ? 'error' : ''), 'id' => 'shipping_firstname', 'required' => true]) !!} + @if ($errors->has('shipping_firstname')) + + @endif +
    +
    +
    +
    + + {!! Form::text('shipping_lastname', '', ['class' => 'form-control ' . ($errors->has('shipping_lastname') ? 'error' : ''), 'id' => 'shipping_lastname', 'required' => true]) !!} + @if ($errors->has('shipping_lastname')) + + @endif +
    +
    +
    +
    + + {!! Form::text('shipping_company', '', ['class' => 'form-control', 'id' => 'shipping_company']) !!} +
    +
    +
    +
    + + +
    +
    +
    +
    + + {!! Form::text('shipping_address', '', ['class' => 'form-control ' . ($errors->has('shipping_address') ? 'error' : ''), 'id' => 'shipping_address', 'required' => true]) !!} + @if ($errors->has('shipping_address')) + + @endif +
    +
    +
    +
    + {!! Form::text('shipping_address_2', '', ['placeholder' => 'Zusätzliche Angaben / Hinweise (optional)', 'class' => 'form-control ' . ($errors->has('shipping_address_2') ? 'error' : ''), 'id' => 'shipping_address_2']) !!} + @if ($errors->has('shipping_address_2')) + + @endif +
    +
    +
    +
    + + {!! Form::text('shipping_zipcode', '', ['class' => 'form-control ' . ($errors->has('shipping_zipcode') ? 'error' : ''), 'id' => 'shipping_zipcode', 'required' => true]) !!} + @if ($errors->has('shipping_zipcode')) + + @endif +
    +
    +
    +
    + + {!! Form::text('shipping_city', '', ['class' => 'form-control ' . ($errors->has('shipping_city') ? 'error' : ''), 'id' => 'shipping_city', 'required' => true]) !!} + @if ($errors->has('shipping_city')) + + @endif +
    +
    +
    + + \ No newline at end of file diff --git a/resources/views/web/shop/_invoice_details_quick.blade.php b/resources/views/web/shop/_invoice_details_quick.blade.php new file mode 100644 index 0000000..a4ffe88 --- /dev/null +++ b/resources/views/web/shop/_invoice_details_quick.blade.php @@ -0,0 +1,132 @@ +

    Rechnungsdetails

    +
    +
    +
    + + {!! Form::text('billing_firstname', '', ['class' => 'form-control ' . ($errors->has('billing_firstname') ? 'error' : ''), 'id' => 'billing_firstname', 'required' => true]) !!} + @if ($errors->has('billing_firstname')) + + @endif +
    +
    +
    +
    + + {!! Form::text('billing_lastname', '', ['class' => 'form-control ' . ($errors->has('billing_lastname') ? 'error' : ''), 'id' => 'billing_lastname', 'required' => true]) !!} + @if ($errors->has('billing_lastname')) + + @endif +
    +
    +
    +
    + + +
    +
    +
    +
    + + {!! Form::text('billing_address', '', ['class' => 'form-control ' . ($errors->has('billing_address') ? 'error' : ''), 'id' => 'billing_address', 'required' => true]) !!} + @if ($errors->has('billing_address')) + + @endif +
    +
    + +
    +
    + + {!! Form::text('billing_zipcode', '', ['class' => 'form-control ' . ($errors->has('billing_zipcode') ? 'error' : ''), 'id' => 'billing_zipcode', 'required' => true]) !!} + @if ($errors->has('billing_zipcode')) + + @endif +
    +
    +
    +
    + + {!! Form::text('billing_city', '', ['class' => 'form-control ' . ($errors->has('billing_city') ? 'error' : ''), 'id' => 'billing_city', 'required' => true]) !!} + @if ($errors->has('billing_city')) + + @endif +
    +
    +
    +
    + + {!! Form::email('billing_email', '', ['class' => 'form-control ' . ($errors->has('billing_email') ? 'error' : ''), 'id' => 'billing_email', 'required' => true]) !!} + @if ($errors->has('billing_email')) + + @endif +
    +
    + +
    + + + \ No newline at end of file diff --git a/resources/views/web/shop/_margin_cart.blade.php b/resources/views/web/shop/_margin_cart.blade.php new file mode 100644 index 0000000..0737965 --- /dev/null +++ b/resources/views/web/shop/_margin_cart.blade.php @@ -0,0 +1,58 @@ +@if(isset($userMargin)) +
    +
    +

    Provision

    + +
    + + + + + + + @dump($userMargin->yard_margin) + @if($userMargin->yard_margin && $userMargin->yard_margin->isMargin()) + @foreach($userMargin->yard_margin->items as $item) + + + + + @endforeach + @endif + @if($userMargin->yard_commission && $userMargin->yard_commission->isCommission()) + + + + + @endif + + + + + + @if($userMargin->yard_margin && $userMargin->yard_margin->net_partner_commission > 0) + + + + + @endif +
    Summe netto: + {{ Yard::instance('shopping')->subtotal(null, null, null, false) }} €* +
    Staffelrabatt +
    ab {{ $item->getFormatted('price_from') }} / {{ $item->getFormatted('trading_margin') }}% :
    + - {{ $item->getFormatted('value_margin') }} €* +
    Einzelrabatt: + - {{ $userMargin->yard_commission->getFormatted('single_value_commission') }} €* +
    Summe (Netto): + {{ Yard::instance('shopping')->subtotal() }} €* +
    Provision Vertriebspartern: + {{ $userMargin->yard_margin->getFormatted('net_partner_commission') }} €* +
    + +
    +
    +
    + +
    + @endif + diff --git a/resources/views/web/shop/_shipping.blade.php b/resources/views/web/shop/_shipping.blade.php new file mode 100644 index 0000000..4a83272 --- /dev/null +++ b/resources/views/web/shop/_shipping.blade.php @@ -0,0 +1,39 @@ +
    +
    +
    +

    Wähle Deine Versandart

    +
    + @php($shipping_option = Yard::instance('shopping')->getShippingOption()) + @if($user_shop->pick_up) + + @endif + +
    +
    +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/resources/views/web/shop/_shop_cart.blade.php b/resources/views/web/shop/_shop_cart.blade.php new file mode 100644 index 0000000..59de219 --- /dev/null +++ b/resources/views/web/shop/_shop_cart.blade.php @@ -0,0 +1,107 @@ +
    +
    +

    Warenkorb

    +
    +
    +
    +
    +
     
    +
    +
    +
    +
    + Artikel +
    +
    + Einzelpreis +
    +
    + Anzahl/Preis +
    +
    +
    +
    +
    + @foreach(Yard::instance('shopping')->getContentByOrder() as $row) + @php($product = \App\Models\Product::find($row->id)) +
    +
    + @if($row->options->has('image')) + + @else + + @endif +
    +
    +
    +
    +
    +
    {{ $row->name }} +
    +
    +
    Inhalt: {{ $product->contents }}
    +
    Art.-Nr.: {{ $product->number }}
    +
    +
    +
    + @if(!$row->options->free_product_id) + Artikel entfernen + @else + gratis + @endif +
    +
    +
    +
    + {{ Yard::instance('shopping')->rowPrice($row, 2) }} €*
    +
    +
    + @if(!$row->options->free_product_id) +
    + +
    +
    +
    {{ Yard::instance('shopping')->rowSubtotal($row, 2) }} €*
    +
    + @else +
    +
    1 / 0,00 €*
    +
    + @endif +
    +
    +
    +
    +
    +
    + @endforeach +
    +
    +
    +
    + +

    + Du hast {{ Yard::instance('shopping')->count() }} Artikel in Deinem Warenkorb +

    + + +

    + + {{ __('shop.incl_VAT_plus_shipping') }} + +

    + +
    +
    +
    \ No newline at end of file diff --git a/resources/views/web/shop/_shop_products.blade.php b/resources/views/web/shop/_shop_products.blade.php new file mode 100644 index 0000000..4e6bf53 --- /dev/null +++ b/resources/views/web/shop/_shop_products.blade.php @@ -0,0 +1,20 @@ +
    + +

    Naturkosmetik Onlineshop

    + +
    +
    + +
    +
    +
    + @include('web.shop._shop_products_inner') +
    + +
    + {{ __('shop.incl_VAT_plus_shipping') }} +
    +
    +
    \ No newline at end of file diff --git a/resources/views/web/shop/_shop_products_inner.blade.php b/resources/views/web/shop/_shop_products_inner.blade.php new file mode 100644 index 0000000..4a7212b --- /dev/null +++ b/resources/views/web/shop/_shop_products_inner.blade.php @@ -0,0 +1,73 @@ + + +
    + + @foreach ($shop_products as $product) + @php($cartItem = Yard::instance('shopping')->getCartItemByProduct($product->id, false, true)) + @php($qtyStr = isset($cartItem->qty) ? "x".$cartItem->qty : 0) + @php($qty = isset($cartItem->qty) ? $cartItem->qty : 0) + @php($rowId = isset($cartItem->rowId) ? $cartItem->rowId : '') + +
    +
    + @if ($product->images) + @if ($image = $product->images->first()) + + + @else + + @endif + @endif + +
    +
    + +
    + +  {{ $qtyStr }} + +
    + + +
    +
    +

    + {{ $product->name }} +

    +
    + {{ $product->getShortCopy(true, 110) }} +
    + +
    + {{ $product->getFormattedPrice() }} €* +
    @if($product->unit) {{ $product->getBasePriceFormattedFull() }} € @else   @endif + +
    +
    +
    + @endforeach +
    + + \ No newline at end of file diff --git a/resources/views/web/shop/index.blade.php b/resources/views/web/shop/index.blade.php new file mode 100644 index 0000000..6a18ed2 --- /dev/null +++ b/resources/views/web/shop/index.blade.php @@ -0,0 +1,82 @@ +@extends('web.layouts.layout') + +@section('content') + + @if ($errors->any()) +
    +
    +
    +
      + @foreach ($errors->all() as $error) +
    • {{ $error }}
    • + @endforeach +
    +
    +
    +
    + @endif + + {!! Form::open(['url' => route('web_shop_store', $user_shop->id), 'class' => 'form-horizontal form-prevent-multiple-submits', 'id' => 'shop-form-validations']) !!} + +
    + @include('web.shop._intro') + +
    + + @include('web.shop._shop_products') + + {{-- @include('web.shop._shipping') --}} + +
    + @include('web.shop._shop_cart') +
    + +
    + @include('web.components._margin_cart') +
    + + +
    +
    +
    +
    + @if(Yard::instance('shopping')->isQuickShipping()) + @include('web.components._invoice_details_quick') + @else + @include('web.components._invoice_details') + @endif +
    +
    +
    +
    + @include('web.components._checkout') +
    +
    +
    +
    +
    +
    +
    +
    +
    + {{-- @if($user_shop->pick_up) --}} +

    Kontaktadresse Deines Beraters

    + {!! nl2br($user_shop->user_address) !!} + {{-- @endif --}} + +
    +
    +
    +
    + {!! Form::close() !!} + + +@endsection + +@section('scripts') + +@endsection diff --git a/resources/views/web/shop/show_product.blade.php b/resources/views/web/shop/show_product.blade.php new file mode 100644 index 0000000..7c1bf47 --- /dev/null +++ b/resources/views/web/shop/show_product.blade.php @@ -0,0 +1,126 @@ + \ No newline at end of file diff --git a/resources/views/web/shop/thanksorder.blade.php b/resources/views/web/shop/thanksorder.blade.php new file mode 100644 index 0000000..c945059 --- /dev/null +++ b/resources/views/web/shop/thanksorder.blade.php @@ -0,0 +1,94 @@ +@extends('web.layouts.layout') + +@section('content') + + @if ($errors->any()) +
    +
    +
    +
      + @foreach ($errors->all() as $error) +
    • {{ $error }}
    • + @endforeach +
    +
    +
    +
    + @endif + {!! Form::open(['url' => route('web_shop_store', $user_shop->id), 'class' => 'form-horizontal form-prevent-multiple-submits', 'id' => 'shop-form-validationss']) !!} +
    +
    +
    +
    + @if($user_shop->user->hasProfileImage()) + + @endif +
    +

    Super, geschafft!

    +

    + Ich danke Dir, dass Du unseren Service nutzt, um die Produkte von GRÜNE SEELE zu testen. Deine Produkte werden in Kürze versendet, eine Bestellbestätigungsmail ist bereits zu Dir unterwegs. +

    +

    Deine Bestellnummer ist: {{ $order_reference }}

    +
    + @if($pay_trans && $pay_trans->shopping_payment) + @if($pay_trans->shopping_payment->clearingtype === "vor") +

    Bezahlung per Vorkasse:

    +

    Bitte überweise {{ number_format(($pay_trans->shopping_payment->amount/100), 2, ",", ".") }} EUR auf die folgende Kontoverbindung, um den Kauf abzuschließen. +
    + {{__('email.checkout_mail_bank_holder')}} {!! \App\Models\Setting::getContentBySlug('prepayment-account-owner') !!}
    + {{__('email.checkout_mail_bank_iban')}} {!! \App\Models\Setting::getContentBySlug('prepayment-iban') !!}
    + {{__('email.checkout_mail_bank_bic')}} {!! \App\Models\Setting::getContentBySlug('prepayment-bic') !!}
    + {{__('email.checkout_mail_bank_name')}} {!! \App\Models\Setting::getContentBySlug('prepayment-bank') !!}
    + Gesamtbetrag: {{ number_format( ($pay_trans->shopping_payment->amount/100), 2, ",", ".") }} EUR
    + Verwendungszweck: {{ $pay_trans->transmitted_data['reference'] }} +

    +
    + @endif + @if($pay_trans->shopping_payment->clearingtype === "cc") +

    Bezahlung per Kreditkarte:

    +

    Deine Zahlung wurde genehmigt, eine Bestätigung der Zahlung wird automatisch erstellt.

    +
    + @endif + @if($pay_trans->shopping_payment->clearingtype === "elv") +

    Bezahlung per SEPA:

    +

    Deine Zahlung wird bearbeitet, eine Bestätigung zur Zahlungsabwicklung wird automatisch erstellt.

    +
    + @endif + @if($pay_trans->shopping_payment->clearingtype === "fnc") +

    Bezahlung per Rechnung:

    +

    Deine Bestellung wird bearbeitet, eine Bestätigung zur Bestellungsabwicklung wird automatisch erstellt.

    + @endif + @if(isset($pay_trans->shopping_payment->shopping_order->shipping_option)) + @if($pay_trans->shopping_payment->shopping_order->shipping_option === 'dhl_shipping') +

    Versand mit DHL (1-3 Werktage).

    + @endif + @if($pay_trans->shopping_payment->shopping_order->shipping_option === 'pick_up') +

    Ich hole die Ware bei {{ $user_shop->user->getFullName() }} persönlich ab.

    +

    Kontakt & Abholadresse

    +

    {!! nl2br($user_shop->user_address) !!}

    + @endif +
    + @endif + @endif +

    Dann freuen wir uns auf ein Feedback von Dir und wünschen Dir bis dahin alles Gute!

    Liebe Grüße
    {{ $user_shop->user->getFullName() }}
    Vertriebspartner:in der GRÜNE SEELE Naturkosmetik

    +
    +
    +
    +
    +
    +
    + + + + +
    +
    + {!! Form::close() !!} + +@endsection diff --git a/resources/views/web/shop/thanksreminder.blade.php b/resources/views/web/shop/thanksreminder.blade.php new file mode 100644 index 0000000..5c79732 --- /dev/null +++ b/resources/views/web/shop/thanksreminder.blade.php @@ -0,0 +1,51 @@ +@extends('web.layouts.layout') + +@section('content') + + @if ($errors->any()) +
    +
    +
    +
      + @foreach ($errors->all() as $error) +
    • {{ $error }}
    • + @endforeach +
    +
    +
    +
    + @endif + + {!! Form::open(['url' => route('web_shop_store', $user_shop->id), 'class' => 'form-horizontal form-prevent-multiple-submits', 'id' => 'shop-form-validations']) !!} + +
    +
    +
    +
    + @if($user_shop->user->hasProfileImage()) + + @endif +
    +

    Super, geschafft!

    +

    + Ich danke Dir, dass Du unseren Service nutzt, wir werden Dich infomieren wenn der Shop wieder zur Verfügung steht. +

    +

    Dann freuen wir uns auf ein Feedback von Dir und wünschen Dir bis dahin alles Gute!

    Liebe Grüße
    {{ $user_shop->user->getFullName() }}
    Vertriebspartner:in der GRÜNE SEELE Naturkosmetik

    +
    +
    +
    +
    +
    +
    + @include('web.promotion._show_around') +
    +
    + {!! Form::close() !!} + + + + +@endsection diff --git a/routes/web.php b/routes/web.php index 969db44..fd462eb 100644 --- a/routes/web.php +++ b/routes/web.php @@ -15,12 +15,11 @@ use Illuminate\Support\Facades\Route; Route::get('/product/image/{slug}', function($slug = null) { if($image = \App\Models\ProductImage::where('slug', $slug)->first()){ - $path = storage_path('app/public').'/images/product'.'/'.$image->product_id.'/'.$image->filename; + $path = storage_path('app/public').$image->getImagePath(); if (file_exists($path)) { return Response::file($path); } } - })->name('product_image'); @@ -63,8 +62,15 @@ Route::domain(config('app.domain'))->group(function () { Route::post('/user_register', 'Web\RegisterController@register')->name('user_register'); + Route::post('/user_register_again', 'Web\RegisterController@registerAgain')->name('user_register_again'); + + Route::get('/register/consent', [\App\Http\Controllers\Web\RegisterController::class, 'showConsentPage'])->name('register.consent'); + Route::post('/register/consent', [\App\Http\Controllers\Web\RegisterController::class, 'acceptConsent'])->name('register.consent.accept'); + Route::get('/register', [\App\Http\Controllers\Web\RegisterController::class, 'showRegistrationForm'])->name('register.form'); + + Route::get('/user_register/finish', 'Web\RegisterController@finish')->name('user_register_finish'); - Route::get('/register/verify/{confirmationCode}', 'HomeController@verify')->name('register_verify'); + Route::get('/register/verify/{confirmationCode}', 'Web\RegisterController@verify')->name('register_verify'); Route::get('/reg/{member_id?}', 'Web\RegisterController@member')->name('register_user_member'); Route::get('/status/register', 'HomeController@statusRegister')->name('status_register'); @@ -144,10 +150,10 @@ Route::domain(config('app.domain'))->group(function () { Route::post('/user/data/free/form', 'UserDataController@userDataFreeForm')->name('user_data_free_form'); - //user shop Sales - Route::get('/user/sales/orders', 'User\SalesController@orders')->name('user_sales_orders'); - Route::get('/user/sales/order/detail/{id}', 'User\SalesController@orderDetail')->name('user_sales_order_detail'); - Route::get('/user/sales/orders/datatable', 'User\SalesController@ordersDatatable')->name('user_sales_orders_datatable'); + //user Sales + Route::get('/user/sales', 'User\SalesController@orders')->name('user_sales'); + Route::get('/user/sales/detail/{id}', 'User\SalesController@orderDetail')->name('user_sales_detail'); + Route::get('/user/sales/datatable', 'User\SalesController@ordersDatatable')->name('user_sales_datatable'); //user team Route::get('/user/team/members', 'User\TeamController@members')->name('user_team_members'); @@ -161,10 +167,10 @@ Route::domain(config('app.domain'))->group(function () { Route::get('/user/customer/datatable', 'User\CustomerController@getCustomers')->name('user_customer_datatable'); //user order & do order - Route::get('/user/orders', 'User\OrderController@index')->name('user_orders'); - Route::get('/user/orders/datatable', 'User\OrderController@ordersDatatable')->name('user_orders_datatable'); + Route::get('/user/myorders', 'User\MyOrderController@index')->name('user_myorders'); + Route::get('/user/myorder/datatable', 'User\MyOrderController@datatable')->name('user_myorder_datatable'); + Route::get('/user/myorder/detail/{id}', 'User\MyOrderController@detail')->name('user_myorder_detail'); - Route::get('/user/order/detail/{id}', 'User\OrderController@detail')->name('user_order_detail'); Route::get('/user/order/my/delivery/{for}/{id?}', 'User\OrderController@delivery')->name('user_order_my_delivery'); Route::post('/user/order/my/delivery/{for}/{id?}', 'User\OrderController@delivery')->name('user_order_my_delivery'); @@ -180,6 +186,20 @@ Route::domain(config('app.domain'))->group(function () { Route::post('/user/membership/store/{action}', 'MembershipController@storePayment')->name('user_membership_store'); + //user shop + Route::get('/user/shop', 'User\ShopController@index')->name('user_shop'); + Route::post('/user/shop/store', 'User\ShopController@store')->name('user_shop_store'); + Route::post('/user/shop/load', 'User\ShopController@load')->name('user_shop_load'); + + Route::get('/user/shop/translate', 'User\ShopController@translate')->name('user_shop_translate'); + Route::post('/user/shop/translate/store', 'User\ShopController@translateStore')->name('user_shop_tanslate_store'); + + //user shop Sales + Route::get('/user/sales/', 'User\SalesController@index')->name('user_sales'); + Route::get('/user/sales/detail/{id}', 'User\SalesController@detail')->name('user_sales_detail'); + Route::get('/user/sales/datatable', 'User\SalesController@datatable')->name('user_sales_datatable'); + + Route::get('/user/payment/paycredit', 'User\PaymentController@paycredit')->name('user_payment_paycredit'); Route::get('/user/payment/paycredit/datatable', 'User\PaymentController@paycredit_datatable')->name('user_payment_paycredit_datatable'); @@ -195,7 +215,7 @@ Route::domain(config('app.domain'))->group(function () { Route::post('/user/checkout_store/{identifier?}', 'User\CheckoutController@store')->name('user_checkout_store'); Route::get('/user/checkout_final/{payid}/{reference}/{identifier?}', 'User\CheckoutController@final')->name('user_checkout_final'); - Route::get('/user/promotions', 'User\PromotionController@index')->name('user_promotions'); + Route::get('/user/promotion', 'User\PromotionController@index')->name('user_promotion'); Route::get('/user/promotion/detail/{id}', 'User\PromotionController@detail')->name('user_promotion_detail'); Route::post('/user/promotion/detail/{id}', 'User\PromotionController@store')->name('user_promotion_detail'); Route::post('/user/promotion/load', 'User\PromotionController@load')->name('user_promotion_load'); @@ -215,6 +235,9 @@ Route::domain(config('app.domain'))->group(function () { Route::get('/admin/product/image/delete/{image_id}/{product_id}', 'ProductController@imageDelete')->name('admin_product_image_delete'); Route::get('/admin/product/image/attribute/{image_id}/{attr}/{val}', 'ProductController@imageAttribute')->name('admin_product_image_attribute'); + // Route::post('/admin/product/image/image/{id}', [App\Http\Controllers\CMS\DownloadController::class, 'image'])->name('admin_cms_download_image'); + // Route::get('/admin/product/image/image/delete/{id}/', [App\Http\Controllers\CMS\DownloadController::class, 'deleteImage'])->name('admin_cms_download_image_delete'); + //products categories Route::get('/admin/product/categories', 'CategoryController@index')->name('admin_product_categories'); Route::get('/admin/product/category/edit/{id}', 'CategoryController@edit')->name('admin_product_category_edit'); @@ -233,10 +256,12 @@ Route::domain(config('app.domain'))->group(function () { Route::get('/admin/product/category/image/attribute/{image_id}/{attr}/{val}', 'CategoryController@imageAttribute')->name('admin_product_category_image_attribute'); + + //products attributes Route::get('/admin/product/attributes', 'AttributeController@index')->name('admin_product_attributes'); Route::post('/admin/product/attribute/store', 'AttributeController@store')->name('admin_product_attribute_store'); - Route::get('/admin/product/attribute/delete/{id}', 'AttributeController@delete')->name('admin_product_attribute_delete'); + Route::get('/admin/product/attribute/delete/{attr}/{id}', 'AttributeController@delete')->name('admin_product_attribute_delete'); }); Route::group(['middleware' => ['admin']], function() { @@ -257,7 +282,12 @@ Route::domain(config('app.domain'))->group(function () { Route::get('/admin/sites/image/attribute/{site}/{image_id}/{attr}/{val}', 'SitesController@imageAttribute')->name('admin_sites_image_attribute'); - + //Auswertungen products sales volume + Route::get('/admin/stats/sales/volumes', 'Stats\SalesController@index')->name('admin_stats_sales_volumes'); + Route::post('/admin/stats/sales/volumes/download', 'Stats\SalesController@download')->name('admin_stats_sales_volumes_download'); + Route::get('/admin/stats/sales/volumes/datatable', 'Stats\SalesController@datatable')->name('admin_stats_sales_volumes_datatable'); + + //Route::get('/admin/products/import', 'ImportProductController@import')->name('admin_product_import'); //leads @@ -282,6 +312,10 @@ Route::domain(config('app.domain'))->group(function () { Route::post('/admin/lead/store', 'LeadController@store')->name('admin_lead_store'); Route::get('/admin/leads/datatable', 'LeadController@getLeads')->name('admin_leads_datatable'); + Route::post('/admin/lead/download', 'LeadController@download')->name('admin_lead_download'); + Route::post('/admin/lead/update', 'LeadController@update')->name('admin_lead_update'); + Route::get('/admin/lead/remove/{action}/{user_id}/{id}/{mid?}', 'LeadController@remove')->name('admin_lead_remove'); + //sales Route::get('/admin/sales/users', 'SalesController@users')->name('admin_sales_users'); @@ -347,6 +381,10 @@ Route::domain(config('app.domain'))->group(function () { Route::get('/admin/payment_methods', 'PaymentMethodController@index')->name('admin_payment_methods'); Route::post('/admin/payment_method/store', 'PaymentMethodController@store')->name('admin_payment_method_store'); + Route::get('/admin/lead_types', 'LeadTypeController@index')->name('admin_lead_types'); + Route::post('/admin/lead_types/store', 'LeadTypeController@store')->name('admin_lead_types_store'); + + Route::get('/admin/countries', 'CountryController@index')->name('admin_countries'); Route::get('/admin/country/edit/{id}', 'CountryController@edit')->name('admin_country_edit'); Route::post('/admin/country/store', 'CountryController@store')->name('admin_country_store'); @@ -377,9 +415,23 @@ Route::domain(config('app.promo_domain'))->group(function () { Route::post('/web/promotion/store/{id}', 'Web\PromotionController@store')->name('web_promotion_store'); Route::get("/web/promotion/goto/{load}/{id}/{payid?}/{reference?}/{identifier?}", "Web\PromotionController@goto")->name('web_promotion_goto'); - Route::get('/web/paypal_payment/success/{id}/{payid?}/{reference?}/{identifier?}', 'Pay\PayPalController@paymentSuccess')->name('success.paypal_payment'); - Route::get('/web/paypal_payment/cancel/{id}/{payid?}/{reference?}/{identifier?}', 'Pay\PayPalController@paymentCancel')->name('cancel.paypal_payment'); + Route::get('/web/paypal_payment/success/{for}/{id}/{payid?}/{reference?}/{identifier?}', 'Pay\PayPalController@paymentSuccess')->name('success.paypal_payment'); + Route::get('/web/paypal_payment/cancel/{for}/{id}/{payid?}/{reference?}/{identifier?}', 'Pay\PayPalController@paymentCancel')->name('cancel.paypal_payment'); Route::get("/{path?}", "Web\PromotionController@serve")->where('path', '.+'); +}); + + +Route::domain(config('app.shop_domain'))->group(function () { + Route::get("/", "Web\ShopController@serve")->where('path', '.+'); + Route::post('/web/shop/modal/load', 'Web\ShopController@load')->name('web_shop_modal_load'); + Route::post('/web/shop/store/{id}', 'Web\ShopController@store')->name('web_shop_store'); + Route::get("/web/shop/goto/{load}/{id}/{payid?}/{reference?}/{identifier?}", "Web\ShopController@goto")->name('web_shop_goto'); + + Route::get('/web/paypal_payment/success/{for}/{id}/{payid?}/{reference?}/{identifier?}', 'Pay\PayPalController@paymentSuccess')->name('success.paypal_payment'); + Route::get('/web/paypal_payment/cancel/{for}/{id}/{payid?}/{reference?}/{identifier?}', 'Pay\PayPalController@paymentCancel')->name('cancel.paypal_payment'); + + Route::get("/{path?}", "Web\ShopController@serve")->where('path', '.+'); + }); \ No newline at end of file diff --git a/ssh-cron-info.readme b/ssh-cron-info.readme new file mode 100644 index 0000000..ab96cc8 --- /dev/null +++ b/ssh-cron-info.readme @@ -0,0 +1,14 @@ +Server Root +/var/customers/webs/Krummel/htdocs/partner.gruene-seele.bio/ + +Verbindung mit SSH +crontab -e +//hier ist der Cron eingetragen +0 * * * * /usr/bin/php8.1 /var/customers/webs/Krummel/htdocs/partner.gruene-seele.bio/artisan schedule:run > /dev/null 2>&1 + +crontab -l + +/usr/bin/php8.1 artisan schedule:run + +//lokales testen +php artisan schedule:run \ No newline at end of file diff --git a/ssh-info.readme b/ssh-info.readme new file mode 100644 index 0000000..cde9f84 --- /dev/null +++ b/ssh-info.readme @@ -0,0 +1,3 @@ +Root + +/var/customers/webs/Krummel/htdocs/partner.gruene-seele.bio \ No newline at end of file diff --git a/storage/fonts/Helvetica-Oblique.afm.json b/storage/fonts/Helvetica-Oblique.afm.json new file mode 100644 index 0000000..4783828 --- /dev/null +++ b/storage/fonts/Helvetica-Oblique.afm.json @@ -0,0 +1,569 @@ +{ + "codeToName": { + "32": "space", + "160": "space", + "33": "exclam", + "34": "quotedbl", + "35": "numbersign", + "36": "dollar", + "37": "percent", + "38": "ampersand", + "146": "quoteright", + "40": "parenleft", + "41": "parenright", + "42": "asterisk", + "43": "plus", + "44": "comma", + "45": "hyphen", + "173": "hyphen", + "46": "period", + "47": "slash", + "48": "zero", + "49": "one", + "50": "two", + "51": "three", + "52": "four", + "53": "five", + "54": "six", + "55": "seven", + "56": "eight", + "57": "nine", + "58": "colon", + "59": "semicolon", + "60": "less", + "61": "equal", + "62": "greater", + "63": "question", + "64": "at", + "65": "A", + "66": "B", + "67": "C", + "68": "D", + "69": "E", + "70": "F", + "71": "G", + "72": "H", + "73": "I", + "74": "J", + "75": "K", + "76": "L", + "77": "M", + "78": "N", + "79": "O", + "80": "P", + "81": "Q", + "82": "R", + "83": "S", + "84": "T", + "85": "U", + "86": "V", + "87": "W", + "88": "X", + "89": "Y", + "90": "Z", + "91": "bracketleft", + "92": "backslash", + "93": "bracketright", + "94": "asciicircum", + "95": "underscore", + "145": "quoteleft", + "97": "a", + "98": "b", + "99": "c", + "100": "d", + "101": "e", + "102": "f", + "103": "g", + "104": "h", + "105": "i", + "106": "j", + "107": "k", + "108": "l", + "109": "m", + "110": "n", + "111": "o", + "112": "p", + "113": "q", + "114": "r", + "115": "s", + "116": "t", + "117": "u", + "118": "v", + "119": "w", + "120": "x", + "121": "y", + "122": "z", + "123": "braceleft", + "124": "bar", + "125": "braceright", + "126": "asciitilde", + "161": "exclamdown", + "162": "cent", + "163": "sterling", + "165": "yen", + "131": "florin", + "167": "section", + "164": "currency", + "39": "quotesingle", + "147": "quotedblleft", + "171": "guillemotleft", + "139": "guilsinglleft", + "155": "guilsinglright", + "150": "endash", + "134": "dagger", + "135": "daggerdbl", + "183": "periodcentered", + "182": "paragraph", + "149": "bullet", + "130": "quotesinglbase", + "132": "quotedblbase", + "148": "quotedblright", + "187": "guillemotright", + "133": "ellipsis", + "137": "perthousand", + "191": "questiondown", + "96": "grave", + "180": "acute", + "136": "circumflex", + "152": "tilde", + "175": "macron", + "168": "dieresis", + "184": "cedilla", + "151": "emdash", + "198": "AE", + "170": "ordfeminine", + "216": "Oslash", + "140": "OE", + "186": "ordmasculine", + "230": "ae", + "248": "oslash", + "156": "oe", + "223": "germandbls", + "207": "Idieresis", + "233": "eacute", + "159": "Ydieresis", + "247": "divide", + "221": "Yacute", + "194": "Acircumflex", + "225": "aacute", + "219": "Ucircumflex", + "253": "yacute", + "234": "ecircumflex", + "220": "Udieresis", + "218": "Uacute", + "203": "Edieresis", + "169": "copyright", + "229": "aring", + "224": "agrave", + "227": "atilde", + "154": "scaron", + "237": "iacute", + "251": "ucircumflex", + "226": "acircumflex", + "231": "ccedilla", + "222": "Thorn", + "179": "threesuperior", + "210": "Ograve", + "192": "Agrave", + "215": "multiply", + "250": "uacute", + "255": "ydieresis", + "238": "icircumflex", + "202": "Ecircumflex", + "228": "adieresis", + "235": "edieresis", + "205": "Iacute", + "177": "plusminus", + "166": "brokenbar", + "174": "registered", + "200": "Egrave", + "142": "Zcaron", + "208": "Eth", + "199": "Ccedilla", + "193": "Aacute", + "196": "Adieresis", + "232": "egrave", + "211": "Oacute", + "243": "oacute", + "239": "idieresis", + "212": "Ocircumflex", + "217": "Ugrave", + "254": "thorn", + "178": "twosuperior", + "214": "Odieresis", + "181": "mu", + "236": "igrave", + "190": "threequarters", + "153": "trademark", + "204": "Igrave", + "189": "onehalf", + "244": "ocircumflex", + "241": "ntilde", + "201": "Eacute", + "188": "onequarter", + "138": "Scaron", + "176": "degree", + "242": "ograve", + "249": "ugrave", + "209": "Ntilde", + "245": "otilde", + "195": "Atilde", + "197": "Aring", + "213": "Otilde", + "206": "Icircumflex", + "172": "logicalnot", + "246": "odieresis", + "252": "udieresis", + "240": "eth", + "158": "zcaron", + "185": "onesuperior", + "128": "Euro" + }, + "isUnicode": false, + "FontName": "Helvetica-Oblique", + "FullName": "Helvetica Oblique", + "FamilyName": "Helvetica", + "Weight": "Medium", + "ItalicAngle": "-12", + "IsFixedPitch": "false", + "CharacterSet": "ExtendedRoman", + "FontBBox": [ + "-170", + "-225", + "1116", + "931" + ], + "UnderlinePosition": "-100", + "UnderlineThickness": "50", + "Version": "002.000", + "EncodingScheme": "WinAnsiEncoding", + "CapHeight": "718", + "XHeight": "523", + "Ascender": "718", + "Descender": "-207", + "StdHW": "76", + "StdVW": "88", + "StartCharMetrics": "317", + "C": { + "32": 278, + "160": 278, + "33": 278, + "34": 355, + "35": 556, + "36": 556, + "37": 889, + "38": 667, + "146": 222, + "40": 333, + "41": 333, + "42": 389, + "43": 584, + "44": 278, + "45": 333, + "173": 333, + "46": 278, + "47": 278, + "48": 556, + "49": 556, + "50": 556, + "51": 556, + "52": 556, + "53": 556, + "54": 556, + "55": 556, + "56": 556, + "57": 556, + "58": 278, + "59": 278, + "60": 584, + "61": 584, + "62": 584, + "63": 556, + "64": 1015, + "65": 667, + "66": 667, + "67": 722, + "68": 722, + "69": 667, + "70": 611, + "71": 778, + "72": 722, + "73": 278, + "74": 500, + "75": 667, + "76": 556, + "77": 833, + "78": 722, + "79": 778, + "80": 667, + "81": 778, + "82": 722, + "83": 667, + "84": 611, + "85": 722, + "86": 667, + "87": 944, + "88": 667, + "89": 667, + "90": 611, + "91": 278, + "92": 278, + "93": 278, + "94": 469, + "95": 556, + "145": 222, + "97": 556, + "98": 556, + "99": 500, + "100": 556, + "101": 556, + "102": 278, + "103": 556, + "104": 556, + "105": 222, + "106": 222, + "107": 500, + "108": 222, + "109": 833, + "110": 556, + "111": 556, + "112": 556, + "113": 556, + "114": 333, + "115": 500, + "116": 278, + "117": 556, + "118": 500, + "119": 722, + "120": 500, + "121": 500, + "122": 500, + "123": 334, + "124": 260, + "125": 334, + "126": 584, + "161": 333, + "162": 556, + "163": 556, + "fraction": 167, + "165": 556, + "131": 556, + "167": 556, + "164": 556, + "39": 191, + "147": 333, + "171": 556, + "139": 333, + "155": 333, + "fi": 500, + "fl": 500, + "150": 556, + "134": 556, + "135": 556, + "183": 278, + "182": 537, + "149": 350, + "130": 222, + "132": 333, + "148": 333, + "187": 556, + "133": 1000, + "137": 1000, + "191": 611, + "96": 333, + "180": 333, + "136": 333, + "152": 333, + "175": 333, + "breve": 333, + "dotaccent": 333, + "168": 333, + "ring": 333, + "184": 333, + "hungarumlaut": 333, + "ogonek": 333, + "caron": 333, + "151": 1000, + "198": 1000, + "170": 370, + "Lslash": 556, + "216": 778, + "140": 1000, + "186": 365, + "230": 889, + "dotlessi": 278, + "lslash": 222, + "248": 611, + "156": 944, + "223": 611, + "207": 278, + "233": 556, + "abreve": 556, + "uhungarumlaut": 556, + "ecaron": 556, + "159": 667, + "247": 584, + "221": 667, + "194": 667, + "225": 556, + "219": 722, + "253": 500, + "scommaaccent": 500, + "234": 556, + "Uring": 722, + "220": 722, + "aogonek": 556, + "218": 722, + "uogonek": 556, + "203": 667, + "Dcroat": 722, + "commaaccent": 250, + "169": 737, + "Emacron": 667, + "ccaron": 500, + "229": 556, + "Ncommaaccent": 722, + "lacute": 222, + "224": 556, + "Tcommaaccent": 611, + "Cacute": 722, + "227": 556, + "Edotaccent": 667, + "154": 500, + "scedilla": 500, + "237": 278, + "lozenge": 471, + "Rcaron": 722, + "Gcommaaccent": 778, + "251": 556, + "226": 556, + "Amacron": 667, + "rcaron": 333, + "231": 500, + "Zdotaccent": 611, + "222": 667, + "Omacron": 778, + "Racute": 722, + "Sacute": 667, + "dcaron": 643, + "Umacron": 722, + "uring": 556, + "179": 333, + "210": 778, + "192": 667, + "Abreve": 667, + "215": 584, + "250": 556, + "Tcaron": 611, + "partialdiff": 476, + "255": 500, + "Nacute": 722, + "238": 278, + "202": 667, + "228": 556, + "235": 556, + "cacute": 500, + "nacute": 556, + "umacron": 556, + "Ncaron": 722, + "205": 278, + "177": 584, + "166": 260, + "174": 737, + "Gbreve": 778, + "Idotaccent": 278, + "summation": 600, + "200": 667, + "racute": 333, + "omacron": 556, + "Zacute": 611, + "142": 611, + "greaterequal": 549, + "208": 722, + "199": 722, + "lcommaaccent": 222, + "tcaron": 317, + "eogonek": 556, + "Uogonek": 722, + "193": 667, + "196": 667, + "232": 556, + "zacute": 500, + "iogonek": 222, + "211": 778, + "243": 556, + "amacron": 556, + "sacute": 500, + "239": 278, + "212": 778, + "217": 722, + "Delta": 612, + "254": 556, + "178": 333, + "214": 778, + "181": 556, + "236": 278, + "ohungarumlaut": 556, + "Eogonek": 667, + "dcroat": 556, + "190": 834, + "Scedilla": 667, + "lcaron": 299, + "Kcommaaccent": 667, + "Lacute": 556, + "153": 1000, + "edotaccent": 556, + "204": 278, + "Imacron": 278, + "Lcaron": 556, + "189": 834, + "lessequal": 549, + "244": 556, + "241": 556, + "Uhungarumlaut": 722, + "201": 667, + "emacron": 556, + "gbreve": 556, + "188": 834, + "138": 667, + "Scommaaccent": 667, + "Ohungarumlaut": 778, + "176": 400, + "242": 556, + "Ccaron": 722, + "249": 556, + "radical": 453, + "Dcaron": 722, + "rcommaaccent": 333, + "209": 722, + "245": 556, + "Rcommaaccent": 722, + "Lcommaaccent": 556, + "195": 667, + "Aogonek": 667, + "197": 667, + "213": 778, + "zdotaccent": 500, + "Ecaron": 667, + "Iogonek": 278, + "kcommaaccent": 500, + "minus": 584, + "206": 278, + "ncaron": 556, + "tcommaaccent": 278, + "172": 584, + "246": 556, + "252": 556, + "notequal": 549, + "gcommaaccent": 556, + "240": 556, + "158": 500, + "ncommaaccent": 556, + "185": 333, + "imacron": 278, + "128": 556 + }, + "CIDtoGID_Compressed": true, + "CIDtoGID": "eJwDAAAAAAE=", + "_version_": 6 +} \ No newline at end of file diff --git a/storage/fonts/installed-fonts.json b/storage/fonts/installed-fonts.json new file mode 100644 index 0000000..33eb691 --- /dev/null +++ b/storage/fonts/installed-fonts.json @@ -0,0 +1,8 @@ +{ + "roboto": { + "300": "\/Users\/kadmin\/Websites\/partner.gruene-seele.bio\/storage\/fonts\/roboto_300_0ad88984b9f198326c24fec92aed1dd9", + "normal": "\/Users\/kadmin\/Websites\/partner.gruene-seele.bio\/storage\/fonts\/roboto_normal_f3da6241e732c10ab5ca1d8dd49e6ce2", + "500": "\/Users\/kadmin\/Websites\/partner.gruene-seele.bio\/storage\/fonts\/roboto_500_856d3f1c369a6fe7a02e7d7e6e29566b", + "bold": "roboto_bold_2e6c29a5b8010d8fba665fe873c5fdc4" + } +} \ No newline at end of file diff --git a/storage/fonts/roboto_300_0ad88984b9f198326c24fec92aed1dd9.ttf b/storage/fonts/roboto_300_0ad88984b9f198326c24fec92aed1dd9.ttf new file mode 100644 index 0000000..57a24e8 Binary files /dev/null and b/storage/fonts/roboto_300_0ad88984b9f198326c24fec92aed1dd9.ttf differ diff --git a/storage/fonts/roboto_300_0ad88984b9f198326c24fec92aed1dd9.ufm b/storage/fonts/roboto_300_0ad88984b9f198326c24fec92aed1dd9.ufm new file mode 100644 index 0000000..91253a9 --- /dev/null +++ b/storage/fonts/roboto_300_0ad88984b9f198326c24fec92aed1dd9.ufm @@ -0,0 +1,248 @@ +StartFontMetrics 4.1 +Notice Converted by PHP-font-lib +Comment https://github.com/dompdf/php-font-lib +EncodingScheme FontSpecific +Copyright Copyright 2011 Google Inc. All Rights Reserved. +FontName Roboto Light +FontSubfamily Regular +UniqueID Roboto Light +FullName Roboto Light +Version Version 2.137; 2017 +PostScriptName Roboto-Light +LicenseURL http://www.apache.org/licenses/LICENSE-2.0 +Weight Medium +ItalicAngle 0 +IsFixedPitch false +UnderlineThickness 49 +UnderlinePosition -73 +FontHeightOffset 0 +Ascender 928 +Descender -244 +FontBBox -734 -271 1138 1056 +StartCharMetrics 248 +U 0 ; WX 0 ; N uni0000 ; G 1 +U 13 ; WX 243 ; N uni000d ; G 3 +U 32 ; WX 243 ; N uni0020 ; G 4 +U 33 ; WX 226 ; N uni0021 ; G 5 +U 34 ; WX 287 ; N uni0022 ; G 6 +U 35 ; WX 582 ; N uni0023 ; G 7 +U 36 ; WX 554 ; N uni0024 ; G 8 +U 37 ; WX 739 ; N uni0025 ; G 9 +U 38 ; WX 615 ; N uni0026 ; G 10 +U 39 ; WX 170 ; N uni0027 ; G 11 +U 40 ; WX 319 ; N uni0028 ; G 12 +U 41 ; WX 326 ; N uni0029 ; G 13 +U 42 ; WX 424 ; N uni002a ; G 14 +U 43 ; WX 564 ; N uni002b ; G 15 +U 44 ; WX 191 ; N uni002c ; G 16 +U 45 ; WX 286 ; N uni002d ; G 17 +U 46 ; WX 239 ; N uni002e ; G 18 +U 47 ; WX 397 ; N uni002f ; G 19 +U 48 ; WX 554 ; N uni0030 ; G 20 +U 49 ; WX 554 ; N uni0031 ; G 21 +U 50 ; WX 554 ; N uni0032 ; G 22 +U 51 ; WX 554 ; N uni0033 ; G 23 +U 52 ; WX 554 ; N uni0034 ; G 24 +U 53 ; WX 554 ; N uni0035 ; G 25 +U 54 ; WX 554 ; N uni0036 ; G 26 +U 55 ; WX 554 ; N uni0037 ; G 27 +U 56 ; WX 554 ; N uni0038 ; G 28 +U 57 ; WX 554 ; N uni0039 ; G 29 +U 58 ; WX 210 ; N uni003a ; G 30 +U 59 ; WX 195 ; N uni003b ; G 31 +U 60 ; WX 511 ; N uni003c ; G 32 +U 61 ; WX 553 ; N uni003d ; G 33 +U 62 ; WX 518 ; N uni003e ; G 34 +U 63 ; WX 454 ; N uni003f ; G 35 +U 64 ; WX 913 ; N uni0040 ; G 36 +U 65 ; WX 625 ; N uni0041 ; G 37 +U 66 ; WX 613 ; N uni0042 ; G 38 +U 67 ; WX 649 ; N uni0043 ; G 39 +U 68 ; WX 655 ; N uni0044 ; G 40 +U 69 ; WX 569 ; N uni0045 ; G 41 +U 70 ; WX 563 ; N uni0046 ; G 42 +U 71 ; WX 684 ; N uni0047 ; G 43 +U 72 ; WX 708 ; N uni0048 ; G 44 +U 73 ; WX 266 ; N uni0049 ; G 45 +U 74 ; WX 550 ; N uni004a ; G 46 +U 75 ; WX 631 ; N uni004b ; G 47 +U 76 ; WX 527 ; N uni004c ; G 48 +U 77 ; WX 865 ; N uni004d ; G 49 +U 78 ; WX 710 ; N uni004e ; G 50 +U 79 ; WX 677 ; N uni004f ; G 51 +U 80 ; WX 616 ; N uni0050 ; G 52 +U 81 ; WX 677 ; N uni0051 ; G 53 +U 82 ; WX 635 ; N uni0052 ; G 54 +U 83 ; WX 592 ; N uni0053 ; G 55 +U 84 ; WX 597 ; N uni0054 ; G 56 +U 85 ; WX 657 ; N uni0055 ; G 57 +U 86 ; WX 617 ; N uni0056 ; G 58 +U 87 ; WX 896 ; N uni0057 ; G 59 +U 88 ; WX 612 ; N uni0058 ; G 60 +U 89 ; WX 599 ; N uni0059 ; G 61 +U 90 ; WX 598 ; N uni005a ; G 62 +U 91 ; WX 240 ; N uni005b ; G 63 +U 92 ; WX 394 ; N uni005c ; G 64 +U 93 ; WX 240 ; N uni005d ; G 65 +U 94 ; WX 416 ; N uni005e ; G 66 +U 95 ; WX 432 ; N uni005f ; G 67 +U 96 ; WX 286 ; N uni0060 ; G 68 +U 97 ; WX 536 ; N uni0061 ; G 69 +U 98 ; WX 554 ; N uni0062 ; G 70 +U 99 ; WX 515 ; N uni0063 ; G 71 +U 100 ; WX 556 ; N uni0064 ; G 72 +U 101 ; WX 517 ; N uni0065 ; G 73 +U 102 ; WX 331 ; N uni0066 ; G 74 +U 103 ; WX 555 ; N uni0067 ; G 75 +U 104 ; WX 549 ; N uni0068 ; G 76 +U 105 ; WX 224 ; N uni0069 ; G 77 +U 106 ; WX 228 ; N uni006a ; G 78 +U 107 ; WX 490 ; N uni006b ; G 79 +U 108 ; WX 224 ; N uni006c ; G 80 +U 109 ; WX 886 ; N uni006d ; G 81 +U 110 ; WX 549 ; N uni006e ; G 82 +U 111 ; WX 560 ; N uni006f ; G 83 +U 112 ; WX 554 ; N uni0070 ; G 84 +U 113 ; WX 558 ; N uni0071 ; G 85 +U 114 ; WX 336 ; N uni0072 ; G 86 +U 115 ; WX 506 ; N uni0073 ; G 87 +U 116 ; WX 321 ; N uni0074 ; G 88 +U 117 ; WX 549 ; N uni0075 ; G 89 +U 118 ; WX 481 ; N uni0076 ; G 90 +U 119 ; WX 754 ; N uni0077 ; G 91 +U 120 ; WX 486 ; N uni0078 ; G 92 +U 121 ; WX 475 ; N uni0079 ; G 93 +U 122 ; WX 486 ; N uni007a ; G 94 +U 123 ; WX 330 ; N uni007b ; G 95 +U 124 ; WX 221 ; N uni007c ; G 96 +U 125 ; WX 330 ; N uni007d ; G 97 +U 126 ; WX 685 ; N uni007e ; G 98 +U 160 ; WX 243 ; N uni00a0 ; G 189 +U 161 ; WX 221 ; N uni00a1 ; G 99 +U 162 ; WX 544 ; N uni00a2 ; G 100 +U 163 ; WX 571 ; N uni00a3 ; G 101 +U 164 ; WX 723 ; N uni00a4 ; G 102 +U 165 ; WX 516 ; N uni00a5 ; G 103 +U 166 ; WX 217 ; N uni00a6 ; G 104 +U 167 ; WX 605 ; N uni00a7 ; G 105 +U 168 ; WX 430 ; N uni00a8 ; G 106 +U 169 ; WX 799 ; N uni00a9 ; G 107 +U 170 ; WX 442 ; N uni00aa ; G 108 +U 171 ; WX 456 ; N uni00ab ; G 109 +U 172 ; WX 545 ; N uni00ac ; G 110 +U 173 ; WX 286 ; N uni00ad ; G 190 +U 174 ; WX 802 ; N uni00ae ; G 111 +U 175 ; WX 427 ; N uni00af ; G 112 +U 176 ; WX 378 ; N uni00b0 ; G 113 +U 177 ; WX 530 ; N uni00b1 ; G 114 +U 178 ; WX 361 ; N uni00b2 ; G 115 +U 179 ; WX 361 ; N uni00b3 ; G 116 +U 180 ; WX 281 ; N uni00b4 ; G 117 +U 181 ; WX 557 ; N uni00b5 ; G 118 +U 182 ; WX 475 ; N uni00b6 ; G 119 +U 183 ; WX 246 ; N uni00b7 ; G 120 +U 184 ; WX 243 ; N uni00b8 ; G 121 +U 185 ; WX 361 ; N uni00b9 ; G 122 +U 186 ; WX 450 ; N uni00ba ; G 123 +U 187 ; WX 453 ; N uni00bb ; G 124 +U 188 ; WX 725 ; N uni00bc ; G 125 +U 189 ; WX 756 ; N uni00bd ; G 126 +U 190 ; WX 776 ; N uni00be ; G 127 +U 191 ; WX 459 ; N uni00bf ; G 128 +U 192 ; WX 625 ; N uni00c0 ; G 192 +U 193 ; WX 625 ; N uni00c1 ; G 193 +U 194 ; WX 625 ; N uni00c2 ; G 194 +U 195 ; WX 625 ; N uni00c3 ; G 195 +U 196 ; WX 625 ; N uni00c4 ; G 196 +U 197 ; WX 625 ; N uni00c5 ; G 197 +U 198 ; WX 911 ; N uni00c6 ; G 129 +U 199 ; WX 649 ; N uni00c7 ; G 198 +U 200 ; WX 569 ; N uni00c8 ; G 199 +U 201 ; WX 569 ; N uni00c9 ; G 200 +U 202 ; WX 569 ; N uni00ca ; G 201 +U 203 ; WX 569 ; N uni00cb ; G 202 +U 204 ; WX 266 ; N uni00cc ; G 203 +U 205 ; WX 266 ; N uni00cd ; G 204 +U 206 ; WX 266 ; N uni00ce ; G 205 +U 207 ; WX 266 ; N uni00cf ; G 206 +U 208 ; WX 669 ; N uni00d0 ; G 191 +U 209 ; WX 710 ; N uni00d1 ; G 207 +U 210 ; WX 677 ; N uni00d2 ; G 208 +U 211 ; WX 677 ; N uni00d3 ; G 209 +U 212 ; WX 677 ; N uni00d4 ; G 210 +U 213 ; WX 677 ; N uni00d5 ; G 211 +U 214 ; WX 677 ; N uni00d6 ; G 212 +U 215 ; WX 523 ; N uni00d7 ; G 130 +U 216 ; WX 677 ; N uni00d8 ; G 131 +U 217 ; WX 657 ; N uni00d9 ; G 213 +U 218 ; WX 657 ; N uni00da ; G 214 +U 219 ; WX 657 ; N uni00db ; G 215 +U 220 ; WX 657 ; N uni00dc ; G 216 +U 221 ; WX 599 ; N uni00dd ; G 217 +U 222 ; WX 593 ; N uni00de ; G 132 +U 223 ; WX 586 ; N uni00df ; G 133 +U 224 ; WX 536 ; N uni00e0 ; G 218 +U 225 ; WX 536 ; N uni00e1 ; G 219 +U 226 ; WX 536 ; N uni00e2 ; G 220 +U 227 ; WX 536 ; N uni00e3 ; G 221 +U 228 ; WX 536 ; N uni00e4 ; G 222 +U 229 ; WX 536 ; N uni00e5 ; G 223 +U 230 ; WX 846 ; N uni00e6 ; G 134 +U 231 ; WX 515 ; N uni00e7 ; G 224 +U 232 ; WX 517 ; N uni00e8 ; G 225 +U 233 ; WX 517 ; N uni00e9 ; G 226 +U 234 ; WX 517 ; N uni00ea ; G 227 +U 235 ; WX 517 ; N uni00eb ; G 228 +U 236 ; WX 223 ; N uni00ec ; G 229 +U 237 ; WX 223 ; N uni00ed ; G 230 +U 238 ; WX 223 ; N uni00ee ; G 231 +U 239 ; WX 223 ; N uni00ef ; G 232 +U 240 ; WX 582 ; N uni00f0 ; G 135 +U 241 ; WX 549 ; N uni00f1 ; G 233 +U 242 ; WX 560 ; N uni00f2 ; G 234 +U 243 ; WX 560 ; N uni00f3 ; G 235 +U 244 ; WX 560 ; N uni00f4 ; G 236 +U 245 ; WX 560 ; N uni00f5 ; G 237 +U 246 ; WX 560 ; N uni00f6 ; G 238 +U 247 ; WX 568 ; N uni00f7 ; G 136 +U 248 ; WX 557 ; N uni00f8 ; G 137 +U 249 ; WX 549 ; N uni00f9 ; G 239 +U 250 ; WX 549 ; N uni00fa ; G 240 +U 251 ; WX 549 ; N uni00fb ; G 241 +U 252 ; WX 549 ; N uni00fc ; G 242 +U 253 ; WX 475 ; N uni00fd ; G 243 +U 254 ; WX 562 ; N uni00fe ; G 138 +U 255 ; WX 475 ; N uni00ff ; G 244 +U 305 ; WX 223 ; N uni0131 ; G 139 +U 338 ; WX 934 ; N uni0152 ; G 140 +U 339 ; WX 924 ; N uni0153 ; G 141 +U 700 ; WX 178 ; N uni02bc ; G 247 +U 710 ; WX 430 ; N uni02c6 ; G 142 +U 730 ; WX 310 ; N uni02da ; G 143 +U 732 ; WX 435 ; N uni02dc ; G 144 +U 8194 ; WX 510 ; N uni2002 ; G 145 +U 8201 ; WX 204 ; N uni2009 ; G 146 +U 8203 ; WX 0 ; N uni200b ; G 148 +U 8211 ; WX 651 ; N uni2013 ; G 149 +U 8212 ; WX 771 ; N uni2014 ; G 150 +U 8216 ; WX 178 ; N uni2018 ; G 151 +U 8217 ; WX 178 ; N uni2019 ; G 152 +U 8218 ; WX 172 ; N uni201a ; G 153 +U 8220 ; WX 299 ; N uni201c ; G 154 +U 8221 ; WX 301 ; N uni201d ; G 155 +U 8222 ; WX 290 ; N uni201e ; G 156 +U 8226 ; WX 323 ; N uni2022 ; G 157 +U 8230 ; WX 641 ; N uni2026 ; G 158 +U 8242 ; WX 170 ; N uni2032 ; G 245 +U 8243 ; WX 287 ; N uni2033 ; G 246 +U 8249 ; WX 297 ; N uni2039 ; G 159 +U 8250 ; WX 297 ; N uni203a ; G 160 +U 8260 ; WX 448 ; N uni2044 ; G 161 +U 8308 ; WX 361 ; N uni2074 ; G 162 +U 8364 ; WX 554 ; N uni20ac ; G 163 +U 8482 ; WX 617 ; N uni2122 ; G 164 +U 8722 ; WX 570 ; N uni2212 ; G 165 +U 65279 ; WX 0 ; N unifeff ; G 170 +U 65533 ; WX 1026 ; N unifffd ; G 171 +EndCharMetrics +EndFontMetrics diff --git a/storage/fonts/roboto_500_856d3f1c369a6fe7a02e7d7e6e29566b.ttf b/storage/fonts/roboto_500_856d3f1c369a6fe7a02e7d7e6e29566b.ttf new file mode 100644 index 0000000..dd04ff1 Binary files /dev/null and b/storage/fonts/roboto_500_856d3f1c369a6fe7a02e7d7e6e29566b.ttf differ diff --git a/storage/fonts/roboto_500_856d3f1c369a6fe7a02e7d7e6e29566b.ufm b/storage/fonts/roboto_500_856d3f1c369a6fe7a02e7d7e6e29566b.ufm new file mode 100644 index 0000000..1908583 --- /dev/null +++ b/storage/fonts/roboto_500_856d3f1c369a6fe7a02e7d7e6e29566b.ufm @@ -0,0 +1,248 @@ +StartFontMetrics 4.1 +Notice Converted by PHP-font-lib +Comment https://github.com/dompdf/php-font-lib +EncodingScheme FontSpecific +Copyright Copyright 2011 Google Inc. All Rights Reserved. +FontName Roboto Medium +FontSubfamily Regular +UniqueID Roboto Medium +FullName Roboto Medium +Version Version 2.137; 2017 +PostScriptName Roboto-Medium +LicenseURL http://www.apache.org/licenses/LICENSE-2.0 +Weight Bold +ItalicAngle 0 +IsFixedPitch false +UnderlineThickness 49 +UnderlinePosition -73 +FontHeightOffset 0 +Ascender 928 +Descender -244 +FontBBox -732 -271 1170 1056 +StartCharMetrics 248 +U 0 ; WX 0 ; N uni0000 ; G 1 +U 13 ; WX 249 ; N uni000d ; G 3 +U 32 ; WX 249 ; N uni0020 ; G 4 +U 33 ; WX 268 ; N uni0021 ; G 5 +U 34 ; WX 324 ; N uni0022 ; G 6 +U 35 ; WX 610 ; N uni0023 ; G 7 +U 36 ; WX 568 ; N uni0024 ; G 8 +U 37 ; WX 734 ; N uni0025 ; G 9 +U 38 ; WX 639 ; N uni0026 ; G 10 +U 39 ; WX 169 ; N uni0027 ; G 11 +U 40 ; WX 349 ; N uni0028 ; G 12 +U 41 ; WX 353 ; N uni0029 ; G 13 +U 42 ; WX 442 ; N uni002a ; G 14 +U 43 ; WX 557 ; N uni002b ; G 15 +U 44 ; WX 220 ; N uni002c ; G 16 +U 45 ; WX 328 ; N uni002d ; G 17 +U 46 ; WX 279 ; N uni002e ; G 18 +U 47 ; WX 396 ; N uni002f ; G 19 +U 48 ; WX 568 ; N uni0030 ; G 20 +U 49 ; WX 568 ; N uni0031 ; G 21 +U 50 ; WX 568 ; N uni0032 ; G 22 +U 51 ; WX 568 ; N uni0033 ; G 23 +U 52 ; WX 568 ; N uni0034 ; G 24 +U 53 ; WX 568 ; N uni0035 ; G 25 +U 54 ; WX 568 ; N uni0036 ; G 26 +U 55 ; WX 568 ; N uni0037 ; G 27 +U 56 ; WX 568 ; N uni0038 ; G 28 +U 57 ; WX 568 ; N uni0039 ; G 29 +U 58 ; WX 265 ; N uni003a ; G 30 +U 59 ; WX 238 ; N uni003b ; G 31 +U 60 ; WX 508 ; N uni003c ; G 32 +U 61 ; WX 560 ; N uni003d ; G 33 +U 62 ; WX 521 ; N uni003e ; G 34 +U 63 ; WX 486 ; N uni003f ; G 35 +U 64 ; WX 895 ; N uni0040 ; G 36 +U 65 ; WX 666 ; N uni0041 ; G 37 +U 66 ; WX 631 ; N uni0042 ; G 38 +U 67 ; WX 653 ; N uni0043 ; G 39 +U 68 ; WX 653 ; N uni0044 ; G 40 +U 69 ; WX 565 ; N uni0045 ; G 41 +U 70 ; WX 549 ; N uni0046 ; G 42 +U 71 ; WX 681 ; N uni0047 ; G 43 +U 72 ; WX 710 ; N uni0048 ; G 44 +U 73 ; WX 282 ; N uni0049 ; G 45 +U 74 ; WX 555 ; N uni004a ; G 46 +U 75 ; WX 630 ; N uni004b ; G 47 +U 76 ; WX 541 ; N uni004c ; G 48 +U 77 ; WX 875 ; N uni004d ; G 49 +U 78 ; WX 710 ; N uni004e ; G 50 +U 79 ; WX 690 ; N uni004f ; G 51 +U 80 ; WX 639 ; N uni0050 ; G 52 +U 81 ; WX 690 ; N uni0051 ; G 53 +U 82 ; WX 624 ; N uni0052 ; G 54 +U 83 ; WX 604 ; N uni0053 ; G 55 +U 84 ; WX 607 ; N uni0054 ; G 56 +U 85 ; WX 652 ; N uni0055 ; G 57 +U 86 ; WX 647 ; N uni0056 ; G 58 +U 87 ; WX 880 ; N uni0057 ; G 59 +U 88 ; WX 633 ; N uni0058 ; G 60 +U 89 ; WX 609 ; N uni0059 ; G 61 +U 90 ; WX 602 ; N uni005a ; G 62 +U 91 ; WX 274 ; N uni005b ; G 63 +U 92 ; WX 418 ; N uni005c ; G 64 +U 93 ; WX 274 ; N uni005d ; G 65 +U 94 ; WX 427 ; N uni005e ; G 66 +U 95 ; WX 451 ; N uni005f ; G 67 +U 96 ; WX 322 ; N uni0060 ; G 68 +U 97 ; WX 541 ; N uni0061 ; G 69 +U 98 ; WX 563 ; N uni0062 ; G 70 +U 99 ; WX 523 ; N uni0063 ; G 71 +U 100 ; WX 564 ; N uni0064 ; G 72 +U 101 ; WX 537 ; N uni0065 ; G 73 +U 102 ; WX 354 ; N uni0066 ; G 74 +U 103 ; WX 567 ; N uni0067 ; G 75 +U 104 ; WX 555 ; N uni0068 ; G 76 +U 105 ; WX 255 ; N uni0069 ; G 77 +U 106 ; WX 250 ; N uni006a ; G 78 +U 107 ; WX 522 ; N uni006b ; G 79 +U 108 ; WX 255 ; N uni006c ; G 80 +U 109 ; WX 870 ; N uni006d ; G 81 +U 110 ; WX 556 ; N uni006e ; G 82 +U 111 ; WX 569 ; N uni006f ; G 83 +U 112 ; WX 563 ; N uni0070 ; G 84 +U 113 ; WX 568 ; N uni0071 ; G 85 +U 114 ; WX 352 ; N uni0072 ; G 86 +U 115 ; WX 516 ; N uni0073 ; G 87 +U 116 ; WX 333 ; N uni0074 ; G 88 +U 117 ; WX 556 ; N uni0075 ; G 89 +U 118 ; WX 495 ; N uni0076 ; G 90 +U 119 ; WX 743 ; N uni0077 ; G 91 +U 120 ; WX 503 ; N uni0078 ; G 92 +U 121 ; WX 487 ; N uni0079 ; G 93 +U 122 ; WX 503 ; N uni007a ; G 94 +U 123 ; WX 335 ; N uni007b ; G 95 +U 124 ; WX 251 ; N uni007c ; G 96 +U 125 ; WX 335 ; N uni007d ; G 97 +U 126 ; WX 665 ; N uni007e ; G 98 +U 160 ; WX 249 ; N uni00a0 ; G 189 +U 161 ; WX 265 ; N uni00a1 ; G 99 +U 162 ; WX 561 ; N uni00a2 ; G 100 +U 163 ; WX 588 ; N uni00a3 ; G 101 +U 164 ; WX 702 ; N uni00a4 ; G 102 +U 165 ; WX 531 ; N uni00a5 ; G 103 +U 166 ; WX 248 ; N uni00a6 ; G 104 +U 167 ; WX 621 ; N uni00a7 ; G 105 +U 168 ; WX 440 ; N uni00a8 ; G 106 +U 169 ; WX 783 ; N uni00a9 ; G 107 +U 170 ; WX 446 ; N uni00aa ; G 108 +U 171 ; WX 485 ; N uni00ab ; G 109 +U 172 ; WX 553 ; N uni00ac ; G 110 +U 173 ; WX 328 ; N uni00ad ; G 190 +U 174 ; WX 783 ; N uni00ae ; G 111 +U 175 ; WX 482 ; N uni00af ; G 112 +U 176 ; WX 380 ; N uni00b0 ; G 113 +U 177 ; WX 536 ; N uni00b1 ; G 114 +U 178 ; WX 370 ; N uni00b2 ; G 115 +U 179 ; WX 370 ; N uni00b3 ; G 116 +U 180 ; WX 326 ; N uni00b4 ; G 117 +U 181 ; WX 591 ; N uni00b5 ; G 118 +U 182 ; WX 491 ; N uni00b6 ; G 119 +U 183 ; WX 282 ; N uni00b7 ; G 120 +U 184 ; WX 258 ; N uni00b8 ; G 121 +U 185 ; WX 370 ; N uni00b9 ; G 122 +U 186 ; WX 457 ; N uni00ba ; G 123 +U 187 ; WX 485 ; N uni00bb ; G 124 +U 188 ; WX 727 ; N uni00bc ; G 125 +U 189 ; WX 771 ; N uni00bd ; G 126 +U 190 ; WX 792 ; N uni00be ; G 127 +U 191 ; WX 486 ; N uni00bf ; G 128 +U 192 ; WX 666 ; N uni00c0 ; G 192 +U 193 ; WX 666 ; N uni00c1 ; G 193 +U 194 ; WX 666 ; N uni00c2 ; G 194 +U 195 ; WX 666 ; N uni00c3 ; G 195 +U 196 ; WX 666 ; N uni00c4 ; G 196 +U 197 ; WX 666 ; N uni00c5 ; G 197 +U 198 ; WX 940 ; N uni00c6 ; G 129 +U 199 ; WX 653 ; N uni00c7 ; G 198 +U 200 ; WX 565 ; N uni00c8 ; G 199 +U 201 ; WX 565 ; N uni00c9 ; G 200 +U 202 ; WX 565 ; N uni00ca ; G 201 +U 203 ; WX 565 ; N uni00cb ; G 202 +U 204 ; WX 282 ; N uni00cc ; G 203 +U 205 ; WX 282 ; N uni00cd ; G 204 +U 206 ; WX 282 ; N uni00ce ; G 205 +U 207 ; WX 282 ; N uni00cf ; G 206 +U 208 ; WX 668 ; N uni00d0 ; G 191 +U 209 ; WX 710 ; N uni00d1 ; G 207 +U 210 ; WX 690 ; N uni00d2 ; G 208 +U 211 ; WX 690 ; N uni00d3 ; G 209 +U 212 ; WX 690 ; N uni00d4 ; G 210 +U 213 ; WX 690 ; N uni00d5 ; G 211 +U 214 ; WX 690 ; N uni00d6 ; G 212 +U 215 ; WX 533 ; N uni00d7 ; G 130 +U 216 ; WX 689 ; N uni00d8 ; G 131 +U 217 ; WX 652 ; N uni00d9 ; G 213 +U 218 ; WX 652 ; N uni00da ; G 214 +U 219 ; WX 652 ; N uni00db ; G 215 +U 220 ; WX 652 ; N uni00dc ; G 216 +U 221 ; WX 609 ; N uni00dd ; G 217 +U 222 ; WX 599 ; N uni00de ; G 132 +U 223 ; WX 613 ; N uni00df ; G 133 +U 224 ; WX 541 ; N uni00e0 ; G 218 +U 225 ; WX 541 ; N uni00e1 ; G 219 +U 226 ; WX 541 ; N uni00e2 ; G 220 +U 227 ; WX 541 ; N uni00e3 ; G 221 +U 228 ; WX 541 ; N uni00e4 ; G 222 +U 229 ; WX 541 ; N uni00e5 ; G 223 +U 230 ; WX 844 ; N uni00e6 ; G 134 +U 231 ; WX 523 ; N uni00e7 ; G 224 +U 232 ; WX 537 ; N uni00e8 ; G 225 +U 233 ; WX 537 ; N uni00e9 ; G 226 +U 234 ; WX 537 ; N uni00ea ; G 227 +U 235 ; WX 537 ; N uni00eb ; G 228 +U 236 ; WX 263 ; N uni00ec ; G 229 +U 237 ; WX 263 ; N uni00ed ; G 230 +U 238 ; WX 263 ; N uni00ee ; G 231 +U 239 ; WX 263 ; N uni00ef ; G 232 +U 240 ; WX 582 ; N uni00f0 ; G 135 +U 241 ; WX 556 ; N uni00f1 ; G 233 +U 242 ; WX 569 ; N uni00f2 ; G 234 +U 243 ; WX 569 ; N uni00f3 ; G 235 +U 244 ; WX 569 ; N uni00f4 ; G 236 +U 245 ; WX 569 ; N uni00f5 ; G 237 +U 246 ; WX 569 ; N uni00f6 ; G 238 +U 247 ; WX 571 ; N uni00f7 ; G 136 +U 248 ; WX 566 ; N uni00f8 ; G 137 +U 249 ; WX 556 ; N uni00f9 ; G 239 +U 250 ; WX 556 ; N uni00fa ; G 240 +U 251 ; WX 556 ; N uni00fb ; G 241 +U 252 ; WX 556 ; N uni00fc ; G 242 +U 253 ; WX 487 ; N uni00fd ; G 243 +U 254 ; WX 574 ; N uni00fe ; G 138 +U 255 ; WX 487 ; N uni00ff ; G 244 +U 305 ; WX 263 ; N uni0131 ; G 139 +U 338 ; WX 963 ; N uni0152 ; G 140 +U 339 ; WX 903 ; N uni0153 ; G 141 +U 700 ; WX 217 ; N uni02bc ; G 247 +U 710 ; WX 487 ; N uni02c6 ; G 142 +U 730 ; WX 337 ; N uni02da ; G 143 +U 732 ; WX 480 ; N uni02dc ; G 144 +U 8194 ; WX 510 ; N uni2002 ; G 145 +U 8201 ; WX 204 ; N uni2009 ; G 146 +U 8203 ; WX 0 ; N uni200b ; G 148 +U 8211 ; WX 645 ; N uni2013 ; G 149 +U 8212 ; WX 773 ; N uni2014 ; G 150 +U 8216 ; WX 219 ; N uni2018 ; G 151 +U 8217 ; WX 217 ; N uni2019 ; G 152 +U 8218 ; WX 226 ; N uni201a ; G 153 +U 8220 ; WX 385 ; N uni201c ; G 154 +U 8221 ; WX 388 ; N uni201d ; G 155 +U 8222 ; WX 379 ; N uni201e ; G 156 +U 8226 ; WX 349 ; N uni2022 ; G 157 +U 8230 ; WX 706 ; N uni2026 ; G 158 +U 8242 ; WX 169 ; N uni2032 ; G 245 +U 8243 ; WX 324 ; N uni2033 ; G 246 +U 8249 ; WX 306 ; N uni2039 ; G 159 +U 8250 ; WX 301 ; N uni203a ; G 160 +U 8260 ; WX 451 ; N uni2044 ; G 161 +U 8308 ; WX 370 ; N uni2074 ; G 162 +U 8364 ; WX 568 ; N uni20ac ; G 163 +U 8482 ; WX 629 ; N uni2122 ; G 164 +U 8722 ; WX 564 ; N uni2212 ; G 165 +U 65279 ; WX 0 ; N unifeff ; G 170 +U 65533 ; WX 1026 ; N unifffd ; G 171 +EndCharMetrics +EndFontMetrics diff --git a/storage/fonts/roboto_bold_2e6c29a5b8010d8fba665fe873c5fdc4.ttf b/storage/fonts/roboto_bold_2e6c29a5b8010d8fba665fe873c5fdc4.ttf new file mode 100644 index 0000000..ea06a63 Binary files /dev/null and b/storage/fonts/roboto_bold_2e6c29a5b8010d8fba665fe873c5fdc4.ttf differ diff --git a/storage/fonts/roboto_bold_2e6c29a5b8010d8fba665fe873c5fdc4.ufm b/storage/fonts/roboto_bold_2e6c29a5b8010d8fba665fe873c5fdc4.ufm new file mode 100644 index 0000000..46449f2 --- /dev/null +++ b/storage/fonts/roboto_bold_2e6c29a5b8010d8fba665fe873c5fdc4.ufm @@ -0,0 +1,248 @@ +StartFontMetrics 4.1 +Notice Converted by PHP-font-lib +Comment https://github.com/dompdf/php-font-lib +EncodingScheme FontSpecific +Copyright Copyright 2011 Google Inc. All Rights Reserved. +FontName Roboto +FontSubfamily Bold +UniqueID Roboto Bold +FullName Roboto Bold +Version Version 2.137; 2017 +PostScriptName Roboto-Bold +LicenseURL http://www.apache.org/licenses/LICENSE-2.0 +Weight Bold +ItalicAngle 0 +IsFixedPitch false +UnderlineThickness 49 +UnderlinePosition -73 +FontHeightOffset 0 +Ascender 928 +Descender -244 +FontBBox -727 -271 1191 1056 +StartCharMetrics 248 +U 0 ; WX 0 ; N uni0000 ; G 1 +U 13 ; WX 249 ; N uni000d ; G 3 +U 32 ; WX 249 ; N uni0020 ; G 4 +U 33 ; WX 272 ; N uni0021 ; G 5 +U 34 ; WX 321 ; N uni0022 ; G 6 +U 35 ; WX 596 ; N uni0023 ; G 7 +U 36 ; WX 574 ; N uni0024 ; G 8 +U 37 ; WX 738 ; N uni0025 ; G 9 +U 38 ; WX 656 ; N uni0026 ; G 10 +U 39 ; WX 162 ; N uni0027 ; G 11 +U 40 ; WX 351 ; N uni0028 ; G 12 +U 41 ; WX 353 ; N uni0029 ; G 13 +U 42 ; WX 453 ; N uni002a ; G 14 +U 43 ; WX 546 ; N uni002b ; G 15 +U 44 ; WX 244 ; N uni002c ; G 16 +U 45 ; WX 388 ; N uni002d ; G 17 +U 46 ; WX 291 ; N uni002e ; G 18 +U 47 ; WX 374 ; N uni002f ; G 19 +U 48 ; WX 574 ; N uni0030 ; G 20 +U 49 ; WX 574 ; N uni0031 ; G 21 +U 50 ; WX 574 ; N uni0032 ; G 22 +U 51 ; WX 574 ; N uni0033 ; G 23 +U 52 ; WX 574 ; N uni0034 ; G 24 +U 53 ; WX 574 ; N uni0035 ; G 25 +U 54 ; WX 574 ; N uni0036 ; G 26 +U 55 ; WX 574 ; N uni0037 ; G 27 +U 56 ; WX 574 ; N uni0038 ; G 28 +U 57 ; WX 574 ; N uni0039 ; G 29 +U 58 ; WX 282 ; N uni003a ; G 30 +U 59 ; WX 262 ; N uni003b ; G 31 +U 60 ; WX 509 ; N uni003c ; G 32 +U 61 ; WX 572 ; N uni003d ; G 33 +U 62 ; WX 517 ; N uni003e ; G 34 +U 63 ; WX 498 ; N uni003f ; G 35 +U 64 ; WX 895 ; N uni0040 ; G 36 +U 65 ; WX 673 ; N uni0041 ; G 37 +U 66 ; WX 638 ; N uni0042 ; G 38 +U 67 ; WX 654 ; N uni0043 ; G 39 +U 68 ; WX 650 ; N uni0044 ; G 40 +U 69 ; WX 563 ; N uni0045 ; G 41 +U 70 ; WX 548 ; N uni0046 ; G 42 +U 71 ; WX 681 ; N uni0047 ; G 43 +U 72 ; WX 707 ; N uni0048 ; G 44 +U 73 ; WX 292 ; N uni0049 ; G 45 +U 74 ; WX 559 ; N uni004a ; G 46 +U 75 ; WX 635 ; N uni004b ; G 47 +U 76 ; WX 542 ; N uni004c ; G 48 +U 77 ; WX 876 ; N uni004d ; G 49 +U 78 ; WX 706 ; N uni004e ; G 50 +U 79 ; WX 690 ; N uni004f ; G 51 +U 80 ; WX 645 ; N uni0050 ; G 52 +U 81 ; WX 690 ; N uni0051 ; G 53 +U 82 ; WX 638 ; N uni0052 ; G 54 +U 83 ; WX 615 ; N uni0053 ; G 55 +U 84 ; WX 619 ; N uni0054 ; G 56 +U 85 ; WX 658 ; N uni0055 ; G 57 +U 86 ; WX 654 ; N uni0056 ; G 58 +U 87 ; WX 875 ; N uni0057 ; G 59 +U 88 ; WX 635 ; N uni0058 ; G 60 +U 89 ; WX 618 ; N uni0059 ; G 61 +U 90 ; WX 606 ; N uni005a ; G 62 +U 91 ; WX 278 ; N uni005b ; G 63 +U 92 ; WX 422 ; N uni005c ; G 64 +U 93 ; WX 278 ; N uni005d ; G 65 +U 94 ; WX 437 ; N uni005e ; G 66 +U 95 ; WX 446 ; N uni005f ; G 67 +U 96 ; WX 331 ; N uni0060 ; G 68 +U 97 ; WX 536 ; N uni0061 ; G 69 +U 98 ; WX 563 ; N uni0062 ; G 70 +U 99 ; WX 521 ; N uni0063 ; G 71 +U 100 ; WX 563 ; N uni0064 ; G 72 +U 101 ; WX 541 ; N uni0065 ; G 73 +U 102 ; WX 358 ; N uni0066 ; G 74 +U 103 ; WX 571 ; N uni0067 ; G 75 +U 104 ; WX 560 ; N uni0068 ; G 76 +U 105 ; WX 265 ; N uni0069 ; G 77 +U 106 ; WX 260 ; N uni006a ; G 78 +U 107 ; WX 534 ; N uni006b ; G 79 +U 108 ; WX 265 ; N uni006c ; G 80 +U 109 ; WX 866 ; N uni006d ; G 81 +U 110 ; WX 560 ; N uni006e ; G 82 +U 111 ; WX 565 ; N uni006f ; G 83 +U 112 ; WX 563 ; N uni0070 ; G 84 +U 113 ; WX 565 ; N uni0071 ; G 85 +U 114 ; WX 365 ; N uni0072 ; G 86 +U 115 ; WX 514 ; N uni0073 ; G 87 +U 116 ; WX 338 ; N uni0074 ; G 88 +U 117 ; WX 560 ; N uni0075 ; G 89 +U 118 ; WX 505 ; N uni0076 ; G 90 +U 119 ; WX 735 ; N uni0077 ; G 91 +U 120 ; WX 509 ; N uni0078 ; G 92 +U 121 ; WX 502 ; N uni0079 ; G 93 +U 122 ; WX 509 ; N uni007a ; G 94 +U 123 ; WX 330 ; N uni007b ; G 95 +U 124 ; WX 253 ; N uni007c ; G 96 +U 125 ; WX 330 ; N uni007d ; G 97 +U 126 ; WX 648 ; N uni007e ; G 98 +U 160 ; WX 249 ; N uni00a0 ; G 189 +U 161 ; WX 282 ; N uni00a1 ; G 99 +U 162 ; WX 575 ; N uni00a2 ; G 100 +U 163 ; WX 594 ; N uni00a3 ; G 101 +U 164 ; WX 692 ; N uni00a4 ; G 102 +U 165 ; WX 536 ; N uni00a5 ; G 103 +U 166 ; WX 252 ; N uni00a6 ; G 104 +U 167 ; WX 628 ; N uni00a7 ; G 105 +U 168 ; WX 467 ; N uni00a8 ; G 106 +U 169 ; WX 784 ; N uni00a9 ; G 107 +U 170 ; WX 444 ; N uni00aa ; G 108 +U 171 ; WX 500 ; N uni00ab ; G 109 +U 172 ; WX 551 ; N uni00ac ; G 110 +U 173 ; WX 388 ; N uni00ad ; G 190 +U 174 ; WX 784 ; N uni00ae ; G 111 +U 175 ; WX 501 ; N uni00af ; G 112 +U 176 ; WX 388 ; N uni00b0 ; G 113 +U 177 ; WX 537 ; N uni00b1 ; G 114 +U 178 ; WX 373 ; N uni00b2 ; G 115 +U 179 ; WX 373 ; N uni00b3 ; G 116 +U 180 ; WX 332 ; N uni00b4 ; G 117 +U 181 ; WX 616 ; N uni00b5 ; G 118 +U 182 ; WX 490 ; N uni00b6 ; G 119 +U 183 ; WX 301 ; N uni00b7 ; G 120 +U 184 ; WX 268 ; N uni00b8 ; G 121 +U 185 ; WX 373 ; N uni00b9 ; G 122 +U 186 ; WX 457 ; N uni00ba ; G 123 +U 187 ; WX 500 ; N uni00bb ; G 124 +U 188 ; WX 718 ; N uni00bc ; G 125 +U 189 ; WX 761 ; N uni00bd ; G 126 +U 190 ; WX 808 ; N uni00be ; G 127 +U 191 ; WX 498 ; N uni00bf ; G 128 +U 192 ; WX 673 ; N uni00c0 ; G 192 +U 193 ; WX 673 ; N uni00c1 ; G 193 +U 194 ; WX 673 ; N uni00c2 ; G 194 +U 195 ; WX 673 ; N uni00c3 ; G 195 +U 196 ; WX 673 ; N uni00c4 ; G 196 +U 197 ; WX 673 ; N uni00c5 ; G 197 +U 198 ; WX 940 ; N uni00c6 ; G 129 +U 199 ; WX 654 ; N uni00c7 ; G 198 +U 200 ; WX 563 ; N uni00c8 ; G 199 +U 201 ; WX 563 ; N uni00c9 ; G 200 +U 202 ; WX 563 ; N uni00ca ; G 201 +U 203 ; WX 563 ; N uni00cb ; G 202 +U 204 ; WX 292 ; N uni00cc ; G 203 +U 205 ; WX 292 ; N uni00cd ; G 204 +U 206 ; WX 292 ; N uni00ce ; G 205 +U 207 ; WX 292 ; N uni00cf ; G 206 +U 208 ; WX 665 ; N uni00d0 ; G 191 +U 209 ; WX 706 ; N uni00d1 ; G 207 +U 210 ; WX 690 ; N uni00d2 ; G 208 +U 211 ; WX 690 ; N uni00d3 ; G 209 +U 212 ; WX 690 ; N uni00d4 ; G 210 +U 213 ; WX 690 ; N uni00d5 ; G 211 +U 214 ; WX 690 ; N uni00d6 ; G 212 +U 215 ; WX 531 ; N uni00d7 ; G 130 +U 216 ; WX 689 ; N uni00d8 ; G 131 +U 217 ; WX 658 ; N uni00d9 ; G 213 +U 218 ; WX 658 ; N uni00da ; G 214 +U 219 ; WX 658 ; N uni00db ; G 215 +U 220 ; WX 658 ; N uni00dc ; G 216 +U 221 ; WX 618 ; N uni00dd ; G 217 +U 222 ; WX 608 ; N uni00de ; G 132 +U 223 ; WX 631 ; N uni00df ; G 133 +U 224 ; WX 536 ; N uni00e0 ; G 218 +U 225 ; WX 536 ; N uni00e1 ; G 219 +U 226 ; WX 536 ; N uni00e2 ; G 220 +U 227 ; WX 536 ; N uni00e3 ; G 221 +U 228 ; WX 536 ; N uni00e4 ; G 222 +U 229 ; WX 536 ; N uni00e5 ; G 223 +U 230 ; WX 844 ; N uni00e6 ; G 134 +U 231 ; WX 521 ; N uni00e7 ; G 224 +U 232 ; WX 541 ; N uni00e8 ; G 225 +U 233 ; WX 541 ; N uni00e9 ; G 226 +U 234 ; WX 541 ; N uni00ea ; G 227 +U 235 ; WX 541 ; N uni00eb ; G 228 +U 236 ; WX 274 ; N uni00ec ; G 229 +U 237 ; WX 274 ; N uni00ed ; G 230 +U 238 ; WX 274 ; N uni00ee ; G 231 +U 239 ; WX 274 ; N uni00ef ; G 232 +U 240 ; WX 575 ; N uni00f0 ; G 135 +U 241 ; WX 560 ; N uni00f1 ; G 233 +U 242 ; WX 565 ; N uni00f2 ; G 234 +U 243 ; WX 565 ; N uni00f3 ; G 235 +U 244 ; WX 565 ; N uni00f4 ; G 236 +U 245 ; WX 565 ; N uni00f5 ; G 237 +U 246 ; WX 565 ; N uni00f6 ; G 238 +U 247 ; WX 570 ; N uni00f7 ; G 136 +U 248 ; WX 564 ; N uni00f8 ; G 137 +U 249 ; WX 560 ; N uni00f9 ; G 239 +U 250 ; WX 560 ; N uni00fa ; G 240 +U 251 ; WX 560 ; N uni00fb ; G 241 +U 252 ; WX 560 ; N uni00fc ; G 242 +U 253 ; WX 502 ; N uni00fd ; G 243 +U 254 ; WX 567 ; N uni00fe ; G 138 +U 255 ; WX 502 ; N uni00ff ; G 244 +U 305 ; WX 274 ; N uni0131 ; G 139 +U 338 ; WX 968 ; N uni0152 ; G 140 +U 339 ; WX 902 ; N uni0153 ; G 141 +U 700 ; WX 229 ; N uni02bc ; G 247 +U 710 ; WX 496 ; N uni02c6 ; G 142 +U 730 ; WX 333 ; N uni02da ; G 143 +U 732 ; WX 481 ; N uni02dc ; G 144 +U 8194 ; WX 510 ; N uni2002 ; G 145 +U 8201 ; WX 204 ; N uni2009 ; G 146 +U 8203 ; WX 0 ; N uni200b ; G 148 +U 8211 ; WX 632 ; N uni2013 ; G 149 +U 8212 ; WX 763 ; N uni2014 ; G 150 +U 8216 ; WX 234 ; N uni2018 ; G 151 +U 8217 ; WX 229 ; N uni2019 ; G 152 +U 8218 ; WX 248 ; N uni201a ; G 153 +U 8220 ; WX 406 ; N uni201c ; G 154 +U 8221 ; WX 409 ; N uni201d ; G 155 +U 8222 ; WX 403 ; N uni201e ; G 156 +U 8226 ; WX 359 ; N uni2022 ; G 157 +U 8230 ; WX 740 ; N uni2026 ; G 158 +U 8242 ; WX 162 ; N uni2032 ; G 245 +U 8243 ; WX 321 ; N uni2033 ; G 246 +U 8249 ; WX 312 ; N uni2039 ; G 159 +U 8250 ; WX 302 ; N uni203a ; G 160 +U 8260 ; WX 446 ; N uni2044 ; G 161 +U 8308 ; WX 373 ; N uni2074 ; G 162 +U 8364 ; WX 574 ; N uni20ac ; G 163 +U 8482 ; WX 631 ; N uni2122 ; G 164 +U 8722 ; WX 556 ; N uni2212 ; G 165 +U 65279 ; WX 0 ; N unifeff ; G 170 +U 65533 ; WX 1026 ; N unifffd ; G 171 +EndCharMetrics +EndFontMetrics diff --git a/storage/fonts/roboto_bold_2e6c29a5b8010d8fba665fe873c5fdc4.ufm.json b/storage/fonts/roboto_bold_2e6c29a5b8010d8fba665fe873c5fdc4.ufm.json new file mode 100644 index 0000000..fd4fd83 --- /dev/null +++ b/storage/fonts/roboto_bold_2e6c29a5b8010d8fba665fe873c5fdc4.ufm.json @@ -0,0 +1,478 @@ +{ + "codeToName": { + "0": "uni0000", + "13": "uni000d", + "32": "uni0020", + "33": "uni0021", + "34": "uni0022", + "35": "uni0023", + "36": "uni0024", + "37": "uni0025", + "38": "uni0026", + "39": "uni0027", + "40": "uni0028", + "41": "uni0029", + "42": "uni002a", + "43": "uni002b", + "44": "uni002c", + "45": "uni002d", + "46": "uni002e", + "47": "uni002f", + "48": "uni0030", + "49": "uni0031", + "50": "uni0032", + "51": "uni0033", + "52": "uni0034", + "53": "uni0035", + "54": "uni0036", + "55": "uni0037", + "56": "uni0038", + "57": "uni0039", + "58": "uni003a", + "59": "uni003b", + "60": "uni003c", + "61": "uni003d", + "62": "uni003e", + "63": "uni003f", + "64": "uni0040", + "65": "uni0041", + "66": "uni0042", + "67": "uni0043", + "68": "uni0044", + "69": "uni0045", + "70": "uni0046", + "71": "uni0047", + "72": "uni0048", + "73": "uni0049", + "74": "uni004a", + "75": "uni004b", + "76": "uni004c", + "77": "uni004d", + "78": "uni004e", + "79": "uni004f", + "80": "uni0050", + "81": "uni0051", + "82": "uni0052", + "83": "uni0053", + "84": "uni0054", + "85": "uni0055", + "86": "uni0056", + "87": "uni0057", + "88": "uni0058", + "89": "uni0059", + "90": "uni005a", + "91": "uni005b", + "92": "uni005c", + "93": "uni005d", + "94": "uni005e", + "95": "uni005f", + "96": "uni0060", + "97": "uni0061", + "98": "uni0062", + "99": "uni0063", + "100": "uni0064", + "101": "uni0065", + "102": "uni0066", + "103": "uni0067", + "104": "uni0068", + "105": "uni0069", + "106": "uni006a", + "107": "uni006b", + "108": "uni006c", + "109": "uni006d", + "110": "uni006e", + "111": "uni006f", + "112": "uni0070", + "113": "uni0071", + "114": "uni0072", + "115": "uni0073", + "116": "uni0074", + "117": "uni0075", + "118": "uni0076", + "119": "uni0077", + "120": "uni0078", + "121": "uni0079", + "122": "uni007a", + "123": "uni007b", + "124": "uni007c", + "125": "uni007d", + "126": "uni007e", + "160": "uni00a0", + "161": "uni00a1", + "162": "uni00a2", + "163": "uni00a3", + "164": "uni00a4", + "165": "uni00a5", + "166": "uni00a6", + "167": "uni00a7", + "168": "uni00a8", + "169": "uni00a9", + "170": "uni00aa", + "171": "uni00ab", + "172": "uni00ac", + "173": "uni00ad", + "174": "uni00ae", + "175": "uni00af", + "176": "uni00b0", + "177": "uni00b1", + "178": "uni00b2", + "179": "uni00b3", + "180": "uni00b4", + "181": "uni00b5", + "182": "uni00b6", + "183": "uni00b7", + "184": "uni00b8", + "185": "uni00b9", + "186": "uni00ba", + "187": "uni00bb", + "188": "uni00bc", + "189": "uni00bd", + "190": "uni00be", + "191": "uni00bf", + "192": "uni00c0", + "193": "uni00c1", + "194": "uni00c2", + "195": "uni00c3", + "196": "uni00c4", + "197": "uni00c5", + "198": "uni00c6", + "199": "uni00c7", + "200": "uni00c8", + "201": "uni00c9", + "202": "uni00ca", + "203": "uni00cb", + "204": "uni00cc", + "205": "uni00cd", + "206": "uni00ce", + "207": "uni00cf", + "208": "uni00d0", + "209": "uni00d1", + "210": "uni00d2", + "211": "uni00d3", + "212": "uni00d4", + "213": "uni00d5", + "214": "uni00d6", + "215": "uni00d7", + "216": "uni00d8", + "217": "uni00d9", + "218": "uni00da", + "219": "uni00db", + "220": "uni00dc", + "221": "uni00dd", + "222": "uni00de", + "223": "uni00df", + "224": "uni00e0", + "225": "uni00e1", + "226": "uni00e2", + "227": "uni00e3", + "228": "uni00e4", + "229": "uni00e5", + "230": "uni00e6", + "231": "uni00e7", + "232": "uni00e8", + "233": "uni00e9", + "234": "uni00ea", + "235": "uni00eb", + "236": "uni00ec", + "237": "uni00ed", + "238": "uni00ee", + "239": "uni00ef", + "240": "uni00f0", + "241": "uni00f1", + "242": "uni00f2", + "243": "uni00f3", + "244": "uni00f4", + "245": "uni00f5", + "246": "uni00f6", + "247": "uni00f7", + "248": "uni00f8", + "249": "uni00f9", + "250": "uni00fa", + "251": "uni00fb", + "252": "uni00fc", + "253": "uni00fd", + "254": "uni00fe", + "255": "uni00ff", + "305": "uni0131", + "338": "uni0152", + "339": "uni0153", + "700": "uni02bc", + "710": "uni02c6", + "730": "uni02da", + "732": "uni02dc", + "8194": "uni2002", + "8201": "uni2009", + "8203": "uni200b", + "8211": "uni2013", + "8212": "uni2014", + "8216": "uni2018", + "8217": "uni2019", + "8218": "uni201a", + "8220": "uni201c", + "8221": "uni201d", + "8222": "uni201e", + "8226": "uni2022", + "8230": "uni2026", + "8242": "uni2032", + "8243": "uni2033", + "8249": "uni2039", + "8250": "uni203a", + "8260": "uni2044", + "8308": "uni2074", + "8364": "uni20ac", + "8482": "uni2122", + "8722": "uni2212", + "65279": "unifeff", + "65533": "unifffd" + }, + "isUnicode": true, + "EncodingScheme": "FontSpecific", + "FontName": "Roboto", + "FullName": "Roboto Bold", + "Version": "Version 2.137; 2017", + "PostScriptName": "Roboto-Bold", + "Weight": "Bold", + "ItalicAngle": "0", + "IsFixedPitch": "false", + "UnderlineThickness": "49", + "UnderlinePosition": "-73", + "FontHeightOffset": "0", + "Ascender": "928", + "Descender": "-244", + "FontBBox": [ + "-727", + "-271", + "1191", + "1056" + ], + "StartCharMetrics": "248", + "C": { + "0": 0, + "13": 249, + "32": 249, + "33": 272, + "34": 321, + "35": 596, + "36": 574, + "37": 738, + "38": 656, + "39": 162, + "40": 351, + "41": 353, + "42": 453, + "43": 546, + "44": 244, + "45": 388, + "46": 291, + "47": 374, + "48": 574, + "49": 574, + "50": 574, + "51": 574, + "52": 574, + "53": 574, + "54": 574, + "55": 574, + "56": 574, + "57": 574, + "58": 282, + "59": 262, + "60": 509, + "61": 572, + "62": 517, + "63": 498, + "64": 895, + "65": 673, + "66": 638, + "67": 654, + "68": 650, + "69": 563, + "70": 548, + "71": 681, + "72": 707, + "73": 292, + "74": 559, + "75": 635, + "76": 542, + "77": 876, + "78": 706, + "79": 690, + "80": 645, + "81": 690, + "82": 638, + "83": 615, + "84": 619, + "85": 658, + "86": 654, + "87": 875, + "88": 635, + "89": 618, + "90": 606, + "91": 278, + "92": 422, + "93": 278, + "94": 437, + "95": 446, + "96": 331, + "97": 536, + "98": 563, + "99": 521, + "100": 563, + "101": 541, + "102": 358, + "103": 571, + "104": 560, + "105": 265, + "106": 260, + "107": 534, + "108": 265, + "109": 866, + "110": 560, + "111": 565, + "112": 563, + "113": 565, + "114": 365, + "115": 514, + "116": 338, + "117": 560, + "118": 505, + "119": 735, + "120": 509, + "121": 502, + "122": 509, + "123": 330, + "124": 253, + "125": 330, + "126": 648, + "160": 249, + "161": 282, + "162": 575, + "163": 594, + "164": 692, + "165": 536, + "166": 252, + "167": 628, + "168": 467, + "169": 784, + "170": 444, + "171": 500, + "172": 551, + "173": 388, + "174": 784, + "175": 501, + "176": 388, + "177": 537, + "178": 373, + "179": 373, + "180": 332, + "181": 616, + "182": 490, + "183": 301, + "184": 268, + "185": 373, + "186": 457, + "187": 500, + "188": 718, + "189": 761, + "190": 808, + "191": 498, + "192": 673, + "193": 673, + "194": 673, + "195": 673, + "196": 673, + "197": 673, + "198": 940, + "199": 654, + "200": 563, + "201": 563, + "202": 563, + "203": 563, + "204": 292, + "205": 292, + "206": 292, + "207": 292, + "208": 665, + "209": 706, + "210": 690, + "211": 690, + "212": 690, + "213": 690, + "214": 690, + "215": 531, + "216": 689, + "217": 658, + "218": 658, + "219": 658, + "220": 658, + "221": 618, + "222": 608, + "223": 631, + "224": 536, + "225": 536, + "226": 536, + "227": 536, + "228": 536, + "229": 536, + "230": 844, + "231": 521, + "232": 541, + "233": 541, + "234": 541, + "235": 541, + "236": 274, + "237": 274, + "238": 274, + "239": 274, + "240": 575, + "241": 560, + "242": 565, + "243": 565, + "244": 565, + "245": 565, + "246": 565, + "247": 570, + "248": 564, + "249": 560, + "250": 560, + "251": 560, + "252": 560, + "253": 502, + "254": 567, + "255": 502, + "305": 274, + "338": 968, + "339": 902, + "700": 229, + "710": 496, + "730": 333, + "732": 481, + "8194": 510, + "8201": 204, + "8203": 0, + "8211": 632, + "8212": 763, + "8216": 234, + "8217": 229, + "8218": 248, + "8220": 406, + "8221": 409, + "8222": 403, + "8226": 359, + "8230": 740, + "8242": 162, + "8243": 321, + "8249": 312, + "8250": 302, + "8260": 446, + "8308": 373, + "8364": 574, + "8482": 631, + "8722": 556, + "65279": 0, + "65533": 1026 + }, + "CIDtoGID_Compressed": true, + "CIDtoGID": "eJzt0FPPYGcYhtGrqW3btm3btm3bZmrzpP0NtW3btk47TeZgOplpJ+1MvyZdK3n362ffezdawzP6cHeGNEZjNlZjN07jNl7jN0ETNlETN0mTNlmTN0VTNlVTN03TNl3TN0MzNlMzN0uzNluzN0dzNldzN0\/zNl\/zt0ALtlALt0iLtliLt0RLtlRLt0zLtlzLt0IrtlIrt0qrtlqrt0ZrtlZrt07rtl7rt0EbtlEbt0mbtlmbt0VbtlVbt03btl3bt0M7tlM7t0u7ttsIfeGfu7vd26M926u926d926\/9O6ADO6h7OrhDOrTDOrwjOrKjOrpjOrbjOr4TOrGTOrlTuq\/7e6AHe6iHO7VHerTHerwnerKnerpnurdne67ne6EXe6nTOr2Xe6VXe63XO6Mze6M3e6u3e6d3O6v3er8P+rCP+rhP+rTPOrvP+6Iv+6qv+6ZzOrdv+67v+6EfO6+fRsIf+Cvn\/+MKF3ThSMgB\/x2\/DmPtohG8e\/GgdsnIiwIAAAAAAAAAAAAAAAAAwH\/MpX+YXTaoXT7UiSu6cvDoqq7umkH9tV3X9YPXbhjc3zic+j\/3yxCzm7p5GGduGeG0f8+to7j+0G77l983kG4f6ACMUncMdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\/mfuHOgADJi7fn\/8Bsu+aH4=", + "_version_": 6 +} \ No newline at end of file diff --git a/storage/fonts/roboto_normal_f3da6241e732c10ab5ca1d8dd49e6ce2.ttf b/storage/fonts/roboto_normal_f3da6241e732c10ab5ca1d8dd49e6ce2.ttf new file mode 100644 index 0000000..a97385d Binary files /dev/null and b/storage/fonts/roboto_normal_f3da6241e732c10ab5ca1d8dd49e6ce2.ttf differ diff --git a/storage/fonts/roboto_normal_f3da6241e732c10ab5ca1d8dd49e6ce2.ufm b/storage/fonts/roboto_normal_f3da6241e732c10ab5ca1d8dd49e6ce2.ufm new file mode 100644 index 0000000..db7924b --- /dev/null +++ b/storage/fonts/roboto_normal_f3da6241e732c10ab5ca1d8dd49e6ce2.ufm @@ -0,0 +1,248 @@ +StartFontMetrics 4.1 +Notice Converted by PHP-font-lib +Comment https://github.com/dompdf/php-font-lib +EncodingScheme FontSpecific +Copyright Copyright 2011 Google Inc. All Rights Reserved. +FontName Roboto +FontSubfamily Regular +UniqueID Roboto +FullName Roboto +Version Version 2.137; 2017 +PostScriptName Roboto-Regular +LicenseURL http://www.apache.org/licenses/LICENSE-2.0 +Weight Medium +ItalicAngle 0 +IsFixedPitch false +UnderlineThickness 49 +UnderlinePosition -73 +FontHeightOffset 0 +Ascender 928 +Descender -244 +FontBBox -737 -271 1148 1056 +StartCharMetrics 248 +U 0 ; WX 0 ; N uni0000 ; G 1 +U 13 ; WX 248 ; N uni000d ; G 3 +U 32 ; WX 248 ; N uni0020 ; G 4 +U 33 ; WX 257 ; N uni0021 ; G 5 +U 34 ; WX 320 ; N uni0022 ; G 6 +U 35 ; WX 616 ; N uni0023 ; G 7 +U 36 ; WX 562 ; N uni0024 ; G 8 +U 37 ; WX 732 ; N uni0025 ; G 9 +U 38 ; WX 622 ; N uni0026 ; G 10 +U 39 ; WX 174 ; N uni0027 ; G 11 +U 40 ; WX 342 ; N uni0028 ; G 12 +U 41 ; WX 348 ; N uni0029 ; G 13 +U 42 ; WX 431 ; N uni002a ; G 14 +U 43 ; WX 567 ; N uni002b ; G 15 +U 44 ; WX 196 ; N uni002c ; G 16 +U 45 ; WX 276 ; N uni002d ; G 17 +U 46 ; WX 263 ; N uni002e ; G 18 +U 47 ; WX 412 ; N uni002f ; G 19 +U 48 ; WX 562 ; N uni0030 ; G 20 +U 49 ; WX 562 ; N uni0031 ; G 21 +U 50 ; WX 562 ; N uni0032 ; G 22 +U 51 ; WX 562 ; N uni0033 ; G 23 +U 52 ; WX 562 ; N uni0034 ; G 24 +U 53 ; WX 562 ; N uni0035 ; G 25 +U 54 ; WX 562 ; N uni0036 ; G 26 +U 55 ; WX 562 ; N uni0037 ; G 27 +U 56 ; WX 562 ; N uni0038 ; G 28 +U 57 ; WX 562 ; N uni0039 ; G 29 +U 58 ; WX 242 ; N uni003a ; G 30 +U 59 ; WX 211 ; N uni003b ; G 31 +U 60 ; WX 508 ; N uni003c ; G 32 +U 61 ; WX 549 ; N uni003d ; G 33 +U 62 ; WX 522 ; N uni003e ; G 34 +U 63 ; WX 472 ; N uni003f ; G 35 +U 64 ; WX 898 ; N uni0040 ; G 36 +U 65 ; WX 652 ; N uni0041 ; G 37 +U 66 ; WX 623 ; N uni0042 ; G 38 +U 67 ; WX 651 ; N uni0043 ; G 39 +U 68 ; WX 656 ; N uni0044 ; G 40 +U 69 ; WX 568 ; N uni0045 ; G 41 +U 70 ; WX 553 ; N uni0046 ; G 42 +U 71 ; WX 681 ; N uni0047 ; G 43 +U 72 ; WX 713 ; N uni0048 ; G 44 +U 73 ; WX 272 ; N uni0049 ; G 45 +U 74 ; WX 552 ; N uni004a ; G 46 +U 75 ; WX 627 ; N uni004b ; G 47 +U 76 ; WX 538 ; N uni004c ; G 48 +U 77 ; WX 873 ; N uni004d ; G 49 +U 78 ; WX 713 ; N uni004e ; G 50 +U 79 ; WX 688 ; N uni004f ; G 51 +U 80 ; WX 631 ; N uni0050 ; G 52 +U 81 ; WX 688 ; N uni0051 ; G 53 +U 82 ; WX 616 ; N uni0052 ; G 54 +U 83 ; WX 593 ; N uni0053 ; G 55 +U 84 ; WX 597 ; N uni0054 ; G 56 +U 85 ; WX 648 ; N uni0055 ; G 57 +U 86 ; WX 636 ; N uni0056 ; G 58 +U 87 ; WX 887 ; N uni0057 ; G 59 +U 88 ; WX 627 ; N uni0058 ; G 60 +U 89 ; WX 601 ; N uni0059 ; G 61 +U 90 ; WX 599 ; N uni005a ; G 62 +U 91 ; WX 265 ; N uni005b ; G 63 +U 92 ; WX 410 ; N uni005c ; G 64 +U 93 ; WX 265 ; N uni005d ; G 65 +U 94 ; WX 418 ; N uni005e ; G 66 +U 95 ; WX 451 ; N uni005f ; G 67 +U 96 ; WX 309 ; N uni0060 ; G 68 +U 97 ; WX 544 ; N uni0061 ; G 69 +U 98 ; WX 561 ; N uni0062 ; G 70 +U 99 ; WX 523 ; N uni0063 ; G 71 +U 100 ; WX 564 ; N uni0064 ; G 72 +U 101 ; WX 530 ; N uni0065 ; G 73 +U 102 ; WX 347 ; N uni0066 ; G 74 +U 103 ; WX 561 ; N uni0067 ; G 75 +U 104 ; WX 551 ; N uni0068 ; G 76 +U 105 ; WX 243 ; N uni0069 ; G 77 +U 106 ; WX 239 ; N uni006a ; G 78 +U 107 ; WX 507 ; N uni006b ; G 79 +U 108 ; WX 243 ; N uni006c ; G 80 +U 109 ; WX 876 ; N uni006d ; G 81 +U 110 ; WX 552 ; N uni006e ; G 82 +U 111 ; WX 570 ; N uni006f ; G 83 +U 112 ; WX 561 ; N uni0070 ; G 84 +U 113 ; WX 568 ; N uni0071 ; G 85 +U 114 ; WX 338 ; N uni0072 ; G 86 +U 115 ; WX 516 ; N uni0073 ; G 87 +U 116 ; WX 327 ; N uni0074 ; G 88 +U 117 ; WX 551 ; N uni0075 ; G 89 +U 118 ; WX 484 ; N uni0076 ; G 90 +U 119 ; WX 751 ; N uni0077 ; G 91 +U 120 ; WX 496 ; N uni0078 ; G 92 +U 121 ; WX 473 ; N uni0079 ; G 93 +U 122 ; WX 496 ; N uni007a ; G 94 +U 123 ; WX 338 ; N uni007b ; G 95 +U 124 ; WX 244 ; N uni007c ; G 96 +U 125 ; WX 338 ; N uni007d ; G 97 +U 126 ; WX 680 ; N uni007e ; G 98 +U 160 ; WX 248 ; N uni00a0 ; G 189 +U 161 ; WX 244 ; N uni00a1 ; G 99 +U 162 ; WX 547 ; N uni00a2 ; G 100 +U 163 ; WX 581 ; N uni00a3 ; G 101 +U 164 ; WX 713 ; N uni00a4 ; G 102 +U 165 ; WX 525 ; N uni00a5 ; G 103 +U 166 ; WX 240 ; N uni00a6 ; G 104 +U 167 ; WX 613 ; N uni00a7 ; G 105 +U 168 ; WX 418 ; N uni00a8 ; G 106 +U 169 ; WX 786 ; N uni00a9 ; G 107 +U 170 ; WX 447 ; N uni00aa ; G 108 +U 171 ; WX 469 ; N uni00ab ; G 109 +U 172 ; WX 554 ; N uni00ac ; G 110 +U 173 ; WX 276 ; N uni00ad ; G 190 +U 174 ; WX 786 ; N uni00ae ; G 111 +U 175 ; WX 458 ; N uni00af ; G 112 +U 176 ; WX 374 ; N uni00b0 ; G 113 +U 177 ; WX 534 ; N uni00b1 ; G 114 +U 178 ; WX 367 ; N uni00b2 ; G 115 +U 179 ; WX 367 ; N uni00b3 ; G 116 +U 180 ; WX 313 ; N uni00b4 ; G 117 +U 181 ; WX 566 ; N uni00b5 ; G 118 +U 182 ; WX 489 ; N uni00b6 ; G 119 +U 183 ; WX 261 ; N uni00b7 ; G 120 +U 184 ; WX 248 ; N uni00b8 ; G 121 +U 185 ; WX 367 ; N uni00b9 ; G 122 +U 186 ; WX 455 ; N uni00ba ; G 123 +U 187 ; WX 469 ; N uni00bb ; G 124 +U 188 ; WX 732 ; N uni00bc ; G 125 +U 189 ; WX 776 ; N uni00bd ; G 126 +U 190 ; WX 778 ; N uni00be ; G 127 +U 191 ; WX 473 ; N uni00bf ; G 128 +U 192 ; WX 652 ; N uni00c0 ; G 192 +U 193 ; WX 652 ; N uni00c1 ; G 193 +U 194 ; WX 652 ; N uni00c2 ; G 194 +U 195 ; WX 652 ; N uni00c3 ; G 195 +U 196 ; WX 652 ; N uni00c4 ; G 196 +U 197 ; WX 652 ; N uni00c5 ; G 197 +U 198 ; WX 935 ; N uni00c6 ; G 129 +U 199 ; WX 651 ; N uni00c7 ; G 198 +U 200 ; WX 568 ; N uni00c8 ; G 199 +U 201 ; WX 568 ; N uni00c9 ; G 200 +U 202 ; WX 568 ; N uni00ca ; G 201 +U 203 ; WX 568 ; N uni00cb ; G 202 +U 204 ; WX 272 ; N uni00cc ; G 203 +U 205 ; WX 272 ; N uni00cd ; G 204 +U 206 ; WX 272 ; N uni00ce ; G 205 +U 207 ; WX 272 ; N uni00cf ; G 206 +U 208 ; WX 670 ; N uni00d0 ; G 191 +U 209 ; WX 713 ; N uni00d1 ; G 207 +U 210 ; WX 688 ; N uni00d2 ; G 208 +U 211 ; WX 688 ; N uni00d3 ; G 209 +U 212 ; WX 688 ; N uni00d4 ; G 210 +U 213 ; WX 688 ; N uni00d5 ; G 211 +U 214 ; WX 688 ; N uni00d6 ; G 212 +U 215 ; WX 533 ; N uni00d7 ; G 130 +U 216 ; WX 688 ; N uni00d8 ; G 131 +U 217 ; WX 648 ; N uni00d9 ; G 213 +U 218 ; WX 648 ; N uni00da ; G 214 +U 219 ; WX 648 ; N uni00db ; G 215 +U 220 ; WX 648 ; N uni00dc ; G 216 +U 221 ; WX 601 ; N uni00dd ; G 217 +U 222 ; WX 591 ; N uni00de ; G 132 +U 223 ; WX 595 ; N uni00df ; G 133 +U 224 ; WX 544 ; N uni00e0 ; G 218 +U 225 ; WX 544 ; N uni00e1 ; G 219 +U 226 ; WX 544 ; N uni00e2 ; G 220 +U 227 ; WX 544 ; N uni00e3 ; G 221 +U 228 ; WX 544 ; N uni00e4 ; G 222 +U 229 ; WX 544 ; N uni00e5 ; G 223 +U 230 ; WX 844 ; N uni00e6 ; G 134 +U 231 ; WX 523 ; N uni00e7 ; G 224 +U 232 ; WX 530 ; N uni00e8 ; G 225 +U 233 ; WX 530 ; N uni00e9 ; G 226 +U 234 ; WX 530 ; N uni00ea ; G 227 +U 235 ; WX 530 ; N uni00eb ; G 228 +U 236 ; WX 247 ; N uni00ec ; G 229 +U 237 ; WX 247 ; N uni00ed ; G 230 +U 238 ; WX 247 ; N uni00ee ; G 231 +U 239 ; WX 247 ; N uni00ef ; G 232 +U 240 ; WX 586 ; N uni00f0 ; G 135 +U 241 ; WX 552 ; N uni00f1 ; G 233 +U 242 ; WX 570 ; N uni00f2 ; G 234 +U 243 ; WX 570 ; N uni00f3 ; G 235 +U 244 ; WX 570 ; N uni00f4 ; G 236 +U 245 ; WX 570 ; N uni00f5 ; G 237 +U 246 ; WX 570 ; N uni00f6 ; G 238 +U 247 ; WX 571 ; N uni00f7 ; G 136 +U 248 ; WX 566 ; N uni00f8 ; G 137 +U 249 ; WX 551 ; N uni00f9 ; G 239 +U 250 ; WX 551 ; N uni00fa ; G 240 +U 251 ; WX 551 ; N uni00fb ; G 241 +U 252 ; WX 551 ; N uni00fc ; G 242 +U 253 ; WX 473 ; N uni00fd ; G 243 +U 254 ; WX 576 ; N uni00fe ; G 138 +U 255 ; WX 473 ; N uni00ff ; G 244 +U 305 ; WX 247 ; N uni0131 ; G 139 +U 338 ; WX 954 ; N uni0152 ; G 140 +U 339 ; WX 908 ; N uni0153 ; G 141 +U 700 ; WX 200 ; N uni02bc ; G 247 +U 710 ; WX 471 ; N uni02c6 ; G 142 +U 730 ; WX 334 ; N uni02da ; G 143 +U 732 ; WX 472 ; N uni02dc ; G 144 +U 8194 ; WX 510 ; N uni2002 ; G 145 +U 8201 ; WX 204 ; N uni2009 ; G 146 +U 8203 ; WX 0 ; N uni200b ; G 148 +U 8211 ; WX 656 ; N uni2013 ; G 149 +U 8212 ; WX 781 ; N uni2014 ; G 150 +U 8216 ; WX 200 ; N uni2018 ; G 151 +U 8217 ; WX 200 ; N uni2019 ; G 152 +U 8218 ; WX 199 ; N uni201a ; G 153 +U 8220 ; WX 354 ; N uni201c ; G 154 +U 8221 ; WX 357 ; N uni201d ; G 155 +U 8222 ; WX 344 ; N uni201e ; G 156 +U 8226 ; WX 337 ; N uni2022 ; G 157 +U 8230 ; WX 669 ; N uni2026 ; G 158 +U 8242 ; WX 174 ; N uni2032 ; G 245 +U 8243 ; WX 320 ; N uni2033 ; G 246 +U 8249 ; WX 300 ; N uni2039 ; G 159 +U 8250 ; WX 300 ; N uni203a ; G 160 +U 8260 ; WX 455 ; N uni2044 ; G 161 +U 8308 ; WX 367 ; N uni2074 ; G 162 +U 8364 ; WX 562 ; N uni20ac ; G 163 +U 8482 ; WX 625 ; N uni2122 ; G 164 +U 8722 ; WX 571 ; N uni2212 ; G 165 +U 65279 ; WX 0 ; N unifeff ; G 170 +U 65533 ; WX 1026 ; N unifffd ; G 171 +EndCharMetrics +EndFontMetrics diff --git a/storage/fonts/roboto_normal_f3da6241e732c10ab5ca1d8dd49e6ce2.ufm.json b/storage/fonts/roboto_normal_f3da6241e732c10ab5ca1d8dd49e6ce2.ufm.json new file mode 100644 index 0000000..c92df76 --- /dev/null +++ b/storage/fonts/roboto_normal_f3da6241e732c10ab5ca1d8dd49e6ce2.ufm.json @@ -0,0 +1,478 @@ +{ + "codeToName": { + "0": "uni0000", + "13": "uni000d", + "32": "uni0020", + "33": "uni0021", + "34": "uni0022", + "35": "uni0023", + "36": "uni0024", + "37": "uni0025", + "38": "uni0026", + "39": "uni0027", + "40": "uni0028", + "41": "uni0029", + "42": "uni002a", + "43": "uni002b", + "44": "uni002c", + "45": "uni002d", + "46": "uni002e", + "47": "uni002f", + "48": "uni0030", + "49": "uni0031", + "50": "uni0032", + "51": "uni0033", + "52": "uni0034", + "53": "uni0035", + "54": "uni0036", + "55": "uni0037", + "56": "uni0038", + "57": "uni0039", + "58": "uni003a", + "59": "uni003b", + "60": "uni003c", + "61": "uni003d", + "62": "uni003e", + "63": "uni003f", + "64": "uni0040", + "65": "uni0041", + "66": "uni0042", + "67": "uni0043", + "68": "uni0044", + "69": "uni0045", + "70": "uni0046", + "71": "uni0047", + "72": "uni0048", + "73": "uni0049", + "74": "uni004a", + "75": "uni004b", + "76": "uni004c", + "77": "uni004d", + "78": "uni004e", + "79": "uni004f", + "80": "uni0050", + "81": "uni0051", + "82": "uni0052", + "83": "uni0053", + "84": "uni0054", + "85": "uni0055", + "86": "uni0056", + "87": "uni0057", + "88": "uni0058", + "89": "uni0059", + "90": "uni005a", + "91": "uni005b", + "92": "uni005c", + "93": "uni005d", + "94": "uni005e", + "95": "uni005f", + "96": "uni0060", + "97": "uni0061", + "98": "uni0062", + "99": "uni0063", + "100": "uni0064", + "101": "uni0065", + "102": "uni0066", + "103": "uni0067", + "104": "uni0068", + "105": "uni0069", + "106": "uni006a", + "107": "uni006b", + "108": "uni006c", + "109": "uni006d", + "110": "uni006e", + "111": "uni006f", + "112": "uni0070", + "113": "uni0071", + "114": "uni0072", + "115": "uni0073", + "116": "uni0074", + "117": "uni0075", + "118": "uni0076", + "119": "uni0077", + "120": "uni0078", + "121": "uni0079", + "122": "uni007a", + "123": "uni007b", + "124": "uni007c", + "125": "uni007d", + "126": "uni007e", + "160": "uni00a0", + "161": "uni00a1", + "162": "uni00a2", + "163": "uni00a3", + "164": "uni00a4", + "165": "uni00a5", + "166": "uni00a6", + "167": "uni00a7", + "168": "uni00a8", + "169": "uni00a9", + "170": "uni00aa", + "171": "uni00ab", + "172": "uni00ac", + "173": "uni00ad", + "174": "uni00ae", + "175": "uni00af", + "176": "uni00b0", + "177": "uni00b1", + "178": "uni00b2", + "179": "uni00b3", + "180": "uni00b4", + "181": "uni00b5", + "182": "uni00b6", + "183": "uni00b7", + "184": "uni00b8", + "185": "uni00b9", + "186": "uni00ba", + "187": "uni00bb", + "188": "uni00bc", + "189": "uni00bd", + "190": "uni00be", + "191": "uni00bf", + "192": "uni00c0", + "193": "uni00c1", + "194": "uni00c2", + "195": "uni00c3", + "196": "uni00c4", + "197": "uni00c5", + "198": "uni00c6", + "199": "uni00c7", + "200": "uni00c8", + "201": "uni00c9", + "202": "uni00ca", + "203": "uni00cb", + "204": "uni00cc", + "205": "uni00cd", + "206": "uni00ce", + "207": "uni00cf", + "208": "uni00d0", + "209": "uni00d1", + "210": "uni00d2", + "211": "uni00d3", + "212": "uni00d4", + "213": "uni00d5", + "214": "uni00d6", + "215": "uni00d7", + "216": "uni00d8", + "217": "uni00d9", + "218": "uni00da", + "219": "uni00db", + "220": "uni00dc", + "221": "uni00dd", + "222": "uni00de", + "223": "uni00df", + "224": "uni00e0", + "225": "uni00e1", + "226": "uni00e2", + "227": "uni00e3", + "228": "uni00e4", + "229": "uni00e5", + "230": "uni00e6", + "231": "uni00e7", + "232": "uni00e8", + "233": "uni00e9", + "234": "uni00ea", + "235": "uni00eb", + "236": "uni00ec", + "237": "uni00ed", + "238": "uni00ee", + "239": "uni00ef", + "240": "uni00f0", + "241": "uni00f1", + "242": "uni00f2", + "243": "uni00f3", + "244": "uni00f4", + "245": "uni00f5", + "246": "uni00f6", + "247": "uni00f7", + "248": "uni00f8", + "249": "uni00f9", + "250": "uni00fa", + "251": "uni00fb", + "252": "uni00fc", + "253": "uni00fd", + "254": "uni00fe", + "255": "uni00ff", + "305": "uni0131", + "338": "uni0152", + "339": "uni0153", + "700": "uni02bc", + "710": "uni02c6", + "730": "uni02da", + "732": "uni02dc", + "8194": "uni2002", + "8201": "uni2009", + "8203": "uni200b", + "8211": "uni2013", + "8212": "uni2014", + "8216": "uni2018", + "8217": "uni2019", + "8218": "uni201a", + "8220": "uni201c", + "8221": "uni201d", + "8222": "uni201e", + "8226": "uni2022", + "8230": "uni2026", + "8242": "uni2032", + "8243": "uni2033", + "8249": "uni2039", + "8250": "uni203a", + "8260": "uni2044", + "8308": "uni2074", + "8364": "uni20ac", + "8482": "uni2122", + "8722": "uni2212", + "65279": "unifeff", + "65533": "unifffd" + }, + "isUnicode": true, + "EncodingScheme": "FontSpecific", + "FontName": "Roboto", + "FullName": "Roboto", + "Version": "Version 2.137; 2017", + "PostScriptName": "Roboto-Regular", + "Weight": "Medium", + "ItalicAngle": "0", + "IsFixedPitch": "false", + "UnderlineThickness": "49", + "UnderlinePosition": "-73", + "FontHeightOffset": "0", + "Ascender": "928", + "Descender": "-244", + "FontBBox": [ + "-737", + "-271", + "1148", + "1056" + ], + "StartCharMetrics": "248", + "C": { + "0": 0, + "13": 248, + "32": 248, + "33": 257, + "34": 320, + "35": 616, + "36": 562, + "37": 732, + "38": 622, + "39": 174, + "40": 342, + "41": 348, + "42": 431, + "43": 567, + "44": 196, + "45": 276, + "46": 263, + "47": 412, + "48": 562, + "49": 562, + "50": 562, + "51": 562, + "52": 562, + "53": 562, + "54": 562, + "55": 562, + "56": 562, + "57": 562, + "58": 242, + "59": 211, + "60": 508, + "61": 549, + "62": 522, + "63": 472, + "64": 898, + "65": 652, + "66": 623, + "67": 651, + "68": 656, + "69": 568, + "70": 553, + "71": 681, + "72": 713, + "73": 272, + "74": 552, + "75": 627, + "76": 538, + "77": 873, + "78": 713, + "79": 688, + "80": 631, + "81": 688, + "82": 616, + "83": 593, + "84": 597, + "85": 648, + "86": 636, + "87": 887, + "88": 627, + "89": 601, + "90": 599, + "91": 265, + "92": 410, + "93": 265, + "94": 418, + "95": 451, + "96": 309, + "97": 544, + "98": 561, + "99": 523, + "100": 564, + "101": 530, + "102": 347, + "103": 561, + "104": 551, + "105": 243, + "106": 239, + "107": 507, + "108": 243, + "109": 876, + "110": 552, + "111": 570, + "112": 561, + "113": 568, + "114": 338, + "115": 516, + "116": 327, + "117": 551, + "118": 484, + "119": 751, + "120": 496, + "121": 473, + "122": 496, + "123": 338, + "124": 244, + "125": 338, + "126": 680, + "160": 248, + "161": 244, + "162": 547, + "163": 581, + "164": 713, + "165": 525, + "166": 240, + "167": 613, + "168": 418, + "169": 786, + "170": 447, + "171": 469, + "172": 554, + "173": 276, + "174": 786, + "175": 458, + "176": 374, + "177": 534, + "178": 367, + "179": 367, + "180": 313, + "181": 566, + "182": 489, + "183": 261, + "184": 248, + "185": 367, + "186": 455, + "187": 469, + "188": 732, + "189": 776, + "190": 778, + "191": 473, + "192": 652, + "193": 652, + "194": 652, + "195": 652, + "196": 652, + "197": 652, + "198": 935, + "199": 651, + "200": 568, + "201": 568, + "202": 568, + "203": 568, + "204": 272, + "205": 272, + "206": 272, + "207": 272, + "208": 670, + "209": 713, + "210": 688, + "211": 688, + "212": 688, + "213": 688, + "214": 688, + "215": 533, + "216": 688, + "217": 648, + "218": 648, + "219": 648, + "220": 648, + "221": 601, + "222": 591, + "223": 595, + "224": 544, + "225": 544, + "226": 544, + "227": 544, + "228": 544, + "229": 544, + "230": 844, + "231": 523, + "232": 530, + "233": 530, + "234": 530, + "235": 530, + "236": 247, + "237": 247, + "238": 247, + "239": 247, + "240": 586, + "241": 552, + "242": 570, + "243": 570, + "244": 570, + "245": 570, + "246": 570, + "247": 571, + "248": 566, + "249": 551, + "250": 551, + "251": 551, + "252": 551, + "253": 473, + "254": 576, + "255": 473, + "305": 247, + "338": 954, + "339": 908, + "700": 200, + "710": 471, + "730": 334, + "732": 472, + "8194": 510, + "8201": 204, + "8203": 0, + "8211": 656, + "8212": 781, + "8216": 200, + "8217": 200, + "8218": 199, + "8220": 354, + "8221": 357, + "8222": 344, + "8226": 337, + "8230": 669, + "8242": 174, + "8243": 320, + "8249": 300, + "8250": 300, + "8260": 455, + "8308": 367, + "8364": 562, + "8482": 625, + "8722": 571, + "65279": 0, + "65533": 1026 + }, + "CIDtoGID_Compressed": true, + "CIDtoGID": "eJzt0FPPYGcYhtGrqW3btm3btm3bZmrzpP0NtW3btk47TeZgOplpJ+1MvyZdK3n362ffezdawzP6cHeGNEZjNlZjN07jNl7jN0ETNlETN0mTNlmTN0VTNlVTN03TNl3TN0MzNlMzN0uzNluzN0dzNldzN0\/zNl\/zt0ALtlALt0iLtliLt0RLtlRLt0zLtlzLt0IrtlIrt0qrtlqrt0ZrtlZrt07rtl7rt0EbtlEbt0mbtlmbt0VbtlVbt03btl3bt0M7tlM7t0u7ttsIfeGfu7vd26M926u926d926\/9O6ADO6h7OrhDOrTDOrwjOrKjOrpjOrbjOr4TOrGTOrlTuq\/7e6AHe6iHO7VHerTHerwnerKnerpnurdne67ne6EXe6nTOr2Xe6VXe63XO6Mze6M3e6u3e6d3O6v3er8P+rCP+rhP+rTPOrvP+6Iv+6qv+6ZzOrdv+67v+6EfO6+fRsIf+Cvn\/+MKF3ThSMgB\/x2\/DmPtohG8e\/GgdsnIiwIAAAAAAAAAAAAAAAAAwH\/MpX+YXTaoXT7UiSu6cvDoqq7umkH9tV3X9YPXbhjc3zic+j\/3yxCzm7p5GGduGeG0f8+to7j+0G77l983kG4f6ACMUncMdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\/mfuHOgADJi7fn\/8Bsu+aH4=", + "_version_": 6 +} \ No newline at end of file diff --git a/tools/pint b/tools/pint new file mode 100644 index 0000000..c4f3897 --- /dev/null +++ b/tools/pint @@ -0,0 +1,12 @@ +#!/bin/bash +# Laravel Pint Wrapper +# Dieses Skript verwendet php-cs-fixer direkt, falls Pint nicht installiert ist + +# Prüfe ob php-cs-fixer verfügbar ist +if ! command -v php-cs-fixer &> /dev/null; then + echo "php-cs-fixer nicht gefunden. Versuche Installation..." + composer require --dev friendsofphp/php-cs-fixer +fi + +# Verwende Laravel Standard-Regeln +php-cs-fixer fix --config=.php-cs-fixer.php "$@" \ No newline at end of file diff --git a/vendor.tar b/vendor.tar index 76acfa9..d952574 100644 Binary files a/vendor.tar and b/vendor.tar differ