Исправлена форма заказа: две колонки и корректная работа кнопки сохранения
- Разделен экран на две колонки: заказ слева, оплата справа - Форма оплаты вынесена за пределы основной формы заказа (устранена проблема вложенных форм) - Исправлен метод calculate_total() для сохранения итоговой суммы в БД - Добавлена модель Transaction для учета платежей и возвратов - Добавлена модель PaymentMethod для методов оплаты - Удалена старая модель Payment, заменена на Transaction - Добавлен TransactionService для управления транзакциями - Обновлен интерфейс форм оплаты для правой колонки - Кнопка 'Сохранить изменения' теперь работает корректно
This commit is contained in:
76
myproject/orders/models/payment_method.py
Normal file
76
myproject/orders/models/payment_method.py
Normal file
@@ -0,0 +1,76 @@
|
||||
from django.db import models
|
||||
from accounts.models import CustomUser
|
||||
|
||||
|
||||
class PaymentMethod(models.Model):
|
||||
"""
|
||||
Способ оплаты заказа.
|
||||
Справочник для управления доступными методами оплаты.
|
||||
"""
|
||||
|
||||
# Код для программного доступа
|
||||
code = models.SlugField(
|
||||
unique=True,
|
||||
max_length=50,
|
||||
verbose_name="Код способа оплаты",
|
||||
help_text="Уникальный идентификатор (например: 'cash_to_courier', 'card_to_courier')"
|
||||
)
|
||||
|
||||
# Отображаемое название
|
||||
name = models.CharField(
|
||||
max_length=100,
|
||||
verbose_name="Название способа оплаты"
|
||||
)
|
||||
|
||||
# Описание
|
||||
description = models.TextField(
|
||||
blank=True,
|
||||
verbose_name="Описание",
|
||||
help_text="Дополнительная информация о способе оплаты"
|
||||
)
|
||||
|
||||
# Активность
|
||||
is_active = models.BooleanField(
|
||||
default=True,
|
||||
verbose_name="Активен",
|
||||
help_text="Отключенные способы оплаты не отображаются при создании заказа"
|
||||
)
|
||||
|
||||
# Порядок отображения
|
||||
order = models.PositiveIntegerField(
|
||||
default=0,
|
||||
verbose_name="Порядок отображения"
|
||||
)
|
||||
|
||||
# Системный флаг
|
||||
is_system = models.BooleanField(
|
||||
default=False,
|
||||
verbose_name="Системный",
|
||||
help_text="Системные способы оплаты нельзя удалить через интерфейс"
|
||||
)
|
||||
|
||||
# Аудит
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
created_by = models.ForeignKey(
|
||||
CustomUser,
|
||||
on_delete=models.SET_NULL,
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name='created_payment_methods',
|
||||
verbose_name="Создано"
|
||||
)
|
||||
|
||||
class Meta:
|
||||
verbose_name = "Способ оплаты"
|
||||
verbose_name_plural = "Способы оплаты"
|
||||
ordering = ['order', 'name']
|
||||
indexes = [
|
||||
models.Index(fields=['code']),
|
||||
models.Index(fields=['is_active']),
|
||||
models.Index(fields=['order']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
Reference in New Issue
Block a user