Ejemplo n.º 1
0
        public ActionResult CreateNomina([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);
        }
Ejemplo n.º 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;
        }
Ejemplo n.º 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();
        }