Divergência entre TSSerieDPS e TSIdDPS (série alfanumérica x ID numérico)

Há uma inconsistência entre os tipos TSSerieDPS e TSIdDPS no XSD da DPS:

  • TSSerieDPS permite letras (qualquer string de 1 a 5 caracteres).

  • TSIdDPS exige que o identificador completo seja numérico após o prefixo DPS (DPS[0-9]{42}).

Como a regra do identificador diz que a Série DPS (5 posições) compõe o ID da DPS, qualquer série com letras inviabiliza um TSIdDPS válido hoje.


Trechos atuais do XSD (problema)

<!-- ID da DPS: exige 42 dígitos após 'DPS' -->
<xs:simpleType name="TSIdDPS">
  <xs:annotation>
    <xs:documentation>
      "DPS" + Cód.Mun (7) + Tipo IF (1) + IF (14) + Série DPS (5) + Núm. DPS (15)
    </xs:documentation>
  </xs:annotation>
  <xs:restriction base="xs:string">
    <xs:whiteSpace value="preserve"/>
    <xs:maxLength value="45"/>
    <xs:pattern value="DPS[0-9]{42}"/>
  </xs:restriction>
</xs:simpleType>

<!-- Série: aceita letras (qualquer string) -->
<xs:simpleType name="TSSerieDPS">
  <xs:restriction base="xs:string">
    <xs:maxLength value="5"/>
    <xs:minLength value="1"/>
    <xs:whiteSpace value="preserve"/>
  </xs:restriction>
</xs:simpleType>


Impacto

  • Validação XSD falha ao montar o TSIdDPS quando a série contém letras.

  • Sistemas que aceitam séries alfanuméricas não conseguem gerar um ID válido com o XSD atual.

  • Ambiguidade na regra de padding da série (fixo 5 caracteres no ID).


Propostas de Correção (duas opções)

Objetivo: alinhar a especificação para que toda série válida também componha um ID válido de 45 posições.

Opção A — Restringir TSSerieDPS a numérica

  • Pró: Mantém o TSIdDPS como está (DPS[0-9]{42}), simples e retrocompatível com implementações numéricas.

  • Contra: Quebra cenários onde a série é alfanumérica por norma local ou prática de mercado.

XSD sugerido:

<xs:simpleType name="TSSerieDPS">
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]{1,5}"/>
    <xs:whiteSpace value="preserve"/>
  </xs:restriction>
</xs:simpleType>

Opção B — Permitir alfanumérico na fatia da série dentro de TSIdDPS

  • Pró: Respeita a prática de séries alfanuméricas; condiz com “Série DPS (5)”.

  • Contra: Requer ajuste de pattern no ID e normatizar padding (5 posições fixas).

XSD sugerido (pattern detalhado):

<!-- 3 ('DPS') + 7 + 1 + 14 + 5 + 15 = 45 -->
<xs:simpleType name="TSIdDPS">
  <xs:restriction base="xs:string">
    <xs:length value="45"/>
    <xs:pattern value="DPS[0-9]{7}[0-9]{1}[0-9]{14}[A-Za-z0-9]{5}[0-9]{15}"/>
  </xs:restriction>
</xs:simpleType>

Norma de composição (sugerida):

  • Série DPS: exatamente 5 posições no ID, alfanumérica, uppercase.

  • Padding se < 5 chars: left-pad com ‘0’.

    Ex.: A1000A1; 1200012.

Em um primeiro momento, eu sugeri aceitar apenas números na Série DPS (Opção A) para resolver rapidamente a validação. Entretanto, há uma evolução prevista de domínio em que o próprio identificador poderá ter requisitos que admitam letras no CNPJ (ou formatos correlatos que deixem de ser estritamente numéricos). Nesse cenário, ambas as soluções tornam-se viáveis:

  • A (numérica) como estabilização imediata,

  • B (alfanumérica no ID) como alinhamento de longo prazo com a realidade de séries alfanuméricas e possíveis ajustes no domínio de identificação.