pdm2.html
Atualizado em
02/01/2025 11h39
pdm2 (3).html
— 26 KB
Conteúdo do arquivo
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Google Tag Manager -->
<script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=G-WGZPDK4DH1&l=dataLayer&cx=c"></script>
<script async="" src="https://www.googletagmanager.com/gtm.js?id=GTM-NHZSKTD"></script>
<script type="text/javascript">(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-NHZSKTD');
</script>
<!-- End Google Tag Manager -->
<!--FAVICON-->
<link rel="shortcut icon" href="./assets/favicon.ico">
<!-- Fonte Rawline-->
<link rel="stylesheet"
href="https://cdngovbr-ds.estaleiro.serpro.gov.br/design-system/fonts/rawline/css/rawline.css" />
<!-- Fonte Raleway-->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Raleway:300,400,500,600,700,800,900&display=swap" />
<!-- Fontawesome-->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/all.min.css" integrity="sha512-Kc323vGBEqzTmouAECnVceyQqyqdsSiqLQISBL29aUW4U/M7pSPA/gEUZQqv1cwx4OnYxTxve5UMg5GT6L4JJg==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<!--CSS GOVBR-->
<link rel="stylesheet" href="./govbr/core.css" />
<!--JS GOVBR-->
<script src="./govbr/core.js"></script>
<!--COMPONENTES-->
<script src="./componentes/br-cabecalho/br-cabecalho.js"></script> <!--CABEÇALHO-->
<script src="./componentes/br-rodape/br-rodape.js"></script> <!--RODAPE-->
<script src="./componentes/br-textarea/br-textarea.js"></script> <!--TEXTAREA-->
<script src="./componentes/br-select/br-select.js"></script> <!--SELECT-->
<script src="./componentes/br-input/br-input.js"></script> <!--INPUT-->
<script src="./componentes/br-datepicker/br-datepicker.js"></script> <!--DATEPICKER-->
<script src="./componentes/br-modal-simples/br-modal-simples.js"></script> <!--CUSTOM MODAL-->
<script src="./componentes/br-checkbox/br-checkbox.js"></script> <!--CHECKBOX-->
<script src="./componentes/br-radio-horizontal/br-radio-horizontal.js"></script> <!--RADIO HORIZONTAL-->
<!--UTILS-->
<script src="./bibliotecas/utils.js"></script>
<!--MUNICIPIOS POR UF-->
<script src="./municipios_por_uf.js"></script>
<!--HTML2CANVAS-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"
integrity="sha512-BNaRQnYJYiPSqHHDb58B0yaPfCu+Wgds8Gp/gU33kqBtgNS4tSPHuGibyoeqMV/TJlSKda6FXzoEyYGjTe+vXA=="
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<!--JSPDF-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"
integrity="sha512-qZvrmS2ekKPF2mSznTQsxqPgnpkI4DNTlrdUmTzrDgektczlKNRRhy5X5AAOnx5S09ydFYWWNSfcEqDTTHgtNA=="
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<style>
#custom-modal {
position: fixed;
left: 0;
top: 0;
width: 100%;
overflow: auto;
}
#impressao-impedida {
display: none;
}
@media print{
body>*:not(#impressao-impedida) {
display: none;
}
#impressao-impedida {
display: block !important;
font-size: 2em;
}
}
body {
-webkit-user-select: none; /* Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* Internet Explorer/Edge */
user-select: none; /* Standard */
}
</style>
<title>Pedido de destinação de mercadorias</title>
<script>
const hoje = new Date();
const dia = String(hoje.getDate()).padStart(2, '0');
const mes = String(hoje.getMonth() + 1).padStart(2, '0');
const ano = hoje.getFullYear();
let dataOficioMaxima = `${dia}/${mes}/${ano}`;
let dataAberturaCnpjMaxima = `${dia}/${mes}/${ano - 3}`;
// Após o carregamento da página, define o atributo maxDate
document.addEventListener("DOMContentLoaded", function() {
const datepickerOficio = document.getElementById('id-data-do-oficio');
const datepickerAberturaCnpj = document.getElementById('id-data-abertura-cnpj');
// Definir dinamicamente o atributo maxDate no componente
if (datepickerOficio) {
datepickerOficio.setAttribute('maxDate', dataOficioMaxima);
}
if (datepickerAberturaCnpj) {
datepickerAberturaCnpj.setAttribute('maxDate', dataAberturaCnpjMaxima);
}
});
var ufSelected;
function getOpcoesUf(){
return [
"AC", "AL", "AP", "AM", "BA", "CE", "DF", "ES", "GO", "MA", "MT", "MS",
"MG", "PA", "PB", "PR", "PE", "PI", "RJ", "RN", "RS", "RO", "RR", "SC",
"SP", "SE", "TO"
]
}
function getOpcoesTipoMercadoria(){
return [
"Bazar", "Escritório", "Partes/Peças de Veículos",
"Brinquedos", "Hospitalar", "Veículos",
"Armas e Munições", "Químico", "Vestuário",
"Eletrônicos", "Informática", "Outros"
]
}
function getOpcoesUnidade(){
return ["unidade", "kg", "par", "garrafa", "litro", "metro"];
}
function getOpcoesMunicipios(){
const municipios = municipiosPorUF[ufSelected] || [];
const opcoes = municipios.map(municipioObj => municipioObj.Municipio)
return opcoes
}
function getMunicipios(){
ufSelected = getSelectedValue('id-uf');
let container = document.querySelector('#id-container-municipios');
container.innerHTML = '';
let selectMunicipios = document.createElement('br-select-component');
selectMunicipios.setAttribute('label', 'Município de destino das mercadorias:');
selectMunicipios.setAttribute('eName', 'municipio_de_destino');
selectMunicipios.setAttribute('required', 'required');
selectMunicipios.setAttribute('opcoes', 'getOpcoesMunicipios');
container.appendChild(selectMunicipios);
}
function mostrarAdicionais(){
let radioSociedadeCivil = document.querySelector('#id-sociedade-civil');
let dataAberturaCnpj = document.querySelector('#id-div-abertura-cnpj');
let secaoProjeto = document.querySelector('#id-projeto-social');
let estadosComProjetoSocial = ['CE', 'MA', 'PI', 'PE', 'PB', 'AL', 'RN', 'MG', 'RS', 'PR', 'SC'];
let estadoSelecionado = getSelectedValue('id-uf-solicitante');
// recupera o componente para inserir ou retirar o required para função validarCamposRequiredNaSecao()
const datepickerAberturaCnpj = document.getElementById('id-data-abertura-cnpj');
if (radioSociedadeCivil.checked) {
datepickerAberturaCnpj.setAttribute('required', 'required')
dataAberturaCnpj.classList.remove('d-none');
if (!estadoSelecionado){
modalComponente.showModal(
'Atenção',
'Conforme inciso II do Art. 76 da Portaria RFB 200/2022, é vedada a destinação de mercadorias para OSC com menos de 3 (três) anos de existência',
null,
'Entendi',
null,
modalComponente.closeModal.bind(modalComponente)
)
}
} else {
datepickerAberturaCnpj.removeAttribute('required')
dataAberturaCnpj.classList.add('d-none');
}
if (radioSociedadeCivil.checked && estadosComProjetoSocial.includes(estadoSelecionado)){
secaoProjeto.classList.add('toPdf');
secaoProjeto.classList.remove('d-none');
} else {
secaoProjeto.classList.remove('toPdf');
secaoProjeto.classList.add('d-none');
}
}
</script>
</head>
<body>
<!--CABECALHO-->
<section id="id-cabecalho">
<br-cabecalho-component titulo="Pedido de destinação de mercadorias" subtitulo="Formulário exclusivo para juntada no e-cac por meio do Requerimentos Web"></br-cabecalho-component>
</section>
<!--SECAO SOLICITANTE-->
<section id="id-solicitante" class="mb-5 toPdf container-fluid" name="sobre_o_solicitante">
<div class="mb-3">
<h4>Sobre o solicitante</h4>
</div>
<div class="row flex-column mb-5">
<div class="col-4 mb-4">
<br-radio-horizontal-component inputId="id-orgao-publico" eName="solicitante" label="Órgão Público" onclick="mostrarAdicionais" required></br-radio-horizontal-component>
<br-radio-horizontal-component inputId="id-sociedade-civil" eName="solicitante" label="Organização da Sociedade Civil" onclick="mostrarAdicionais" required></br-radio-horizontal-component>
</div>
<div class="col-8 d-flex p-0">
<div class="col-4">
<br-select-component inputId="id-uf-solicitante" label="Estado:" eName="estado_solicitante" opcoes="getOpcoesUf" onchangeFunc="mostrarAdicionais" required="required"></br-select-component>
</div>
<div id="id-div-abertura-cnpj" class="col-4 d-none">
<br-datepicker-component id="id-data-abertura-cnpj" label="Data de abertura do CNPJ:" eName="data_abertura_cnpj"></br-datepicker-component>
</div>
</div>
</div>
</section>
<!--SECAO DETALHAMENTO DO PEDIDO-->
<section class="mb-5 toPdf container-fluid" id="id-pedido" name="detalhamento_do_pedido">
<div class="mb-3">
<h4>Dados básicos da solicitação</h4>
</div>
<!--NUMERO E DATA DO OFICIO-->
<div class="row mb-5">
<!--NUMERO DO OFICIO-->
<div class="col-6">
<br-input-component inputId="id-nr-oficio" eName="nr_do_oficio_pedido" label="Nr. do Ofício/Pedido" placeholder="Digite a identificação do pedido!" maxlength="45" required></br-input>
</div>
<!--DATA DO OFICIO-->
<div class="col-6">
<br-datepicker-component id="id-data-do-oficio" eName="data_do_oficio" label="Data do Ofício" required></br-datepicker-component>
</div>
</div>
<!--UNIDADE E MUNICIPIO DE DESTINO DAS MERCADORIAS-->
<div class="row mb-5">
<!--UNIDADE DE DESTINO-->
<div class="col-4">
<br-input-component eName="unidade_setor_de_destino_das_mercadorias" label="Unidade/Setor de destino das mercadorias <span class='text-blue-50'>(Opcional)</span>" maxlength="255"></br-input>
</div>
<!--UF DE DESTINO-->
<div class="col-4">
<br-select-component inputId="id-uf" label="Estado de destino das mercadorias:" eName="estado_de_destino" opcoes="getOpcoesUf" required="required" onchangeFunc="getMunicipios"></br-select-component>
</div>
<!--MUNICIPIO DE DESTINO-->
<div id="id-container-municipios" class="col-4">
<br-select-component id="municipios" label="Município de destino das mercadorias:" eName="municipio_de_destino" required="required" opcoes=""></br-select-component>
</div>
</div>
<!--DADOS DE CONTATO-->
<div>
<div class="mb-3 label">Dados de contato da pessoa de contato para tratar a respeito desse pedido:</div>
<div class="row mb-5">
<!--TELEFONE-->
<div class="col-4">
<br-input-component inputId="id-telefone" eName="telefone" label="Telefone:" maxlength="11" onblur="handleTelefoneValidation" required></br-input>
</div>
<!--EMAIL-->
<div class="col-4">
<br-input-component inputId="id-email" eName="email" label="Email:" onblur="handleEmailValidation" maxlength="'255" required></br-input>
</div>
<!--NOME-->
<div class="col-4">
<br-input-component inputId="id-nome" eName="nome" label="Nome:" maxlength="255" required></br-input>
</div>
</div>
</div>
<!--JUSTIFICATIVA-->
<div class="row mb-5">
<!--TEXTAREA-->
<div class="col-12">
<br-textarea-component eName="justiticativa_do_pedido_e_finalidade_de_sua_utilizacao"
label="Justiticativa do pedido e finalidade de sua utilização:" maxlength="1000" rows="10" required></br-textarea-component>
</div>
</div>
</section>
<!--SECAO DETALHAMENTO DO PROJETO SOCIAL-->
<section id="id-projeto-social" class="mb-5 container-fluid d-none" name="detalhamento_do_projeto_social">
<div class="mb-3"></div>
<h4>Detalhamento do Projeto Social</h4>
</div>
<div class="row flex-column mb-5">
<!--NOME DO PROJETO-->
<div class="col-4 mb-4">
<br-input-component inputId="id-nome-projeto" eName="nome_do_projeto" label="Nome do Projeto:" required></br-input-component>
</div>
<!--OBJETIVO DO PROJETO-->
<div class="col-4 mb-4">
<br-textarea-component eName="objetivo_do_projeto" label="Objetivo do Projeto:" maxlength="255" rows="10" required></br-textarea-component>
</div>
<!--RESULTADOS ESPERADOS-->
<div class="col-4 mb-4">
<br-textarea-component eName="resultados_esperados" label="Resultados esperados:" maxlength="255" rows="10" required></br-textarea-component>
</div>
<!--VALOR DO PROJETO-->
<div class="col-4 mb-4">
<br-input-component inputId="id-valor-do-projeto" eName="valor_do_projeto" label="Valor do Projeto (R$):" onblur="handleValorValidation" placeholder="somente números" required></br-input-component>
</div>
</div>
</section>
<!--SECAO DETALHAMENTO MERCADORIAS-->
<section class="mb-5 toPdf" id="id-mercadorias" name="detalhamento_das_mercadorias">
<div class="container-fluid">
<div class="row">
<div class="col">
<div class="mb-5">
<h4>Detalhamento das Mercadorias Solicitadas</h4>
</div>
<div class="br-table">
<table id="id-tb-mercadorias" class="mb-5" name="detalhamento_das_mercadorias_solicitadas" required>
<thead>
<tr>
<th class="text-up-01 p-1 col-2">Tipo</th>
<th class="text-up-01 p-1 col-3">Descrição/Modelo</th>
<th class="text-up-01 p-1 col-2">Marca (opcional)</th>
<th class="text-up-01 p-1 col-1">Unidade (opcional)</th>
<th class="text-up-01 p-1 col-1">Qtde (opcional)</th>
<th class="text-up-01 p-1 col-2">Observação (opcional)</th>
<th class="text-up-01 p-1 col-1 acoes">Ações</th>
</tr>
</thead>
<tbody id="id-bd-mercadorias"></tbody>
</table>
<!--BOTOES LIMPAR E INCLUIR MERCADORIA-->
<div id="btn-add-mercadorias" class="botao">
<button onclick="excluirTodasLinhasTabela(tbMercadorias)" class="br-button mr-3">Limpar</button>
<button onclick="incluirMercadorias()" class="br-button secondary mr-3">Incluir Mercadoria</button>
</div>
</div>
</div>
</div>
</div>
</section>
<!--SECAO BOTAO GERAR DOCUMENTO-->
<section class="mb-5" id="id-gerar-documento">
<div class="container-fluid">
<div class="row">
<div class="col">
<div class="text-center my-3">
<button onclick="gerarDocumento()" class="br-button primary">Gerar Documento</button>
</div>
</div>
</div>
</div>
</section>
<!-- MENSAGEM PADRÃO DE IMPRESSÃO -->
<section id="impressao-impedida">
<div class="text-center">Utilize o botão Gerar Documento</div>
</section>
<!--MODAL SIMPLES-->
<section id="id-modal-simples">
<br-modal-simples-component></br-modal-simples-component>
</section>
<!--RODAPE-->
<section id="id-rodape">
<br-rodape></br-rodape>
</section>
<!--JAVASCRIPT-->
<script>
////////// VARIÁVEIS //////////
let tbMercadorias = document.querySelector('#id-tb-mercadorias');
let bdMercadorias = document.querySelector('#id-bd-mercadorias');
let modalComponente = document.querySelector('br-modal-simples-component');
// LIDA COM VALIDAÇÃO DE TELEFONE
function handleTelefoneValidation(e){
const isValid = validarTelefone(e);
// Se o retorno for falso, exibe o modal
if (!isValid) {
if (modalComponente) {
modalComponente.showModal(
'Atenção',
'Número de telefone inválido. O telefone deve conter 10 ou 11 dígitos numéricos.',
null,
'Entendi',
null,
modalComponente.closeModal.bind(modalComponente)
)
}
}
}
// LIDA COM VALIDAÇÃO DE EMAIL
function handleEmailValidation(e){
const isValid = validarEmail(e);
// Se o retorno for falso, exibe o modal
if (!isValid) {
if (modalComponente) {
modalComponente.showModal(
'Atenção',
'E-mail inválido. Por favor, insira um e-mail válido.',
null,
'Entendi',
null,
modalComponente.closeModal.bind(modalComponente)
)
}
}
}
// LIDA COM VALIDAÇÃO DE EMAIL
function handleQtdadeValidation(e){
const isValid = validarInteiroPositivo(e);
// Se o retorno for falso, exibe o modal
if (!isValid) {
if (modalComponente) {
modalComponente.showModal(
'Atenção',
'Valor inválido! Deve ser numérico e maior que 0.',
null,
'Entendi',
null,
modalComponente.closeModal.bind(modalComponente)
)
}
}
}
// LIDA COM VALIDAÇÃO DE VALOR
function handleValorValidation(e){
const isValid = validarValor(e);
// Se o retorno for falso, exibe o modal
if (!isValid) {
if (modalComponente) {
modalComponente.showModal(
'Atenção',
'Valor inválido. Deve ser numérico e maior que R$ 0,00.',
null,
'Entendi',
null,
modalComponente.closeModal.bind(modalComponente)
)
}
}
}
// ADICIONA LINHA NA TABELA MERCADORIAS
function incluirMercadorias() {
// valida seção id-solicitante
if(!validarCamposRequiredNaSecao('id-solicitante')){
modalComponente.showModal(
'Atenção',
'Existem campos obrigatórios não preenchidos.',
null,
'Entendi',
null,
modalComponente.closeModal.bind(modalComponente)
)
return
}
// valida seção id-pedido
if(!validarCamposRequiredNaSecao('id-pedido')){
modalComponente.showModal(
'Atenção',
'Existem campos obrigatórios não preenchidos.',
null,
'Entendi',
null,
modalComponente.closeModal.bind(modalComponente)
)
return
}
// valida seção id-projeto-social conforme selecionado
let secaoProjeto = document.querySelector('#id-projeto-social');
if (!secaoProjeto.classList.contains('d-none')){
if (!validarCamposRequiredNaSecao('id-projeto-social')){
modalComponente.showModal(
'Atenção',
'Existem campos obrigatórios não preenchidos.',
null,
'Entendi',
null,
modalComponente.closeModal.bind(modalComponente)
)
return
}
}
var novaLinha = bdMercadorias.insertRow(-1);
for (var i = 0; i < 7; i++) {
var novaCelula = novaLinha.insertCell(i);
novaCelula.classList.add('p-2');
// TIPO MERCADORIA (select)
if (i == 0) {
let tipoMercadoria = document.createElement('br-select-component');
tipoMercadoria.setAttribute('opcoes', 'getOpcoesTipoMercadoria');
tipoMercadoria.setAttribute('eName', 'tipo_de_mercadoria');
tipoMercadoria.setAttribute('required', 'required');
novaCelula.appendChild(tipoMercadoria);
}
// DESCRIÇÃO/MODELO (textarea)
if (i == 1) {
let descricao = document.createElement('br-textarea-component');
descricao.setAttribute('eName', 'descricao_modelo');
descricao.setAttribute('placeholder', 'máximo 50 caracteres');
descricao.setAttribute('maxlength', '50');
descricao.setAttribute('required', 'required');
novaCelula.appendChild(descricao);
}
// MARCA (input)
if (i == 2) {
let marca = document.createElement('br-input-component');
marca.setAttribute('eName', 'marca');
marca.setAttribute('placeholder', 'máximo 15 caracteres');
marca.setAttribute('maxlength', '15');
novaCelula.appendChild(marca);
}
// UNIDADE (select)
if (i == 3) {
let unidade = document.createElement('br-select-component');
unidade.setAttribute('opcoes', 'getOpcoesUnidade');
unidade.setAttribute('eName', 'unidade');
// unidade.setAttribute('required', 'required');
novaCelula.appendChild(unidade);
}
// QUANTIDADE (input)
if (i == 4) {
let qtd = document.createElement('br-input-component');
qtd.setAttribute('eName', 'quantidade');
// qtd.setAttribute('placeholder', '5 dígitos');
qtd.setAttribute('maxlength', '9');
qtd.setAttribute('onchange', 'handleQtdadeValidation');
// qtd.setAttribute('required', 'required');
novaCelula.appendChild(qtd);
}
// OBSERVAÇÃO (textarea)
if (i == 5) {
let observacao = document.createElement('br-textarea-component');
observacao.setAttribute('eName', 'observacao');
observacao.setAttribute('placeholder', 'máximo 50 caracteres');
observacao.setAttribute('maxlength', '50');
novaCelula.appendChild(observacao);
}
// AÇÕES
if (i == 6){
novaCelula.classList.add('acoes');
let btnExcluir = document.createElement('button');
let iconeLixeira = document.createElement('i');
btnExcluir.classList.add('br-button');
iconeLixeira.classList.add('fa', 'fa-trash-alt');
btnExcluir.appendChild(iconeLixeira);
novaCelula.appendChild(btnExcluir);
btnExcluir.addEventListener('click', function () {
excluirLinha(this);
});
}
}
}
// Desabilitar atalhos de teclado comuns para impressão
desabilitarAtalhosImpressao()
</script>
</body>
</html>