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; }
public ActionResult Create(FormCollection form) { if (ModelState.IsValid) { //db.Encabezado_Factura.Add(encabezado_Factura); //db.SaveChanges(); //return RedirectToAction("Index"); } int idCliente = Convert.ToInt32(form["ID_cliente"]); string documento = form["Cliente.Documento"]; string tipoDocumento = form["Cliente.TipoResponsables.Descripcion"]; int CondicionIVA = Convert.ToInt32(form["iva"]); double desc_Iva; if (CondicionIVA <= 2) { desc_Iva = 0; } else { string descripcion = db.CondicionIVA.Where(m => m.Codigo == CondicionIVA).FirstOrDefault().Descripcion; desc_Iva = Convert.ToDouble(descripcion.Replace('%', ' ')); desc_Iva = Math.Round(desc_Iva, 2); } string ID_condicion_venta = form["ID_condicion_venta"]; // DateTime FechaEmision = Convert.ToDateTime(form["Fecha"]); //int Remito = Convert.ToInt32(form["Nro_remito"]); int OrdenCompra = Convert.ToInt32(form["OrdenCompra"]); int DiasFF = Convert.ToInt32(form["Cliente.DiasFF"]); int DiasCheque = Convert.ToInt32(form["Cliente.Dias_Cheque"]); Decimal Descuento = Convert.ToDecimal(form["Descuento"].Replace('.', ',')); Double subtotal = Convert.ToDouble(form["subtotal"].Replace('.', ',')); Double total = Convert.ToDouble(form["total"].Replace('.', ',')); List<itemFactura> itemsFactura = new List<itemFactura>(); for (int i = 10; i < form.Count - 2; i = i + 4) { itemFactura item = new itemFactura { IdArticulo = Convert.ToInt32(form[form.GetKey(i)]), cantidad = Convert.ToDecimal(form[form.GetKey(i + 1)]), precioUnitario = Convert.ToDecimal(form[form.GetKey(i + 2)]), precioTotal = Convert.ToDecimal(form[form.GetKey(i + 3)]) }; itemsFactura.Add(item); } //Consdigo autoriazcion en AFIP para generar factura DetalleRegistros[] detalles = new DetalleRegistros[1]; DetalleRegistros det = new DetalleRegistros(); //el nro de comproabnte lo obtiene la libreria //Si no se le envia fecha de comprobante Afip asigna la fecha del proceso //det.CbteFch = FechaEmision.ToString("yyyy-MM-dd"); det.Concepto = 1; //1=Productos det.DocNro = Convert.ToInt64(documento); det.DocTipo = 80; //80=CUIT det.ImpTotal = Math.Round(total, 2); det.ImpNeto = Math.Round(subtotal,2); det.ImpTotConc = 0; det.ImpOpEx = 0; det.ImpTrib = 0; det.ImpIVA = Math.Round(subtotal * (desc_Iva / 100), 2); // det.MonId = "PES"; //peso det.MonCotiz = 1; //moneda argetnia es 1 if (CondicionIVA >= 3 && CondicionIVA <= 6) { Blibox.Logica.Model.IVA[] iva = new Blibox.Logica.Model.IVA[1]; iva[0] = new Blibox.Logica.Model.IVA(); iva[0].Id = CondicionIVA; //21% iva[0].BaseImp = subtotal; iva[0].Importe = subtotal * (desc_Iva / 100); det.Iva = iva; } detalles[0] = det; FECAERespuesta resp = FE.AutorizacionFactura(1, 1, 001, detalles); if (resp.Cabecera.Resultado == "A") { DateTime fechaVencCAE = DateTime.ParseExact(resp.Detalles[0].CAEFchVto, "yyyyMMdd", null); Encabezado_Factura encFactura = new Encabezado_Factura { CAE = resp.Detalles[0].CAE, Descuento = Descuento, Fecha = DateTime.Now, FechaVencimientoCAE = fechaVencCAE, ID_cliente = idCliente, ID_condicon_venta = Convert.ToInt32(ID_condicion_venta), IVA = Convert.ToDecimal(desc_Iva), NroComprobante = Convert.ToInt32(resp.Detalles[0].CbteDesde), Nro_remito = 0, OrdenCompra = OrdenCompra, Subtotal = Convert.ToDecimal(subtotal), Total = Convert.ToDecimal(total), Tipo = "1", //1=Factura A }; List<Detalle_factura> detFactura = new List<Detalle_factura>(); int id_item = 1; foreach (itemFactura item in itemsFactura) { Detalle_factura newDet = new Detalle_factura { Cantidad = item.cantidad, ID_articulo = item.IdArticulo, Precio_unitario = item.precioUnitario, Precio_total = item.precioTotal, ID_item = id_item }; detFactura.Add(newDet); id_item++; }; encFactura.Detalle_factura = detFactura; db.Encabezado_Factura.Add(encFactura); db.SaveChanges(); // ViewBag.ID_cliente = new SelectList(db.Cliente, "ID_cliente", "Razon_Social", encabezado_Factura.ID_cliente); return RedirectToAction("Index"); //return View(form); } else { // fue rechazada ver que hacer foreach(Error err in resp.Errores) { HelperController.Instance.agregarMensaje("Error "+err.Codigo+" - "+err.Mensaje, HelperController.CLASE_ERROR); } } //return View(form); ViewBag.ID_cliente = new SelectList(db.Cliente, "ID_cliente", "Razon_Social"); ViewBag.CondicionVenta = new SelectList(db.Condicion_venta, "ID_condicion_venta", "Descripcion"); ViewBag.CondicionIVA = new SelectList(db.CondicionIVA, "Codigo", "Descripcion", "5"); ViewBag.art = ""; return View(new Encabezado_Factura()); }
static void Main(string[] args) { ConsoleKeyInfo cki; do { Console.WriteLine(":: Menu para pruebas de AFIP facturacion electronica ::"); Console.WriteLine(""); Console.WriteLine("Presione una opcion: "); Console.WriteLine("1. Verificacar LoginTicket."); Console.WriteLine("2. Autorizacion de factura"); Console.WriteLine("ESC. Salir"); cki = Console.ReadKey(); if (cki.Key == ConsoleKey.D1 || cki.Key == ConsoleKey.NumPad1) { AutenticateAFIP(); } if (cki.Key == ConsoleKey.D2 || cki.Key == ConsoleKey.NumPad2) { DetalleRegistros[] detalles = new DetalleRegistros[1]; //factura sin errores DetalleRegistros det = new DetalleRegistros(); det.Concepto = 1; //producto det.DocTipo = 80; //cuit det.DocNro = 20111111112; det.CbteDesde = 3; det.CbteHasta = 3; det.CbteFch = "20160727"; det.ImpTotal = 121; //si importe total es mayor a cero debe existir IVAAlic det.ImpTotConc = 0; det.ImpNeto = 100; det.ImpOpEx = 0; det.ImpTrib = 0; det.ImpIVA = 21; det.MonId = "PES"; det.MonCotiz = 1; IVA[] iva = new IVA[1]; iva[0] = new IVA(); iva[0].Id = 5; //21% iva[0].BaseImp = 100; iva[0].Importe = 21; det.Iva = iva; detalles[0] = det; FE.AutorizacionFactura(1,1,001,detalles); //Console.WriteLine(FE.ReadElementsXML()); } Console.Read(); //pause Console.Clear(); } while (cki.Key != ConsoleKey.Escape); }