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
TSIdDPSquando 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
TSIdDPScomo 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.:
A1→000A1;12→00012.
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.