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); }
// 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; }
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(); }