Relatório de projeção mensal
Estou fazendo um relatório e como está complexo acho que estou fazendo da maneira errada.
Tenho uma tabela no BD só com as faturas dos pedidos de um sistema, os pedidos desse sistema têm recorrência mensal, semestral, anual e por aí vai, ou seja são geradas faturas do mesmo pedido até que o mesmo seja cancelado.
Preciso fazer um relatório de projeção mensal, ou seja pegar o valor da fatura do pedido cujo intervalo de recorrencia é maior que 1 e dividilo pelo seu intervalo de recorrencia e isso me daria desse pedido por mês.
Aí pra complicar eu preciso pegar as ultimas faturas dos pedidos e jogar pra frente, ou seja imaginar que tudo será renovado pra ter uma estimativa (fake obviamente) de valores, mas no meio disso eu tenho que ver se o pedido foi cancelado pois se ele foi cancelado ai sim eu não vou jogar ele pra frente, só jogarei aquele que não se sabe se vai renovar ou não.
Eu fiz da seguinte forma, fiz um loop de ano e dentro dele fiz um loop de mês, nesse loop eu fiz um select no bd pelas faturas desse mês e ano que o loop se encontra, ai nos ifs e elses da vida eu separei o que é mensal das outras, na outras eu fiz aquela divisão e fui quardando tudo na array, vou postar o codigo abaixo que é melhor pra ver.
$g = 0;
for($y=(date("Y")-1); $y<=(date("Y")+1); $y++) : // ano
for($m=1; $m<=12; $m++) : // meses do ano
$this->nomesMeses($m); // pega o nome dos meses
$resultado[$y][$m]['mes'] = $this->mesNome;
$sql = "SELECT order_id, id, atual_debit, recurrence_interval, amount FROM anuncios_retorno
WHERE atual_debit LIKE '%/".$m."/".$y."'
GROUP BY order_id";
$query = mysql_query($sql) or die (mysql_error());
for($i=0; $i<mysql_num_rows($query); $i++) : // qtd de faturas
$resulOrder[$i] = mysql_fetch_array($query);
//if ( $resulOrder[$i]['recurrence_interval'] > 1 && $y >= date("Y") ) {
if ( $resulOrder[$i]['recurrence_interval'] > 1 ) {
$calDivisao[$y][$m][$i] = $resulOrder[$i]['amount'] / $resulOrder[$i]['recurrence_interval'];
// coloquei o $x<=($m+$resul
for( $x=($m+1); $x<($m+$resulOrder[$i]['recurrence_interval']); $x++ ) {
if ( $x < 12 ) {
$fakeMensalRep[$g] = array( "ano" => $y, "mes" => $x, "pedido" => $resulOrder[$i]['order_id'], "valor" => $calDivisao[$y][$m][$i] );
$g++;
} elseif ( $x > 12 && $x < 24 ) {
$fakeMensalRep[$g] = array( "ano" => $y+1, "mes" => $x-12, "pedido" => $resulOrder[$i]['order_id'], "valor" => $calDivisao[$y][$m][$i] );
$g++;
} elseif ( $x > 24 && $x < 36 ) {
$fakeMensalRep[$g] = array( "ano" => $y+2, "mes" => $x-24, "pedido" => $resulOrder[$i]['order_id'], "valor" => $calDivisao[$y][$m][$i] );
$g++;
}
}
}
$sqlForm = "SELECT *, SUM(amount) AS valorSum FROM anuncios_retorno
WHERE id = '".$resulOrder[$i]['id']."'
AND recurrence_interval <= 1
GROUP BY order_id";
$queryForm = mysql_query($sqlForm) or die (mysql_error());
$resulForm[$y][$m][$i] = mysql_fetch_array($queryForm);
$resultado[$y][$m]['valorMes'] = $resultado[$y][$m]['valorMes'] + $resulForm[$y][$m][$i]['valorSum'] + $calDivisao[$y][$m][$i];
endfor;
if ( $fakeMensalRep ) {
foreach ( $fakeMensalRep as $fake ) {
if ( $fake["ano"] == $y && $fake["mes"] == $m ) {
$resultado[$y][$m]['valorMes'] = $resultado[$y][$m]['valorMes'] + $fake["valor"];
// aqui soma a projeção dos pedidos sozinho, pois estão no mês que ainda não chegou, ou seja não tem pedido real do mês
$resultado[$y][$m]['valorMesFake'] = $resultado[$y][$m]['valorMesFake'] + $fake["valor"];
}
}
}
endfor;
endfor;
return $resultado;
Eu só consegui jogar o valor das faturas reais pra frente, preciso pegas dos pedido que supostamente não serão cancelados e tirar os que já estão cancelados do meio, mas tb tô achando essa minha solução muito complexa, alguém pode me dar uma dica?
Vlw
Discussão (2)
Carregando comentários...