Files
Excel-project/server/backend/api/report.py
2026-01-08 19:25:19 +03:00

170 lines
7.2 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 requests
import json
import pandas as pd
from server.backend.schemas.pydantic import settings
from server.backend.api.session import get_session
class DocumentCreation:
def __init__(self, URL):
self.session = get_session({
"Content-Type": "application/json",
"Accept": "application/json",
})
self.url = URL
def save_key_txt(self, document_key: str, filename: str = "./excel_files/documents.txt"):
with open(filename, "a", encoding="utf-8") as f:
f.write(document_key + "\n")
def build_dict(self, **kwargs) -> dict:
return dict(kwargs)
def create_document(self, **kwargs) -> str:
data = self.build_dict(**kwargs)
self.contragent = kwargs.get("Контрагент_Key")
response = self.session.post(self.url, json=data)
response.raise_for_status()
result = response.json()
document_key = result.get("Ref_Key") or result.get("Ссылка_Key")
if not document_key:
raise RuntimeError(f"Не удалось получить ключ документа: {result}")
self.save_key_txt(document_key)
return document_key
def fill_document_items_purchase(self, document_key: str, validated_rows: list):
line_url = f"{self.url}({document_key})"
response = self.session.get(line_url)
response.raise_for_status()
document_data = response.json()
items = document_data.get("Товары", [])
start_line = len(items)
for idx, row in enumerate(validated_rows, start=1):
new_item = {
"LineNumber": str(start_line + idx),
"Номенклатура_Key": row.ref_key,
"Количество": row.counts,
"ЕдиницаИзмерения_Key": settings.MEASURE,
"Цена": row.price / row.counts if row.counts else 0,
"Сумма": row.price,
"СчетУчета_Key": settings.A45_02,
"СчетДоходов_Key": settings.A90_01_1,
"СчетРасходов_Key": settings.A90_02_1,
"СтавкаНДС": "НДС5",
"СуммаНДС": row.price * 5 / 105,
"СчетУчетаНДСПоРеализации_Key": settings.A90_03,
}
items.append(new_item)
document_data["Товары"] = items
patch_response = self.session.patch(line_url, json=document_data)
patch_response.raise_for_status()
def fill_document_items_to_real(self, document_key: str, validated_rows: list):
line_url = f"{self.url}({document_key})"
response = self.session.get(line_url)
response.raise_for_status()
document_data = response.json()
items = document_data.get("Товары", [])
start_line = len(items)
for idx, row in enumerate(validated_rows, start=1):
new_item = {
"LineNumber": str(start_line + idx),
"Номенклатура_Key": row.ref_key,
"Количество": row.counts,
"ЕдиницаИзмерения_Key": settings.MEASURE,
"Цена": row.price / row.counts if row.counts else 0,
"Сумма": row.price,
"СчетУчета_Key": settings.A43,
"ПереданныеСчетУчета_Key": settings.A45_02,
"СтавкаНДС": "НДС5",
"СуммаНДС": row.price * 5 / 105,
}
items.append(new_item)
document_data["Товары"] = items
patch_response = self.session.patch(line_url, json=document_data)
patch_response.raise_for_status()
def fill_document_items_report(self, document_key:str, validated_rows_real:list, validated_rows_refund:list):
line_url = f"{self.url}({document_key})"
response = self.session.get(line_url)
response.raise_for_status()
document_data = response.json()
items = document_data.get("Покупатели",[])
new_item={
"LineNumber": str(len(items) + 1),
"Покупатель_Key": self.contragent
}
items.append(new_item)
document_data["Покупатели"] = items
patch_response = self.session.patch(line_url, json=document_data)
patch_response.raise_for_status()
items = document_data.get("Товары", [])
start_line = len(items)
for idx, row in enumerate(validated_rows_real, start=1):
new_item = {
"LineNumber": str(start_line + idx),
"Номенклатура_Key": row.ref_key,
"Количество": row.counts,
"ЕдиницаИзмерения_Key": settings.MEASURE,
"Цена": row.price / row.counts if row.counts else 0,
"Сумма": row.price,
"СчетУчета_Key": settings.A45_02,
"СчетДоходов_Key": settings.A90_01_1,
"СчетРасходов_Key": settings.A90_02_1,
"СтавкаНДС": "НДС5",
"СуммаНДС": row.price * 5 / 105,
"СчетУчетаНДСПоРеализации_Key": settings.A90_03,
}
items.append(new_item)
document_data["Товары"] = items
patch_response = self.session.patch(line_url, json=document_data)
patch_response.raise_for_status()
items = document_data.get("Возвраты", [])
new_item = {
"LineNumber": str(len(items) + 1),
"Покупатель_Key": settings.BUYER
}
items.append(new_item)
document_data["Возвраты"] = items
patch_response = self.session.patch(line_url, json=document_data)
patch_response.raise_for_status()
items = document_data.get("ТоварыВозвращенные", [])
start_line = len(items)
for idx, row in enumerate(validated_rows_refund, start=1):
new_item = {
"LineNumber": str(start_line + idx),
"Номенклатура_Key": row.ref_key,
"Количество": row.counts,
"ЕдиницаИзмерения_Key": settings.MEASURE,
"Цена": row.price / row.counts if row.counts else 0,
"Сумма": row.price,
"СчетУчета_Key": settings.A45_02,
"СчетДоходов_Key": settings.A90_01_1,
"СчетРасходов_Key": settings.A90_02_1,
"СтавкаНДС": "НДС5",
"СуммаНДС": row.price * 5 / 105,
"СчетУчетаНДСПоРеализации_Key": settings.A90_03,
"Себестоимость": 100,
"ОтражениеВУСН": "Принимаются",
}
items.append(new_item)
document_data["ТоварыВозвращенные"] = items
patch_response = self.session.patch(line_url, json=document_data)
patch_response.raise_for_status()