Example #1
0
        public ActionResult Create([Bind(Include = "RFC,NominaID,SalarioDiario,SBC,DiasPagar,Incidencias,Ausentismo,DiasTrabajados,HorasExtrasDobles,HorasExtrasTriples,PSueldosSalariosRayasJornales,PSueldoExcento,PSueldoGravado,PHorasExtrasDobles,PHorasExtrasTriples,PHorasExtras,PHorasExtrasExcento,PHorasExtrasGravado,PComisiones,POtros,PPrimavacacional,PTotalPercepciones,DISR,DSubsidio,D1,D2,D3,D4,D5,D6,SeguridadSocial,Infonavit")] NominaCFDI nominacfdi, string Password)
        {
            // aqui procesamos esta información en el objeto nominacfdi para meterlo a la BD, despues creamos el CFDI

            if (ModelState.IsValid)
            {
                db.Nominas.Add(nominacfdi);
                db.SaveChanges();
                // ya guardamos la info de la nomina en la BD ahora vamos a procesar a generar el CFDI
                NominaTimbrada comprobanteXML = new NominaTimbrada();
                comprobanteXML             = generarCFDI(nominacfdi, Password, null, null);
                nominacfdi.XML             = comprobanteXML.xml;
                db.Entry(nominacfdi).State = EntityState.Modified;
                db.SaveChanges();

                return(RedirectToAction("Index"));
            }

            return(View(nominacfdi));
        }
