Jump to content

POWERED BY:

violin101

PHP - Array contendo DATA salva 0 no MySql

Recommended Posts

Olá amigos, saudações.

Após ajuda dos amigos do forum, consegui uma Rotina que estava precisando.

Infelizmente após gerar o parcelamento com suas datas de vencimento, quando SALVA no MySql o campo data salva assim 0000-00-00, mesmo contendo datas de vencimentos.

Como consigo salvar no campo vencimento as DATAS corretamente ?

 

O Código fico assim:
Controller

    function adicionar()
    {
        if (!$this->permission->checkPermission($this->session->userdata('permissao'), 'aLancamento')) {
            $this->session->set_flashdata('error', 'Você não tem permissão para adicionar lançamento.');
            redirect(base_url());
        }

        //Recebe via POST Dados do Lançamento
        $codEmpr = $this->input->post('idEmp');
        $dataLct = $this->input->post('dtaentr');
        $notaLct = $this->input->post('num_nf');

        //Recebe via POST os Produtos - Entrada de Lançamentos      
        $id_prds = $this->input->post("id_prds");
        $qtde = $this->input->post("qtde");
        $estoq = $this->input->post("estoq");
        $vlrunit = $this->input->post("vlrunit");
        $vlrtotal = $this->input->post("vlrtotal");     

        //Recebe via POST os Parcelamento
        $dtaprc = $this->input->post("dtaprc");
        $vlrprc = $this->input->post("vlrprc");     
        $idFrnc = $this->input->post('idfornecedor');

        $this->load->library('form_validation');
        $this->data['custom_error'] = '';        

        if ($this->form_validation->run('lancamentos') == false) {
            $this->data['custom_error'] = (validation_errors() ? '<div class="form_error">' .validation_errors(). '</div>' : false);
        } else {             
                
            $data = array(
              	'dtalcto' => date('Y-m-d'),  
                'dtaentr' => $this->input->post('dtaentr'),                  	
                'num_nf' => set_value('num_nf'),                                                   
                'tipo_lcto' => 1,
                'id_user' => $this->session->userdata('id'), //pega o ID do Usuário logado
                'id_empresas' => $this->input->post('idEmp'), //pega o ID do Empresa logado
                'fornecedor_idfornecedor' => $this->input->post('idfornecedor')
            );

            if ($this->lancamentos_model->add('lancamentos', $data) == true) {
                //Função para Pegar o Último ID do lançamento
                $numlcto = $this->lancamentos_model->lastID();

                //Função para Salvar os Itens do lançamento
                $this->save_detalhe($id_prds,$qtde,$vlrunit,$vlrtotal,$numlcto);

                //Função para Salvar Parcelamento
                $this->save_parcelas($notaLct,$dtaprc,$vlrprc,$idFrnc);

                //Converte o ID em String
                $strlcto = strval($numlcto);
                $strEmpr = strval($codEmpr);

                $pegEmpr = str_pad($strEmpr, '3', '0', STR_PAD_LEFT);
                $mostra = 'E-'.$pegEmpr.'.'.$strlcto;

                //Chama a Função para Alterar o ID do lançamento
                $this->update_lctos($numlcto,$strlcto,$strEmpr);

                //Função para Salvar Histórico do Produto
                $this->save_hist($dataLct,$qtde,$estoq,$mostra,$notaLct,$id_prds,$codEmpr);                  

                $this->session->set_flashdata('success', '<h4>Lançamento nº.'.$mostra.' - adicionado com Sucesso.</h4>');
                redirect(base_url() . 'admin/lancamentos/visualizar/'.$numlcto);
            } else {                
                $this->data['custom_error'] = '<div class="form_error"><p><h4>Atenção!!! Ocorreu um erro ao tentar adicionar.</h4></p></div>';
            }                              
              
        }


        $this->load->view('estilo/header', $this->data);     
        $this->load->view('admin/lancamentos/adicionarLancamento');              

    }

        //Função para Salvar os Parcelamentos
        protected function save_parcelas($notaLct,$dtaprc,$vlrprc,$idFrnc){
            for ($i=0; $i < count($vlrprc); $i++) { 
                $data  = array(
                    'nunNotafiscal' => $notaLct, 
                    'dataVencimento' => $dtaprc[$i], //aqui salva 0000-00-00
                    'valorParcela' => $vlrprc[$i],
                    'id_fornecedor' => $idFrnc,
                    'id_user'=> $this->session->userdata('id'),                
                );
                //Função para Salvar os Detalhes do Parcelamento
                $this->lancamentos_model->save_parcelas($data);       
            }
        }            


    public function geraParcelamento()
    {
        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('d/m/Y'),
                        'valor_parcela' => number_format($valorAtualParcela, 2, ',', '.')
                    ];
                }

                return $datasParcelas;
            }

            $parcelas = gerarParcelas($dataInicial, $intervalos, $valorTotal);

            header('Content-Type: application/json');
            echo json_encode($parcelas);
        }
    }

 

