Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
151 changes: 151 additions & 0 deletions resources/lang/ru/messages.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
<?php

return [
'title' => 'Магазин',
'welcome' => 'Добро пожаловать в магазин!',

'buy' => 'Купить',

'free' => 'Бесплатно',

'periods' => [
'hours' => 'часов',
'days' => 'дней',
'weeks' => 'недель',
'months' => 'месяцев',
'years' => 'лет',
],

'fields' => [
'balance' => 'Баланс',
'category' => 'Категория',
'code' => 'Код',
'commands' => 'Команды',
'currency' => 'Валюта',
'discount' => 'Скидка',
'expire_date' => 'Дата окончания',
'gateways' => 'Платежные системы',
'global_limit' => 'Глобальный лимит покупок',
'original_balance' => 'Начальный баланс',
'package' => 'Товар',
'packages' => 'Товары',
'payment_id' => 'ID платежа',
'payments' => 'Платежи',
'price' => 'Цена',
'quantity' => 'Количество',
'renewal_date' => 'Дата продления',
'required' => 'Обязательно',
'required_packages' => 'Необходимые товары',
'required_roles' => 'Необходимая роль',
'role' => 'Роль после покупки',
'start_date' => 'Дата начала',
'subscription' => 'Подписка',
'subscription_id' => 'ID подписки',
'total' => 'Итого',
'user_id' => 'ID пользователя',
'user_limit' => 'Лимит покупок пользователя',
],

'actions' => [
'subscribe' => 'Подписаться',
'manage' => 'Управлять подпиской',
'move' => 'Переместить',
],

'goal' => [
'title' => 'Цель месяца',
'progress' => 'Выполнено: :count%',
],

'recent' => [
'title' => 'Последние платежи',
'empty' => 'Нет недавних платежей',
],

'top' => [
'title' => 'Лучший покупатель',
],

'cart' => [
'title' => 'Корзина',
'success' => 'Покупка успешно завершена.',
'guest' => 'Для покупки необходимо войти.',
'empty' => 'Ваша корзина пуста.',
'checkout' => 'Оформить',
'clear' => 'Очистить корзину',
'pay' => 'Оплатить',
'back' => 'Назад в магазин',
'total' => 'Итого: :total',
'payable_total' => 'К оплате: :total',
'credit' => 'Кредит',

'confirm' => [
'title' => 'Оплатить?',
'price' => 'Вы уверены, что хотите купить корзину за :price?',
],

'errors' => [
'money' => 'У вас недостаточно средств для покупки.',
'execute' => 'Произошла ошибка при оплате, покупка отменена.',
],
],

'coupons' => [
'title' => 'Купоны',
'add' => 'Добавить купон',
'error' => 'Купон не существует, истёк или больше не может быть использован.',
'cumulate' => 'Вы не можете использовать этот купон с другим.',
],

'payment' => [
'title' => 'Оплата',
'manual' => 'Ручная оплата',

'empty' => 'Нет доступных методов оплаты.',

'info' => 'Покупка №:id на :website: :items',
'subscription' => ':package - Подписка (Пользователь #:user)',
'error' => 'Не удалось выполнить платеж, попробуйте позже.',
'giftcards' => 'Подарочные карты',

'success' => 'Платеж завершён, вы получите покупку в игре менее чем через минуту.',
'pending' => 'Платеж ожидает подтверждения, покупка будет доставлена после подтверждения.',

'webhook' => 'Новый платеж в магазине',
'webhook_info' => 'Сумма: :total, ID: :id (:gateway)',
'webhook_chargeback' => 'Чарджбэк платежа в магазине',
'webhook_refund' => 'Возврат платежа в магазине',
],

'categories' => [
'empty' => 'Эта категория пуста.',
],

'packages' => [
'limit' => 'Вы купили максимальное количество этого товара.',
'requirements' => 'Вы не соответствуете требованиям для покупки этого товара.',
'cumulate' => 'Вы не можете купить этот товар вместе с другим из той же категории в одной покупке.',
'file' => 'Нажмите здесь, чтобы скачать файл :file',
],

'offers' => [
'gateway' => 'Тип оплаты',
'amount' => 'Сумма',

'empty' => 'Нет доступных предложений.',
],

'profile' => [
'payments' => 'Ваши платежи',
'subscriptions' => 'Ваши подписки',
'money' => 'Деньги: :balance',
],

'giftcards' => [
'title' => 'Подарочные карты',
'error' => 'Подарочная карта не существует, истекла или больше не может быть использована.',
'add' => 'Добавить подарочную карту',
'notification' => 'Вы получили подарочную карту, код: :code (:balance).',
'pending' => 'Платеж для этой карты уже начат. Завершите платеж или подождите несколько минут.',
],
];
10 changes: 10 additions & 0 deletions resources/views/admin/settings.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,16 @@
<div id="moneyLabel" class="form-text">{{ trans('shop::admin.settings.use_site_money_info') }}</div>
</div>

