Ver Mensaje Individual
  #1 (permalink)  
Antiguo 05/07/2011, 01:59
Avatar de SIW
SIW
 
Fecha de Ingreso: octubre-2009
Mensajes: 9
Antigüedad: 15 años, 4 meses
Puntos: 0
Procedimiento Almacenado con llamado desde Trigger

Buenas quisiera por favor me den luz... les comento estoy desarrollando un sistema de nomina y pretendo automatizar la amortización de los prestamos de cada uno de los empleados de la empresa donde trabajo. Programo en PHP Bajo MySQL. (Humildemente digo que no me siento tan novato en PHP ni MySQL, pero pues estoy aquí necesitando ayuda, la que me puedan brindar). Estoy muy agradecido por los colaboradores que han venido despejando dudas con sus conocimientos a aquellas personas que lo han necesitado, Yo hace tiempos vengo aprendiendo a través de estos foros, y a partir de hoy participo pidiendo sus conocimientos, es mi primera vez, pero espero solucionar mi problema.

Bueno les comento tengo una tabla prestamos donde capturo los siguientes campos:

Código MySQL:
Ver original
  1. Campo               Tipo              Cotejamiento      Atributos   Nulo        Predeterminado    Extra
  2. count               int(11)                             UNSIGNED    No        None              AUTO_INCREMENT                         
  3. tip_prestamo        varchar(5)      utf8_general_ci                 No        None                             
  4. cod_prestamo        varchar(25)     utf8_general_ci                 No        None                             
  5. id_usuario        int(11)                               UNSIGNED      No          None                             
  6. cod_banco           varchar(5)      utf8_general_ci                 No        None                             
  7. fecha_inicial       date                                              No          0000-00-00                               
  8. fecha_final       date                                              No        0000-00-00                               
  9. no_credito        varchar(30)       utf8_general_ci                 No        None                             
  10. plazo_meses       int(11)                               UNSIGNED      No          0                            
  11. valor_prestamo    int(11)                               UNSIGNED      No          0                            
  12. valor_cuota_bco   int(11)                               UNSIGNED      No          0                            
  13. valor_cuota_1       int(11)                             UNSIGNED      No          0                            
  14. valor_cuota_2       int(11)                             UNSIGNED      No          0                            
  15. saldo               int(11)                             UNSIGNED      Sí          0                            
  16. estado            tinyint(2)                          UNSIGNED    No          None                             
  17. observaciones       blob                                  BINARY        Sí        NULL                             
  18. usr_up            int(11)                               UNSIGNED      Sí          NULL                             
  19. fec_up            datetime                                      Sí        0000-00-00 00:00:00                              
  20. usr_reg           int(11)                               UNSIGNED      No          None                             
  21. fec_reg           timestamp                                         No                              CURRENT_TIMESTAMP

como se pueden dar cuenta la empresa paga en dos períodos quincenales.
Necesito por favor me aclaren de como debo hacer un procedimiento almacenado donde se registre el valor del pago efectuado y que este a su vez debe ir acorde con las cuotas programadas, que se generará una vez ingresado el crédito al sistema nomina para ello tengo otra tabla plan_pagos con los siguientes campos:


Código MySQL:
Ver original
  1. Campo               Tipo          Cotejamiento      Atributos   Nulo    Predeterminado  Extra
  2. count               int(11)                                     No    None            AUTO_INCREMENT                           
  3. id_usuario        int(11)                                       No    None                             
  4. tip_prestamo        varchar(5)  utf8_general_ci               No      None                             
  5. cod_prestamo        varchar(25) utf8_general_ci               No      None                             
  6. no_credito        varchar(30)   utf8_general_ci               No      None                             
  7. cons_cuota        int(11)                                       No    None                             
  8. fecha_pago        date                                        No      None                             
  9. valor_cuota       int(11)                                       No    None                             
  10. fecha1_pago_cta   date                                        No      None                             
  11. valor1_pago_cta   int(11)                                       No    None                             
  12. fecha2_pago_cta   date                                        No      None                             
  13. valor2_pago_cta   int(11)                                       No    None                             
  14. saldo_cuota       int(11)                                       No    None                             
  15. flag_pago           bit(1)                                      No    None                             
  16. fec_reg           timestamp                      on update CURRENT_TIMESTAMP    No  CURRENT_TIMESTAMP   ON UPDATE CURRENT_TIMESTAMP                        
  17. usr_reg           int(11)                                       No  None

