Foros del Web » Programando para Internet » PHP »

Cómo puedo hacerlo?

Estas en el tema de Cómo puedo hacerlo? en el foro de PHP en Foros del Web. Hola a todos. Tengo un problema y ya me puso a pensar bastante y no logro una solución correcta. Estoy haciendo un sistema para una ...
  #1 (permalink)  
Antiguo 12/01/2008, 19:43
 
Fecha de Ingreso: febrero-2007
Mensajes: 104
Antigüedad: 17 años, 9 meses
Puntos: 0
Cómo puedo hacerlo?

Hola a todos.

Tengo un problema y ya me puso a pensar bastante y no logro una solución correcta.

Estoy haciendo un sistema para una empresa de cable. Bueno, el asunto es que para un servicio extra (como cambio de cables, otra instalación, etc.) existe la posibilidad de que el cliente cancele en 3 pagos.

El gran problema es que a veces el total de la deuda asciende a una cantidad no exacta, quiero decir, con decimales y la división entre el total y el numero de pagos no es exacta, perdiéndose talvés una mínima cantidad de dinero pero como son muchísimos clientes esa pérdida se va incrementando.

Por ejemplo: el total es 66.82 y si fuera en 3 pagos, cada cuota sería de 22.27.

Y al multiplicar 22.27 * 3 daría 66.81.

Quisiera hacer que una cuota se pagara con decimales y las otras con cantidades exactas para que cuadre perfectamente con el total, pero no sé como hacer que el sistema lo haga automáticamente.

Me gustaría que fuera algo como esto:
cuota 1 = 22.82
cuota 2 = 22.00
cuota 3 = 22.00

Si la persona realiza un pago, guardo en una tabla esa información, y actualizo el campo "saldo restante".

Perdón por la cantidad de información que ingresé pero solo traté de explicarme bien, siempre gracias!!
  #2 (permalink)  
Antiguo 12/01/2008, 21:38
 
Fecha de Ingreso: diciembre-2007
Mensajes: 75
Antigüedad: 16 años, 11 meses
Puntos: 0
Re: Cómo puedo hacerlo?

Seria facil, averiguar las dos primeras cuotas, y la tercera se averigua del total menos las 2 primeras

podria ser este....

Código PHP:
<?php
function cuotas($a)
{
$b=round($a/3);
$c=array ($b$b$a-2*$b);
return 
$c;
}
$num=66.82;
$d=cuotas($num);
foreach(
$d as $e)
echo 
$e."<br>";
?>
Las cuotas son puestas en un array

PD: si quieres algo mas exacto cambia la linea 4 por $b=round($a/3, 2);
  #3 (permalink)  
Antiguo 12/01/2008, 22:55
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: Cómo puedo hacerlo?

Para ser más exactos, podría usarse la función floor(), similar a round(), solo que siempre redondea hacia el entero inmediato inferior (ceil() lo hace hacia el entero inmediato superior):

Código PHP:
function cuotas($total) {
    
$bc floor($total/3);
    return array(
1=>$total-$bc*2$bc$bc);
}
 
$num cuotas(66.82);
 
//Usamos number_format() para agregar los dos decimales
echo "CUOTA 1: ".number_format($num[1],2)." <br />";
echo 
"CUOTA 2: ".number_format($num[2],2)." <br />";
echo 
"CUOTA 3: ".number_format($num[3],2)." <br />"
Imprime:
Código:
CUOTA 1: 22.82 
CUOTA 2: 22.00 
CUOTA 3: 22.00
Un saludo,
  #4 (permalink)  
Antiguo 13/01/2008, 00:49
 
Fecha de Ingreso: diciembre-2007
Mensajes: 75
Antigüedad: 16 años, 11 meses
Puntos: 0
Re: Cómo puedo hacerlo?

la cosa es que al final pagan la cantidad exacta... :P pero bueno tengo que admitir q el tuyo se adapta mas.

gracias por la correccion ;)

Última edición por onZero; 13/01/2008 a las 01:09
  #5 (permalink)  
Antiguo 13/01/2008, 14:52
 
Fecha de Ingreso: febrero-2007
Mensajes: 104
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Cómo puedo hacerlo?

Hey, gracias voy a intentarlo, me imagino que tambien funcionaría para 2 pagos, si el total fuera 47.27 (este total es ficticio, es solo por si se diera un total asi).

Gracias, gracias.
  #6 (permalink)  
Antiguo 13/01/2008, 15:14
 