<div class="mb-3 form-check form-switch">
<input type="checkbox" class="form-check-input" id="cartAuthSwitch" name="cart_auth" @checked($cartAuth)>
<label class="form-check-label" for="cartAuthSwitch">Разрешить регистрацию в корзине</label>
</div>

<div class="mb-3 form-check form-switch">
<input type="checkbox" class="form-check-input" id="emailVerificationSwitch" name="email_verification" @checked($emailVerification)>
<label class="form-check-label" for="emailVerificationSwitch">Требовать подтверждение почты</label>
</div>

<div class="mb-3 form-check form-switch">
<input type="checkbox" class="form-check-input" id="homeSwitch" name="enable_home" data-bs-toggle="collapse" data-bs-target="#homeMessage" @checked($enableHome)>
<label class="form-check-label" for="homeSwitch">{{ trans('shop::admin.settings.enable_home') }}</label>
Expand Down
62 changes: 62 additions & 0 deletions resources/views/cart/_auth.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<!-- Форма авторизации и регистрации в корзине -->
<div class="card p-3 mb-4">
@if(oauth_login())
<div class="text-center">
<a href="{{ route('login') }}" class="btn btn-primary btn-lg">
<i class="bi bi-box-arrow-in-right me-1"></i> Войти
</a>
</div>
@else
<div class="row">
<div class="col-md-6 mb-3">
<h5>Вход</h5>
<form method="POST" action="{{ route('login') }}" id="cart-login">
@csrf
<div class="mb-3">
<label class="form-label" for="login-email">Email</label>
<input id="login-email" type="text" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email">
@error('email')<span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>@enderror
</div>
<div class="mb-3">
<label class="form-label" for="login-password">Пароль</label>
<input id="login-password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">
@error('password')<span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>@enderror
</div>
<div class="mb-3 form-check">
<input class="form-check-input" type="checkbox" name="remember" id="login-remember" @checked(old('remember'))>
<label class="form-check-label" for="login-remember">Запомнить меня</label>
</div>
@includeWhen($captchaLogin, 'elements.captcha', ['center' => true])
<button type="submit" class="btn btn-primary w-100">Войти</button>
</form>
</div>
<div class="col-md-6 mb-3">
<h5>Регистрация</h5>
<form method="POST" action="{{ route('shop.cart.register') }}" id="cart-register">
@csrf
<div class="mb-3">
<label class="form-label" for="register-name">Имя</label>
<input id="register-name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name">
@error('name')<span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>@enderror
</div>
<div class="mb-3">
<label class="form-label" for="register-email">Email</label>
<input id="register-email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email">
@error('email')<span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>@enderror
</div>
<div class="mb-3">
<label class="form-label" for="register-password">Пароль</label>
<input id="register-password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password">
@error('password')<span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>@enderror
</div>
<div class="mb-3">
<label class="form-label" for="register-password-confirm">Подтверждение пароля</label>
<input id="register-password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
</div>
@includeWhen($captchaRegister, 'elements.captcha', ['center' => true])
<button type="submit" class="btn btn-primary w-100">Зарегистрироваться</button>
</form>
</div>
</div>
@endif
</div>
23 changes: 15 additions & 8 deletions resources/views/cart/index.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@

<div class="card">
<div class="card-body">
@if(auth()->guest() && setting('shop.cart_auth'))
@include('shop::cart._auth')
@endif
@if(! $cart->isEmpty())
<form action="{{ route('shop.cart.update') }}" method="POST">
@csrf
Expand Down Expand Up @@ -212,15 +215,19 @@
<i class="bi bi-arrow-left"></i> {{ trans('shop::messages.cart.back') }}
</a>

