Files
Excel-project/server/backend/handlers/wb_handler.py
2026-01-09 13:15:56 +03:00

50 lines
3.0 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.

from pydantic import ValidationError
from server.backend.schemas.pydantic import ExcelInfo, settings,Translit
from server.backend.api.nomenclature import processing
import pandas as pd
import datetime
def report_date(df, date_format: str):
dates = pd.to_datetime(df["Дата продажи"], format="%Y-%m-%d", errors="coerce")
if dates.isna().all():
raise ValueError("В колонке нет валидных дат")
max_date = dates.max()
return max_date.strftime(date_format)
def process_sheet(df, document_type:str):
#Выборка
df = df[['Артикул поставщика', 'Тип документа', 'Кол-во', 'Вайлдберриз реализовал Товар (Пр)']].copy().dropna() #copy and drop all NA values
df = df[(df != 0).all(axis=1)] #drop all 0 values
df = df[df['Тип документа'] == document_type] #фильтруем по типу документа
df = df[['Артикул поставщика', 'Кол-во', 'Вайлдберриз реализовал Товар (Пр)']]
df.rename(columns={'Артикул поставщика': 'arti', 'Кол-во': 'counts', 'Вайлдберриз реализовал Товар (Пр)': 'price'}, inplace=True) #переименовываем для pydantic
#Нормализация
df['arti'] = df['arti'].replace(Translit.TRANSLIT, regex=True)
df['arti'] = df['arti'].astype(str).str.upper().str.extract(f'({settings.PATTERN})') #arti под regex
df['price'] = df['price'].astype(float) #Float to Int, if exists
df['counts'] = df['counts'].astype(int) #Float to Int, if exists
#Группировка
df = df.groupby('arti', as_index=False).agg({'counts': 'sum', 'price': 'sum'})
df = processing(df) #vlookup for ref_keys
validated_rows, errors = [], []
for i, row in df.iterrows(): #проходит построчно по df, где i - индекс строки, row - данные строки
try:
validated_rows.append(ExcelInfo(**row.to_dict())) #добавляем в список проверенные данные полученные от pydantic, которые туда передаются в виде dict
except ValidationError as e:
errors.append((i, e.errors())) #выводит ошибку и пишет номер строки
if errors:
raise Exception(f"There are some errors with validation in Sheet1, check it ", errors)
return validated_rows
def evaluating(dfs):
validated_rows_1 = process_sheet(dfs["Sheet1"], document_type='Продажа')
validated_rows_2 = process_sheet(dfs["Sheet1"], document_type='Возврат')
date = report_date(dfs["Sheet1"], settings.TIMEFORMAT)
# sum_1 = sum(row.price for row in validated_rows_1)
# sum_2 = sum(row.price for row in validated_rows_2)
# print("Sum for 'Продажа':", sum_1)
# print("Sum for 'Возврат':", sum_2)
return validated_rows_1, validated_rows_2, date