Foros del Web » Programando para Internet » PHP »

Tickets y montos

Estas en el tema de Tickets y montos en el foro de PHP en Foros del Web. Tengo esto rompiendome la cabeza desde hace unos dias y hasta ahora nada, les explio a ver si alguien tiene una idea de como hacerlo ...
  #1 (permalink)  
Antiguo 13/11/2006, 17:53
 
Fecha de Ingreso: enero-2003
Mensajes: 516
Antigüedad: 21 años, 3 meses
Puntos: 0
Tickets y montos

Tengo esto rompiendome la cabeza desde hace unos dias y hasta ahora nada, les explio a ver si alguien tiene una idea de como hacerlo
Tengo una tabla llamada tickets, la cual es asi:
Código HTML:
id  | valor | cantidad
---------------------------
1  | 1 |     50
2  | 2 |     50
3  | 5 |     50
4  | 10 |   50
5  | 20 |   50
6  | 50 |  50
donde valor es el valor de cada ticket y cantidad es la cantida de tickets de esa denominacion disponible, de tal manera que si yo ingreso 60 dolares, el php debe devolverme 1 ticket de 50 y 1 de 10, que juntos suman 60 dolares, si ingreso 35 dolares me debe devolver 1 ticket de 20, 1 de 10 y 1 de 5 y asi sucesivamente pàra cada cantidad ingresada.
Estoy que me doy vueltas y hasta ahora nada.

Gracias de antemano.
  #2 (permalink)  
Antiguo 13/11/2006, 20:35
Avatar de ArrauKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 21 años, 5 meses
Puntos: 4
No tengo idea si eso que expones es una tarea, o algo parecido, pero si no lo es, yo no lo haría así como tu quieres. El motivo es que al ingresar suficiente dinero, pueden surgir muchas combinaciones que satisfagan el problema.

Tengo 2 alternativas:
- primero solicitar los tickets, calcular la suma de los valores, y pedir el dinero, luego ejecutar al compra (ingresar el dinero y restar lo tickets)

- ingresar dinero, pero cuando surjan varias combinaciones posibles, que te de a elegir de algun menu o algo cual combinación le parece mejor al usuario.

en ambos casos tendrías que pedir la intervencion del usuario.

Ahora, si insistes en que al ingresar dinero, automáticamente escoja "los mejores" tickets, vas a tener que definir mejor en tu algoritmo que tickets tienen mayor prioridad.

yo con 60 dolares podría comprar 50 de 1 y 5 de 2, etc...
__________________
Blog | Tecnosquad
  #3 (permalink)  
Antiguo 13/11/2006, 20:39
 
Fecha de Ingreso: enero-2003
Mensajes: 516
Antigüedad: 21 años, 3 meses
Puntos: 0
Basaicamente lo q predomina es siempre gastar los tickets de mayo denominacion.

Por ejemplo:
si es 65 dolares, lo ideal es
-1 ticket de 50
-1 de 10
- 1 de 5
claro que si nohay tickets de 10 seria
-1 ticket de 50
- 3 de 5

por lo mismo hay un campo con la cantidad disponible de tickets

Gracias
  #4 (permalink)  
Antiguo 13/11/2006, 22:09
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 18 años, 3 meses
Puntos: 5
Buenas, en ese caso, lo que tendrias que hacer es recorrer cada una de las denominaciones, de la mayor a la menor. En cada vuelta, deberías restar el valor de esa denominación, si todavía quedan tickets disponibles y si el valor del ticket no es mayor a lo que falta para cubrir el total. Y básicamente, es eso. Necesitás un par de variables de control y algunos contadores y la base del esquema estaría.

Un ejemplo de esto aplicado (lo probé con un par de valores y funciona, pero lo hice al vuelo así que puede tener algunos errores o puede no ser lo más óptimo; el $montoMaximo te convendría tomarlo dinámicamente)

Código PHP:
<?php

