#region Usings
using System;
using System.Collections;
using Dominio;
using Dominio.Autorizaciones;
using Dominio.Afiliados;
using Dominio.Planes;
using Reportes;
using System.IO;
using com.db4o;
#endregion Usings
namespace Controlador
{
///
/// Clase controlador que lleva a cabo el CU "Recibir y Cotejar Consumos y Prestaciones"
///
public class RecibirPrestacionesController : Controller
{
#region Constructores
public RecibirPrestacionesController()
: base()
{
}
#endregion Constructores
#region Campos Privados
private ConsumoAfiliadosReport _reporteConsumo = new ConsumoAfiliadosReport();
private PrestacionesRealizadasReport _reporteAprobaciones = new PrestacionesRealizadasReport();
#endregion Campos Privados
#region Creacion de Datos en la BD
public void InsertarDatosNecesarios()
{
//PRESTADOR
Prestador pre = new Prestador();
pre.Cuit = "30-12345678-1";
ObjectSet os = this.Db.get( pre );
if ( (os == null) || (os.size() == 0) )
{
Dominio.SDireccion dir;
dir.Calle = "Gaona"; dir.CodigoPostal = "AB1504"; dir.Departamento = "";
dir.Numero = 1234; dir.Piso = 0; dir.Provincia = Dominio.EProvincia.CAPITAL_FEDERAL;
dir.Telefono = "5056-4567";
pre.Direccion = dir;
pre.Email = @"roberto@sancamilo.com";
pre.FechaBaja = DateTime.MinValue;
pre.Nombre = "Clinica San Camilo";
pre.Password = "camilo";
pre.Zona = new SZona( "Caballito", "Zona de Caballito" );
this.Db.set( pre );
}
//AUTORIZACIONES
AutorizacionAutomatica a = new AutorizacionAutomatica();
a.Codigo = 123;
os = this.Db.get( a );
if ( (os == null) || (os.size() == 0) )
{
Solicitante sol = new Solicitante( ETipoDocumento.DNI, 28123456, "Jorge", "Drexler" );
Plan plan = new Plan( 10F ); plan.Codigo = 3;
Afiliado afil = new Afiliado( sol, plan, new DateTime(2004, 4, 30 ) );
afil.Codigo = 987;
a.Afiliado = afil;
a.Prestacion = new Prestacion( "B01AC06", "Acido acetilsalicílico" );
a.Prestador = pre;
a.FechaSolicitud = new DateTime( 2005, 5, 20 ); // 20 de mayo
a.FechaRealizacion = DateTime.MinValue;
a.FechaVencimiento = a.FechaSolicitud.AddMonths( 2 ); // 20 de julio, aprox
a.Aprobada = true;
a.PorcentajeCobertura = 12.5F;
this.Db.set( a );
}
else
{
Autorizacion aut = (ObjectSetToArrayList( os )[0] as Autorizacion );
aut.FechaRealizacion = DateTime.MinValue;
this.Db.set( aut );
}
}
#endregion Creacion de Datos en la BD
#region Métodos Públicos
///
/// Dispara el proceso de recepción y procesamiento de la info recibida de los Presadores
///
public void procesarInfoRecibida(App app)
{
try
{
//1. Obtener todos los prestadores
ArrayList prestadores = this.ObjectSetToArrayList( this.Db.get(new Prestador()) );
InfoPrestacionesAdmin ipAdmin = new InfoPrestacionesAdmin();
//2. recorrer los prestadores
foreach ( Prestador p in prestadores )
{
app.UpdateIdle ();
//Obtener archivos enviados del prestador
InfoPrestacionesReport[] informes = ipAdmin.ObtenerInfoPendiente( p );
if ( informes.Length <= 0 )
{
this.NotificarPrestador( p, NotificacionPrestador.Tipo.InfoNoRecibida, null );
this.NotificarPagos( "NORECIBIDO " + p.Cuit.Trim() + " " + DateTime.Now.ToString("yyyy-MM-dd") );
}
else
{
//Recorro informe por informe
foreach ( InfoPrestacionesReport ip in informes )
{
if ( (ip.ValidarFormato()) && ( ip.CuitPrestador == p.Cuit ) )
{ //OK
ip.ValidarLineas( p ); //Las marca como aprobadas/rechazadas
this.ProcesarLineas( p, ip );
ipAdmin.MoverArchivoAceptado( ip );
this.NotificarPrestador( p, NotificacionPrestador.Tipo.ProcesoExitoso, ip );
}
else
{
//ERROR.
// 1. Mover el archivo a "rechazados"
ipAdmin.MoverArchivoRechazado( ip );
// 2. Enviar mail al Prestador y a Pagos
this.NotificarPrestador( p, NotificacionPrestador.Tipo.ErrorGrave, ip );
this.NotificarPagos( "ERROR " + p.Cuit.Trim() + " " + ip.NombreArchivo );
}
} //foreach informes
} //else
} // foreach prestadores
//Envío los reportes creados:
ipAdmin.EnviarReporte( this._reporteAprobaciones );
ipAdmin.EnviarReporte( this._reporteConsumo );
}
catch ( Exception e )
{
Console.WriteLine( e.Message );
Console.Read();
}
}
#endregion Métodos Públicos
#region Métodos Privados
///
/// Procesa las lineas del reporte una vez que el mismo ha sido validado:
/// Si está aprobada, la registra en el sistema y la agrega al reporte de Consumo de los Afiliados.
/// A todas las lineas las agrega al Informe de Aprobaciones/rechazos de Prestaciones Realizadas.
///
private void ProcesarLineas( Prestador p, InfoPrestacionesReport ip )
{
foreach ( LineaInfoPrestacionesReport linea in ip.Lineas )
{
this._reporteAprobaciones.AgregarInfo( p, ip.FechaEnvio, linea );
if ( linea.Aprobada )
{
//actualizo en el sistema
Autorizacion a = this.getAutorizacion( linea.CodigoAutorizacion );
a.FechaRealizacion = linea.FechaRealizacion;
this.Db.set( a );
//agrego info al reporte de consumo
this._reporteConsumo.AgregarInfo( p, linea );
}
}
}
private void NotificarPrestador( Prestador p, NotificacionPrestador.Tipo tipoNotif, InfoPrestacionesReport ip )
{
NotificacionesAdmin.Instancia.EnviarAlPrestador( p, tipoNotif, ip );
}
private void NotificarPagos( string mensaje )
{
NotificacionesAdmin.Instancia.EnviarAPagos( mensaje );
}
private Autorizacion getAutorizacion( int codigo )
{
ArrayList al = new ArrayList();
al = this.ObjectSetToArrayList( this.Db.get( new AutorizacionManual(codigo) ) );
Autorizacion a = ( (al.Count == 0)? null : al[0] ) as AutorizacionManual;
if ( a == null )
{
al = this.ObjectSetToArrayList( this.Db.get( new AutorizacionAutomatica(codigo) ) );
a = ( (al.Count == 0)? null : al[0] ) as AutorizacionAutomatica;
}
return a;
}
#endregion Métodos Privados
}
}