https://foro.gambas-es.org/viewtopic.php?f=7&t=4032&p=22728#p22728
-----------------------------------
jguardon
Domingo, 10 Agosto 2014, 12:28

Programa para elegir ganador en sorteo gambas-es.org
-----------------------------------
Hola a todos/as

Como ya anuncié anteriormente y se recoge en las bases, vamos a hacer entre todos los que queráis colaborar un programa para elegir ganador de el sorteo actual de manera que sea lo más justo y transparente posible basándonos en el fichero que genera el sistema Kapipal donde se recogen las donaciones y en la generación de un número aleatorio en tiempo real desde Internet.

Paso a explicar los puntos que deben tenerse en cuenta:

[list=1]
[*] El diseño ha de ser lo más simple posible, sin colores chillones, imágenes ni nada. Limpio y usando contenedores Hbox, Vbox, etc. Más abajo hay un mockup de ejemplo.
[*] El fichero csv con la lista de participantes lo descargaré llegado el momento de la página de las donaciones y será el que use el programa.
[*] El programa abrirá un diálogo para elegir el fichero .csv y comprobará si éste es el correcto (por ejemplo por el número de campos y alguna cabecera)
[*] Si es correcto, se cargará en un gridview para mostrar los registros y se eliminarán los campos vacíos, comillas, etc.
[*] Internamente el programa cargará esos datos en objetos array de estructuras mediante split y calculará el número de participaciones según la cantidad en "Reward".
[list]
[*] Hay que tener en cuenta que donaciones por debajo de 10 euros no tienen recompensa, por lo tanto no participan.
[*] Si hay participantes que han colaborado más de una vez, hay que tener en cuenta que la cantidad "Reward" se suma a su total.
[*] Cuando sepamos la cantidad final de participaciones por cada participante (mirar las bases [url=http://blog.gambas-es.org/sorteo/bases/]aquí) hay que crear un objeto que mapee un participante repetido tantas veces como participaciones tenga con un número consecutivo asignado por cada participación. Por ejemplo:

[font=Courier New]2014-03-09 19:29:03;20;EUR;"Curro";"Jiménez";"pacoloco@email.no";"";"";"";"";"";"20";"False";"Completed"[/font]

Curro Jiménez ha donado 20 euros por lo que tiene 2 participaciones. Pero si nos fijamos, ha donado dos veces, por lo que hay que sumar la otra:

[font=Courier New]2014-06-15 19:29:03;20;EUR;"Curro";"Jiménez";"pacoloco@email.no" ;"";"";"";"";"";"20";"False";"Completed"[/font]

Entonces este señor tiene 4  participaciones que debemos mapear en un objeto posiblemente así:

Numero sorteo, participante

2, Curro Jimenez
3, Curro Jimenez
4, Curro Jimenez
5, Curro Jimenez

y seguimos con el siguiente:

6, Franco Tirador
7, Loco Lacolina
8, Loco Lacolina
9, Loco Lacolina
10, Loco Lacolina
11, Loco Lacolina

El resultado será un objeto (¿colección?) conteniendo como [i]key[/i] el número asignado para el sorteo y como [i]value[/i], el nombre del participante.

[*] Llega el momento de escoger un número comprendido en el rango de números resultantes desde el 1 al n. Para ello recurrimos a una fuente de números aleatorios fiable y aleatorios de verdad, no pseudoaleatorios.
[*] Usando un servicio web http://www.random.org podemos mediante la clase [i]httpclient[/i] obtener dicho número mediante una API que proporciona dicho servicio:

[code linenumbers=false]http://www.random.org/integers/?num=1&min=1&max=N&col=1&base=10&format=plain&rnd=new[/code]
Nota: [i]No abusar con las peticiones a esta web, si excedéis el límite, vuesta IP puede ser baneada!![/i]

El único parámetro que hay que cambiar es max=N, siendo N el número máximo resultante de la colección anterior.

El número resultante se buscará en la colección y ya tenemos ganador.
[/list]
[*] Una vez conocido el ganador, se marcará el registro correspondiente en el gridview con otro color y usando la dirección de correo electrónico, se le enviará un mensaje informativo usando sólo las clases de gambas smtp.
[*] El programa debería de estar finalizado, probado y libre de bugs antes del día 5 de septiembre.
[*] El día 7 de septiembre se procederá a su utilización para elegir al ganador y el proceso será grabado en vídeo y probablemente emitido en directo a través de hangouts, para el que quiera seguirlo. Se anunciará la hora exacta llegado el momento.
[/list]

Creo que eso es todo. Por supuesto, el algoritmo es uno de tantos que se pueden usar, pero no el único, por lo que podemos discutirlo en este mismo hilo, que usaremos para intercambiar ideas y código. 

Ánimo, ya tenemos tarea para no aburrirnos durante las vacaciones  :cool: 


Listado de ejemplo csv. Más abajo podéis descargar el fichero de ejemplo para realizar las pruebas.

[code linenumbers=true syntax=python]
"Date";"Amount";"Currency";"First Name";"Last Name";"Email";"Address";"Zip/Postal Code";"City";"State/Province";"Country";"Reward";"Offline";"PayPal Status"
2014-03-09 23:40:06;40;EUR;"Pepito";"Palotes";"pepalo@email.que";"";"";"";"";"";"40";"False";"Completed"
2014-03-09 19:29:03;20;EUR;"Curro";"Jiménez";"pacoloco@email.no";"";"";"";"";"";"20";"False";"Completed"
2014-03-10 19:03:01;10;EUR;"Franco";"Tirador";"frtirano@mbox.li";"";"";"";"";"";"10";"False";"Completed"
2014-04-10 19:03:01;50;EUR;"Loco";"Lacolina";"locolc@liame.moc";"";"";"";"";"";"50";"False";"Completed"
2014-05-09 19:29:03;5;EUR;"Leandro ";"Gado";"yonki@punto.pelota";"";"";"";"";"";"";"False";"Completed"
2014-06-15 19:29:03;20;EUR;"Curro";"Jiménez";"pacoloco@email.no" ;"";"";"";"";"";"20";"False";"Completed"
2014-08-01 16:22:01;20;EUR;"Aitor";"Tilla";"depatatas@concebolla.com";"";"";"";"";"";"20";"False";"Completed"
2014-08-01 16:22:01;10;EUR;"Rosa";"Melpito";"con@cuidado.ar";"";"";"";"";"";"10";"False";"Completed"
[/code]

Maqueta del posible aspecto del programa:
 [img]http://foro.gambas-es.org/files/images/3/sorteo_app.png[/img] 


Programa usado para generar la maqueta (GPL):
http://pencil.evolus.vn/

Saludos


