namespace Dominio { namespace Autorizaciones { using System; using Dominio.Planes; #region Clase Autorizacion public abstract class Autorizacion { #region Campos privados private int _codigo = int.MinValue; private float _porcentajeCobertura = 0; private DateTime _fechaSolicitud = DateTime.MinValue; private DateTime _fechaRealizacion = DateTime.MinValue; private DateTime _fechaVencimiento = DateTime.MinValue; private bool _aprobada = false; private string _fundamentosResolucion = string.Empty; private Prestador _prestador = null; private Prestacion _prestacion = null; #endregion Campos privados #region Propiedades Públicas public int Codigo { get { return this._codigo; } set { this._codigo = value; } } public float PorcentajeCobertura { get { return this._porcentajeCobertura; } set { this._porcentajeCobertura = value; } } public DateTime FechaSolicitud { get { return this._fechaSolicitud; } set { this._fechaSolicitud = value; } } public DateTime FechaRealizacion { get { return this._fechaRealizacion; } set { this._fechaRealizacion = value; } } public DateTime FechaVencimiento { get { return this._fechaVencimiento; } set { this._fechaVencimiento = value; } } public bool Aprobada { get { return this._aprobada; } set { this._aprobada = value; } } public string FundamentosResolucion { get { return this._fundamentosResolucion; } set { this._fundamentosResolucion = value; } } public Prestador Prestador { get { return this._prestador; } set { this._prestador = value; } } public Prestacion Prestacion { get { return this._prestacion; } set { this._prestacion = value; } } #endregion Propiedades Públicas #region Constructores public Autorizacion( DateTime fechaSolicitud ) { #warning Ver cómo manejar los códigos con DB4O this.FechaSolicitud = fechaSolicitud; } #endregion Constructores #region Métodos Públicos public abstract Autorizacion.Estado getEstado( DateTime fecha ); public Autorizacion.Estado getEstado( ) { return this.getEstado( DateTime.Now ); } public void setResolucion( string fundamentosResolucion, float porcentajeCobertura ) { this.FundamentosResolucion = fundamentosResolucion; this.PorcentajeCobertura = porcentajeCobertura; } public override string ToString() { string strAut = string.Empty; strAut += "Tipo: " + this.GetType().Name + "\n"; System.Reflection.PropertyInfo[] properties = this.GetType().GetProperties(); foreach ( System.Reflection.PropertyInfo property in properties ) { strAut += property.Name + " = " + property.GetValue( this, null ) + "\n"; } return strAut; } #endregion Métodos Públicos #region Estados de una autorización public enum Estado { Pendiente, Aprobada, Rechazada, Realizada, Vencida, Invalida, //Corresponde a inconsistencia de datos en el sistema Inexistente //La autorizacion todavía no existía en la fecha que se está consultando } #endregion Estados de una autorización } #endregion Clase Autorizacion #region Clases derivadas de Autorizacion public class AutorizacionManual : Autorizacion { #region Campos Privados private string _observaciones; private DateTime _fechaResolucion; #endregion Campos Privados #region Propiedades Públicas public string Observaciones { get { return this._observaciones; } set { this._observaciones = value; } } public DateTime FechaResolucion { get { return this._fechaResolucion; } set { this._fechaResolucion = value; } } #endregion Propiedades Públicas #region Constructores public AutorizacionManual( DateTime fechaSolicitud ) : base( fechaSolicitud ) { } #endregion Constructores #region Métodos Públicos public override Autorizacion.Estado getEstado( DateTime fecha ) { Autorizacion.Estado estado = Autorizacion.Estado.Invalida; //inicialización //Evalúo Fecha SOLICITUD if ( this.FechaSolicitud != DateTime.MinValue ) { if ( this.FechaSolicitud <= fecha ) { //Evalúo Fecha RESOLUCIÓN if ( (this.FechaResolucion != DateTime.MinValue) && (this.FechaResolucion <= fecha) ) { //Evalúo si está APROBADA if ( this.Aprobada ) { //Evalúo Fecha REALIZACIÓN if ( (this.FechaRealizacion != DateTime.MinValue) && (this.FechaRealizacion <= fecha) ) { estado = Autorizacion.Estado.Realizada; } else { //Aprobada pero NO realizada //Evalúo Fecha VENCIMIENTO if ( (this.FechaVencimiento != DateTime.MinValue) && (this.FechaVencimiento <= fecha) ) { estado = Autorizacion.Estado.Vencida; } else //Sin vencer estado = Autorizacion.Estado.Aprobada; } } else //DESAPROBADA { if ( (this.FechaRealizacion != DateTime.MinValue) && (this.FechaRealizacion <= fecha) ) { estado = Autorizacion.Estado.Invalida; //Desaprobada y Realizada! } else estado = Autorizacion.Estado.Rechazada; } } else //No está resuelta if ( (this.FechaRealizacion == DateTime.MinValue) || (this.FechaRealizacion > fecha) ) estado = Autorizacion.Estado.Pendiente; //no está resuelta, ni realizada en "fecha" else estado = Autorizacion.Estado.Invalida; } else //FechaSolicitud > fecha estado = Autorizacion.Estado.Inexistente; } else //FechaSolicitud no seteada estado = Autorizacion.Estado.Invalida; return estado; } #endregion Métodos Públicos } public class AutorizacionAutomatica : Autorizacion { #region Constructores public AutorizacionAutomatica( DateTime fechaSolicitud ) : base( fechaSolicitud ) { } #endregion Constructores #region Métodos Públicos public override Autorizacion.Estado getEstado( DateTime fecha ) { Autorizacion.Estado estado = Autorizacion.Estado.Invalida; //inicialización //Evalúo Fecha SOLICITUD if ( this.FechaSolicitud != DateTime.MinValue ) { if ( this.FechaSolicitud <= fecha ) { //Evalúo si está APROBADA if ( this.Aprobada ) { //Evalúo Fecha REALIZACIÓN if ( (this.FechaRealizacion != DateTime.MinValue) && (this.FechaRealizacion <= fecha) ) { estado = Autorizacion.Estado.Realizada; } else { //Aprobada pero NO realizada //Evalúo Fecha VENCIMIENTO if ( (this.FechaVencimiento != DateTime.MinValue) && (this.FechaVencimiento <= fecha) ) { estado = Autorizacion.Estado.Vencida; } else //Sin vencer estado = Autorizacion.Estado.Aprobada; } } else //DESAPROBADA { if ( (this.FechaRealizacion != DateTime.MinValue) && (this.FechaRealizacion <= fecha) ) { estado = Autorizacion.Estado.Invalida; //Desaprobada y Realizada! } else estado = Autorizacion.Estado.Rechazada; } } else //FechaSolicitud > fecha estado = Autorizacion.Estado.Inexistente; } else //FechaSolicitud no seteada estado = Autorizacion.Estado.Invalida; return estado; } #endregion Métodos Públicos } #endregion Clases derivadas de Autorizacion } }