Example #2
0
        // generamos el CFDI
        public NominaTimbrada generarCFDI(NominaCFDI nominacfdi, string Password, Empresa empresa, Empleado empleado)
        {
            DateTime FechaPago          = DateTime.Now;
            DateTime FechaPagoInicial   = DateTime.Now;
            DateTime FechaPagoFinal     = DateTime.Now;
            DateTime FechaComprobante   = DateTime.Parse(String.Format("{0:s}", DateTime.Now), CultureInfo.InvariantCulture);
            int      AntiguedadEmpleado = 1; // pendiente debemos de calcular la antiguedad en numero de años basado en el inicio de la relación laboral del objeyo empleado
            // creamos el objecto CFDI

            comprobante CFDI = new comprobante();



            // datos generales del comprobante
            CFDI.version           = VersionCFDI.V_2012;
            CFDI.fecha             = FechaComprobante;
            CFDI.folio             = nominacfdi.NominaID.ToString();
            CFDI.serie             = "nomina";
            CFDI.LugarExpedicion   = empresa.LugarExpedicion;
            CFDI.TipoCambio        = "1";
            CFDI.Moneda            = "MXN";
            CFDI.noCertificado     = "";
            CFDI.certificado       = "";
            CFDI.subTotal          = ShowDecimalRound(nominacfdi.SalarioNeto);
            CFDI.tipoDeComprobante = MasFacturacion.StampingConnector.StampingService.comprobanteTipoDeComprobante.ingreso;
            CFDI.condicionesDePago = "Pago en una sola exhibición";
            CFDI.sello             = "";
            CFDI.metodoDePago      = "NA";
            CFDI.formaDePago       = "Pago en una sola exhibición";
            CFDI.total             = ShowDecimalRound(nominacfdi.SalarioNeto);

            CFDI.Emisor = new comprobanteEmisor();


            CFDI.Emisor.rfc        = empresa.RFC.ToUpper();
            CFDI.Emisor.ExpedidoEn = new MasFacturacion.StampingConnector.StampingService.t_Ubicacion();

            CFDI.Emisor.ExpedidoEn.pais         = empresa.Pais;
            CFDI.Emisor.ExpedidoEn.estado       = empresa.Estado;
            CFDI.Emisor.ExpedidoEn.localidad    = empresa.Localidad;
            CFDI.Emisor.ExpedidoEn.municipio    = empresa.Municipio;
            CFDI.Emisor.ExpedidoEn.colonia      = empresa.Colonia;
            CFDI.Emisor.ExpedidoEn.calle        = empresa.Calle;
            CFDI.Emisor.ExpedidoEn.noExterior   = empresa.NumeroExterior;
            CFDI.Emisor.ExpedidoEn.noInterior   = empresa.NumeroInterior;
            CFDI.Emisor.ExpedidoEn.codigoPostal = empresa.CP;

            CFDI.Emisor.nombre                   = empresa.Nombre;
            CFDI.Emisor.RegimenFiscal            = new comprobanteEmisorRegimenFiscal[1];
            CFDI.Emisor.RegimenFiscal[0]         = new comprobanteEmisorRegimenFiscal();
            CFDI.Emisor.RegimenFiscal[0].Regimen = empresa.Regimen;

            CFDI.Emisor.DomicilioFiscal = new t_UbicacionFiscal();

            CFDI.Emisor.DomicilioFiscal.pais         = empresa.Pais;
            CFDI.Emisor.DomicilioFiscal.estado       = empresa.Estado;
            CFDI.Emisor.DomicilioFiscal.localidad    = empresa.Localidad;
            CFDI.Emisor.DomicilioFiscal.municipio    = empresa.Municipio;
            CFDI.Emisor.DomicilioFiscal.colonia      = empresa.Colonia;
            CFDI.Emisor.DomicilioFiscal.calle        = empresa.Calle;
            CFDI.Emisor.DomicilioFiscal.noExterior   = empresa.NumeroExterior;
            CFDI.Emisor.DomicilioFiscal.noInterior   = empresa.NumeroInterior;
            CFDI.Emisor.DomicilioFiscal.codigoPostal = empresa.CP;


            CFDI.Receptor = new comprobanteReceptor();


            CFDI.Receptor.rfc       = nominacfdi.RFC.ToUpper();
            CFDI.Receptor.nombre    = empleado.Nombre;
            CFDI.Receptor.Domicilio = new t_Ubicacion();

            CFDI.Receptor.Domicilio.pais         = String.IsNullOrEmpty(empleado.Pais) ? "México" : empleado.Pais;
            CFDI.Receptor.Domicilio.estado       = empleado.Estado;
            CFDI.Receptor.Domicilio.localidad    = empleado.Localidad;
            CFDI.Receptor.Domicilio.municipio    = empleado.Municipio;
            CFDI.Receptor.Domicilio.colonia      = empleado.Colonia;
            CFDI.Receptor.Domicilio.calle        = empleado.Calle;
            CFDI.Receptor.Domicilio.noExterior   = empleado.NumeroExterior;
            CFDI.Receptor.Domicilio.noInterior   = empleado.NumeroInterior;
            CFDI.Receptor.Domicilio.codigoPostal = String.IsNullOrEmpty(empleado.CP) ? "00000" : empleado.CP;


            CFDI.Conceptos    = new  ArrayOfComprobanteConceptoConcepto[1];
            CFDI.Conceptos[0] = new ArrayOfComprobanteConceptoConcepto();


            CFDI.Conceptos[0].cantidad         = 1;
            CFDI.Conceptos[0].unidad           = "Unidad";
            CFDI.Conceptos[0].descripcion      = "Descripcion";
            CFDI.Conceptos[0].noIdentificacion = "Num. Identificacion";
            CFDI.Conceptos[0].valorUnitario    = 1;
            CFDI.Conceptos[0].importe          = 1;


            CFDI.Impuestos = new MasFacturacion.StampingConnector.StampingService.comprobanteImpuestos();


            CFDI.Impuestos.totalImpuestosRetenidos   = 1;
            CFDI.Impuestos.totalImpuestosTrasladados = 1;
            CFDI.Impuestos.Retenciones = new ArrayOfComprobanteImpuestosRetencionRetencion[2];

            CFDI.Impuestos.Retenciones[0]          = new ArrayOfComprobanteImpuestosRetencionRetencion();
            CFDI.Impuestos.Retenciones[0].impuesto = ArrayOfComprobanteImpuestosRetencionRetencionImpuesto.ISR;
            CFDI.Impuestos.Retenciones[0].importe  = 15;


            CFDI.Impuestos.Retenciones[1]          = new ArrayOfComprobanteImpuestosRetencionRetencion();
            CFDI.Impuestos.Retenciones[1].impuesto = ArrayOfComprobanteImpuestosRetencionRetencionImpuesto.IVA;
            CFDI.Impuestos.Retenciones[1].importe  = 15;


            CFDI.Impuestos.Traslados             = new ArrayOfComprobanteImpuestosTrasladoTraslado[2];
            CFDI.Impuestos.Traslados[0]          = new ArrayOfComprobanteImpuestosTrasladoTraslado();
            CFDI.Impuestos.Traslados[0].impuesto = ArrayOfComprobanteImpuestosTrasladoTrasladoImpuesto.IVA;
            CFDI.Impuestos.Traslados[0].tasa     = 16;
            CFDI.Impuestos.Traslados[0].importe  = new decimal(0.16);
            CFDI.Impuestos.Traslados[1]          = new ArrayOfComprobanteImpuestosTrasladoTraslado();
            CFDI.Impuestos.Traslados[1].impuesto = ArrayOfComprobanteImpuestosTrasladoTrasladoImpuesto.IEPS;
            CFDI.Impuestos.Traslados[1].tasa     = 10;
            CFDI.Impuestos.Traslados[1].importe  = new decimal(0.15);



            // creamos el complemento nomina basado en la clase nomina
            Nomina NominaComplemento = new Nomina();

            NominaComplemento.RegistroPatronal        = empresa.RegistroPatronal;
            NominaComplemento.NumEmpleado             = String.IsNullOrEmpty(empleado.NumdeEmpleado) ? "0" : empleado.NumdeEmpleado;
            NominaComplemento.CURP                    = empleado.CURP.ToUpper();
            NominaComplemento.TipoRegimen             = empleado.Regimen.GetValueOrDefault(2);
            NominaComplemento.NumSeguridadSocial      = empleado.NumSeguroSocial;
            NominaComplemento.FechaPago               = FechaPago;
            NominaComplemento.FechaInicialPago        = FechaPagoInicial;
            NominaComplemento.FechaFinalPago          = FechaPagoFinal;
            NominaComplemento.NumDiasPagados          = ShowDecimalRound(nominacfdi.DiasPagar);
            NominaComplemento.Departamento            = empleado.Departamento;
            NominaComplemento.CLABE                   = empleado.CLABE;
            NominaComplemento.Banco                   = empleado.Banco.GetValueOrDefault(1);
            NominaComplemento.FechaInicioRelLaboral   = empleado.FechaInicioLaboral;
            NominaComplemento.Antiguedad              = AntiguedadEmpleado;
            NominaComplemento.Puesto                  = empleado.Puesto;
            NominaComplemento.TipoContrato            = empleado.TipoContrato;
            NominaComplemento.TipoJornada             = empleado.TipoJornada;
            NominaComplemento.PeriodicidadPago        = String.IsNullOrEmpty(empleado.PeriodicidadPago) ? "0" : empleado.PeriodicidadPago;
            NominaComplemento.SalarioBaseCotApor      = ShowDecimalRound(empleado.SalarioDiario);
            NominaComplemento.RiesgoPuesto            = empleado.RiesgoPuesto.GetValueOrDefault(1);
            NominaComplemento.SalarioDiarioIntegrado  = ShowDecimalRound(empleado.SBC);
            NominaComplemento.Percepciones            = new NominaPercepciones();
            NominaComplemento.Percepciones.Percepcion = new NominaPercepcionesPercepcion[1];

            NominaComplemento.Percepciones.Percepcion[0] = new NominaPercepcionesPercepcion();

            NominaComplemento.Percepciones.Percepcion[0].Clave          = "001";
            NominaComplemento.Percepciones.Percepcion[0].Concepto       = "percepcion";
            NominaComplemento.Percepciones.Percepcion[0].ImporteExento  = 1;
            NominaComplemento.Percepciones.Percepcion[0].ImporteGravado = 1;
            NominaComplemento.Percepciones.Percepcion[0].TipoPercepcion = "001";



            NominaComplemento.Deducciones = new NominaDeducciones();


            NominaComplemento.Deducciones.Deduccion    = new NominaDeduccionesDeduccion[1];
            NominaComplemento.Deducciones.Deduccion[0] = new NominaDeduccionesDeduccion();

            NominaComplemento.Deducciones.Deduccion[0].Clave          = "001";
            NominaComplemento.Deducciones.Deduccion[0].Concepto       = "Deduccion";
            NominaComplemento.Deducciones.Deduccion[0].ImporteExento  = 1;
            NominaComplemento.Deducciones.Deduccion[0].ImporteGravado = 1;
            NominaComplemento.Deducciones.Deduccion[0].TipoDeduccion  = "001";

            NominaComplemento.Version = "1.1";



            //creamos una lista de elementos XML
            List <XmlElement> nominaXMLElement = new List <XmlElement>();
            // creamos un documento de XML
            XmlDocument doc = new XmlDocument();

            // leemos el complemento de nomina en el objecto de xml
            doc.LoadXml(SerializeNomina(NominaComplemento));
            doc.DocumentElement.RemoveAttribute("xmlns:xsi"); // le quitamos estos namespaces porque ya se los pusimos al comprobante CFDI
            doc.DocumentElement.RemoveAttribute("xmlns:xsd");
            doc.DocumentElement.RemoveAttribute("nomina:xsd");
            //creamos un elemento de XML

            XmlElement elementoNomina = doc.DocumentElement;

            elementoNomina.RemoveAttribute("xmlns");
            elementoNomina.Prefix = "nomina";


            for (int i = 0; elementoNomina.ChildNodes.Count > i; i++)
            {
                elementoNomina.ChildNodes[i].Prefix = "nomina";
                for (int j = 0; elementoNomina.ChildNodes[i].ChildNodes.Count > j; j++)
                {
                    elementoNomina.ChildNodes[i].ChildNodes[j].Prefix = "nomina";
                }
            }
            // le agregamos el elemento nomina al arreglo de elementos
            nominaXMLElement.Add(elementoNomina);
            // creamos el complemento
            if (CFDI.Complemento == null)
            {
                CFDI.Complemento = new MasFacturacion.StampingConnector.StampingService.comprobanteComplemento();
            }
            // vaciamos el arreglo de elementos al nodo de complemento del comprobante
            CFDI.Complemento.Any = nominaXMLElement.ToArray();

            CFDI = EncryptPFX(CFDI, TypeCryptoServiceProvider.SHA1, empresa.PFX, Password);

            var xml = Serializer.SerializeComprobante(CFDI);
            // ya tememos el objeto que vamos a timbrar

            XmlDocument xmld = new XmlDocument();

            xmld.LoadXml(xml);
            xmld.Schemas.Add(null, ConfigurationManager.AppSettings["pathSATFiles"] + @"files SAT/localxsd/cfdv32.xsd");
            xmld.Schemas.Add(null, ConfigurationManager.AppSettings["pathSATFiles"] + @"files SAT/localxsd/nomina11.xsd");
            // validamos el esquema
            xmld.Validate(ValidationCallBack);
            string serialNumber = null;
            TimbreFiscalDigital timbreFiscalTemp = new StampingMasFacturacion().getStamp(CFDI, serialNumber);



            XmlDocument docTimbre = new XmlDocument();

            // leemos el complemento de nomina en el objecto de xml
            docTimbre.LoadXml(SerializeTimbreFiscalDigital(timbreFiscalTemp));
            XmlElement elementoTimbre = docTimbre.DocumentElement;

            nominaXMLElement.Add(elementoTimbre);
            CFDI.Complemento.Any = nominaXMLElement.ToArray();

            NominaTimbrada respuesta = new NominaTimbrada();

            respuesta.xml  = Serializer.SerializeComprobante(CFDI);
            respuesta.uuid = timbreFiscalTemp.UUID.ToString();

            return(respuesta);
        }
