Jump to content

Williams Duarte

Members
  • Content count

    3953
  • Joined

  • Last visited

  • Days Won

    47

Everything posted by Williams Duarte

  1. Williams Duarte

    BelogsTo do laravel

    Certifique-se de que o relacionamento studentRelation está definido corretamente no modelo StudentDisciplineClassroom. Deve ser algo assim: public function studentRelation() { return $this->belongsTo(Student::class, 'ra', 'academic_registration'); } ao usar select('student'), você está limitando as colunas retornadas apenas para 'student'. Isso pode estar causando problemas no carregamento do relacionamento. Tente remover o select ou incluir a coluna 'ra': $all = $sdc::with('studentRelation') ->where('classroom', $request->classroom) ->distinct('student') ->get(); Uso do distinct: O distinct('student') pode estar interferindo no carregamento do relacionamento. Tente remover o distinct ou use groupBy em vez disso: $all = $sdc::with('studentRelation') ->where('classroom', $request->classroom) ->groupBy('student') ->get(); E certifique-se de que existem registros correspondentes na tabela students para os valores de 'ra' na tabela StudentDisciplineClassroom. Se você quiser carregar apenas alguns campos específicos do relacionamento, pode usar o carregamento ávido (eager loading) com restrições: $all = $sdc::with(['studentRelation:id,academic_registration,nome']) ->where('classroom', $request->classroom) ->get(); E por fim, para entender melhor o que está acontecendo, você pode usar o método toSql() para ver a consulta SQL gerada: $query = $sdc::with('studentRelation') ->where('classroom', $request->classroom); dd($query->toSql(), $query->getBindings()); Isso mostrará a consulta SQL e os parâmetros vinculados, o que pode ajudar a identificar problemas na consulta.
  2. Williams Duarte

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

    double 10,2 para mysql, postgres, float para mongodb etc
  3. 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.
  4. 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"
  5. 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; } }
  6. 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"; }
  7. 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>
  8. 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"; }
  9. 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!
  10. 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.
  11. 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.
  12. 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;
  13. 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
  14. 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;
  15. 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>
  16. 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>
  17. Williams Duarte

    PHP + Codeigniter - Instalar Biblioteca NFephp

    Após instalar a biblioteca nfephp-org/sped-nfe usando o Composer, todas as classes necessárias são automaticamente baixadas e colocadas na pasta vendor do seu projeto. Você não precisa fazer download manual do GitHub, pois o Composer já gerencia isso para você. Para encontrar va até pasta vendor do seu projeto. Dentro desta pasta, você encontrará a estrutura de diretórios das bibliotecas que você instalou. O Composer gera um arquivo chamado autoload.php dentro da pasta vendor. Este arquivo carrega automaticamente todas as classes das bibliotecas instaladas. Tire um tempo para entender sobre
  18. Williams Duarte

    PHP + Codeigniter - Instalar Biblioteca NFephp

    Instale a versão compatível do mpdf: https://github.com/mpdf/mpdf Antes instale: composer require mpdf/mpdf:^8.0 Depois de instalar o mpdf, você pode instalar a biblioteca nfephp-org/sped-nfe: composer require nfephp-org/sped-nfe Obs.: Se aparecer outro erro de uma olhada na documentação.
  19. Williams Duarte

    PHP + Codeigniter - Instalar Biblioteca NFephp

    Habilite a extensão SOAP no PHP Abra o arquivo de configuração php.ini. Geralmente, ele está localizado na pasta do PHP em C:\xampp\php\php.ini. Outra forma de encontrar o caminho é abrindo o xampp-control.exe, clicando no botão "Config" ao lado do Apache, e depois em "PHP (php.ini)". Procure pela linha que contém ;extension=soap. Remova o ponto e vírgula ; no início da linha para descomentar a extensão. A linha deve ficar assim: extension=soap Depois disso, reinicie o Apache. Vá até o xampp-control.exe, pare o servidor Apache e inicie-o novamente para aplicar as mudanças no php.ini. Com a extensão SOAP habilitada, instale a biblioteca nfephp-org/sped-nfe usando o Composer novamente.
  20. Williams Duarte

    PHP + Codeigniter - Instalar Biblioteca NFephp

    Verifique na documentação https://github.com/nfephp-org/sped-nfe
  21. Williams Duarte

    PHP + Codeigniter - Instalar Biblioteca NFephp

    Onde as bibliotecas serão salvas? As bibliotecas serão baixadas e salvas automaticamente na pasta vendor dentro da pasta do seu projeto. O Composer gerencia essas dependências e cria a estrutura de diretórios necessária para você. Abra o terminal (Prompt de Comando ou PowerShell no Windows) Navegue até a pasta do seu projeto. cd caminho/para/sua/pasta/projeto Adicione as dependências sped-nfe e sped-da ao seu projeto. Use os seguintes comandos para adicionar as bibliotecas ao seu projeto: composer require nfephp-org/sped-nfe composer require nfephp-org/sped-da O comando composer require adiciona a dependência ao seu arquivo composer.json e já faz a instalação. Configurar o autoload do Composer no CodeIgniter Configure o CodeIgniter para usar o autoload do Composer. Abra o arquivo application/config/config.php e encontre a configuração composer_autoload. Defina o caminho para o autoload do Composer da seguinte forma: $config['composer_autoload'] = './vendor/autoload.php'; Usando as bibliotecas no CodeIgniter: <?php defined('BASEPATH') OR exit('No direct script access allowed'); // Importando as classes necessárias das bibliotecas use NFePHP\NFe\Common\Standardize; use NFePHP\NFe\Make; use NFePHP\NFe\Tools; use NFePHP\Common\Certificate; use NFePHP\DA\NFe\Danfe; class NfeController extends CI_Controller { public function __construct() { parent::__construct(); // Carregue outras bibliotecas, modelos, etc. } public function emitirNFe() { // Carregue o certificado e configure as ferramentas $configJson = file_get_contents('caminho/para/config.json'); // Caminho para o arquivo de configuração $certificateContent = file_get_contents('caminho/para/certificate.pfx'); // Caminho para o certificado $password = 'senha_do_certificado'; // Senha do certificado $certificate = Certificate::readPfx($certificateContent, $password); $tools = new Tools($configJson, $certificate); // Crie a NFe $nfe = new Make(); // Adicione os dados da NFe aqui // ... $xml = $nfe->getXML(); echo $xml; } public function gerarDanfe($xmlFilePath) { // Gere o DANFE a partir do XML $xml = file_get_contents($xmlFilePath); $danfe = new Danfe($xml); $pdf = $danfe->render(); header('Content-Type: application/pdf'); echo $pdf; } } Configuração: Certifique-se de configurar corretamente os caminhos para o arquivo de configuração config.json e o certificado digital .pfx. Dependências: Todas as dependências serão gerenciadas pelo Composer e estarão na pasta vendor. Autoload: Ao configurar o autoload do Composer, você pode usar as bibliotecas do Composer em qualquer lugar no seu projeto CodeIgniter. Seguindo esses passos, você deve ser capaz de usar as bibliotecas sped-nfe e sped-da no seu projeto CodeIgniter. Exemplo Completo de Emissão de NFe <?php defined('BASEPATH') OR exit('No direct script access allowed'); use NFePHP\NFe\Common\Standardize; use NFePHP\NFe\Make; use NFePHP\NFe\Tools; use NFePHP\Common\Certificate; use NFePHP\DA\NFe\Danfe; class NfeController extends CI_Controller { public function __construct() { parent::__construct(); // Carregue outras bibliotecas, modelos, etc. } public function emitirNFe() { // Carregue o certificado e configure as ferramentas $configJson = file_get_contents('caminho/para/config.json'); // Caminho para o arquivo de configuração $certificateContent = file_get_contents('caminho/para/certificate.pfx'); // Caminho para o certificado $password = 'senha_do_certificado'; // Senha do certificado $certificate = Certificate::readPfx($certificateContent, $password); $tools = new Tools($configJson, $certificate); // Crie a NFe $nfe = new Make(); // Dados do emitente $nfe->taginfNFe([ 'versao' => '4.00', 'Id' => null, 'pk_nItem' => null ]); $nfe->tagide([ 'cUF' => '35', // Código da UF do emitente 'cNF' => '00000001', // Código numérico que compõe a chave de acesso 'natOp' => 'Venda', // Descrição da natureza da operação 'mod' => '55', // Modelo da NF-e 'serie' => '1', // Série da NF-e 'nNF' => '1', // Número da NF-e 'dhEmi' => date('Y-m-d\TH:i:sP'), // Data e hora de emissão 'tpNF' => '1', // Tipo de operação (0 - Entrada, 1 - Saída) 'idDest' => '1', // Identificador de destino da operação 'cMunFG' => '3550308', // Código do município de ocorrência do fato gerador 'tpImp' => '1', // Formato de impressão do DANFE 'tpEmis' => '1', // Tipo de emissão 'cDV' => '0', // Dígito verificador da chave de acesso 'tpAmb' => '2', // Tipo de ambiente (1 - Produção, 2 - Homologação) 'finNFe' => '1', // Finalidade da emissão 'indFinal' => '0', // Indicador de operação com consumidor final 'indPres' => '1', // Indicador de presença do comprador no estabelecimento comercial no momento da operação 'procEmi' => '0', // Processo de emissão utilizado com a respectiva versão 'verProc' => '1.0.0' // Versão do processo de emissão ]); $nfe->tagemit([ 'CNPJ' => '00000000000191', // CNPJ do emitente 'xNome' => 'Nome da Empresa Emitente', // Nome do emitente 'xFant' => 'Nome Fantasia', // Nome fantasia 'IE' => '123456789', // Inscrição estadual 'CRT' => '3' // Código de regime tributário ]); $nfe->tagenderEmit([ 'xLgr' => 'Rua do Emitente', // Logradouro 'nro' => '1000', // Número 'xBairro' => 'Centro', // Bairro 'cMun' => '3550308', // Código do município 'xMun' => 'São Paulo', // Nome do município 'UF' => 'SP', // UF 'CEP' => '01001000', // CEP 'cPais' => '1058', // Código do país 'xPais' => 'Brasil', // Nome do país 'fone' => '1133334444' // Telefone ]); // Dados do destinatário $nfe->tagdest([ 'CNPJ' => '00000000000272', // CNPJ do destinatário 'xNome' => 'Nome do Cliente', // Nome do destinatário 'indIEDest' => '1', // Indicador da IE do destinatário 'IE' => '987654321' // Inscrição estadual do destinatário ]); $nfe->tagenderDest([ 'xLgr' => 'Rua do Cliente', // Logradouro 'nro' => '2000', // Número 'xBairro' => 'Bairro do Cliente', // Bairro 'cMun' => '3550308', // Código do município 'xMun' => 'São Paulo', // Nome do município 'UF' => 'SP', // UF 'CEP' => '01002000', // CEP 'cPais' => '1058', // Código do país 'xPais' => 'Brasil', // Nome do país 'fone' => '1199998888' // Telefone ]); // Dados dos produtos $nfe->tagprod([ 'item' => 1, // Número do item 'cProd' => '001', // Código do produto 'cEAN' => 'SEM GTIN', // GTIN (antigo código EAN) do produto 'xProd' => 'Produto de Teste', // Descrição do produto 'NCM' => '10019010', // Código NCM 'CFOP' => '5102', // CFOP 'uCom' => 'UN', // Unidade comercial 'qCom' => '1.0000', // Quantidade comercial 'vUnCom' => '100.00', // Valor unitário de comercialização 'vProd' => '100.00', // Valor total bruto dos produtos 'cEANTrib' => 'SEM GTIN', // GTIN (antigo código EAN) tributável 'uTrib' => 'UN', // Unidade tributável 'qTrib' => '1.0000', // Quantidade tributável 'vUnTrib' => '100.00', // Valor unitário de tributação 'indTot' => '1' // Indica se compõe o valor total da NF-e ]); $nfe->tagICMS([ 'item' => 1, // Número do item 'orig' => '0', // Origem da mercadoria 'CST' => '00', // Código da Situação Tributária 'modBC' => '3', // Modalidade de determinação da BC do ICMS 'vBC' => '100.00', // Valor da BC do ICMS 'pICMS' => '18.00', // Alíquota do ICMS 'vICMS' => '18.00' // Valor do ICMS ]); $nfe->tagPIS([ 'item' => 1, // Número do item 'CST' => '01', // Código da Situação Tributária 'vBC' => '100.00', // Valor da BC do PIS 'pPIS' => '1.65', // Alíquota do PIS (em percentual) 'vPIS' => '1.65' // Valor do PIS ]); $nfe->tagCOFINS([ 'item' => 1, // Número do item 'CST' => '01', // Código da Situação Tributária 'vBC' => '100.00', // Valor da BC do COFINS 'pCOFINS' => '7.60', // Alíquota do COFINS (em percentual) 'vCOFINS' => '7.60' // Valor do COFINS ]); // Totais da NFe $nfe->tagICMSTot([ 'vBC' => '100.00', // Valor da BC do ICMS 'vICMS' => '18.00', // Valor do ICMS 'vICMSDeson' => '0.00', // Valor do ICMS desonerado 'vFCP' => '0.00', // Valor do FCP 'vBCST' => '0.00', // Valor da BC do ICMS ST 'vST' => '0.00', // Valor do ICMS ST 'vFCPST' => '0.00', // Valor do FCP ST 'vFCPSTRet' => '0.00', // Valor do FCP ST retido 'vProd' => '100.00', // Valor total dos produtos 'vFrete' => '0.00', // Valor do frete 'vSeg' => '0.00', // Valor do seguro 'vDesc' => '0.00', // Valor do desconto 'vII' => '0.00', // Valor do II 'vIPI' => '0.00', // Valor do IPI 'vIPIDevol' => '0.00', // Valor do IPI devolvido 'vPIS' => '1.65', // Valor do PIS 'vCOFINS' => '7.60', // Valor do COFINS 'vOutro' => '0.00', // Outros valores 'vNF' => '100.00' // Valor total da NF-e ]); // Gera o XML da NFe $xml = $nfe->getXML(); echo $xml; } public function gerarDanfe($xmlFilePath) { // Gere o DANFE a partir do XML $xml = file_get_contents($xmlFilePath); $danfe = new Danfe($xml); $pdf = $danfe->render(); header('Content-Type: application/pdf'); echo $pdf; } } Explicação dos Campos: taginfNFe: Define as informações básicas da NFe, como versão, Id e item. tagide: Define as informações da ideologia da NFe, como UF, natureza da operação, modelo, série, número, data de emissão, tipo de operação, etc. tagemit: Define as informações do emitente, como CNPJ, nome, nome fantasia, inscrição estadual e código de regime tributário. tagenderEmit: Define o endereço do emitente, como logradouro, número, bairro, município, UF, CEP, país e telefone. tagdest: Define as informações do destinatário, como CNPJ, nome, indicador da IE e inscrição estadual. tagenderDest: Define o endereço do destinatário, como logradouro, número, bairro, município, UF, CEP, país e telefone. tagprod: Define as informações dos produtos, como código, descrição, NCM, CFOP, unidade, quantidade, valor unitário, valor total, GTIN, etc. tagICMS: Define as informações do ICMS do produto, como origem, código da situação tributária, modalidade de determinação da BC, valor da BC, alíquota e valor do ICMS. tagPIS: Define as informações do PIS do produto, como código da situação tributária, valor da BC, alíquota e valor do PIS. tagCOFINS: Define as informações do COFINS do produto, como código da situação tributária, valor da BC, alíquota e valor do COFINS. tagICMSTot: Define os totais da NFe, como valor da BC do ICMS, valor do ICMS, valor do ICMS desonerado, valor do FCP, valor da BC do ICMS ST, valor do ICMS ST, valor do FCP ST, valor do FCP ST retido, valor total dos produtos, valor do frete, valor do seguro, valor do desconto, valor do II, valor do IPI, valor do IPI devolvido, valor do PIS, valor do COFINS, outros valores e valor total da NF-e. Espero que isso ajude a esclarecer como adicionar dados à NFe usando a biblioteca sped-nfe.
  22. Deus te abençoe também! A escolha entre usar stored procedures no banco de dados ou implementar a lógica no seu código PHP depende de vários fatores. Vamos falar sobre as vantagens das stored procedures. Em termos de performance, elas podem ser mais rápidas porque o código SQL é compilado e armazenado no servidor de banco de dados, evitando a necessidade de recompilação. Além disso, reduz o tráfego de rede, pois as operações complexas são executadas diretamente no servidor de banco de dados. Em relação à segurança, as stored procedures podem melhorar esse aspecto, já que a lógica complexa e sensível pode ser mantida no banco de dados e não exposta no código da aplicação. Também centralizam a lógica de negócios no banco de dados, o que pode facilitar a manutenção e atualização de regras de negócios complexas sem alterar o código da aplicação. Outra vantagem é a atomicidade, facilitando a implementação de transações e garantindo que um conjunto de operações SQL seja tratado como uma única unidade. Por outro lado, há algumas desvantagens em usar stored procedures. A principal delas é a portabilidade, pois pode tornar a aplicação menos portável entre diferentes sistemas de banco de dados, já que a sintaxe e as capacidades das stored procedures podem variar. O desenvolvimento de stored procedures pode ser mais complexo, com o debugging sendo mais difícil e menos conveniente do que no código PHP. Se a lógica de negócios estiver distribuída entre o banco de dados e o código da aplicação, pode ser mais difícil manter e entender o sistema como um todo. Agora, vamos considerar as vantagens de implementar a lógica no código PHP. Isso mantém a aplicação mais portável entre diferentes sistemas de banco de dados, já que o SQL é mais provável de ser padronizado e a lógica está no PHP. O desenvolvimento e debugging podem ser mais fáceis com as ferramentas de desenvolvimento de PHP. Além disso, toda a lógica de negócios está em um único lugar (no código da aplicação), facilitando a manutenção e a compreensão do sistema. Contudo, implementar a lógica no código PHP também tem suas desvantagens. Pode aumentar o tráfego de rede e ser menos eficiente para operações complexas em grandes volumes de dados. A lógica sensível pode ser mais exposta, a menos que sejam tomadas medidas adicionais para proteger o código PHP. Se você precisa de performance otimizada para operações complexas e/ou de alto volume, e a segurança é uma preocupação principal, stored procedures podem ser a melhor escolha. Elas também são vantajosas quando você está lidando com operações que requerem transações complexas que são melhor gerenciadas no banco de dados. Por outro lado, se você deseja manter a portabilidade do banco de dados, e a lógica de negócios é mais simples ou moderadamente complexa, a lógica no código PHP pode ser a melhor opção. Além disso, essa abordagem oferece uma maior flexibilidade de desenvolvimento. Em muitas situações, uma abordagem híbrida é adotada, onde algumas operações críticas são implementadas como stored procedures, enquanto outras lógicas são mantidas no código da aplicação. Avalie os requisitos específicos do seu projeto, o ambiente de desenvolvimento e os recursos disponíveis para tomar a melhor decisão. Se você já está usando CodeIgniter, pode considerar manter a maior parte da lógica no PHP para facilitar a manutenção e a portabilidade, e usar stored procedures apenas para partes específicas do sistema que realmente se beneficiariam delas.
  23. Para importar os dados de um pedido e transformá-los em uma venda em POO, você pode seguir os seguintes passos: Criação das Classes de Modelo: Crie classes para representar o Pedido, Venda, Item do Pedido e Item da Venda. Essas classes terão atributos correspondentes às colunas de suas tabelas no banco de dados. Exemplo: Classe Pedido, Venda, Item. Configuração do Banco de Dados: Configure a conexão com o banco de dados usando PDO (PHP Data Objects). Isso envolverá fornecer o DSN (Data Source Name), nome de usuário e senha para se conectar ao banco. Classe de Acesso ao Banco de Dados: Crie uma classe Database que encapsula a lógica de conexão ao banco de dados e fornece métodos para obter os dados de um pedido e salvar os dados de uma venda. Implementar métodos como getPedido para buscar os dados do pedido e seus itens do banco de dados, e saveVenda para salvar a venda e seus itens no banco. Serviço de Importação: Crie uma classe ImportaPedidoService que será responsável por orquestrar a importação dos dados do pedido para a venda. Esta classe terá um método importarPedido que aceitará o número do pedido, buscará os dados do pedido usando a classe Database, gerará um número de venda único e salvará a venda e seus itens no banco de dados. Implementação do Fluxo de Importação: No método importarPedido, busque o pedido e seus itens do banco de dados. Crie uma nova instância da classe Venda e preencha com os dados do pedido. Adicione os itens do pedido como itens da venda. Salve a venda e seus itens no banco de dados. Execução do Processo de Importação: Instancie a classe Database com as configurações de conexão. Instancie a classe ImportaPedidoService passando a instância do banco de dados. Chame o método importarPedido com o número do pedido desejado. Simulação https://ideone.com/ZrNCOk Exemplo Completo do Código: <?php class Pedido { public $numero; public $cliente_id; public $valor_total; public $itens; public function __construct($numero, $cliente_id, $valor_total, $itens) { $this->numero = $numero; $this->cliente_id = $cliente_id; $this->valor_total = $valor_total; $this->itens = $itens; } } class Venda { public $numero; public $data; public $cliente_id; public $valor_total; public $itens = []; public function __construct($numero, $data, $cliente_id, $valor_total) { $this->numero = $numero; $this->data = $data; $this->cliente_id = $cliente_id; $this->valor_total = $valor_total; } public function addItem($item) { $this->itens[] = $item; } } class Item { public $produto_id; public $quantidade; public $vr_unit; public function __construct($produto_id, $quantidade, $vr_unit) { $this->produto_id = $produto_id; $this->quantidade = $quantidade; $this->vr_unit = $vr_unit; } } class Database { private $pdo; public function __construct($dsn, $username, $password) { $this->pdo = new PDO($dsn, $username, $password); } public function getPedido($numeroPedido) { $stmt = $this->pdo->prepare('SELECT * FROM pedidos WHERE numero = :numero'); $stmt->execute(['numero' => $numeroPedido]); $pedidoData = $stmt->fetch(PDO::FETCH_ASSOC); if ($pedidoData) { $stmt = $this->pdo->prepare('SELECT * FROM pedido_itens WHERE pedido_id = :pedido_id'); $stmt->execute(['pedido_id' => $pedidoData['id']]); $itens = $stmt->fetchAll(PDO::FETCH_ASSOC); $itensObjects = array_map(function($item) { return new Item($item['produto_id'], $item['quantidade'], $item['vr_unit']); }, $itens); return new Pedido($pedidoData['numero'], $pedidoData['cliente_id'], $pedidoData['valor_total'], $itensObjects); } throw new Exception('Pedido não encontrado.'); } public function saveVenda($venda) { $stmt = $this->pdo->prepare('INSERT INTO vendas (numero, data, cliente_id, valor_total) VALUES (:numero, :data, :cliente_id, :valor_total)'); $stmt->execute([ 'numero' => $venda->numero, 'data' => $venda->data, 'cliente_id' => $venda->cliente_id, 'valor_total' => $venda->valor_total ]); $vendaId = $this->pdo->lastInsertId(); foreach ($venda->itens as $item) { $stmt = $this->pdo->prepare('INSERT INTO venda_itens (venda_id, produto_id, quantidade, vr_unit) VALUES (:venda_id, :produto_id, :quantidade, :vr_unit)'); $stmt->execute([ 'venda_id' => $vendaId, 'produto_id' => $item->produto_id, 'quantidade' => $item->quantidade, 'vr_unit' => $item->vr_unit ]); } } } class ImportaPedidoService { private $db; public function __construct($db) { $this->db = $db; } public function importarPedido($numeroPedido) { $pedido = $this->db->getPedido($numeroPedido); $vendaNumero = $this->gerarNumeroVenda(); $venda = new Venda($vendaNumero, date('Y-m-d'), $pedido->cliente_id, $pedido->valor_total); foreach ($pedido->itens as $item) { $venda->addItem(new Item($item->produto_id, $item->quantidade, $item->vr_unit)); } $this->db->saveVenda($venda); } private function gerarNumeroVenda() { $stmt = $this->db->pdo->query('SELECT MAX(numero) as max_numero FROM vendas'); $result = $stmt->fetch(PDO::FETCH_ASSOC); return $result['max_numero'] + 1; } } // Configuração do banco de dados $dsn = 'mysql:host=localhost;dbname=seu_banco_de_dados'; $username = 'seu_usuario'; $password = 'sua_senha'; // Instanciação do serviço e execução $db = new Database($dsn, $username, $password); $service = new ImportaPedidoService($db); try { $service->importarPedido(102); // Número do pedido a ser importado echo "Pedido importado com sucesso!"; } catch (Exception $e) { echo "Erro: " . $e->getMessage(); } ?> Outra opção é utilizar Procedures DELIMITER // CREATE PROCEDURE ImportarPedido(IN numeroPedido INT) BEGIN DECLARE pedidoId INT; DECLARE clienteId INT; DECLARE valorTotal DECIMAL(10, 2); DECLARE vendaNumero INT; DECLARE vendaId INT; DECLARE produtoId INT; DECLARE quantidade INT; DECLARE vrUnit DECIMAL(10, 2); DECLARE done INT DEFAULT 0; DECLARE cur CURSOR FOR SELECT produto_id, quantidade, vr_unit FROM pedido_itens WHERE pedido_id = pedidoId; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; -- Busca o pedido pelo número SELECT id, cliente_id, valor_total INTO pedidoId, clienteId, valorTotal FROM pedidos WHERE numero = numeroPedido; -- Gera um novo número de venda SELECT IFNULL(MAX(numero), 1000) + 1 INTO vendaNumero FROM vendas; -- Insere a venda INSERT INTO vendas (numero, data, cliente_id, valor_total) VALUES (vendaNumero, CURDATE(), clienteId, valorTotal); -- Obtém o ID da venda recém-criada SET vendaId = LAST_INSERT_ID(); -- Abre o cursor para os itens do pedido OPEN cur; -- Lê cada item do pedido e insere na tabela de venda_itens read_loop: LOOP FETCH cur INTO produtoId, quantidade, vrUnit; IF done THEN LEAVE read_loop; END IF; INSERT INTO venda_itens (venda_id, produto_id, quantidade, vr_unit) VALUES (vendaId, produtoId, quantidade, vrUnit); END LOOP; CLOSE cur; END // DELIMITER ; Chamando a Procedure Você pode chamar a procedure ImportarPedido com o número do pedido que deseja importar: CALL ImportarPedido(102);
  24. Williams Duarte

    PHP - Gerar vencimento parcelas com período variado

    Neste caso não ira funcionar, mas voce pode fazer uma chamada ajax para o servidor ou usar javascript puro. Mas vou lhe mostrar um exemplo usando JQuery parcelas.php <?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $dataInicial = new DateTime($_POST['dataInicial']); $intervalos = explode(',', $_POST['intervalos']); $valorTotal = floatval($_POST['valorTotal']); function gerarParcelas($dataInicial, $intervalos, $valorTotal) { $datasParcelas = []; $quantidadeParcelas = count($intervalos); $valorParcela = floor($valorTotal / $quantidadeParcelas * 100) / 100; $valorUltimaParcela = $valorTotal - ($valorParcela * ($quantidadeParcelas - 1)); for ($i = 0; $i < $quantidadeParcelas; $i++) { if ($i == $quantidadeParcelas - 1) { $valorAtualParcela = $valorUltimaParcela; } else { $valorAtualParcela = $valorParcela; } $dataVencimento = clone $dataInicial; $dataVencimento->modify("+{$intervalos[$i]} days"); $datasParcelas[] = [ 'data_vencimento' => $dataVencimento->format('Y-m-d'), 'valor_parcela' => number_format($valorAtualParcela, 2, ',', '.') ]; } return $datasParcelas; } $parcelas = gerarParcelas($dataInicial, $intervalos, $valorTotal); header('Content-Type: application/json'); echo json_encode($parcelas); } ?> index.html: <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <title>Parcelamento</title> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> </head> <body> <form id="parcelamentoForm"> <label for="dtaentr">Data Inicial:</label> <input type="date" id="dtaentr" name="dtaentr"><br><br> <label for="formaPgto">Intervalos (dias):</label> <input type="text" id="formaPgto" name="formaPgto" placeholder="Ex: 0,3,6"><br><br> <label for="vlrtotal">Valor Total:</label> <input type="number" id="vlrtotal" name="vlrtotal"><br><br> <button type="button" onclick="gerarParcelas()">Gerar Parcelas</button> </form> <table id="tbparcs" border="1"> <thead> <tr> <th>Data de Vencimento</th> <th>Valor da Parcela</th> <th>Ações</th> </tr> </thead> <tbody> </tbody> </table> <script> function gerarParcelas() { const dataInicial = $('#dtaentr').val(); const intervalos = $('#formaPgto').val(); const valorTotal = $('#vlrtotal').val(); $.ajax({ url: 'parcelas.php', type: 'POST', dataType: 'json', data: { dataInicial: dataInicial, intervalos: intervalos, valorTotal: valorTotal }, success: function(parcelas) { const tbody = $("#tbparcs tbody"); tbody.empty(); // Limpa a tabela antes de adicionar novas linhas parcelas.forEach(function(parcela) { let html = "<tr>"; html += "<td>" + parcela.data_vencimento + "</td>"; html += "<td>R$ " + parcela.valor_parcela + "</td>"; html += "<td style='text-align:center;'>" + "<button type='button' class='btn btn-danger btn-alterar-parc' style='margin-right: 1%; padding: 1px 2px;' title='Editar'>Editar</button>" + "</td>"; html += "</tr>"; tbody.append(html); }); } }); } </script> </body> </html>
  25. Williams Duarte

    PHP - Gerar vencimento parcelas com período variado

    Posta como tentou!
×

Important Information

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