Example #1
0
        private static int obtenerUltimoComprobante(WSFEv1.FEAuthRequest auth, int ptoVenta, int cbteTipo)
        {
            try
            {
                WSFEv1.ServiceSoapClient fe = new WSFEv1.ServiceSoapClient();
                return fe.FECompUltimoAutorizado(auth, ptoVenta, cbteTipo).CbteNro;

            }
            catch (Exception ex) {
                return -1;
            }
        }
Example #2
0
        public static FECAERespuesta AutorizacionFactura(int nroRegistros, int PtoVta, int CbteTipo, DetalleRegistros[] detalles)
        {
            WSFEv1.ServiceSoapClient fe = new WSFEv1.ServiceSoapClient();
            WSFEv1.FEAuthRequest auth = new WSFEv1.FEAuthRequest();

            //AUTENTICACION
            /** Auth Información de la autenticación.Contiene los datos de Token, Sign y Cuit
              Token Token devuelto por el WSAA S
              Sign Sign devuelto por el WSAA S
              Cuit Cuit contribuyente(representado o Emisora) S 
            **/
            string strUrlWsaaWsdl = ConfigurationManager.AppSettings["DEFAULT_URLWSAAWSDL"];
            string strIdServicioNegocio = ConfigurationManager.AppSettings["DEFAULT_SERVICIO"]; 
            string strRutaCertSigner = ConfigurationManager.AppSettings["DEFAULT_CERTSIGNER"]; 
            bool blnVerboseMode = Convert.ToBoolean(ConfigurationManager.AppSettings["DEFAULT_VERBOSE"]); 

            LoginTicket login = new LoginTicket();
            Ticket TicketResponse = login.ObtenerLoginTicketResponse(strIdServicioNegocio, strUrlWsaaWsdl, strRutaCertSigner, blnVerboseMode);
            auth.Sign = TicketResponse.sign;
            auth.Token = TicketResponse.token; ;
            auth.Cuit = Convert.ToInt64(ConfigurationManager.AppSettings["CUIT"]);

            // REQUEST
            /** FeCAEReq: Información del comprobante o lote de comprobantes de ingreso. Contiene los datos de FeCabReq y FeDetReq
            FeCabReq: Información de la cabecera del comprobante o lote de comprobantes de ingreso (OBLIGATORIO)
            FeDetReq: Información del detalle del comprobante o lote de comprobantes de ingreso (OBLIGATORIO)
            **/

            //Defino FeCabReq
            WSFEv1.FECAERequest feCAEReq = new WSFEv1.FECAERequest();

            //Genero la Cabecera
            feCAEReq.FeCabReq = new WSFEv1.FECAECabRequest();

            feCAEReq.FeCabReq.CantReg = nroRegistros; //nro de registeros del detalle del lote o lotes de comprobantes
            feCAEReq.FeCabReq.CbteTipo = CbteTipo; //Tipo de comprobante que se está informando.Si se informa más de un comprobante, todos deben ser del mismo tipo.
                                                   // 001 - Factura A, 002 Nota Debito, 003 Nota Credito
            feCAEReq.FeCabReq.PtoVta = PtoVta;

            feCAEReq.FeDetReq = new WSFEv1.FECAEDetRequest[nroRegistros];

            int Cbte = obtenerUltimoComprobante(auth, PtoVta, CbteTipo)+1;
            
            
            


            DateTime fechaActual = DateTime.Now;
            //Genero FeDetReq con tantos registro como indique en la cabecera
            for (int i = 0; i < nroRegistros; i++) {

                feCAEReq.FeDetReq[i] = new WSFEv1.FECAEDetRequest();

                feCAEReq.FeDetReq[i].Concepto = detalles[i].Concepto ;
                feCAEReq.FeDetReq[i].DocTipo = detalles[i].DocTipo; 
                feCAEReq.FeDetReq[i].DocNro = detalles[i].DocNro;
                feCAEReq.FeDetReq[i].CbteDesde = Cbte;
                feCAEReq.FeDetReq[i].CbteHasta = Cbte;
                feCAEReq.FeDetReq[i].CbteFch = fechaActual.Year.ToString() + fechaActual.Month.ToString() + fechaActual.Day.ToString(); //detalles[i].CbteFch;
                feCAEReq.FeDetReq[i].ImpTotal = detalles[i].ImpTotal;
                feCAEReq.FeDetReq[i].ImpTotConc = detalles[i].ImpTotConc;
                feCAEReq.FeDetReq[i].ImpNeto = detalles[i].ImpNeto;
                feCAEReq.FeDetReq[i].ImpOpEx = detalles[i].ImpOpEx;
                feCAEReq.FeDetReq[i].ImpIVA = detalles[i].ImpIVA;
                feCAEReq.FeDetReq[i].ImpTrib = detalles[i].ImpTrib;
                feCAEReq.FeDetReq[i].FchServDesde = detalles[i].FchServDesde;
                feCAEReq.FeDetReq[i].FchServHasta = detalles[i].FchServHasta;
                feCAEReq.FeDetReq[i].FchVtoPago = detalles[i].FchVtoPago;
                feCAEReq.FeDetReq[i].MonId = detalles[i].MonId;
                feCAEReq.FeDetReq[i].MonCotiz = detalles[i].MonCotiz;
              
                //CbtesAsoc
                int cantCbtesAsoc = ((detalles[i].cbtesAsoc == null) ? 0 : detalles[i].cbtesAsoc.Length);

                if (cantCbtesAsoc > 0)
                { 
                    feCAEReq.FeDetReq[i].CbtesAsoc = new WSFEv1.CbteAsoc[cantCbtesAsoc];
                
                    for (int j=0; j< cantCbtesAsoc; j++)
                    {
                        feCAEReq.FeDetReq[i].CbtesAsoc[j] = new WSFEv1.CbteAsoc();

                        feCAEReq.FeDetReq[i].CbtesAsoc[j].Tipo = detalles[i].cbtesAsoc[j].Tipo;
                        feCAEReq.FeDetReq[i].CbtesAsoc[j].Nro = detalles[i].cbtesAsoc[j].Nro;
                        feCAEReq.FeDetReq[i].CbtesAsoc[j].PtoVta = detalles[i].cbtesAsoc[j].PtoVta;
                    }
                }

                //Tributos
                int cantTributos = ((detalles[i].tributos == null) ? 0 : detalles[i].tributos.Length) ;

                if (cantTributos > 0)
                { 
                    feCAEReq.FeDetReq[i].Tributos = new WSFEv1.Tributo[cantTributos];

                    for (int j = 0; j < cantTributos; j++)
                    {
                        feCAEReq.FeDetReq[i].Tributos[j] = new WSFEv1.Tributo();

                        feCAEReq.FeDetReq[i].Tributos[j].Alic = detalles[i].tributos[j].Alic;
                        feCAEReq.FeDetReq[i].Tributos[j].BaseImp = detalles[i].tributos[j].BaseImp;
                        feCAEReq.FeDetReq[i].Tributos[j].Desc = detalles[i].tributos[j].Desc;
                        feCAEReq.FeDetReq[i].Tributos[j].Id = detalles[i].tributos[j].Id;
                        feCAEReq.FeDetReq[i].Tributos[j].Importe = detalles[i].tributos[j].Importe;

                    }
                }

                //IVA
                int cantIVA = ((detalles[i].Iva == null) ? 0 : detalles[i].Iva.Length);

                if (cantIVA > 0)
                { 
                    feCAEReq.FeDetReq[i].Iva = new WSFEv1.AlicIva[cantIVA];

                    for (int j = 0; j < cantIVA; j++)
                    {

                        feCAEReq.FeDetReq[i].Iva[j] = new WSFEv1.AlicIva();

                        feCAEReq.FeDetReq[i].Iva[j].BaseImp = detalles[i].Iva[j].BaseImp;
                        feCAEReq.FeDetReq[i].Iva[j].Id = detalles[i].Iva[j].Id;
                        feCAEReq.FeDetReq[i].Iva[j].Importe = detalles[i].Iva[j].Importe;
                    }
                }
                
                //Opcionales
                int cantOpcionales = ((detalles[i].opcionales == null) ? 0 : detalles[i].opcionales.Length);

                if (cantOpcionales > 0)
                { 
                    feCAEReq.FeDetReq[i].Opcionales = new WSFEv1.Opcional[cantOpcionales];

                    for (int j = 0; j < cantOpcionales; j++)
                    {
                        feCAEReq.FeDetReq[i].Opcionales[j] = new WSFEv1.Opcional();

                        feCAEReq.FeDetReq[i].Opcionales[j].Valor = detalles[i].opcionales[j].Valor;
                        feCAEReq.FeDetReq[i].Opcionales[j].Id = detalles[i].opcionales[j].Id;
                    }
                }



            }

            //Datos de la respuesta
            FECAERespuesta respuesta = new FECAERespuesta();
            List<Observacion> Observaciones = new List<Observacion>();

            //Solicita CAE
            WSFEv1.FECAEResponse response = fe.FECAESolicitar(auth, feCAEReq);


            //En la cabecera esta la respuesta de la solicitud
            FECAERespuestaCabecera cabecera = new FECAERespuestaCabecera()
            {
                Cuit = response.FeCabResp.Cuit,
                CantReg = response.FeCabResp.CantReg,
                CbteTipo = response.FeCabResp.CbteTipo,
                FchProceso = response.FeCabResp.FchProceso,
                PtoVta = response.FeCabResp.PtoVta,
                Resultado = response.FeCabResp.Resultado
            };
            respuesta.Cabecera = cabecera;

            int cantDetalles = ((response.FeCabResp == null) ? 0 : response.FeCabResp.CantReg);

            if (cantDetalles > 0)
            {

                List<FECAERespuestaDetalle> DetallesRespuesta = new List<FECAERespuestaDetalle>();

                for (int i=0 ; i < response.FeCabResp.CantReg; i++)
                {
                    FECAERespuestaDetalle det = new FECAERespuestaDetalle
                    {
                        CAE =  response.FeDetResp[i].CAE,
                        CAEFchVto = response.FeDetResp[i].CAEFchVto,
                        CbteDesde = response.FeDetResp[i].CbteDesde,
                        CbteFch = response.FeDetResp[i].CbteFch,
                        CbteHasta = response.FeDetResp[i].CbteHasta,
                        Concepto = response.FeDetResp[i].Concepto,
                        DocNro =  response.FeDetResp[i].DocNro,
                        DocTipo = response.FeDetResp[i].DocTipo,
                        Resultado = response.FeDetResp[i].Resultado,

                     };

                    int cantObservaciones = ((response.FeDetResp[i].Observaciones == null) ? 0 : response.FeDetResp[i].Observaciones.Length);

                    if (cantObservaciones > 0){

                        det.Observaciones = new List<Observacion>();

                        for (int j=0; j<cantObservaciones; j++)
                        det.Observaciones.Add(new Observacion {
                            Codigo =  response.FeDetResp[i].Observaciones[j].Code,
                            Mensaje = response.FeDetResp[i].Observaciones[j].Msg
                        });

                    }

                    DetallesRespuesta.Add(det);

                }

                respuesta.Detalles = DetallesRespuesta;
            }

            int cantErrores = ((response.Errors == null) ? 0 : response.Errors.Length);

            if (cantErrores > 0)
            {

                List<Error> ErroresRespuesta = new List<Error>();

                for (int i = 0; i < cantErrores; i++)
                {
                    Error err = new Error
                    {
                        Codigo = response.Errors[i].Code,
                        Mensaje = response.Errors[i].Msg
                    };

                    ErroresRespuesta.Add(err);

                }

                respuesta.Errores = ErroresRespuesta;
            }


            //FALTA GUARDAR LOS EVENTOS Y ERRORES
            return respuesta;
            
        }