/// <summary>
 /// Crea una instancia de un <see cref="Comprobante"/> con sus atributos obligatorios y opcionales especificadno un tipo de cambio y moneda
 /// </summary>
 public Comprobante(string serie, string folio, DateTime fecha, string sello, string formaDePago,
                    string noCertificado, string certificado, string condicionesDePago, double subTotal,
                    string TipoCambio, string Moneda, double total, TipoDeComprobante tipoDeComprobante,
                    string metodoDePago, string LugarExpedicion, Emisor emisor, Receptor receptor)
 {
     if (emisor == null)
     {
         throw new Exception("Comprobante::Comprobante. Emisor no puede ser nulo");
     }
     if (receptor == null)
     {
         throw new Exception("Comprobante::Comprobante. Receptor no puede ser nulo");
     }
     atributos.Add("version", DEFAULT_VERSION);
     atributos.Add("serie", serie);
     atributos.Add("folio", folio);
     atributos.Add("fecha", Conversiones.DateTimeFechaISO8601(fecha));
     atributos.Add("sello", sello);
     atributos.Add("formaDePago", formaDePago);
     atributos.Add("noCertificado", noCertificado);
     atributos.Add("certificado", certificado);
     atributos.Add("condicionesDePago", condicionesDePago);
     atributos.Add("subTotal", subTotal.ToString("#.000000"));
     atributos.Add("TipoCambio", TipoCambio);
     atributos.Add("Moneda", Moneda);
     atributos.Add("total", total.ToString("#.000000"));
     atributos.Add("tipoDeComprobante", tipoDeComprobante.ToString().ToLower());
     atributos.Add("metodoDePago", metodoDePago);
     atributos.Add("LugarExpedicion", LugarExpedicion);
     this.emisor   = emisor;
     this.receptor = receptor;
 }
        /// <summary>
        /// Crea una instancia de un <see cref="Comprobante"/> con sus atributos minimos obligatorios
        /// </summary>
        public Comprobante(DateTime fecha, string formaDePago,  
	                      double subTotal, double total, TipoDeComprobante tipoDeComprobante, 
	                      string metodoDePago, string LugarExpedicion, Emisor emisor, Receptor receptor)
        {
            if(emisor == null)
             throw new Exception("Comprobante::Comprobante. Emisor no puede ser nulo");
              if(receptor == null)
             throw new Exception("Comprobante::Comprobante. Receptor no puede ser nulo");
              atributos.Add("version", DEFAULT_VERSION);
              atributos.Add("fecha", Conversiones.DateTimeFechaISO8601(fecha));
              atributos.Add("formaDePago", formaDePago);
              atributos.Add("subTotal", subTotal.ToString("#.000000"));
              atributos.Add("total", total.ToString("#.000000"));
              atributos.Add("tipoDeComprobante", tipoDeComprobante.ToString().ToLower());
              atributos.Add("metodoDePago", metodoDePago);
              atributos.Add("LugarExpedicion", LugarExpedicion);
              this.emisor = emisor;
              this.receptor = receptor;
        }
 /// <summary>
 /// Crea una instancia de un <see cref="Comprobante"/> con sus atributos minimos obligatorios
 /// </summary>
 public Comprobante(DateTime fecha, string formaDePago,
                    double subTotal, double total, TipoDeComprobante tipoDeComprobante,
                    string metodoDePago, string LugarExpedicion, Emisor emisor, Receptor receptor)
 {
     if (emisor == null)
     {
         throw new Exception("Comprobante::Comprobante. Emisor no puede ser nulo");
     }
     if (receptor == null)
     {
         throw new Exception("Comprobante::Comprobante. Receptor no puede ser nulo");
     }
     atributos.Add("version", DEFAULT_VERSION);
     atributos.Add("fecha", Conversiones.DateTimeFechaISO8601(fecha));
     atributos.Add("formaDePago", formaDePago);
     atributos.Add("subTotal", subTotal.ToString("#.000000"));
     atributos.Add("total", total.ToString("#.000000"));
     atributos.Add("tipoDeComprobante", tipoDeComprobante.ToString().ToLower());
     atributos.Add("metodoDePago", metodoDePago);
     atributos.Add("LugarExpedicion", LugarExpedicion);
     this.emisor   = emisor;
     this.receptor = receptor;
 }
 /// <summary>
 /// Inicializa una nueva instancia de la clase Comprobante con inicializacion de propiedades.
 /// </summary>
 /// <param name="serie">
 /// Atributo opcional para precisar la serie a la que corresponde el comprobante.
 /// Este atributo acepta una cadena de caracteres alfabéticos de 1 a 10 caracteres
 /// sin incluir caracteres acentuados.</param>
 /// <param name="folio">
 /// Atributo requerido que acepta un valor numérico entero superior a 0 que expresa
 /// el folio del comprobante.</param>
 /// <param name="fecha">
 /// Atributo requerido para la expresión de la fecha y hora de expedición del comprobante fiscal. </param>
 /// <param name="formaDePago">
 /// Atributo requerido para precisar la forma de pago que aplica para este comprobante
 /// fiscal digital. Se utiliza para expresar Pago en una sola exhibición o número de
 /// parcialidad pagada contra el total de parcialidades, Parcialidad 1 de X.</param>
 /// <param name="noCertificado">
 /// Atributo requerido para expresar el número de serie del certificado de sello digital
 /// que ampara al comprobante, de acuerdo al acuse correspondiente a 20 posiciones
 /// otorgado por el sistema del SAT.</param>
 /// <param name="certificado">
 /// Atributo opcional que sirve para expresar el certificado de sello digital que ampara al
 /// comprobante como texto, en formato base 64.</param>
 /// <param name="condicionesDePago">
 /// Atributo opcional para expresar las condiciones comerciales aplicables para el pago del
 /// comprobante fiscal digital.</param>
 /// <param name="subTotal">
 /// Atributo requerido para representar la suma de los importes antes de descuentos e impuestos.</param>
 /// <param name="descuento">
 /// Atributo opcional para representar el importe total de los descuentos aplicables antes
 /// de impuestos.</param>
 /// <param name="motivoDescuento">
 /// Atributo opcional para expresar el motivo del descuento aplicable.</param>
 /// <param name="TipoCambio">
 /// Atributo opcional para representar el tipo de cambio conforme a la moneda usada</param>
 /// <param name="Moneda">
 /// Atributo opcional para expresar la moneda utilizada para expresar los montos </param>
 /// <param name="total">
 /// Atributo requerido para representar la suma del subtotal, menos los descuentos aplicables,
 /// más los impuestos trasladados, menos los impuestos retenidos.</param>
 /// <param name="metodoDePago">
 /// Atributo opcional de texto libre para expresar el método de pago de los bienes o servicios
 /// amparados por el comprobante. Se entiende como método de pago leyendas tales como:
 /// cheque, tarjeta de crédito o debito, depósito en cuenta, etc.</param>
 /// <param name="tipoDeComprobante">
 /// Atributo requerido para expresar el efecto del comprobante fiscal para el contribuyente emisor.</param>
 /// <param name="LugarExpedicion"></param>
 /// <param name="NumCtaPago"></param>
 public Comprobante(
     string serie,
     string folio,
     DateTime fecha,
     string formaDePago,
     string noCertificado,
     string certificado,
     string condicionesDePago,
     decimal subTotal,
     decimal descuento,
     string motivoDescuento,
     string TipoCambio,
     string Moneda,
     decimal total,
     TipoDeComprobante tipoDeComprobante,
     string metodoDePago,
     string LugarExpedicion,
     string NumCtaPago) : this()
 {
     this._serie             = serie;
     this._folio             = folio;
     this._fecha             = fecha;
     this._formaDePago       = formaDePago;
     this._noCertificado     = noCertificado;
     this._certificado       = certificado;
     this._condicionesDePago = condicionesDePago;
     this._subTotal          = subTotal;
     this._descuento         = descuento;
     this._motivoDescuento   = motivoDescuento;
     this._tipoCambio        = TipoCambio;
     this._moneda            = Moneda;
     this._total             = total;
     this._metodoDePago      = metodoDePago;
     this._LugarExpedicion   = LugarExpedicion;
     this._NumCtaPago        = NumCtaPago;
     this._tipoDeComprobante = tipoDeComprobante;
 }
        /// <summary>
        /// Crea una instancia de un <see cref="Comprobante"/> con sus atributos obligatorios y opcionales especificadno un tipo de cambio y moneda
        /// </summary>
        public Comprobante(string serie, string folio, DateTime fecha, string sello, string formaDePago, 
	                      string noCertificado,string certificado, string condicionesDePago, double subTotal, 
	                      string TipoCambio, string Moneda, double total,TipoDeComprobante tipoDeComprobante, 
	                      string metodoDePago, string LugarExpedicion, Emisor emisor, Receptor receptor)
        {
            if(emisor == null)
             throw new Exception("Comprobante::Comprobante. Emisor no puede ser nulo");
              if(receptor == null)
             throw new Exception("Comprobante::Comprobante. Receptor no puede ser nulo");
              atributos.Add("version", DEFAULT_VERSION);
              atributos.Add("serie", serie);
              atributos.Add("folio", folio);
              atributos.Add("fecha", Conversiones.DateTimeFechaISO8601(fecha));
              atributos.Add("sello", sello);
              atributos.Add("formaDePago", formaDePago);
              atributos.Add("noCertificado", noCertificado);
              atributos.Add("certificado", certificado);
              atributos.Add("condicionesDePago", condicionesDePago);
              atributos.Add("subTotal", subTotal.ToString("#.000000"));
              atributos.Add("TipoCambio", TipoCambio);
              atributos.Add("Moneda", Moneda);
              atributos.Add("total", total.ToString("#.000000"));
              atributos.Add("tipoDeComprobante", tipoDeComprobante.ToString().ToLower());
              atributos.Add("metodoDePago", metodoDePago);
              atributos.Add("LugarExpedicion", LugarExpedicion);
              this.emisor = emisor;
              this.receptor = receptor;
        }