paperhawk / validation /date_logic.py
Nándorfi Vince
Initial paperhawk push to HF Space (LFS for binaries)
7ff7119
raw
history blame
2.2 kB
"""Date-logic validation — Python deterministic.
* Invoice: payment_due_date < issue_date → "medium" severity
The contract date check (``check_14_contract_dates``) lives in domain_checks/.
This module covers only invoice-level date logic so that ``basic_risk_node``
does not duplicate ``check_14``.
"""
from __future__ import annotations
def validate_date_logic(extracted: dict) -> list[dict]:
"""Invoice date-logic check. Simple string comparison (works for ISO 8601)."""
errors: list[dict] = []
issue_date = extracted.get("issue_date")
due_date = extracted.get("payment_due_date")
if issue_date and due_date and isinstance(issue_date, str) and isinstance(due_date, str):
if due_date < issue_date:
errors.append({
"type": "date_error",
"severity": "medium",
"message": (
f"Payment due date ({due_date}) is earlier than "
f"the issue date ({issue_date})"
),
})
return errors
def validate_contract_dates(extracted: dict) -> list[dict]:
"""Contract-specific date logic: expiry_date >= effective_date.
The richer message is provided by ``domain_checks/check_14_contract_dates``;
this function exists only as a fallback in the basic_risk_node flow.
"""
from utils.numbers import is_null_alias
errors: list[dict] = []
effective_date = str(extracted.get("effective_date") or "")
expiry_date = str(extracted.get("expiry_date") or "")
indefinite_tokens = {"indefinite", "unlimited", "perpetual", "open-ended",
"határozatlan", "unbefristet"}
if (effective_date and expiry_date
and not is_null_alias(effective_date) and not is_null_alias(expiry_date)
and expiry_date.lower() not in indefinite_tokens
and expiry_date < effective_date):
errors.append({
"type": "date_error",
"severity": "high",
"message": (
f"Date logic contradiction: expiry date ({expiry_date}) "
f"precedes effective date ({effective_date})"
),
})
return errors