138 lines
3.3 KiB
Python
138 lines
3.3 KiB
Python
from __future__ import annotations
|
|
|
|
import os
|
|
from pathlib import Path
|
|
from typing import Optional
|
|
|
|
import requests
|
|
from dotenv import load_dotenv
|
|
|
|
from uv_app.core.mssql import connect_to_mssql
|
|
|
|
BASE_URL = "https://api.manorivile.lt/client/v2"
|
|
TIMEOUT = 30
|
|
|
|
DOTENV_PATH = Path(__file__).resolve().parents[2] / ".env"
|
|
load_dotenv(DOTENV_PATH, override=True)
|
|
|
|
SERVICE_CODE = "STATUSAS"
|
|
SERVICE_NAME = "Statusas"
|
|
SERVICE_UOM = "VNT"
|
|
|
|
|
|
def _get_api_key() -> str:
|
|
api_key = os.getenv("RIVILE_API_KEY", "").strip()
|
|
if not api_key:
|
|
raise RuntimeError("Missing RIVILE_API_KEY environment variable.")
|
|
return api_key
|
|
|
|
|
|
def _post(api_key: str, payload: dict) -> dict:
|
|
headers = {
|
|
"ApiKey": api_key,
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
}
|
|
|
|
response = requests.post(
|
|
BASE_URL,
|
|
json=payload,
|
|
headers=headers,
|
|
timeout=TIMEOUT,
|
|
)
|
|
|
|
if response.status_code != 200:
|
|
raise RuntimeError(f"Rivile HTTP {response.status_code}: {response.text}")
|
|
|
|
data = response.json()
|
|
if "errorMessage" in data:
|
|
raise RuntimeError(f"Rivile API error: {data}")
|
|
|
|
return data
|
|
|
|
|
|
def _service_exists(api_key: str, code: str) -> bool:
|
|
payload = {
|
|
"method": "GET_N17_LIST",
|
|
"params": {
|
|
"list": "H",
|
|
"fil": f"n17_kodas_ps='{code}'",
|
|
"limit": 1,
|
|
},
|
|
}
|
|
data = _post(api_key, payload)
|
|
return bool(data.get("list") or data.get("N17"))
|
|
|
|
|
|
def _choose_service_ds() -> Optional[str]:
|
|
conn = connect_to_mssql()
|
|
if conn is None:
|
|
raise RuntimeError("Failed to connect to MSSQL.")
|
|
try:
|
|
cursor = conn.cursor()
|
|
cursor.execute(
|
|
"""
|
|
SELECT N17_KODAS_DS, COUNT(*) AS cnt
|
|
FROM dbo.N17_PROD
|
|
WHERE N17_TIPAS = 2
|
|
AND N17_KODAS_DS IS NOT NULL
|
|
AND LTRIM(RTRIM(N17_KODAS_DS)) <> ''
|
|
GROUP BY N17_KODAS_DS
|
|
ORDER BY cnt DESC, N17_KODAS_DS
|
|
"""
|
|
)
|
|
rows = cursor.fetchall()
|
|
finally:
|
|
conn.close()
|
|
|
|
if not rows:
|
|
return None
|
|
|
|
return str(rows[0][0]).strip()
|
|
|
|
|
|
def create_service_statusas() -> dict:
|
|
api_key = _get_api_key()
|
|
service_ds = _choose_service_ds()
|
|
if not service_ds:
|
|
return {"status": "cancelled", "reason": "No N17_KODAS_DS selected"}
|
|
|
|
n17 = {
|
|
"N17_KODAS_PS": SERVICE_CODE,
|
|
"N17_TIPAS": "2",
|
|
"N17_PAV": SERVICE_NAME,
|
|
"N17_KODAS_US": SERVICE_UOM,
|
|
"N17_KODAS_DS": service_ds,
|
|
}
|
|
|
|
if _service_exists(api_key, SERVICE_CODE):
|
|
payload = {
|
|
"method": "EDIT_N17",
|
|
"params": {
|
|
"oper": "U",
|
|
"user": api_key.split(".", 1)[0],
|
|
"fld": "N17_KODAS_PS",
|
|
"val": SERVICE_CODE,
|
|
},
|
|
"data": {"N17": n17},
|
|
}
|
|
data = _post(api_key, payload)
|
|
return {"status": "updated", "code": SERVICE_CODE, "response": data}
|
|
|
|
payload = {
|
|
"method": "EDIT_N17",
|
|
"params": {"oper": "I"},
|
|
"data": {"N17": n17},
|
|
}
|
|
data = _post(api_key, payload)
|
|
return {"status": "created", "code": SERVICE_CODE, "response": data}
|
|
|
|
|
|
def main() -> None:
|
|
result = create_service_statusas()
|
|
print(result)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|