Todas as Novidades
Atualizada automaticamente
- Última semana
-
Javascript - Calcular Valores Monetário em Tempo Real
violin101 respondeu ao tópico de violin101 em Javascript
Caros amigos, saudações. Depois de revisar e revisar, consegui resolver o problema de Cálculo em Tempo Real. o fonte ficou assim: jQuery('input').on('keyup',function(){ //já está no Formato(0.00) var resto = document.getElementById("pgRest").value; //já está no Formato(0.00) var desct = document.getElementById("pgDsct").value; resto = parseFloat(jQuery('#pgRest').val() != '' ? jQuery('#pgRest').val() : 0); desct = parseFloat(jQuery('#pgDsct').val() != '' ? jQuery('#pgDsct').val() : 0); //Mostra o Resultado em Tempo Real com 2 casas decimais jQuery('#pgTroco').val((resto + desct).toFixed(2).replace('.', ',')); }) Grato, Cesar -
Javascript - Calcular Valores Monetário em Tempo Real
violin101 postou um tópico no fórum Javascript
Caros amigos, saudações. Estou com uma dúvida, referente cálculo de valores em tempo real. Tenho uma rotina, que faz o cálculo, o problema é mostrar o resultado. Quero mostrar o RESULTADO assim: 0,00 ou 0.00 Abaixo posto o código. jQuery('input').on('keyup',function(){ //Remover ponto e trocar a virgula por ponto var m = document.getElementById("pgRest").value; while (m.indexOf(".") >= 0) { m = m.replace(".", ""); } m = m.replace(",","."); //Remover ponto e trocar a virgula por ponto var j = document.getElementById("pgDsct").value; while (j.indexOf(".") >= 0) { j = j.replace(".", ""); } j = j.replace(",","."); m = parseFloat(jQuery('#pgRest').val() != '' ? jQuery('#pgRest').val() : 0); j = parseFloat(jQuery('#pgDsct').val() != '' ? jQuery('#pgDsct').val() : 0); //Mostra o Resultado em Tempo Real jQuery('#pgTroco').val(m - j); <<=== aqui estou errando }) Grato, Cesar -
Caro amigos, saudações. Tenho uma tabela escrita em JS que funciona corretamente. Minha dúvida: - como devo fazer para quando a Tabela HTML estiver vazia, exibir o LOGO da Empresa ? Abaixo posto o script: document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'i' ) return;// Não é Ctrl+A, portanto interrompemos o script evt.preventDefault(); //Chama a Função Calcular Qtde X Valor Venda calcvda(); var idProdutos = document.getElementById("idProdutos").value; var descricao = document.getElementById("descricao").value; var prd_unid = document.getElementById("prd_unid").value; var estoque_atual = document.getElementById("estoque_atual").value; var qtde = document.getElementById("qtde").value; var vlrunit = document.getElementById("vlrunit").value; var vlrtotals = document.getElementById("vlrtotal").value; var vlrtotal = vlrtotals.toLocaleString('pt-br', {minimumFractionDigits: 2}); if(validarConsumo(estoque_atual)){ //Chama a Modal com Alerta. $("#modal_qtdemaior").modal(); } else { if(qtde == "" || vlrunit == "" || vlrtotal == ""){ //Chama a Modal com Alerta. $("#modal_quantidade").modal(); } else { //Monta a Tabela com os Itens html = "<tr style='font-size:13px;'>"; html += "<td width='10%' height='10' style='text-align:center;'>"+ "<input type='hidden' name='id_prds[]' value='"+idProdutos+"'>"+idProdutos+"</td>"; html += "<td width='47%' height='10'>"+ "<input type='hidden' name='descricao[]' value='"+descricao+"'>"+descricao+ "<input type='hidden' name='esp[]' value='"+prd_unid+"'> - ESP:"+prd_unid+ "<input type='hidden' name='estoq[]' value='"+estoque_atual+"'></td>"; html += "<td width='10%' height='10' style='text-align:center;'>"+ "<input type='hidden' name='qtde[]' value='"+qtde+"'>"+qtde+"</td>"; html += "<td width='12%' height='10' style='text-align:right;'>"+ "<input type='hidden' name='vlrunit[]' value='"+vlrunit+"'>"+vlrunit+"</td>"; html += "<td width='14%' height='10' style='text-align:right;'>"+ "<input type='hidden' name='vlrtotal[]' value='"+vlrtotal+"'>"+vlrtotal+"</td>"; html += "<td width='12%' height='10' style='text-align:center;'>"+ "<button type='button' class='btn btn-uvas btn-remove-produto' style='margin-right:1%; padding:1px 3px; font-size:12px;' title='Remover Item da Lista'>"+ "<span class='fa fa-minus' style='font-size:12px;'></span></button></td>"; html += "</tr>"; $("#tbventas tbody").append(html); //Função para Somar os Itens do Lançamento somar(); $("#idProdutos").val(null); $("#descricao").val(null); $("#prd_unid").val(null); $("#qtde").val(null); $("#vlrunit").val(null); $("#vlrtotal").val(null); $("#idProdutos").focus(); //Se INCLUIR NOVO produto - Limpa a Forma de Pagamento $("#pgSoma").val(null); $("#pgRest").val(null); $("#pgDsct").val(null); $("#pgTroco").val(null); $("#tbpagar tbody").empty(); }//Fim do IF-qtde }//Fim do Validar Consumo });//Fim da Função btn-agregar Grato, Cesar
-
PHP+Codeigniter - Implementar o Input CÓDIGO ou ID do Produto
Williams Duarte respondeu ao tópico de violin101 em PHP
-
PHP+Codeigniter - Implementar o Input CÓDIGO ou ID do Produto
violin101 respondeu ao tópico de violin101 em PHP
amigo Williams, saudações. Deus o abençoa, realmente faltou declarar no início do JS. let timeoutId; // Declaração da variável Fiz a Declaração e funcionou corretamente. Muito Obrigado. Deus o abençoa. Atenciosamente, Cesar -
PHP+Codeigniter - Implementar o Input CÓDIGO ou ID do Produto
Williams Duarte respondeu ao tópico de violin101 em PHP
Primeiro, você não está declarando a variável timeoutId <script type="text/javascript"> $(document).ready(function(){ let timeoutId; // Declaração da variável $('#idProdutos').on('input', function() { clearTimeout(timeoutId); const idprd = $(this).val(); timeoutId = setTimeout(function() { if (idprd) { $.ajax({ url: "<?php echo base_url(); ?>vendas/pdvcaixa/buscarID", type: "POST", data: { idProdutos: idprd }, // Corrigido nome do parâmetro dataType: 'json', // Importante adicionar success: function(response) { if (response.success) { // Como o resultado é um array, pegamos o primeiro item if (response.produto.length > 0) { $("#descricao").val(response.produto[0].descricao); } } }, error: function(xhr, status, error) { console.log('Erro:', error); } }); } }, 1500); }); }); </script> No Controller, ajuste para: public function buscarID() { $idprd = $this->input->post('idProdutos'); $produto = $this->pdvcaixa_model->buscarCodigo($idprd); if ($produto) { echo json_encode([ 'success' => true, 'produto' => $produto ]); } else { echo json_encode([ 'success' => false, 'message' => 'Produto não encontrado' ]); } } Se ainda assim não funcionar, você pode adicionar alguns console.log para debug: $('#idProdutos').on('input', function() { console.log('Input detectado'); clearTimeout(timeoutId); const idprd = $(this).val(); console.log('Valor digitado:', idprd); timeoutId = setTimeout(function() { console.log('Timeout executado'); if (idprd) { // ... resto do código -
PHP+Codeigniter - Implementar o Input CÓDIGO ou ID do Produto
violin101 respondeu ao tópico de violin101 em PHP
Amigo Williams, saudações. Conforme sua orientação acima, fiz a adequação no meu sistema, mas infelizmente não tive sucesso. Após digitar o Código no INPUT não fez a contagem de tempo e não mostrou a descrição. O meu INPUT está assim: <form action="<?php echo current_url(); ?>" id="frmPdv" method="post"> <div class="row"> <div class="col-md-3"> <label for="idProdutos">Código:</label> <input type="text" class="form-control" id="idProdutos" name="idProdutos" style="margin-top:-7px; font-size:15px; width:100%; font-weight:normal; background:#FFFFFF;" placeholder="Apenas Número"> </div> <div class="col-md-9"> <label for="descricao">Produto:</label> <input type="text" class="form-control" id="descricao" name="descricao" style="margin-top:-7px; font-size:15px; width:100%; font-weight:normal; background:#FFFFFF;" placeholder="Pesquisar por descrição do produto" > </div> </div> </form> O meu JS está assim: <script type="text/javascript"> $(document).ready(function(){ $('#idProdutos').on('input', function() { clearTimeout(timeoutId); const idprd = $(this).val(); timeoutId = setTimeout(function() { if (idprd ) { $.ajax({ url: "<?php echo base_url(); ?>vendas/pdvcaixa/buscarID/", type: "POST", data: { idprd : idprd }, success: function(response) { // Exibe o resultado if (response.success) { //Exibe no INPUT da Descrição $("#descricao").val(response.produto.descricao); } } }); } }, 1500); // 1.5 segundos de delay }); }); </script> O meu Controller está assim: public function buscarID() { $idprd = $this->input->post('idProdutos'); $produto = $this->pdvcaixa_model->buscarCodigo($idprd); echo json_encode([ 'success' => true, 'produto' => $produto ]); } O meu MODEL está assim: public function buscarCodigo($idprd) { $this->db->select('*'); $this->db->from('produtos'); $this->db->where('produtos.idProdutos', $idprd); $this->db->where('produtos.statusProd', 1); $this->db->order_by('produtos.descricao', 'ASC'); return $this->db->get()->result(); } Grato Cesar -
PHP+Codeigniter - Implementar o Input CÓDIGO ou ID do Produto
Williams Duarte respondeu ao tópico de violin101 em PHP
Para implementar a busca automática com delay de 1-2 segundos sem precisar do ENTER, você pode usar jQuery junto com CodeIgniter. Segue um exemplo simples: $('#codigo_produto').on('input', function() { clearTimeout(timeoutId); const codigo = $(this).val(); timeoutId = setTimeout(function() { if (codigo) { $.ajax({ url: '<?= base_url("produtos/buscar") ?>', type: 'POST', data: { codigo: codigo }, success: function(response) { // Exibe o resultado if (response.success) { $('#resultado').html(response.produto.descricao); } } }); } }, 1500); // 1.5 segundos de delay }); No seu controller: public function buscar() { $codigo = $this->input->post('codigo'); $produto = $this->produtos_model->buscar_por_codigo($codigo); echo json_encode([ 'success' => true, 'produto' => $produto ]); } O código acima vai esperar 1.5 segundos após o usuário parar de digitar antes de fazer a busca. Você pode ajustar o delay alterando o valor 1500 para qualquer outro valor em milissegundos. -
PHP+Codeigniter - Implementar o Input CÓDIGO ou ID do Produto
violin101 postou um tópico no fórum PHP
Caros amigos, saudações. Por favor, poderiam me ajudar. Estou com a seguinte dúvida: --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER. exemplo: código ---- descrição 1 ----- produto_A Grato, Cesar - Mais antigo
-
RUY alterou sua foto pessoal
-
resolvido. substr e strlen.
-
Boa tarde, Duvida simples... Quando recupero os dados RSS, para inserir no banco de dados esta salvando corretamento porém no mysql esta com (ponto) . na frente de todos os registros via RSS. Fica com um ponto na frente outro atras... Data/hora: .2024-11-30 10:03:47.
-
PHP+Codeigniter - Adicionar Registro Plano de Contas
Williams Duarte respondeu ao tópico de violin101 em PHP
-
PHP+Codeigniter - Adicionar Registro Plano de Contas
violin101 respondeu ao tópico de violin101 em PHP
Caro amigo Williams saudações. Deus o abençoa, deu certo, obrigado, Atenciosamente, Cesar -
PHP+Codeigniter - Adicionar Registro Plano de Contas
Williams Duarte respondeu ao tópico de violin101 em PHP
Neste caso tem que criar uma configuração dos níveis e seus formatos $nivel_config = [ 1 => ['length' => 2, 'format' => '%02d'], // 1.01 2 => ['length' => 3, 'format' => '%03d'], // 1.01.001 3 => ['length' => 4, 'format' => '%04d'], // 1.01.001.0001 4 => ['length' => 5, 'format' => '%05d'] // 1.01.001.0001.00001 (caso precise e por ai vai) ]; public function getNextCode($parent_code = null) { log_message('debug', '=== INÍCIO getNextCode ==='); log_message('debug', 'Parent Code: ' . ($parent_code ?? 'NULL')); // Configuração dos níveis e seus formatos $nivel_config = [ 1 => ['length' => 2, 'format' => '%02d'], // 1.01 2 => ['length' => 3, 'format' => '%03d'], // 1.01.001 3 => ['length' => 4, 'format' => '%04d'], // 1.01.001.0001 4 => ['length' => 5, 'format' => '%05d'] // 1.01.001.0001.00001 (caso precise e por ai vai) ]; if (!$parent_code) { $query = $this->db->select('MAX(CAST(pl_idconta AS UNSIGNED)) as max_code') ->from('planocontas') ->where('pl_idconta NOT LIKE "%.%"') ->get(); $result = $query->row(); $next_code = ($result->max_code ?? 0) + 1; log_message('debug', 'Gerando código raiz: ' . $next_code); return $next_code; } $parent_parts = explode('.', $parent_code); $nivel = count($parent_parts); log_message('debug', 'Nível hierárquico: ' . $nivel); // Verifica se o nível é suportado if (!isset($nivel_config[$nivel])) { log_message('error', 'Nível não suportado: ' . $nivel); return false; } $query = $this->db->select('pl_idconta') ->from('planocontas') ->like('pl_idconta', $parent_code . '.', 'after') ->order_by('pl_idconta', 'DESC') ->limit(1) ->get(); log_message('debug', 'SQL executado: ' . $this->db->last_query()); if ($query->num_rows() == 0) { // Primeiro subcódigo deste nível $new_code = $parent_code . '.' . sprintf($nivel_config[$nivel]['format'], 1); log_message('debug', 'Primeiro subcódigo deste pai: ' . $new_code); return $new_code; } $ultimo_codigo = $query->row()->pl_idconta; $partes = explode('.', $ultimo_codigo); $ultimo_numero = (int)end($partes); log_message('debug', sprintf( 'Último código: %s | Último número: %s', $ultimo_codigo, $ultimo_numero )); // Gera próximo código usando a configuração do nível $proximo = sprintf($nivel_config[$nivel]['format'], $ultimo_numero + 1); $final_code = $parent_code . '.' . $proximo; log_message('debug', 'Código gerado: ' . $final_code); log_message('debug', '=== FIM getNextCode ==='); return $final_code; } No controller, ajuste a função que busca os códigos pais public function novo() { $this->load->model('planocontas_model'); $max_nivel = 4; // Defina aqui o número máximo de níveis desejado $data['plcta'] = $this->db ->select('*') ->from('planocontas') ->where('pl_status', 1) ->where('CHAR_LENGTH(pl_idconta) - CHAR_LENGTH(REPLACE(pl_idconta, ".", "")) <', $max_nivel) ->order_by('pl_idconta') ->get() ->result(); $this->load->view('estilo/header', $this->data); $this->load->view('faturamento/planocontas/adicionarConta', $data); } -
PHP+Codeigniter - Adicionar Registro Plano de Contas
violin101 respondeu ao tópico de violin101 em PHP
Caro amigo, Williams saudações. Deu certo, gravou com as Hierarquias corretamente. Amigo Williams esta linha mostra o tamanho do campo do mysql: ->where('LENGTH(pl_idconta) <=', 4) // Limita a 2 níveis (1 ou 1.01) Alterei para esta e trouxe os níveis: ->where('CHAR_LENGTH(pl_idconta) <=', 4) // Limita a 2 níveis (1 ou 1.01) Observação: apenas curiosidade. se precisar criar mais um nível, como devo fazer, por exemplo: 1 - principal 1.01 - nível_1 1.01.001 - nível_2 1.01.001.0001 - conta_1 -
PHP+Codeigniter - Adicionar Registro Plano de Contas
Williams Duarte respondeu ao tópico de violin101 em PHP
Aplique log e vai debugando public function getNextCode($parent_code = null) { log_message('debug', '=== INÍCIO getNextCode ==='); log_message('debug', 'Parent Code: ' . ($parent_code ?? 'NULL')); if (!$parent_code) { $query = $this->db->select('MAX(CAST(pl_idconta AS UNSIGNED)) as max_code') ->from('planocontas') ->where('pl_idconta NOT LIKE "%.%"') ->get(); $result = $query->row(); $next_code = ($result->max_code ?? 0) + 1; log_message('debug', 'Gerando código raiz: ' . $next_code); return $next_code; } $parent_parts = explode('.', $parent_code); $nivel = count($parent_parts); log_message('debug', 'Nível hierárquico: ' . $nivel); $query = $this->db->select('pl_idconta') ->from('planocontas') ->like('pl_idconta', $parent_code . '.', 'after') ->order_by('pl_idconta', 'DESC') ->limit(1) ->get(); log_message('debug', 'SQL executado: ' . $this->db->last_query()); if ($query->num_rows() == 0) { $new_code = ($nivel == 1) ? $parent_code . '.01' : $parent_code . '.0001'; log_message('debug', 'Primeiro subcódigo deste pai: ' . $new_code); return $new_code; } $ultimo_codigo = $query->row()->pl_idconta; $partes = explode('.', $ultimo_codigo); $ultimo_numero = end($partes); log_message('debug', sprintf( 'Último código: %s | Último número: %s', $ultimo_codigo, $ultimo_numero )); if ($nivel == 1) { $proximo = str_pad((int)$ultimo_numero + 1, 2, '0', STR_PAD_LEFT); } else { $proximo = str_pad((int)$ultimo_numero + 1, 4, '0', STR_PAD_LEFT); } $final_code = $parent_code . '.' . $proximo; log_message('debug', 'Código gerado: ' . $final_code); log_message('debug', '=== FIM getNextCode ==='); return $final_code; } Os logs serão gravados em application/logs/. Para visualizar, ative debug no config.php: $config['log_threshold'] = 2; // Debug Caso não consiga corrigir o código pelo debug, poste os logs aqui! Mas dei mais um ajuste! -
PHP+Codeigniter - Adicionar Registro Plano de Contas
violin101 respondeu ao tópico de violin101 em PHP
Amigo Williams, saudações. POR FAVOR, me PERDOA em recorrer a ajuda do amigo novamente, testando o código que o amigo enviou, continua dando erro de DUPLICIDADE, agora está assim. 1 - TESTE A 1.01 - GRAVA NORMAL 1.01.0001 - GRAVA NORMAL 1.01.0002 ========> AQUI JÁ DÁ ERRO, O SISTEMA NÃO GRAVA .0002 ---- DUPLICA o .0001 novamente 2 - TESTE B 2.01 - GRAVA NORMAL 2.01.0001 - GRAVA NORMAL 2.01.0002 ========> AQUI JÁ DÁ ERRO, O SISTEMA NÃO GRAVA .0002 ---- DUPLICA o .0001 novamente -
PHP+Codeigniter - Adicionar Registro Plano de Contas
Williams Duarte respondeu ao tópico de violin101 em PHP
O problema está na lógica do getNextCode(): Fiz uns ajustes, não tenho como testar, só olhei a doc por cima de como monta selects no CI, que é bem parecida com Query Builder do Laravel public function getNextCode($parent_code = null) { if (!$parent_code) { // Busca próximo código raiz $query = $this->db->select('MAX(CAST(pl_idconta AS UNSIGNED)) as max_code') ->from('planocontas') ->where('pl_idconta NOT LIKE "%.%"') ->get(); $result = $query->row(); return ($result->max_code ?? 0) + 1; } // Busca subcódigos do mesmo nível $parent_parts = explode('.', $parent_code); $nivel = count($parent_parts); $like_pattern = $parent_code . '.%'; $query = $this->db->select('pl_idconta') ->from('planocontas') ->like('pl_idconta', $like_pattern, 'after') ->get(); $codigos_mesmo_nivel = []; foreach ($query->result() as $row) { $parts = explode('.', $row->pl_idconta); if (count($parts) == $nivel + 1) { $codigos_mesmo_nivel[] = (int)end($parts); } } $proximo = empty($codigos_mesmo_nivel) ? 1 : max($codigos_mesmo_nivel) + 1; // Formata o número baseado no nível if ($nivel == 1) { // Nível 1.XX return $parent_code . '.' . str_pad($proximo, 2, '0', STR_PAD_LEFT); } else if ($nivel == 2) { // Nível 1.XX.XXXX return $parent_code . '.' . str_pad($proximo, 4, '0', STR_PAD_LEFT); } else { // Demais níveis return $parent_code . '.' . $proximo; } } Principais correções: Separação por níveis hierárquicos Contagem correta do próximo número Formatação específica para cada nível Exemplo de resultado: 1 - Principal 1.01 - Setor A 1.01.0001 - Subsetor A1 1.02 - Setor B 2 - Secundário 2.01 - Filial 1 Para fins de comparação # Plano de Contas - Correção na geração de códigos hierárquicos ## Alterações no método getNextCode() - Corrigida lógica de incremento dos níveis - Melhorada separação hierárquica - Adicionada formatação específica por nível ```diff public function getNextCode($parent_code = null) { - if (!$parent_code) { - $query = $this->db->select('MAX(SUBSTRING_INDEX(pl_idconta, ".", 1)) as max_code') - ->from('planocontas') - ->where('LENGTH(pl_idconta) = 1') - ->get(); + if (!$parent_code) { + // Busca próximo código raiz usando CAST para comparação numérica + $query = $this->db->select('MAX(CAST(pl_idconta AS UNSIGNED)) as max_code') + ->from('planocontas') + ->where('pl_idconta NOT LIKE "%.%"') + ->get(); $result = $query->row(); return ($result->max_code ?? 0) + 1; } - $like_pattern = $parent_code . '.%'; - $length = strlen($parent_code) + 3; + // Identificação do nível hierárquico atual + $parent_parts = explode('.', $parent_code); + $nivel = count($parent_parts); + // Busca subcódigos existentes no mesmo nível + $like_pattern = $parent_code . '.%'; $query = $this->db->select('MAX(SUBSTRING_INDEX(pl_idconta, ".", -1)) as max_code') ->from('planocontas') ->like('pl_idconta', $like_pattern, 'after') - ->where('LENGTH(pl_idconta) =', $length) ->get(); $result = $query->row(); - $next_number = str_pad(($result->max_code ?? 0) + 1, 2, '0', STR_PAD_LEFT); - return $parent_code . '.' . $next_number; + + // Formatação específica por nível + if ($nivel == 1) { + // Nível 1.XX + return $parent_code . '.' . str_pad($proximo, 2, '0', STR_PAD_LEFT); + } else if ($nivel == 2) { + // Nível 1.XX.XXXX + return $parent_code . '.' . str_pad($proximo, 4, '0', STR_PAD_LEFT); + } else { + // Demais níveis sem padding + return $parent_code . '.' . $proximo; + } } Principais mudanças: Código raiz (nível 0) Uso de CAST para comparação numérica correta Filtro aprimorado para códigos sem pontos Subcódigos Identificação do nível através de explode() Formatação específica para cada nível Remoção da restrição de LENGTH fixa Formatação Nível 1: XX (dois dígitos) Nível 2: XXXX (quatro dígitos) Demais níveis: sem padding -
PHP+Codeigniter - Adicionar Registro Plano de Contas
violin101 respondeu ao tópico de violin101 em PHP
Caro amigo Williams. Consegui fazer o INSERT. Agora estou com o seguinte problema. Quando salvo os Registro não faz a soma, ou seja, duplica o 1, para todos. Salva assim: 1 - teste 1.01 testeA 1.01.01 testeB 1.01.01.0 testeC Segui todas as suas orientações conforme a MODEL, só não entendo porque não está fazendo o ++. O meu controller ficou assim: function adicionar() { if (!$this->permission->checkPermission($this->session->userdata('permissao'), 'aContas')) { $this->session->set_flashdata('error', 'Você não tem permissão para adicionar plano de contas.'); redirect(base_url()); } $this->load->library('form_validation'); $this->data['custom_error'] = ''; if ($this->form_validation->run('planocontas') == false) { $this->data['custom_error'] = (validation_errors() ? '<div class="form_error">' . validation_errors() . '</div>' : false); } else { $data = [ 'parent_code' => $this->input->post('parent_code'), 'pl_descricao' => $this->input->post('pl_descricao'), 'pl_titulo' => 1, 'pl_status' => 1 ]; /* echo '<pre>'; var_dump($data); echo '</pre>'; exit(); */ $result = $this->planocontas_model->insert($data); if ($result) { $this->session->set_flashdata('success', 'Conta adicionada com sucesso!'); redirect(base_url() . 'faturamento/planocontas/adicionar/'); } else { $this->data['custom_error'] = '<div class="form_error"><p>Ocorreu um erro.</p></div>'; } } $this->novo(); $this->load->view('estilo/header', $this->data); $this->load->view('faturamento/planocontas/adicionarConta'); } public function novo() { // Carrega todos os códigos possíveis de serem pai $this->load->model('planocontas_model'); $data['plcta'] = $this->db ->select('*') ->from('planocontas') ->where('pl_status', 1) ->order_by('pl_idconta') ->get() ->result(); $this->load->view('estilo/header', $this->data); $this->load->view('faturamento/planocontas/adicionarConta', $data); } A MODEL, ficou assim: <?php class Planocontas_model extends CI_Model { function __construct() { parent::__construct(); $this->load->database(); } function get($table, $fields, $where = '', $perpage = 0, $start = 0, $one = false, $array = 'array') { $this->db->select($fields); $this->db->from($table); $this->db->order_by('pl_idconta', 'ASC'); $this->db->limit($perpage, $start); if ($where) { $this->db->where($where); } $query = $this->db->get(); $result = !$one ? $query->result() : $query->row(); return $result; } function getById($id) { $this->db->where('idPlanocontas', $id); $this->db->limit(1); return $this->db->get('planocontas')->row(); } function edit($table, $data, $fieldID, $ID) { $this->db->where($fieldID, $ID); $this->db->update($table, $data); if ($this->db->affected_rows() >= 0) { return true; } return false; } function delete($table, $fieldID, $ID) { $this->db->where($fieldID, $ID); $this->db->delete($table); if ($this->db->affected_rows() == '1') { return true; } return false; } function count($table) { return $this->db->count_all($table); } public function getNextCode($parent_code = null) { if (!$parent_code) { // Busca próximo código raiz (1, 2, 3...) $query = $this->db->select('MAX(SUBSTRING_INDEX(pl_idconta, ".", 1)) as max_code') ->from('planocontas') ->where('LENGTH(pl_idconta) = 1') ->get(); $result = $query->row(); return ($result->max_code ?? 0) + 1; } else { // Busca próximo subcódigo $like_pattern = $parent_code . '.%'; $length = strlen($parent_code) + 3; $query = $this->db->select('MAX(SUBSTRING_INDEX(pl_idconta, ".", -1)) as max_code') ->from('planocontas') ->like('pl_idconta', $like_pattern, 'after') ->where('LENGTH(pl_idconta) =', $length) ->get(); $result = $query->row(); $next_number = str_pad(($result->max_code ?? 0) + 1, 2, '0', STR_PAD_LEFT); return $parent_code . '.' . $next_number; } } public function insert($data) { if (empty($data['parent_code'])) { $data['pl_idconta'] = $this->getNextCode(); } else { $data['pl_idconta'] = $this->getNextCode($data['parent_code']); } return $this->db->insert('planocontas', [ 'pl_idconta' => $data['pl_idconta'], 'pl_descricao' => $data['pl_descricao'], 'pl_titulo' => $data['pl_titulo'], 'pl_status' => $data['pl_status'] ]); } } A VIEW está assim: <?php defined('BASEPATH') OR exit('No direct script access allowed'); $this->load->view('faturamento/tema/topo'); ?> <!-- Content Wrapper. Contains page content --> <div class="content-wrapper"> <!-- Content Header (Page header) --> <section class="content-header"> <div class="container-fluid"> <div class="row mb-2"> <div class="col-sm-6"> <h1>Condição de Pagamento</h1> </div> <div class="col-sm-6"> <ol class="breadcrumb float-sm-right"> <li class="breadcrumb-item"><a href="<?php echo base_url()?>faturamento/controle">Home</a></li> <li class="breadcrumb-item active">Condição de Pagamento</li> </ol> </div> </div> </div><!-- /.container-fluid --> </section> <section class="content"> <div class="container-fluid"> <!-- Mensagem de Sucesso / Erro --> <?php $this->load->view('estilo/acao'); ?> <div class="row"> <!-- left column --> <div class="col-md-12"> <div class="card card-success"> <div class="card-header"> <h3 class="card-title">Adicionar</h3> </div> <!-- /.card-header --> <!-- form start --> <form action="<?php echo current_url(); ?>" id="frmPlanoconta" method="post" > <div class="card-body"> <div class="form-group"> <label for="parent_code" class="control-label">Conta<span class="required">*</span></label> <select name="parent_code" id="parent_code" style="width:230px" class="form-control"> <option value="">Selecione uma Conta</option> <?php foreach ($plcta as $ct) { echo '<option value="'.$ct->pl_idconta.'">'.$ct->pl_idconta. '-'.$ct->pl_descricao.'</option>'; } ?> </select> </div> <div class="form-group"> <label for="pl_descricao">Descrição<span class="required">*</span></label> <input id="pl_descricao" type="text" name="pl_descricao" style="width:100%" class="form-control" value="<?php echo set_value('pl_descricao'); ?>" /> </div> <div class="card-footer" style="text-align:center;"> <a href="<?php echo base_url() ?>faturamento/planocontas" id="" class="btn btn-danger"><i class="fa fa-undo"></i> Voltar</a> <button type="submit" class="btn btn-primary">Adicionar</button> </div> </div> </form> </div> </div> </div> </section> </div> <?php $this->load->view('estilo/footer'); ?> Grato, Cesar -
PHP+Codeigniter - Adicionar Registro Plano de Contas
Williams Duarte respondeu ao tópico de violin101 em PHP
O campo parent_code é fundamental para criar a hierarquia do plano de contas. Vou mostrar um exemplo prático de formulário HTML e como ele funciona: <form method="post" action="<?php echo base_url('plano_contas/adicionar'); ?>"> <!-- Campo para código pai (parent_code) --> <div class="form-group"> <label>Código Pai:</label> <select name="parent_code" class="form-control"> <option value="">-- Selecione o código pai --</option> <?php foreach($codigos_pais as $codigo): ?> <option value="<?php echo $codigo->codigo; ?>"> <?php echo $codigo->codigo . ' - ' . $codigo->descricao; ?> </option> <?php endforeach; ?> </select> </div> <!-- Campo descrição --> <div class="form-group"> <label>Descrição:</label> <input type="text" name="descricao" class="form-control" required> </div> <button type="submit" class="btn btn-primary">Salvar</button> </form> Para exemplificar o funcionamento: Quando parent_code é vazio (null): Sistema gera: "1" (primeiro registro) Próximo será: "2" Quando parent_code é "1": Sistema gera: "1.01" Próximo será: "1.02" Quando parent_code é "1.01": Sistema gera: "1.01.0001" Próximo será: "1.01.0002" Aqui está o código atualizado do controller para buscar os códigos pais: public function novo() { // Carrega todos os códigos possíveis de serem pai $this->load->model('PlanoContasModel'); $data['codigos_pais'] = $this->db ->select('codigo, descricao') ->from('plano_contas') ->where('LENGTH(codigo) <=', 4) // Limita a 2 níveis (1 ou 1.01) ->order_by('codigo') ->get() ->result(); $this->load->view('plano_contas/formulario', $data); } Assim: Se você deixar o "Código Pai" vazio → Cria código raiz (1, 2, 3...) Se selecionar "1" como pai → Cria subcódigo (1.01, 1.02...) Se selecionar "1.01" como pai → Cria subcódigo (1.01.0001, 1.01.0002...) Vou ler depois sua mensagem! -
PHP+Codeigniter - Adicionar Registro Plano de Contas
violin101 respondeu ao tópico de violin101 em PHP
Amigo Williams, saudações. Desculpa minha dúvida. Qual campo no Formulário POST seria essa linha: $parent_code = null Seguindo sua orientação acima, o sistema salva os campos: Código e Descrição somente com 1. Grato, Cesar -
PHP+Codeigniter - Adicionar Registro Plano de Contas
Williams Duarte respondeu ao tópico de violin101 em PHP
Para implementar um sistema de numeração hierárquica automática no CodeIgniter, sugiro a seguinte solução, adapte a sua necessidade: // Model: PlanoContasModel.php class PlanoContasModel extends CI_Model { public function __construct() { parent::__construct(); $this->load->database(); } public function getNextCode($parent_code = null) { if (!$parent_code) { // Busca próximo código raiz (1, 2, 3...) $query = $this->db->select('MAX(SUBSTRING_INDEX(codigo, ".", 1)) as max_code') ->from('plano_contas') ->where('LENGTH(codigo) = 1') ->get(); $result = $query->row(); return ($result->max_code ?? 0) + 1; } else { // Busca próximo subcódigo $like_pattern = $parent_code . '.%'; $length = strlen($parent_code) + 3; $query = $this->db->select('MAX(SUBSTRING_INDEX(codigo, ".", -1)) as max_code') ->from('plano_contas') ->like('codigo', $like_pattern, 'after') ->where('LENGTH(codigo) =', $length) ->get(); $result = $query->row(); $next_number = str_pad(($result->max_code ?? 0) + 1, 2, '0', STR_PAD_LEFT); return $parent_code . '.' . $next_number; } } public function insert($data) { if (empty($data['parent_code'])) { $data['codigo'] = $this->getNextCode(); } else { $data['codigo'] = $this->getNextCode($data['parent_code']); } return $this->db->insert('plano_contas', [ 'codigo' => $data['codigo'], 'descricao' => $data['descricao'] ]); } } // Controller: PlanoContas.php class PlanoContas extends CI_Controller { public function __construct() { parent::__construct(); $this->load->model('PlanoContasModel'); } public function adicionar() { $data = [ 'descricao' => $this->input->post('descricao'), 'parent_code' => $this->input->post('parent_code') ]; $result = $this->PlanoContasModel->insert($data); if ($result) { echo json_encode(['success' => true]); } else { echo json_encode(['success' => false, 'error' => 'Erro ao inserir']); } } } Esta solução: Gera códigos automaticamente seguindo a hierarquia Suporta múltiplos níveis (1, 1.01, 1.01.01, etc.) Mantém o formato padronizado dos códigos Usa zero à esquerda para subcódigos (01, 02, etc.) Exemplo de uso: CREATE TABLE plano_contas ( id INT PRIMARY KEY AUTO_INCREMENT, codigo VARCHAR(20) UNIQUE, descricao VARCHAR(100) ); Para adicionar um registro, faça uma requisição POST com: descricao: Nome da conta parent_code: Código pai (opcional) -
Caros amigos, saudações. Humildemente peço desculpa por postar uma dúvida que tenho. Preciso salvar no MySql, os seguinte Registro: 1 - Principal ====> minha dúvida começa aqui ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____? 1.01 - Matriz 1.01.0001 - Estoque 1.01.0002 - Oficina etc 2 - Secundário 2.01 - Loja_1 2.01.0001 - Caixa 2.01.0002 - Recepção etc Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL. Grato, Cesar
-
Javascript - Passar Parâmetros para uma Função.
Williams Duarte respondeu ao tópico de violin101 em Javascript
Para passar parâmetros para uma função JS, você pode utilizar atributos de dados (data attributes) nos elementos HTML e, em seguida, acessar esses atributos no JavaScript para obter os valores desejados. Segue o exemplo de como você pode modificar seu código para passar os parâmetros usando JavaScript Modifique os botões "Visualizar" e "Editar" para incluir atributos de dados com os valores necessários: <button class="btn btn-warning" title="Visualizar" style="margin-left:50%; padding: 1px 3px;" data-id-pedido="<?php echo $r->idPedidos; ?>" data-nr-pedido="<?php echo $r->pd_numero; ?>" onclick="visualizarPedido(this)"><i class="fa fa-search icon-white"></i></button> <button class="btn btn-primary" title="Editar" style="margin-left:50%; padding: 1px 3px;" data-id-pedido="<?php echo $r->idPedidos; ?>" data-nr-pedido="<?php echo $r->pd_numero; ?>" onclick="editarPedido(this)"><i class="fa fa-edit icon-white"></i></button> Remova os formulários que envolvem os botões, pois não serão mais necessários. Adicione as seguintes funções JS no seu arquivo de JavaScript ou dentro de uma tag <script> na sua página: function visualizarPedido(button) { const idPedido = button.getAttribute('data-id-pedido'); const nrPedido = button.getAttribute('data-nr-pedido'); // Faça uma requisição Ajax para a URL desejada, passando os parâmetros const url = '<?= base_url() ?>compras/pedidos/visualizar?idPedido=' + idPedido + '&nrPedido=' + nrPedido; // Exemplo usando fetch: fetch(url) .then(response => response.text()) .then(data => { // Faça algo com a resposta recebida console.log(data); }) .catch(error => { console.error('Erro:', error); }); } function editarPedido(button) { const idPedido = button.getAttribute('data-id-pedido'); const nrPedido = button.getAttribute('data-nr-pedido'); // Faça uma requisição Ajax para a URL desejada, passando os parâmetros const url = '<?= base_url() ?>compras/pedidos/editar?idPedido=' + idPedido + '&nrPedido=' + nrPedido; // Exemplo usando fetch: fetch(url) .then(response => response.text()) .then(data => { // Faça algo com a resposta recebida console.log(data); }) .catch(error => { console.error('Erro:', error); }); } No exemplo, adicionamos atributos de dados aos botões para armazenar os valores necessários. No JavaScript, obtemos esses valores usando `getAttribute` e construímos a URL com os parâmetros. Em seguida, fazemos uma requisição Ajax para a URL usando `fetch` e lidamos com a resposta de acordo com as necessidades. Essa abordagem permite passar os parâmetros sem a necessidade de formulários adicionais. -
ErickCristiano alterou sua foto pessoal
-
Caros amigos, saudações. Consegui solucionar a minha SQL desta forma. <?php public function faturaPrazo($diasvcto = null, $ordenar = null){ if ($ordenar != null) { $this->db->order_by($ordenar); } $query = "SELECT faturamento.*, fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.dataVencimento <= DATE_ADD(NOW(), INTERVAL $diasvcto DAY) AND faturamento.statusFatur = 1 ORDER BY faturamento.dataVencimento $ordenar "; return $this->db->query($query)->result(); } ?> Observação: - não sei se existe outra rotina parecida ou mais eficiente que a que escrevi. - caso tenha e os amigos puder compartilhar, fico inteiramente grato. Grato, Cesar