← Files VeraARCHIVED FILE

modules/registro-imprese-sari/scripts/initialize_case.py

8.72 KB · Oct 2, 2026 · 00:29 UTC

↓ Download file

"""Initialize private draft files for a Registro Imprese/SARI case."""

from __future__ import annotations

import argparse
import logging
from pathlib import Path

from case_core import (
    PLUGIN_NAME,
    AssuranceContractError,
    ensure_safe_output_dir,
    iso_now,
    load_running_case_context,
    safe_identifier,
    validate_iso_date,
    write_private_json,
)
from registry_display import text

__all__ = ["initialize_case", "main"]

LOGGER = logging.getLogger(__name__)
PLUGIN_ROOT = Path(__file__).resolve().parents[1]


def initialize_case(
    output_dir: Path,
    *,
    run_id: str,
    reference_date: str,
    client_reference: str,
    language: str = "it",
    jurisdiction: str = "IT",
    client_engagement: Path | None = None,
) -> dict[str, Path]:
    """Create bounded empty drafts without choosing legal classifications."""

    if jurisdiction not in {"IT", "CH-GE"}:
        raise ValueError("Supported registry jurisdictions are IT and CH-GE")
    run_id = safe_identifier(run_id, field="run_id")
    client_reference = safe_identifier(client_reference, field="client_reference")
    reference_date = validate_iso_date(reference_date, field="reference_date")
    language = str(language or "").strip().lower()
    if not 2 <= len(language) <= 12 or not language.replace("-", "").isalpha():
        raise ValueError("language must be a short language tag")
    safe_output = ensure_safe_output_dir(output_dir, plugin_root=PLUGIN_ROOT)
    output_reference = safe_output.as_posix()
    context_reference = (
        client_engagement.resolve().as_posix()
        if client_engagement is not None
        else None
    )
    path_reference = "absolute"
    if client_engagement is not None:
        context = load_running_case_context(
            client_engagement,
            output_dir=safe_output,
        )
        if str(context["run_id"]) != run_id:
            raise ValueError("run_id must match the customer-folder workflow run")
        output_reference = safe_output.relative_to(Path(context["run_root"])).as_posix()
        context_reference = Path(client_engagement).name
        path_reference = "run_root_relative"
    intake_path = safe_output / "case_intake_draft.json"
    plan_path = safe_output / "practice_plan_draft.json"
    run_path = safe_output / "run_intake.json"
    if any(path.exists() for path in (intake_path, plan_path, run_path)):
        raise FileExistsError("case draft files already exist; do not overwrite them")
    write_private_json(
        intake_path,
        {
            "schema_version": "1.0",
            "plugin": PLUGIN_NAME,
            "jurisdiction": jurisdiction,
            "run_id": run_id,
            "reference_date": reference_date,
            "client_reference": client_reference,
            "client_identity": {
                "name": "",
                "tax_code": "",
                "vat_number": "",
                "email": "",
                "pec": "",
                "phone": "",
                "address": "",
            },
            "competent_chamber": {
                "tenant": "",
                "name": "",
                "territorial_basis": "",
                "confirmation_status": "unknown",
            },
            "subject": {
                "legal_form": "",
                "confirmation_status": "unknown",
            },
            "activity": {
                "description": "",
                "classification_status": "unknown",
                "ateco_proposal": None,
            },
            "requested_operation": {
                "description": "",
                "position_types": [],
                "effective_date": None,
                "confirmation_status": "unknown",
            },
            "current_positions": [],
            "professional_question": "",
        },
    )
    write_private_json(
        plan_path,
        {
            "schema_version": "1.0",
            "plugin": PLUGIN_NAME,
            "jurisdiction": jurisdiction,
            "run_id": run_id,
            "case_summary": "",
            "review_context": {},
            "classification_proposals": [],
            "position_matrix": [],
            "dire_steps": [],
            "required_documents": [],
            "application_fields": [],
            "risks": [],
            "missing_information": [],
            "sari_question_draft": "",
            "limitations": [],
            "professional_review": {
                "status": "pending",
                "reviewer_id": None,
                "reviewer_role": None,
                "reviewed_at": None,
                "notes": None,
            },
        },
    )
    write_private_json(
        run_path,
        {
            "schema_version": "1.0",
            "plugin": PLUGIN_NAME,
            "jurisdiction": jurisdiction,
            "workflow": PLUGIN_NAME,
            "run_id": run_id,
            "reference_date": reference_date,
            "created_at": iso_now(),
            "language": language,
            "path_reference": path_reference,
            "input_paths": [],
            "output_dir": output_reference,
            "inferred_task": (text(language, "initial_task")),
            "assumptions": [text(language, "initial_assumption")],
            "unresolved_questions": [text(language, "initial_question")],
            "dependency_check": {
                "status": "not_recorded",
                "command": ["python", "scripts/check_dependencies.py"],
                "requirements": ["requirements.txt"],
            },
            "status": "pending",
            "data_posture": {
                "local_files_read": [],
                "external_connectors_used": [],
                "external_routes_used": [],
                "upload_paths_used": [],
                "hosted_notebook_execution_used": False,
                "remote_sql_execution_used": False,
                "private_local_output": True,
                "private_case_details_available_for_professional_review": True,
                "public_sari_queries_require_generic_terms": True,
                "network_calls_by_default": False,
                "credentials_or_session_export": False,
                "portal_submission": False,
            },
            "execution_trace": [
                {
                    "step_id": "initialize_case",
                    "kind": "deterministic_initialization",
                    "command": [
                        "python",
                        "scripts/initialize_case.py",
                        "--output-dir",
                        output_reference,
                        *(
                            [
                                "--client-engagement",
                                context_reference,
                            ]
                            if client_engagement is not None
                            else []
                        ),
                        "--reference-date",
                        reference_date,
                        "--client-reference",
                        client_reference,
                        "--language",
                        language,
                    ],
                    "execution_location": "local_python",
                    "status": "passed",
                    "inputs": [],
                    "outputs": [intake_path.name, plan_path.name, run_path.name],
                }
            ],
        },
    )
    return {"intake": intake_path, "plan": plan_path, "run_intake": run_path}


def main(argv: list[str] | None = None) -> int:
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--output-dir", type=Path, required=True)
    parser.add_argument("--client-engagement", type=Path, required=True)
    parser.add_argument("--reference-date", required=True)
    parser.add_argument("--client-reference", required=True)
    parser.add_argument("--language", default="it")
    parser.add_argument("--jurisdiction", choices=("IT", "CH-GE"), default="IT")
    args = parser.parse_args(argv)
    try:
        context = load_running_case_context(
            args.client_engagement,
            output_dir=args.output_dir,
        )
        paths = initialize_case(
            args.output_dir,
            run_id=context["run_id"],
            reference_date=args.reference_date,
            client_reference=args.client_reference,
            language=args.language,
            jurisdiction=args.jurisdiction,
            client_engagement=args.client_engagement,
        )
    except (AssuranceContractError, OSError, ValueError) as exc:
        LOGGER.error("INITIALIZATION_BLOCKED: %s", exc)
        return 2
    LOGGER.info("Initialized case drafts in %s", paths["run_intake"].parent)
    return 0


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO, format="%(message)s")
    raise SystemExit(main())

SHA-256: 19f65b53bb2e30def75a52c79a003e72524493e45d86a2016681a739d07b78c8