entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Lógica para uso de puntos (saldo, credito) en PHP

Hola a todos, estoy desarrollando un sistema donde los usuarios puedes comprar puntos o solicitar crédito, las premisas para el consumo se puntos o crédito son las siguientes:

° Si el usuario tiene puntos se consume la cantidad de puntos.
° Si el usuario no tiene puntos, entonces se consume el crédito, pero que quita la misma cantidad en puntos (puntos en negativo).

El query que estoy utilizando para quitar los puntos es:

UPDATE sired_asociacion_meta
SET meta_value = ( CAST(meta_value AS DECIMAL(9,4)) - 1 )
WHERE (asociacion_id = :id AND meta_key = ':metaPuntos' ) 

He pensado en repetir la linea cuando se trata de quitar crédito pero se me hace una carga para la base de datos enviar dos consultas de actualización cuando ambas tendrán el mismo efecto, por lo que me gustaría saber si es posible actualizar ambos campos en una sola petición.


La tabla tiene esta estructura.

meta_id           bigint(20)
asociacion_id     bigint(20)
meta_key          varchar(64)
meta_value        longtext

NOTA: No puedo crear procesos en la base de datos ya que no tengo acceso a ella.

2 Respuestas

2votos

Leonardo-Tadei Puntos227320

Hola,

podrías aclarar un poco más el escenario?

De la forma en que está planteado tu problema, no debería haber inconveniente en que, cuando se acabe el saldo, simplemente seguir descontando la cantidad: los puntos negativos serán el crédito, y los puntos positivos serán saldo sin usar.

No se desprende bien de tu planteo bi de las tablas: tendrá algún sentido que los nombres de los campos sean tan genéricos (pero no lo sabemos) como también tendrá algún sentido que estés guardando un saldo en un campo de texto y haciendo todo ese trabajo para castearlo a decimal y poder operar sobre eĺ, siendo que es mucho más simple, rápido y seguro que el campo sea float o decimal (pero tampoco lo sabemos).

0voto

carlossevi comentado

Tiene toda la pinta de que está utilizando una tabla por defecto de algún CMS. Se parece sospechosamente a la tabla wp_usermeta de WordPress.

Yo en mi anterior respuesta entendía que no tenía acceso a cambiar la BBDD ni su diseño y por eso no he ido por este camino. Sin embargo, como apuntas, eso parece lo idóneo ya que parece que la BBDD está mal diseñada para el uso que le quiere dar.

0voto

MrGenis comentado

En el escenario lo que controlamos con estos puntos es la activación de registros en dentro de una organización, cada punto es una persona y para obtenerlo se tiene que pagar primero ( como una tarjeta de pre-pago ), el crédito es una forma de otorgar puntos cuando la asociación se queda sin ellos pero se compromete a pagarlos, por eso solo se utilizan cuando los puntos están en cero.


Es correcto lo que me dices, de echo le propuse al equipo encargado de la base datos si podía hacer una tablas especifica para este fin, sobre todo para no cargar con trabajo al servidor de la base de datos, total me dieron que que la pondrían pero aún no esta, de echo estamos teniendo problemas con la base de datos por esta causa.

Por lo que les entiendo una tabla con esta estructura sería la ideal

asociacion_id   BIGINT
punto           DECIMAL(9,4)
credito         INT

0voto

Leonardo-Tadei comentado

Buenas,

con el diseño de tabla que planteás, la cosa sería mucho mejor, ya que si usás "crédito" para contener el máximo de deuda que puede tener el asociado, entonces el descuento de puntos será siempre una sola query que modifica "punto", y su valor nunca debería paasr el valor negativo de "credito", es decir, si "credito" vale 100, el menor valor posible de "punto" será -100.

Todo esto se puede poner en una sola query.

Por qué "punto" tiene 4 decimales y crédito es "entero"? Sin conocer detalles, supongo que ambos campos deberían ser del mismo tipo.

Saludos!

0voto

MrGenis comentado

Respondiendo final para cerrar.
La comuna de "punto" tiene cuetro decimales por que resulta de la división de un monto en dinero entre el costo del "punto" ( $ 2500.00 / 230.50 ), esto para evitar problemas cuando quieren completar el punto pagando lo faltante. El de "credito" es entero ya que es fijado por la administración y como sabemos no podemos partir un punto en partes ya que es consumido en su totalidad.


Hoy por fin habilitaron la table que mencione y se nota una diferencia de 1ms comparada con la anterior forma.

1voto

carlossevi Puntos63580

Vamos a ver si te he entendido bien:

Interpreto que los créditos y los puntos de un usuario (asociacion_id) están en dos registros diferentes. Por ejemplo, un usuario con 100 puntos y 500 créditos:

meta_id         asociacion_id       meta_key        meta_value
--------------------------------------------------------------------
1               34                  metaPuntos      100
2               34                  metaCreditos    500

En caso de ser así, por mucho que para ti sea "actualizar dos campos en una sola petición" en realidad es actualizar dos registros con dos valores diferentes y diferentes criterios de selección.

Para mi no hay otra forma de hacerlo que no sea con sendas consultas.

Algo que yo implementaría es que ambas consultas sean enviadas a la BBDD dentro de una misma transacción, para asegurar la consistencia de los datos ya que se corresponden a la misma operación.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta