Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia pessoal, preciso da ajuda de vocês:
Estou fazendo um sistema de finanças, e quero cadastrar uma despesa parcelada:
EX: Fiz um despesa de R$ 200.00 e dividi em 2x, a primeira parcela será dia 07/02/2013 e a próxima dia 07/03/2013.
Vi esse tópico que já foi resolvido, mas eu estou aprendendo e fazendo usando OO e MVC.
E não está rolando:
http://forum.imasters.com.br/topic/257671-resolvido%26nbsp%3Bincrementar-data/
Meu código ficou assim:
$despesa->valor = $despesa->valor / $despesa->parcelas;
// FORMATO DE MINHA DATA É Y-m-d
$cr_data = explode("-",$despesa->data);
$dt = "$cr_data[2]$cr_data[1]$cr_data[0]";
// RECUPERA O DIA
$dia_parcela = "$cr_data[2]";
// RECUPERA O MES
$mes_parcela="$cr_data[1]";
//RECUPERA O ANO
$ano_parcela = "$cr_data[0]";
$data_parcelas = "$ano_parcela$mes_parcela$dia_parcela";
for ($cont = 1; $cont <= $despesa->parcelas; $cont++){
//CHAMA O METODO DE INSERIR
$dao->insert($despesa);
$mes_parcela++;
if ($mes_parcela>12){
$ano_parcela++;
$mes_parcela=1;
}
$data_parcelas = "$ano_parcela$mes_parcela$dia_parcela";
}
Ele está dividindo o valor na qtd de parcelas, mas não está incrementando os meses, ou seja, está colocando sempre no mês que escolhi.
Vocês podem me ajudar?
>
cade o objeto despesa? e por que exatamente você classificou isso como objeto?
por que existe código procedural?
eu fiquei confuso quanto a sua utilização de OO.
se seu nível for um pouco alto procure trabalhar com as interfaces
Essa é classe de regra de negócio (BO), eu populei o objeto despesa no controller.
Estou aprendendo OO, e meu nível está longe de ser alto.. rsrs.
Apenas quero aprender da forma correta, utilizando OO e padrão de projeto.
então amigo para aprender corretamente não pode existir CLASSE de regra do negócio.
você precisa ter um Objeto.
Pense assim valor é um propriedade do negócio então ele não faz nenhuma ação é algo quase estático, como a pessoa tem a propriedade CorDosOlhos pode ser azul mas essa mesma propriedade não pode olhar, você precisa um método para calcular o valor primeiramente e postar seus objetos inteiros para termos melhor noção do que esta acontecendo.
pra mim isso aqui
$cr_data = explode("-",$despesa->data); $dt = "$cr_data[2]$cr_data[1]$cr_data[0]"; // RECUPERA O DIA $dia_parcela = "$cr_data[2]"; // RECUPERA O MES $mes_parcela="$cr_data[1]"; //RECUPERA O ANO $ano_parcela = "$cr_data[0]"; $data_parcelas = "$ano_parcela$mes_parcela$dia_parcela"; for ($cont = 1; $cont <= $despesa->parcelas; $cont++){ //CHAMA O METODO DE INSERIR $dao->insert($despesa); $mes_parcela++; if ($mes_parcela>12){ $ano_parcela++; $mes_parcela=1; } $data_parcelas = "$ano_parcela$mes_parcela$dia_parcela"; }
esta jogado no meio do seu código sem se atrelar a objeto algum.
Vamos lá:
Meu controller:
$despesa = new Despesa();
$acao = get('acao');
$despesa->id = get('id');
$despesa->descricao = get('descricao');
$despesa->data = convert(get('data'), 'Y-m-d');
$despesa->valor = get('valor');
$despesa->formaPagamento = get('forma_pagamento');
$despesa->parcelas = get('parcelas');
if ($acao == "excluir")
$despesa = DespesaBO::delete($despesa);
else
$despesa = DespesaBO::save($despesa);
Meu BO:
class DespesaBO {
static function save($despesa) {
$dao = new DespesaDAO();
if (empty($despesa->id) && $despesa->id == ""){
$despesa->valor = $despesa->valor / $despesa->parcelas;
$cr_data = explode("-",$despesa->data);
$dt = "$cr_data[2]$cr_data[1]$cr_data[0]";
// RECUPERA O DIA
$dia_parcela = "$cr_data[2]";
// RECUPERA O MES
$mes_parcela="$cr_data[1]";
//RECUPERA O ANO
$ano_parcela = "$cr_data[0]";
$data_parcelas = "$ano_parcela$mes_parcela$dia_parcela";
for ($cont = 1; $cont <= $despesa->parcelas; $cont++){
$dao->insert($despesa);
$mes_parcela++;
if ($mes_parcela>12){
$ano_parcela++;
$mes_parcela=1;
}
$data_parcelas = "$ano_parcela$mes_parcela$dia_parcela";
}
}else{
$dao->update($despesa);
}
}
Meu DAO:
class DespesaDAO {
function insert($despesa){
$sql = "INSERT INTO despesa (descricao, data, valor, forma_pagamento, parcelas) VALUES ";
$sql .= " ('".$despesa->descricao."', '".$despesa->data."', '".$despesa->valor."', ";
$sql .= " '".$despesa->formaPagamento."', '".$despesa->parcelas."' ) ";
Persistencia::executeNoQuery($sql);
}
A parte que incrementa a data ta errado mesmo, não tem nenhum objeto ali, mas é isso, não sei como fazer.
No post que mostrei, o cara fez usando procedural, e ali é mais tranquilo.
Galera fiz alguma alterações:
OBS: Data escolhida: 07/02/2013
$despesa->valor = $despesa->valor / $despesa->parcelas;
for ($cont = 1; $cont <= $despesa->parcelas; $cont++){
$dao->insert($despesa);
$despesa->data = explode("-",$despesa->data);
$mes = $despesa->data[1] + 1;
$despesa->data = $despesa->data[2] ."-". $mes ."-". $despesa->data[0];
var_dump($despesa->data);
}
Resultado do var_dump: string(9) "07-3-2013"
Erro: Incorrect date value: '07-3-2013' for column 'data' at row 1
O erro ocorre porque o mês ficou 3 e não 03..
Quando ele somou 02 + 1 ficou 3..
Temo como eu corrigir isso?
se o teu campo for do tipo date, o formato q vc deve usar é na verdade yyyy-mm-dd, e não tem nada a ver com o 0. Mas sim com o formato.
Consegui Resolver o problema, usei o exemplo do post e adaptei:
$despesa->valor = $despesa->valor / $despesa->parcelas;
for ($cont = 1; $cont <= $despesa->parcelas; $cont++){
$dao->insert($despesa);
$despesa->data = explode("-",$despesa->data);
// Esta mesma data em formato UNIX timestamp -- mes_parcela, dia_parcela, ano_parcela
$timestamp = mktime(0, 0, 0, $despesa->data[1], $despesa->data[2], $despesa->data[0]);
// Incrementando um mês à esta data
$nova = strtotime("+1 month", $timestamp);
$data = date("Y-m-d", $nova);
$despesa->data = $data;
}
Agora sim, ele divide as parcelas certinho, e caso passe de mo mês 12, ele vai pro ano seguinte a partir de Janeiro.
Show de bola.
Vocês tem alguma consideração a fazer para melhorar meu código?
Apesar de você já ter resolvido, está utilizando uma solução antiga, que futuramente pode ser removida, além de perder tempo com código para separar cada parte da data (dia, mes, ano). Utilize a biblioteca DateTime.
A solução mais simple:
$data = new DateTime('2013-02-10');//Dia dez é sempre um bom dia, ou ruim, para pagar as contas.
$data->add(new DateInterval('P1M'));
echo $data->format('d/m/Y');
Saída:
10/03/2013
Aqui você encontrará uma explicação detalhada:
http://forum.imasters.com.br/topic/483023-somar-minutos-a-hora/?p=1919441
Caso você possua a data em algum outro formato, basta especificá-lo, tal como:
$data = DateTime::createFromFormat('d/m/Y' , '10/02/2013');
>
Apesar de você já ter resolvido, está utilizando uma solução antiga, que futuramente pode ser removida, além de perder tempo com código para separar cada parte da data (dia, mes, ano). Utilize a biblioteca DateTime.
A solução mais simple:
$data = new DateTime('2013-02-10');//Dia dez é sempre um bom dia, ou ruim, para pagar as contas.
$data->add(new DateInterval('P1M'));
echo $data->format('d/m/Y');
Saída:
10/03/2013
Aqui você encontrará uma explicação detalhada:
http://forum.imasters.com.br/topic/483023-somar-minutos-a-hora/?p=1919441
Caso você possua a data em algum outro formato, basta especificá-lo, tal como:
$data = DateTime::createFromFormat('d/m/Y' , '10/02/2013');
Gabriel, obrigado pela dica, usei da seguinte forma:
function incrementaData($data) {
$data = new DateTime($data);
$data->add(new DateInterval('P1M'));
$retorno = $data->format('Y-m-d');
return $retorno;
}
Funcionou perfeitamente..
Obrigado mais uma vez.
cade o objeto despesa? e por que exatamente você classificou isso como objeto?
por que existe código procedural?
eu fiquei confuso quanto a sua utilização de OO.
se seu nível for um pouco alto procure trabalhar com as interfaces