CREATE OR REPLACE VIEW view_proxima_aportacion_ahorro AS
SELECT idahorro, 
	idsocio, 
	concat(primer_nombre, ' ', primer_apellido) nombre, 
	idfinca, 
	fecha_inicio_aportaciones, 
	monto_aportacion_inicial,
	cantidad_pagos_aportacion_inicial, 
	a.aportacion_inicial_pagado, 
	cuota_aportacion_inicial, 
	saldo_aportacion_inicial,
	monto_aportacion_ordinaria, 
	a.periodicidad, 
	a.fecha_ultimo_aporte,
	CASE 
		WHEN saldo_aportacion_inicial > 0 AND saldo_aportacion_inicial <= cuota_aportacion_inicial THEN saldo_aportacion_inicial
		WHEN saldo_aportacion_inicial > 0 AND saldo_aportacion_inicial > cuota_aportacion_inicial THEN cuota_aportacion_inicial
		ELSE monto_aportacion_ordinaria
	END monto_siguiente_aporte,
	CASE 
		WHEN saldo_aportacion_inicial > 0 THEN 1
		ELSE 2
	END idtipo_siguiente_aporte,
	CASE 
		WHEN a.fecha_ultimo_aporte IS NULL THEN a.fecha_inicio_aportaciones
		WHEN a.periodicidad = 30 then DATE_ADD(a.fecha_ultimo_aporte, INTERVAL 1 MONTH )
		ELSE DATE_ADD(a.fecha_ultimo_aporte, INTERVAL a.periodicidad DAY )
	END fecha_siguiente_aporte
FROM
(
	SELECT a.idahorro,
	a.fecha_inicio_aportaciones,
	a.monto_aportacion_inicial,
	a.monto_aportacion_ordinaria,
	a.cantidad_pagos_aportacion_inicial,
	s.idsocio,
	s.primer_nombre,
	s.primer_apellido,
	s.idfinca,
	ifnull(sum(ifnull(mi.monto, 0)), 0) aportacion_inicial_pagado,
	(monto_aportacion_inicial - ifnull(sum(ifnull(mi.monto, 0)), 0) ) saldo_aportacion_inicial,
	round( (a.monto_aportacion_inicial / a.cantidad_pagos_aportacion_inicial),2) cuota_aportacion_inicial, 
	max(m.fecha_aporte) fecha_ultimo_aporte, tp.periodicidad
FROM marinala_operacion.ahorro a
INNER JOIN marinala_operacion.socio s ON a.idsocio = s.idsocio
INNER JOIN marinala_operacion.tipo_planilla tp ON s.idtipo_planilla = tp.idtipo_planilla
LEFT JOIN marinala_operacion.ahorro_movimiento mi ON a.idahorro = mi.idahorro
AND mi.idtipo_movimiento_ahorro = 1
LEFT JOIN marinala_operacion.ahorro_movimiento m ON a.idahorro = m.idahorro
WHERE a.estado = 'ACTIVO' AND s.estado = 'ACTIVO'
GROUP BY a.idahorro) a;