#region Usings
using System;
using System.Collections;
using Dominio;
using Dominio.Autorizaciones;
using Dominio.Afiliados;
using com.db4o;
using com.db4o.query;
#endregion Usings
namespace Controlador
{
///
/// Clase controlador que lleva a cabo los CU de "Pedir autorizacion automatica",
/// "Pedir autorizacion manual" y actualizar "autorizacion manual"
///
public class AutorizacionController : Controller
{
#region Constructores
public AutorizacionController(DateTime fechaSolicitud): base()
{
}
#endregion Constructores
#region Campos Privados
private Autorizacion _currentAutorizacion = null ;
#endregion Campos Privados
#region Propiedades privadas
public Autorizacion CurrentAutorizacion
{
get { return _currentAutorizacion; }
}
#endregion Propiedades privadas
#region Métodos Públicos
///
/// Guarda un pedido de autorizacion manual.
///
public bool guardarAutorizacionManual(String codPrestacion, String cuitPrestador
, int codAfiliado, String observaciones)
{
bool codigosOk = true;
//solo para testing--------------------
this.InsertarDatosNecesarios();
//------------------------------------
AutorizacionManual aut = new AutorizacionManual(DateTime.Now);
#region Se insancia prestador, prestacion y afiliado, y se asocia a aut
//Seteo prestacion
ArrayList al = this.ObjectSetToArrayList( this.Db.get( new Prestacion(codPrestacion) ) );
if (null==(aut.Prestacion = ( (al.Count == 0)? null : al[0] ) as Prestacion))
codigosOk=false;
//Seteo prestador
al = this.ObjectSetToArrayList( this.Db.get( new Prestador(cuitPrestador) ) );
if (null==(aut.Prestador = ( (al.Count == 0)? null : al[0] ) as Prestador))
codigosOk=false;
//Seteo afiliado
al = this.ObjectSetToArrayList( this.Db.get( new Afiliado(codAfiliado) ) );
if (null==(aut.Afiliado = ( (al.Count == 0)? null : al[0] ) as Afiliado))
codigosOk=false;
#endregion Se insancia prestador, prestacion y afiliado, y se asocia a aut
//Seteo fecha de vencimiento como dentro de 60 días
aut.FechaVencimiento = DateTime.Now.AddDays(60);
aut.Observaciones = observaciones;
//Signo prox codigo para autorizacion
AutoIncrementable c = new AutoIncrementable ();
using (c)
{
aut.Codigo = c.NextAutorizacion();
}
if (codigosOk) this.Db.set(aut);
return codigosOk;
}
//PRE: No hay autorizaciones manuales y automaticas con mismo codigo!!
public Autorizacion obtener(int codigo)
{
//Busco manual
ArrayList al = this.ObjectSetToArrayList( this.Db.get( new AutorizacionManual(codigo) ) );
Autorizacion a = ((al.Count == 0)? null : al[0] ) as Autorizacion;
if (null==a)
//Busco automatica, si no hay manual para ese codigo
{
al = this.ObjectSetToArrayList( this.Db.get( new AutorizacionAutomatica(codigo) ) );
a = ((al.Count == 0)? null : al[0] ) as Autorizacion;
}
return a;
}
public float evaluarAutorizacionAutomatica(String cuitPrestador, String codPrestacion, int codAfiliado, out int codAutorizacion)
{
bool codigosOk = true;
float porcentajeDeCobertura = 0;
string fundamentosResolucion = "Todo ok";
AutorizacionAutomatica aut = new AutorizacionAutomatica(DateTime.Now);
#region Se insancia prestador, prestacion y afiliado, y se asocia a aut
//Seteo prestacion
ArrayList al = this.ObjectSetToArrayList( this.Db.get( new Prestacion(codPrestacion) ) );
if (null==(aut.Prestacion = ( (al.Count == 0)? null : al[0] ) as Prestacion))
codigosOk=false;
//Seteo prestador
al = this.ObjectSetToArrayList( this.Db.get( new Prestador(cuitPrestador) ) );
if (null==(aut.Prestador = ( (al.Count == 0)? null : al[0] ) as Prestador))
codigosOk=false;
//Seteo afiliado
al = this.ObjectSetToArrayList( this.Db.get( new Afiliado(codAfiliado) ) );
if (null==(aut.Afiliado = ( (al.Count == 0)? null : al[0] ) as Afiliado))
codigosOk=false;
#endregion Se insancia prestador, prestacion y afiliado, y se asocia a aut
//Seteo fecha de vencimiento como dentro de 60 días
//Seteo fecha de vencimiento como dentro de 60 días
aut.FechaVencimiento = DateTime.Now.AddDays(60);
try
{
porcentajeDeCobertura = aut.Afiliado.VerificarCobertura(codPrestacion);
}
catch
{
#warning verificar cobertura deberia tirar excepcion si explota, o se rechaza
//TODO Asignar motivo de rechazo a fundamentosResolucion
}
finally
{
//Si porcentaje es 0, se registra rechazada
aut.setResolucion(fundamentosResolucion, porcentajeDeCobertura);
if (codigosOk)
{
this.Db.set(aut);
this._currentAutorizacion=aut;
}
#warning deberia obtener codigo de autorizacion ACA y devolverlo
codAutorizacion = 131313; //TODO SETEAR CODIGO BIEN!!
}
return porcentajeDeCobertura;
}
public ArrayList obtenerAutorizacionesPendientes()
{
Query query = Db.query();
query.constrain(typeof(AutorizacionManual));
query.descend("_fechaRealizacion").constrain(DateTime.MinValue);
ObjectSet result = query.execute ();
return ObjectSetToArrayList (result);
}
#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.
///
/// Reporte del cual se porcesarán las lineas
private void InsertarDatosNecesarios()
{
//PRESTADOR
Prestador pre = new Prestador();
pre.Cuit = "11-11111111-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 );
}
Prestacion p = new Prestacion();
p.Codigo = "mierda" ;
Categoria c = new Categoria();
c.Codigo=10;
c.Nombre="categoria 1";
p.Categoria = c;
p.Nombre= "hospital de clinicas";
this.Db.set(c);
Afiliado a = new Afiliado(69);
a.Apellido = "apellido";
a.EMail = "afiliado@aaa.com";
this.Db.set(a);
//AUTORIZACIONES
/*AutorizacionAutomatica a = new AutorizacionAutomatica();
a.Codigo = 123;
os = this.Db.get( a );
if ( (os == null) || (os.size() == 0) )
{
a.Afiliado = new Dominio.Afiliados.Afiliado( 987 );
a.Prestacion = new Prestacion( "B01AC06" );
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 );
}*/
}
#endregion Métodos Privados
}
}