Send ETTN payment type and label explicitly, verify receipt total

Payments now carry type=ETTN / label=Експрес-накладна instead of relying on
Checkbox defaults; body build fails fast if goods - discounts - prepayment
does not equal the COD amount.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-24 13:33:29 +03:00
co-authored by Claude Opus 5.5
parent cedcd3caff
commit 089e0a4011
2 changed files with 62 additions and 2 deletions
+23 -1
View File
@@ -48,6 +48,10 @@ NP_FINAL_STATUS_CODES = frozenset(
{"2", "9", "10", "11", "102", "103", "105", "106", "108"}
)
# Способ оплаты в ЕТТН-чеке (`ETTNPaymentSchema`).
ETTN_PAYMENT_TYPE = "ETTN"
ETTN_PAYMENT_LABEL = "Експрес-накладна"
# Статус Checkbox → наш статус. CREATED не меняет ничего.
_CHECKBOX_TO_STATUS = {
EttnStatus.DONE: ReceiptStatus.DONE,
@@ -163,9 +167,27 @@ def build_ettn_body(
}
)
# Последняя страховка перед отправкой: сумма чека (товары − скидки − предоплата)
# обязана совпасть с оплатой по ЕТТН, иначе Checkbox не сможет фискализировать.
receipt_total = goods_total - order_discount - amounts.prepayment_kopecks
if receipt_total != amounts.cod_kopecks:
raise ReceiptValidationError(
f"Сумма чека {receipt_total / 100:.2f} ₴ ≠ наложка {amounts.cod_kopecks / 100:.2f} ₴"
)
receipt_body: dict[str, Any] = {
"goods": goods,
"payments": [{"value": amounts.cod_kopecks, "ettn": order.waybill_number}],
# Оплата «Експрес-накладна»: деньги примет НП при выдаче посылки,
# тогда Checkbox и фискализирует чек. Тип и подпись — явно, не полагаясь
# на значения по умолчанию Checkbox.
"payments": [
{
"type": ETTN_PAYMENT_TYPE,
"label": ETTN_PAYMENT_LABEL,
"value": amounts.cod_kopecks,
"ettn": order.waybill_number,
}
],
}
if discounts:
receipt_body["discounts"] = discounts