Jump to content

Search the Community

Showing results for tags 'php'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Comunidade
    • Sugestões, Críticas ou Dúvidas relativas ao P@P
    • Acerca do P@P
  • Comunidade a Trabalhar
    • Apresentação de Projectos de Programação
    • Downloads
    • Revista PROGRAMAR
  • Desenvolvimento Geral
    • C
    • C++
    • Java
    • Pascal
    • Python
    • Bases de Dados
    • Dispositivos Móveis
    • Outras Linguagens
  • Desenvolvimento Orientado para Web
    • PHP
    • HTML
    • CSS
    • Javascript
    • Outras Linguagens de WebDevelopment
    • Desenvolvimento Web
  • Desenvolvimento .NET
    • C#
    • Visual Basic .NET
    • ASP.NET
    • WPF & SilverLight
  • Software e Sistemas Operativos
    • Software de Produtividade
    • Sistemas Operativos
    • Apresentação de Software
  • Informática
    • Interfaces Visuais
    • Computação Gráfica
    • Algoritmia e Lógica
    • Segurança e Redes
    • Hardware
    • Electrónica e Automação Industrial
    • Matemática
    • Software de Contabilidade, Finanças e Admin. Pública
    • Dúvidas e Discussão de Programação
    • Tutoriais
    • Snippets / Armazém de Código
  • Outras Áreas
    • Notícias de Tecnologia
    • Dúvidas Gerais
    • Discussão Geral
    • Eventos
    • Anúncios de Emprego
  • Arquivo Morto
    • Projectos Descontinuados
    • System Empires

Blogs

  • Blog dos Moderadores
  • Eventos
  • Notícias de Tecnologia
  • Blog do Staff
  • Revista PROGRAMAR
  • Projectos
  • Wiki

Categories

  • Revista PROGRAMAR
  • Tutoriais
  • Textos Académicos
  • Exercícios Académicos
    • Exercícios c/ Solução
    • Exercícios s/ Solução
  • Bibliotecas e Aplicações
  • Outros

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Website


GitHub


LinkedIn


Twitter


