Files
Excel-project/server/backend/services/excel.py
2026-01-22 03:23:27 +03:00

277 lines
16 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
import server.backend.handlers.digitalization as digitalization
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
def read(self, xls=None, skiprows=None, skipfooter=0, sheet_name=None):
source = xls if xls is not None else self.file_path
try:
return pd.read_excel(
source,
sheet_name=sheet_name,
skiprows=skiprows,
skipfooter=skipfooter
)
except Exception as e:
raise Exception(f"⚠️ Ошибка при чтении {self.file_path}: {e}")
def struct(self):
try:
return pd.ExcelFile(self.file_path)
except Exception as e:
raise Exception(f"⚠️ Ошибка при получении структуры {self.file_path}: {e}")
class YandexHandler(BaseHandler):
def process(self):
xls= self.struct()
if "Получено от потребителей" in xls.sheet_names and "Возвращено потребителям" in xls.sheet_names:
dfs = self.read(xls,sheet_name=["Получено от потребителей","Возвращено потребителям"], skiprows=[0,1,3])
else:
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):
xls= self.struct()
if "Sheet1" in xls.sheet_names:
dfs = self.read(xls)
else:
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):
xls= self.struct()
if "Отчет о реализации" in xls.sheet_names:
dfs = self.read(xls, skiprows=14, skipfooter=17)
else:
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):
xls= self.struct()
if "Отчёт о выкупленных товарах" in xls.sheet_names:
dfs = self.read(xls, skiprows=[0,3,4,5,6,7,8,9,10,11], skipfooter=1)
else:
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):
xls= self.struct()
if "Sheet1" in xls.sheet_names:
dfs = self.read(xls, skiprows=[0,3,4,5,6,7,8], skipfooter=7)
else:
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):
xls= self.struct()
if "Лист_1" in xls.sheet_names:
dfs = self.read(xls, skipfooter=1)
else:
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):
xls= self.struct()
if "Лист_1" in xls.sheet_names:
dfs = self.read(xls, skipfooter=1)
else:
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):
xls= self.struct()
if "Лист_1" in xls.sheet_names:
dfs = self.read(xls, skipfooter=1)
else:
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)
class YandexDigital(BaseHandler):
def process(self):
xls = self.struct()
if "Себестоимость товаров" in xls.sheet_names:
df = self.read(xls, sheet_name="Себестоимость товаров", skiprows=2)
else:
raise Exception(f"В файле {self.file_path.name} отсутствуют необходимые листы")
validated_data = digitalization.evaluating(df, real_arti=0, types="yandex")
print(validated_data)
class OzonDigital(BaseHandler):
def process(self):
xls = self.struct()
if "Себестоимость" in xls.sheet_names:
df = self.read(xls, sheet_name="Себестоимость", skiprows=1)
else:
raise Exception(f"В файле {self.file_path.name} отсутствуют необходимые листы")
validated_data = digitalization.evaluating(df, real_arti=3, types="ozon")
class WBDigital(BaseHandler):
def process(self):
xls = self.struct()
if "Себестоимость" in xls.sheet_names:
df = self.read(xls, sheet_name="Себестоимость", skiprows=2)
else:
raise Exception(f"В файле {self.file_path.name} отсутствуют необходимые листы")
validated_data = digitalization.evaluating(df, real_arti=4, types="wb")
print(validated_data)