Models

    //Salva Parcelamento
    public function save_parcelas($data){
        $this->db->insert("faturamento",$data);
    }

 

View

//Esta função tras correto o parcelamento
      
      function gerarParcelas() {
        const dataInicial = $('#dtaentr').val();
        const intervalos = $('#formaPgto').val();
        const valorTotal = $('#subtotal').val();

          $.ajax({
            url: '<?=base_url()?>admin/lancamentos/geraParcelamento',
            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 width='10%' height='10'><input type='hidden' name='dtaprc[]' value='"+parcela.data_vencimento +"'>"+parcela.data_vencimento +"</td>";
                    html += "<td width='32%' height='10'><input type='hidden' name='vlrprc[]' value='"+parcela.valor_parcela+"'>"+parcela.valor_parcela+"</td>";
                    html += "<td width='10%' height='10' style='text-align:center;'>"+
                            "<button type='button' class='btn btn-primary btn-editar-parc' style='margin-right: 1%; padding: 1px 2px;' title='Editar'>"+
                            "<span class='fa fa-edit'></span></button>"+
                            "<button type='button' class='btn btn-success btn-salvar-parc' style='margin-right: 1%; padding: 1px 5px;' title='Salvar'>"+
                            "<span class='fa fa-save'></span></button>"+                            
                            "</td>";                       
                html += "</tr>";     
                               
                tbody.append(html);

              });
            }

          });
      }



 

Share this post


Link to post
Share on other sites

 

no seu controller, converte as datas para o formato Y-m-d antes de você salvar no seu banco de dados....

 

<?php

protected function save_parcelas($notaLct, $dtaprc, $vlrprc, $idFrnc) {
    for ($i = 0; $i < count($vlrprc); $i++) {
        $dataVencimento = DateTime::createFromFormat('d/m/Y', $dtaprc[$i])->format('Y-m-d');
        $data  = array(
            'nunNotafiscal' => $notaLct,
            'dataVencimento' => $dataVencimento, // data no formato correto
            'valorParcela' => $vlrprc[$i],
            'id_fornecedor' => $idFrnc,
            'id_user' => $this->session->userdata('id'),
        );
        $this->lancamentos_model->save_parcelas($data);
    }
}

 

para garantir que a data de vencimento está sendo formatada corretamente antes de ser retornada para o seu  JavaScript

 

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('d/m/Y'), // formato para exibição
            'valor_parcela' => number_format($valorAtualParcela, 2, ',', '.')
        ];
    }

    return $datasParcelas;
}
no seu view
 
function gerarParcelas() {
    const dataInicial = $('#dtaentr').val();
    const intervalos = $('#formaPgto').val();
    const valorTotal = $('#subtotal').val();

    $.ajax({
        url: '<?=base_url()?>admin/lancamentos/geraParcelamento',
        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 width='10%' height='10'><input type='hidden' name='dtaprc[]' value='" + parcela.data_vencimento + "'>" + parcela.data_vencimento + "</td>";
                html += "<td width='32%' height='10'><input type='hidden' name='vlrprc[]' value='" + parcela.valor_parcela + "'>" + parcela.valor_parcela + "</td>";
                html += "<td width='10%' height='10' style='text-align:center;'>" +
                    "<button type='button' class='btn btn-primary btn-editar-parc' style='margin-right: 1%; padding: 1px 2px;' title='Editar'>" +
                    "<span class='fa fa-edit'></span></button>" +
                    "<button type='button' class='btn btn-success btn-salvar-parc' style='margin-right: 1%; padding: 1px 5px;' title='Salvar'>" +
                    "<span class='fa fa-save'></span></button>" +
                    "</td>";
                html += "</tr>";

                tbody.append(html);
            });
        }
    });
}

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • By violin101
      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
    • By violin101
      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









       
    • By violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • By violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
×

Important Information

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