static int ComprobanteTipo(this IComprobanteElectronico comprobante) { var tipo = comprobante.Tipo; if (tipo.Abreviatura == "FC" && tipo.Letra == "A") { return(1); } if (tipo.Abreviatura == "ND" && tipo.Letra == "A") { return(2); } if (tipo.Abreviatura == "NC" && tipo.Letra == "A") { return(3); } if (tipo.Abreviatura == "FC" && tipo.Letra == "B") { return(6); } if (tipo.Abreviatura == "ND" && tipo.Letra == "B") { return(7); } if (tipo.Abreviatura == "NC" && tipo.Letra == "B") { return(8); } throw new NotImplementedException("Tipo de comprobante no soportado"); }
public static DateTime VencimientoCAE(this IComprobanteElectronico comprobante) { string vencimientoCae = string.Format("{0}/{1}/{2}" , comprobante.VencimientoCAE.Substring(6, 2) , comprobante.VencimientoCAE.Substring(4, 2) , comprobante.VencimientoCAE.Substring(0, 4)); return(DateTime.Parse(vencimientoCae)); }
public static string BarcodeText(this IComprobanteElectronico comprobante, Empresa emisor) { string barcode = string.Format("{0}{1:00}{2}{3}{4}", emisor.CUIT.Limpiar(), comprobante.Tipo.Codigo, comprobante.Tipo.Pre.PadLeft(4, '0'), comprobante.CAE.Trim(), comprobante.VencimientoCAE.Trim()); int checksum = 0; bool par = false; foreach (var letra in barcode) { checksum += int.Parse(letra.ToString()) * (par ? 1 : 3); par = !par; } checksum = checksum % 10; checksum = checksum == 0 ? checksum : 10 - checksum; return(barcode + checksum); }
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(); }