fecha1_pago_cta // fecha de pago en la primera quincena
valor1_pago_cta // valor pagado en la primera quincena
fecha2_pago_cta // fecha de pago en la segunda quincena
valor2_pago_cta // valor pagado en la segunda quincena
saldo_cuota // este valor debería ser cero después de la segunda quincena
flag_pago // campo tipo bit con valor cero si esta pagada la cuota y valor uno si esta pendiente de pago o tiene saldo

Requiero que para pago el procedimiento almacenado buscará en la tabla plan_pagos donde el número del crédito = ncredito y flag_pago = 1 ordenado por fecha propuesta de pago.

La idea sería algo así:

// Fecha y pago de la quincena 1uno:

Si diafecha>=1 y diafecha=<15 entonces
Leerregistro
Modificar fecha1_pago_cta = fecha
Modificar valor1_pago_cta = pago
Modificar saldo_cuota = Valor de la cuota-pago
Si saldo_cuota = 0 entonces
Modificar flag_pago = 0
finsi
finsi

// Fecha y pago de la quincena dos:

Si diafecha>15 y diafecha<31 entonces
Leerregistro
Modificar fecha2_pago_cta = fecha
Modificar valor2_pago_cta = pago
Modificar saldo_cuota = Valor de la cuota-pago
Si saldo_cuota = 0 entonces
Modificar flag_pago = 0
finsi
finsi


Y esto es apenas lo que llevo del procedmiento almacenado:
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_pagos`(INOUT pagador_actual INT, INOUT numero_credito INT)
  4. DECLARE pago_actual_1 INT DEFAULT 0;
  5. DECLARE suma INT;
  6. DECLARE ultimo_dia_mes INT;
  7. DECLARE mitad_dia_mes INT;
  8. DECLARE existe BOOL;
  9. SET @ultimo := LAST_INSERT_ID();
  10. SELECT IFNULL(sum(prestamos.valor_cuota_1),0) AS total_cuotas_1,  
  11. IFNULL(sum(prestamos.valor_cuota_2),0) AS total_cuotas_2
  12. INTO suma
  13. FROM usuarios
  14. INNER JOIN prestamos
  15. ON usuarios.id_usuario = prestamos.id_usuario
  16. WHERE usuarios.estado = 1
  17. AND usuarios.per_nomina = 'S';
  18. SET pago_actual_1 = pago_actual_1 + (suma);
  19.  
  20. SELECT COUNT(0) = 0 INTO existe FROM prestamos
  21. WHERE usuarios.no_credito = numero_credito AND usuarios.id_usuario = pagador_actual;
  22.  
  23. IF existe THEN
  24.  
  25. UPDATE plan_pagos SET saldo_cuota = saldo_cuota + pago_actual_1
  26. WHERE usuarios.no_credito = numero_credito AND usuarios.id_usuario = pagador_actual;
  27. INSERT INTO plan_pagos (no_credito, plan_pagos.id_usuario, saldo_cuota) VALUES (plan_pagos.numero_credito, pagador_actual, valor1_pago_cta);


Sé que me falta para que me cálcule las fechas fecha1_pago_cta y fecha2_pago_cta y además terminarlo y es aquí donde les pido los conocimientos necesarios para ayudarmen con esta rutina,
La verdad es que siento que me estoy complicando la vida, pero quisiera realizar poder realizar esto con ayuda de ustedes utilizando un solo procedimiento almacenado con llamado desde un trigger que podría ser algo así:

Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP TRIGGER `nomina`.`trigger_pagos`$$
  3. CREATE TRIGGER `nomina`.`trigger_pagos` AFTER INSERT on `nomina`.`prestamos`
  4. CALL sp_pagos(pagador_actual, numero_credito);
  5. END$$
  6. DELIMITER ;

Esto es todo, de una manera atenta espero ayuda de ustedes.
Prometo participar en lo que esté a mi alcance. Gracias desde ya señores.