$tickets
[] = array('valor'=>1,'cantidad'=>10);     //     10
$tickets[] = array('valor'=>2,'cantidad'=>10);     //     20
$tickets[] = array('valor'=>5,'cantidad'=>10);     //     50
$tickets[] = array('valor'=>10,'cantidad'=>10); //    100
$tickets[] = array('valor'=>20,'cantidad'=>10); //     200
$tickets[] = array('valor'=>50,'cantidad'=>10); //    500

$montoMaximo 890;
$montoRequerido 538;

$checkSuma 0;

$tab '&nbsp;&nbsp;&nbsp;&nbsp;';

$resultado = array();

for (
$i=count($tickets)-1;$i>=0;$i--) {
    
$arrTicketActual $tickets[$i];
    
$cantidad         $arrTicketActual['cantidad'];
    
$valor             $arrTicketActual['valor'];
//    echo "VALOR::$valor<br>";
    
    
$cantTicketsValor 0;
    
// mientras:
    //        1) haya tickets
    //        2) el valor del ticket sea menor o igual a lo que falta para completar lo pedido
    //        3) lo acumulado sea menor a lo pedido
    
while ($cantidad && $montoRequerido $checkSuma >= $valor && $checkSuma $montoRequerido) {

        
$checkSuma += $valor;
        
$cantidad--;
        
$cantTicketsValor++;

//        echo "$tab" . "CANTIDAD: $cantidad <br>";
    
    
}
    
    if (
$cantTicketsValor 0) {
        
$resultado[] = array('valor'=>$valor,'cantidad'=>$cantTicketsValor);
    }

}

if (
$checkSuma !== $montoRequerido) {
    echo 
"NO SE PUDO ENTREGAR LA SUMA PEDIDA<br>";
    echo 
"suma entregada:$checkSuma<br>";
    echo 
"suma pedida:$montoRequerido<br>";
} else {
    echo 
"OK:<br>";
    foreach(
$resultado as $r) {
        echo 
"$tab" "Valor Ticket:{$r['valor']}<br>";
        echo 
"$tab" "Cantidad Ticket:{$r['cantidad']}<br>";
    }
    
    
}
/**
echo '<pre>';
print_r($resultado);
echo '</pre>';
*/
?>

Un tema: Tendrías que ver si necesitás más validaciones y, si estás usando base de datos, tené en cuenta que no va a ser realmente "seguro" a menos que uses transacciones (creo que en mysql se puede hacer a partir de la versión 5, este artículo explica el problema --en inglés--: http://www.samspublishing.com/articl...p=29312&rl=1); La idea sería bloquear las tablas mientras estás haciendo las cuentas. Podría pasar (al menos en teoría, y creo que tendrías que tener bastante mala leche) una situación como la siguiente. Supongamos que el usuario A pide $100. Hay $150 en total, todos tickets de $50 (para simplificar). Mientras estás haciendo los cálculos, entra el usuario B y pide también $100. Pero la consulta a la base va a devolver que hay $150 disponibles, porque como está procesándose, el pedido de A no hizo ninguna actualización en la base.

Entonces, terminás de calcular el pedido A, le das $100 y descontás 2 tickets de la base. Pero cuando termines de calcular el pedido de B, también le vas a dar $100, cuando en realidad sólo te quedan $50.

Bueno, todo esto en realidad es hilar más bien fino, si no estás haciendo algo tipo home banking o por el estilo, un error de este tipo tal vez sea un probabilidad (baja) aceptable.

Suerte
Califa

Última edición por califa010; 13/11/2006 a las 22:26
  #5 (permalink)  
Antiguo 13/11/2006, 22:40
 
Fecha de Ingreso: enero-2003
Mensajes: 516
Antigüedad: 21 años, 3 meses
Puntos: 0
Gracias por la ayuda amigo
Pero aun no puedo pasarlo a trabajar con la bd, todo esa data de valor y cantidad lo tengo en una tabla

Código HTML:
id  | valor | cantidad
---------------------------
1  | 1 |     50
2  | 2 |     50
3  | 5 |     50
4  | 10 |   50
5  | 20 |   50
6  | 50 |  50
y no logro pasarlo
__________________
El PISCO SOLO PUEDE SER PERUANO....SALUD!
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 05:52.