//Terminar public FECAEResponse AutorizarFactura(Venta ventaFactura) { var FECabeceraReq = new FECAECabRequest(); FECabeceraReq.CantReg = 1; // Cantidad de Registros. FECabeceraReq.CbteTipo = (int)ventaFactura.Comprobante.TipoComprobante; //tipo de factura FECabeceraReq.PtoVta = ventaFactura.PtoDeVenta.NroPuntoDeVenta; // Numero del Punto de venta. var FEDetalleReq = new FECAEDetRequest(); FEDetalleReq.DocTipo = (int)ventaFactura.Cliente.DocTipo; //Tipo de Identificación del comprado. FEDetalleReq.DocNro = ventaFactura.Cliente.Cuil; //Nro. De identificación del comprador FEDetalleReq.MonId = ServiceConect.FEParamGetTiposMonedas(AuthAutorizar).ResultGet[0].Id; //Codigo Moneda (PES) FEDetalleReq.MonCotiz = 1; //Cotización de la moneda informada. Para PES, pesos argentinos la misma debe ser 1 FEDetalleReq.CbteDesde = ventaFactura.Comprobante.NroComprobante + 1; //Nro. De comprobante desde FEDetalleReq.CbteHasta = ventaFactura.Comprobante.NroComprobante + 1; //Nro. De comprobante registrado hasta FEDetalleReq.Concepto = (int)ventaFactura.TipoConcepto; //Concepto (De producto) FEDetalleReq.ImpTotal = ventaFactura.Total; // Importe total del comprobante FEDetalleReq.ImpNeto = ventaFactura.Total; //Para comprobantes tipo C este campo corresponde al Importe del Sub Total (SIN IMPUESTO) FEDetalleReq.ImpTotConc = 0; //Para comprobantes tipo C debe ser igual a cero(0). FEDetalleReq.ImpOpEx = 0; //Importe Externo. Para comprobantes tipo C debe ser igual a cero (0). FEDetalleReq.ImpIVA = 0; //Importes Array IVa. Para comprobantes tipo C debe ser igual a cero (0). FEDetalleReq.ImpTrib = 0; //Suma importes Array tributo. var FECAEreq = new FECAERequest(); FECAEreq.FeCabReq = FECabeceraReq; FECAEreq.FeDetReq = new FECAEDetRequest[] { FEDetalleReq }; return(ServiceConect.FECAESolicitar(AuthAutorizar, FECAEreq)); }
public void agregaTributo(int id, string desc, double baseImp, double alic, double importe) { if (mFECAERequest.FeDetReq.Length > 0) { FECAEDetRequest lDetRequest = mFECAERequest.FeDetReq[mFECAERequest.FeDetReq.GetUpperBound(0)]; Tributo[] tributos = lDetRequest.Tributos; if (lDetRequest.Tributos == null) { Array.Resize(ref tributos, 1); } else { Array.Resize(ref tributos, tributos.Length + 1); } lDetRequest.Tributos = tributos; lDetRequest.Tributos[lDetRequest.Tributos.GetUpperBound(0)] = new FEAFIPLib.wsfev1.Tributo(); var _with3 = lDetRequest.Tributos[lDetRequest.Tributos.GetUpperBound(0)]; _with3.Alic = alic; _with3.BaseImp = baseImp; _with3.Desc = desc; _with3.Id = (short)id; _with3.Importe = importe; decimal decImp = (decimal)(lDetRequest.ImpTrib + importe); lDetRequest.ImpTrib = (double)decImp; } }
private double CalcularTributos( FECAEDetRequest feCaeDet ) { double totalesTributos = 0; if ( feCaeDet.Tributos != null ) { totalesTributos = Redondeo.SumarDoubles( (from x in feCaeDet.Tributos select x.Importe).ToArray() ); } return totalesTributos; }
private double CalcularIva( FECAEDetRequest feCaeDet ) { double totalesIva = 0; if ( feCaeDet.Iva != null ) { totalesIva = Redondeo.SumarDoubles( (from x in feCaeDet.Iva select x.Importe).ToArray() ); } return totalesIva; }
public FECAEDetRequest Convertir( FeDetalle detalle, bool arreglar ) { FECAEDetRequest feCaeDet = new FECAEDetRequest(); feCaeDet.Concepto = (int)detalle.Concepto; feCaeDet.DocTipo = (int)detalle.DocumentoTipo; feCaeDet.DocNro = detalle.DocumentoNumero; feCaeDet.CbteDesde = detalle.ComprobanteDesde; feCaeDet.CbteHasta = detalle.ComprobanteDesde; feCaeDet.CbteFch = detalle.ComprobanteFecha; feCaeDet.ImpTotal = Redondeo.Aplicar(detalle.ImporteTotal); feCaeDet.ImpTotConc = Redondeo.Aplicar(detalle.ImporteNetoNoGravado); feCaeDet.ImpNeto = Redondeo.Aplicar(detalle.ImporteNeto); feCaeDet.ImpOpEx = Redondeo.Aplicar(detalle.ImporteExento); feCaeDet.ImpTrib = Redondeo.Aplicar(detalle.ImporteTributos); feCaeDet.FchServDesde = detalle.FechaServicioDesde; feCaeDet.FchServHasta = detalle.FechaServicioHasta; feCaeDet.FchVtoPago = detalle.FechaVencimientoDePago; feCaeDet.MonId = detalle.MonedaId; feCaeDet.MonCotiz = detalle.MonedaCotizacion; this.ConvertirComprobantesAsociados( detalle, feCaeDet ); this.ConvertirTributos( detalle, feCaeDet ); this.ConvertirIVA( detalle, feCaeDet ); feCaeDet.ImpIVA = this.CalcularIva( feCaeDet ); feCaeDet.ImpTrib = this.CalcularTributos( feCaeDet ); this.ConvertirDatosAdicionales( detalle, feCaeDet ); if ( arreglar ) { if ( !this.ValidarSumaImporteTotal( feCaeDet ) ) { this.TratarDeArreglarRedondeando( feCaeDet, detalle ); } if ( !this.ValidarSumaImporteTotal( feCaeDet ) ) { this.TratarDeArreglarCocinando( feCaeDet, detalle ); } if ( !this.ValidarSumaImporteTotal( feCaeDet ) ) { // fallo todo, dejo como estaba feCaeDet = this.Convertir( detalle, false ); } } return feCaeDet; }
public FECAERequest Convertir( FeCabecera cabFe ) { FECAECabRequest cab = this.ConvertirCabecera( cabFe ); int i = 0; FECAEDetRequest[] detalleComprobantes = new FECAEDetRequest[cabFe.DetalleComprobantes.Count]; WrapperDetalleFe wdf = new WrapperDetalleFe(); foreach ( FeDetalle detalle in cabFe.DetalleComprobantes ) { detalleComprobantes[i] = wdf.Convertir( detalle ); i++; } FECAERequest feCaeRequest = new FECAERequest(); feCaeRequest.FeCabReq = cab; feCaeRequest.FeDetReq = detalleComprobantes; return feCaeRequest; }
public void agregaOpcional(string id, string valor) { if (mFECAERequest.FeDetReq.Length > 0) { FECAEDetRequest lDetRequest = mFECAERequest.FeDetReq[mFECAERequest.FeDetReq.GetUpperBound(0)]; Opcional[] opcionales = lDetRequest.Opcionales; if (lDetRequest.Opcionales == null) { Array.Resize(ref opcionales, 1); } else { Array.Resize(ref opcionales, opcionales.Length + 1); } lDetRequest.Opcionales = opcionales; lDetRequest.Opcionales[lDetRequest.Opcionales.GetUpperBound(0)] = new FEAFIPLib.wsfev1.Opcional(); var _with4 = lDetRequest.Opcionales[lDetRequest.Opcionales.GetUpperBound(0)]; _with4.Id = id; _with4.Valor = valor; } }
public void agregaCbteAsoc(int tipo, int ptoVta, long nro) { if (mFECAERequest.FeDetReq.Length > 0) { FECAEDetRequest lDetRequest = mFECAERequest.FeDetReq[mFECAERequest.FeDetReq.GetUpperBound(0)]; CbteAsoc[] cbteAsoc = lDetRequest.CbtesAsoc; if (lDetRequest.Opcionales == null) { Array.Resize(ref cbteAsoc, 1); } else { Array.Resize(ref cbteAsoc, cbteAsoc.Length + 1); } lDetRequest.CbtesAsoc = cbteAsoc; lDetRequest.CbtesAsoc[lDetRequest.CbtesAsoc.GetUpperBound(0)] = new FEAFIPLib.wsfev1.CbteAsoc(); var _with5 = lDetRequest.CbtesAsoc[lDetRequest.CbtesAsoc.GetUpperBound(0)]; _with5.Nro = nro; _with5.PtoVta = ptoVta; _with5.Tipo = tipo; } }
private void ConvertirIVA( FeDetalle detalle, FECAEDetRequest feCaeDet ) { if ( detalle.Iva.Count > 0 ) { int i = 0; feCaeDet.Iva = new AlicIva[detalle.Iva.Count]; WrapperIvaFe wic = new WrapperIvaFe(); foreach ( IVA iva in detalle.Iva ) { feCaeDet.Iva[i] = wic.Convertir( iva ); i++; } } }
public static void SolicitarCAE(this IComprobanteElectronico comprobante, string ta_path, Hamekoz.Core.ICallBack callback) { var service = new Service(); //HACK para cambiar de produccion a homologacion #if DEBUG service = new Service(homo_url); #endif var ta = TA(ta_path); //TODO ahora podria utilizar comprobante.Tipo.Codigo validando que sea un valor adecuado int tipo = ComprobanteTipo(comprobante); int punto_de_venta = int.Parse(comprobante.Tipo.Pre); var fECompUltimoAutorizado = service.FECompUltimoAutorizado(ta, punto_de_venta, tipo); int numero = fECompUltimoAutorizado.CbteNro; numero++; var feCabReq = new FECAECabRequest { CantReg = 1, CbteTipo = tipo, PtoVta = punto_de_venta }; var fEDetRequest = new FECAEDetRequest { CbteDesde = numero, CbteFch = comprobante.Emision.ToString("yyyyMMdd"), CbteHasta = numero, CbtesAsoc = null, //TODO en caso de que sean comprobantes vinculados Compradores = null, //TODO revisar porque no encuentro documentacion //HACK producto Concepto = 1, DocNro = long.Parse(comprobante.Responsable.CUIT.Limpiar()), //HACK CUIT DocTipo = 80, ImpIVA = (double)comprobante.IVA, //TODO debe excluirse el importe exento, para tipo C debe ser 0 ImpNeto = (double)(comprobante.Gravado - comprobante.Exento), ImpOpEx = (double)comprobante.Exento, ImpTotal = (double)comprobante.Total, //TODO en caso de ser de tipo C debe ser siempre 0 ImpTotConc = (double)comprobante.NoGravado, ImpTrib = (double)comprobante.Tributos, Iva = comprobante.FEIVAS().ToArray(), MonCotiz = 1, //TODO pasar la cotizacion correcta MonId = "PES", //TODO pasar la moneda correcta Opcionales = null, Tributos = comprobante.Tributos > 0 ? comprobante.FETributos().ToArray() : null, }; var feDetReq = new List <FECAEDetRequest> (); feDetReq.Add(fEDetRequest); var solicitud = new FECAERequest { FeCabReq = feCabReq, FeDetReq = feDetReq.ToArray() }; FECAEResponse fECAEResponse = service.FECAESolicitar(ta, solicitud); if (fECAEResponse.Events != null) { foreach (var evento in fECAEResponse.Events) { string mensaje = string.Format("Código: {0}. Mensaje: {1}", evento.Code, evento.Msg); callback.CallBack.OnMessage("Evento AFIP", mensaje); } } if (fECAEResponse.Errors != null) { var errores = new StringBuilder(); foreach (var error in fECAEResponse.Errors) { errores.AppendFormat("Código: {0}. Mensaje: {1}", error.Code, error.Msg); errores.AppendLine(); } throw new AFIPException(errores.ToString()); } //TODO refactorizar para soportar un lote de comprobantes var observaciones = new StringBuilder(); if (fECAEResponse.FeDetResp [0].Observaciones != null) { foreach (var observacion in fECAEResponse.FeDetResp[0].Observaciones) { observaciones.AppendFormat("Código: {0}. Mensaje: {1}", observacion.Code, observacion.Msg); observaciones.AppendLine(); } callback.CallBack.OnWarning("Comprobante con observaciones", observaciones.ToString()); } if (fECAEResponse.FeDetResp [0].Resultado == "R") { string errorAfip = string.Format("Comprobante rechazado.\n{0}", observaciones); throw new AFIPException(errorAfip); } //TODO ver si el formato seria correcto comprobante.Tipo.UltimoNumero = numero; comprobante.NumeroAFIP = string.Format("{0:0000}-{1:00000000}", punto_de_venta, numero); comprobante.Numero = comprobante.NumeroAFIP; comprobante.CAE = fECAEResponse.FeDetResp [0].CAE; comprobante.VencimientoCAE = fECAEResponse.FeDetResp [0].CAEFchVto; comprobante.ComentariosAFIP = observaciones.ToString(); }
/// <summary> /// Validacion para anticipar error 10048 - El campo "Importe Total" (ImpTotal), debe ser igual a la suma de ImpTotConc + ImpNeto + ImpOpEx + ImpTrib + ImpIva /// </summary> /// <param name="detalle">detalle del request a la ADIP</param> private bool ValidarSumaImporteTotal( FECAEDetRequest detalle ) { return this.ObtenerDiferenciaTotales( detalle ) == 0; }
/// <summary> /// Pone los valores redondeados /// </summary> /// <param name="feCaeDet">detalle del request a la ADIP</param> /// <param name="detalle">detalle wrappeado, con los valores de Organic/Lince</param> private void TratarDeArreglarRedondeando( FECAEDetRequest feCaeDet, FeDetalle detalle ) { Decimal ivaOriginal = (Decimal)feCaeDet.ImpIVA; Decimal tributosOriginal = (Decimal)feCaeDet.ImpTrib; // Total no se toca // feCaeDet.ImpTotal = Redondeo.Aplicar( detalle.ImporteTotal ); feCaeDet.ImpTotConc = Redondeo.Redondear( detalle.ImporteNetoNoGravado ); feCaeDet.ImpNeto = Redondeo.Redondear( detalle.ImporteNeto ); feCaeDet.ImpOpEx = Redondeo.Redondear( detalle.ImporteExento ); feCaeDet.ImpTrib = Redondeo.Redondear( detalle.ImporteTributos ); feCaeDet.ImpIVA = Redondeo.Redondear( detalle.ImporteIVA ); #region Arreglo IVA. Si cambia, la suma de la coleccion debe dar lo mismo if ( (Decimal)feCaeDet.ImpIVA != ivaOriginal ) { // le pego a algun IVA para que no falle // validacion 10023 La suma de los campos <importe> en <IVA> debe ser igual al valor ingresado en ImpIVA. Decimal diferencia = (Decimal)feCaeDet.ImpIVA - ivaOriginal; try { feCaeDet.Iva[0].Importe = Redondeo.SumarDoubles( new double[] { feCaeDet.Iva[0].Importe, (double)diferencia } ); } finally { } } #endregion #region Arreglo Tributos. Si cambia, la suma de la coleccion debe dar lo mismo if ( (Decimal)feCaeDet.ImpTrib != tributosOriginal ) { // le pego a alguno para que no falle // validacion 10029 La suma de los importes en <Tributo> debe ser igual al valor ingresado en ImpTrib Decimal diferencia = (Decimal)feCaeDet.ImpTrib - tributosOriginal; try { feCaeDet.Tributos[0].Importe = Redondeo.SumarDoubles( new double[] { feCaeDet.Tributos[0].Importe, (double)diferencia } ); } finally { } } #endregion }
public string comprobante_electronico(int tipocomprobante, long nrodoc, double total, double neto21, double civa21, double neto105, double civa105, ref string cae, ref string fechavto, ref string tipofactura, ref string puntoventa) { try { LoginClass miloginclase = new LoginClass("wsfe", NegocioConfigEmpresa.urllogin, @"C:\CertificadodonVito\certificado.pfx", ""); miloginclase.hacerLogin(miloginclase); int doctipoid = 96; authRequest = new FEAuthRequest(); authRequest.Cuit = NegocioConfigEmpresa.emcuit; authRequest.Sign = miloginclase.Sing; authRequest.Token = miloginclase.Token; Service servicio = new Service(); servicio = getServicio(); servicio.Url = NegocioConfigEmpresa.urlservicio; //servicio.ClientCertificates.Add(certificado); //ver conceptoid int conceptoid = CONCEPTO_PRODUCTO; if (nrodoc.ToString().Length == 11) { doctipoid = 80; } // Service service = getServicio(); servicio.ClientCertificates.Add(miloginclase.Certificado); FECAERequest req = new FECAERequest(); FECAECabRequest cab = new FECAECabRequest(); FECAEDetRequest det = new FECAEDetRequest(); cab.CantReg = 1; cab.PtoVta = Convert.ToInt32(NegocioConfigEmpresa.puntoventa); cab.CbteTipo = tipocomprobante; req.FeCabReq = cab; det.Concepto = conceptoid; det.DocTipo = doctipoid; det.DocNro = nrodoc; // ultimo comprobante autorizado FERecuperaLastCbteResponse lastres = servicio.FECompUltimoAutorizado(authRequest, 3, tipocomprobante); int last = lastres.CbteNro; det.CbteDesde = last + 1; det.CbteHasta = last + 1; int nrocomprobante = last + 1; det.CbteFch = DateTime.Now.ToString("yyyyMMdd"); if (tipocomprobante == 1 || tipocomprobante == 6) { decimal totalneto = decimal.Round(Convert.ToDecimal(neto21 + neto105), 2); decimal totaliva = decimal.Round(Convert.ToDecimal(civa21 + civa105), 2); det.ImpNeto = Convert.ToDouble(totalneto); det.ImpIVA = Convert.ToDouble(totaliva); } else { det.ImpNeto = total; det.ImpIVA = 0; } det.ImpTotal = total; det.ImpTotConc = 0.00; det.ImpOpEx = 0.00; det.ImpTrib = 0.00; det.MonId = "PES"; det.MonCotiz = 1; int tipoalicuota = ID_TASA_IVA_NINGUNO; AlicIva alicuota = new AlicIva(); if (tipocomprobante == TIPOCOMPROBANTE_FACTURA_A || tipocomprobante == TIPOCOMPROBANTE_FACTURA_B) { tipoalicuota = ID_TASA_IVA_21_00; alicuota.Id = tipoalicuota; alicuota.BaseImp = neto21; alicuota.Importe = civa21; if (neto105 > 0) { AlicIva alicuota2 = new AlicIva(); tipoalicuota = ID_TASA_IVA_10_50; alicuota2.Id = tipoalicuota; alicuota2.BaseImp = neto105; alicuota2.Importe = civa105; det.Iva = new[] { alicuota, alicuota2 }; } else { det.Iva = new[] { alicuota }; } } else { alicuota.Id = tipoalicuota; alicuota.BaseImp = 0; alicuota.Importe = 0; det.Iva = new[] { alicuota }; } req.FeDetReq = new[] { det }; FECAEResponse r = servicio.FECAESolicitar(authRequest, req); cae = r.FeDetResp[0].CAE; //string CAE string ESTADO = r.FeCabResp.Resultado; string resultado = r.FeDetResp[0].Resultado; fechavto = r.FeDetResp[0].CAEFchVto;//string vto puntoventa = NegocioConfigEmpresa.puntoventa; tipofactura = tipocomprobante.ToString("00"); string m = "ok"; { if (r.FeDetResp[0].Observaciones is object) { foreach (var o in r.FeDetResp[0].Observaciones) { m += string.Format("Obs: {0} ({1})", o.Msg, o.Code) + Constants.vbCrLf; } } } { if (r.Errors is object) { foreach (var er in r.Errors) { m += string.Format("Er: {0}: {1}", er.Code, er.Msg) + Constants.vbCrLf; } } } { if (r.Events is object) { foreach (var ev in r.Events) { m += string.Format("Ev: {0}: {1}", ev.Code, ev.Msg) + Constants.vbCrLf; } } } if (m == "ok") { m = m + nrocomprobante.ToString(); } return(m); } catch (Exception) { throw; } // string error = r.error; // string desde = r.FeDetResp[0].CbteDesde; // string hasta = r.FeDetResp[0].CbteHasta; // string OBSERVACION = r.FeDetResp[0].Observaciones; }
private bool GetCae() { try { lblStatus.Text = @"Importando registros"; barProgress.Style = ProgressBarStyle.Continuous; barProgress.Maximum = _dataAfip.Facturas.Count; _db.Connect(); var wsaa = new WsaaClient(); var pass = new SecureString(); foreach (var c in ConfigInfo.PfxPass) { pass.AppendChar(c); } pass.MakeReadOnly(); wsaa.ObtenerLoginTicketResponse("wsfe", ConfigInfo.WsaaUrl, ConfigInfo.PfxPath, pass, null, null, null, true); var authRequest = new FEAuthRequest { Token = wsaa.Token, Sign = wsaa.Sign, Cuit = ConfigInfo.CUIT }; var svcWsfe = new Afip.Wsfe.Service { Url = ConfigInfo.WsfeUrl }; var sb = new StringBuilder(); foreach (var f in _dataAfip.Facturas) { var cab = new FECAECabRequest { CantReg = 1, PtoVta = f.PuntoVenta, CbteTipo = f.TipoComprobante }; var det = new FECAEDetRequest { Concepto = 1, DocTipo = f.CodigoDocumento, DocNro = f.IdComprador, CbteDesde = f.NumeroComprobante, CbteHasta = f.NumeroComprobanteRegistrado, CbteFch = f.FechaComprobante.ToString(), ImpTotal = f.ImporteTotal, ImpTotConc = f.ImporteTotalSinNetoGravado, ImpNeto = f.ImporteNetoGravado, ImpOpEx = f.ImporteOperacionesExentas, ImpTrib = f.ImportePagosCuentaImpuestos, ImpIVA = f.ImpuestoLiquidado, FchServDesde = f.FechaDesde.ToString(), FchServHasta = f.FechaHasta.ToString(), FchVtoPago = f.FechaVencimientoPago.ToString(), MonId = "PES", MonCotiz = 1 }; var req = new FECAERequest { FeCabReq = cab, FeDetReq = new[] { det } }; var response = svcWsfe.FECAESolicitar(authRequest, req); var saveData = true; if (response.FeDetResp[0].Observaciones != null) { foreach (var o in response.FeDetResp[0].Observaciones) { sb.AppendLine($"Obs: {o.Code} - {o.Msg}"); } saveData = false; } if (response.Errors != null) { foreach (var o in response.Errors) { sb.AppendLine($"Err: {o.Code} - {o.Msg}"); } saveData = false; } if (response.Events != null) { foreach (var o in response.Events) { sb.AppendLine($"Evt: {o.Code} - {o.Msg}"); } saveData = false; } if (saveData) { var query = "UPDATE Facturas SET Cae = @Cae, CaeVto = @CaeVto WHERE IdArchivo = @IdArchivo AND Id = @Id"; var parameters = new Hashtable { { "@Cae", response.FeDetResp[0].CAE }, { "@CaeVto", response.FeDetResp[0].CAEFchVto }, { "@IdArchivo", f.IdArchivo }, { "@Id", f.Id } }; _db.ExecuteNonQuery(query, parameters); } lblStatus.Text = $@"Registro {barProgress.Value}/{barProgress.Maximum}"; barProgress.PerformStep(); Application.DoEvents(); } if (sb.Length > 0) { throw new ApplicationException(sb.ToString()); } return(true); } catch (Exception ex) { MessageBox.Show(ex.Message); return(false); } finally { lblStatus.Text = string.Empty; barProgress.Value = 0; _db.Disconnect(); } }
public static FECAERequest GetDetRequest(Comprobante comprobante) { var req = new FECAERequest { FeCabReq = new FECAECabRequest { CantReg = 1, PtoVta = comprobante.Sector } }; if (comprobante.Tipo != null) { req.FeCabReq.CbteTipo = (( ComprobanteTipo )comprobante.Tipo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)).Codigo; } var detReq = new FECAEDetRequest( ); detReq.CbteDesde = detReq.CbteHasta = comprobante.Numero; detReq.CbteFch = comprobante.Fecha.ToString("yyyyMMdd"); detReq.FchServDesde = comprobante.InicioPrestacion.ToString("yyyyMMdd"); detReq.FchServHasta = comprobante.FinPrestacion.ToString("yyyyMMdd"); if (comprobante.Vencimiento != null) { detReq.FchVtoPago = comprobante.Vencimiento.Value.ToString("yyyyMMdd"); } detReq.MonCotiz = ( double )comprobante.Cambio; if (comprobante.Especie != null) { detReq.MonId = (( Moneda )comprobante.Especie.Moneda.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)).Codigo; } if (comprobante.IdentificacionTipo != null) { detReq.DocTipo = (( IdentificacionTipo )comprobante.IdentificacionTipo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)).Codigo; } detReq.DocNro = Convert.ToInt64(comprobante.IdentificacionNro); double impGrav = 0, impIva = 0, impTrib = 0, impNoGrav = 0, impExento = 0; foreach (var item in comprobante.Items) { switch (( ConceptosGrupos )item.Concepto.Grupo) { case ConceptosGrupos.NoGrav: impNoGrav += ( double )item.ImporteTotal; break; case ConceptosGrupos.Exento: impExento += ( double )item.ImporteTotal; break; case ConceptosGrupos.Grav0: case ConceptosGrupos.Grav105: case ConceptosGrupos.Grav21: case ConceptosGrupos.Grav27: impGrav += ( double )item.ImporteTotal; break; case ConceptosGrupos.IVA0: case ConceptosGrupos.IVA105: case ConceptosGrupos.IVA21: case ConceptosGrupos.IVA27: impIva += ( double )item.ImporteTotal; if (detReq.Iva == null) { detReq.Iva = new List <AlicIva>( ); } detReq.Iva.Add(new AlicIva { BaseImp = ( double )item.BaseImponible, Id = Convert.ToInt32(item.Concepto.Grupo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)), Importe = ( double )item.ImporteTotal }); break; default: if (!string.IsNullOrWhiteSpace(Convert.ToString(item.Concepto.Grupo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)))) { impTrib += ( double )item.ImporteTotal; if (detReq.Tributos == null) { detReq.Tributos = new List <Tributo>( ); } detReq.Tributos.Add(new Tributo { BaseImp = ( double )item.BaseImponible, Id = Convert.ToInt16(item.Concepto.Grupo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)), Importe = ( double )item.ImporteTotal }); } break; } } detReq.ImpNeto = impGrav; detReq.ImpOpEx = impExento; detReq.ImpTotConc = impNoGrav; detReq.ImpIVA = impIva; detReq.ImpTrib = impTrib; detReq.Concepto = 2; detReq.ImpTotal = Math.Round(detReq.ImpNeto + detReq.ImpOpEx + detReq.ImpTotConc + detReq.ImpIVA + detReq.ImpTrib, 2); req.FeDetReq = new List <FECAEDetRequest> { detReq }; return(req); }
public static void ConectarAfip(int cantReg, TextBox txtTOTALFactura, TextBox txtSubTotalFactura) { var codigoAfipService = "C88DFF36-99E6-4BF6-8A98-31FDCB8E016B"; var fechaActual = DateTime.Now; var numeroUltimoAutorizado = 0; FEAuthRequest feAuth = new FEAuthRequest(); using (var service = new LoginServiceClient()) { var auth = service.SolicitarAutorizacion(codigoAfipService); feAuth.Cuit = auth.Cuit; feAuth.Sign = auth.Sign; feAuth.Token = auth.Token; } FECAERequest FECAEReq = new FECAERequest(); FECAECabRequest FeCabReq = new FECAECabRequest(); FECAEDetRequest FeDetReq = new FECAEDetRequest(); FeCabReq.CantReg = cantReg; FeCabReq.CbteTipo = 11; //Factura C FeCabReq.PtoVta = 1; FeDetReq.Concepto = 1; //Productos FeDetReq.DocTipo = 99; //Sin identificar/Venta global diaria FeDetReq.DocNro = 5; //PREGUNTAR PROFE FeDetReq.CbteDesde = 1; FeDetReq.CbteHasta = 99999999; //FeDetReq.CbteFch = string.Format("{0}{1}{2}", fechaActual.Year, fechaActual.Month, fechaActual.Day); FeDetReq.ImpTotal = double.Parse(txtTOTALFactura.Text); FeDetReq.ImpTotConc = 0; FeDetReq.ImpNeto = double.Parse(txtSubTotalFactura.Text); FeDetReq.ImpOpEx = 0; FeDetReq.ImpIVA = 0; FeDetReq.ImpTrib = 0; //PREGUNTAR PROFE FeDetReq.MonId = "PES"; FeDetReq.MonCotiz = 1; FECAEReq.FeCabReq = FeCabReq; //Este es el error. No en la instanciación del servicio. La colección FeDetReq es nula. //FECAEReq.FeDetReq[0] = FeDetReq; FECAEReq.FeDetReq = new FECAEDetRequest[] { FeDetReq }; using (var service2 = new ServiceSoapClient()) { var ultimoAutorizado = service2.FECompUltimoAutorizado(feAuth, 1, 11); if (ultimoAutorizado.Errors == null) { numeroUltimoAutorizado = ultimoAutorizado.CbteNro + 1; //caeSolicitar service2.FECAESolicitar(feAuth, FECAEReq); } else { MessageBox.Show("Error conexión Afip Service"); } } }
private void ConvertirComprobantesAsociados( FeDetalle detalle, FECAEDetRequest feCaeDet ) { if ( detalle.ComprobantesAsociados.Count > 0 ) { int i = 0; feCaeDet.CbtesAsoc = new CbteAsoc[detalle.ComprobantesAsociados.Count]; WrapperComprobanteAsociadoFe wcaf = new WrapperComprobanteAsociadoFe(); foreach ( ComprobanteAsociado comprobante in detalle.ComprobantesAsociados ) { feCaeDet.CbtesAsoc[i] = wcaf.Convertir( comprobante ); i++; } } }
private void ConvertirDatosAdicionales(FeDetalle detalle, FECAEDetRequest feCaeDet) { if ( !String.IsNullOrEmpty( detalle.DA_NumeroDocumento ) && detalle.DA_NumeroDocumento != "0" ) { feCaeDet.Opcionales = new Opcional[4]; feCaeDet.Opcionales[0] = new Opcional(); feCaeDet.Opcionales[0].Id = "7"; feCaeDet.Opcionales[0].Valor = detalle.DA_CondicionTitular.ToString().PadLeft( 2, '0' ); feCaeDet.Opcionales[1] = new Opcional(); feCaeDet.Opcionales[1].Id = "61"; feCaeDet.Opcionales[1].Valor = detalle.DA_TipoDocumento.ToString().PadLeft(2, '0'); feCaeDet.Opcionales[2] = new Opcional(); feCaeDet.Opcionales[2].Id = "62"; feCaeDet.Opcionales[2].Valor = detalle.DA_NumeroDocumento.ToString(); feCaeDet.Opcionales[3] = new Opcional(); feCaeDet.Opcionales[3].Id = "5"; feCaeDet.Opcionales[3].Valor = detalle.DA_Motivo.ToString().PadLeft(2, '0'); } }
/// <summary> /// Solicitar un CAE para uno o más comprobantes. /// </summary> /// <param name="solCae">Los datos para la solicitud del CAE.</param> /// <returns>La cantidad de comprobantes aprobados, o 0 si todos fueron rechazados.</returns> public int SolictarCae(SolicitudCae solCae) { using (var Clie = new ServiceSoapClient()) { var DetallesComprobantes = new FECAEDetRequest[solCae.Comprobantes.Count]; var i = 0; foreach (ComprobanteAsociado Comprob in solCae.Comprobantes) { var DetalleComprobante = new FECAEDetRequest { Concepto = (int)Comprob.Conceptos, DocTipo = (int)Comprob.Cliente.DocumentoTipo, DocNro = Comprob.Cliente.DocumentoNumero, CbteDesde = Comprob.Numero, CbteHasta = Comprob.Numero, CbteFch = DateTime.Now.ToString("yyyyMMdd"), ImpTotal = Math.Round(decimal.ToDouble(Comprob.ImporteTotal()), 2), ImpTotConc = Math.Round(decimal.ToDouble(Comprob.ImporteNetoNoGravado), 2), ImpNeto = Math.Round(decimal.ToDouble(Comprob.ImporteNetoGravado), 2), ImpOpEx = Math.Round(decimal.ToDouble(Comprob.ImporteExento), 2), ImpIVA = Math.Round(decimal.ToDouble(Comprob.ImporteIva()), 2), //ImpTrib = Comprob.TotalTributos(), MonId = "PES", MonCotiz = 1, /* CbtesAsoc = new CbteAsoc[1] * { * new CbteAsoc() * { * Nro = 0, * PtoVta = 0, * Tipo = Tablas.ComprobantesTipos.NotaDeCreditoA * } * } */ }; // Si es un comprobante con servicios, agregar los campos obligatorios if ((Comprob.Conceptos | Tablas.Conceptos.Servicios) == Tablas.Conceptos.Servicios) { DetalleComprobante.FchServDesde = Comprob.ServicioFechaDesde.ToString("yyyyMMdd"); DetalleComprobante.FchServHasta = Comprob.ServicioFechaHasta.ToString("yyyyMMdd"); DetalleComprobante.FchVtoPago = Comprob.FechaVencimientoPago.ToString("yyyyMMdd"); } // Agregar la tabla de alícuotas if (Comprob.ImportesAlicuotas != null && Comprob.ImportesAlicuotas.Count > 0) { DetalleComprobante.Iva = new AlicIva[Comprob.ImportesAlicuotas.Count]; var j = 0; foreach (ImporteAlicuota Alic in Comprob.ImportesAlicuotas) { DetalleComprobante.Iva[j++] = new AlicIva { Id = (int)Alic.Alicuota, BaseImp = Math.Round(decimal.ToDouble(Alic.BaseImponible), 2), Importe = Math.Round(decimal.ToDouble(Alic.Importe), 2) }; } } DetallesComprobantes[i++] = DetalleComprobante; } // Crear la solicitud var CaeReq = new FECAERequest { FeCabReq = new FECAECabRequest { CantReg = solCae.Comprobantes.Count, PtoVta = solCae.PuntoDeVenta, CbteTipo = (int)solCae.TipoComprobante, }, FeDetReq = DetallesComprobantes }; // Llamar al WS para hacer la solicitud var Res = Clie.FECAESolicitar(this.CrearFEAuthRequest(), CaeReq); var Aprobados = 0; solCae.Observaciones = new List <Observacion>(); /* if (Res.FeCabResp.Resultado == "R") { * // Todo el lote rechazado * foreach (var Er in Res.Errors) { * solCae.Observaciones.Add(new Observacion(Er.Code, Er.Msg)); * } * } else { */ // Aprobado total o parcial var ci = 0; foreach (var De in Res.FeDetResp) { var Comprob = solCae.Comprobantes[ci++]; Comprob.Cae = new Cae(); if (De.Resultado == "A") { // Aprobado Comprob.Cae.CodigoCae = De.CAE; Comprob.Cae.Vencimiento = DateTime.ParseExact(De.CAEFchVto, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture); Comprob.Numero = System.Convert.ToInt32(De.CbteDesde); Aprobados++; } if (De.Observaciones != null && De.Observaciones.Count <Obs>() > 0) { Comprob.Obs = new Observacion(De.Observaciones[0].Code, De.Observaciones[0].Msg, Comprob); foreach (var Er in De.Observaciones) { solCae.Observaciones.Add(new Observacion(Er.Code, Er.Msg, Comprob)); } } } /* } */ return(Aprobados); } }
private void ConvertirTributos( FeDetalle detalle, FECAEDetRequest feCaeDet ) { if ( detalle.Tributos.Count > 0 ) { int i = 0; feCaeDet.Tributos = new Tributo[detalle.Tributos.Count]; WrapperTributoFe wtc = new WrapperTributoFe(); foreach ( TributoComprobante item in detalle.Tributos ) { feCaeDet.Tributos[i] = wtc.Convertir( item ); i++; } } }
private WSFE.FECAEDetRequest[] GetDetalles(FacturaTemplate factura, WSFE.Service servicio, WSFE.FEAuthRequest authRequest) { WSFE.FECAEDetRequest[] fedetreq = new WSFE.FECAEDetRequest[1]; try { WSFE.FECAEDetRequest detalle = new FECAEDetRequest(); List<WSFE.AlicIva> alicuota_iva = new List<AlicIva>(); Commons commonsUtilities = new Commons(servicio, authRequest); int tipo_comprobante = commonsUtilities.GetTipoComprobanteId(factura.Comprobante, factura.TipoComprobante).Value; int ptoVta = factura.PuntoDeVenta; int conceptoTipo = commonsUtilities.GetTipoConceptoId(factura.Concepto).Value; int documetoTipo = commonsUtilities.GetTipoDocumentoId(factura.TipoDocumento).Value; detalle.CbteDesde = commonsUtilities.GetComprobanteProximoAAtutorizar(ptoVta, tipo_comprobante) + 1; //numero de comprobante desde detalle.CbteHasta = detalle.CbteDesde; //numero de comprobante hasta detalle.CbteFch = factura.FechaFactura.ToString("yyyyMMdd"); detalle.Concepto = conceptoTipo; detalle.DocTipo = documetoTipo; detalle.DocNro = factura.Cuit; detalle.MonId = "PES";//Siempre pesos detalle.MonCotiz = 1;//Cotizacion de la moneda es siempre 1 porque es pesos if (factura.Concepto.Equals("S")) { detalle.FchServDesde = factura.FechaDesde.ToString("yyyyMMdd"); detalle.FchServHasta = factura.FechaHasta.ToString("yyyyMMdd"); detalle.FchVtoPago = factura.FechaVencimiento.ToString("yyyyMMdd"); } double importeSinIVA = 0; double totalIVA = 0; //Sumamos y calculamos //Como observacion hay que aclarar que el tema de los decimales es bastante complicado y pueden existir //situaciones donde la AFIP rechace las solicitudes por redondeos que se efectuan de distinta manera foreach (FacturaItemsTemplate item in factura.GetItems()) { importeSinIVA += item.Unitario; totalIVA += (item.Unitario * (item.TasaIVA / 100)); WSFE.AlicIva iva = new AlicIva(); iva.BaseImp = item.Unitario; iva.Importe = (item.Unitario * (item.TasaIVA / 100)); iva.Id = commonsUtilities.GetTipoIVAId(item.TasaIVA); alicuota_iva.Add(iva); } detalle.ImpIVA = Math.Round(totalIVA, 2); detalle.ImpNeto = Math.Round(importeSinIVA, 2); detalle.ImpTotal = detalle.ImpIVA + detalle.ImpNeto; detalle.ImpTrib = 0.0; detalle.Iva = alicuota_iva.GroupBy(x => x.Id).Select(x => new WSFE.AlicIva { Id = x.Key, Importe = Math.Round(x.Sum(i => i.Importe), 2), BaseImp = Math.Round(x.Sum(i => i.BaseImp), 2) }).ToArray(); fedetreq[0] = detalle; } catch (Exception ex) { LoggerManager.Error("Ha ocurrido un error al generar el detalle", ex); } return fedetreq; }
private Decimal ObtenerDiferenciaTotales( FECAEDetRequest requestAfip ) { double sumaTotales = Redondeo.SumarDoubles( new double[] { requestAfip.ImpTotConc, requestAfip.ImpNeto, requestAfip.ImpOpEx, requestAfip.ImpTrib, requestAfip.ImpIVA } ); Decimal diferencia = (Decimal)requestAfip.ImpTotal - (Decimal)sumaTotales; return diferencia; }
private static string consultarAfip(int p_pv, int p_codigo, double p_importe, double p_iva, double p_total, DateTime p_fecha, long doc, int concepto, int tipo_doc, int tipo_iva, string moneda) { numero_comprobante = 0; cae_comprobante = ""; cae_vencimiento = ""; mensaje_afip = ""; mensaje_obs = ""; mensaje_error = ""; string m = ""; resultado = "R"; try { if (Main.authRequest == null) { Main.authRequest = new FEAuthRequest(); Main.authRequest.Cuit = Main.CUIT; Main.authRequest.Sign = Main.SING; Main.authRequest.Token = Main.TOKEN; } AFIP.TEST.WSFE.Service service = getServicio(); service.ClientCertificates.Add(Main.certificado); /* * if (Main.Testing == 1) * { * AFIP.TEST.WSFE.Service service = getServicioTest(); * service.ClientCertificates.Add(Main.certificado); * } * else * { * AFIP.WSFE.Service service = getServicioProducion(); * service.ClientCertificates.Add(Main.certificado); * }*/ //PtoVenta pvObj = ptos_venta_cm.SelectedItem; //int pv = p_pv;//pvObj.Nro; //CbteTipo cm = p_codigo;//TiposComprobantesCMB.SelectedItem; FECAERequest req = new FECAERequest(); FECAECabRequest cab = new FECAECabRequest(); FECAEDetRequest det = new FECAEDetRequest(); cab.CantReg = 1; cab.PtoVta = p_pv; cab.CbteTipo = p_codigo;//cm.Id; req.FeCabReq = cab; FECAEDetRequest bar = det; //ConceptoTipo concepto = TipoConcepto.SelectedItem; bar.Concepto = concepto; //concepto.ID; //DocTipo doctipo = TipoDocCMB.SelectedItem; bar.DocTipo = tipo_doc; //doctipo.Id bar.DocNro = doc; //long.Parse(DocTX.Text) //Buscar el ultimo numero try { FERecuperaLastCbteResponse lastRes = service.FECompUltimoAutorizado(Main.authRequest, p_pv, p_codigo); int last = lastRes.CbteNro; bar.CbteDesde = last + 1; bar.CbteHasta = last + 1; } catch { bar.CbteDesde = p_codigo; bar.CbteHasta = p_codigo; } bar.CbteFch = p_fecha.ToString("yyyyMMdd"); //FechaDTP.Value.ToString("yyyyMMdd"); bar.ImpNeto = Double.Parse(p_importe.ToString("0.00")); //NetoTX.Text; bar.ImpIVA = Double.Parse(p_iva.ToString("0.00")); // ImpIvaTx.Text; bar.ImpTotal = Double.Parse(p_total.ToString("0.00")); // TotalTx.Text; bar.ImpTotConc = 0; bar.ImpOpEx = 0; bar.ImpTrib = 0; //Moneda mon = MonedaCMB.SelectedItem; bar.MonId = moneda;// mon.Id bar.MonCotiz = 1; AlicIva alicuota = new AlicIva(); //IvaTipo ivat = TipoIVACmb.SelectedItem; alicuota.Id = tipo_iva; // ivat.Id alicuota.BaseImp = p_importe; // NetoTX.Text alicuota.Importe = Double.Parse(p_iva.ToString("0.00")); // ImpIvaTx.Text bar.Iva = new AlicIva[] { alicuota }; //bar.Iva.Append(alicuota); req.FeDetReq = new FECAEDetRequest[] { bar }; //req.FeDetReq.Append(bar); try { FECAEResponse r = service.FECAESolicitar(Main.authRequest, req); string vbCrLf = "\n"; resultado = r.FeDetResp[0].Resultado; m = "Estado Cabecera: " + r.FeCabResp.Resultado + vbCrLf; m += "Estado Detalle: " + r.FeDetResp[0].Resultado; m += vbCrLf; m += "CAE: " + r.FeDetResp[0].CAE; m += vbCrLf; m += "Vto: " + r.FeDetResp[0].CAEFchVto; m += vbCrLf; m += "Numero de comprobante: " + r.FeDetResp[0].CbteDesde; m += vbCrLf; numero_comprobante = r.FeDetResp[0].CbteDesde; cae_comprobante = r.FeDetResp[0].CAE; cae_vencimiento = r.FeDetResp[0].CAEFchVto; if (r.FeDetResp[0].Observaciones != null) { foreach (var o in r.FeDetResp[0].Observaciones) { mensaje_obs += string.Format("Obs: {0} ({1})", o.Msg, o.Code) + vbCrLf; m += mensaje_obs; } } if (r.Errors != null) { foreach (var er in r.Errors) { mensaje_error += string.Format("Er: {0}: {1}", er.Code, er.Msg) + vbCrLf; m += mensaje_error; } } if (r.Events != null) { foreach (var ev in r.Events) { mensaje_afip += string.Format("Ev: {0}: {1}", ev.Code, ev.Msg) + vbCrLf; m += mensaje_afip; } } } catch (Exception e) { LogHelper.Log(LogTarget.File, DateTime.Now.ToString() + " - ERROR COMPROBANTE AFIP: " + e.Message + " - " + e.StackTrace); m = "ERROR"; return(m); } //Resultado.Text = m LogHelper.Log(LogTarget.File, DateTime.Now.ToString() + " - Consultando en AFIP: " + resultado); } catch (Exception e) { LogHelper.Log(LogTarget.File, DateTime.Now.ToString() + " - ERROR COMPROBANTE AFIP: " + e.Message + " - " + e.StackTrace); //MessageBox.Show("ERROR: "+e.Message+"\n"+e.StackTrace); } return(m); }
/// <summary> /// Cocina para que cierren los valores /// </summary> /// <param name="feCaeDet"></param> /// <param name="detalle"></param> private void TratarDeArreglarCocinando( FECAEDetRequest requestAfip, FeDetalle detalle ) { Decimal diferencia = this.ObtenerDiferenciaTotales( requestAfip ); // Tolerancia de 2 ctvos if ( Math.Abs( diferencia ) <= 0.02M ) { // Suma De Totales Es Menor al total if ( diferencia > 0 ) { if ( requestAfip.ImpIVA > 0 ) { // La ligó el IVA requestAfip.ImpIVA = Redondeo.SumarDoubles( new double[]{ requestAfip.ImpIVA , (double)diferencia } ); requestAfip.Iva[0].Importe = Redondeo.SumarDoubles( new double[] { requestAfip.Iva[0].Importe, (double)diferencia } ); } else if ( requestAfip.ImpTrib > 0 ) { // sin IVA, le pego a los impuestos... requestAfip.ImpTrib = Redondeo.SumarDoubles( new double[] { requestAfip.ImpTrib, (double)diferencia } ); requestAfip.Tributos[0].Importe = Redondeo.SumarDoubles( new double[] { requestAfip.Tributos[0].Importe, (double)diferencia } ); } else if ( requestAfip.ImpOpEx > 0 ) { // nada, al exento requestAfip.ImpOpEx = Redondeo.SumarDoubles( new double[] { requestAfip.ImpOpEx, (double)diferencia } ); } else if ( requestAfip.ImpTotConc > 0 ) { // nada, al Neto NG requestAfip.ImpTotConc = Redondeo.SumarDoubles( new double[] { requestAfip.ImpTotConc, (double)diferencia } ); } } // Suma De Totales Es Mayor al total if ( diferencia < 0 ) { if ( requestAfip.ImpOpEx > 0 ) { // Tiene exento, lo pongo ahi requestAfip.ImpOpEx = Redondeo.SumarDoubles( new double[] { requestAfip.ImpOpEx, (double)diferencia } ); } else if ( requestAfip.ImpTotConc > 0 ) { // Tiene Neto NG, lo pongo ahi requestAfip.ImpTotConc = Redondeo.SumarDoubles( new double[] { requestAfip.ImpTotConc, (double)diferencia } ); } else if ( requestAfip.ImpNeto > 0 ) { // Importe Neto requestAfip.ImpNeto = Redondeo.SumarDoubles( new double[] { requestAfip.ImpNeto, (double)diferencia } ); requestAfip.Iva[0].BaseImp = Redondeo.SumarDoubles( new double[] { requestAfip.Iva[0].BaseImp, (double)diferencia } ); } } } }