Files
vreau-digital/services/seap-scraper/wsp_validate2.py
T
Claude VM a6c03a091e initial: split from gov-agreg — vreau.digital standalone platform
Moved from gov-agreg/src/pages/achizitii/* to root (drop prefix).
- 22 pages migrated, 127 files total
- All internal links: /achizitii/X → /X (176 occurrences fixed)
- AchizitiiLayout subnav rewritten: /X paths, top-right link to vreaudigital.ro hub
- BaseLayout new (vreau.digital branding, OG tags, site URL)
- astro.config.mjs: site https://vreau.digital, server output (was static)
- docker-compose: port 5096 (vreaudigital is 5095), container vreau-digital
- deploy.sh: paths /opt/vreau-digital, log /var/log/vreau-digital-deploy.log

Backend shared with gov-agreg:
- PostgreSQL satra (same schemas: seap, firms, anaf, anre, ...)
- Photon, Martin tiles
- Infisical /vreaudigital path (DATABASE_URL etc. shared)

build: PASS (npx astro check 0 errors, npm run build 5s vite + 10s server)
2026-05-13 00:10:32 +03:00

115 lines
3.6 KiB
Python

#!/usr/bin/env python3
"""Round 2 — re-validate the operations that failed in wsp_validate.py."""
import os
import re
import sys
import time
from datetime import datetime, timedelta
sys.path.insert(0, os.path.dirname(__file__))
from wsp_validate import (
setup_certs, cleanup_certs, make_session, soap_call, parse_response,
)
def t(session, op, fields, contract='ISupplierWebService'):
try:
r, elapsed = soap_call(session, op, fields, contract=contract)
p = parse_response(r.text)
desc = (p['description'] or '')[:120]
print(f' {op:<22} {p["status"]:<18} PageTotal={p["page_total"]} '
f'size={p["size"]/1024:.0f}KB {elapsed:.1f}s')
if desc:
print(f' desc: {desc}')
return p
except Exception as e:
print(f' {op:<22} ERROR: {e}')
return None
def main():
setup_certs()
s = make_session()
today = datetime.now().date()
week_ago = today - timedelta(days=7)
fmt_s = lambda d: d.strftime('%Y-%m-%dT00:00:00')
fmt_e = lambda d: d.strftime('%Y-%m-%dT23:59:59')
print('=== Round 2: Beletage-scoped (Su*) with namespace fix ===')
# SuContracts now uses .Contracts namespace (auto-applied via OP_NAMESPACE)
t(s, 'SuContracts', {
'ContractEndDate': fmt_e(today),
'ContractStartDate': fmt_s(today - timedelta(days=365 * 5)),
'PageIndex': 1,
})
# SuInvoices — short window first to learn the limit
print('\n SuInvoices: probing window-size limit')
for win_days in [7, 30, 90, 365]:
p = t(s, 'SuInvoices', {
'MaxDate': fmt_e(today),
'MinDate': fmt_s(today - timedelta(days=win_days)),
'PageIndex': 1,
})
# SuDirectAcquisitions — try alternate field names too
print('\n SuDirectAcquisitions: try with PublicationStart/EndDate first')
t(s, 'SuDirectAcquisitions', {
'PageIndex': 1,
'PublicationEndDate': fmt_e(today),
'PublicationStartDate': fmt_s(week_ago),
})
# SU_EAProcedure — try common date field names
print('\n SU_EAProcedure: probe field names')
for field_set_name, fields in [
('PublicationStart/End', {
'PageIndex': 1,
'PublicationEndDate': fmt_e(today),
'PublicationStartDate': fmt_s(week_ago),
}),
('Start/End', {
'EndDate': fmt_e(today),
'PageIndex': 1,
'StartDate': fmt_s(week_ago),
}),
('AuctionStart/End', {
'AuctionEndDate': fmt_e(today),
'AuctionStartDate': fmt_s(week_ago),
'PageIndex': 1,
}),
('Min/Max', {
'MaxDate': fmt_e(today),
'MinDate': fmt_s(week_ago),
'PageIndex': 1,
}),
]:
print(f' {field_set_name}:')
t(s, 'SU_EAProcedure', fields)
# Confirm SU_CaNotices day-by-day pagination is stable
print('\n=== T6: 3 sequential days SU_CaNotices (per-day windows) ===')
for d in range(3):
day = today - timedelta(days=d + 1)
p = t(s, 'SU_CaNotices', {
'PageIndex': 1,
'PublicationEndDate': fmt_e(day),
'PublicationStartDate': fmt_s(day),
})
# Test page navigation: page 2 of yesterday's CaNotices
print('\n=== T7: Page 2 navigation (yesterday) ===')
yesterday = today - timedelta(days=1)
for page in [1, 2, 5]:
p = t(s, 'SU_CaNotices', {
'PageIndex': page,
'PublicationEndDate': fmt_e(yesterday),
'PublicationStartDate': fmt_s(yesterday),
})
cleanup_certs()
if __name__ == '__main__':
main()