Facebook

  1. adaptei o projeto abaixo em meu projeto: https://youtu.be/m49I783h_9s?si=xmEknj6biQexrGJh só que devolve seguinte erro, penso que o erro esteja no javascript: Uncaught (in promise) SyntaxError: Unexpected token '<', " <!DOCTYPE "... is not valid JSON await (assíncrono) onkeyup @ index:215 meu java esta assim: async function searchProdutos(registo){ // Receber a URL do HTML const urlAdm = document.getElementById('url-adm').getAttribute('data-url-adm'); //recebe o valor que o usuário digitar const codigoBarras = document.querySelector('#codigo_barras'+registo); //Recebe o value da const codigoBarras const valueCodigoBarras = codigoBarras.value; // Verificar se o campo tem 7 digitos if (valueCodigoBarras.length == 7) { //faz a requisição ao file add-receber-encomenda.php const response = await fetch(urlAdm + 'add-receber-encomenda/index?searchCodigo=' + valueCodigoBarras); //Ler os dados retornado do PHP const data = await response.json(); if(data['erro']) { document.getElementById('adms_produto_id').innerHTML = data['msg']; }else{ document.getElementById("adms_produto_id").innerHTML = ""; document.getElementById("adms_produto_id").value = data['response'].produto; } } } na controler tenho: //Receber o codigo de barras do produto $searchCodigo = filter_input(INPUT_GET, "searchCodigo", FILTER_SANITIZE_NUMBER_INT); if (!empty($searchCodigo)) { $listProduct = new \App\adms\Models\stock\AdmsAddReceberEnc(); $listProduct->searchProduto($searchCodigo); $retorna = ['erro' => false, 'dados' => $listProduct]; } else { $retorna = ['erro' => true, 'msg' => "<div class='alert alert-danger'>Nenhum Produto encontrado!</div>"]; } na model tenho: public function searchProduto($codigoBarras = null) { $this->data['codigo_barras'] = $codigoBarras; $listProduto = new \App\adms\helpers\AdmsRead(); $listProduto->fullRead("SELECT id, produto, codigo_barras, venda, stock FROM adms_produtos WHERE codigo_barras =:codigo_barras LIMIT :limit", "codigo_barras={$this->data['codigo_barras']}&limit=1"); $this->resultBd = $listProduto->getResult(); if ($this->resultBd) { $retorna = ['erro' => false, 'dados' => $this->resultBd]; } else { $retorna = ['erro' => true, 'msg' => "<p style='color: #f00'>Erro: Nenhum Produto encontrado!</p>"]; } }
  2. Boa tarde a todos, tenho em meu formulário o seguinte input <input type="text" name="codigo_barras[]" id="codigo_barras" onkeyup="searchProdutos(1)" class="input-adm sizefour" autocomplete="on" required> no meu javascript tenho o seguinte: function searchProdutos(registo){ //recebe o valor que o usuário digitar const codigoBarras = document.querySelector('#codigo_barras'+registo); const valueCodigoBarras = codigoBarras.value; } Conforme começo a digitar no campo ocorre o seguinte erro: custom_adms.js:1014 Uncaught TypeError: Cannot read properties of null (reading 'value') at searchProdutos (custom_adms.js:1014:42) at HTMLInputElement.onkeyup (index:215:163) Já alterei o name e id de "código_barras" para "codigoBarras" ou "codigobarras" e continua o mesmo.
  3. Boa noite a todos, tenho um formulário como se fosse um carrinho de compras. no form tenho a tabela da seguinte forma: <input type="button" name="addProduto" id="addProduto" class="input-adm btn-warning" value="Incluir"> <table class="table-list"> <thead class="list-head"> <tr> <th class="list-head-content sizeone table-md-none">Código Barras</th> <th class="list-head-content sizefive table-md-none">ID</th> <th class="list-head-content sizetwo">Nome do produto</th> <th class="list-head-content sizethree">Quantidade</th> <th class="list-head-content sizefour">Ações</th> </tr> </thead> <tbody class="list-body"> </tbody> </table> Em javascript adiciono os produtos a tabela, o adicionar está funcionando, mas o remover não funciona, o que errei? //Adicionar Produtos ao carrinho document.getElementById('addProduto').addEventListener('click', incluirProduto) //Remover Produtos ao carrinho document.getElementById('.remove').addEventListener('click', removerProduto) function incluirProduto(){ const selectProduct = document.getElementById('adms_produto_id') const optionText = selectProduct.options[selectProduct.selectedIndex].text const id = selectProduct.options[selectProduct.selectedIndex].value const barcode = selectProduct.options[selectProduct.selectedIndex].getAttribute('data-barcode') const qtde = document.getElementById('qtde').value const html = `<tr><td class="list-body-content table-md-none sizeone"><input type="text" name="codigo_barras[]" id="codigo_barras" class="input-adm" placeholder="Código Barras" autocomplete="on" required value="${barcode}"></td><td class="list-body-content table-md-none sizefive" name="id[]">${id}</td><td class="list-body-content sizetwo">${optionText}</td><td class="list-body-content sizethree"><input type="number" name="qtde[]" id="qtde" class="input-adm" placeholder="Qtde" autocomplete="off" required value="${qtde}"></td><td><input type="button" class="input-adm btn-danger" name="remove" id="remove" value="Remover"></td></tr>`; const x = 1; document.querySelector('tbody.list-body').innerHTML += html } function removerProduto(){ document.querySelector('tbody.list-body').closest('tr').remove(); }
  4. Bom dia a todos, Estou recebendo os dados através do json e enviando para a model da seguinte forma: //Recebo os dados $receiveData = file_get_contents('php://input'); $data = json_decode($receiveData, true); //Adiciono a posição do usuário atraves da sessão $data['adms_user_id'] = $_SESSION['user_id']; //Envia os dados para a model $createEncomenda = new \App\adms\Models\encomenda\AdmsAdd(); $createEncomenda->create($data); Na controle recebo da seguinte forma: public function create(array $data = null) { // Recebo os dados que vieram da controler $this->data = $data; Só que ao dar o var_dump em $this->data ou em $data me devolve o array da seguinte forma: $data: Array ( [0] => Array ( [name_encomenda] => Pedido de Material [adms_fornecedor_id] => 1 [adms_produto_id] => 1 [qtde] => 3 [observacoes] => [barcode] => 560010001 [productName] => Bisturi ) [1] => Array ( [name_encomenda] => Pedido de Material [adms_fornecedor_id] => 1 [adms_produto_id] => 4 [qtde] => 4 [observacoes] => [barcode] => 560000023 [productName] => Pinça ) [adms_user_id] => 1 ) mas gostaria e preciso receber da seguinte forma: $this->data: Array ( [name_encomenda] => Pedido de Material [adms_fornecedor_id] => 1 [adms_produto_id] => Array ( [0] => 1 [1] => 4 [2] => 2 ) [qtde] => Array ( [0] => 3 [1] => 4 [2] => 1 ) [observacoes] => [codigo_barras] => Array ( [0] => 560010001 [1] => 560000023 [2] => 560000021 ) [adms_user_id] => 1 ) Agora a pergunta, como faço isso?
  5. Boa tarde a todos, ca estou eu mais uma a solicitar a vossa ajuda. Tenho um formulário com uma tabela, nesta tabela tenho uma coluna que esta oculta com o style="display:none;" por o style="visibility:hidden;" fica o espaço em branco e não quero. até aqui esta tudo bem, mas gostaria enviar para a model os valores desta tabela, mas como a coluna esta como style="display:none;" não envia. Como faço para poder ocultar a coluna, mas mesmo assim conseguir enviar os dados ocultos? essa não é a tabela toda, apenas parte dela <tr> <td class="table"> <input type="text" name="codigo_barras[]" id="codigo_barras" class="input" placeholder="Código Barras" autocomplete="on" required> 560001 </td> <td style="display:none;" name="id[]"> 1 </td> <td class="list-content"> bisturi </td> <td class="list-content"> <input type="number" name="qtde[]" id="qtde" class="input" placeholder="Qtde" autocomplete="off" required > </td> <td> <input type="button" class="btn-danger" name="remove" id="remove" value="remove"> </td> </tr>
  6. Bom dia a todos. já fiz várias pesquisas mas infelizmente não consegui encontrar nada, ou minha pesquisa não esta sendo feita da forma correcta. quero alimentar um select com 3 tipos de dados, até aqui tudo bem, pois fiz da seguinte forma: <select name="select"> <option value="valor1" barcode="560001">Valor 1</option> <option value="valor2" barcode="560002">Valor 2</option> <option value="valor3" barcode="560003">Valor 3</option> </select> <button type="submit" onclick="receberValores">Enviar</button> até aqui tudo a funcionar. O que gostaria é de receber todos os valores no javascript Já criei um botão para chamar uma função js e receber os valores, mas não sei como receber o barcode, alguém pode ajudar-me? function receberValores(){ const select = document.getElementById('select').value const opcaoTexto = select.options[select.selectedIndex].text; const opcaoValor = select.options[select.selectedIndex].value; }
  7. Boa noite a todos e peço desculpa se meu post não agradar a alguns, gosto imenso de programar mas não sou nenhum profissional na matéria, nem faço disso profissão, sou apenas um curioso. Tenho o código abaixo para excluir os arquivos de uma pasta, mas gostaria que só apagasse se o array existir e for diferente de vazio. if ((isset($this->dataForm)) and (!empty($this->dataForm))) { // pasta que sera eliminado os arquivos $folder_path = "app/images/produtos/1/"; // lista os nomes dos arquivos $files = glob($folder_path . '/*'); // delete todos os arquivos do diretorio foreach ($files as $file) { if (is_file($file)) // Elimina o arquivo unlink($file); } } else { $this->utils->setSessionMsg('Produto alterado com sucesso!'); } A lógica é: Se existir a posição dataForm e for diferente de vazio{ apague }else{ mensagem de alterado } já dei um var_dump em dataForm e o resultado foi: $this->dataForm: Array ( [name] => Array ( [0] => ) [full_path] => Array ( [0] => ) [type] => Array ( [0] => ) [tmp_name] => Array ( [0] => ) [error] => Array ( [0] => 4 ) [size] => Array ( [0] => 0 ) ) Mas mesmo assim está apagando, onde esta errado?
  8. Boa tarde a todos, preciso de uma rotina ou função que apague todos os arquivos de uma pasta em PHP. alguém tem algum modelo ou link de exemplo para eu seguir? Desde já agradeço
  9. Boa tarde, estou tentando visualizar todas as imagens de um diretório, mas infelizmente me devolve o array como vazio, já dei voltas e voltas. No arquivo config.php tenho o seguinte: define('URLADM', 'localhost/adm/'); depois coloquei em minha View o seguinte: <?php //Caminho do diretorio do produto $diretorio = URLADM . "app/adms/assets/images/produtos/1/"; $img = glob($diretorio . "*.{jpg,jpeg,png,gif}", GLOB_BRACE); var_dump($img); $contador = count($img); foreach ($img as $img) { ?> <img src="<?php echo $img; ?>" alt="$img" style="width: 200px; height: 120px;"> <?php } ?> mas não me aparece nenhuma imagem, ao contrário não na erro nenhum e nem visualizar nenhuma imagem.
  10. Boa tarde, Alguém por aqui pode ajudar: Como posso criar um grupo de distribuição através do php. A ideia será poder criar um grupo de distribuição através de php/msql e ele coloque os email desse grupo agrupados no PARA do Outlook. Isto é em vez de colocar p.e.: exemplo1@sapo.pt; exemplo2@yahoo.com; exemplo3@gmail.com Colocaria + Nome do Grupo Julgo que consegui explicar-me.
  11. Bom dia a todos, Tenho o código abaixo a realizar a validação do NIF em português, caso seja de outro pais não faz validação nenhuma, só que infelizmente não esta a resultar. Se puderem digam onde errei. function validaNIF(string $paisnif, $nif) { $this->paisnif = $paisnif; if (!empty($this->paisnif) and ($this->paisnif == 'PT')) { //Limpamos eventuais espaços a mais $nif = trim($nif); //Remove os pontos $nif = str_replace(array('.', '-', '/'), "", $nif); //Verificamos se é numérico e tem comprimento 9 if (!is_numeric($nif) || strlen($nif) != 9) { $this->utils->setSessionMsg('Erro: Número de Identificação Fiscal inválido, por favor verifique!', 'danger'); $this->result = false; } else { $nifSplit = str_split($nif); //O primeiro digíto tem de ser 1, 2, 3, 5, 6, 7, 8 ou 9 if (in_array($nifSplit[0], array(1, 2, 3, 5, 6, 7, 8, 9))) { //Calculamos o dígito de controlo $checkDigit = 0; for ($i = 0; $i < 8; $i++) { $checkDigit += $nifSplit[$i] * (10 - $i - 1); } $checkDigit = 11 - ($checkDigit % 11); //Se der 10 então o dígito de controlo tem de ser 0 if ($checkDigit >= 10) $checkDigit = 0; //Comparamos com o último dígito if ($checkDigit == $nifSplit[8]) { $this->result = true; } else { $this->utils->setSessionMsg('Erro: Número de Identificação Fiscal inválido, por favor verifique!', 'danger'); //$_SESSION['msg'] = "<p class='alert-danger'>Erro: Email já utilizado, por favor verifique!</p>"; $this->result = false; } } else { $this->utils->setSessionMsg('Erro: Número de Identificação Fiscal inválido, por favor verifique!', 'danger'); //$_SESSION['msg'] = "<p class='alert-danger'>Erro: Email já utilizado, por favor verifique!</p>"; $this->result = false; } } } else { $this->result = true; } }
  12. Bom dia, Tenho uma função para validar se os documentos já foram cadastrado com outro técnico. Mas preciso verificar o tipo do documento e o número do documento e ignorando o proprio id. Mas preciso que tudo seja verdadeiro, mas infelizmente não devolve resultado. O que errei? public function validateDocuments(int $tipodoc, string $docIdentify, string $paisnif, string $nif, bool|null $edit = null, int|null $id = null): void { $this->tipodoc = $tipodoc; $this->docIdentify = $docIdentify; $this->paisnif = $paisnif; $this->nif = $nif; $this->edit = $edit; $this->id = $id; $verifyDocuments = new \App\adms\helpers\AdmsRead(); if (($this->edit == true) and (!empty($this->id))) { $verifyDocuments->fullRead("SELECT id FROM adms_tecnicos WHERE (tipodoc=:tipodoc AND numero_doc=:numero_doc AND paisnif=:paisnif AND nif=:nif AND id <>:id) LIMIT :limit", "tipodoc={$this->tipodoc}&numero_doc={$this->docIdentify}&paisnif={$this->paisnif}&nif={$this->nif}&id={$this->id}&limit=1"); } else { $verifyDocuments->fullRead("SELECT id FROM adms_tecnicos WHERE id =:id LIMIT :limit", "id={$this->id}&limit=1"); } $this->resultBd = $verifyDocuments->getResult(); if (!$this->resultBd) { $this->result = true; } else { $this->utils->setSessionMsg('Erro: Técnico já cadastrado, por favor verifique!', 'danger'); $this->result = false; } }
  13. Boa tarde, Tenho uma model editar, nesta model recupero o resultado do banco de dados. public function viewTecnico(int $id): void { $this->id = $id; $viewTecnico = new \App\adms\helpers\AdmsRead(); $viewTecnico->fullRead( "SELECT id, adms_genero_id, adms_estado_civil_id, name, morada, localidade, codigo_postal, adms_distrito_id, adms_concelho_id, adms_freguesia_id, name_pai, name_mae, adms_tipo_doc_id, numero_doc, adms_arquivo_id, data_emissao, data_validade, data_nasc, nif_pais, numero_nif, beneficiario1, beneficiario2, beneficiario3, telefone1, telefone2, telemovel, email, observacoes FROM adms_tecnicos WHERE id=:id LIMIT :limit", "id={$this->id}&limit=1" ); $this->resultBd = $viewTecnico->getResult(); <------ VALOR DEVOLVIDO AQUI if ($this->resultBd) { $this->result = true; } else { $this->utils->setSessionMsg('Erro: Técnico Funerário não encontrado!', 'danger'); //$_SESSION['msg'] = "<p class='alert-danger'>Erro: Usuário não encontrado!</p>"; $this->result = false; } } Depois tenho um outra função que deverá usar parte desta pesquisa para realizar outra pesquisa public function listSelectConcelho(): array { $list = new \App\adms\helpers\AdmsRead(); $list->fullRead( "SELECT id id_conc, name_concelho FROM adms_concelhos WHERE adms_distrito_id=:adms_distrito_id ORDER BY name_concelho ASC", <----- AQUI COLOCO O $THIS->RESULTBD na posíção 0 com o valor a recuperar "adms_distrito_id= {$this->resultBd[0]['adms_distrito_id']} " ); $registry['conc'] = $list->getResult(); $this->listRegistryAdd = ['conc' => $registry['conc']]; return $this->listRegistryAdd; } Na primeira pesquisa é devolvido o seguinte array no var_dump $this->resultBd: Array ( [0] => Array ( [id] => 1 [adms_genero_id] => 1 [adms_estado_civil_id] => 5 [name] => José da Silva [adms_distrito_id] => 1 [adms_concelho_id] => 3 [adms_freguesia_id] => 2 [adms_arquivo_id] => 3 [data_emissao] => 2023-08-20 00:00:00 [data_validade] => 2026-08-20 00:00:00 [beneficiario2] => [beneficiario3] => [observacoes] => ) ) Mas recebo os seguinte erros: Fatal error: Uncaught Error: Typed property App\adms\Models\tecnico_funerario\AdmsEdit::$resultBd must not be accessed before initialization in /Applications/XAMPP/xamppfiles/htdocs/adm/app/adms/Models/tecnico_funerario/AdmsEdit.php on line 209 Error: Typed property App\adms\Models\tecnico_funerario\AdmsEdit::$resultBd must not be accessed before initialization in /Applications/XAMPP/xamppfiles/htdocs/adm/app/adms/Models/tecnico_funerario/AdmsEdit.php on line 209 O que estou fazendo de errado?
  14. Boas malta, estou a desenvolver um site em react, que tem como backend PHP e a base de dados tou a utilizar MySQL, e está me aparecer este erro quando tento adicionar os dados de uns inputs na base de dados: ERROR Network Error AxiosError: Network Error at XMLHttpRequest.handleError (http://localhost:3000/static/js/bundle.js:96826:14) Alguem me consegue ajudar?
  15. Gerar mapa a partir de um endereço.
  16. Boa noite. Eu estou a criar uma base de dados com contactos. O que eu gostava de fazer era o seguinte. Eu estou a listar todos os contactos numa tabela e depois posso clicar no botão à frente do contacto e ele redireciona-me para outra pagina com os dados desse respetivo contacto. Eu estou a passar o id desse contacto através da URL. Mas eu gostaria de esconder o ID e ficar apenas com a url p.e www.contactos.viewcontact.php. O meu codigo é este: while($dados_viewuser = mysqli_fetch_array($result_viewuser, MYSQLI_ASSOC)) { echo'<tr class="odd">'; echo '<td class="dtr-control sorting_1" tabindex="0" id="" name="">'.$dados_viewuser['id_user'] ;'</td>'; echo '<td id="" name="">' .$dados_viewuser['nome_user']; '</td>'; if($dados_viewuser['estado_user']=='1'){ echo '<td id="estado_user" name="estado_user">Ativo</td>'; } else { echo '<td id="estado_user" name="estado_user">Inativo</td>'; } echo '<td id="" name="">' .$dados_viewuser['dataregisto_user']; '</td>'; printf ('<td><a class="btn-xs btn-success" href="/edit_user.php?idedit=%d"><i class="fa fa-edit"></i>&nbsp; View </a></td>',$dados_viewuser['id_user']); echo '</tr>'; $number++; } Estou a passar o valor através da tag <a>. Como posso passar essa variavel mas escondida no URL para não mostrar o ID.
  17. Boa noite, se chamo uma função em uma tag <button> funciona correctamente. Mas se colocar dentro de uma tag <a> no href não funciona, como faço? Neste momento esta desta forma: <a href="<?php echo URL; ?>add-freguesia/index" onclick="return abrirModal('modal')" class="btn-success">Cadastrar</a>
  18. Descobri um modo: Se colocar o id da imagem nesta url, da certo: https://docs.google.com/uc?id=idDaImagem o id da imagem eu fui buscar do link de partilha que ele gera: https://drive.google.com/file/d/idDaImagem/view?usp=sharing resultado final: https://docs.google.com/uc?id=idDaImagem
  19. Boa noite pessoal, uma pessoa amiga ajudou me a preencher os campos selects conforme precisava, e os louvores são dele e não meu. Mas preciso da vossa ajuda para o seguinte: Conforme clico no botão cadastrar e é encontrado algum erro ou falta algum campo obrigatório, nos campos selects não recupera os dados que selecionei e nos outros campos sim. Espero que alguém possa me ajudar. Criamos uma view da seguinte forma: <div class="column"> <label for="adms_distrito_id" class="title-input">Distrito:<span class="text-danger">*</span> </label> <select class="input-adm" name="adms_distrito_id" id="adms_distrito_id" data-autofill data-target='#adms_concelho_id' data-href='load-concelhos/index'> <option value="">Carregando...</option> </select> <div class="content-adm-alert"></div> </div> <div class="column"> <label for="adms_concelho_id" class="title-input">Concelho:<span class="text-danger">*</span> </label> <select class="input-adm" name="adms_concelho_id" id="adms_concelho_id" data-target='#adms_freguesia_id' data-href='load-freguesias/index'> <option value="">Selecione um Distrito</option> </select> </div> <div class="column"> <label for="adms_freguesia_id" class="title-input">Freguesia:<span class="text-danger">*</span> </label> <select class="input-adm" name="adms_freguesia_id" id="adms_freguesia_id"> <option value="">Selecione um Concelho</option> </select> </div> e um arquivo js da seguinte forma: const loadJson = async (url, method = 'get') => { const headers = { method } const retorno = { statusCode: 200, body: [] } const request = await fetch(url, headers) if (request.headers.get('content-type').includes('json')) { const data = await request.json() retorno.body = data } else { adms_distrito_id.nextElementSibling.innerHTML = await request.text() } return retorno } const fillSelect = (selector, data, callback) => { // define se select element to be feed const selectToFill = document.querySelector(selector) const selectOptions = [] selectToFill.innerHTML = '<option value="">loading data...</option>' selectToFill.classList.remove('is-invalid') for (const obj of data) { const [key, val] = Object.keys(obj) selectOptions.push(`<option value="${obj[key]}">${obj[val]}</option>`) } if (selectOptions.length) { selectToFill.innerHTML = selectOptions.join() selectToFill.disabled = false } else { selectToFill.classList.add('is-invalid') selectToFill.disabled = true selectToFill.innerHTML = '<option value="">No registers found.</option>' } callback(selectToFill) } loadJson('/load-distritos/index').then((obj) => { for (const select of document.querySelectorAll('select[data-autofill]')) { fillSelect('#' + select.id, obj.body, (e) => { e.dispatchEvent(new Event('change')) }) } }) // Listen the changeEvent for all selects with [data-target][data-href] const selectsToFillAnother = document.querySelectorAll('select[data-target][data-href]') for (const select of selectsToFillAnother) { select.onchange = async ({ target }) => { const id = target.value const href = target.dataset.href const targetSelect = target.dataset.target const nextElement = targetSelect document.querySelector(targetSelect).innerHTML = '<option value="">loading data...</option>' let body = [{ id: '', value: 'Selecione um concelho' }] if (id) { body = await loadJson(`/${href}/${id}`).then(({ body }) => body) } fillSelect(targetSelect, body, (e) => { e.dispatchEvent(new Event('change')) }) } }
  20. Boa tarde a todos, Tenho um formulário com 3 campos selects, consoante o que selecionar no primeiro gostaria que fosse feito uma pesquisa e preenchido o segundo e assim sucessivamente. fiz da seguinte forma, mas não resultou. Alias até funciona se eu digitar directamente na url o seguinte caminho: "http://projecto/load-concelho/index?distrito=2" no console me devolve correctamente, mas quando tento manipular o select não resulta. Na linha 6 já tentei: fetch("LoadConcelhos.php/index?distrito=" + adms_distrito_id) fetch("LoadConcelhos/index?distrito=" + adms_distrito_id) fetch("../LoadConcelhos.php/index?distrito=" + adms_distrito_id) fetch("http://projecto/LoadConcelhos.php/index?distrito=" + adms_distrito_id) fetch("load-concelhos.php/index?distrito=" + adms_distrito_id) fetch("../Controllers/LoadConcelhos.php/index?distrito=" + adms_distrito_id) LoadConcelho.php (2º select) <?php namespace App\adms\Controllers; use PDO; class LoadConcelhos { public function index() { $adms_distrito_id = $_GET['distrito']; $listConcelhos = new \App\adms\helpers\AdmsRead(); $listConcelhos->fullRead("SELECT id, name_concelho FROM adms_concelhos WHERE adms_distrito_id=:adms_distrito_id ORDER BY name_concelho ASC", "adms_distrito_id={$adms_distrito_id}"); $registry = $listConcelhos->getResult(); foreach ($registry as $concelhos) { ?> <option value="<?php echo $concelhos['id'] ?>" <?php echo $concelhos['name_concelho'] ?>></option> <?php } } } concelho.js 1 const selectDistrito = document.getElementById('adms_distrito_id') 2 selectDistrito.onchange = () => { 3 const selectConcelho = document.getElementById('adms_concelho_id') 4 const adms_distrito_id = selectDistrito.value; 5 console.log(adms_distrito_id); 6 fetch("LoadConcelhos.php/index?distrito=" + adms_distrito_id) 7 .then(response => { 8 return response.concelhos(); 9 }) 10 .then(bodyContent => { 11 selectConcelho.innerHTML = bodyContent; 12 }); 13 }
  21. Boa tarde a todos, tem um formulário com um campo select, gostaria de que: quando fosse selecionado alguma opção chamar uma função que está na model. como faço? Só é possível com JavaScript?
  22. Bom dia a todos, estou desenvolvendo um projeto através de umas aulas com a CELKE. Mas esta acontecendo uma coisa tão estranha e não consigo resolver, por isso estou pedindo a vossa ajuda. fiz um formulário de pesquisa pelos distritos de Portugal, tenho um base de dados com todos os distritos cadastrado. a pesquisa esta a funcionar não a 100% por os distritos de "Faro" e "Castelo Branco" são os únicos que dão erro e não efectuam a pesquisa e por vezes tenho que fazer a pesquisa duas vezes para funcionar. Quando não é encontrado ao invés de devolver a mensagem "Distrito não encontrado" não acontece nada. Quem souber ajude me por favor. Helpers AdmsRead: <?php namespace App\adms\helpers; use PDO; use PDOException; /** * Classe genérica para selecionar registro no banco de dados * * @author John Trindade */ class AdmsRead extends AdmsConn { /** @var string $select Recebe o QUERY */ private string $select; /** @var array $values Recebe os valores que deve ser atribuidos nos link da QUERY com bindValue */ private array $values = []; /** @var array $result Recebe os registros do banco de dados e retorna para a Models */ private array|null $result; /** @var object $query Recebe a QUERY preparada */ private object $query; /** @var object $conn Recebe a conexao com BD */ private object $conn; /** * @return array Retorna o array de dados */ function getResult(): array|null { return $this->result; } /** * Recebe os valores para montar a QUERY. * Converte a parseString de string para array. * @param string $table Recebe o nome da tabela do banco de dados * @param string $terms Recebe os links da QUERY, ex: sts_situation_id =:sts_situation_id * @param string $parseString Recebe o valores que devem ser subtituidos no link, ex: sts_situation_id=1 * * @return void */ public function exeRead(string $table, string|null $terms = null, string|null $parseString = null): void { if(!empty($parseString)){ parse_str($parseString, $this->values); } $this->select = "SELECT * FROM {$table} {$terms}"; $this->exeInstruction(); } public function fullRead(string $query, string|null $parseString = null): void { $this->select = $query; if (!empty($parseString)) { parse_str($parseString, $this->values); } $this->exeInstruction(); } private function exeInstruction():void { $this->connection(); try{ $this->exeParameter(); $this->query->execute(); $this->result = $this->query->fetchAll(); }catch(PDOException $err){ $this->result = null; } } private function connection():void { $this->conn = $this->connectDb(); $this->query = $this->conn->prepare($this->select); $this->query->setFetchMode(PDO::FETCH_ASSOC); } private function exeParameter():void { if($this->values){ foreach($this->values as $link => $value){ if(($link == 'limit') or ($link == 'offset') or ($link == 'id')){ $value = (int) $value; } $this->query->bindValue(":{$link}", $value, (is_int($value) ? PDO::PARAM_INT : PDO::PARAM_STR)); } } } } helpers Pagination: <?php namespace App\adms\helpers; /** * Classe genérica para gerar a paginação * * @author John Trindade */ class AdmsPagination { /** @var integer $page Recebe o numero da pagina que o usuario esta*/ private int $page; /** @var integer $limitResult Recebe o limite de resultado*/ private int $limitResult; /** @var integer $offset Recebe o calculo entre a quantidade de paginas e o limite de resultado*/ private int $offset; /** @var string $query Recebe a query que será feita a paginação*/ private string $query; /** @var string|null $parseString Recebe a parseString*/ private string|null $parseString; /** @var array $resultBd Recebe o resultado que vem do banco de dados*/ private array $resultBd; /** @var string|null $result Recebe o resultado TRUE ou FALSE*/ private string|null $result; /** @var integer $totalPages Recebe o total de paginas*/ private int $totalPages; /** @var integer $maxLinks Recebe o número maximo de paginas*/ private int $maxLinks = 2; /** @var string $link Recebe o link da pagina*/ private string $link; /** @var string|null $var Recebe a informação relacionada com a pagina*/ private string|null $var; /** @return integer Recebe o resultado do calculo entre a quantidade de paginas e o linmite de resultado*/ function getOffset(): int { return $this->offset; } /** @return string|null Recebe o resultado TRUE ou FALSE*/ function getResult(): string|null { return $this->result; } /** * Metodo para criar o link da pagina * * @param string $link * @param string|null|null $var */ function __construct(string $link, string|null $var = null) { $this->link = $link; $this->var = $var; } /** * Metodo recebe a pagina e o limite de resultado a ser exibido * * @param integer $page * @param integer $limitResult * @return void */ public function condition(int $page, int $limitResult): void { $this->page = (int) $page ? $page : 1; $this->limitResult = (int) $limitResult; $this->offset = (int) ($this->page * $this->limitResult) - $this->limitResult; } /** * Metodo recebe a query que será feita a paginação e a parseString * Chama o helper AdmsRead para fazer a pesquisa no banco de dados * @param string $query * @param string|null|null $parseString * @return void */ public function pagination(string $query, string|null $parseString = null): void { $this->query = (string) $query; $this->parseString = (string) $parseString; $count = new \App\adms\helpers\AdmsRead(); $count->fullRead($this->query, $this->parseString); $this->resultBd = $count->getResult(); $this->pageInstruction(); } /** * Metodo faz o calculo do total de paginas * Chama o metodo layoutPagination * @return void */ private function pageInstruction(): void { $this->totalPages = (int) ceil($this->resultBd[0]['num_result'] / $this->limitResult); if ($this->totalPages >= $this->page) { $this->layoutPagination(); } else { header("Location: {$this->link}"); } } /** * Metodo com o layout da paginação que será exibida na view * @return void */ private function layoutPagination(): void { $this->result = "<div class='content-pagination'>"; $this->result .= "<div class='pagination'>"; $this->result .= "<a href='{$this->link}{$this->var}'>Primeira</a>"; for ($beforePage = $this->page - $this->maxLinks; $beforePage <= $this->page - 1; $beforePage++) { if ($beforePage >= 1) { $this->result .= "<a href='{$this->link}/$beforePage{$this->var}'>$beforePage</a>"; } } $this->result .= "<a href='#' class='active'>{$this->page}</a>"; for ($afterPage = $this->page + 1; $afterPage <= $this->page + $this->maxLinks; $afterPage++) { if ($afterPage <= $this->totalPages) { $this->result .= "<a href='{$this->link}/$afterPage{$this->var}'>$afterPage</a>"; } } $this->result .= "<a href='{$this->link}/{$this->totalPages}{$this->var}'>Última</a>"; $this->result .= "</div>"; $this->result .= "</div>"; } } model: <?php namespace App\adms\Models\distritos; /** * Listar distritos do banco de dados */ class AdmsList { /** @var bool $result Recebe true quando executar o processo com sucesso e false quando houver erro */ private bool $result; /** @var array|null $resultBd Recebe os registros do banco de dados */ private array|null $resultBd; /** @var int $page Recebe o número página */ private int $page; /** @var int $page Recebe a quantidade de registros que deve retornar do banco de dados */ private int $limitResult = 15; /** @var string|null $page Recebe a páginação */ private string|null $resultPg; /** @var string|null $searchEmail Recebe o email do distrito */ private string|null $searchDistrito; /** @var string|null $searchNameValue Recebe o nome do distrito */ private string|null $searchNameValue; /** * @return bool Retorna true quando executar o processo com sucesso e false quando houver erro */ function getResult(): bool { return $this->result; } /** * @return bool Retorna os registros do BD */ function getResultBd(): array|null { return $this->resultBd; } /** * @return bool Retorna a paginação */ function getResultPg(): string|null { return $this->resultPg; } /** * Metodo faz a pesquisa dos distritos na tabela adms_distritos e lista as informações na view * Recebe o paramentro "page" para que seja feita a paginação do resultado * @param integer|null $page * @return void */ public function listDistritos(int $page = null): void { $this->page = (int) $page ? $page : 1; $pagination = new \App\adms\helpers\AdmsPagination(URLADM . 'list-distritos/index'); $pagination->condition($this->page, $this->limitResult); $pagination->pagination("SELECT COUNT(dist.id) AS num_result FROM adms_distritos dist"); $this->resultPg = $pagination->getResult(); $listDistrito = new \App\adms\helpers\AdmsRead(); $listDistrito->fullRead("SELECT dist.id, dist.name_distrito FROM adms_distritos AS dist ORDER BY dist.id ASC LIMIT :limit OFFSET :offset", "limit={$this->limitResult}&offset={$pagination->getOffset()}"); $this->resultBd = $listDistrito->getResult(); if ($this->resultBd) { $this->result = true; } else { $_SESSION['msg'] = "<p class='alert-danger'>Erro: Nenhum Distrito encontrado!</p>"; $this->result = false; } } /** * Metodo faz a pesquisa dos distritos na tabela adms_distritos e lista as informações na view * Recebe o paramentro "page" para que seja feita a paginação do resultado * Recebe o paramentro "search_distrito" para pesquisar o distrito atraves do nome * @param integer|null $page * @param string|null $search_distrito * @return void */ public function listSearchDistrito(int $page = null, string|null $search_distrito): void { $this->page = (int) $page ? $page : 1; $this->searchDistrito = trim($search_distrito); $this->searchNameValue = "%" . $this->searchDistrito . "%"; if ((!empty($this->searchDistrito))) { $this->searchUserName(); } else { $this->listDistritos(); } } /** * Metodo pesquisar pelo nome do distrito * @return void */ public function searchUserName(): void { $pagination = new \App\adms\helpers\AdmsPagination(URLADM . 'list-distritos/index', "?search_name={$this->searchDistrito}"); $pagination->condition($this->page, $this->limitResult); $pagination->pagination("SELECT COUNT(dist.id) AS num_result FROM adms_distritos dist WHERE name_distrito LIKE :search_distrito", "search_distrito={$this->searchNameValue}"); $this->resultPg = $pagination->getResult(); $listUsers = new \App\adms\helpers\AdmsRead(); $listUsers->fullRead("SELECT dist.id, dist.name_distrito FROM adms_distritos AS dist WHERE dist.name_distrito LIKE :search_distrito ORDER BY dist.id ASC LIMIT :limit OFFSET :offset", "search_distrito={$this->searchNameValue}&limit={$this->limitResult}&offset={$pagination->getOffset()}"); $this->resultBd = $listUsers->getResult(); if ($this->resultBd) { $this->result = true; } else { $_SESSION['msg'] = "<p class='alert-danger'>Erro: Nenhum distrito encontrado!</p>"; $this->result = false; } } } Controler: <?php namespace App\adms\Controllers; /** * Controller da página listar distritos * @author John Trindade <jht_pt@icloud.com> */ class ListDistritos { /** @var array|string|null $data Recebe os dados que devem ser enviados para VIEW */ private array|string|null $data; /** @var array|null $data Recebe os dados que devem do formulario */ private array|null $dataForm; /** @var string|int|null $page Recebe o numero da pagina que usuario esta */ private string|int|null $page; /** @var string|null $searchDistrito Recebe o nome do distrito */ private string|null $searchDistrito; public function index(string|int|null $page = null) { $this->page = (int) $page ? $page : 1; $this->dataForm = filter_input_array(INPUT_POST, FILTER_DEFAULT); $this->searchDistrito = filter_input(INPUT_GET, 'search_distrito', FILTER_DEFAULT); if (!empty($this->dataForm['SearchDistrito'])) { $listSearchDistrito = new \App\adms\Models\distritos\AdmsList(); $listSearchDistrito->listSearchDistrito($this->page, $this->dataForm['search_distrito']); if ($listSearchDistrito->getResult()) { $this->data['list'] = $listSearchDistrito->getResultBd(); $this->data['pagination'] = $listSearchDistrito->getResultPg(); } else { $this->data['list'] = []; $this->data['pagination'] = ""; } $this->data['form'] = $this->dataForm; } elseif (!empty($this->searchDistrito)) { $listSearchDistrito = new \App\adms\Models\distritos\AdmsList(); $listSearchDistrito->listSearchDistrito($this->page, $this->searchDistrito); if ($listSearchDistrito->getResult()) { $this->data['list'] = $listSearchDistrito->getResultBd(); $this->data['pagination'] = $listSearchDistrito->getResultPg(); } else { $this->data['list'] = []; $this->data['pagination'] = ""; } $this->data['form'] = $this->dataForm; } else { $listDistritos = new \App\adms\Models\distritos\AdmsList(); $listDistritos->listDistritos($this->page); if ($listDistritos->getResult()) { $this->data['list'] = $listDistritos->getResultBd(); $this->data['pagination'] = $listDistritos->getResultPg(); } else { $this->data['list'] = []; $this->data['pagination'] = ""; } } $this->data['sidebarActive'] = "list-distritos"; $loadView = new \Core\ConfigView("adms/Views/distritos/list", $this->data); $loadView->loadView(); } } Formulário: <?php if (isset($this->data['form'])) { $valorForm = $this->data['form']; } ?> <!-- Inicio do conteudo do Administrativo --> <div class="wrapper"> <div class="row"> <!-- Inicio menu pesquisa --> <div class="top-list"> <form method="POST" action=""> <div class="row-input-search"> <?php $search_distrito = ""; if (isset($valorForm['search_distrito'])) { $search_distrito = $valorForm['search_distrito']; } ?> <div class="column"> <label class="title-input-search">Pesquisar Distrito: </label> <input type="text" name="search_distrito" id="search_distrito" class="input-search" placeholder="Pesquisar pelo nome do Distrito..." value="<?php echo $search_distrito; ?>" autofocus> </div> <div class="column margin-top-search"> <button type="submit" name="SearchDistrito" class="btn-info" value="Pesquisar">Pesquisar</button> </div> </div> </form> </div> <div class="content-adm-alert"> <?php if (isset($_SESSION['msg'])) { echo $_SESSION['msg']; unset($_SESSION['msg']); } ?> </div> <!-- Inicio da Tabela Listar --> <table class="table-list"> <thead class="list-head"> <tr> <th class="list-head-content table-md-none">ID</th> <th class="list-head-content">Distrito</th> </tr> </thead> <tbody class="list-body"> <?php foreach ($this->data['list'] as $distritos) { extract($distritos); ?> <tr> <td class="list-body-content table-md-none"><?php echo $id; ?></td> <td class="list-body-content"><?php echo $name_distrito; ?></td> </tr> <?php } ?> </tbody> </table> <!-- Final da Tabela Listar --> <!-- Inicio da Paginação --> <?php echo $this->data['pagination']; ?> <!-- Final da Paginação --> </div> </div> <!-- Final do conteudo do Administrativo-->
  23. Boa tarde, Venho pedir recomendaçoes de empresas para o fornecimento de alojamento para uma loja online feita por mim. Procuro algo fiavel, preferencia a NVMe cerca de 20gb espaço Linux... OBrigado
  24. Boas a todos. Estou a criar uma base de dados de contactos. Efetuo uma perquisa a uma tabela de contacto, e apresento através da DATATABLES. Aqui está tudo correto! Adicionei butões para exportar os dados apresentados. O que pretendo e não estou a conseguir é que ao exportar para PDF da tabela seja apresentada ao longo da pagina, ou seja, ocupe a pagina na horizontal em toda a largura da pagina. O código que estou a utilizar é o seguinte, mas não estou a perceber onde vou colocar a definição do width da table a 100% da pagina. $(document).ready(function() { $('#example1').DataTable( { "language": { "buttons":{colvis: "Visualizar colunas"}, "lengthMenu": "Mostar _MENU_ campos por página", "zeroRecords": "Não existe contactos criados!", "info": "Página _PAGE_ de _PAGES_", "search":"Pesquisar", "paginate" :{ "first" : "Primeiro", "next" : "Seguinte", "previous": "Anterior", }, }, dom: '<"dt-buttons"Bf><"clear">lirtp', buttons: [ 'colvis', { extend: 'pdfHtml5', exportOptions:{ columns: [ 0, ':visible' ] }, text: '&nbsp;&nbsp;<i class="fa-solid fa-file-pdf"></i>', alignment: 'center', orientation: 'landscape', pageMargins: [ 20, 60, 40, 60 ], title:'Lista de Contactos', customize: function(doc){ var logo = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKoAAACqCAYAAAA9dtSCAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAALatJREFUeNrsfV9sJFt6189muNnxDUzdgDbah9UtB4FCgjJtBEKBh6kGgUaKlGkjqlWyBtydxwjJ3c882C2eyEu333jrsmSZUjeSe6QIRkjINS8gWAnXSMlCEqBrFG1gCcvUaPd6srl39/LQ33F/fXyq6pzqqm7bM0eyZsbTXX/O+Z3f9/u+853vbOBjy2yet2cDsAHUAFgAPqd/g/5d07xUBCChv8cA3tC/IwBxEJzFH3s7vW187IIFUDoEvMf0Z23FjxDRz2sAURCchR9H5QMHquftWQAcAE/oTxNQhhK43uV8/pF0fccQvCGAVwDCIDhLPgL1/oOzRiB5pgGWkJnoEEASBGdRBc8jJoyQFDrP9YJAG30E6v3SmAcAGkxbyi1mrBWtGwAE4Bpj+6znngA4vu8ad+OegtMC0AKwn2LSExpgYU7jOzDZhExpEAurJMIJAP8+yoONewbQGrFnK4N9Tu66yaT33M+wEj6xbPQRqLdr4AR7OinMeXxf9RybnCqmDWli+h+Bun6AHipYJQJwDGDyoXjJJHcaBNqawpr07jJgN+4ZQNdm8tymd4PNx6MgYv9vA8B4FMQr6J80CXRnAbtxxwDqAOhLjCHMe69sp4jAJTzwxwDa41GQpHz2a5VWHI+CNv3/EU0uHmXopl2vRCfsUCELYgDtu7SgsHFHAGoDGCo06IAAmpQM0D6AjkLv1jlLKoDqk+cNNqF2x6Ng4ja9cwJMD/OwUzQeBTsZDB2XwcAkCzpsonAN274Loa0Hd0B3qTrYr4JBU7znEwKUzmR4Mx4FIQGtC+CCwDoRjDYeBUf0/0MALbfp1QT4icEPucl2m56wGIXZlybykeft+dL1HQBTz9vrARjcZj2/ecvN/KUE0hDAThCcVc0Cb+jPF+NREBoA5AmByyKNKMwsCLAqU2vRd2r0vi1yBnv0E9PvpvSZwi0IzuIgOGsD2JGe5RDAJfX5R0Y1YNFDyfQmZKImBU25uGZPE3QRA9eEmM4GYI9HQZYj4khaNSI2FICskaywCHyxYGCSChY94xG7xpHb9Dr0/0MCGdymNyWwHafJkQzARgDqnrfXoGta9H4XnrdXiZy6V4xK3uqlBNIBgO2iIKXWomteEGh1gbrvNr23AKZkxg9yvhczJmyTpk0kJuww1qwzNnUAhBJIQXJhQDKk5ja9BrMuLQCXbtO7cJteqwDDTgBsUx/z57uksfgIVAVIjwikNhv0ehCcdUuY3RZjyFywEusm9CwhAa8OYDcPqONRcEQ/PmNvcb9jAkYshdaEyT3JuPYJewdQNGGbns0BMHSb3tRtekeak/FavwbBWZfeT8gUm8B69BGozNR73t6FpEV90qLa4RO36Vk0SI2Mj7V1wSpYdTwKdgl44RIeuABlRNdoE3gPJSAbTUi6lnimCX3/EMBbUz1Lfb1DfX+tXT1v74Lk2IcLVGbqHTZQu+QsmbKoGPh+xsD6BmB9xcJEfELUlgBqQs8RCtNN+ldMyGdZ+jcFzEKOdCnUVQcwGI+CiCZvR5dhiV3bZDkSdt+1S4HNNYK0RbrPZgy2Y6JF3aZnu02v4TY9i9jFB2Dn6LWQ7pUH1pjp1HO36V2So9Qv8LqfS9oXZLIB4JCAGxNwG4r3rDFATtjvHeHwCbYn5u8yB61POrZhqF132PMKR6u1LrxsrAmkHWnAfQDaWpQGiK9Q9caj4IjYaUpacZt9/ojYNmLfEX+PhNOjuMcFY7GIft6Qc2MceVDcY0ggaAswsP7gmvSQLEaX31vEYun5QwW4L2kCWPQT0jUizXGyqJ85QHtBcHZ074HqeXtD6cW7QXA2MBhwvmrkY5btHrOgufj/tgglsd8lAgRkGlsUnskCa7yK9XkGriFuJpUkNBk5SJWTkv3/BZntOr1fh2niz0wWD1TEQhLhfgJVAmkCw9goma9z6vhdFYDIlE8xSwrZ5oM2HgUbis+3yKx2ZVZaVyPA1ohlIwpbyZNIWIm2HNtl/RSOR0FdAreTEwtOG7sG5jFXYyt4J4BKJuSCMUVCoafIcACn1FHbWYwgD2IWUO9qo/gu5L6giSrCfAmFxAZlJL+QQ3XBwBrROFYO1s01gDQuCFLBMBONTh+wUI3sHN0HkDYILL6iLzqinwhIhypnihzRFkUFHE0nK8JivLVGTpZ1p4GqAKnw7CONwXAU4Sdgvg6fOog0eMcsAhDTv+9FG4+CCebBfkim/UDIKjL7Ima7LxiXMrmmZMr7FP14qxMZoLHjEYGVgHWjYqBeSiDVMhNMY/VYtpHwYifjUbCb5lnTABwTq15ithY+wAfQWCqhHB3gILpg0Y5jmsTPyHewSCZ0C5JQZTJgo0KQcsfJ6CWoY0UncO99SmZNFY7h39kl1ikbCBbmidQWZsnUFmP8muJroSQ/3tCfMfTTB3Wf74jJHR9SaiD7/xuTvUj/KcBaWTRgYwUgjcncJwVAIZwn4RQJpk3I7PmU9NHCfGvKdVZ9CQPvYL5NuQb1NuVlW4x5GZ9w2cgDmX+RZL4Q1nKbnrBwyvCUKmKiCVaeo1EJWDcqACmPuRXy7iUHSgTB6yz22VeAZmFQlhjkBub759fREsyroUyKMi5NsiGx9i797ms5ZJXCylBlcRlEA0pfFNgoGaQt6pylQSqB9RJsK4gEKGC2Lu8XGVRikRbSi1WYgizKkQKmLcRslWpS9P3E9yikFWUBNQfATzBbLPE1wNoucxPhRokglR90Ny+YzxgzYbqNa7h4PApitoIUA9gpQ9cR4+xDXawiC4TRX/yZH7/7B9/634+++TM/dv76z71NyOzZCpMe0ySK/sl//FsRfUYA+DHm5Sx17z9BgURphbO1bbraRsnbz+h5lXFsWhQ4L5OoSgWqQqdoLYsSM15qaL8Y8/XqCIrlToMOb1AIx9EExitioeh9f7tFg1VUFvgATh52p6HCQXMYEHRYtmeqZ1n+glEf0jM2aBwuyD+IVA6XJP0K+SdVAvWCDfwNMc3MayR7urIOlcwm96zFv68lQEHNZudMiAmZt+vrE0APc75ras57HLAKUOhMCCPASp59TICbZGwBF1anQX3vU/87mO0nO9JwpsMgOKuvHaiUBX6YFYZiCRI8XHMsZqRKh+poLgOAHuYwqE/gXBjw9/3tGrGDg2raBED7YXeaLKmfQ4qMxDlm/zVdy6a+FpbsOnZKVq7FPsdb0bDV0s7VxpIgFQATpnJH3h3KzI0IMYnZJgelhQ5dyrRLg9zP0KAxOSnKdXBi0X5FISlZYuyq2FXRjwc5LDtAygZG1r+ifcYcUrGdhdfvEtblWJCIbsiKsCHLup1l9OrGEiCVdWmq80TeZg/zLHxlrLMssJIOHaaALKbBTPVI3/e3hwZOVlmt/bA79TXezYa091/xfm2VHBDZU0Jzs746l9jZwXzzoejLnknISuFcLaVXlwHqQl5oVpCX8kFBn5dTz85ptrbZZzt58b4MFh2msE4CjTjrmkBqBFYGumGGLEll15TQUyz0KrN6PuZVsLeL5OVKenVAGwlXA1QqVHChO1MIQCItja/fC1AuMCzrqLZu7iTp3PMUh0dr0N73t7neXlfbfdidTgwmZ5aTGFEfGptcNgbAEqt9CstbL1LzamNVN2bevfAeX1EHL6w7u03PGY+CkLKgJpqdykMi8kBpJUS/72/LJnBdLQFQf9idmkY10iZZQn3gFwCrWHKts1JFDcmx8/OY1pTYygIq7xAjKidzdQ4p44atnIhrmzBpmqnWygIikFqY5xWYgmpCky7GYry3huJLsdHD7nSnALBqUG9lMeoPZgWv1/1zrp2rXyWpaBwF2DAEqU0PLwZpW8Pkt8B2SUo68to0cUcqrcKd4trnUFeZ3jUJhhfQpTHFQX3NSdAhj91kIvQedqdHBcCaFe3woVlsjY1HmyajmMgTipZEmG88rOWBlSwxJ4Ntk/phpkDl8dDMJVIpuHxD4zAmTAB0YbBEKl1bNvVG0QKKlV4adIMPoJsW+8y4T57zo2LrbdP7SEBThde0+oicXAezBG0BfNU48rHIdLikKIDRQsCmAUgd1smhAUjbkqPUAK5L0ojs8yFjwqIg9cejoEgegMk+/e7D7rRdBDwPu9P4YXdax2Ilkqxm4WaNVu1G0qmOmwUratCrFNNmDqjDIzPSfQTRADm1uQgzwtI5JtUDNwsOaJ7W6VCHLIh4EbOjol41qTN387zTDJB2i3ilxKa6ndV72J0OlvWUHnanwpTqtAOSDkXBGmFx24g2WMejIGGhPFtxDf7ZkMawpjPZ2d+HpQKV0vfEQ/gaKwz7mGU+DRQxThA4Lt2mJ2o6fZanKTNA2l4iB/VA83NhEb2Yw1Y6+mwpViUQxZjv7S/CrEKGWGW8OGFHkJetW31Fl1F52KOn8XlbwRotellRFS+BZswyB6R+kQ4jzdgyAFZpjaSD7jX3l70fmec0sOqwWohZyctayvg4NLa6zlEvBVvFgUqIt1k4SvdhLKmzBuQohSw+qmsC+2WClE0cLefpYXcao+RGa/s6kQmbYrxVgbVBjq0OsIYyA7MVMiC7bCZn1ZhdU4tVdRj1kNF/T7NfYuoAS6GZRIDewmy7RR6bHilAtSxITZiqh+par+RnLQrWVlZhORo3UQVx6ja9PtUE6GO++OMb5scOmKN3uBRQJTY1OVzshIDYV8xAhx4sygMbOV/ySwyWBSk5Ufa62FRi1Ujjo41lnKoUsMpjOcwqqUl9LiRbh1hU6OeeqTNLWJrosuoDg5ncM5wtYq+44za9CWZn2n+Oeey0nQNSW6GffJPVlRIYahVFK441dWLDILSVC1a36dWxuHUI5FyllksiyTbhxUGW3DXbY9ZyP+v9NjLYtIZ5INx4C2zGCkkIjdKHUrI1UFKeKjHqVINRCy1jFnyetxpe9eRhd7pb5n0VOapARoGPKpqUXZWas/pAM3RzrPHCYhUkwjxjp03nLQmTkuhk8pAudaTwSLskkOqa/ROsrvkaYajG+/62VXSlKs2cu03vsXTvhtv0OiusLnPMgHqQZmk3U1BusS9HWXFTlmaWgFVyljSR+L6jAdKaQpd2i+68TDGhOm2yQqDqTgqn7BuTlJL79lCc3Vp1I2wJ+dBKq2H1QCN0k6fTDgmkO6R9juhFz4lhHYk5dEJRsinyS+ybJxqfiap0ohROVfS+vx1rMP2TiiZQG4v5DkK2GUkAVsLdZpbwWEPHnjCctLB4nFCm17/PbjTJcXgcLBaaTRhz1Wi2DDBbOutqSIgbJr/kQdFhpRdYfZuU9OxFWDVSOMsN3XKUbOzEyYMO/TTIQRvmsKrPcLOvxaiUylfTDEk57KWmNDP2USDVjjlfsskvTZO972/rdny4BqC+0tCptapuTmcgyHUFhphlT+WNXYPJvy4ramdjli3VcptekhOxmRDIa563Z8sLS5s5TtRJnhjHvE6nhfne9xjmhXM7kucblmzytRkpb0doRS0sebIVaTKQbM0TAYVPUedjJuUZdHJ073EKBlOBKpyNWGeLyXgUxJQwKwAbY76CMdQR5dIht2mdVkZ7fEvZVKz/6ziMVbJqqPAj+hqJKzXyJSLFNRMmKxo5TlWc9rlNyezz0M0kB1xDUflNPBCdcLeNeXZQiwCbxwIym/olevmmg/wK62s67/x5xc8ga1ULehlcrzMmwESTKMTnbPkAts0M03iSw4At3ml0MFlNSAIC7C5y1oBT2LSq9XW7JLBU1V6vk1GZufZTnOtlrVVe/5+kyTQZqOKIwyQn57Sh8I7FMd08IhBrrAGr2LT00BAF+nVavEagRiVNtrJZNU+rTsihtnP69UWO9x8x7/+ZEqgUaHU0QyXPMFtlmhAohWR4IQniSw2Nur8iNrV0PmS6TbnkFt8GoKaw6oGGIzTMuOa25mqXwJ7Dg/8PUqj2VY6pbgCIaTtJlALwBuanKWeFNXjHTyo8JS9LJyf07Jkz/unoqY155ZBHzAzbyK8SGLO/vyH2jF82X0ZsksTv+9u4JY0njACUOJ3iMIVu0xuQZ3+OlOVuUYA5B7Cv2H0dgSkO1Ceanq+N+Vn2l27Ti4mtEpZvKhg2z3PfzwhRrCokdJK27fnp6KmDcmr4pwL56eipMPkhgFdf/K8/wKc//WmejLGrXjmjAsqhNMFT1+LHo6DrNr0bOpvISNQ3sOl3cUZxkVDC5CSNUeOsLH4C42f0AKKGp0UP8JYubOVJCMbM16xT8RGP3Fv2MdusF0ugEc/0jPrDWtGEqdFPZ/pnv4G/9uMrHeCvQkufSEBtIGOlkMBqYxbgl4tvcKsVZejU2PP2Yma5bpj+mgabyiGHCWYZUnxwWwx4WZ3ZWjGbWmTOfAVAG5gXrP3Y5mPsUxa/mLBWVqklVnqdO4chZkV/Q/Y5J2eihYSP2gJQpf3VWfrUpi/HXKsw0Aqzv4+cE/ZwMzlkUmWny7mcxJ4dqAvWfmyL49KSHOlJhr5M6M+J4qBhC7NVrA4laMd5OtXz9pwgOAsfSGyaFyJxhGdHeiSimfFa/J0AnOk5K8x+tKqjxhlATUvsfKjthQTURoZOHWSMucCOTYyZZNwzkix9KMJTj6VYVtYFEua92vTgh5glH1y6Te9rjV2NDYUWqhygT0dPjzCrf3T4EaTa5n8igcoyzKqySD6IbS/d8SjI3KkhYfAxMI+jaulTYstdpvm2MSuxXScPf0DXyAPBkwxPrwqQtu4rQLfc08st99Sp+DahwrLqgNTBLPWvQ9fYMdg5EHJsyqY/1phhodv02kTjF5jXzjQBG3/RpKJ1fRH3NClMtvb2za++1PmYbBovttzTAYDe1fh5UpH5b2QQDdK0KOapfwPDe8YLQKX8U9He6FyBvEELdIQ2ZvWNtE2B5LyEFYG0A7MCaCbsEmEetE940D7jeUS4q4ZZqKwGxbr9N3+SD1Sxb2rLPeX92AHQ2HJP21fj52EF76zFqORwX7AxjgAkaYsFGe0ai563Zz8oAhp2QgcwWwe2DZyhmsLDK9tZOi+RRSNilPBl82VhALDvTqRndYihGp/+9Kem0Qdb8e+LLfd0cDV+XlqaJAX/Ey6bRGVwxccTzEKNjzHP9HfoOwn15ysx4TO0aoh5nqv9QAJOkgPQGubnLiWYxSUHhln4ToYZWxakDoHUKgGcJwAmL5svK4tGvGy+TAi4EwDdf/8vf6WF/D3+OpOlQ7q1XqIUiKSxq6mehbAwkCxoDYsrfA6BsAfgKOV+/LlrD/ig5uw25aY0wmyrSZFBfCxr3hIdpmHR7//ge9/G9/7gF/Hom99v/9ej3/LXoU//9vsfmn7FybFc0y33tH41fl4GGbyS7qeVF0vAXfBhiPBqWT5REJxFnrd3HWl4AP1E3GdyJ7hNL4I6jprVLIVgXhakhY/c+X78l/Dmu7+CP/ni09k0/uOfT7C+ZmsCRrdZJAXaV+PnkxIYNUvCmUiJyNCSfs41al5oqk7a1CZWrLGfBpsteQcPOGUCtShI3/3xz+N/RH8DP0o+UzHRZE1A1dnKHRt+3gJwTmBdxlIkppOKmNPC4pHwn7PvJjlVWULCi/3AcCaEKV58jXmz4RKztHKQfvXlJ/i97/wqfvC9by8DlqqaY9hnJs7XcMs9RVGwUlhSC6gZRwnJwNd+lge6jodIJJB1qdAgJAOsnPxTeSDerRKkP/jet/F73/lVfPXlJ8uCpfSmu7tUSuw2jRIsBVYVSaU40jFZpdfs3wIXUYEt8Bb3+vPY7YJ7aVTEzGYHudYwKzZQN3CQ4lWBFED0f//o2y+++vKT3FqcW+5powRNVwWbyv26i/QzX6sAayRp0zTP30c5lQdFpKH2YEl2W1ZjxisCqQ+g+/34FwC9UtzP1qBTn5k6Ulfj55Mt9zTC4iFzOq2/5Z5GBaIBWkzIjlKHFCWwVb5PlivBTf8qW22ZL1MIyhSk3ZfNl4PZX1+CBjbvORoov5RQltm3NfvmBntdjZ/HW+5pHdlHvqdFA3auxs/jCl7JRslnyq4aqNYSIK3BPE7aftl86SsGOw8U1orNvw7AkrQKLhTUb2+5pzAE6znFWZOK3qtbVvlKU6Aeuk2Pz5SEtGoRYW8CUguslKWmiaqnrMGfQK+gwirNv86++dxnuRo/b2+5p28M2KxGTFyV9bDKupDJgWih4idiL2yXpFtVzWRZNAukIF2m84ytLffUqhqhdOKJziTXqjB4NX5+BLNySK0t97SBW960GTVH9FbWKAvKMfhKWyObaaLJqh2kr0WX1XQOZUsedqfa7H41fj7Yck8fG8iAITlX8W0F6uZtnkWUT3poCFKdAdXdSHhQJatS7FRnEvqm174aP2/D7NzVYYmvFkkW984B1fTBTWKEA4XjlDaIMfRW0CwsecRjnubX/FyhHboEVt0+d7bc01YZL0UF8+oZe/eXAuqjFQBV27ukUJSuyQ9fNl+a5l/q7tOqhFUN2DRcsthE3aDf+6vQ5QbtEQcqd4hW3ZwML//QAPzGx83QyowOAKpiVd33W6oWF4WedPsnr9/l8apa0wpMRpsmLFdC032xFvTDXbuUgFyk6ZrUQ2nbx7JsqusgxmVUv6atKQPNj3d033VVW9wBJCvVqIoXe7yEJwwA/jLbQ8jZ0AX5sCSQmliLMisb9gyJYqFlHT+5Kq8/zjLDFbOqpTD7DU02TbBk+XQyi7rXcLbc0zIkgK6DGKYVb1viXZc5el1+5nAFWBGYjDehufNU1Txv70YJa0OgqibHM83rdJcw+UW0qpAAhZmFTH5jDWzKJYCOJ24ragUU1qeet1eTdjubtjcLGlUXdJ63Z3ne3gVmRR0uPW9vagDYKMekaGk33VCULugNnI1hEc+YKl7rmvxJhSezaFsQ6d/ylqU3mgCdYlaEYup5exdpJ/Opvitr1CjLFKcJbulFbMyWOXXa6xTPTnj7OjPvuGSmmUB/Xb8Gw3oBpEt1l4GXljQ57xprvuuTtHEyMP3n0ng6Bn3H+yra1DDFOi8BKE6y0GFUyaHSZeVJRUyjKyVaW+7pkcG1LwyiGL0VHG/5QnNCCqtnKcYm0pEQit/pSh+OxXhTKtq77NEwuQNNOxCTlAfSAnoVe+2JaUx04aHOSs77/vbQYAKGD7vTwQqcFB2QWVn6dIkTFXXH7hqLQXAWb0oPrjvrVaY3zKpUnWE2auxACquMybAEWAeGbD3MAiuBtGUwyVeSrK2b2c/iqUWL2qn8CN0VQZtjUwaqlukPgrMJZqsdIeaH8pqsDr0q4EAZe5sFW9vwHkqwGoIUALqrPNHaECyNnPHLklM9hpN2EJzpWgyHY/OB7OB43l4tp0YqB2tRrSjPyGcoZzNYGWyTbLmnu1g8FlwHrLgaP/fJceobgtQvM2ZaZiNrZxfxEejA5yPTe0q+zmsVo5o4NIUb6VTOHg2N8zZhKE+WNY2mZnhIDtaFIUijKr38FJNuafZDqGDTqMwTv/McuQXTLx3Ou6oCDBOFNxgZvkSVYPWhvz5+7WD94/+2V3v31TdMnM9dUUZyhc2kDw8Kasxl2hPGyiFnVGOdWkI7UZh/nQGzaKPfKsDaNZUk/+b//VX8+u/+Bn7ni2/pgLS+Jl2qs/oXs/PCjM3+ks2RLf2mQjfaSy53FTb/f+5fW7qDtr+qETXMlAcA/M4X38KT17+J3/rDv5vptK3xOMuGpiQ5UJj9SicWYc+WfZnNFE9uXax6oBn6aNEq1q0FKwD8iz+s48nr31Sxa9tkD1TJ+rSlo/Mf4v1rBaBXcbKio8LkZoonviqdKg9+a/NqUyf0YaHcPT6VgVWw6z/97/8QpF3b6/LwyYnSWsLc2fgvj7AY105WZPaVR51uSqGE0MA0lGH+Y2nwrW/8py3dLTEN2q5y68EKAP/q/+zgF/7zP0v+wn/45/Yat3vophhGn+GtjIHJCrx9jr2QMHmDUYH5GrBVIH2vFPP/Z37woAH9lY9h1Y7V09FTh7Zsc7AWDSdZmGVQTbfc02GZuwY02HSoS0B/ZeP3E4U8WCrtkK0+ZunTGptIC/kI8r7+UHJYopSbWgDeGjxnaoU/qrsZMm1if+M7W9Gf/M0r3WtfPh09bZeZ9kfbtBukmW363eOXzZdtAutgyz2NYV5JjwO2hVlyS0iTdVJFaR1m7nWtT/yX8fsyqPw0J0osCGhUcBzSoSTbmk7ywvU2FKie0uDEQXC2nTFDuCh/TAMbMgH8DLN4XUJAjTKu5WCxZE/yo19/F3/9ydcmbDnBLJk6LgjOGk2WfaTHGSPMqrAkBAIb5pX08t7hFYE2LgGkDQKpNnP/8sbvxjam8ue3M4AqloojcrZUZ6DamOUu++NR0M5g1FTsqYDax3zX5Y7Ociox7JTCF3WKv10wNtW5xgX3+H7y2U/8q7/3w0YBxvIxP24nSTPnmJfrFid16N4nxmxDYcQAwfusrCZ8BnE+QqJzfhRNngVroNs+wZ9Gf3/j39lSX2SCix3l1GDP7QM4FuBmYE4FPJl9sWw9CIKzbh5QBfoBwA+CM62lRDrvsoPZ0mPfBKQprIr3f+cL/6tvfbmMwxRjHqu1Ud7yawKgNy9nCdDWjSFWc1I1f6+00I7xOz3ZeBX9LH7o6LKpgjVbWDwMOSSWHQoSy2BTnsSzLWfibaR86ZKZ7W3ufeU86JT9qk2Vh00Et5xxFP7wHyUxCp54soI2wayMUMIAe4SSa4Ouom3jfw5+aeO7slXIOzgkSxbuSxMnEw+et/eWAB4FwdmNkyA3czxxyyBUlbBZvvBQbtOz3aZ3TocQZDU5y9759N/++TcosYZRBaGUKV98oGp627gl2WA67VN80f2lje82FOM5KHK98SjwiT13qB/iHJC2GAsrcwkeZOg8Yb4P8jqdNKrYbiGDtAPNU53HoyBxm16P3RubX2webL362d2rJz/qYz3VXLJaSBJgweKQI9Teck9P6N2dW4zTtrNx8VghWdppcVPyQRrMwUygOHyZ/q0jHfcl7N1oG5qaYSfnVD8hFQbjUdBlmrPPJERPt/qw7FiRvtlZ5uCzkpsP4ES3+AVtsT64ZRImAdD9tY3fTnBzY+Yk6/wn5o8gIzqS0M/rLPkgOVGpPlFWpRS+rptXuSQi77DLXuSCQOqTIDcxI21JAtTcpjekOKb8f6tqMWZB7+2XzZdtkwotV+PnES0UbMOsYklVLQJQ/7WN345wcyk60WBB/g5dzDP5Y3YNEX3I24d3kII5PUYltHNm207bE8XPG2IOUUzmIyzSkyTIhwpz5LO6qa0VsM4EwAvNuqvajaIE+zSY1ooAmgA4vho/P2JyTZZTuzrlIsn8X9I479B1LvLCWRkRpjAIzupFgcrBkhuqYp5/RKGppZhPEQUAgB2hhSoCbETa88WSda1MQCs035OK9GxMTspArH65Te9c4ShfSzdDMhH9VKPxiTWByse3HQRnfiGg0sXEakFuqIrFQjPDGgToPn0u0nDSahIrLMRnyevmA21rsksEdujwqoCpybY1zFb8bJgtSNyYcPJCQQoBhFlxThqzmsy20rW0w1lUMWVK75W5Cprl9ct6RKxpd5C9WUvMpEcZL3yEeZwxUw9RFEBstLNYyEycEBgB1+fe+8JjJOCmRQjiKuoClNkIWGEK83LAin/HXB9mbYcm/6GlGLe8XcR9zPa2yazbxfws3MjgNTvsXXITXjY00T9lLLWdtX+fIgA2OVCJxLZDxs5dEtJRnqZhS7KW1Lk7K0o9uxctRfffsFAZjCryGkLSsok0PpDHXUOb5rJpntcvs6poeasuXcZ6DbfpOaSHRJx1QC/j0wxsUQcig1kj3EytswFM11238w6B9KgoSGkMYszKrPskr677no2PBb0aZIcp2FqOUWkWXDJzmhdXVc3cELOT3KIUDZp72O8yjPCBgzQt/my8zK0Yh+tr0H2QkyElogXabGrCqJAYrZ8z+3zMYoYivrZLp2REsgZlsbPzvORauq7cCYK9nY+QvOmMlg1SNg47RBJDAVDMY6p5Wvf6GXTvuWHygFJcdZeqpZSpmbTCWinMCpR49uY9ACnXlEYgVVTvS4s6PGOfi8ajYCcHPw0mDTLjpkW8fkgzQIjgoefthTqZVTnmKCGP0ybwDfM80PEo8N2mJ2Yn78C+2/QeE2CTDxikDtT1WHVl0iHM82tDjXDUsAibGjMq3ZCHl24kuOqYI6ZLI5IFMQuddHT0akY04Drc8iHqVin8V6hPqF9FEd6I5FvCmDMpgBueH9ALgrOjqoFqkRgWerIulQTS7YAJFBk6btOrmQAsx8QVyqe8owCtEWOp+kFLUikI5Zyk3gKhFMCMw8JXMTnjSaVALXpjt+k1MF84uLFUR/9/yDo6Bi37aWhWC+kb2GIskXNwFxwmYqq0sKHWsihNeIfGJxL9xRg6IbCGqyK2pYGqoHKdPADhAN0Q8pJnGmGefWObsAHdo58i/H1i2PgegbRFIFJFSxLq64kGQIdQn3rSpl3CnGSMHFZpPd9YKpYBVHmm5EYBaLtsrGDSc9WMZbM516PU6PhrhiHAJncYoA7mub5pjs2uhiXiGt/HfC/9MwaunfEoiCRpoZRtOV5+IZO/NFDpQWqYB28TepDYsNPFQsKOSpsysBrF/XJ2FiTU2XeKYYlBDzIAmhDj+YZ9r7JywgLGYi8+yYwhZvv480JRNhZzNLR2NFcCVEUUICINYiLav0ZG5g4rdpGZ3VNAu4o2AXBS5pHdJYPTpuffR3ZWmJGlYJYsNX+USbIdeUUx6z5kbXnWm7GXL7elz0KlBxDmugbDM5jyGnVIrACg1ndpEOoZcb4GZqtiU7fp9W9D7gCtKLUoR2KaoUOFmd8ejwLT2LF4z6zCvKKYiKUYk6zGZUm4LEgB84B/WttlerXleXuvDQ4VSLKYgkBpS2A9p4B/W8d0k+4NSdulbbazyTnsuE0vxrxqSbgKPUsTxMEsp7ah8ZWQGDTUvL4NwCm6bGpgYTvMgsUocER9ZUANgrPE8/Z2mTDve95erLnEegzg0G16nRRvUkQWXjDtKYB26TY9bU0mAXY/QxJcg5buGZGsEVVLlqpjzyo51zBLjnagnxhdNHpxjtnes4RkTswcpzSw7zPA6YC0wSxqQg52KZN8o+TZJAS4eNB6noCWVqp6FPdL6PdiKS/BLMnFYs7bLjMx9SJxUmKZBgqUv2GsJt71dcpnHjEzaBe8T0Qm2jedINIZXpesL4F5hv0NR5YIoQ/NPVDkWPNVwsytJWsFKqP+viFYbSyuLsVsQBMCYsS2Ue+OR8FEt/iWAcuJzXY21t9i5uhFhu8iJnmDyaYdzBcGJuNRsCsl9wzIalk0cR1oxrAVIO2VoUsrBSo9+FDSKTuaZYFaZIosZu59YlgxAThwHUg7H4VZXcaLZ0z7xNAsL9MSzKshToqGzaTYqAD7G9aPYrJ3x6NgkLFIMoFerNTCYjxdu17Z2oGqAKtx2EoBnEvJAw2ZVq2zJT8xEDtlJaWIjW2YV/+zsFzVlpDJBaF545KeU/STsuCH9Bkx4S3qsxo9l9ZEUYShKgFp1UCVX6IwWLnJp468wHxD27FgTxYbDKn85RFmBRBOqlrrN0jYTqrO5mJxz8y9+ayftFf8qhzftQK1rJdhJv+6zAwtEtwoO+M2PbEJcXs8CmK36b1lDBwRqCsNz6yz0fsmOVWdxWfFvn6jvfzrAClQQsA/L2yFWbBdMEkNwKXh+QBPoN5WbSn0rU1aLKZ/W+Qk9OjvQ7fpXd7lDYG0EPA25R2svFASWywRhxN3TPqDLZuvDKSVAzUFrDaAC12wEmtmbsFlS6UJ5rsaRU2j4/EoOCKWEXvQLwzOXr1tzcZ8n1hN4ZDlRSyGFLNOSEppJ5gz795eJUhXAlQJrD6b+RcUINYBa15HdOiax8SmwvFZcArIuRDbejsq7Za3dXuFzGm7TU+1afEJ70MJrBMANsmltKiKiGZgPAoi3egIjRUPQfmrAunKgCrASh4hB+s5xV2LhHI4mx5gsfDsNZsqQD+QBpyHdcSerdvQhCeedm5pWwHWY+qHvtv0OsJqiELK9G4RDPcr0RjxPVh+EJy1VwVSoLy1fhPAtj1v7zXmiwJ9z9t7DKBr8OI7LPQlYoBdtqLVwiw9Lc3TjxXS4fooHrfpOWl5sZhX1n6tCuOkRQFUzyKcHyh2IFDYKEkLg7ENjkOwEkdu02vT7/oEWDkstqu7ukVOk5x9Vnow/1YxqgTWARbrnLZICtg63x+PgpjthbIJlAN2LSWbCnZR6DieEAzF/38uMXmLBnBKGxJ5u0j5SZswNgFNNfghUhLAiUWFo3nNrGTKd0irh/TjYxYzrRuA1KbnbrF3b68DpGthVAZW3/P2Isw3+4mIQNukXgDFS7ljdMD0mqoJYPEklwZ9vgf1Eqot7iUxZ5+85nfSJsIIeqf7hZgH2Q/dpvdEYrzXmBUmcxSMfMmu8YIYnxePKwwo0qP8sLcYswSTaF142cCaG5mXc4k5fEMpwNmSe6U+DWJIvxPr39F4FOywJdgYVHBNlchNmfCQg+M0QcTy4Wdp38943ga9e5vYscWkwIQ93/U+JVr8qOHmWU41xty7RRY4Ukx9iBKzoO6U6Vc4WXUsFstqEbs6JtciSbBNEYYJXeccsx0Cl5ifLlhn24EFY17Syo4qxFODohy7VJLIKfD6gqEeU66CcHLO3abXZ2CTT/uOKFGaRzQieu9uQZA61EeyHq2vG6RrNf0KwB553t6ESQGbdOuAOiwxAGyIWd6pjcXCvhMRMyRmsli46gkbJCsr0pACNq5xHWJWDqwd1cSiJG2HOUgRmd0OMWqsOwno3SJDgFq4WRll7ab+1gKVwBp53t6O1HEdzHYNtE1rXSmOWRcmt0+D78uJG2K9XBTCYF58Wr7pMwmwAtRhxndkoDcksO3IJ4+odvCWILtkLQoK8fVuA4veWqAKKQCg63l7LzAv/GthFnMNSbsuO9PfEbuq4okviFntPHZioTABTKHpkHX8jdReqRym8Sjouk3vFQOSI3QpljwgjlaY+hJTx+TVh7iFbRO3tFGH7Uja1SHtOtQNZaUw7VEGkLgp56GqhEcXmKNjkVNTlIHCNI3LQk1tNgEmS5TWsSn98lK6Xw+znOHwtuJhA3egEShVRSV6mFXfKNVMkdl9Nx4FRxlFx66fgYemWEqiXEk568x7ZTZYyZGVjuI9QmLR+LZj4E4AVfJM5QohCTkxvSo6nC0Q2FI0IIF6ZeoixflJ3ddVhf5kE1yE5Ky7YubvPFDZALSg3uvuAzi+Td7qmvqnBvWRljFNaP+uvdPGHR+QNMBG5HRMbpv3uoL+UJX8ubMAvRdAlQZoX2FyhSy4tyzL2FM270KDntxlgN4roGqYPMEqExq46B68Z9bW7nsnge4VUCUvV7BsTfERwbSvMKuNFN/y97GxWO7HUnwsAhWpuI9y514CVTHIB8guLBFjvqc+WjcTEWPWkH+2a8ykTXyfx/HeA1UBAAezZU8n5+MhAeEN/T0pG8D0PBY9y+cESJ3nekGW4IOJbnxQQFXIA4exVs3g66Fkct/lfP6RdH3H4F4RY/vwQ4pifARqOngFYB9jXhlllS0Cqxp4lwLyH4F6OzSujfnpdZ8zzWgZgDnCPFVQSIqEfh/fd425bPv/AwAgrl96GPGJdQAAAABJRU5ErkJggg=='; var now = new Date(); var jsDate = now.getDate()+'-'+(now.getMonth()+1)+'-'+now.getFullYear(); doc.defaultStyle.fontSize = 10; doc.defaultStyle.alignment = 'left'; doc['header']=(function() { return { columns: [ { image: logo, width: 40 } ], margin:20 } }); doc['footer']=(function() { return { columns: [ { alignment: 'left', fontSize: 7, text: '@ Teste', }, { alignment: 'right', fontSize: 7, text: ['Criado em: ', { text: jsDate.toString()}], } ], margin: 20 } }); } } ] } ); } );
  25. Olá a todos, Estou a precisar de uma pequena ajuda para tentar criar o seguinte: Estou a criar uma pequena plataforma que vai gerar um processo cada um novo registo com um número por ordem sequencial. A minha ideia seria esse número ser criado assim que é gravado o processo mas quando fossem criados processos no ano 2024 a sequencia voltasse ao valor 0. Não estou a conseguir ter uma ideia de criar desta forma. Obrigado!
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.