att
This commit is contained in:
parent
230654836b
commit
cdf5aad1c8
10213
.vscode/.advpl/_binary_class.prw
vendored
Normal file
10213
.vscode/.advpl/_binary_class.prw
vendored
Normal file
File diff suppressed because it is too large
Load Diff
9808
.vscode/.advpl/_binary_functions.prw
vendored
Normal file
9808
.vscode/.advpl/_binary_functions.prw
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20
.vscode/launch.json
vendored
Normal file
20
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"type": "totvs_language_debug",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "TOTVS Language Debug",
|
||||||
|
"program": "${command:AskForProgramName}",
|
||||||
|
"cwb": "${workspaceFolder}",
|
||||||
|
"smartclientBin": "../totvs/bin/smartclient/smartclient.exe",
|
||||||
|
"isMultiSession": true,
|
||||||
|
"enableTableSync": true,
|
||||||
|
"extendFeatures": {
|
||||||
|
"charDetails": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"lastProgramExecuted": "<cancel>",
|
||||||
|
"lastProgramArguments": []
|
||||||
|
}
|
||||||
4
.vscode/settings.json
vendored
Normal file
4
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"totvsLanguageServer.welcomePage": false,
|
||||||
|
"totvsLanguageServer.editor.linter.includes": "C:\\25-04-14-P12-SMARTCLIENT_BUILD 20.3.2.12_WINDOWS_X64\\include"
|
||||||
|
}
|
||||||
BIN
__pycache__/recebiveis_report_importer.cpython-313.pyc
Normal file
BIN
__pycache__/recebiveis_report_importer.cpython-313.pyc
Normal file
Binary file not shown.
@ -1,152 +0,0 @@
|
|||||||
"""
|
|
||||||
Backfill de paymentType para todos os Numero_Pedido em Grgb_vendas_report
|
|
||||||
que ainda não constam em Grgb_installment_paytype.
|
|
||||||
|
|
||||||
Pode ser interrompido e re-executado a qualquer momento — retoma de onde parou.
|
|
||||||
"""
|
|
||||||
import re
|
|
||||||
import time
|
|
||||||
import requests
|
|
||||||
from typing import Optional
|
|
||||||
|
|
||||||
from installments_reader import Auth, get_installments_page
|
|
||||||
|
|
||||||
# ─── CONFIG ───────────────────────────────────────────────────────────────────
|
|
||||||
SQL_CONN = (
|
|
||||||
"DRIVER={ODBC Driver 17 for SQL Server};"
|
|
||||||
"SERVER=10.77.77.10;"
|
|
||||||
"DATABASE=GINSENG;"
|
|
||||||
"UID=andrey;"
|
|
||||||
"PWD=88253332;"
|
|
||||||
"TrustServerCertificate=yes;"
|
|
||||||
)
|
|
||||||
|
|
||||||
INSTALLMENT_GROUP_COL = "Numero_Pedido"
|
|
||||||
RATE_LIMIT_S = 1.5
|
|
||||||
PRINT_EVERY = 1
|
|
||||||
# ──────────────────────────────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
|
|
||||||
def _conn_str() -> str:
|
|
||||||
s = SQL_CONN.rstrip(";")
|
|
||||||
if not re.search(r"(?i)\bEncrypt\b", s):
|
|
||||||
s += ";Encrypt=no"
|
|
||||||
return s + ";"
|
|
||||||
|
|
||||||
|
|
||||||
def _ensure_paytype_table(cur) -> None:
|
|
||||||
cur.execute("""
|
|
||||||
IF OBJECT_ID('dbo.Grgb_installment_paytype', 'U') IS NULL
|
|
||||||
BEGIN
|
|
||||||
CREATE TABLE dbo.Grgb_installment_paytype (
|
|
||||||
InstallmentGroupCode VARCHAR(50) NOT NULL PRIMARY KEY,
|
|
||||||
PaymentType VARCHAR(80) NULL,
|
|
||||||
ConsultadoEm DATETIME2 NOT NULL DEFAULT SYSUTCDATETIME()
|
|
||||||
)
|
|
||||||
END
|
|
||||||
""")
|
|
||||||
|
|
||||||
|
|
||||||
def _load_pending(cur) -> list[str]:
|
|
||||||
cur.execute(f"""
|
|
||||||
SELECT DISTINCT [{INSTALLMENT_GROUP_COL}]
|
|
||||||
FROM dbo.Grgb_vendas_report
|
|
||||||
WHERE [{INSTALLMENT_GROUP_COL}] IS NOT NULL
|
|
||||||
AND [{INSTALLMENT_GROUP_COL}] <> ''
|
|
||||||
AND [{INSTALLMENT_GROUP_COL}] NOT IN (
|
|
||||||
SELECT InstallmentGroupCode FROM dbo.Grgb_installment_paytype
|
|
||||||
)
|
|
||||||
ORDER BY [{INSTALLMENT_GROUP_COL}]
|
|
||||||
""")
|
|
||||||
return [str(r[0]) for r in cur.fetchall()]
|
|
||||||
|
|
||||||
|
|
||||||
def _query_payment_type(
|
|
||||||
session: requests.Session,
|
|
||||||
auth: Auth,
|
|
||||||
group_code: str,
|
|
||||||
) -> Optional[str]:
|
|
||||||
"""Usa get_installments_page do installments_reader (headers + retry corretos)."""
|
|
||||||
try:
|
|
||||||
body = get_installments_page(
|
|
||||||
session=session,
|
|
||||||
auth=auth,
|
|
||||||
start_date=None,
|
|
||||||
end_date=None,
|
|
||||||
installment_change=None,
|
|
||||||
mediator_code=None,
|
|
||||||
page=1,
|
|
||||||
installment_group_code=group_code,
|
|
||||||
)
|
|
||||||
installments = body.get("data", {}).get("installments") or []
|
|
||||||
if installments:
|
|
||||||
return str(installments[0].get("paymentType") or "")
|
|
||||||
except Exception as exc:
|
|
||||||
print(f"[erro] groupCode={group_code}: {exc}")
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def _save(cur, group_code: str, payment_type: Optional[str]) -> None:
|
|
||||||
cur.execute(
|
|
||||||
"INSERT INTO dbo.Grgb_installment_paytype (InstallmentGroupCode, PaymentType) "
|
|
||||||
"VALUES (?, ?)",
|
|
||||||
group_code, payment_type,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
|
||||||
import pyodbc
|
|
||||||
|
|
||||||
conn_str = _conn_str()
|
|
||||||
|
|
||||||
cn = pyodbc.connect(conn_str, timeout=60)
|
|
||||||
cn.autocommit = False
|
|
||||||
cur = cn.cursor()
|
|
||||||
_ensure_paytype_table(cur)
|
|
||||||
cn.commit()
|
|
||||||
pending = _load_pending(cur)
|
|
||||||
cur.close(); cn.close()
|
|
||||||
|
|
||||||
total = len(pending)
|
|
||||||
print(f"[backfill] {total} pedidos pendentes de paymentType")
|
|
||||||
if not total:
|
|
||||||
print("[backfill] nada a fazer.")
|
|
||||||
return
|
|
||||||
|
|
||||||
session = requests.Session()
|
|
||||||
session.trust_env = False
|
|
||||||
auth = Auth(session)
|
|
||||||
|
|
||||||
ok = erros = 0
|
|
||||||
for i, group_code in enumerate(pending, 1):
|
|
||||||
payment_type = _query_payment_type(session, auth, group_code)
|
|
||||||
|
|
||||||
cn = pyodbc.connect(conn_str, timeout=60)
|
|
||||||
cn.autocommit = False
|
|
||||||
cur = cn.cursor()
|
|
||||||
try:
|
|
||||||
_save(cur, group_code, payment_type)
|
|
||||||
cn.commit()
|
|
||||||
ok += 1
|
|
||||||
except Exception as exc:
|
|
||||||
cn.rollback()
|
|
||||||
print(f"[erro] sql groupCode={group_code}: {exc}")
|
|
||||||
erros += 1
|
|
||||||
finally:
|
|
||||||
cur.close(); cn.close()
|
|
||||||
|
|
||||||
if i % PRINT_EVERY == 0 or i == total:
|
|
||||||
pct = i / total * 100
|
|
||||||
print(
|
|
||||||
f"[backfill] {i}/{total} ({pct:.1f}%)"
|
|
||||||
f" ok={ok} erros={erros}"
|
|
||||||
f" ultimo={group_code} paymentType={payment_type}"
|
|
||||||
)
|
|
||||||
|
|
||||||
time.sleep(RATE_LIMIT_S)
|
|
||||||
|
|
||||||
print(f"\n[backfill] concluido: {ok} gravados, {erros} erros")
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
@ -44,8 +44,8 @@ ALL_MEDIATOR_CODES = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
INCREMENTAL = True # True = modo diário incremental
|
INCREMENTAL = True # True = modo diário incremental
|
||||||
START_DATE = "2026-01-01" # usado apenas se INCREMENTAL = False
|
START_DATE = "2025-12-01" # usado apenas se INCREMENTAL = False
|
||||||
END_DATE = "2026-01-31" # usado apenas se INCREMENTAL = False
|
END_DATE = "2026-06-22" # usado apenas se INCREMENTAL = False
|
||||||
INCREMENTAL_DEFAULT_START = "2026-01-01" # data inicial no primeiro run incremental
|
INCREMENTAL_DEFAULT_START = "2026-01-01" # data inicial no primeiro run incremental
|
||||||
|
|
||||||
DATA_TYPE = "VENDAS"
|
DATA_TYPE = "VENDAS"
|
||||||
@ -58,7 +58,7 @@ _SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
|||||||
WATERMARK_FILE = os.path.join(_SCRIPT_DIR, "vendas_watermark.json")
|
WATERMARK_FILE = os.path.join(_SCRIPT_DIR, "vendas_watermark.json")
|
||||||
IMPORT_BATCH_SIZE = 500 # linhas por lote no SQL Server
|
IMPORT_BATCH_SIZE = 500 # linhas por lote no SQL Server
|
||||||
|
|
||||||
ENRICH_PAYMENT_TYPES = True # True = consulta API de parcelas para preencher paymentType
|
ENRICH_PAYMENT_TYPES = False # True = consulta API de parcelas para preencher paymentType
|
||||||
# Nome da coluna em Grgb_vendas_report que contém o installmentGroupCode.
|
# Nome da coluna em Grgb_vendas_report que contém o installmentGroupCode.
|
||||||
# Verifique rodando: SELECT TOP 1 * FROM dbo.Grgb_vendas_report
|
# Verifique rodando: SELECT TOP 1 * FROM dbo.Grgb_vendas_report
|
||||||
INSTALLMENT_GROUP_COL = "Numero_Pedido"
|
INSTALLMENT_GROUP_COL = "Numero_Pedido"
|
||||||
@ -621,11 +621,13 @@ def _build_chunks(start_date: str, end_date: str) -> list[tuple[str, str]]:
|
|||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
|
if INCREMENTAL:
|
||||||
start_date, end_date = _resolve_date_range()
|
start_date, end_date = _resolve_date_range()
|
||||||
|
|
||||||
if not start_date:
|
if not start_date:
|
||||||
print("[info] dados já estão atualizados até ontem, nada a importar.")
|
print("[info] dados já estão atualizados até ontem, nada a importar.")
|
||||||
return
|
return
|
||||||
|
else:
|
||||||
|
start_date, end_date = START_DATE, END_DATE
|
||||||
|
|
||||||
print(f"[info] período a importar: {start_date} .. {end_date}")
|
print(f"[info] período a importar: {start_date} .. {end_date}")
|
||||||
|
|
||||||
|
|||||||
1045
test_installment.py
1045
test_installment.py
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user