Example #3
0
        public ActionResult CreateMasivo(string nominaCompleta, string NumeroPeriodo, string FechaInicioPeriodo, string FechaFinPeriodo, string TipoPeriodo, string FechaDePago, string FormaDePago)
        {
            // aqui procesamos esta información en el objeto nominacfdi para meterlo a la BD, despues creamos el CFDI



            JavaScriptSerializer js = new JavaScriptSerializer();

            NominaCFDI[] nominas = js.Deserialize <NominaCFDI[]>(nominaCompleta);
            Dictionary <string, string> errores = new Dictionary <string, string>();

            // obtenemos los datos del emisor
            var            RFCPatron     = db.Users.FirstOrDefault(y => y.UserName == User.Identity.Name).RFC; // referenncia del RFC del usuario logueado
            var            empresa       = db.Empresas.FirstOrDefault(x => x.RFC == RFCPatron);
            NominaPeriodos PeriodoActual = new NominaPeriodos();
            // obtenemos la información del periodo y la validamos
            int  periodoEntero     = int.Parse(NumeroPeriodo);
            bool PeriodoModificado = false;

            if (db.NominaPeriodos.Where(x => x.RFCPatron == RFCPatron && x.NumeroPeriodo == periodoEntero).Count() > 0)
            {
                // aqui es de que ya existe este periodo y vamos a trabajar sobre el mismo
                List <NominaPeriodos> NominasPeriodos = new List <NominaPeriodos>();
                NominasPeriodos   = db.NominaPeriodos.Where(x => x.RFCPatron == RFCPatron && x.NumeroPeriodo == periodoEntero).ToList();
                PeriodoActual     = NominasPeriodos.Last();
                PeriodoModificado = true;
            }
            else
            {
                // aqui es cuando trabajamos con un periodo nuevo
                PeriodoActual.NumeroPeriodo      = int.Parse(NumeroPeriodo);
                PeriodoActual.RFCPatron          = RFCPatron;
                PeriodoActual.Empresa            = empresa.EmpresaId;
                PeriodoActual.FechaInicioPeriodo = FechaInicioPeriodo;
                PeriodoActual.FechaFinPeriodo    = FechaFinPeriodo;
                PeriodoActual.TipoPeriodo        = int.Parse(TipoPeriodo);
                PeriodoActual.FechaDePago        = FechaDePago;
                PeriodoActual.FormaDePago        = int.Parse(FormaDePago);
                PeriodoActual.Status             = NominaPeriodos.StatusPeriodo.sinTimbrar;
            }


            List <NominaTimbrada> empleadosTimbrados = new List <NominaTimbrada>();

            Task <NominaCFDI>[] tasks = new Task <NominaCFDI> [nominas.Length];
            for (int i = 0; i < nominas.Length; i++)
            {
                int      empleadoID = nominas[i].User;
                Empleado empleado   = db.Empleadoes.FirstOrDefault(x => x.Codigo == empleadoID);

                // validaciones necesrias para el esquema

                NominaCFDI nominaActual = nominas[i];
                nominaActual.CURP = empleado.CURP;
                nominaActual.FechaInicioLaboral = empleado.FechaInicioLaboral.ToString();
                nominaActual.NumSeguroSocial    = empleado.NumSeguroSocial;
                nominaActual.RFC           = empleado.RFC;
                nominaActual.NominaPeriodo = PeriodoActual.NumeroPeriodo;

                //tasks[i] = Task<NominaCFDI>.Factory.StartNew(() =>
                //{
                NominaTimbrada comprobanteXML = new NominaTimbrada();
                try {
                    // in  var comprobanteXML tentamos cachar la nomina
                    comprobanteXML = generarCFDI(nominaActual, "12345678a", empresa, empleado);

                    empleadosTimbrados.Add(new NominaTimbrada {
                        Empleado = empleadoID, uuid = comprobanteXML.uuid
                    });

                    nominaActual.XML = comprobanteXML.xml;
                }
                catch (Exception e)
                {
                    errores.Add(empleado.Nombre, e.Message.ToString());
                }
                db.Nominas.Add(nominaActual);
                db.SaveChanges();
                //    return nominaActual;

                //});
            }
            Dictionary <string, string> respuesta = new Dictionary <string, string>();

            // validamos si hay errores para cerrar la nomina o dejarla abierta
            if (errores.Count == 0)
            {
                PeriodoActual.Status = NominaPeriodos.StatusPeriodo.timbrado;
            }
            if (PeriodoModificado)
            {
                db.Entry(PeriodoActual).State = EntityState.Modified;
            }
            else
            {
                db.NominaPeriodos.Add(PeriodoActual);
            }
            db.SaveChanges();
            respuesta.Add("Timbres", JsonConvert.SerializeObject(empleadosTimbrados));
            respuesta.Add("Errores", JsonConvert.SerializeObject(errores));
            ViewBag.response = JsonConvert.SerializeObject(respuesta);

            return(View());
        }