@if(use_site_money())
<button type="button" class="btn btn-primary ms-auto" data-bs-toggle="modal" data-bs-target="#confirmBuyModal">
{{ trans('shop::messages.buy') }}
</button>
@auth
@if(use_site_money())
<button type="button" class="btn btn-primary ms-auto" data-bs-toggle="modal" data-bs-target="#confirmBuyModal">
{{ trans('shop::messages.buy') }}
</button>
@else
<button type="submit" class="btn btn-primary ms-auto">
<i class="bi bi-cart-check"></i> {{ trans('shop::messages.cart.checkout') }}
</button>
@endif
@else
<button type="submit" class="btn btn-primary ms-auto">
<i class="bi bi-cart-check"></i> {{ trans('shop::messages.cart.checkout') }}
</button>
@endif
<span class="ms-auto align-self-center text-muted">Войдите, чтобы оплатить</span>
@endauth
</div>
</form>
</div>
Expand Down
26 changes: 23 additions & 3 deletions resources/views/packages/show.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,29 @@
</form>
@endif
@else
<div class="alert alert-info" role="alert">
{{ trans('shop::messages.cart.guest') }}
</div>
<form action="{{ route('shop.packages.buy', $package) }}" method="POST" class="row row-cols-lg-auto g-0 gy-2 align-items-center">
@csrf

@if($package->custom_price)
<label for="price">{{ trans('shop::messages.fields.price') }}</label>

<div class="mx-3">
<input type="number" min="{{ $package->getPrice() }}" size="5" class="form-control" name="price" id="price" value="{{ $package->price }}">
</div>
@endif

@if($package->has_quantity)
<label for="quantity">{{ trans('shop::messages.fields.quantity') }}</label>

<div class="mx-3">
<input type="number" min="1" max="{{ $package->getMaxQuantity() }}" size="5" class="form-control" name="quantity" id="quantity" value="1" required>
</div>
@endif

<button type="submit" class="btn btn-primary">
{{ trans('shop::messages.buy') }}
</button>
</form>
@endauth
</div>
</div>
Expand Down
8 changes: 5 additions & 3 deletions routes/web.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use Azuriom\Plugin\Shop\Controllers\PaymentController;
use Azuriom\Plugin\Shop\Controllers\ProfileController;
use Azuriom\Plugin\Shop\Controllers\SubscriptionController;
use Azuriom\Plugin\Shop\Controllers\CartAuthController;
use Illuminate\Support\Facades\Route;

/*
Expand All @@ -30,11 +31,11 @@

Route::resource('packages', PackageController::class)->only('show');

Route::prefix('packages/{package}')->name('packages.')->middleware('auth')->group(function () {
Route::prefix('packages/{package}')->name('packages.')->group(function () {
Route::post('/buy', [PackageController::class, 'buy'])->name('buy');
Route::get('/options', [PackageController::class, 'showVariables']);
Route::post('/options', [PackageController::class, 'buy'])->name('variables');
Route::get('/files/{file}', [PackageController::class, 'downloadFile'])->name('file');
Route::get('/files/{file}', [PackageController::class, 'downloadFile'])->middleware('auth')->name('file');
});

Route::prefix('offers')->name('offers.')->middleware('verified')->group(function () {
Expand All @@ -43,9 +44,10 @@
Route::post('/{offer:id}/{gateway:type}', [OfferController::class, 'pay'])->name('pay');
});

Route::prefix('cart')->name('cart.')->middleware('auth')->group(function () {
Route::prefix('cart')->name('cart.')->group(function () {
Route::get('/', [CartController::class, 'index'])->name('index');
Route::post('/', [CartController::class, 'update'])->name('update');
Route::post('/register', [CartAuthController::class, 'register'])->name('register');
// TODO Match multiple methods is not really good here...
Route::match(['GET', 'POST'], '/remove/{package}', [CartController::class, 'remove'])->name('remove');
Route::post('/clear', [CartController::class, 'clear'])->name('clear');
Expand Down
4 changes: 4 additions & 0 deletions src/Controllers/Admin/SettingController.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ public function show()
'enableHome' => setting('shop.home.enabled', true),
'homeMessage' => setting('shop.home', ''),
'termsRequired' => old('terms_required', setting('shop.required_terms') !== null),
'cartAuth' => setting('shop.cart_auth', false),
'emailVerification' => setting('shop.email_verification', true),
]);
}

Expand Down Expand Up @@ -65,6 +67,8 @@ public function save(Request $request)
'shop.webhook' => $request->input('webhook'),
'shop.home' => $request->input('home_message'),
'shop.home.enabled' => $request->has('enable_home'),
'shop.cart_auth' => $request->has('cart_auth'),
'shop.email_verification' => $request->has('email_verification'),
'shop.commands' => is_array($commands) ? json_encode($commands) : null,
'shop.required_terms' => $request->filled('terms_required') ? $request->input('terms') : null,
]);
Expand Down
Loading