{
  "$schema": "https://json-schema.org/draft-07/schema",
  "title": "label.payGap",
  "type": "object",
  "required": ["insurerCode", "yearMonth", "entries"],
  "additionalProperties": false,
  "x-errors": {
    "required": {
      "insurerCode": "error.insurerCode.required",
      "yearMonth": "error.yearMonth.required",
      "entries": "error.entries.required"
    }
  },
  "properties": {
    "insurerCode": {
      "type": "string",
      "pattern": "^\\d{1,7}$",
      "title": "label.insurerCode",
      "x-errors": {
        "pattern": "error.insurerCode.pattern"
      }
    },
    "yearMonth": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}$",
      "title": "label.yearMonth",
      "x-errors": {
        "pattern": "error.yearMonth.pattern"
      }
    },
    "entries": {
      "title": "label.entries",
      "type": "array",
      "minItems": 1,
      "x-unique-employees": true,
      "x-errors": {
        "minItems": "error.entries.minItems",
        "x-unique-employees": "error.entries.nonUnique"
      },
      "items": {
        "type": "object",
        "required": ["employeeInfo", "salaryInfo"],
        "additionalProperties": false,
        "x-errors": {
          "required": {
            "employeeInfo": "error.employeeInfo.required",
            "salaryInfo": "error.salaryInfo.required"
          }
        },
        "properties": {
          "employeeInfo": {
            "type": "object",
            "title": "label.employeeInfo",
            "required": ["name", "surname", "gender"],
            "additionalProperties": false,
            "allOf": [
              {
                "if": {
                  "not": {
                    "anyOf": [
                      { "required": ["personCode"] },
                      { "required": ["personSSN"] },
                      { "required": ["personILTU"] }
                    ]
                  }
                },
                "then": {
                  "required": ["personCode", "personSSN", "personILTU", "birthDate"]
                }
              },
              {
                "if": {
                  "allOf": [
                    { "not": { "required": ["personCode"] } },
                    {
                      "anyOf": [
                        { "required": ["personSSN"] },
                        { "required": ["personILTU"] }
                      ]
                    }
                  ]
                },
                "then": {
                  "required": ["birthDate"]
                }
              }
            ],
            "x-match-code-and-date": true,
            "x-match-code-and-gender": true,
            "x-errors": {
              "required": {
                "name": "error.employeeInfo.name.required",
                "surname": "error.employeeInfo.surname.required",
                "gender": "error.employeeInfo.gender.required",
                "personCode": "error.employeeInfo.personCode.requiredIfNoOther",
                "personSSN": "error.employeeInfo.personSSN.requiredIfNoOther",
                "personILTU": "error.employeeInfo.personILTU.requiredIfNoOther",
                "birthDate": "error.employeeInfo.birthDate.requiredIfNoPersonCode"
              },
              "x-match-code-and-date": "error.employeeInfo.identityMismatch",
              "x-match-code-and-gender": "error.employeeInfo.genderMismatch"
            },
            "properties": {
              "name": {
                "type": "string",
                "pattern": "^\\p{L}+([ '-]\\p{L}+)*$",
                "maxLength": 50,
                "title": "label.employeeInfo.name",
                "x-errors": {
                  "pattern": "error.employeeInfo.name.pattern",
                  "maxLength": "error.employeeInfo.name.maxLength"
                }
              },
              "surname": {
                "type": "string",
                "pattern": "^\\p{L}+([ '-]\\p{L}+)*$",
                "maxLength": 50,
                "title": "label.employeeInfo.surname",
                "x-errors": {
                  "pattern": "error.employeeInfo.surname.pattern",
                  "maxLength": "error.employeeInfo.surname.maxLength"
                }
              },
              "personCode": {
                "type": "string",
                "pattern": "^\\d{11}$",
                "x-person-code": true,
                "title": "label.employeeInfo.personCode",
                "x-errors": {
                  "pattern": "error.employeeInfo.personCode.pattern",
                  "x-person-code": "error.employeeInfo.personCode.invalid"
                }
              },
              "personSSN": {
                "type": "string",
                "pattern": "^[A-Z]{2}\\d{7}$",
                "title": "label.employeeInfo.personSSN",
                "x-errors": {
                  "pattern": "error.employeeInfo.personSSN.pattern"
                }
              },
              "personILTU": {
                "type": "string",
                "pattern": "^\\d{11}$",
                "title": "label.employeeInfo.personILTU",
                "x-errors": {
                  "pattern": "error.employeeInfo.personILTU.pattern"
                }
              },
              "birthDate": {
                "type": "string",
                "format": "date",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "title": "label.employeeInfo.birthDate",
                "x-errors": {
                  "format": "error.employeeInfo.birthDate.format",
                  "pattern": "error.employeeInfo.birthDate.pattern"
                }
              },
              "gender": {
                "type": "string",
                "title": "label.employeeInfo.gender",
                "oneOf": [
                  { "const": "M", "title": "option.employeeInfo.gender.M" },
                  { "const": "F", "title": "option.employeeInfo.gender.F" }
                ],
                "x-errors": {
                  "const": "error.employeeInfo.gender.invalid",
                  "oneOf": "error.employeeInfo.gender.invalid",
                  "type": "error.employeeInfo.gender.invalid"
                }
              }
            }
          },
          "salaryInfo": {
            "title": "label.salaryInfo",
            "type": "array",
            "minItems": 1,
            "x-unique-prof-groups": true,
            "x-errors": {
              "minItems": "error.salaryInfo.minItems",
              "x-unique-prof-groups": "error.salaryInfo.nonUnique"
            },
            "items": {
              "type": "object",
              "required": ["profGroupNum", "workTimeRate", "workTimeMode", "bruttoPayment", "bruttoExtraPayment", "paidWorkHours"],
              "additionalProperties": false,
              "x-payment-constraint": true,
              "x-errors": {
                "required": {
                  "profGroupNum": "error.salaryInfo.profGroupNum.required",
                  "workTimeRate": "error.salaryInfo.workTimeRate.required",
                  "workTimeMode": "error.salaryInfo.workTimeMode.required",
                  "bruttoPayment": "error.salaryInfo.bruttoPayment.required",
                  "bruttoExtraPayment": "error.salaryInfo.bruttoExtraPayment.required",
                  "paidWorkHours": "error.salaryInfo.paidWorkHours.required"
                },
                "x-payment-constraint": "error.salaryInfo.bruttoExtraPayment.exceedsBrutto"
              },
              "properties": {
                "profGroupNum": {
                  "type": "string",
                  "pattern": "^[a-zA-Z0-9.-]+$",
                  "maxLength": 15,
                  "title": "label.salaryInfo.profGroupNum",
                  "x-errors": {
                    "pattern": "error.salaryInfo.profGroupNum.pattern",
                    "maxLength": "error.salaryInfo.profGroupNum.maxLength"
                  }
                },
                "workTimeRate": {
                  "type": "string",
                  "pattern": "^(0|[1-9]\\d?),\\d{2}$",
                  "title": "label.salaryInfo.workTimeRate",
                  "x-errors": {
                    "pattern": "error.salaryInfo.workTimeRate.pattern"
                  }
                },
                "workTimeMode": {
                  "type": "string", "title": "label.salaryInfo.workTimeMode",
                  "oneOf": [
                    { "const": "01", "title": "option.salaryInfo.workTimeMode.01" },
                    { "const": "02", "title": "option.salaryInfo.workTimeMode.02" },
                    { "const": "03", "title": "option.salaryInfo.workTimeMode.03" },
                    { "const": "04", "title": "option.salaryInfo.workTimeMode.04" },
                    { "const": "05", "title": "option.salaryInfo.workTimeMode.05" }
                  ],
                  "x-errors": {
                    "const": "error.salaryInfo.workTimeMode.invalid",
                    "oneOf": "error.salaryInfo.workTimeMode.invalid",
                    "type": "error.salaryInfo.workTimeMode.invalid"
                  }
                },
                "bruttoPayment": {
                  "type": "string",
                  "pattern": "^(0|[1-9]\\d*),\\d{2}$",
                  "maxLength": 15,
                  "title": "label.salaryInfo.bruttoPayment",
                  "x-errors": {
                    "pattern": "error.salaryInfo.bruttoPayment.pattern",
                    "maxLength": "error.salaryInfo.bruttoPayment.maxLength"
                  }
                },
                "bruttoExtraPayment": {
                  "type": "string",
                  "pattern": "^(0|[1-9]\\d*),\\d{2}$",
                  "maxLength": 15,
                  "default": "0,00",
                  "title": "label.salaryInfo.bruttoExtraPayment",
                  "x-errors": {
                    "pattern": "error.salaryInfo.bruttoExtraPayment.pattern",
                    "maxLength": "error.salaryInfo.bruttoExtraPayment.maxLength"
                  }
                },
                "paidWorkHours": {
                  "type": "string",
                  "pattern": "^(0|[1-9]\\d{0,2}),\\d{2}$",
                  "title": "label.salaryInfo.paidWorkHours",
                  "x-errors": {
                    "pattern": "error.salaryInfo.paidWorkHours.pattern"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}