diff --git a/src/mail_order_bot/configs/amtel.club.yml b/src/mail_order_bot/configs/amtel.club.yml index 24af454..19a2ab0 100644 --- a/src/mail_order_bot/configs/amtel.club.yml +++ b/src/mail_order_bot/configs/amtel.club.yml @@ -1,4 +1,5 @@ pipeline: + - # Настраиваем парсинг экселя - handler: BasicExcelParser config: @@ -12,9 +13,10 @@ pipeline: quantity: "Кол-во" total: "Сумма" - + # Запрос остатков со склада - handler: GetStock + # Определяем логику обработки заказа (в данном случае все с локального склада) - handler: LocalStoreOrder @@ -23,3 +25,5 @@ pipeline: + + diff --git a/src/mail_order_bot/email_processor/handlers/logic/order_acceptance_criteria.py b/src/mail_order_bot/email_processor/handlers/logic/order_acceptance_criteria.py new file mode 100644 index 0000000..3b1b04d --- /dev/null +++ b/src/mail_order_bot/email_processor/handlers/logic/order_acceptance_criteria.py @@ -0,0 +1,24 @@ +import random +import logging +from mail_order_bot.email_processor.handlers.abstract_task import AbstractTask +from mail_order_bot.email_processor.order.auto_part_order import OrderStatus +from mail_order_bot.email_processor.order.auto_part_position import AutoPartPosition, PositionStatus +from decimal import Decimal +import random +logger = logging.getLogger(__name__) + + +class LocalStoreOrder(AbstractTask): + """Сейчас логика такая + - ищем на складе наш сапплиер код, берем самую дешевую позицию и делаем заказ из нее + + Другие чуть более дорогие не рассматриваем + + """ + # это код нашего склада + + def do(self) -> None: + attachments = self.context.data["attachments"] + for attachment in attachments: + order = attachment["order"] + diff --git a/src/mail_order_bot/email_processor/order/auto_part_order.py b/src/mail_order_bot/email_processor/order/auto_part_order.py index 816bf93..968b4a9 100644 --- a/src/mail_order_bot/email_processor/order/auto_part_order.py +++ b/src/mail_order_bot/email_processor/order/auto_part_order.py @@ -18,6 +18,7 @@ class AutoPartOrder: self.status = OrderStatus.NEW self.delivery_period = 0 self.reason = "" + self.errors = [] def add_position(self, position: AutoPartPosition) -> None: self.positions.append(position) @@ -32,10 +33,23 @@ class AutoPartOrder: def set_delivery_period(self, delivery_period: int) -> None: self.delivery_period = delivery_period - +ы def fill_from_local_supplier(self) -> None: for position in self.positions: - position.fill_from_local_supplier() + errors = position.fill_from_local_supplier() + self.errors += errors + + def check_order(self, config) -> None: + # 1. Проверка общего количества отказов + order_refusal_threshold = config.get("order_refusal_threshold", 1) + refusal_positions_count = len([position for position in self.positions if str(position.status) in + [PositionStatus.REFUSED, PositionStatus.STOCK_FAILED]]) + + order_refusal_rate = refusal_positions_count / len(self.positions) + if order_refusal_rate > order_refusal_threshold: + self.errors.append(f"Превышен порог отказов в заказе - {order_refusal_rate:.0%} " + f"({refusal_positions_count} из {len(self.positions)})") + self.status = OrderStatus.OPERATOR_REQUIRED def __len__(self): diff --git a/src/mail_order_bot/email_processor/order/auto_part_position.py b/src/mail_order_bot/email_processor/order/auto_part_position.py index 8ae9f03..d024991 100644 --- a/src/mail_order_bot/email_processor/order/auto_part_position.py +++ b/src/mail_order_bot/email_processor/order/auto_part_position.py @@ -57,7 +57,7 @@ class AutoPartPosition: def fill_from_local_supplier(self): if self.status != PositionStatus.STOCK_RECIEVED: - return + return [] supplier_stock_items = [item for item in self.stock if str(item["supplierCode"]) == self.SUPPLIER_CODE] supplier_stock_items.sort(key=lambda item: Decimal(item["price"]), reverse=False) @@ -71,11 +71,25 @@ class AutoPartPosition: self.order_quantity = self.requested_quantity self.status = PositionStatus.READY self.desc = "Готов к заказу" + self._set_price(supplier_stock_items[0]) else: self.order_quantity = supplier_stock_items[0]["availability"] + self.status = PositionStatus.READY self.status = PositionStatus.READY_PARTIAL self.desc = "Частичный остаток" + self._set_price(supplier_stock_items[0]) + + def _set_price(self, stok_item: Dict[str, Any]): + stok_item_price = Decimal(stok_item["price"]) + if stok_item_price <= self.requested_price: + self.order_price = stok_item_price + else: + self.status = PositionStatus.REFUSED + self.desc = "Превышение по цене" + + +