fix: update recept

This commit is contained in:
2026-05-09 10:57:02 +03:00
parent 195c0a8e53
commit ea0ca899ac
7 changed files with 59 additions and 37 deletions

View File

@@ -49,6 +49,21 @@ class CreatePaymentCloudkassirCommand:
email = str(user.email or '').strip() email = str(user.email or '').strip()
if not email: if not email:
raise ApplicationException(status_code=400, message='User email missing') raise ApplicationException(status_code=400, message='User email missing')
supplier_name = ' '.join(
part
for part in (
str(user.last_name or '').strip(),
str(user.first_name or '').strip(),
str(user.middle_name or '').strip(),
)
if part
)
if not supplier_name:
raise ApplicationException(status_code=400, message='User full name missing')
supplier_inn = str(user.inn or '').strip()
if not supplier_inn:
raise ApplicationException(status_code=400, message='User inn missing')
phone = str(user.phone or '').strip() or None
paid_total = _parse_money(payment.amount) paid_total = _parse_money(payment.amount)
if paid_total is None: if paid_total is None:
@@ -100,6 +115,9 @@ class CreatePaymentCloudkassirCommand:
total_amount=total_amount, total_amount=total_amount,
principal_amount=principal_amount, principal_amount=principal_amount,
service_fee=service_fee, service_fee=service_fee,
phone=phone,
supplier_name=supplier_name,
supplier_inn=supplier_inn,
request_id=str(ULID()), request_id=str(ULID()),
) )
receipt_model = receipt_response.get('Model') receipt_model = receipt_response.get('Model')

View File

@@ -1,4 +1,4 @@
from typing import Protocol, Optional, Callable from typing import Any,Callable,Optional,Protocol
from src.application.domain.enums.log_format import LogFormat from src.application.domain.enums.log_format import LogFormat
from src.application.domain.enums.log_level import LogLevel from src.application.domain.enums.log_level import LogLevel
@@ -43,26 +43,26 @@ class ILogger(Protocol):
"""Get current service instance id""" """Get current service instance id"""
... ...
def debug(self, message: str) -> None: def debug(self, message: Any) -> None:
"""Log debug message""" """Log debug message"""
... ...
def info(self, message: str) -> None: def info(self, message: Any) -> None:
"""Log info message""" """Log info message"""
... ...
def warning(self, message: str) -> None: def warning(self, message: Any) -> None:
"""Log warning message""" """Log warning message"""
... ...
def error(self, message: str) -> None: def error(self, message: Any) -> None:
"""Log error message""" """Log error message"""
... ...
def critical(self, message: str) -> None: def critical(self, message: Any) -> None:
"""Log critical message""" """Log critical message"""
... ...
def exception(self, message: str) -> None: def exception(self, message: Any) -> None:
"""Log exception with traceback""" """Log exception with traceback"""
... ...

View File

@@ -15,7 +15,8 @@ class IReceipt(ABC):
principal_amount: Decimal, principal_amount: Decimal,
service_fee: Decimal, service_fee: Decimal,
phone: str | None = None, phone: str | None = None,
customer_inn: str = '', supplier_name: str = '',
supplier_inn: str = '',
success_url: str | None = None, success_url: str | None = None,
fail_url: str | None = None, fail_url: str | None = None,
request_id: str | None = None, request_id: str | None = None,

View File

@@ -41,7 +41,8 @@ class ClaudeKassirClient(IReceipt):
principal_amount: Decimal, principal_amount: Decimal,
service_fee: Decimal, service_fee: Decimal,
phone: str | None = None, phone: str | None = None,
customer_inn: str = '', supplier_name: str = '',
supplier_inn: str = '',
success_url: str | None = None, success_url: str | None = None,
fail_url: str | None = None, fail_url: str | None = None,
request_id: str | None = None, request_id: str | None = None,
@@ -68,15 +69,15 @@ class ClaudeKassirClient(IReceipt):
'amount': float(principal), 'amount': float(principal),
'vat': 0, 'vat': 0,
'method': 4, 'method': 4,
'object': 1, 'object': 4,
'measurement_unit': 'шт', 'measurement_unit': 'шт',
'agent_info': { 'agent_info': {
'type': 6, 'type': 6,
}, },
'supplier_info': { 'supplier_info': {
'name': 'Принципал', 'phones': [phone] if phone else [],
'phones': [], 'name': supplier_name,
'inn': self._inn, 'inn': supplier_inn,
}, },
}, },
{ {
@@ -99,7 +100,7 @@ class ClaudeKassirClient(IReceipt):
'email': email, 'email': email,
'phone': phone, 'phone': phone,
}, },
'Email': 'company@elcsa.ru', 'Email': email,
'SuccessUrl': success_url or self._success_url, 'SuccessUrl': success_url or self._success_url,
'FailUrl': fail_url or self._fail_url, 'FailUrl': fail_url or self._fail_url,
} }

View File

