예제 #1
0
        public CorridaAutorizacionDto AutorizarComprobantesParaWsFeX(CorridaAutorizacionDto corridaDto)
        {
            try
            {
                this.corridaDto = corridaDto;
                string pathArchivoOrigen = corridaDto.PathArchivo;

                if (string.IsNullOrEmpty(corridaDto.PathArchivo))
                {
                    this.Log("ERROR: No se ha ingresado el path del archivo");
                }

                // Marco la corrida como en proceso en la base de datos
                if (this.corridaSvc.MarcarCorridaEnProceso(corridaDto.Id))
                {
                    // Inicio Proceso
                    this.Log(string.Format("Iniciando procesamiento de archivo {0}...", this.nombreDeArchivo));

                    // Valido el Esquema de Xml
                    this.Log(string.Format("Validando esquema de archivo"));
                    string xmlSchemaPath = "";

                    if (!this.ValidarEsquemaXml(corridaDto.PathArchivo, xmlSchemaPath))
                    {
                        StringBuilder sb = new StringBuilder();
                        sb.AppendLine("ERROR: el formato del archivo es invalido");
                        sb.AppendLine(this.validacionesEsquema.ToString());
                        this.Log(sb.ToString());
                        return(null);
                    }

                    // Leo archivo XML y lo paso a string
                    this.Log("Leyendo archivo...");
                    string xmlString = LeerArchivo(corridaDto.PathArchivo);

                    // Reemplazo <Lote></Lote> por <FeCAEReq></FeCAEReq>
                    xmlString = xmlString.Replace("<FacturaExportacion>", "<ClsFEXRequest>").Replace("</FacturaExportacion>", "</ClsFEXRequest>");

                    // Deserealizo el XML y obtengo solo la parte del request
                    ClsFEXRequest feXCAERequest = null;
                    try
                    {
                        feXCAERequest = DeserializarXml <ClsFEXRequest>(xmlString, "http://ar.gov.afip.dif.fexv1/");

                        //feXCAERequest = new ClsFEXRequest();
                        //feXCAERequest.Id = 1;
                        //feXCAERequest.Fecha_cbte = "20120820";
                        //feXCAERequest.Punto_vta = 19;
                        //feXCAERequest.Cbte_nro = 1;
                        //feXCAERequest.Tipo_expo = 1;
                        //feXCAERequest.Permiso_existente = "S";
                        //feXCAERequest.Permisos = new Permiso[2];
                        //feXCAERequest.Permisos[0] = new Permiso();
                        //feXCAERequest.Permisos[0].Dst_merc = 203;
                        //feXCAERequest.Permisos[1] = new Permiso();
                        //feXCAERequest.Permisos[1].Id_permiso = "09052EC01006154G";
                        //feXCAERequest.Permisos[1].Dst_merc = 202;
                        //feXCAERequest.Dst_cmp = 203;
                        //feXCAERequest.Cliente = "Joao Da Silva";
                        //feXCAERequest.Cuit_pais_cliente = 50000000016;
                        //feXCAERequest.Domicilio_cliente = "Rua 76 km 34.5 Alagoas";
                        //feXCAERequest.Id_impositivo = "PJ54482221-l";
                        //feXCAERequest.Moneda_Id = "012";
                        //feXCAERequest.Moneda_ctz = 0.51M;
                        //feXCAERequest.Obs_comerciales = "Sin observaciones";
                        //feXCAERequest.Imp_total = 500;
                        //feXCAERequest.Forma_pago = "Contado";
                        //feXCAERequest.Incoterms = "CIF";
                        //feXCAERequest.Incoterms_Ds = "Texto dic.";
                        //feXCAERequest.Idioma_cbte = 1;
                        //feXCAERequest.Items = new Item[1];
                        //feXCAERequest.Items[0] = new Item();
                        //feXCAERequest.Items[0].Pro_codigo = "PRO1";
                        //feXCAERequest.Items[0].Pro_ds = "Producto Tipo 1 Exportacion MERCOSUR ISO 9001";
                        //feXCAERequest.Items[0].Pro_qty = 2;
                        //feXCAERequest.Items[0].Pro_umed = 7;
                        //feXCAERequest.Items[0].Pro_precio_uni = 250;
                        //feXCAERequest.Items[0].Pro_total_item = 500;

                        //feXCAERequest.Cmps_asoc = new Cmp_asoc[0];

                        //var revisar = SerializarXml<ClsFEXRequest>(feXCAERequest);
                        //revisar = revisar.ToString();
                    }
                    catch (Exception ex)
                    {
                        this.Log("El formato del archivo es inválido.");
                        return(null);
                    }

                    // Obtengo Ticket de Autorizacion
                    this.Log("Iniciando comunicacion con la AFIP");
                    ClsFEXAuthRequest feXAuthRequest = this.ObtenerTicketWSFeX();

                    // Cargo los comprobantes que estan autorizados en la AFIP
                    // pero que no fueron cargados en la DB por problemas en
                    // la comunicacion
                    //-------------------------------------
                    //-------------------------------------
                    // IMPORTANTE!!!!!!
                    //-------------------------------------
                    //-------------------------------------
                    // El siguiente codigo tiene que refactorearse según como trabaja este nuevo servicio
                    // ByAd TODO: this.CargarComprobantesYaAutorizados(feAuthRequest, feCAERequest);


                    // Remover Comprobantes que ya han sido autorizados
                    //string resultado = this.RemoverComprobantesAutorizados(feAuthRequest, feCAERequest);
                    //if (!string.IsNullOrEmpty(resultado))
                    //{
                    //    this.Log(resultado);
                    //    feCAERequest.FeCabReq.CantReg = feCAERequest.FeDetReq.Count();
                    //}
                    //-------------------------------------
                    //-------------------------------------
                    //-------------------------------------

                    if (feXCAERequest != null)
                    {
                        // Autorizar Comprobantes con la AFIP
                        this.Log("Autorizando Comprobantes con la AFIP...");
                        FEXResponseAuthorize feXCAEResponse = this.AutorizarComprobantes(feXAuthRequest, feXCAERequest);

                        // Proceso Resultado AFIP
                        this.Log("Procesando respuesta de la AFIP...");
                        corridaDto = this.corridaSvc.ProcesarCorridaWsFeX(corridaDto, feXCAEResponse, feXCAERequest);
                    }
                    else
                    {
                        // Todos los comprobantes del archivo ya tienen un CAE asignado
                        // y existen en DB
                        this.Log("Todos los comprobantes del archivo ya han sido autorizados");
                    }

                    // Muevo el archivo a una carpeta de procesados
                    GuardarArchivoProcesado(pathArchivoOrigen);

                    this.Log("Fin procesamiento de archivo.");
                }
                else
                {
                    this.Log("La corrida ya se está ejecutando");
                }

                return(corridaDto);
            }
            catch (Exception ex)
            {
                string detalle = string.Format("ex.Message: {0} ex.StackTrace: {1}", ex.Message, ex.StackTrace);
                this.Log(string.Format("ERROR: Se ha producido un error. Contactese con el administrador. Error: {0}", ex.Message), detalle);
                return(null);
            }
            finally
            {
                this.Log(CorridaService.FinCorridaMsg);
            }
        }
