using System;
using System.Collections;
using com.db4o;
using Dominio.Afiliados;
using Dominio.Autorizaciones;
//using Dominio.Planes;
namespace Reportes
{
///
/// Clase que representa una linea del Informe de Prestaciones Realizadas enviado por el
/// Prestador.
///
public class LineaInfoPrestacionesReport
{
#region Constructores
public LineaInfoPrestacionesReport( int codAut, string tipoAut, int codAfiliado, string codPrestacion,
DateTime fechaRealizacion, float porcentajeCobertura )
{
this._codigoAutorizacion = codAut;
this._tipoAutorizacion = tipoAut;
this._codigoAfiliado = codAfiliado;
this._codigoPrestacion = codPrestacion;
this._fechaRealizacion = fechaRealizacion;
this._porcentajeCobertura = porcentajeCobertura;
}
#endregion Constructores
#region Campos Privados
private bool _aprobada = false;
private bool _existeAutorizacion = false;
private string _motivoRechazo = string.Empty;
private int _codigoAutorizacion;
private string _tipoAutorizacion;
private int _codigoAfiliado;
private string _codigoPrestacion;
private DateTime _fechaRealizacion;
private float _porcentajeCobertura;
#endregion Campos Privados
#region Propiedades Públicas
///
/// Determina si la linea fue aprobada por el método Validar()
/// Sólo tiene sentido si fue ejecutado Validar()
///
public bool Aprobada
{
get { return this._aprobada; }
}
public bool ExisteAutorizacion
{
get { return this._existeAutorizacion; }
}
///
/// Motivo por el cual se rechazó la línea, si es que se rechazó.
/// En caso de haberse aprobado, debe estar vacío
///
public string MotivoRechazo
{
get { return this._motivoRechazo; }
}
public int CodigoAutorizacion
{
get { return this._codigoAutorizacion; }
}
public string TipoAutorizacion
{
get { return this._tipoAutorizacion; }
}
public int CodigoAfiliado
{
get { return this._codigoAfiliado; }
}
public string CodigoPrestacion
{
get { return this._codigoPrestacion; }
}
public DateTime FechaRealizacion
{
get { return this._fechaRealizacion; }
}
public float PorcentajeCobertura
{
get { return this._porcentajeCobertura; }
}
#endregion Propiedades Públicas
#region DB
private com.db4o.ObjectContainer db = null;
private ArrayList ObjectSetToArrayList (ObjectSet result)
{
ArrayList lst = new ArrayList ();
Object s;
if (result == null)
return lst;
while ((s = result.next ()) != null)
{
lst.Add (s);
}
return lst;
}
#endregion DB
#region Métodos Públicos
///
/// Valida la linea según las reglas de negocio (ver CU "Recibir y Cotejar")
///
/// True si la linea es válida
public bool Validar( Dominio.Autorizaciones.Prestador prestador )
{
#region Chequeo de la autorización
Autorizacion aut = this.getAutorizacion( this.CodigoAutorizacion );
if ( aut == null )
{
this.MarcarRechazada( MensajeMotivoRechazo.AutorizacionInexistente );
this._existeAutorizacion = false;
return false;
}
else
{
this._existeAutorizacion = true;
if ( (aut.Prestador == null) || (aut.Prestador.Cuit != prestador.Cuit) )
{
this.MarcarRechazada( MensajeMotivoRechazo.AutorizacionPrestadorInvalido );
return false;
}
if ( (aut.Prestacion == null) || (aut.Prestacion.Codigo != this.CodigoPrestacion) )
{
this.MarcarRechazada( MensajeMotivoRechazo.AutorizacionPrestacionInvalida );
return false;
}
if ( aut.FechaRealizacion != DateTime.MinValue )
{
this.MarcarRechazada( MensajeMotivoRechazo.AutorizacionYaRealizada );
return false;
}
if ( aut.getEstado(this.FechaRealizacion) != Autorizacion.Estado.Aprobada )
{
this.MarcarRechazada( MensajeMotivoRechazo.AutorizacionNoAprobada );
return false;
}
if ( this.TipoAutorizacion.Trim() == "Manual" )
{
if ( aut.GetType() != typeof(AutorizacionManual) )
{
this.MarcarRechazada( MensajeMotivoRechazo.AutorizacionTipoInvalido );
return false;
}
}
else
{
if ( aut.GetType() != typeof(AutorizacionAutomatica) )
{
this.MarcarRechazada( MensajeMotivoRechazo.AutorizacionTipoInvalido );
return false;
}
}
if ( aut.PorcentajeCobertura != this.PorcentajeCobertura )
{
this.MarcarRechazada( MensajeMotivoRechazo.AutorizacionPorcentajeInvalido );
return false;
}
}
#endregion Chequeo de la autorización
#region Chequeo de Prestador
if ( (prestador.FechaBaja != DateTime.MinValue) && (prestador.FechaBaja <= this.FechaRealizacion) )
{
this.MarcarRechazada( MensajeMotivoRechazo.PrestadorDadoDeBaja );
return false;
}
#endregion Chequeo de Prestador
#region Chequeo del Afiliado
Afiliado a = this.getAfiliado( this.CodigoAfiliado );
if (a == null)
{
this.MarcarRechazada( MensajeMotivoRechazo.AfiliadoInexistente );
return false;
}
else
if ( (a.FechaBaja != DateTime.MinValue) && (a.FechaBaja <= this.FechaRealizacion) )
{
this.MarcarRechazada( MensajeMotivoRechazo.AfiliadoDadoDeBaja );
return false;
}
#endregion Chequeo del Afiliado
#region Chequeo de la prestación
Prestacion p = this.getPrestacion( this.CodigoPrestacion );
if ( p == null )
{
this.MarcarRechazada( MensajeMotivoRechazo.PrestacionInexistente );
return false;
}
else
{
if ( (p.FechaBaja != DateTime.MinValue) && (p.FechaBaja <= this.FechaRealizacion) )
{
this.MarcarRechazada( MensajeMotivoRechazo.PrestacionDadaDeBaja );
return false;
}
}
#endregion Chequeo de la prestación
this._aprobada = true;
return true;
}
#endregion Métodos Públicos
#region Métodos Privados
private Afiliado getAfiliado( int codigo )
{
this.db = com.db4o.Db4o.openFile("os.yap");
ArrayList al = this.ObjectSetToArrayList( db.get( new Afiliado(this.CodigoAfiliado) ) );
Afiliado a = ( (al.Count == 0)? null : al[0] ) as Afiliado;
this.db.close();
this.db = null;
return a;
}
private Prestacion getPrestacion( string codigo )
{
this.db = com.db4o.Db4o.openFile("os.yap");
ArrayList al = this.ObjectSetToArrayList( db.get( new Prestacion(this.CodigoPrestacion) ) );
Prestacion p = ( (al.Count == 0)? null : al[0] ) as Prestacion;
this.db.close();
this.db = null;
return p;
}
private Autorizacion getAutorizacion( int codigo )
{
this.db = com.db4o.Db4o.openFile("os.yap");
ArrayList al = new ArrayList();
al = this.ObjectSetToArrayList( db.get( new AutorizacionManual(codigo) ) );
Autorizacion a = ( (al.Count == 0)? null : al[0] ) as AutorizacionManual;
if ( a == null )
{
al = this.ObjectSetToArrayList( db.get( new AutorizacionAutomatica(codigo) ) );
a = ( (al.Count == 0)? null : al[0] ) as AutorizacionAutomatica;
}
this.db.close();
this.db = null;
return a;
}
private void MarcarRechazada( string motivo )
{
this._aprobada = false;
this._motivoRechazo = motivo;
}
#endregion Métodos Privados
} //clase
#region Motivos de rechazo
public struct MensajeMotivoRechazo
{
public static string PrestadorDadoDeBaja = "El prestador estaba dado de baja en la fecha de realización de la prestación informada por el prestador";
public static string AfiliadoDadoDeBaja = "El afiliado estaba dado de baja en la fecha de realización de la prestación informada por el prestador";
public static string AfiliadoInexistente = "El afiliado informado por el prestador no existe en el Sistema";
public static string PrestacionDadaDeBaja = "La prestación estaba dada de baja en la fecha de realización de la prestación informada por el prestador";
public static string PrestacionInexistente = "La prestación informada por el prestador no existe en el Sistema";
public static string AutorizacionInexistente = "La autorizacion informada por el prestador no existe en el Sistema";
public static string AutorizacionPrestadorInvalido = "La autorizacion informada por el prestador no esta relacionada, en el Sistema, con dicho prestador";
public static string AutorizacionAfiliadoInvalido = "La autorizacion informada por el prestador no esta relacionada, en el Sistema, con el afiliado informado";
public static string AutorizacionPrestacionInvalida = "La autorizacion informada por el prestador no esta relacionada, en el Sistema, con la prestacion informada";
public static string AutorizacionYaRealizada = "La autorizacion informada por el prestador ya ha sido realizada, segun los datos del Sistema";
public static string AutorizacionNoAprobada = "La autorizacion no estaba aprobada, segun los datos del Sistema, en la fecha de realizacion informada por el prestador";
public static string AutorizacionTipoInvalido = "El tipo de autorizacion informado por el prestador, no coincide con el tipo de autorizacion en el Sistema";
public static string AutorizacionPorcentajeInvalido = "El porcentaje de cobertura informado por el prestador, es distinto al que se aplicaba al momento de la aprobación de la autorización, segun los datos del Sistema";
}
#endregion Motivos de rechazo
}