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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user