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()