public CAERespuestaFex ObtenerCae( Autorizacion aut, FexCabecera cabFex )
        {
            ClsFEXAuthRequest feAut = this.ObtenerFeAuthReq( aut );
            CAERespuestaFex respuesta = this.SolicitarCAE( cabFex, feAut );

            return respuesta;
        }
        public ClsFEXRequest Convertir( FexCabecera cabFex )
        {
            ClsFEXRequest cab = new ClsFEXRequest();
            cab.Id = cabFex.Id;
            cab.Cbte_Tipo = (short)cabFex.TipoComprobante;
            cab.Fecha_cbte = cabFex.FechaComprobante;
            cab.Punto_vta = (short)cabFex.PuntoDeVenta;
            cab.Cbte_nro = cabFex.ComprobanteNumero;
            cab.Tipo_expo = (short) cabFex.TipoExportacion;
            cab.Permiso_existente = cabFex.PermisoExistente;
            cab.Dst_cmp = (short)cabFex.PaisDestinoComprobante;
            cab.Cliente = cabFex.Cliente;
            cab.Cuit_pais_cliente = cabFex.CuitPaisCliente;
            cab.Domicilio_cliente = cabFex.DomicilioCliente;
            cab.Id_impositivo = cabFex.IdImpositivo;
            cab.Moneda_Id = cabFex.MonedaId;
            cab.Moneda_ctz = (decimal) cabFex.MonedaCotizacion;
            cab.Obs_comerciales = cabFex.ObservacionesComerciales;
            cab.Obs = cabFex.Observaciones;
            cab.Forma_pago = cabFex.FormaDePagoDescripcion;
            cab.Incoterms = cabFex.ClausulaDeVenta;
            cab.Incoterms_Ds = cabFex.ClausulaDeVentaInformacionComplementaria;
            cab.Idioma_cbte = (short) cabFex.IdiomaComprobante;
            cab.Permisos = this.ConvertirPermisos( cabFex.Permisos );
            cab.Cmps_asoc = this.ConvertirComprobantesAsociados( cabFex.ComprobantesAsociados );
            cab.Items = this.ConvertirItems( cabFex.Items );
            cab.Imp_total = (decimal) this.ObtenerValorImporteTotal( cabFex.ImporteTotal );

            return cab;
        }
        public List<Observacion> Obtener(ClsFEXGetCMPR comprobanteAfip, FexCabecera cabFex)
        {
            List<string> diferencias = new List<string>();

            if ( comprobanteAfip.Fecha_cbte != cabFex.FechaComprobante )
            {
                diferencias.Add("La fecha no es la correcta.");
                diferencias.Add("Afip: " + comprobanteAfip.Fecha_cbte + " Enviado :" + cabFex.FechaComprobante);
            }

            if ( comprobanteAfip.Cbte_nro != cabFex.ComprobanteNumero )
            {
                diferencias.Add("El número no es el correcto.");
                diferencias.Add("Afip: " + comprobanteAfip.Cbte_nro + " Enviado :" + cabFex.ComprobanteNumero);
            }

            if ( comprobanteAfip.Incoterms !=  cabFex.ClausulaDeVenta )
            {
                diferencias.Add("El incoterms no es el correcto.");
                diferencias.Add("Afip: " + comprobanteAfip.Incoterms + " Enviado :" + cabFex.ClausulaDeVenta);
            }

            if (comprobanteAfip.Cuit_pais_cliente != cabFex.CuitPaisCliente)
            {
                diferencias.Add("El C.U.I.T. no es el correcto.");
                diferencias.Add("Afip: " + comprobanteAfip.Cuit_pais_cliente + " Enviado :" + cabFex.CuitPaisCliente);
            }

            if (comprobanteAfip.Imp_total != (decimal) cabFex.ImporteTotal)
            {
                diferencias.Add("El total no es correcto.");
                diferencias.Add("Afip: " + comprobanteAfip.Imp_total.ToString(CultureInfo.InvariantCulture.NumberFormat) + " Enviado :" + cabFex.ImporteTotal.ToString(CultureInfo.InvariantCulture.NumberFormat));
            }

            List<Observacion> observaciones = new List<Observacion>();
            Observacion observacion;

            for (int i = 0; i < diferencias.Count; i++)
            {
                observacion = new Observacion();
                observacion.Mensaje = diferencias[i];
                observaciones.Add( observacion );
            }

            return observaciones;
        }
        public CAERespuestaFex ObtenerCaeWSFEX( Autorizacion autorizacion, FexCabecera cabFex )
        {
            long ultimoNro = this.UltimoComprobanteFex( autorizacion, cabFex.PuntoDeVenta, cabFex.TipoComprobante );

            WrapperCabeceraFex wr = new WrapperCabeceraFex();

            ServidorFacturaElectronicaExportacion sfex = new ServidorFacturaElectronicaExportacion( this.wsfex, this.logueador );
            CAERespuestaFex respuesta = null;
            cabFex.Id = this.ObtenerIdFex( cabFex, ultimoNro, autorizacion );
            List<Observacion> diferencias;
            try
            {
                this.logueador.Loguear( "Consultando Afip....." );
                this.logueador.Loguear( cabFex.Serializar() );

                respuesta = sfex.ObtenerCae( autorizacion, cabFex );

                this.logueador.Loguear( "Respuesta Afip......." );
                this.logueador.Loguear( respuesta.Serializar() );

                if ( cabFex.ComprobanteNumero <= ultimoNro )
                {
                    ConsultasWSFex consulta = new ConsultasWSFex( wsfex );
                    ClsFEXGetCMPR comprobanteAfip = consulta.DatosDeComprobante( autorizacion, cabFex.TipoComprobante, cabFex.ComprobanteNumero, cabFex.PuntoDeVenta );
                    // Aca comparo los comprobantes y y si hay diferencias lo rechazo
                    diferencias = wr.Comparar( comprobanteAfip, cabFex );

                    if ( diferencias.Count > 0 )
                    {
                        respuesta.MotivosObservaciones = "Diferencias en comprobante.";
                        respuesta.Observaciones = diferencias;
                        respuesta.Resultado = "R";
                        respuesta.Cae = "";
                    }
                }
            }
            catch ( ExcepcionFe ex )
            {
                this.MensajeDeError = ex.Message;
                throw ex;
            }

            return respuesta;
        }
 private ClsFEXRequest ObtenerClsFexRequest( FexCabecera cab )
 {
     WrapperCabeceraFex wcf = new WrapperCabeceraFex();
     return wcf.Convertir( cab );
 }
        private CAERespuestaFex SolicitarCAE( FexCabecera cabFex, ClsFEXAuthRequest aut )
        {
            ClsFEXRequest feCaeRequest = this.ObtenerClsFexRequest( cabFex );

            SerializadorRequest serializador = new SerializadorRequest();
            serializador.Serializar<ClsFEXRequest>( feCaeRequest );

            FEXResponseAuthorize caeResponse = this.wsfex.FEXAuthorize( aut, feCaeRequest );
            ManagerErroresFe managerErrores = new ManagerErroresFe( this.logueador );

            if (this.HuboSolicitudesRechazadas( caeResponse ))
            {
                this.GenerarBackupArchivoSerializado(serializador, feCaeRequest);
            }

            managerErrores.CapturarError(caeResponse.FEXErr, cabFex);

            WrapperCaeRespuestaFex wcrf = new WrapperCaeRespuestaFex();

            return wcrf.Convertir( caeResponse.FEXResultAuth );
        }
 private long ObtenerIdFex( FexCabecera cabFex, long ultimoNro, Autorizacion autorizacion )
 {
     long retorno;
     if ( cabFex.ComprobanteNumero <= ultimoNro )
     {
         ConsultasWSFex consultas = new ConsultasWSFex( this.wsfex, this.logueador );
         ClsFEXGetCMPR consRet = consultas.DatosDeComprobante( autorizacion, cabFex.TipoComprobante, cabFex.ComprobanteNumero, cabFex.PuntoDeVenta );
         retorno = consRet.Id;
     }
     else
     {
         ConsultasWSFex consultas = new ConsultasWSFex( this.wsfex, this.logueador );
         retorno = consultas.UltimoId( autorizacion ) + 1;
     }
     return retorno;
 }
        public CAERespuestaFex ObtenerCaeWSFEX( ConfiguracionWS config, FexCabecera cabFex )
        {
            Autorizacion aut = this.IniciarWSAA( config );
            this.AplicarConfiguracionWS( this.funcionesFex.Wsfex, config );

            return this.funcionesFex.ObtenerCaeWSFEX( aut, cabFex );
        }
 public List<Observacion> Comparar(ClsFEXGetCMPR comprobanteAfip, FexCabecera cabFex)
 {
     BuscadorDeDiferencias buscadorDiferencias = new BuscadorDeDiferencias();
     return buscadorDiferencias.Obtener(comprobanteAfip, cabFex);
 }