Ao consultar débitos veiculares, é comum encontrar situações onde alguns débitos possuem relacionamentos e restrições entre si. A API Uvvipague retorna três tipos de relacionamentos que você precisa entender e tratar corretamente:
Dependentes
Débitos que devem ser pagos juntos
Distintos
Débitos que não podem ser pagos juntos
Obrigatórios
Débitos que sempre devem ser incluídos
Importante: Ignorar essas regras resultará em erro na solicitação de pagamento. É fundamental validar esses relacionamentos antes de processar o pagamento.
Débitos dependentes são aqueles que precisam ser pagos em conjunto. Quando um débito possui dependência de outro, ambos devem ser incluídos na mesma solicitação de pagamento.
O caso mais comum é o licenciamento, que geralmente depende da quitação do IPVA e/ou multas pendentes.
Regra: Para licenciar um veículo, é necessário estar com o IPVA e multas em dia. Por isso, o débito de licenciamento pode ter dependência desses outros débitos.
Antes de enviar a solicitação de pagamento, valide se todos os débitos dependentes estão incluídos:
Copy
function validarDebitos(debitosSelecionados, todosDebitos) { for (const debito of debitosSelecionados) { // Verifica se o débito tem dependências if (debito.dependsOn && debito.dependsOn.length > 0) { // Verifica se todas as dependências estão selecionadas for (const dependenciaId of debito.dependsOn) { const dependenciaIncluida = debitosSelecionados.some( d => d.id === dependenciaId ); if (!dependenciaIncluida) { const dependencia = todosDebitos.find(d => d.id === dependenciaId); throw new Error( `O débito "${debito.title}" depende de "${dependencia.title}" ` + `e ambos devem ser pagos juntos.` ); } } } } return true;}// Exemplo de usotry { validarDebitos(debitosSelecionados, todosDebitos); // Prosseguir com o pagamento} catch (error) { console.error(error.message); // Exibir mensagem ao usuário}
Valide se não há débitos distintos selecionados juntos:
Copy
function validarDebitosDistintos(debitosSelecionados) { for (const debito of debitosSelecionados) { // Verifica se o débito tem restrições de distintos if (debito.distinct && debito.distinct.length > 0) { // Verifica se algum débito distinto foi selecionado for (const distintoId of debito.distinct) { const distintoIncluido = debitosSelecionados.some( d => d.id === distintoId ); if (distintoIncluido) { const distintoDebito = debitosSelecionados.find( d => d.id === distintoId ); throw new Error( `Os débitos "${debito.title}" e "${distintoDebito.title}" ` + `não podem ser pagos juntos. Escolha apenas um.` ); } } } } return true;}// Exemplo de usotry { validarDebitosDistintos(debitosSelecionados); // Prosseguir com o pagamento} catch (error) { console.error(error.message); // Exibir mensagem ao usuário}
Débitos obrigatórios são aqueles que sempre devem ser incluídos no pagamento quando retornados na consulta. Não é possível pagar outros débitos sem incluir os obrigatórios.
Valide se todos os débitos obrigatórios estão incluídos quando há outros débitos selecionados:
Copy
function validarDebitosObrigatorios(debitosSelecionados, todosDebitos) { // Se não há débitos selecionados, não precisa validar if (debitosSelecionados.length === 0) { return true; } // Encontra todos os débitos obrigatórios const debitosObrigatorios = todosDebitos.filter(d => d.required === true); // Verifica se todos os obrigatórios estão selecionados for (const obrigatorio of debitosObrigatorios) { const obrigatorioIncluido = debitosSelecionados.some( d => d.id === obrigatorio.id ); if (!obrigatorioIncluido) { throw new Error( `O débito "${obrigatorio.title}" é obrigatório e deve ser incluído ` + `no pagamento.` ); } } return true;}// Exemplo de usotry { validarDebitosObrigatorios(debitosSelecionados, todosDebitos); // Prosseguir com o pagamento} catch (error) { console.error(error.message); // Exibir mensagem ao usuário}
Exiba mensagens claras explicando por que certos débitos foram selecionados ou desabilitados.
Copy
function getMensagemDebito(debito, todosDebitos) { if (debito.required) { return 'Este débito é obrigatório e deve ser pago'; } if (debito.dependsOn && debito.dependsOn.length > 0) { const deps = debito.dependsOn.map(id => todosDebitos.find(d => d.id === id).title ).join(', '); return `Depende de: ${deps}`; } if (debito.distinct && debito.distinct.length > 0) { return 'Não pode ser pago junto com outras opções de IPVA'; } return '';}