Fecha de Ingreso: febrero-2007
Mensajes: 104
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Cómo puedo hacerlo?

Ya pude arreglarlo para que funcione con 2 pagos tambien, de verdad muchas gracias.
  #7 (permalink)  
Antiguo 13/01/2008, 18:21
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 529
Antigüedad: 17 años, 11 meses
Puntos: 11
De acuerdo Re: Cómo puedo hacerlo?

Hola Amigos:

He aquí una función que programé y que se adapta para cualquier cantidad de cuotas y total.
Sólo debes indicar, el total, la cantidad de pagos y lo resuelve solo:

Veamos las funciones:

Código PHP:
function pagar($total,$cuotas) {
    
$bc floor($total/$cuotas);
 
 for (
$i=0$i $cuotas$i++) {
 
 
  if (
$i == 0) {
 
  
$pago[$i] = $total-($bc*($cuotas-1));
 
  }
  else {
 
  
$pago[$i] = $bc;
 
  }
 
 }
 
    return 
$pago;
}
function 
imprimir($pago) {
 foreach (
$pago as $indice => $valor) {
 
 echo 
"CUOTA ".($indice+1).": ".number_format($valor,2)." <br />";
 
 }

Ejemplo de Implementación:

Código PHP:
$total 56.82;
$cuotas 5;
$pago pagar($total,$cuotas);
imprimir($pago); 
Puedes cambiar los valores de $total y $cuotas como quieras.
El ejemplo anterior imprime en pantalla lo siguiente:

CUOTA 1: 12.82
CUOTA 2: 11.00
CUOTA 3: 11.00
CUOTA 4: 11.00
CUOTA 5: 11.00

Cabe destacar que estas funciones las hice en base a la idea de okram.
Espero sus opiniones.

Saludos
  #8 (permalink)  
Antiguo 13/01/2008, 18:37
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: Cómo puedo hacerlo?

Gran idea usermax, mi pequeño aporte sería
Código PHP:
for ($i=1$i <= $cuotas$i++) {
    
$pago[$i] = number_format((($i == 1) ? $total-($bc*($cuotas-1)) : $bc),2);

en vez de
Código PHP:
for ($i=0$i $cuotas$i++) {
    if (
$i == 0) {
        
$pago[$i] = $total-($bc*($cuotas-1));
    } else {
        
$pago[$i] = $bc;
    }

Básicamente, lo que hago es: UNO, simplificar el if mediante el signo de interrogacion y su :, DOS cambiar la sintaxis del foreach, para que me genere un array cuyos índices empiecen por 1 y no por 0, y TRES darle formato de 2 decimales al número desde un inicio.

Ahora, considero que la función imprimir() quedaría sin utilidad práctica, pues supongo que se necesitaría cada cuota por separado.

En todo caso, con los arreglos que hice, la función imprimir quedaría:

Código PHP:
function imprimir($pago) {
    foreach (
$pago as $indice => $valor) {
        echo 
"CUOTA $indice: $valor <br />";
    }
    return 
true;

y el uso tal y como lo pusiste al inicio.

Un saludo,
  #9 (permalink)  
Antiguo 13/01/2008, 18:52
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 529
Antigüedad: 17 años, 11 meses
Puntos: 11
De acuerdo Re: Cómo puedo hacerlo?

Excelente okram!!
O sea, quedaría al final asi:

Código PHP:
function pagar($total,$cuotas) {
    
$bc floor($total/$cuotas);
 
 for (
$i=1$i <= $cuotas$i++)
    
$pago[$i] = number_format((($i == 1) ? $total-($bc*($cuotas-1)) : $bc),2);
 
    return 
$pago;
}
function 
imprimir($pago) {
    foreach (
$pago as $indice => $valor)
 
$string .=  "CUOTA $indice: $valor <br />";
    return 
$string;
}  

$total 56.82;
$cuotas 5;
$pago pagar($total,$cuotas);
echo 
imprimir($pago); 
Hago que la funcion imprimir devuelva una cadena para poder usarla donde querramos. En esdte caso la imprimo en pantalla con un echo, pero a alguien le puede ser útil guardarla en alguna variable y mostrarla mas adelante.

Excelente!!!!
Saludos
  #10 (permalink)  
Antiguo 14/01/2008, 00:23
 
Fecha de Ingreso: febrero-2007
Mensajes: 104
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Cómo puedo hacerlo?

Muchas gracias amigos, me sirvieron bastante sus aportes.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:46.