diff --git a/requirements.txt b/requirements.txt index f7c87c7..764e833 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ pandas==2.3.3 openpyxl==3.1.5 pydantic==2.12.3 +pydantic_settings == 2.12.0 dotenv==0.9.9 \ No newline at end of file diff --git a/server/backend/api/realisation.py b/server/backend/api/realisation.py index e69de29..ec13025 100644 --- a/server/backend/api/realisation.py +++ b/server/backend/api/realisation.py @@ -0,0 +1,4 @@ +import requests +import json +from base64 import b64encode +from server.backend.schemas.pydantic import settings \ No newline at end of file diff --git a/server/backend/api/report.py b/server/backend/api/report.py index e69de29..7b8923d 100644 --- a/server/backend/api/report.py +++ b/server/backend/api/report.py @@ -0,0 +1,4 @@ +import requests +import json +from base64 import b64encode +from server.backend.schemas.pydantic import settings diff --git a/server/backend/handlers/ozon_handler.py b/server/backend/handlers/ozon_handler.py index 6bdf8e6..f3d39a5 100644 --- a/server/backend/handlers/ozon_handler.py +++ b/server/backend/handlers/ozon_handler.py @@ -1,19 +1,14 @@ from pydantic import ValidationError -from server.backend.schemas.pydantic import ExcelInfo +from server.backend.schemas.pydantic import ExcelInfo,settings import re -from dotenv import load_dotenv #Работа с env -import os -load_dotenv() -PATTERN = os.getenv("PATTERN") - def process_sheet(df, real_arti:str, real_quantity:str, real_sum_1:str, real_sum_2:str): df = df[[real_arti, real_quantity, real_sum_1, real_sum_2]].copy().dropna() #copy and drop all NA values df = df[(df != 0).all(axis=1)] #drop all 0 values df[real_sum_1]+=df[real_sum_2] df = df[[real_arti, real_quantity, real_sum_1]].copy() df.rename(columns={real_arti: 'arti', real_quantity: 'counts', real_sum_1: 'price'}, inplace=True) #переименовываем для pydantic - df['arti'] = df['arti'].astype(str).str.extract(f'({PATTERN})', flags=re.IGNORECASE) #arti под regex + df['arti'] = df['arti'].astype(str).str.extract(f'({settings.PATTERN})', flags=re.IGNORECASE) #arti под regex df['price'] = df['price'].astype(float) #Float to Int, if exists df['counts'] = df['counts'].astype(int) #Float to Int, if exists @@ -30,4 +25,6 @@ def process_sheet(df, real_arti:str, real_quantity:str, real_sum_1:str, real_sum def evaluating(dfs): validated_rows_1 = process_sheet(dfs["Отчет о реализации"], real_arti='2',real_quantity='8', real_sum_1='5',real_sum_2='6') # номера столбцов от озона validated_rows_2 = process_sheet(dfs["Отчет о реализации"], real_arti='2',real_quantity='16', real_sum_1='13',real_sum_2='14')# - return validated_rows_1, validated_rows_2 \ No newline at end of file + return validated_rows_1, validated_rows_2 + +#Добавить проверку с бд по keys \ No newline at end of file diff --git a/server/backend/handlers/ozon_purchases_handler.py b/server/backend/handlers/ozon_purchases_handler.py index bd143ef..1000ecb 100644 --- a/server/backend/handlers/ozon_purchases_handler.py +++ b/server/backend/handlers/ozon_purchases_handler.py @@ -1,18 +1,14 @@ from pydantic import ValidationError -from server.backend.schemas.pydantic import ExcelInfo +from server.backend.schemas.pydantic import ExcelInfo, settings import re -from dotenv import load_dotenv #Работа с env -import os -load_dotenv() -PATTERN = os.getenv("PATTERN") def process_sheet(df, real_arti:int, real_quantity:int, real_sum_1:int): 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]].copy() df.rename(columns={real_arti: 'arti', real_quantity: 'counts', real_sum_1: 'price'}, inplace=True) #переименовываем для pydantic - df['arti'] = df['arti'].astype(str).str.extract(f'({PATTERN})', flags=re.IGNORECASE) #arti под regex + df['arti'] = df['arti'].astype(str).str.extract(f'({settings.PATTERN})', flags=re.IGNORECASE) #arti под regex df['price'] = df['price'].astype(float) #Float to Int, if exists df['counts'] = df['counts'].astype(int) #Float to Int, if exists diff --git a/server/backend/handlers/ozon_wb_yandex_com_handler.py b/server/backend/handlers/ozon_wb_yandex_com_handler.py index f9c4108..7b43127 100644 --- a/server/backend/handlers/ozon_wb_yandex_com_handler.py +++ b/server/backend/handlers/ozon_wb_yandex_com_handler.py @@ -1,18 +1,14 @@ from pydantic import ValidationError -from server.backend.schemas.pydantic import ExcelInfo +from server.backend.schemas.pydantic import ExcelInfo,settings import re -from dotenv import load_dotenv #Работа с env -import os -load_dotenv() -PATTERN = os.getenv("PATTERN") def process_sheet(df, real_arti:str, real_quantity:str, real_sum_1:str): 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]].copy() df.rename(columns={real_arti: 'arti', real_quantity: 'counts', real_sum_1: 'price'}, inplace=True) #переименовываем для pydantic - df['arti'] = df['arti'].astype(str).str.extract(f'({PATTERN})', flags=re.IGNORECASE) #arti под regex + df['arti'] = df['arti'].astype(str).str.extract(f'({settings.PATTERN})', flags=re.IGNORECASE) #arti под regex df['price'] = df['price'].astype(float) #переделка к норм виду и преобразование в float df['counts'] = df['counts'].astype(int) #Float to Int, if exists diff --git a/server/backend/handlers/wb_handler.py b/server/backend/handlers/wb_handler.py index 377667b..854753e 100644 --- a/server/backend/handlers/wb_handler.py +++ b/server/backend/handlers/wb_handler.py @@ -1,12 +1,7 @@ from pydantic import ValidationError -from server.backend.schemas.pydantic import ExcelInfo +from server.backend.schemas.pydantic import ExcelInfo, settings import re -from dotenv import load_dotenv #Работа с env -import os -load_dotenv() -PATTERN = os.getenv("PATTERN") - 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 @@ -14,7 +9,7 @@ def process_sheet(df, document_type:str): df = df[['Артикул поставщика', 'Кол-во', 'Вайлдберриз реализовал Товар (Пр)']].copy() df.rename(columns={'Артикул поставщика': 'arti', 'Кол-во': 'counts', 'Вайлдберриз реализовал Товар (Пр)': 'price'}, inplace=True) #переименовываем для pydantic - df['arti'] = df['arti'].astype(str).str.extract(f'({PATTERN})', flags=re.IGNORECASE) #arti под regex + df['arti'] = df['arti'].astype(str).str.extract(f'({settings.PATTERN})', flags=re.IGNORECASE) #arti под regex df['price'] = df['price'].astype(float) #Float to Int, if exists df['counts'] = df['counts'].astype(int) #Float to Int, if exists diff --git a/server/backend/handlers/wb_purchases_handler.py b/server/backend/handlers/wb_purchases_handler.py index efc125f..3ed4952 100644 --- a/server/backend/handlers/wb_purchases_handler.py +++ b/server/backend/handlers/wb_purchases_handler.py @@ -1,18 +1,13 @@ from pydantic import ValidationError -from server.backend.schemas.pydantic import ExcelInfo +from server.backend.schemas.pydantic import ExcelInfo, settings import re -from dotenv import load_dotenv #Работа с env -import os -load_dotenv() -PATTERN = os.getenv("PATTERN") - def process_sheet(df, real_arti:str, real_quantity:str, real_sum_1:str): 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]].copy() df.rename(columns={real_arti: 'arti', real_quantity: 'counts', real_sum_1: 'price'}, inplace=True) #переименовываем для pydantic - df['arti'] = df['arti'].astype(str).str.extract(f'({PATTERN})', flags=re.IGNORECASE) #arti под regex + df['arti'] = df['arti'].astype(str).str.extract(f'({settings.PATTERN})', flags=re.IGNORECASE) #arti под regex df['price'] = df['price'].str.replace(' ', '', regex=False).str.replace(',', '.', regex=False).astype(float) #переделка к норм виду и преобразование в float df['counts'] = df['counts'].astype(int) #Float to Int, if exists diff --git a/server/backend/handlers/yandex_handler.py b/server/backend/handlers/yandex_handler.py index bf78ed0..7044425 100644 --- a/server/backend/handlers/yandex_handler.py +++ b/server/backend/handlers/yandex_handler.py @@ -1,18 +1,13 @@ from pydantic import ValidationError -from server.backend.schemas.pydantic import ExcelInfo +from server.backend.schemas.pydantic import ExcelInfo, settings import re -from dotenv import load_dotenv #Работа с env -import os -load_dotenv() -PATTERN = os.getenv("PATTERN") - def process_sheet(df, multiply_price=1, sheet_name=''): df = df[['Ваш SKU', 'Количество, шт.', 'Сумма транзакции, ₽']].copy().dropna() #выбираем нужные колонки, делаем копию, чтобы можно было удалить None inline модом df = df[(df != 0).all(axis=1)] #drop all 0 values df['Сумма транзакции, ₽'] *= multiply_price #умножаем на -1 для возвратов df.rename(columns={'Ваш SKU': 'arti', 'Количество, шт.': 'counts', 'Сумма транзакции, ₽': 'price'}, inplace=True) #переименовываем для pydantic - df['arti'] = df['arti'].astype(str).str.extract(f'({PATTERN})', flags=re.IGNORECASE) #regex implemented + df['arti'] = df['arti'].astype(str).str.extract(f'({settings.PATTERN})', flags=re.IGNORECASE) #regex implemented df['price'] = df['price'].astype(float) #To float, if exists df['counts'] = df['counts'].astype(int) #To float, if exists diff --git a/server/backend/schemas/pydantic.py b/server/backend/schemas/pydantic.py index f7e3416..4e62389 100644 --- a/server/backend/schemas/pydantic.py +++ b/server/backend/schemas/pydantic.py @@ -1,4 +1,5 @@ from pydantic import BaseModel, Field, field_validator +from pydantic_settings import BaseSettings, SettingsConfigDict 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") @@ -8,4 +9,35 @@ class ExcelRealization(BaseModel): class ExcelReturning(BaseModel): pass class ExcelOut(BaseModel): - pass \ No newline at end of file + pass +class Settings(BaseSettings): + DIR:str + PATTERN: str + USERNAME: str + PASSWORD: str + URL_REPORT:str + URL_REALISATION:str + BUYER: str + COMPANY: str + STORE: str + CONTRAGENT_RWB:str + CONTRAGENT_OZON:str + CONTRAGENT_YANDEX:str + CONTRACT_RWB0:str + CONTRACT_RWB1:str + CONTRACT_RWB2:str + MEASURE:str + A60_01:str + A62_02:str + A60_02:str + A62_01:str + A45_02:str + A90_01_1:str + A90_02_1:str + A90_03:str + A76_09:str + model_config = SettingsConfigDict( + env_file=".env", + env_file_encoding="utf-8" + ) +settings = Settings() \ No newline at end of file diff --git a/server/backend/services/validating_files.py b/server/backend/services/validating_files.py index e2b6dd4..4fc1fda 100644 --- a/server/backend/services/validating_files.py +++ b/server/backend/services/validating_files.py @@ -1,10 +1,7 @@ import server.backend.services.excel as excel - -from dotenv import load_dotenv #Работа с env -import os +from server.backend.schemas.pydantic import settings from pathlib import Path -load_dotenv() -base_dir = Path(os.getenv("DIR")) +DIR = Path(settings.DIR) handlers = { #метки какие файлы есть и должны быть занесены с вызовами функций из файла "period_closure_income": excel.YandexHandler, @@ -19,9 +16,9 @@ handlers = { #метки какие файлы есть и должны быть #Проход по всем файлам в директории def validating(): - if not base_dir.exists(): - raise (f"Директория {base_dir} не существует") #Проверка существует ли директория - for file in base_dir.rglob("*.xlsx"): + if not DIR.exists(): + raise (f"Директория {DIR} не существует") #Проверка существует ли директория + for file in DIR.rglob("*.xlsx"): if file.name.startswith("~$"): #Проверка не редактируемый ли файл continue