예제 #2
0
        public CorridaAutorizacionDto ProcesarCorridaWsFeX(CorridaAutorizacionDto corridaDto, FEXResponseAuthorize feXCAEResponse, ClsFEXRequest feXCAERequest)
        {
            using (var ctx = new FacturaElectronicaEntities())
            {
                CorridaAutorizacion corrida = ctx.CorridaAutorizacions.Where(c => c.Id == corridaDto.Id).First();

                // Procesar Cabecera
                DetalleCabecera    cabecera  = new DetalleCabecera();
                ClsFEXOutAuthorize feCabResp = feXCAEResponse.FEXResultAuth;
                if (feCabResp != null)
                {
                    cabecera.CantReg    = 1; // ByAd: revisar
                    cabecera.CUIT       = feCabResp.Cuit;
                    cabecera.CbteTipo   = feCabResp.Cbte_tipo;
                    cabecera.FchProceso = DateTime.Now; // ByAd: revisar
                    cabecera.Resultado  = feCabResp.Resultado;
                    cabecera.PtoVta     = feCabResp.Punto_vta;

                    corrida.DetalleCabeceras.Add(cabecera);

                    TipoComprobanteDto tipoCbteDto = cbteSvc.ObtenerTipoComprobantePorCodigoAfip(cabecera.CbteTipo);
                    int tipoCbteId;
                    if (tipoCbteDto != null)
                    {
                        tipoCbteId = tipoCbteDto.Id;
                    }

                    // Procesar Comprobantes
                    DetalleComprobante     detalleCbte       = null;
                    ObservacionComprobante observacionesCbte = null;

                    detalleCbte           = new DetalleComprobante();
                    detalleCbte.Concepto  = 1; // ByAd revisar: aca es prdoucto, servicios o ambos
                    detalleCbte.DocTipo   = 80;
                    detalleCbte.DocNro    = feCabResp.Cuit;
                    detalleCbte.CbteDesde = feCabResp.Cbte_nro;
                    detalleCbte.CbteHasta = feCabResp.Cbte_nro;
                    detalleCbte.CbteFch   = DateTimeHelper.ConvertyyyyMMddToDate(feCabResp.Fch_cbte);
                    detalleCbte.Resultado = feCabResp.Resultado;

                    if (feCabResp.Resultado == ResultadoCbte.Aprobado)
                    {
                        detalleCbte.CAE       = feCabResp.Cae;
                        detalleCbte.CAEFchVto = DateTimeHelper.ConvertyyyyMMddToDate(feCabResp.Fch_venc_Cae);

                        // Si fue aprobado agrego una entidad Comprobante
                        Comprobante comprobante = new Comprobante();
                        comprobante.CAE = detalleCbte.CAE;
                        comprobante.CAEFechaVencimiento = detalleCbte.CAEFchVto;
                        comprobante.CbteDesde           = detalleCbte.CbteDesde;
                        comprobante.CbteHasta           = detalleCbte.CbteHasta;
                        comprobante.CbteFecha           = detalleCbte.CbteFch;
                        comprobante.PtoVta          = cabecera.PtoVta;
                        comprobante.FechaDeCarga    = DateTime.Now;
                        comprobante.TipoComprobante = ctx.TipoComprobantes.Where(tc => tc.CodigoAfip == cabecera.CbteTipo).FirstOrDefault();
                        if (detalleCbte.DocTipo == 80) // CUIT
                        {
                            ClienteDto clienteDto = clienteSvc.ObtenerClientePorCuit(detalleCbte.DocNro);
                            if (clienteDto != null)
                            {
                                comprobante.ClienteId = clienteDto.Id;
                            }
                        }
                        // #TODO: borrar
                        //EstadoComprobanteDto estadoDto = this.cbteSvc.ObtenerEstado(CodigoEstadoCbte.NoVisualizado);
                        //if (estadoDto != null)
                        //{
                        //    comprobante.EstadoId = estadoDto.Id;
                        //}
                        detalleCbte.Comprobantes.Add(comprobante);
                    }
                    else
                    {
                        if (!String.IsNullOrEmpty(feCabResp.Motivos_Obs))
                        {
                            observacionesCbte      = new ObservacionComprobante();
                            observacionesCbte.Code = 1; // ByAd: hardcodeado, ya que este tipo no recibe
                            observacionesCbte.Msg  = feCabResp.Motivos_Obs;
                            detalleCbte.ObservacionComprobantes.Add(observacionesCbte);
                        }
                    }

                    corrida.DetalleComprobantes.Add(detalleCbte);
                }

                if (feXCAEResponse.FEXEvents != null && !String.IsNullOrEmpty(feXCAEResponse.FEXEvents.EventMsg))
                {
                    // Procesar Eventos
                    DetalleEvento detalleEvento = null;
                    detalleEvento      = new DetalleEvento();
                    detalleEvento.Code = feXCAEResponse.FEXEvents.EventCode;
                    detalleEvento.Msg  = feXCAEResponse.FEXEvents.EventMsg;
                    corrida.DetalleEventos.Add(detalleEvento);
                }
                if (feXCAEResponse.FEXErr != null && !String.IsNullOrEmpty(feXCAEResponse.FEXErr.ErrMsg))
                {
                    // Procesar Errores
                    DetalleError detalleError = null;
                    detalleError      = new DetalleError();
                    detalleError.Code = feXCAEResponse.FEXErr.ErrCode;
                    detalleError.Msg  = feXCAEResponse.FEXErr.ErrMsg;
                    corrida.DetalleErrores.Add(detalleError);
                }

                corrida.Procesada = true;

                ctx.SaveChanges();
                return(ToCorridaDto(corrida, ctx.TipoDocumentoes.ToList(), ctx.TipoComprobantes.ToList(), ctx.TipoConceptoes.ToList()));
            }
        }