#region Usings
using System;
using System.Collections;
using System.Xml;
using System.Xml.Schema;
using System.Globalization;
using System.IO;
using System.Configuration;
using System.Reflection;
#endregion Usings
namespace Reportes
{
///
/// Clase que representa un archivo de Información de Prestaciones Realizadas enviado por el
/// Prestador.
///
public class InfoPrestacionesReport
{
#region Constructores
public InfoPrestacionesReport( string pathNombreArchivo )
{
this._pathArchivo = pathNombreArchivo;
}
#endregion Constructores
#region Campos Privados
private string _pathArchivo = string.Empty;
private string _cuitPrestador;
private DateTime _fechaEnvio;
private LineaInfoPrestacionesReport[] _lineas = null;
#endregion Campos Privados
#region Propiedades Públicas
public string PathArchivo
{
get { return this._pathArchivo; }
set { this._pathArchivo = value; }
}
public string NombreArchivo
{
get { return this.PathArchivo.Substring(this.PathArchivo.LastIndexOf(Path.DirectorySeparatorChar) + 1); }
}
public string CuitPrestador
{
get { return this._cuitPrestador; }
set { this._cuitPrestador = value; }
}
public DateTime FechaEnvio
{
get { return this._fechaEnvio; }
set { this._fechaEnvio = value; }
}
public LineaInfoPrestacionesReport[] Lineas
{
get { return this._lineas; }
set { this._lineas = value; }
}
#endregion Propiedades Públicas
#region Métodos públicos
public bool ValidarFormato()
{
XmlDocument xmlDoc = new System.Xml.XmlDocument();
try
{
xmlDoc.Load( this._pathArchivo );
}
catch ( XmlException xmlEx )
{
#warning Ver como mostrar los errores
return false;
}
if ( this.ValidarContraSchema( xmlDoc ) )
{
this.CargarXml( xmlDoc );
}
else
{
//Mostrar error y retornar
return false;
}
return true;
}
public void ValidarLineas( Dominio.Autorizaciones.Prestador prestador )
{
foreach ( LineaInfoPrestacionesReport linea in this._lineas )
{
linea.Validar( prestador );
}
}
#endregion Métodos públicos
#region Métodos privados
private ArrayList _validationErrors = new ArrayList();
private void valReader_ValidationEventHandler(object sender, ValidationEventArgs e)
{
this._validationErrors.Add( e.Message );
}
private string _xsdPathNombre = null;
private string XsdPathNombre
{
get
{
if ( this._xsdPathNombre == null )
{
string currentDir = Directory.GetCurrentDirectory();
string xsdPath = Path.Combine( currentDir, ConfigurationSettings.AppSettings["DirectorioRecursos"] );
if ( ! Directory.Exists(xsdPath) )
{
Directory.CreateDirectory( xsdPath );
}
return ( Path.Combine( xsdPath, "infoPrestaciones_schema.xsd" ) );
}
else
return this._xsdPathNombre;
}
}
private bool ValidarContraSchema( XmlDocument xmlDoc )
{
this._validationErrors.Clear();
NameTable nt = new NameTable();
XmlNamespaceManager nm = new XmlNamespaceManager( nt );
XmlParserContext pc = new XmlParserContext( null, nm, null, XmlSpace.None );
XmlValidatingReader valReader = new XmlValidatingReader( xmlDoc.OuterXml, XmlNodeType.Element, pc );
valReader.Schemas.Add( string.Empty, this.XsdPathNombre );
valReader.ValidationType = ValidationType.Schema;
valReader.ValidationEventHandler += new ValidationEventHandler(valReader_ValidationEventHandler);
while (valReader.Read()) { }
valReader.Close();
return (this._validationErrors.Count == 0) ;
}
///
/// Toma un xmlDoc valido contra el schema
///
///
private void CargarXml( XmlDocument xmlDoc )
{
XmlNode root = xmlDoc["infoPrestaciones"];
this.FechaEnvio = DateTime.Parse( root.Attributes["fechaEnvio"].InnerText );
XmlElement prestador = root["prestador"];
this.CuitPrestador = prestador["CUIT"].InnerText;
XmlElement lineasXml = root["lineas"];
if ( lineasXml.HasChildNodes )
{
this._lineas = new LineaInfoPrestacionesReport[ lineasXml.ChildNodes.Count ];
XmlNode node; int cod; string tipoAut; int codAfiliado; string codPrestacion;
DateTime fechaRealizacion; float porcentajeCobertura;
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalDigits = 2;
nfi.NumberDecimalSeparator = ".";
nfi.NumberGroupSeparator = ",";
for ( int i = 0; i < lineasXml.ChildNodes.Count; i++ )
{
node = lineasXml.ChildNodes[i];
cod = int.Parse( node.Attributes["codigoAutorizacion"].InnerText );
tipoAut = node["tipoAutorizacion"].InnerText;
codAfiliado = int.Parse( node["codigoAfiliado"].InnerText );
codPrestacion = node["codigoPrestacion"].InnerText;
fechaRealizacion = DateTime.Parse( node["fechaRealizacion"].InnerText );
porcentajeCobertura = float.Parse( node["porcentajeCobertura"].InnerText.Trim(), nfi );
this._lineas[i] = new LineaInfoPrestacionesReport( cod, tipoAut, codAfiliado, codPrestacion,
fechaRealizacion, porcentajeCobertura );
}
}
}
#endregion Métodos privados
}
}