diff --git a/server/backend/api/realisation.py b/server/backend/api/realisation.py index 72127da..f6866ff 100644 --- a/server/backend/api/realisation.py +++ b/server/backend/api/realisation.py @@ -9,20 +9,20 @@ session = get_session({ "Accept": "application/json", }) -def create_document(params: CreateDocumentParams) -> int: +def create_document(**kwargs) -> int: data = { - "Дата": params.DATE, + "Дата": DATE, #"ВидОперации": params.OPERATION, "Организация_Key": settings.COMPANY, - "Контрагент_Key": params.CONTRACTOR, + "Контрагент_Key": CONTRACTOR, "Склад_Key": settings.STORE, - "ДоговорКонтрагента_Key": params.CONTRACT, + "ДоговорКонтрагента_Key": CONTRACT, "ДокументБезНДС": "false", "СуммаВключаетНДС": "true", - "СчетУчетаРасчетовЗаПосредническиеУслуги_Key": params.ACCOUNT_INTERMEDIARY_SERVICES, - "СчетУчетаРасчетовПоАвансамПолученным_Key": params.ACCOUNT_ADVANCES_RECEIVED, - "СчетУчетаРасчетовПоАвансамВыданным_Key": params.ACCOUNT_ADVANCES_ISSUED, - "СчетУчетаРасчетовСКонтрагентом_Key": params.ACCOUNT_WITH_COUNTERPARTY, + "СчетУчетаРасчетовЗаПосредническиеУслуги_Key": ACCOUNT_INTERMEDIARY_SERVICES, + "СчетУчетаРасчетовПоАвансамПолученным_Key": ACCOUNT_ADVANCES_RECEIVED, + "СчетУчетаРасчетовПоАвансамВыданным_Key": ACCOUNT_ADVANCES_ISSUED, + "СчетУчетаРасчетовСКонтрагентом_Key": ACCOUNT_WITH_COUNTERPARTY, } response = session.post(settings.URL_REALISATION, json=data) diff --git a/server/backend/handlers/ozon_purchases_handler.py b/server/backend/handlers/ozon_purchases_handler.py index 9d723ba..40f0172 100644 --- a/server/backend/handlers/ozon_purchases_handler.py +++ b/server/backend/handlers/ozon_purchases_handler.py @@ -5,13 +5,13 @@ import re import datetime import re import datetime -def report_date(df, format: str): +def report_date(df, date_format: str): row_text = " ".join(df.iloc[0].astype(str)) match = re.search(r"по\s+(\d{2}\.\d{2}\.\d{4})", row_text) if not match: - return None + raise ValueError("There is no date in ozon_purchase_handler") dt = datetime.datetime.strptime(match.group(1), "%d.%m.%Y") - return dt.strftime(format) + return dt.strftime(date_format) def process_sheet(df, real_arti:int, real_quantity:int, real_sum_1:int): df = df.iloc[2:].reset_index(drop=True) @@ -44,5 +44,5 @@ def process_sheet(df, real_arti:int, real_quantity:int, real_sum_1:int): return validated_rows def evaluating(dfs): validated_rows_1 = process_sheet(dfs["Отчет о выкупленных товарах"], real_arti=3,real_quantity=10, real_sum_1=11) # номера столбцов от озона - date=report_date(dfs["Отчет о выкупленных товарах"], format=settings.TIMEFORMAT) + date=report_date(dfs["Отчет о выкупленных товарах"], date_format=settings.TIMEFORMAT) return validated_rows_1, date \ No newline at end of file diff --git a/server/backend/handlers/ozon_wb_yandex_com_handler.py b/server/backend/handlers/ozon_wb_yandex_com_handler.py index 5184c29..4ed21ca 100644 --- a/server/backend/handlers/ozon_wb_yandex_com_handler.py +++ b/server/backend/handlers/ozon_wb_yandex_com_handler.py @@ -8,12 +8,13 @@ def last_day_of_month(format: str): last_day = next_month - datetime.timedelta(days=next_month.day) return last_day.strftime(format) def process_sheet(df, real_arti:str, real_quantity:str, real_sum_1:str): + df= df.iloc[2:].reset_index(drop=True) #Выборка - df = df[[real_arti, real_quantity, real_sum_1]].copy().dropna() #copy and drop all NA values + df = df.iloc[:, [real_arti, real_quantity, real_sum_1]].copy().dropna() + #df = df[[real_arti, real_quantity, real_sum_1]].copy().dropna() #copy and drop all NA values df = df[(df != 0).all(axis=1)] #drop all 0 values - df = df[[real_arti, real_quantity, real_sum_1]] - df.rename(columns={real_arti: 'arti', real_quantity: 'counts', real_sum_1: 'price'}, inplace=True) #переименовываем для pydantic - + #df = df[[real_arti, real_quantity, real_sum_1]] + df.columns = ['arti', 'counts', 'price'] #Нормализация df['arti'] = df['arti'].replace(Translit.TRANSLIT, regex=True) df['arti'] = df['arti'].astype(str).str.upper().str.extract(f'({settings.PATTERN})') #arti под regex @@ -22,7 +23,7 @@ def process_sheet(df, real_arti:str, real_quantity:str, real_sum_1:str): #Группировка df = df.groupby('arti', as_index=False).agg({'counts': 'sum', 'price': 'sum'}) #groupping - df = processing(df) #vlookup for ref_keys + #df = processing(df) #vlookup for ref_keys validated_rows, errors = [], [] for i, row in df.iterrows(): #проходит построчно по df, где i - индекс строки, row - данные строки try: @@ -33,6 +34,7 @@ def process_sheet(df, real_arti:str, real_quantity:str, real_sum_1:str): raise Exception(f"There are some errors with validation in Лист_1, check it ", errors) return validated_rows def evaluating(dfs): - validated_rows_1 = process_sheet(dfs["Лист_1"], real_arti="Артикул",real_quantity=dfs["Лист_1"].columns[4], real_sum_1=dfs["Лист_1"].columns[8]) # номера столбцов + #validated_rows_1 = process_sheet(dfs["Лист_1"], real_arti="Артикул",real_quantity=dfs["Лист_1"].columns[4], real_sum_1=dfs["Лист_1"].columns[8]) # номера столбцов + validated_rows_1 = process_sheet(dfs["Лист_1"], real_arti=0,real_quantity=4, real_sum_1=8) date = last_day_of_month(settings.TIMEFORMAT) return validated_rows_1, date \ No newline at end of file diff --git a/server/backend/handlers/wb_handler.py b/server/backend/handlers/wb_handler.py index fd484ff..d321703 100644 --- a/server/backend/handlers/wb_handler.py +++ b/server/backend/handlers/wb_handler.py @@ -3,10 +3,10 @@ from server.backend.schemas.pydantic import ExcelInfo, settings,Translit from server.backend.api.nomenclature import processing import datetime -def last_day_of_month(format: str): +def last_day_of_month(date_format: str): next_month = datetime.datetime.now().replace(day=28) + datetime.timedelta(days=4) last_day = next_month - datetime.timedelta(days=next_month.day) - return last_day.strftime(format) + return last_day.strftime(date_format) def process_sheet(df, document_type:str): #Выборка df = df[['Артикул поставщика', 'Тип документа', 'Кол-во', 'Вайлдберриз реализовал Товар (Пр)']].copy().dropna() #copy and drop all NA values diff --git a/server/backend/handlers/wb_purchases_handler.py b/server/backend/handlers/wb_purchases_handler.py index 1452ba4..f51e268 100644 --- a/server/backend/handlers/wb_purchases_handler.py +++ b/server/backend/handlers/wb_purchases_handler.py @@ -3,13 +3,13 @@ from server.backend.schemas.pydantic import ExcelInfo, settings,Translit from server.backend.api.nomenclature import processing import re import datetime -def report_date(df, format: str): +def report_date(df, date_format: str): row_text = " ".join(df.iloc[0].astype(str)) match = re.search(r"\d{4}-\d{2}-\d{2}", row_text) if not match: - return None + raise ValueError("There is no date in ozon_purchase_handler") dt = datetime.datetime.strptime(match.group(0), "%Y-%m-%d") - return dt.strftime(format) + return dt.strftime(date_format) def process_sheet(df, real_arti:str, real_quantity:str, real_sum_1:str): df = df.iloc[2:].reset_index(drop=True) #Выборка @@ -38,5 +38,5 @@ def evaluating(dfs): # validated_rows_1 = process_sheet(dfs["Sheet1"], real_arti='Артикул',real_quantity="Количество", real_sum_1='''Сумма выкупа, руб., # (вкл. НДС)''') # номера столбцов от озона validated_rows_1 = process_sheet(dfs["Sheet1"], real_arti=1,real_quantity=3, real_sum_1=4) # номера столбцов от озона - date=report_date(dfs["Sheet1"], format=settings.TIMEFORMAT) + date=report_date(dfs["Sheet1"], date_format=settings.TIMEFORMAT) return validated_rows_1, date \ No newline at end of file diff --git a/server/backend/schemas/pydantic.py b/server/backend/schemas/pydantic.py index 0903e53..5cca9fc 100644 --- a/server/backend/schemas/pydantic.py +++ b/server/backend/schemas/pydantic.py @@ -4,7 +4,7 @@ class ExcelInfo(BaseModel): arti:str = Field(..., min_length=5, max_length=12, description="arti of the clothes") counts:int = Field(..., gt=0, description="the quantity of the clothes") price:float = Field(..., gt=0, description="the price of the clothes") - ref_key:str = Field(..., description="reffering key from db") + #ref_key:str = Field(..., description="reffering key from db") class ExcelRealization(BaseModel): pass class ExcelReturning(BaseModel): @@ -60,13 +60,4 @@ class Translit(): 'Т': 'T', 'Х': 'X', } -class CreateDocumentParams(BaseModel): - DATE: str = Field(..., min_length=1) - OPERATION: str = Field(..., min_length=1) - CONTRACTOR: str = Field(..., min_length=1) - CONTRACT: str = Field(..., min_length=1) - ACCOUNT_INTERMEDIARY_SERVICES: str = Field(..., min_length=1) - ACCOUNT_ADVANCES_RECEIVED: str = Field(..., min_length=1) - ACCOUNT_ADVANCES_ISSUED: str = Field(..., min_length=1) - ACCOUNT_WITH_COUNTERPARTY: str = Field(..., min_length=1) settings = Settings() \ No newline at end of file diff --git a/server/backend/services/excel.py b/server/backend/services/excel.py index 99df4b3..7203584 100644 --- a/server/backend/services/excel.py +++ b/server/backend/services/excel.py @@ -29,8 +29,6 @@ class YandexHandler(BaseHandler): # вызываем функцию evaluating validated_data = yandex_handler.evaluating(dfs) print("Реализация Яндекс завершена, валидированных строк:", len(validated_data[0]), "Реализация", len(validated_data[1]), "Возвраты", validated_data[2], "Дата") - status = create_document(params) - print(status) class WBHandler(BaseHandler): @@ -55,16 +53,6 @@ class OZONPurchasesHandler(BaseHandler): raise Exception(f"В файле {self.file_path.name} отсутствуют необходимые листы") validated_data = ozon_purchases_handler.evaluating(dfs) print("Выкупы OZON завершены, валидированных строк:", len(validated_data[0]), "Реализация", validated_data[1], "Дата") - params = CreateDocumentParams( - DATE=validated_data[1], - OPERATION="ВыкупТоваровКомиссионером", - CONTRACTOR=settings.CONTRAGENT_OZON, - CONTRACT=settings.CONTRACT_OZON, - ACCOUNT_INTERMEDIARY_SERVICES=settings.A60_01, - ACCOUNT_ADVANCES_RECEIVED=settings.A62_02, - ACCOUNT_ADVANCES_ISSUED=settings.A60_02, - ACCOUNT_WITH_COUNTERPARTY=settings.A62_01) - print(params) class WBPurchasesHandler(BaseHandler): def process(self): @@ -75,13 +63,14 @@ class WBPurchasesHandler(BaseHandler): print("Выкупы WB завершены, валидированных строк:", len(validated_data[0]), "Реализация", validated_data[1], "Дата" ) class OZONComHandler(BaseHandler): + #Убрать двойной вызов pd.read def process(self): dfs = self.read(skipfooter=1) if "Лист_1" not in dfs: raise Exception(f"В файле {self.file_path.name} отсутствуют необходимые листы") - df = dfs["Лист_1"] + df = dfs["Лист_1"] + # контрагент cont = df.iloc[1, 0] - dfs = pd.read_excel(self.file_path, sheet_name=None, skiprows=[0,2],skipfooter=1) if cont != "«Интернет решения» ООО": raise Exception(f"В файле {self.file_path.name} неверный контрагент") validated_data = ozon_wb_yandex_com_handler.evaluating(dfs) @@ -92,9 +81,9 @@ class WBComHandler(BaseHandler): dfs = self.read(skipfooter=1) if "Лист_1" not in dfs: raise Exception(f"В файле {self.file_path.name} отсутствуют необходимые листы") - df = dfs["Лист_1"] + df = dfs["Лист_1"] + # контрагент cont = df.iloc[1, 0] - dfs = pd.read_excel(self.file_path, sheet_name=None, skiprows=[0,2], skipfooter=1) if cont != '"Вайлдберриз" ООО': raise Exception(f"В файле {self.file_path.name} неверный контрагент") validated_data = ozon_wb_yandex_com_handler.evaluating(dfs) @@ -105,9 +94,9 @@ class YandexComHandler(BaseHandler): dfs = self.read(skipfooter=1) if "Лист_1" not in dfs: raise Exception(f"В файле {self.file_path.name} отсутствуют необходимые листы") - df = dfs["Лист_1"] + df = dfs["Лист_1"] + # контрагент cont = df.iloc[1, 0] - dfs = pd.read_excel(self.file_path, sheet_name=None, skiprows=[0,2], skipfooter=1) if cont != "Яндекс Маркет ООО": raise Exception(f"В файле {self.file_path.name} неверный контрагент") validated_data = ozon_wb_yandex_com_handler.evaluating(dfs)