Добавлены операции с кошельком клиента: пополнение и возврат
- Добавлены view wallet_deposit и wallet_withdraw с защитой (login_required, is_staff, CSRF) - Новые маршруты: /customers/<pk>/wallet/deposit/ и /customers/<pk>/wallet/withdraw/ - UI на странице клиента: две симметричные формы для пополнения и списания баланса - Пополнение: произвольная сумма с обязательным описанием (подарки, компенсации) - Возврат/списание: с ограничением макс. суммы = текущий баланс, обязательное описание - Все операции логируются в WalletTransaction с типом 'adjustment' - Защита от операций с системным клиентом - Компактный симметричный дизайн форм с фиксированной высотой подсказок
This commit is contained in:
@@ -82,6 +82,82 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Операции с кошельком -->
|
||||
<div class="col-md-12">
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h5>Операции с кошельком клиента</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<!-- Пополнение -->
|
||||
<div class="col-md-6">
|
||||
<h6 class="text-success mb-3"><i class="bi bi-plus-circle"></i> Пополнение кошелька</h6>
|
||||
<form method="post" action="{% url 'customers:wallet-deposit' customer.pk %}">
|
||||
{% csrf_token %}
|
||||
<div class="mb-3">
|
||||
<label for="wallet_deposit_amount" class="form-label">Сумма, руб.</label>
|
||||
<input type="number"
|
||||
step="0.01"
|
||||
min="0.01"
|
||||
class="form-control"
|
||||
id="wallet_deposit_amount"
|
||||
name="amount"
|
||||
placeholder="0.00"
|
||||
required>
|
||||
<div style="height: 1.25rem;"></div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="wallet_deposit_description" class="form-label">Описание (обязательно)</label>
|
||||
<textarea class="form-control"
|
||||
id="wallet_deposit_description"
|
||||
name="description"
|
||||
rows="2"
|
||||
placeholder="Например: Подарок, компенсация за некачественный товар"
|
||||
required></textarea>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-success w-100"><i class="bi bi-plus-circle"></i> Пополнить кошелёк</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Возврат / списание -->
|
||||
<div class="col-md-6">
|
||||
<h6 class="text-danger mb-3"><i class="bi bi-dash-circle"></i> Возврат / списание с кошелька</h6>
|
||||
<form method="post" action="{% url 'customers:wallet-withdraw' customer.pk %}">
|
||||
{% csrf_token %}
|
||||
<div class="mb-3">
|
||||
<label for="wallet_withdraw_amount" class="form-label">Сумма, руб.</label>
|
||||
<input type="number"
|
||||
step="0.01"
|
||||
min="0.01"
|
||||
max="{{ customer.wallet_balance }}"
|
||||
class="form-control"
|
||||
id="wallet_withdraw_amount"
|
||||
name="amount"
|
||||
placeholder="0.00"
|
||||
required>
|
||||
<small class="text-muted d-block" style="height: 1.25rem; line-height: 1.25rem;">Макс: {{ customer.wallet_balance|floatformat:2 }} руб.</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="wallet_withdraw_description" class="form-label">Описание (обязательно)</label>
|
||||
<textarea class="form-control"
|
||||
id="wallet_withdraw_description"
|
||||
name="description"
|
||||
rows="2"
|
||||
placeholder="Например: Возврат наличными, перевод на карту клиента"
|
||||
required></textarea>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-danger w-100"><i class="bi bi-dash-circle"></i> Списать с кошелька</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="alert alert-info mb-0 mt-3">
|
||||
<i class="bi bi-info-circle"></i> Все операции с кошельком автоматически логируются в истории транзакций ниже.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- История транзакций кошелька -->
|
||||
<div class="col-md-12">
|
||||
<div class="card mb-4">
|
||||
|
||||
Reference in New Issue
Block a user