This commit is contained in:
2026-07-20 16:36:25 -03:00
parent 1615572c48
commit 9f79cef723
+18 -48
View File
@@ -16,7 +16,6 @@ from pathlib import Path
import requests
import pdfplumber
from minio import Minio
BASE_URL = "https://sistema.sgztrade.com.br"
@@ -75,12 +74,8 @@ SQLSERVER_CONN = os.getenv(
),
)
MINIO_ENDPOINT = os.getenv("MINIO_ENDPOINT", "10.77.77.29:31200")
MINIO_ACCESS_KEY = os.getenv("MINIO_ACCESS_KEY", "admin")
MINIO_SECRET_KEY = os.getenv("MINIO_SECRET_KEY", "admin123")
MINIO_BUCKET = os.getenv("MINIO_BUCKET", "boletosvitrine")
MINIO_PREFIX = os.getenv("MINIO_PREFIX", "Boletos")
MINIO_SECURE = os.getenv("MINIO_SECURE", "false").strip().lower() in ("1", "true", "yes")
AZURE_UPLOAD_URL = "https://api.grupoginseng.com.br/portal/boletosvitrine/boleto/arquivos"
AZURE_PREFIX = os.getenv("AZURE_PREFIX", "Boletos")
MAX_PARALLEL_REQUESTS = 5
MAX_PARALLEL_PDFS_PER_USER = 1
DOWNLOAD_RETRY_ATTEMPTS = 4
@@ -371,31 +366,14 @@ def _guess_cte_nfe_keys_from_xml_names(xml_names: List[str]) -> Dict[str, Option
return {"chave_cte": cte_key, "chave_nfe": nfe_key}
def criar_minio_client():
client = Minio(
MINIO_ENDPOINT,
access_key=MINIO_ACCESS_KEY,
secret_key=MINIO_SECRET_KEY,
secure=MINIO_SECURE,
def upload_azure(prefix: str, filename: str, data: bytes, content_type: str) -> str:
response = requests.post(
AZURE_UPLOAD_URL,
files={"file": (filename, io.BytesIO(data), content_type)},
data={"prefix": prefix},
)
if not client.bucket_exists(MINIO_BUCKET):
client.make_bucket(MINIO_BUCKET)
return client, MINIO_BUCKET, MINIO_PREFIX
def upload_bytes_minio(client: Minio, bucket: str, prefix: str, object_name: str, data: bytes, content_type: str) -> str:
object_name = object_name.lstrip("/")
if prefix:
object_name = f"{prefix.rstrip('/')}/{object_name}"
client.put_object(
bucket,
object_name,
io.BytesIO(data),
length=len(data),
content_type=content_type,
)
return object_name
response.raise_for_status()
return f"{prefix.rstrip('/')}/{filename}"
def _safe_file_part(name: str) -> str:
@@ -529,11 +507,10 @@ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
)
def process_boletos_to_minio_sql(boletos: List[Dict[str, Optional[str]]]) -> int:
def process_boletos_to_azure_sql(boletos: List[Dict[str, Optional[str]]]) -> int:
if not boletos:
return 0
client, bucket, prefix = criar_minio_client()
prepared_rows: List[Dict[str, Optional[str]]] = []
uploads = 0
for b in boletos:
@@ -549,26 +526,19 @@ def process_boletos_to_minio_sql(boletos: List[Dict[str, Optional[str]]]) -> int
base_name = arquivo.name if arquivo else Path(arquivo_str or "boleto.pdf").name
nf = _extract_nf_from_name(base_name)
if nf and b.get("chave_cte"):
obj = f"boleto/cte_{b.get('chave_cte')}_nf_{nf}_{_safe_file_part(base_name)}"
filename = f"cte_{b.get('chave_cte')}_nf_{nf}_{_safe_file_part(base_name)}"
elif nf and b.get("chave_nfe"):
obj = f"boleto/nfe_{b.get('chave_nfe')}_nf_{nf}_{_safe_file_part(base_name)}"
filename = f"nfe_{b.get('chave_nfe')}_nf_{nf}_{_safe_file_part(base_name)}"
elif b.get("chave_nfe"):
obj = f"boleto/nfe_{b.get('chave_nfe')}_{_safe_file_part(base_name)}"
filename = f"nfe_{b.get('chave_nfe')}_{_safe_file_part(base_name)}"
elif nf:
obj = f"boleto/nf_{nf}_{_safe_file_part(base_name)}"
filename = f"nf_{nf}_{_safe_file_part(base_name)}"
else:
obj = f"boleto/{_safe_file_part(base_name)}"
object_key = upload_bytes_minio(
client,
bucket,
prefix,
obj,
pdf_bytes,
"application/pdf",
)
filename = _safe_file_part(base_name)
object_key = upload_azure(AZURE_PREFIX, filename, pdf_bytes, "application/pdf")
uploads += 1
b["minio_bucket"] = bucket
b["minio_bucket"] = "boletosvitrine"
b["minio_object_key"] = object_key
row = dict(b)
row.pop("_pdf_bytes", None)
@@ -1111,7 +1081,7 @@ if __name__ == "__main__":
except Exception as exc:
print(f"{email_ativo}: falha ao processar PDF remoto '{rp}': {exc}")
gravados = process_boletos_to_minio_sql(boletos) if boletos else 0
gravados = process_boletos_to_azure_sql(boletos) if boletos else 0
return (email_ativo, len(boletos), gravados, None)
except Exception as exc:
return (email_ativo, 0, 0, str(exc))