<?xml version="1.0" encoding="UTF-8"?>
<!--
  Joonow XML: esquema do feed de vagas do programa de parceiros (Indeed-compatible).
  Especificação: https://www.joonow.com/pt-br/integre-seu-ats/especificacao
  (en: https://www.joonow.com/en/integrate-your-ats/specification · es: https://www.joonow.com/es/integra-tu-ats/especificacion)

  - Raiz <source> com metadados opcionais e uma lista de <job>.
  - Dentro de <job>, os elementos podem vir em qualquer ordem; o texto pode vir em CDATA.
  - Obrigatórios: referencenumber, title, description, url, company.
  - Sem DTD/DOCTYPE: um arquivo com DTD é recusado na leitura.
  - O leitor da Joonow aceita mais do que este esquema (nomes sem diferenciar maiúsculas, elementos desconhecidos ignorados);
    o esquema descreve o subconjunto recomendado.
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">

  <xs:simpleType name="nonEmpty200">
    <xs:restriction base="xs:string">
      <xs:minLength value="1"/>
      <xs:maxLength value="200"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="httpUrl">
    <xs:restriction base="xs:string">
      <xs:pattern value="\s*https?://\S+\s*"/>
      <xs:maxLength value="2048"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Um endereço só, até 254 caracteres. O leitor da Joonow confere de novo (ASCII, domínio com ponto, sem caixa "não responda"). -->
  <xs:simpleType name="email">
    <xs:restriction base="xs:string">
      <xs:pattern value="\s*[^@\s,;]+@[^@\s,;]+\.[^@\s,;]+\s*"/>
      <xs:maxLength value="254"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="yesNo">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Yes"/>
      <xs:enumeration value="No"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="job">
    <xs:all>
      <!-- Id único e estável da vaga entre leituras. -->
      <xs:element name="referencenumber" type="nonEmpty200"/>
      <xs:element name="title" type="nonEmpty200"/>
      <!-- HTML simples (p, br, ul, ol, li, strong, b, em, i, u, h2-h4, a, blockquote, hr), até 50 KB. -->
      <xs:element name="description" type="xs:string"/>
      <!-- URL direta da vaga no ATS (botão "Candidatar-se"). -->
      <xs:element name="url" type="httpUrl"/>
      <xs:element name="company" type="xs:string"/>
      <!-- Recomendado: e-mail profissional de quem responde pela vaga. Não aparece no site; a vaga ganha pontos na ordenação.
           Inválido é ignorado sem recusar a vaga. -->
      <xs:element name="email" type="email" minOccurs="0"/>
      <!-- Recomendados: site e logo da empresa (a descrição é opcional). Ajudam a montar a página da empresa (logo nas vagas e no diretório);
           inválido é ignorado sem recusar a vaga. Logo em PNG, JPEG ou WebP com 128 px ou mais; a Joonow baixa e serve a cópia. -->
      <xs:element name="companyurl" type="httpUrl" minOccurs="0"/>
      <xs:element name="companylogo" type="httpUrl" minOccurs="0"/>
      <xs:element name="companydescription" type="xs:string" minOccurs="0"/>
      <xs:element name="city" type="xs:string" minOccurs="0"/>
      <!-- UF ou nome do estado. -->
      <xs:element name="state" type="xs:string" minOccurs="0"/>
      <!-- ISO 3166-1 alfa-2 (BR, PT, MX...) ou nome do país. -->
      <xs:element name="country" type="xs:string" minOccurs="0"/>
      <!-- Publicação: ISO 8601 (2026-10-28T13:00:00Z) ou RFC 1123 (Wed, 28 Oct 2026 13:00:00 GMT). -->
      <xs:element name="date" type="xs:string" minOccurs="0"/>
      <!-- Validade: ISO 8601. Depois dela, a vaga é encerrada. -->
      <xs:element name="expirationdate" type="xs:string" minOccurs="0"/>
      <!-- Só quando a empresa informa: valor ou faixa com moeda e período. -->
      <xs:element name="salary" type="xs:string" minOccurs="0"/>
      <!-- fulltime, parttime, contract, temporary, internship, volunteer (ou os rótulos em português da especificação). -->
      <xs:element name="jobtype" type="xs:string" minOccurs="0"/>
      <!-- Nível: Apprentice, Intern, Entry, Operational, Professional, Management, Executive (ou os rótulos em português). -->
      <xs:element name="category" type="xs:string" minOccurs="0"/>
      <xs:element name="isRemote" type="yesNo" minOccurs="0"/>
      <!-- Fully remote, Hybrid remote ou On-site. -->
      <xs:element name="remotetype" type="xs:string" minOccurs="0"/>
    </xs:all>
  </xs:complexType>

  <xs:element name="source">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="publisher" type="xs:string" minOccurs="0"/>
        <xs:element name="publisherurl" type="httpUrl" minOccurs="0"/>
        <xs:element name="lastBuildDate" type="xs:string" minOccurs="0"/>
        <xs:element name="job" type="job" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>
