{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://example.local/orzeczenie_mp_input.schema.json",
  "title": "Orzeczenie lekarskie MP v0.1 — dane wejściowe",
  "description": "Dane wejściowe do generatora CDA orzeczenia lekarskiego z badania profilaktycznego medycyny pracy (profil prywatny KAMSOFT). Dokument następczy po skierowaniu MP.",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "document",
    "patient",
    "author",
    "psmp",
    "referral_ref",
    "exam_type_code",
    "employment_status_code",
    "position",
    "employer",
    "legal_basis_code",
    "certificate_outcome_code",
    "issue_location"
  ],
  "properties": {
    "identifiers": {
      "description": "Nadpisanie domyślnych OID-rootów. Pola opcjonalne — jeśli nieobecne, generator użyje wartości domyślnych dla instancji klienta.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "document_id_root": {
          "description": "OID gałęzi identyfikatorów dokumentów orzeczenia danego klienta (4.z.i.w.l.*).",
          "type": "string"
        },
        "referral_id_root": {
          "description": "OID gałęzi identyfikatorów skierowań danego klienta (4.z.i.w.l.15) — musi być taki sam jak root w nagłówku skierowania.",
          "type": "string"
        },
        "patient_hr_id_root": {
          "description": "OID gałęzi wewnętrznych ID kadrowych pracownika.",
          "type": "string"
        },
        "pesel_root": {
          "description": "OID systemu PESEL (domyślnie: 2.16.840.1.113883.3.4424.1.1.616).",
          "type": "string"
        },
        "pwz_root": {
          "description": "OID systemu PWZ lekarzy (domyślnie: 2.16.840.1.113883.3.4424.1.6.2).",
          "type": "string"
        },
        "rpwdl_unit_root": {
          "description": "OID RPWDL komórek organizacyjnych (domyślnie: 2.16.840.1.113883.3.4424.2.3.2).",
          "type": "string"
        },
        "rpwdl_entity_root": {
          "description": "OID RPWDL podmiotów leczniczych (domyślnie: 2.16.840.1.113883.3.4424.2.3.1).",
          "type": "string"
        },
        "nip_root": {
          "description": "OID systemu NIP (domyślnie: 2.16.840.1.113883.3.4424.2.1).",
          "type": "string"
        },
        "regon9_root": {
          "description": "OID systemu REGON-9 (domyślnie: 2.16.840.1.113883.3.4424.2.2.1).",
          "type": "string"
        }
      }
    },

    "document": {
      "description": "Metadane dokumentu CDA.",
      "type": "object",
      "additionalProperties": false,
      "required": ["id_extension", "effective_time", "certificate_number", "issuance_mode_code"],
      "properties": {
        "id_extension": {
          "description": "Unikalny identyfikator dokumentu orzeczenia w gałęzi klienta (extension do OID z identifiers.document_id_root).",
          "type": "string",
          "minLength": 1
        },
        "effective_time": {
          "description": "Data i czas wystawienia orzeczenia (format: YYYYMMDD lub YYYYMMDDHHmmss+ZZZZ).",
          "type": "string",
          "minLength": 8
        },
        "version_number": {
          "description": "Numer wersji dokumentu (domyślnie: 1).",
          "type": "integer",
          "minimum": 1,
          "default": 1
        },
        "set_id_extension": {
          "description": "Identyfikator zestawu wersji dokumentu (setId.extension). Stały dla wszystkich wersji tego samego orzeczenia.",
          "type": "string"
        },
        "certificate_number": {
          "description": "Numer orzeczenia w formacie przyjętym przez PSMP (np. '26/08/2025'). Umieszczany w wpisie LOINC 91886-2.",
          "type": "string",
          "minLength": 1
        },
        "issuance_mode_code": {
          "description": "Tryb wystawienia orzeczenia: Z = zwykły, O = odwoławczy (ostateczne).",
          "type": "string",
          "enum": ["Z", "O"]
        }
      }
    },

    "patient": {
      "description": "Dane pracownika (recordTarget). Identyfikacja wg PIK HL7CDA — PESEL jako priorytet I.",
      "type": "object",
      "additionalProperties": false,
      "required": ["pesel", "given", "family", "gender", "birth_date", "address"],
      "properties": {
        "hr_id_extension": {
          "description": "Wewnętrzny ID kadrowy pracownika u pracodawcy (opcjonalny; root z identifiers.patient_hr_id_root).",
          "type": "string"
        },
        "pesel": {
          "type": "string",
          "pattern": "^[0-9]{11}$"
        },
        "given": { "type": "string" },
        "family": { "type": "string" },
        "gender": {
          "type": "string",
          "enum": ["M", "F"]
        },
        "birth_date": {
          "type": "string",
          "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
        },
        "address": { "$ref": "#/$defs/postalAddress" }
      }
    },

    "author": {
      "description": "Lekarz medycyny pracy wystawiający orzeczenie (author w CDA). Identyfikowany przez PWZ.",
      "type": "object",
      "additionalProperties": false,
      "required": ["pwz", "given", "family"],
      "properties": {
        "pwz": {
          "description": "Numer prawa wykonywania zawodu lekarza (7 cyfr).",
          "type": "string",
          "pattern": "^[0-9]{7}$"
        },
        "specialization_license": {
          "description": "Numer prawa do wykonywania specjalności — medycyna pracy (root: 2.16.840.1.113883.3.4424.1.13.1).",
          "type": "string"
        },
        "given": { "type": "string" },
        "family": { "type": "string" }
      }
    },

    "psmp": {
      "description": "Podmiot służby medycyny pracy (PSMP) — organizacja autora i custodian dokumentu.",
      "type": "object",
      "additionalProperties": false,
      "required": ["rpwdl_unit", "rpwdl_entity", "name", "telecom", "address"],
      "properties": {
        "rpwdl_unit": {
          "description": "Identyfikator RPWDL komórki organizacyjnej (np. '000000001007-01').",
          "type": "string"
        },
        "rpwdl_entity": {
          "description": "Identyfikator RPWDL podmiotu leczniczego (np. '000000001007').",
          "type": "string"
        },
        "regon14": {
          "description": "REGON-14 podmiotu leczniczego.",
          "type": "string",
          "pattern": "^[0-9]{14}$"
        },
        "name": {
          "description": "Pełna nazwa PSMP.",
          "type": "string"
        },
        "telecom": {
          "description": "Telefon PSMP w formacie 'tel:XX XXX XX XX'.",
          "type": "string"
        },
        "address": { "$ref": "#/$defs/postalAddress" }
      }
    },

    "referral_ref": {
      "description": "Powiązanie ze skierowaniem (inFulfillmentOf). Obowiązkowe — każde orzeczenie musi wskazywać skierowanie, na podstawie którego przeprowadzono badanie.",
      "type": "object",
      "additionalProperties": false,
      "required": ["id_extension", "referral_date"],
      "properties": {
        "id_extension": {
          "description": "Numer skierowania (extension z nagłówka dokumentu skierowania).",
          "type": "string",
          "minLength": 1
        },
        "id_root": {
          "description": "OID gałęzi skierowań klienta (jeśli różna od identifiers.referral_id_root).",
          "type": "string"
        },
        "referral_date": {
          "description": "Data wystawienia skierowania (YYYY-MM-DD). Umieszczana w wpisie LOINC 57202-4.",
          "type": "string",
          "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
        }
      }
    },

    "exam_type_code": {
      "description": "Kod rodzaju badania profilaktycznego ze słownika oh-exam-type (1.2.616.1.113769.1.9). Odpowiada kodowi ze skierowania. Wartości: 01=wstępne, 02=okresowe, 03=kontrolne, 04=końcowe, 05=sanitarno-epid., 06=celowane.",
      "type": "string",
      "enum": ["01", "02", "03", "04", "05", "06"]
    },

    "employment_status_code": {
      "description": "Rodzaj zatrudnienia pracownika w chwili badania (RodzajZatrudnienia, OID: 2.16.840.1.113883.3.4424.13.5.31.2). Wartości: 1=pracownik, 2=przyjmowany do pracy, 3=uczeń/student, 4=pracownik tymczasowy.",
      "type": "string",
      "enum": ["1", "2", "3", "4"]
    },

    "position": {
      "description": "Stanowisko pracy pracownika, na które dotyczy orzeczenie.",
      "type": "object",
      "additionalProperties": false,
      "required": ["position_display"],
      "properties": {
        "position_display": {
          "description": "Tekstowa nazwa stanowiska (widoczna w dokumencie).",
          "type": "string"
        },
        "position_code": {
          "description": "Opcjonalny kod stanowiska z ERP klienta (codeSystem: 1.2.616.1.113769.4.z.i.w.l.81).",
          "type": "string"
        }
      }
    },

    "employer": {
      "description": "Dane pracodawcy — umieszczane jako participant IND w obserwacji stanowiska (sekcja 1, wpis 1.5).",
      "type": "object",
      "additionalProperties": false,
      "required": ["name", "address"],
      "properties": {
        "nip": {
          "description": "NIP pracodawcy (10 cyfr lub format XX-XX-XX-XXX).",
          "type": "string"
        },
        "regon9": {
          "description": "REGON-9 pracodawcy.",
          "type": "string",
          "pattern": "^[0-9]{9}$"
        },
        "name": {
          "description": "Pełna nazwa pracodawcy.",
          "type": "string"
        },
        "telecom": {
          "description": "Telefon pracodawcy (opcjonalny).",
          "type": "string"
        },
        "address": { "$ref": "#/$defs/postalAddress" }
      }
    },

    "legal_basis_code": {
      "description": "Kod podstawy prawnej orzeczenia (PodstawaPrawnaOrzeczeniaMedycynyPracy, OID: 2.16.840.1.113883.3.4424.13.5.31.7). Wybierany zgodnie z rodzajem zatrudnienia i rodzajem badania. Przykład: '1' = art. 43 pkt 2 i art. 229 § 4 KP (tryb zwykły, badania profilaktyczne).",
      "type": "string",
      "minLength": 1
    },

    "certificate_outcome_code": {
      "description": "Kod wyniku orzeczenia (RodzajOrzeczeniaMedycynyPracy, OID: 2.16.840.1.113883.3.4424.13.5.31.3). Symbole wg Rozp. MZiOS 1996 zał. 8. Wartości: 21=zdolny bez p/wsk, 22=czasowo niezdolny, 23=niezdolny, 31=zdolny z ograniczeniami, 32=niezdolny-choroba zawodowa, 33=zakaz-młodociani, 34=podejrzenie ch. zawodowej, 41=niezdolny san-epid.",
      "type": "string",
      "enum": ["21", "22", "23", "31", "32", "33", "34", "41"]
    },

    "certificate_outcome_display": {
      "description": "Opcjonalne nadpisanie wyświetlanego tekstu orzeczenia (displayName). Jeśli nieobecne, generator użyje standardowego tekstu dla danego kodu wg IK 1.3.2.",
      "type": "string"
    },

    "restrictions": {
      "description": "Ograniczenia i zalecenia lekarza (sekcja 2). Wymagane gdy certificate_outcome_code = '31' (zdolny z ograniczeniami). Opcjonalne dla innych kodów.",
      "type": "object",
      "additionalProperties": false,
      "required": ["text"],
      "properties": {
        "text": {
          "description": "Opis ograniczeń lub zaleceń dla pracodawcy (tekst wolny).",
          "type": "string",
          "minLength": 1
        },
        "duration_display": {
          "description": "Okres obowiązywania ograniczeń (tekst wolny, np. 'na czas nieokreślony', 'przez 6 miesięcy').",
          "type": "string"
        }
      }
    },

    "next_exam_date": {
      "description": "Data następnego badania profilaktycznego (YYYY-MM-DD). Zalecana dla kodów 21 i 31. Umieszczana w wpisie LOINC 57070-5.",
      "type": "string",
      "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
    },

    "issue_location": {
      "description": "Miejscowość wydania orzeczenia (np. 'Bydgoszcz'). Umieszczana w wpisie LOINC 80412-0.",
      "type": "string",
      "minLength": 1
    },

    "include_legal_notice": {
      "description": "Czy dołączyć sekcję Pouczenia (sekcja 3). Domyślnie true. Ustaw false dla trybu odwoławczego (issuance_mode_code='O') — orzeczenie jest już ostateczne.",
      "type": "boolean",
      "default": true
    }
  },

  "$defs": {
    "postalAddress": {
      "type": "object",
      "additionalProperties": false,
      "required": ["city", "postal_code", "street_name", "house_number"],
      "properties": {
        "country": { "type": "string" },
        "city": { "type": "string" },
        "postal_code": {
          "type": "string",
          "pattern": "^[0-9]{2}-[0-9]{3}$"
        },
        "street_name": { "type": "string" },
        "house_number": { "type": "string" },
        "unit_id": {
          "description": "Numer mieszkania / lokalu.",
          "type": "string"
        }
      }
    }
  }
}