@@ -59,7 +59,7 @@ class Logger(ILogger):
def clear_trace_id(self) -> None: def clear_trace_id(self) -> None:
trace_id_var.set("N/A") trace_id_var.set("N/A")
def _prepare_log_data(self, level: LogLevel, message: str) -> dict[str, Any]: def _prepare_log_data(self, level: LogLevel, message: Any) -> dict[str, Any]:
current_frame = inspect.currentframe() current_frame = inspect.currentframe()
if ( if (
current_frame current_frame
@@ -75,21 +75,24 @@ class Logger(ILogger):
line_number = 0 line_number = 0
log_data = { log_data = {
"timestamp": datetime.now().isoformat(), 'timestamp': datetime.now().isoformat(),
"level": level.name, 'level': level.name,
"instance_id": self.instance_id, 'instance_id': self.instance_id,
"file": filename, 'file': filename,
"line": line_number, 'line': line_number,
"trace_id": trace_id_var.get(), 'trace_id': trace_id_var.get(),
"message": message,
} }
if isinstance(message, dict):
log_data.update(message)
else:
log_data['message'] = message
if level == LogLevel.EXCEPTION: if level == LogLevel.EXCEPTION:
log_data["exception"] = traceback.format_exc() log_data['exception'] = traceback.format_exc()
return log_data return log_data
def _log(self, level: LogLevel, message: str) -> None: def _log(self, level: LogLevel, message: Any) -> None:
if level >= self.min_level: if level >= self.min_level:
log_data = self._prepare_log_data(level, message) log_data = self._prepare_log_data(level, message)
@@ -100,9 +103,9 @@ class Logger(ILogger):
f"{log_data['timestamp']} - {log_data['level']} - " f"{log_data['timestamp']} - {log_data['level']} - "
f"{log_data['instance_id']} - {log_data['trace_id']} - " f"{log_data['instance_id']} - {log_data['trace_id']} - "
f"{log_data['file']}:{log_data['line']} - " f"{log_data['file']}:{log_data['line']} - "
f"{log_data['message']}" f"{log_data.get('message', log_data.get('event', ''))}"
) )
if "exception" in log_data: if 'exception' in log_data:
log_message += f"\nTraceback:\n{log_data['exception']}" log_message += f"\nTraceback:\n{log_data['exception']}"
self._write(log_message) self._write(log_message)
@@ -110,20 +113,20 @@ class Logger(ILogger):
def _write(self, message: str) -> None: def _write(self, message: str) -> None:
sys.stdout.write(message + "\n") sys.stdout.write(message + "\n")
def debug(self, message: str) -> None: def debug(self, message: Any) -> None:
self._log(LogLevel.DEBUG, message) self._log(LogLevel.DEBUG, message)
def info(self, message: str) -> None: def info(self, message: Any) -> None:
self._log(LogLevel.INFO, message) self._log(LogLevel.INFO, message)
def warning(self, message: str) -> None: def warning(self, message: Any) -> None:
self._log(LogLevel.WARNING, message) self._log(LogLevel.WARNING, message)
def error(self, message: str) -> None: def error(self, message: Any) -> None:
self._log(LogLevel.ERROR, message) self._log(LogLevel.ERROR, message)
def critical(self, message: str) -> None: def critical(self, message: Any) -> None:
self._log(LogLevel.CRITICAL, message) self._log(LogLevel.CRITICAL, message)
def exception(self, message: str) -> None: def exception(self, message: Any) -> None:
self._log(LogLevel.EXCEPTION, message) self._log(LogLevel.EXCEPTION, message)

View File

@@ -1,5 +1,4 @@
from fastapi import Depends from fastapi import Depends
import orjson
from faststream.rabbit.fastapi import RabbitMessage,RabbitRouter from faststream.rabbit.fastapi import RabbitMessage,RabbitRouter
from pydantic import BaseModel from pydantic import BaseModel
from src.application.contracts import ILogger from src.application.contracts import ILogger
@@ -28,12 +27,12 @@ async def crypto_transfer_completed_handler(
token=trace_id_var.set(trace_id) token=trace_id_var.set(trace_id)
try: try:
payload=msg_body.model_dump(mode='json') payload=msg_body.model_dump(mode='json')
logger.info(orjson.dumps({ logger.info({
'event':'crypto_transfer_completed_received', 'event':'crypto_transfer_completed_received',
'payload':payload, 'payload':payload,
'rabbit_message_id':message.message_id, 'rabbit_message_id':message.message_id,
'rabbit_correlation_id':message.correlation_id, 'rabbit_correlation_id':message.correlation_id,
},default=str).decode()) })
finally: finally:
trace_id_var.reset(token) trace_id_var.reset(token)

View File

@@ -66,7 +66,7 @@ async def create_order(
'itpay_id': o.itpay_id, 'itpay_id': o.itpay_id,
'order_status': o.status.value if o.status is not None else None, 'order_status': o.status.value if o.status is not None else None,
} }
logger.info(orjson.dumps(log_ids, default=str).decode()) logger.info(log_ids)
return ORJSONResponse(content=content, status_code=http_code) return ORJSONResponse(content=content, status_code=http_code)
@@ -97,7 +97,7 @@ async def itpay_webhook(
'payment_status': status, 'payment_status': status,
'itpay_metadata': data.get('metadata'), 'itpay_metadata': data.get('metadata'),
} }
logger.info(orjson.dumps(log_payload, default=str).decode()) logger.info(log_payload)
if status == 'completed': if status == 'completed':
payment = ItpayPaymentData.model_validate(data) payment = ItpayPaymentData.model_validate(data)
await payment_command(payment) await payment_command(payment)