Домен: Платежи¶
Создание и чтение документов оплаты, привязка к заказ-нарядам.
—
Схема связей¶
document_out
│
└── payment_out.document_out_id ──► payment
│
├── payment.wallet_id ──► wallet
├── payment.payment_type_id ──► payment_type
│
└── payment_action.payment_id
(журнал аудита,
action_type=0/1/-1)
Примечание
Таблицы payment_document, money_document_detail,
money_document_payment существуют в БД (бухгалтерские проводки
«Поступление от клиента», ЗП и т.п.), но create_payment() их
не создаёт — ручные заказ-наряды АвтоМойки тоже не создают
(0/272 в проде). Проводки генерируются отдельно при закрытии
кассовой смены или выгрузке в 1С; параллельное создание
приводило бы к двойному учёту.
—
ORM-модели¶
Payment¶
Таблица payment — основная запись платежа.
Поле |
Тип |
Описание |
|---|---|---|
|
|
Первичный ключ |
|
|
Способ оплаты ( |
|
|
Касса/счёт списания ( |
|
|
Сумма платежа |
|
|
Дата и время платежа |
|
|
Метазапись связанного документа |
|
|
Примечание |
PaymentOut¶
Таблица payment_out — связь «платёж ↔ document_out» (многие-ко-многим).
Поле |
Тип |
Описание |
|---|---|---|
|
|
Первичный ключ |
|
|
Заказ-наряд |
|
|
Платёж |
PaymentAction¶
Таблица payment_action — журнал аудита операций с платежом.
create_payment() создаёт одну запись с action_type=0 (создание).
Поле |
Тип |
Описание |
|---|---|---|
|
|
Первичный ключ |
|
|
Платёж |
|
|
Кто совершил действие |
|
|
Способ оплаты (на момент действия) |
|
|
Сумма (на момент действия) |
|
|
|
|
|
Когда произошло действие ( |
|
|
Дата самого платежа (не действия) |
|
|
Связанный заказ-наряд |
PaymentDocument¶
Таблица payment_document — связь «платёж ↔ document_registry».
Предупреждение
create_payment() не создаёт эту запись. Описание ниже — для
справки: такие записи могут быть в БД от других путей (импорт,
выгрузка в 1С, специфические сценарии УФ).
Поле |
Тип |
Описание |
|---|---|---|
|
|
Первичный ключ |
|
|
Метазапись документа |
|
|
Платёж |
PaymentType¶
Таблица payment_type — справочник способов оплаты.
|
Название |
|---|---|
1 |
Наличный расчет |
2 |
Безналичный расчет |
7 |
Банковская карта |
Wallet¶
Таблица wallet — кассы и счета организации.
Поле |
Тип |
Описание |
|---|---|---|
|
|
Первичный ключ |
|
|
Название (напр. «Наличный расчет», «СберБанк») |
|
|
Организация-владелец |
MoneyDocumentDetail¶
Таблица money_document_detail — бухгалтерская проводка.
Предупреждение
create_payment() не создаёт эту запись (см. примечание в
«Схема связей»). Данные здесь появляются через другие процессы:
закрытие кассовой смены, импорт выписок, начисление ЗП.
Поле |
Тип |
Описание |
|---|---|---|
|
|
Первичный ключ |
|
|
Заказ-наряд |
|
|
Касса/счёт |
|
|
Способ оплаты |
|
|
Статья (3=«Поступление от клиента») |
MoneyDocumentPayment¶
Таблица money_document_payment — связь проводки с платежом.
Поле |
Тип |
Описание |
|---|---|---|
|
|
Первичный ключ |
|
|
Проводка |
|
|
Платёж |
—
Высокоуровневые действия (actions.payment)¶
Справочники¶
- autodealer.actions.payment.get_wallets(organization_id)¶
Кошельки организации.
- Результат:
list[WalletInfo]
from autodealer.actions.payment import get_wallets for w in get_wallets(1): print(w.wallet_id, w.name)
- autodealer.actions.payment.get_payment_types()¶
Активные способы оплаты.
- Результат:
list[PaymentTypeInfo]
Чтение¶
- autodealer.actions.payment.get_payments(document_out_id)¶
Все платежи по заказ-наряду.
- Параметры:
document_out_id (int) – PK заказ-наряда.
- Результат:
list[PaymentRecord]
from autodealer.actions.payment import get_payments for p in get_payments(42): print(p.payment_id, p.summa, p.payment_type_name, p.wallet_name)
Создание платежа¶
- autodealer.actions.payment.create_payment(*, document_out_id, summa, wallet_id, payment_type_id, payment_date=None, notes=None, created_by_user_id=1)¶
Создать платёж. В одной транзакции:
payment— запись платежа.payment_out— привязка кdocument_out.payment_action— запись в журнал (action_type=0).UPDATE document_out.date_payment.
К
payment.notesавтоматически добавляется маркерBOT_NOTE_MARKER("Добавлено ботом") — даже если параметрnotesне передан. По этому маркеруdelete_service_order()отличает автоматические платежи от ручных при каскадном удалении.- Параметры:
document_out_id (int) – PK заказ-наряда.
summa (float) – Сумма.
wallet_id (int) – FK в
wallet.payment_type_id (int) – FK в
payment_type.payment_date (datetime) – По умолчанию — текущее время.
notes (str) – Примечание. К любому значению дописывается маркер бота (см. выше).
created_by_user_id (int) – Записывается в
payment_action.user_id.
- Результат:
payment_id.- Тип результата:
int
- Исключение:
ValueError – Если заказ-наряд не найден.
from autodealer.actions.payment import create_payment, BOT_NOTE_MARKER payment_id = create_payment( document_out_id=42, summa=2300.0, wallet_id=1, # Наличный расчёт payment_type_id=1, ) # payment.notes теперь = "Добавлено ботом"
- autodealer.actions.payment.BOT_NOTE_MARKER¶
Строковая константа
"Добавлено ботом", автоматически добавляется кpayment.notesфункциейcreate_payment(). Используетсяdelete_service_order()для безопасного каскадного удаления «ботовых» платежей приhard=True.
Удаление платежа¶
- autodealer.actions.payment.delete_payment(payment_id)¶
Физически удалить платёж со всеми связанными записями в одной транзакции. Порядок удаления:
money_document_payment→money_document_detail→payment_document→payment_action→payment_out→payment.Первые три таблицы
create_payment()не создаёт, ноDELETEоставлен в каскаде — чтобы корректно сносить старые платежи, созданные до этого изменения или импортированные из других систем.- Исключение:
ValueError – Если платёж не найден.
Разбивка оплаты¶
- autodealer.actions.payment.create_payment_split(*, document_out_id, parts, payment_date=None)¶
Несколько платежей за один заказ-наряд. Удобно когда клиент платит частично наличными, частично картой.
- Параметры:
document_out_id (int) – PK заказ-наряда.
parts (list[PaymentSplitItem]) – Части платежа.
payment_date (datetime) – Единая дата для всех частей.
- Результат:
list[payment_id]- Исключение:
ValueError – Если
partsпустой или сумма <= 0.
from autodealer.actions.payment import create_payment_split, PaymentSplitItem ids = create_payment_split( document_out_id=42, parts=[ PaymentSplitItem(wallet_id=1, payment_type_id=1, summa=1000.0), # наличные PaymentSplitItem(wallet_id=4, payment_type_id=7, summa=1300.0), # карта ], )
—
Типы данных¶
- class autodealer.actions.payment.WalletInfo¶
- wallet_id: int
- name: str
- organization_id: int
- class autodealer.actions.payment.PaymentTypeInfo¶
- payment_type_id: int
- name: str
- class autodealer.actions.payment.PaymentRecord¶
- payment_id: int
- summa: Decimal
- payment_date: datetime
- payment_type_id: int
- payment_type_name: str | None
- wallet_id: int | None
- wallet_name: str | None
- notes: str | None
- class autodealer.actions.payment.PaymentSplitItem¶
- wallet_id: int
- payment_type_id: int
- summa: float
- notes: str | None