Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Tenho uma aplicação, onde existe uma opção para cadastrar uma CONTA com saldo inicial igual a zero e duas opções para cadastrar RECEITAS e DESPESAS.
Sendo que, quando cadastro uma RECEITA, o saldo da conta atualiza de acordo com o valor cadastrado na receita.
Caso seja cadastrado uma DESPESA, é subtraído o mesmo valor do saldo da conta
**Cenário:
RECEITA = 80,00
SALDO DA CONTA = 80,00**
**DESPESA = 30,00
SALDO DA CONTA = 50,00**
Até aqui, tudo bem.(funcionando corretamente) O problema é que não sei como fazer para atualizar o SALDO quando editar ou excluir uma RECEITA ou DESPESA.
Exemplo:
Quando editar o valor de uma RECEITA quero que o saldo seja atualizado.
Quando editar o valor de uma DESPESA quero que o saldo seja atualizado.
Quando excluir uma DESPESA quero que o valor da DESPESA, some ao saldo.
Quando excluir uma RECEITA quero que o valor da RECEITA, subtraia ao saldo.
Podem me ajudar com esta função e query?
A tabela onde são cadastradas a RECEITA e DESPESA tem as seguintes colunas:
CREATE TABLE IF NOT EXISTS `lancamentos` (
`idLancamentos` INT(11) NOT NULL AUTO_INCREMENT,
`descricao` VARCHAR(255) NULL DEFAULT NULL,
`valor` VARCHAR(15) NOT NULL,
`data_vencimento` DATE NOT NULL,
`categoria_id` INT(11) NULL DEFAULT NULL,
`conta_id` INT(11) NULL DEFAULT NULL,
`data_pagamento` DATE NULL DEFAULT NULL,
`baixado` TINYINT(1) NULL DEFAULT NULL,
`cliente_fornecedor` VARCHAR(255) NULL DEFAULT NULL,
`forma_pgto` VARCHAR(100) NULL DEFAULT NULL,
`tipo` VARCHAR(45) NULL DEFAULT NULL,
`anexo` VARCHAR(250) NULL,
`clientes_id` INT(11) NULL DEFAULT NULL,
PRIMARY KEY (`idLancamentos`),
INDEX `fk_lancamentos_clientes1` (`clientes_id` ASC),
CONSTRAINT `fk_lancamentos_clientes1`
FOREIGN KEY (`clientes_id`)
REFERENCES `clientes` (`idClientes`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;
A tabela onde são cadastradas as categorias tem as seguintes colunas:
CREATE TABLE IF NOT EXISTS `categorias` (
`idCategoria` INT(11) NOT NULL AUTO_INCREMENT,
`nome_categoria` VARCHAR(45) NOT NULL,
`tipo_categoria` TINYINT(1) NOT NULL,
`status_categoria` TINYINT(1) NOT NULL,
`data_cadastro_categoria` DATE NULL DEFAULT NULL,
PRIMARY KEY (`idCategoria`))
ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARACTER SET = latin1;
//1 para RECEITA
//0 para DESPESA
A tabela onde são cadastradas as contas e saldos tem as seguintes colunas:
CREATE TABLE IF NOT EXISTS 'contas' (
'idConta' INT(11) NOT NULL AUTO_INCREMENT,
'conta' VARCHAR(45) NOT NULL,
'banco' VARCHAR(45) NOT NULL,
'numero' VARCHAR(45) NOT NULL,
'saldo' DECIMAL(10,2) NOT NULL,
'status' TINYINT(1) NOT NULL,
'data_cadastro' DATE NULL DEFAULT NULL,
PRIMARY KEY (idConta))
ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARACTER SET = latin1;
Para adicionar DESPESA, estou usando a função:
function adicionarDespesa() {
if(!$this->permission->checkPermission($this->session->userdata('permissao'),'aLancamento')){
$this->session->set_flashdata('error','Você não tem permissão para adicionar lançamentos.');
redirect(base_url());
}
$this->load->library('form_validation');
$this->data['custom_error'] = '';
$urlAtual = $this->input->post('urlAtual');
if ($this->form_validation->run('despesa') == false) {
$this->data['custom_error'] = (validation_errors() ? '<div class="form_error">' . validation_errors() . '</div>' : false);
} else {
$vencimento = $this->input->post('vencimento');
$pagamento = $this->input->post('pagamento');
$valor = $this->input->post('valor');
$conta = $this->input->post('conta_id');
if($pagamento != null){
$pagamento = explode('/', $pagamento);
$pagamento = $pagamento[2].'-'.$pagamento[1].'-'.$pagamento[0];
}
if($vencimento == null){
$vencimento = date('d/m/Y');
}
try {
$vencimento = explode('/', $vencimento);
$vencimento = $vencimento[2].'-'.$vencimento[1].'-'.$vencimento[0];
} catch (Exception $e) {
$vencimento = date('Y/m/d');
}
$data = array(
'descricao' => set_value('descricao'),
//'valor' => set_value('valor'),
'valor' => $valor,
'data_vencimento' => $vencimento,
'categoria_id' => $this->input->post('categoria_id'),
'conta_id'=> $conta,
//'conta_id' => $this->input->post('conta_id'),
'baixado' => $this->input->post('pago'),
'data_pagamento' => $pagamento != null ? $pagamento : date('Y-m-d'),
'baixado' => $this->input->post('pago'),
'cliente_fornecedor' => set_value('fornecedor'),
'forma_pgto' => $this->input->post('formaPgto'),
'tipo' => set_value('tipo')
);
if ($this->financeiro_model->add('lancamentos',$data) == TRUE) {
$sql = "UPDATE contas set saldo = saldo - ? WHERE idConta = ?";
$this->db->query($sql, array($valor, $conta));
echo json_encode(array('result'=> true));
$this->session->set_flashdata('success','Despesa adicionada com sucesso!');
redirect($urlAtual);
} else {
$this->session->set_flashdata('error','Ocorreu um erro ao tentar adicionar despesa!');
echo json_encode(array('result'=> false));
redirect($urlAtual);
}
}
$this->session->set_flashdata('error','Ocorreu um erro ao tentar adicionar despesa.');
redirect($urlAtual);
}
Para adicionar RECEITA, estou usando a função:
function adicionarReceita() {
if(!$this->permission->checkPermission($this->session->userdata('permissao'),'aLancamento')){
$this->session->set_flashdata('error','Você não tem permissão para adicionar lançamentos.');
redirect(base_url());
}
$this->load->library('form_validation');
$this->data['custom_error'] = '';
$urlAtual = $this->input->post('urlAtual');
if ($this->form_validation->run('receita') == false) {
$this->data['custom_error'] = (validation_errors() ? '<div class="form_error">' . validation_errors() . '</div>' : false);
} else {
$valor = $this->input->post('valor');
$vencimento = $this->input->post('vencimento');
$recebimento = $this->input->post('recebimento');
$conta = $this->input->post('conta_id');
if($recebimento != null){
$recebimento = explode('/', $recebimento);
$recebimento = $recebimento[2].'-'.$recebimento[1].'-'.$recebimento[0];
}
if($vencimento == null){
$vencimento = date('d/m/Y');
}
try {
$vencimento = explode('/', $vencimento);
$vencimento = $vencimento[2].'-'.$vencimento[1].'-'.$vencimento[0];
} catch (Exception $e) {
$vencimento = date('Y/m/d');
}
$data = array(
'descricao' => set_value('descricao'),
//'valor' => set_value('valor'),
'valor' => $valor,
'data_vencimento' => $vencimento,
'data_pagamento' => $recebimento != null ? $recebimento : date('Y-m-d'),
'categoria_id' => $this->input->post('categoria_id'),
'conta_id'=> $conta,
//'conta_id' => $this->input->post('conta_id'),
'baixado' => $this->input->post('recebido'),
'cliente_fornecedor' => set_value('cliente'),
'forma_pgto' => $this->input->post('formaPgto'),
'tipo' => set_value('tipo')
);
if ($this->financeiro_model->add('lancamentos',$data) == TRUE) {
$sql = "UPDATE contas set saldo = saldo + ? WHERE idConta = ?";
$this->db->query($sql, array($valor, $conta));
echo json_encode(array('result'=> true));
$this->session->set_flashdata('success','Receita adicionada com sucesso!');
redirect($urlAtual);
} else {
$this->data['custom_error'] = '<div class="form_error"><p>Ocorreu um erro.</p></div>';
echo json_encode(array('result'=> false));
}
}
$this->session->set_flashdata('error','Ocorreu um erro ao tentar adicionar receita.');
redirect($urlAtual);
}
Para editar RECEITA e DEPESA, estou usando a função:
public function editar(){
if(!$this->permission->checkPermission($this->session->userdata('permissao'),'eLancamento')){
$this->session->set_flashdata('error','Você não tem permissão para editar lançamentos.');
redirect(base_url());
}
$this->load->library('form_validation');
$this->data['custom_error'] = '';
$urlAtual = $this->input->post('urlAtual');
$this->form_validation->set_rules('descricao', '', 'trim|required|xss_clean');
$this->form_validation->set_rules('fornecedor', '', 'trim|required|xss_clean');
$this->form_validation->set_rules('valor', '', 'trim|required|xss_clean');
$this->form_validation->set_rules('vencimento', '', 'trim|required|xss_clean');
$this->form_validation->set_rules('pagamento', '', 'trim|xss_clean');
if ($this->form_validation->run() == false) {
$this->data['custom_error'] = (validation_errors() ? '<div class="form_error">' . validation_errors() . '</div>' : false);
} else {
$vencimento = $this->input->post('vencimento');
$pagamento = $this->input->post('pagamento');
$valor = $this->input->post('valor');
$conta = $this->input->post('conta_id');
try {
$vencimento = explode('/', $vencimento);
$vencimento = $vencimento[2].'-'.$vencimento[1].'-'.$vencimento[0];
$pagamento = explode('/', $pagamento);
$pagamento = $pagamento[2].'-'.$pagamento[1].'-'.$pagamento[0];
} catch (Exception $e) {
$vencimento = date('Y/m/d');
}
$data = array(
'descricao' => $this->input->post('descricao'),
//'valor' => $this->input->post('valor'),
'valor' => $valor,
'categoria_id' => $this->input->post('categoria_id'),
'conta_id'=> $conta,
'data_vencimento' => $vencimento,
'data_pagamento' => $pagamento,
'baixado' => $this->input->post('pago'),
'cliente_fornecedor' => $this->input->post('fornecedor'),
'forma_pgto' => $this->input->post('formaPgto'),
'tipo' => $this->input->post('tipo')
);
if ($this->financeiro_model->edit('lancamentos',$data,'idLancamentos',$this->input->post('id')) == TRUE) {
$sql = "UPDATE contas set saldo = saldo - ? WHERE idConta = ?";
$this->db->query($sql, array($valor, $conta));
echo json_encode(array('result'=> true));
$this->session->set_flashdata('success','lançamento editado com sucesso!');
redirect($urlAtual);
} else {
$this->session->set_flashdata('error','Ocorreu um erro ao tentar editar lançamento!');
echo json_encode(array('result'=> false));
redirect($urlAtual);
}
$sql = "UPDATE contas set saldo = saldo + ? WHERE idConta = ?";
$this->db->query($sql, array($valor, $conta));
echo json_encode(array('result'=> true));
}
$this->session->set_flashdata('error','Ocorreu um erro ao tentar editar lançamento.');
echo json_encode(array('result'=> false));
redirect($urlAtual);
$data = array(
'descricao' => $this->input->post('descricao'),
//'valor' => $this->input->post('valor'),
'valor' => $valor,
'categoria_id' => $this->input->post('categoria_id'),
'conta_id'=> $conta,
'data_vencimento' => $this->input->post('vencimento'),
'data_pagamento' => $this->input->post('pagamento'),
'baixado' => $this->input->post('pago'),
'cliente_fornecedor' => set_value('fornecedor'),
'forma_pgto' => $this->input->post('formaPgto'),
'tipo' => $this->input->post('tipo')
);
print_r($data);
}
Para excluir RECEITA e DEPESA, estou usando a função:
public function excluirLancamento(){
if(!$this->permission->checkPermission($this->session->userdata('permissao'),'dLancamento')){
$this->session->set_flashdata('error','Você não tem permissão para excluir lançamentos.');
redirect(base_url());
}
$id = $this->input->post('id');
if($id == null || ! is_numeric($id)){
$json = array('result'=> false);
echo json_encode($json);
}
else{
$result = $this->financeiro_model->delete('lancamentos','idLancamentos',$id);
if($result){
$json = array('result'=> true);
echo json_encode($json);
}
else{
$json = array('result'=> false);
echo json_encode($json);
}
}
}
MODEL FINANCEIRO
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('data_vencimento', '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('idClientes',$id);
$this->db->limit(1);
return $this->db->get('clientes')->row();
}
function add($table,$data){
$this->db->insert($table, $data);
if ($this->db->affected_rows() == '1')
{
return TRUE;
}
return FALSE;
}
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, $where) {
$this->db->from($table);
if($where){
$this->db->where($where);
}
return $this->db->count_all_results();
}Bom dia!
Ou seja, eu teria que excluir esta parte do código:
-
$sql = "UPDATE contas set saldo = saldo + ? WHERE idConta = ?";
$this->db->query($sql, array($valor, $conta));
echo json_encode(array('result'=> true));
Embora tenha descrito como fazer, pode me ajudar em como ficaria cada query? Um exemplo basico mesmo.Voce iria substituir essa parte do código pela função
e dentro da função voce teria o código para alterar o saldo
exemplo:
function atualizaSaldo($valor,$conta) {
$atual = "SELECT saldo from contas where idConta=?";
$this->db->query($atual , array($conta));
$novo = $atual + $valor;
$sql = "UPDATE contas set saldo = saldo + ? WHERE idConta = ?";
$this->db->query($sql, array($novo , $conta));
}
agora é só chamar a função sempre que voce precisar atualizar o saldo
Não deu certo.
Chamei a função atualizaSaldo, através da função adicionarReceita
Ficou assim:
if ($this->financeiro_model->add('lancamentos',$data) == TRUE) {
$this->atualizaSaldo();
$this->session->set_flashdata('success','Receita adicionada com sucesso!');
redirect($urlAtual);
} else {
$this->data['custom_error'] = '<div class="form_error"><p>Ocorreu um erro.</p></div>';
}Agora sim, deu certo.
Não tinha atribuído valores as variáveis $valor,$conta
function atualizaSaldo($valor,$conta) {
$valor = $this->input->post('valor');
$conta = $this->input->post('conta_id');
$atual = "SELECT saldo from contas where idConta=?";
$this->db->query($atual , array($conta));
$novo = $atual + $valor;
$sql = "UPDATE contas set saldo = saldo + ? WHERE idConta = ?";
$this->db->query($sql, array($novo , $conta));
}
Mas no final das contas, esta fazendo o que já fazia.
Adiciona e Subtrai o Saldo da conta.
Queria que funcionasse Quando editar e excluir(isto não sei fazer)
Só chamar a função na hora de editar ou excluir o cadastro
Não sei se é pra fins de estudo, mas senão for, essas funções tem tantas responsabilidades, se alguém for da manutenção no futuro além de você, sera mais fácil reconstruir o sistema do zero e dentro dos padrões.
Williams,
Não sei se é pra fins de estudo, mas senão for, essas funções tem tantas responsabilidades, se alguém for da manutenção no futuro além de você, sera mais fácil reconstruir o sistema do zero e dentro dos padrões.
O que seria dentro dos padrões para você?
Este é um projeto construído em codeigniter para o fim em que se destina***(vide *Finalidade)***, não vejo muitos outros meios para se fazer, até porque segue a documentação do próprio codeigniter.
É meio óbvio que construir um projeto juntamente com uma equipe, se torna muito mais eficiente e talvez mais simples do que fazê-lo sozinho.
*Finalidade: Não é para fim de estudo, isto faz parte de um CRM para registro de vendas, cobrança, importação, exportação, relatórios e estou somente acrescentado funcionalidades.
Como disse, não vejo muitos outros meios de se fazer, mas caso tenha algum meio mais fácil e menos complexo.
Gostaria de saber, pode informa-los?
codeigniter.
Reparei, este é o framework diga-se de passagem o mais tosco de todos, geralmente usado para quem esta começando a estudar frameworks, mas pra quem entende um pouco de OOP e Design Pattern, sabe que o "codeigniter" embrulha o estomago quando se olha as classes e funções dentro do seu núcleo de tão feio que é, por isso são poucos os que tem coragem em desenvolver algo que vá para produção e escalavel em cima dele. Mas vamos ao seu problema.
Siga o padrão GOF e outros saberão o que seu código faz independente de Frameworks!
De uma olhada também em principios SOLID)e programe para interface, ta cheio de exemplos e tutorias no youtube e outros.
Segue:
E não leve a mal quando um código é criticado, estamos todos aprendendo.
>
Reparei, este é o framework diga-se de passagem o mais tosco de todos, geralmente usado para quem esta começando a estudar frameworks, mas pra quem entende um pouco de OOP e Design Pattern, sabe que o "codeigniter" embrulha o estomago quando se olha as classes e funções dentro do seu núcleo de tão feio que é, por isso são poucos os que tem coragem em desenvolver algo que vá para produção e escalavel em cima dele. Mas vamos ao seu problema.
Siga o padrão GOF e outros saberão o que seu código faz independente de Frameworks!
De uma olhada também em principios SOLID)e programe para interface, ta cheio de exemplos e tutorias no youtube e outros.
Segue:
E não leve a mal quando um código é criticado, estamos todos aprendendo.
Ok!
Vou estudar sobre isto,muito obrigado aos envolvidos.
Bom dia, isso é questão de lógica apenas.
oq eu recomendo é você criar uma função para mexer com o saldo, e toda vez que você realizar alguma alteração você chama essa função.
exemplo
-
function saldo($valor) {
query que recupera o valor atual do saldo
faz a soma do saldo com a variavel valor
query para atualizar o saldo
obs: não esquecer de que quando for salvo negativo passar com o sinal de menos