Ejemplo n.º 1
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;
            
        }
Ejemplo n.º 2
0
        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());
        }
Ejemplo n.º 3
0
        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);


        }