import pandas as pd import server.backend.handlers.yandex_handler as yandex_handler import server.backend.handlers.wb_handler as wb_handler import server.backend.handlers.ozon_handler as ozon_handler import server.backend.handlers.ozon_purchases_handler as ozon_purchases_handler import server.backend.handlers.wb_purchases_handler as wb_purchases_handler import server.backend.handlers.ozon_wb_yandex_com_handler as ozon_wb_yandex_com_handler from server.backend.schemas.pydantic import settings from server.backend.api.report import DocumentCreation class BaseHandler: def __init__(self, file_path): self.file_path = file_path self.dfs = self.read() def read(self, skiprows=None, skipfooter=0): try: return pd.read_excel(self.file_path, sheet_name=None, skiprows=skiprows,skipfooter=skipfooter) except Exception as e: raise Exception(f"⚠️ Ошибка при чтении {self.file_path}: {e}") def process(self): raise NotImplementedError class YandexHandler(BaseHandler): def process(self): dfs = self.read(skiprows=[0,1,3]) # проверяем наличие нужных листов if "Получено от потребителей" not in dfs or "Возвращено потребителям" not in dfs: raise Exception(f"В файле {self.file_path.name} отсутствуют необходимые листы") # вызываем функцию evaluating validated_data = yandex_handler.evaluating(dfs) print("Реализация Яндекс завершена, валидированных строк:", len(validated_data[0]), "Реализация", len(validated_data[1]), "Возвраты", validated_data[2], "Дата") doc_creator = DocumentCreation(URL=settings.URL_REPORT) doc_key = doc_creator.create_document( Date=validated_data[2], ВидОперации=settings.TYPE3, Контрагент_Key=settings.CONTRAGENT_YANDEX, ДоговорКонтрагента_Key=settings.CONTRACT_YAN, Организация_Key=settings.COMPANY, Склад_Key=settings.STORE, ДокументБезНДС="false", СуммаВключаетНДС="true", УдержатьВознаграждение="true", СчетУчетаРасчетовПоАвансамПолученным_Key=settings.A76_09, СчетУчетаРасчетовСКонтрагентом_Key=settings.A76_09, СчетУчетаРасчетовПоАвансамВыданным_Key=settings.A60_02, СчетУчетаРасчетовЗаПосредническиеУслуги_Key=settings.A60_01, СтавкаНДСВознаграждения="БезНДС", СчетУчетаЗатрат_Key=settings.A44_01, СчетУчетаНДС_Key=settings.A19_04 ) doc_creator.fill_document_items_report(doc_key, validated_data[0], validated_data[1]) class WBHandler(BaseHandler): def process(self): dfs = self.read() if "Sheet1" not in dfs : raise Exception(f"В файле {self.file_path.name} отсутствуют необходимые листы") validated_data = wb_handler.evaluating(dfs) print("Реализация WB завершена, валидированных строк:", len(validated_data[0]), "Реализация", len(validated_data[1]), "Возвраты", validated_data[2], "Дата") doc_creator = DocumentCreation(URL=settings.URL_REPORT) doc_key = doc_creator.create_document( Date=validated_data[2], ВидОперации=settings.TYPE3, Контрагент_Key=settings.CONTRAGENT_RWB, ДоговорКонтрагента_Key=settings.CONTRACT_RWB, Организация_Key=settings.COMPANY, Склад_Key=settings.STORE, ДокументБезНДС="false", СуммаВключаетНДС="true", УдержатьВознаграждение="true", СчетУчетаРасчетовПоАвансамПолученным_Key=settings.A62_02, СчетУчетаРасчетовСКонтрагентом_Key=settings.A62_01, СчетУчетаРасчетовПоАвансамВыданным_Key=settings.A60_02, СчетУчетаРасчетовЗаПосредническиеУслуги_Key=settings.A60_01, СтавкаНДСВознаграждения="НДС20", СчетУчетаЗатрат_Key=settings.A44_01, СчетУчетаНДС_Key=settings.A19_04 ) doc_creator.fill_document_items_report(doc_key, validated_data[0], validated_data[1]) class OZONHandler(BaseHandler): def process(self): dfs = self.read(skiprows=14, skipfooter=17) if "Отчет о реализации" not in dfs: raise Exception(f"В файле {self.file_path.name} отсутствуют необходимые листы") validated_data = ozon_handler.evaluating(dfs) print("Реализация OZON завершена, валидированных строк:", len(validated_data[0]), "Реализация", len(validated_data[1]), "Возвраты", validated_data[2], "Дата") doc_creator = DocumentCreation(URL=settings.URL_REPORT) doc_key = doc_creator.create_document( Date=validated_data[2], ДатаВходящегоДокумента=validated_data[2], ВидОперации=settings.TYPE3, Контрагент_Key=settings.CONTRAGENT_OZON, ДоговорКонтрагента_Key=settings.CONTRACT_OZON, Организация_Key=settings.COMPANY, Склад_Key=settings.STORE, ДокументБезНДС="false", СуммаВключаетНДС="true", УдержатьВознаграждение="true", СчетУчетаРасчетовПоАвансамПолученным_Key=settings.A62_02, СчетУчетаРасчетовСКонтрагентом_Key=settings.A62_01, СчетУчетаРасчетовПоАвансамВыданным_Key=settings.A60_02, СчетУчетаРасчетовЗаПосредническиеУслуги_Key=settings.A60_01, СтавкаНДСВознаграждения="НДС20", СчетУчетаЗатрат_Key=settings.A44_01, СчетУчетаНДС_Key=settings.A19_04 ) doc_creator.fill_document_items_report(doc_key, validated_data[0], validated_data[1]) class OZONPurchasesHandler(BaseHandler): def process(self): dfs = self.read(skiprows=[0,3,4,5,6,7,8,9,10,11], skipfooter=1) if "Отчёт о выкупленных товарах" not in dfs: raise Exception(f"В файле {self.file_path.name} отсутствуют необходимые листы") validated_data, date = ozon_purchases_handler.evaluating(dfs) print("Выкупы OZON завершены, валидированных строк:", len(validated_data), "Реализация", date, "Дата") doc_creator = DocumentCreation(URL=settings.URL_REALISATION) doc_key = doc_creator.create_document( Date=date, ВидОперации=settings.TYPE1, Контрагент_Key=settings.CONTRAGENT_OZON, ДоговорКонтрагента_Key=settings.CONTRACT_OZON, Организация_Key=settings.COMPANY, ДокументБезНДС="false", СуммаВключаетНДС="true", СчетУчетаРасчетовПоАвансам_Key=settings.A62_02, СчетУчетаРасчетовСКонтрагентом_Key=settings.A62_01, ) doc_creator.fill_document_items_purchase(doc_key, validated_data) class WBPurchasesHandler(BaseHandler): def process(self): dfs = self.read(skiprows=[0,3,4,5,6,7,8], skipfooter=7) if "Sheet1" not in dfs: raise Exception(f"В файле {self.file_path.name} отсутствуют необходимые листы") validated_data, date = wb_purchases_handler.evaluating(dfs) print("Выкупы WB завершены, валидированных строк:", len(validated_data), "Реализация", date, "Дата" ) doc_creator = DocumentCreation(URL=settings.URL_REALISATION) doc_key = doc_creator.create_document( Date=date, ВидОперации=settings.TYPE1, Контрагент_Key=settings.CONTRAGENT_RWB, ДоговорКонтрагента_Key=settings.CONTRACT_RWB1, Организация_Key=settings.COMPANY, ДокументБезНДС="false", СуммаВключаетНДС="true", СчетУчетаРасчетовПоАвансам_Key=settings.A62_02, СчетУчетаРасчетовСКонтрагентом_Key=settings.A62_01 ) doc_creator.fill_document_items_purchase(doc_key, validated_data) class OZONComHandler(BaseHandler): def process(self): dfs = self.read(skipfooter=1) if "Лист_1" not in dfs: raise Exception(f"В файле {self.file_path.name} отсутствуют необходимые листы") df = dfs["Лист_1"] # контрагент cont = df.iloc[1, 0] if cont != "«Интернет решения» ООО": raise Exception(f"В файле {self.file_path.name} неверный контрагент") validated_data, date = ozon_wb_yandex_com_handler.evaluating(dfs) print("Передача на коммисию OZON завершена, валидированных строк:", len(validated_data), "Реализация", date, "Дата") doc_creator = DocumentCreation(URL=settings.URL_REALISATION) doc_key = doc_creator.create_document( Date=date, ВидОперации=settings.TYPE2, Контрагент_Key=settings.CONTRAGENT_OZON, ДоговорКонтрагента_Key=settings.CONTRACT_OZON, Организация_Key=settings.COMPANY, Склад_Key=settings.STORE, ДокументБезНДС="false", СуммаВключаетНДС="true", СчетУчетаРасчетовПоАвансам_Key=settings.A62_02, СчетУчетаРасчетовСКонтрагентом_Key=settings.A62_01 ) doc_creator.fill_document_items_to_real(doc_key, validated_data) class WBComHandler(BaseHandler): def process(self): dfs = self.read(skipfooter=1) if "Лист_1" not in dfs: raise Exception(f"В файле {self.file_path.name} отсутствуют необходимые листы") df = dfs["Лист_1"] # контрагент cont = df.iloc[1, 0] if cont != '"Вайлдберриз" ООО': raise Exception(f"В файле {self.file_path.name} неверный контрагент") validated_data, date = ozon_wb_yandex_com_handler.evaluating(dfs) print("Передача на коммисию WB завершена, валидированных строк:", len(validated_data), "Реализация", date, "Дата") doc_creator = DocumentCreation(URL=settings.URL_REALISATION) doc_key = doc_creator.create_document( Date=date, ВидОперации=settings.TYPE2, Контрагент_Key=settings.CONTRAGENT_RWB, ДоговорКонтрагента_Key=settings.CONTRACT_RWB, Организация_Key=settings.COMPANY, Склад_Key=settings.STORE, ДокументБезНДС="false", СуммаВключаетНДС="true", СчетУчетаРасчетовПоАвансам_Key=settings.A62_02, СчетУчетаРасчетовСКонтрагентом_Key=settings.A76_09 ) doc_creator.fill_document_items_to_real(doc_key, validated_data) class YandexComHandler(BaseHandler): def process(self): dfs = self.read(skipfooter=1) if "Лист_1" not in dfs: raise Exception(f"В файле {self.file_path.name} отсутствуют необходимые листы") df = dfs["Лист_1"] # контрагент cont = df.iloc[1, 0] if cont != "Яндекс Маркет ООО": raise Exception(f"В файле {self.file_path.name} неверный контрагент") validated_data, date = ozon_wb_yandex_com_handler.evaluating(dfs) print("Передача на коммисию YANDEX завершена, валидированных строк:", len(validated_data), "Реализация", date, "Дата") doc_creator = DocumentCreation(URL=settings.URL_REALISATION) doc_key = doc_creator.create_document( Date=date, ВидОперации=settings.TYPE2, Контрагент_Key=settings.CONTRAGENT_YANDEX, ДоговорКонтрагента_Key=settings.CONTRACT_YAN, Организация_Key=settings.COMPANY, Склад_Key=settings.STORE, ДокументБезНДС="false", СуммаВключаетНДС="true", СчетУчетаРасчетовПоАвансам_Key=settings.A62_02, СчетУчетаРасчетовСКонтрагентом_Key=settings.A76_09 ) doc_creator.fill_document_items_to_real(doc_key, validated_data)