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