Jump to content

Williams Duarte

Members
  • Content count

    3952
  • Joined

  • Last visited

  • Days Won

    47

Williams Duarte last won the day on November 2 2017

Williams Duarte had the most liked content!

Community Reputation

431 Incrível

About Williams Duarte

  • Birthday 05/17/1989

Informações Pessoais

  • Sexo
    Masculino
  • Interesses
    Tecnologia, Engenharia de Software, PHP, Design Pattern, JavaScript, SQL, NoSQL e Empreendedorismo

Recent Profile Visitors

8801004 profile views
  1. Williams Duarte

    PHP - Passar valor para o INPUT vindo do AJAX em formato moeda

    double 10,2 para mysql, postgres, float para mongodb etc
  2. Williams Duarte

    PHP - Passar valor para o INPUT vindo do AJAX em formato moeda

    Explicando: O erro ocorre porque você está comparando strings em vez de números, e na comparação de strings, "2.00" é considerado maior que "123.45" (porque a comparação é feita caractere por caractere, e "2" vem depois de "1" alfabeticamente). Para resolver este problema, precisa garantir que está trabalhando com números em vez de strings, e que esta usando o formato correto para comparação. Vou sugerir uma solução que mantém o formato brasileiro para exibição, mas usa o formato com ponto para cálculos internos. // Função para formatar número para o formato brasileiro function formatarNumero(numero) { return numero.toLocaleString('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); } // Função para converter string no formato brasileiro para número function converterParaNumero(str) { return parseFloat(str.replace('.', '').replace(',', '.')); } // Modifique a função existente $(document).on("click", ".btn-prod", function() { prds = $(this).val(); infoprd = prds.split("*"); $("#idProdutos").val(infoprd[0]); $("#cod_interno").val(infoprd[1]); $("#descricao").val(infoprd[2]); $("#prd_unid").val(infoprd[3]); // Armazena o valor numérico em um atributo data- var estoqueNumerico = parseFloat(infoprd[4]); $("#estoque_atual").val(formatarNumero(estoqueNumerico)) .data('valor-numerico', estoqueNumerico); $("#modal_prod").modal("hide"); statusLimparAgregar(); }); // Função para validar o consumo function validarConsumo() { var estoqueAtual = $("#estoque_atual").data('valor-numerico'); var consumo = converterParaNumero($("#campo_consumo").val()); if (consumo > estoqueAtual) { alert("O consumo não pode ser maior que o estoque atual."); return false; } return true; } // Adicione este evento ao campo de consumo $("#campo_consumo").on('blur', function() { $(this).val(formatarNumero(converterParaNumero($(this).val()))); }); // Use esta função no submit do formulário $("form").on('submit', function(e) { if (!validarConsumo()) { e.preventDefault(); // Impede o envio do formulário se a validação falhar } }); Explicação das modificações: formatarNumero(): Formata um número para o estilo brasileiro (123,45). converterParaNumero(): Converte uma string no formato brasileiro para um número. Na função de click do produto, armazenamos o valor numérico do estoque em um atributo data- e exibir o valor formatado no campo. validarConsumo(): Compara o consumo com o estoque atual, ambos como números. Adicionado um evento blur ao campo de consumo para formatá-lo automaticamente. Adicionado uma validação no submit do formulário. Com essas modificações, você pode: Exibir os números no formato brasileiro (123,45). Armazenar internamente os valores como números para comparações corretas. Validar se o consumo é maior que o estoque atual. Lembre-se de ajustar os IDs dos campos (#campo_consumo, por exemplo) para corresponder aos seus IDs reais no HTML. Além disso, no PHP, quando for salvar os dados no banco de dados, você precisará converter o valor de volta para o formato com ponto: $consumo = str_replace(',', '.', $_POST['campo_consumo']); Isso garantirá que o valor seja salvo corretamente no MySQL. Esta abordagem deve resolver o problema de comparação, mantendo a exibição no formato brasileiro e permitindo cálculos e comparações precisas.
  3. Williams Duarte

    PHP - Passar valor para o INPUT vindo do AJAX em formato moeda

    Existem funções nativas tanto em PHP quanto em JavaScript que podem ajudar na formatação de números para moeda. Vou listar algumas das funções mais úteis para esse propósito em ambas as linguagens. PHP // 1. number_format() $numero = 1234.56; echo number_format($numero, 2, ',', '.'); // Saída: 1.234,56 // 2. money_format() (Obsoleta a partir do PHP 7.4) // Nota: Esta função foi removida no PHP 8.0 setlocale(LC_MONETARY, 'pt_BR'); $numero = 1234.56; echo money_format('%.2n', $numero); // Saída: R$ 1.234,56 // 3. NumberFormatter (intl extension) $formatter = new NumberFormatter('pt_BR', NumberFormatter::CURRENCY); echo $formatter->formatCurrency(1234.56, 'BRL'); // Saída: R$ 1.234,56 // 4. str_replace() (para substituir ponto por vírgula) $numero = 1234.56; echo str_replace('.', ',', number_format($numero, 2)); // Saída: 1234,56 JS // 1. toFixed() let numero = 1234.56; console.log(numero.toFixed(2)); // Saída: "1234.56" // 2. toLocaleString() let numero = 1234.56; console.log(numero.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL' })); // Saída: "R$ 1.234,56" // 3. Intl.NumberFormat let formatter = new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL', }); console.log(formatter.format(1234.56)); // Saída: "R$ 1.234,56" // 4. replace() (para substituir ponto por vírgula) let numero = 1234.56; console.log(numero.toFixed(2).replace('.', ',')); // Saída: "1234,56"
  4. Williams Duarte

    Colocar barra sem ter a pasta

    Para fazer isso, você pode apenas criar o arquivo categoria.php diretamente na raiz do seu site e configurar o .htaccess da seguinte forma, sem a necessidade de marcarção ou tags: RewriteEngine On RewriteBase / RewriteRule ^categoria/?$ categoria.php [L] No arquivo categoria.php, você pode adicionar o texto ou lógica que desejar. Se você acessar teste.com.br/categoria/, o servidor automaticamente irá direcionar para o conteúdo do arquivo categoria.php. <?php echo "Bem-vindo à página de categorias!"; ?> Outra forma de criar a URL teste.com.br/categoria/ sem a necessidade de criar uma pasta física seria configurando o seu servidor web diretamente, dependendo do servidor que você está utilizando. Vou explicar para os servidores Apache e Nginx: Apache <VirtualHost *:80> ServerName teste.com.br DocumentRoot /caminho/para/sua/pasta/public <Directory /caminho/para/sua/pasta/public> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> # Redireciona /categoria para categoria.php <Location /categoria> SetHandler application/x-httpd-php Action application/x-httpd-php /categoria.php </Location> </VirtualHost> Nginx server { listen 80; server_name teste.com.br; root /caminho/para/sua/pasta/public; location /categoria { rewrite ^/categoria/?$ /categoria.php last; } location / { try_files $uri $uri/ =404; } }
  5. Williams Duarte

    lendo RSS com PHP + Imagem

    Faça a "image scraping" function getPreviewImage($url) { // Obter o conteúdo da página $html = file_get_contents($url); // Criar um novo objeto DOMDocument $doc = new DOMDocument(); @$doc->loadHTML($html); // Procurar pela tag meta og:image $tags = $doc->getElementsByTagName('meta'); foreach ($tags as $tag) { if ($tag->getAttribute('property') == 'og:image') { return $tag->getAttribute('content'); } } // Se não encontrar og:image, procurar pela primeira imagem na página $tags = $doc->getElementsByTagName('img'); if ($tags->length > 0) { return $tags->item(0)->getAttribute('src'); } // Se não encontrar nenhuma imagem, retornar null return null; } // Uso: $url = "https://example.com/article"; $imageUrl = getPreviewImage($url); if ($imageUrl) { echo "<img src='$imageUrl' alt='Preview'>"; } else { echo "Nenhuma imagem encontrada"; }
  6. Williams Duarte

    PHP - Mostrar resultado tabela por Intervalo de meses

    Não conheço muito de codeigniter, uso mais o Laravel mas tem sitaxe bem parecidas, tente assim: public function agrupar($id, $intervaloMeses = 3){ $this->db->select('lctos_itens.*, DATE_FORMAT(dateItens, "%Y-%m-01") AS data_inicio, LAST_DAY(dateItens) AS data_fim, SUM(lctos_itens.qtd_prod) as quantidade, produtos.*'); $this->db->from('lctos_itens'); $this->db->join('produtos', 'produtos.idProdutos = lctos_itens.cod_prod'); $this->db->where('lctos_itens.cod_prod', $id); $this->db->group_by('YEAR(dateItens), MONTH(dateItens)'); $this->db->order_by('dateItens', 'DESC'); $this->db->limit($intervaloMeses); return $this->db->get()->result(); } <div class="tab-pane fade" id="agrupar" role="tabpanel" aria-labelledby="agrupar-tab"> <div class="txtProd"> <?php echo $result->cod_interno; ?> - <?php echo $result->descricao; ?> </div> <div class="card-body"> <div class="row"> <div class="col-md-" id="divRelac" style="padding: 1%; margin-left:0px;"> <table class="table" id="tab_prods"> <thead> <tr style="background-color:#BDDCDC;"> <th style="text-align:center;">Período</th> <th style="text-align:center;">Quantidade</th> </tr> </thead> <tbody> <?php foreach ($agrupar as $ag): ?> <tr> <td style="text-align:center;"> <?php echo date('m/Y', strtotime($ag->data_inicio)); ?> - <?php echo date('m/Y', strtotime($ag->data_fim)); ?> </td> <td style="text-align:center;"><?php echo $ag->quantidade; ?></td> </tr> <?php endforeach; ?> </tbody> </table> </div> </div> </div> <div class="card-footer" style="text-align:center;"> <a href="<?php echo base_url() ?>estoque/produtos" class="btn btn-danger"> <i class="fa fa-undo"></i> Voltar </a> </div> </div>
  7. Williams Duarte

    PHP - Mostrar resultado tabela por Intervalo de meses

    https://ideone.com/VTEI1I <?php function agruparPorIntervalo($dados, $intervaloMeses = 3) { $resultado = []; foreach ($dados as $entrada) { $produto = $entrada['produto']; $data = new DateTime($entrada['data']); $chaveIntervalo = $data->format('Y') . '-' . ceil($data->format('n') / $intervaloMeses); if (!isset($resultado[$produto][$chaveIntervalo])) { $resultado[$produto][$chaveIntervalo] = [ 'quantidade' => 0, 'inicio' => clone $data, 'fim' => (clone $data)->modify('+' . ($intervaloMeses - 1) . ' months')->modify('last day of this month'), ]; } $resultado[$produto][$chaveIntervalo]['quantidade'] += $entrada['quantidade']; } return $resultado; } // Exemplo de uso $entradas = [ ['produto' => 'Prod_A', 'quantidade' => 100, 'data' => '2024-01-15'], ['produto' => 'Prod_A', 'quantidade' => 120, 'data' => '2024-03-20'], ['produto' => 'Prod_A', 'quantidade' => 105, 'data' => '2024-04-10'], ['produto' => 'Prod_B', 'quantidade' => 105, 'data' => '2024-02-05'], ['produto' => 'Prod_B', 'quantidade' => 120, 'data' => '2024-03-15'], ['produto' => 'Prod_B', 'quantidade' => 130, 'data' => '2024-04-25'], ]; $resultadoAgrupado = agruparPorIntervalo($entradas); // Exibir resultado foreach ($resultadoAgrupado as $produto => $intervalos) { echo "Produto: $produto\n"; foreach ($intervalos as $intervalo) { echo " Quantidade: {$intervalo['quantidade']}, "; echo "Período: {$intervalo['inicio']->format('m/Y')} - {$intervalo['fim']->format('m/Y')}\n"; } echo "========================\n"; }
  8. Williams Duarte

    PHP - Ajuda com NFePhp - mistério em achar caminho

    Você instalou este pacote? https://github.com/nfephp-org/sped-nfe/blob/master/src/Make.php porque a classe existe, de uma olhada na pasta vendor!
  9. Williams Duarte

    PHP - Ajuda com NFePhp - mistério em achar caminho

    No seu arquivo application/config/config.php, ajuste a configuração do Composer autoload para: $config['composer_autoload'] = FCPATH . 'vendor/autoload.php'; Se você ainda tiver problemas, tente usar o nome completo $nfe = new \NFePHP\NFe\Make(); Certifique-se de que o CodeIgniter está configurado para mostrar erros. No arquivo application/config/config.php, defina: $config['log_threshold'] = 4; E no index.php na raiz do projeto, certifique-se de que está definido para o ambiente de desenvolvimento: define('ENVIRONMENT', 'development'); Se o problema persistir, tente adicionar isso no topo do seu controller, logo após a declaração da classe: require_once FCPATH . 'vendor/autoload.php'; Verifique se as permissões de arquivo estão corretas e se o PHP tem acesso de leitura à pasta vendor. Se ainda não funcionar, tente executar composer dump-autoload na raiz do projeto. Se após essas tentativas você ainda estiver tendo problemas, por favor, forneça o erro exato que está recebendo. Isso nos ajudará a identificar melhor o problema.
  10. Williams Duarte

    PHP - Update MySql - bloquear duplicidade

    Para evitar a duplicidade de alteração de todos os registros com o mesmo cod_prod, você precisa adicionar condições adicionais na cláusula WHERE do método update_itens no model.
  11. Williams Duarte

    PHP+Codeigniter - Não acha o Caminho da CLASS

    Sim, adicionar essa configuração no seu composer.json tornará as classes na pasta application/libraries disponíveis para todo o projeto, utilizando o namespace Libraries. Isso permite que você organize suas classes de forma mais estruturada e as use de maneira mais simples. Qualquer mudança no composer use o comando: composer dump-autoload Depois disso, você poderá fazer o seguinte: use Libraries\MinhaClasse; $minhaClasse = new MinhaClasse(); Mas por convenção, o melhor seria App\MinhaClasse;
  12. Williams Duarte

    PHP+Codeigniter - Não acha o Caminho da CLASS

    Você incluiu no início do arquivo principal do seu projeto (como o index.php do CodeIgniter ou no seu controller), algo como: require_once __DIR__ . '/vendor/autoload.php'; ??? se incluiu rode o comando composer dump
  13. Williams Duarte

    PHP+Codeigniter - Não acha o Caminho da CLASS

    Verifique o caminho do namespace Certifique-se de que o namespace Servicos está correto e que a estrutura de diretórios segue o padrão de namespace. Por exemplo, se o namespace é Servicos, a estrutura de diretórios deve ser algo como: application/ └── libraries/ └── Servicos/ └── NFeServicos.php Além disso, no arquivo composer.json, você deve ter algo como: "autoload": { "psr-4": { "Servicos\\": "application/libraries/Servicos/" } } Depois de fazer qualquer alteração no composer.json, execute composer dump-autoload para regenerar o autoloader. Verifique o uso das classes: Assegure-se de que está usando o namespace correto no seu controller. A linha use Servicos\NFeServico; está incorreta, pois o nome da classe é NFeServicos (com "s" no final). Deve ser: use Servicos\NFeServicos;
  14. Williams Duarte

    PHP - Abrir e Fechar janela

    Entendi, vou lhe mostrar um exemplo, voce adapta ao que você quer! Mas adianto que você tem que entender de javascript, se ficar muito restrito ao php ou framework, você não conseguira fazer muita coisa, então estude Javascript, que isto nada tem haver com php! index.html: <!DOCTYPE html> <html> <head> <title>Sistema Principal</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/css/bootstrap.min.css"> <style> .open-flag { color: green; font-weight: bold; margin-left: 10px; } </style> </head> <body> <div class="container"> <h1>Módulo Principal</h1> <ul> <li><a href="#" class="open-module" data-module="estoque">Estoque</a><span id="flag-estoque"></span></li> <li><a href="#" class="open-module" data-module="compras">Compras</a><span id="flag-compras"></span></li> <li><a href="#" class="open-module" data-module="expedicao">Expedição</a><span id="flag-expedicao"></span></li> <li><a href="#" class="open-module" data-module="vendas">Vendas</a><span id="flag-vendas"></span></li> </ul> </div> <script> let openWindows = {}; function checkWindowClosed() { for (let module in openWindows) { if (openWindows[module] && openWindows[module].closed) { delete openWindows[module]; document.getElementById('flag-' + module).innerHTML = ''; } } } setInterval(checkWindowClosed, 1000); document.querySelectorAll('.open-module').forEach(function(link) { link.addEventListener('click', function(e) { e.preventDefault(); let module = this.getAttribute('data-module'); if (openWindows[module] && !openWindows[module].closed) { openWindows[module].focus(); } else { openWindows[module] = window.open('module.php?modulo=' + module, '_blank'); document.getElementById('flag-' + module).innerHTML = '(Aberto)'; } }); }); window.addEventListener('beforeunload', function() { for (let key in openWindows) { if (openWindows[key] && !openWindows[key].closed) { openWindows[key].close(); } } }); </script> </body> </html> module.php <?php $modulo = isset($_GET['modulo']) ? $_GET['modulo'] : 'default'; $conteudos = [ 'estoque' => '<h1>Módulo Estoque</h1><p>Conteúdo do módulo de Estoque...</p>', 'compras' => '<h1>Módulo Compras</h1><p>Conteúdo do módulo de Compras...</p>', 'expedicao' => '<h1>Módulo Expedição</h1><p>Conteúdo do módulo de Expedição...</p>', 'vendas' => '<h1>Módulo Vendas</h1><p>Conteúdo do módulo de Vendas...</p>', ]; $conteudo = isset($conteudos[$modulo]) ? $conteudos[$modulo] : '<h1>Módulo Não Encontrado</h1><p>Conteúdo não disponível.</p>'; ?> <!DOCTYPE html> <html> <head> <title>Módulo <?php echo htmlspecialchars($modulo); ?></title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/css/bootstrap.min.css"> </head> <body> <div class="container"> <?php echo $conteudo; ?> <button onclick="window.close();" class="btn btn-secondary mt-3">Fechar Módulo</button> </div> </body> </html>
  15. Williams Duarte

    PHP - Abrir e Fechar janela

    Bom, correto hoje em dia é usar alguma biblioteca para fazer isto, VueJs, React, para deixar mais reativo. Mas voce pode usar um Js para fazer isto. Exemplo Jquey usando modal: Logo abaixo um exemplo com vuejs <?php if (isset($_GET['modulo'])) { // Mock $modulos = [ 'estoque' => '<h1>Módulo Estoque</h1><p>Conteúdo do módulo de Estoque...</p>', 'compras' => '<h1>Módulo Compras</h1><p>Conteúdo do módulo de Compras...</p>', 'expedicao' => '<h1>Módulo Expedição</h1><p>Conteúdo do módulo de Expedição...</p>', 'vendas' => '<h1>Módulo Vendas</h1><p>Conteúdo do módulo de Vendas...</p>' ]; $modulo = $_GET['modulo']; if (isset($modulos[$modulo])) { echo $modulos[$modulo] . '<a href="#" class="close-module" data-module="' . $modulo . '">Fechar Módulo</a>'; } exit; } if (isset($_GET['close_modulo'])) { $modulo = 'modulo_' . $_GET['close_modulo']; exit; } $modulos = [ 'modulo_estoque' => 'Estoque', 'modulo_compras' => 'Compras', 'modulo_expedicao' => 'Expedição', 'modulo_vendas' => 'Vendas' ]; ?> <!DOCTYPE html> <html> <head> <title>Sistema Principal</title> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/css/bootstrap.min.css"> <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.bundle.min.js"></script> <script> $(document).ready(function() { $('.open-module').on('click', function(e) { e.preventDefault(); var module = $(this).data('module'); $('#moduleContent').load('?modulo=' + module, function() { $('#moduleModal').modal('show'); }); }); $(document).on('click', '.close-module', function(e) { e.preventDefault(); var module = $(this).data('module'); $.get('?close_modulo=' + module, function() { $('#moduleModal').modal('hide'); updateModuleStatus(); }); }); function updateModuleStatus() { $('#modulos_abertos').load(' #modulos_abertos > *'); } setInterval(updateModuleStatus, 5000); }); </script> </head> <body> <div class="container"> <h1>Módulo Principal</h1> <ul> <li><a href="#" class="open-module" data-module="estoque">Estoque</a></li> <li><a href="#" class="open-module" data-module="compras">Compras</a></li> <li><a href="#" class="open-module" data-module="expedicao">Expedição</a></li> <li><a href="#" class="open-module" data-module="vendas">Vendas</a></li> </ul> <!-- Modal --> <div class="modal fade" id="moduleModal" tabindex="-1" aria-labelledby="moduleModalLabel" aria-hidden="true"> <div class="modal-dialog modal-lg"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="moduleModalLabel">Módulo</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body" id="moduleContent"> <!-- Conteúdo do módulo será carregado aqui --> </div> </div> </div> </div> </div> </body> </html> Exemplos simples usando vuejs: modules.php: <?php header('Content-Type: application/json'); if (isset($_GET['modulo'])) { // Mock data for modules $modulos = [ 'estoque' => '<h1>Módulo Estoque</h1><p>Conteúdo do módulo de Estoque...</p>', 'compras' => '<h1>Módulo Compras</h1><p>Conteúdo do módulo de Compras...</p>', 'expedicao' => '<h1>Módulo Expedição</h1><p>Conteúdo do módulo de Expedição...</p>', 'vendas' => '<h1>Módulo Vendas</h1><p>Conteúdo do módulo de Vendas...</p>' ]; $modulo = $_GET['modulo']; if (isset($modulos[$modulo])) { echo json_encode(['content' => $modulos[$modulo]]); } else { echo json_encode(['content' => 'Módulo não encontrado']); } exit; } echo json_encode(['error' => 'Nenhum módulo especificado']); ?> index.html <!DOCTYPE html> <html> <head> <title>Sistema Principal</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/4.6.0/css/bootstrap.min.css"> <script src="https://cdn.jsdelivr.net/npm/vue@2"></script> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> </head> <body> <div id="app" class="container"> <h1>Módulo Principal</h1> <ul> <li><a href="#" @click.prevent="openModule('estoque')">Estoque</a></li> <li><a href="#" @click.prevent="openModule('compras')">Compras</a></li> <li><a href="#" @click.prevent="openModule('expedicao')">Expedição</a></li> <li><a href="#" @click.prevent="openModule('vendas')">Vendas</a></li> </ul> <h2>Módulos Abertos:</h2> <div id="modulos_abertos"> <div v-for="(modulo, index) in modulosAbertos" :key="index"> <p>{{ modulo.nome }} <button @click="closeModule(index)">Fechar</button></p> </div> </div> <div v-if="moduleContent" class="mt-4"> <div v-html="moduleContent"></div> <button class="btn btn-secondary" @click="moduleContent = ''">Fechar Módulo Atual</button> </div> </div> <script> new Vue({ el: '#app', data: { modulosAbertos: [], moduleContent: '' }, methods: { openModule(module) { axios.get('modules.php?modulo=' + module) .then(response => { this.moduleContent = response.data.content; if (!this.modulosAbertos.find(m => m.nome === module)) { this.modulosAbertos.push({ nome: module }); } }) .catch(error => { console.error("There was an error opening the module:", error); }); }, closeModule(index) { this.modulosAbertos.splice(index, 1); } } }); </script> </body> </html>
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.