private NominaPercepcionesPercepcionHorasExtra contruyeNominaHoraExtra(CFDIReciboHrsExtras cfdiReciboHrsExtras)
        {
            NominaPercepcionesPercepcionHorasExtra horaExtra = new NominaPercepcionesPercepcionHorasExtra();

            horaExtra.Dias       = (cfdiReciboHrsExtras.dias);
            horaExtra.HorasExtra = (cfdiReciboHrsExtras.horasExtras);
            Double importePagado = cfdiReciboHrsExtras.importeExento + cfdiReciboHrsExtras.importeGravable;

            horaExtra.ImportePagado = (UtileriasSat.castNumerosToImporteMX(importePagado)); ///pendiente
            horaExtra.TipoHoras     = (cfdiReciboHrsExtras.tipoHoras);
            return(horaExtra);
        }
 private CFDIReciboHrsExtras construyeCFDIReciboHrsExtras(CFDIReciboHrsExtras cfdiReciboHrsExtra, DatosHorasExtras horasExtra)
 {
     if (cfdiReciboHrsExtra == null)
     {
         cfdiReciboHrsExtra = new CFDIReciboHrsExtras();
     }
     if (mapConceptosHrsExtras.ContainsKey(horasExtra.asistencia.excepciones.concepNomDefi.clave))
     {
         MovNomConcep mnc = mapConceptosHrsExtras[horasExtra.asistencia.excepciones.concepNomDefi.clave];//.get(horasExtra.getAsistencia().getExcepciones().getConcepNomDefi().getClave());
         if (mnc != null)
         {
             cfdiReciboHrsExtra.dias        = (horasExtra.dias);
             cfdiReciboHrsExtra.horasExtras = (horasExtra.hrsExtas);
             if (string.Equals(horasExtra.asistencia.excepciones.clave, ClavesParametrosModulos.claveExcepcionExtraDoble.ToString(), StringComparison.OrdinalIgnoreCase))
             {
                 cfdiReciboHrsExtra.tipoHoras = ("01");
             }
             else if (string.Equals(horasExtra.asistencia.excepciones.clave, ClavesParametrosModulos.claveExcepcionExtraTriple.ToString(), StringComparison.OrdinalIgnoreCase))
             {
                 cfdiReciboHrsExtra.tipoHoras = ("02");
             }
             else
             {
                 cfdiReciboHrsExtra.tipoHoras = ("03");
             }
             if (mnc.movNomBaseAfecta == null)
             {
                 cfdiReciboHrsExtra.importeExento   = (0.0);
                 cfdiReciboHrsExtra.importeGravable = (0.0);
             }
             else
             {
                 List <MovNomBaseAfecta> baseAfectas = mnc.movNomBaseAfecta;
                 if (!baseAfectas.Any())
                 {
                     cfdiReciboHrsExtra.importeExento   = (0.0);
                     cfdiReciboHrsExtra.importeGravable = (0.0);
                 }
                 else
                 {
                     int j;
                     for (j = 0; j < baseAfectas.Count(); j++)
                     {
                         if (string.Equals(baseAfectas[j].baseAfecConcepNom.baseNomina.clave, (String)ClavesParametrosModulos.claveBaseNominaISR, StringComparison.OrdinalIgnoreCase))
                         {
                             cfdiReciboHrsExtra.importeExento   = (baseAfectas[j].resultadoExento.GetValueOrDefault());
                             cfdiReciboHrsExtra.importeGravable = (baseAfectas[j].resultado.GetValueOrDefault());
                             break;
                         }
                         else
                         {
                             cfdiReciboHrsExtra.importeExento   = (0.0);
                             cfdiReciboHrsExtra.importeGravable = (0.0);
                         }
                     }
                 }
             }
         }
         else
         {
             cfdiReciboHrsExtra = null;
         }
     }
     else
     {
         cfdiReciboHrsExtra = null;
     }
     return(cfdiReciboHrsExtra);
 }
        private CFDIRecibo construyeCFDIRecibo(List <MovNomConcep> listMovNom, List <DatosHorasExtras> listHrsExtras, List <DatosIncapacidades> listIncapacidades, DateTime fechaActual)
        {
            CFDIRecibo cfdiRecibo = new CFDIRecibo();

            ////////        cfdiRecibo.setCadenaCertificado(nombreTablaBDs);
            ////////        cfdiRecibo.setCadenaOriginalTimbrado(nombreTablaBDs);
            ////////        cfdiRecibo.setCertificadoTimbrado(nombreTablaBDs);
            cfdiRecibo.fechaGeneraInfo = (fechaActual);
            ////////        cfdiRecibo.setFechaHoraTimCancelado(null);
            ////////        cfdiRecibo.setFechaHoraTimbrado(null);
            ////////        cfdiRecibo.setFolioCFDI(msgError);
            ////////        cfdiRecibo.setMensaje(msgError);
            ////////        cfdiRecibo.setMotivoCancelacion(nombreTablaBDs);
            ////////        cfdiRecibo.setNoCertificado(nombreTablaBDs);
            ////////        cfdiRecibo.setSello(msgError);
            ////////        cfdiRecibo.setSelloTimbrado(nombreTablaBDs);
            ////////        cfdiRecibo.setSerieCFDI(msgError);
            cfdiRecibo.statusTimbrado = (StatusTimbrado.EN_PROCESO);
            //////        cfdiRecibo.setUUID(msgError);
            //////        cfdiRecibo.setVersion(msgError);
            //////        cfdiRecibo.setXmlTimbrado(xmlTimbrado);
            //***genera datos conceptos***/
            listMovNom = listMovNom == null ? new List <MovNomConcep>() : listMovNom;
            double totalPercepcion = 0.0, totalDeduccion = 0.0, totalOtrosPagos = 0.0, totalSeparacionIndeminizacion = 0.0;

            if (listMovNom.Count() > 0)
            {
                int i, j;
                List <MovNomBaseAfecta>   baseAfectas;
                List <CFDIReciboConcepto> listReciboConceptos = new List <CFDIReciboConcepto>();

                CFDIReciboConcepto reciboConcepto;

                ConcepNomDefi      cnd;
                Naturaleza         naturaleza;
                ConfigConceptosSat claveConSat;
                for (i = 0; i < listMovNom.Count(); i++)
                {
                    cnd        = listMovNom[i].concepNomDefi;
                    naturaleza = cnd.naturaleza;
                    if (listMovNom[i].resultado == null ? true : listMovNom[i].resultado == 0.0)
                    {
                        camposNecesariosMsg.Append(cnd.clave).Append(".- ").Append(cnd.descripcion).Append(" No ha sido calculado|");
                    }
                    else
                    {
                        if (
                            (listMovNom[i].concepNomDefi.naturaleza == Naturaleza.PERCEPCION | listMovNom[i].concepNomDefi.naturaleza == Naturaleza.DEDUCCION |
                             (
                                 (listMovNom[i].concepNomDefi.naturaleza == Naturaleza.CALCULO) &&
                                 ((listMovNom[i].concepNomDefi.formulaConcepto == "SubsEmpleoCalculado") | (listMovNom[i].concepNomDefi.formulaConcepto == "ISRSubsidio"))
                             )
                            )
                            & mapConceptosSAT.ContainsKey(string.Concat(cnd.clave, ManejadorEnum.GetDescription(naturaleza)))
                            )
                        {
                            if (mapConceptosIncapacidades.ContainsKey(cnd.clave))
                            {
                                claveConSat = mapConceptosSAT[string.Concat(cnd.clave, ManejadorEnum.GetDescription(naturaleza))];//.get(cnd.getClave().concat(naturaleza.name()));
                                if (string.Equals(claveConSat.conceptoSatClave, ClavesParametrosModulos.claveConceptoIncapacidadesSAT.ToString(), StringComparison.OrdinalIgnoreCase))
                                {
                                    mapConceptosIncapacidades[cnd.clave] = listMovNom[i];//.put(cnd.getClave(), listMovNom.get(i));
                                }
                            }
                            else if (mapConceptosHrsExtras.ContainsKey(cnd.clave))
                            {
                                //claveConSat = mapConceptosSAT.get(cnd.getClave().concat(naturaleza.name()));
                                claveConSat = mapConceptosSAT[string.Concat(cnd.clave, ManejadorEnum.GetDescription(naturaleza))];
                                if (string.Equals(claveConSat.conceptoSatClave, ClavesParametrosModulos.claveConceptoHrsExtrasSAT.ToString(), StringComparison.OrdinalIgnoreCase))
                                {
                                    // mapConceptosHrsExtras.put(cnd.getClave(), listMovNom.get(i));
                                    mapConceptosHrsExtras[cnd.clave] = listMovNom[i];
                                }
                            }
                            reciboConcepto               = new CFDIReciboConcepto();
                            reciboConcepto.id            = 0;
                            reciboConcepto.claveConcepto = (cnd.clave);
                            // claveConSat = mapConceptosSAT.get(cnd.getClave().concat(naturaleza.name()));
                            claveConSat                        = mapConceptosSAT[string.Concat(cnd.clave, ManejadorEnum.GetDescription(naturaleza))];
                            reciboConcepto.claveSAT            = (claveConSat.conceptoSatClave);
                            reciboConcepto.descripcionConcepto = (cnd.descripcion);
                            reciboConcepto.tipoNaturaleza      = (ManejadorEnum.GetDescription(naturaleza));
                            reciboConcepto.otroPago            = (claveConSat.otroPago);
                            if (listMovNom[i].movNomBaseAfecta == null)
                            {
                                reciboConcepto.importeExento   = (0.0);
                                reciboConcepto.importeGravable = (0.0);
                            }
                            else
                            {
                                baseAfectas = listMovNom[i].movNomBaseAfecta;
                                if (!baseAfectas.Any())
                                {
                                    if (claveConSat.otroPago & naturaleza == Naturaleza.PERCEPCION)
                                    {
                                        totalOtrosPagos = totalOtrosPagos + listMovNom[i].resultado.GetValueOrDefault();
                                    }
                                    else if (naturaleza == Naturaleza.PERCEPCION)
                                    {
                                        totalPercepcion = totalPercepcion + listMovNom[i].resultado.GetValueOrDefault();
                                    }
                                    else if (naturaleza == Naturaleza.DEDUCCION)
                                    {
                                        totalDeduccion = totalDeduccion + listMovNom[i].resultado.GetValueOrDefault();
                                    }

                                    reciboConcepto.importeExento   = (listMovNom[i].resultado == null ? 0.0 : listMovNom[i].resultado.GetValueOrDefault());
                                    reciboConcepto.importeGravable = (0.0);
                                }
                                else
                                {
                                    for (j = 0; j < baseAfectas.Count(); j++)
                                    {
                                        //string.Equals(baseAfectas[j].baseAfecConcepNom.baseNomina.clave, (String)ClavesParametrosModulos.claveBaseNominaISR, StringComparison.OrdinalIgnoreCase)
                                        if (string.Equals(baseAfectas[j].baseAfecConcepNom.baseNomina.clave, (String)ClavesParametrosModulos.claveBaseNominaISR, StringComparison.OrdinalIgnoreCase))
                                        {
                                            if (cnd.formulaConcepto.ToUpper().Contains("ISRSubsidio".ToUpper()))
                                            {
                                                reciboConcepto.importeExento   = (listMovNom[i].resultado == null ? 0.0 : listMovNom[i].resultado.GetValueOrDefault());
                                                reciboConcepto.importeGravable = (0.0);
                                            }
                                            else if (cnd.formulaConcepto.ToUpper().Contains("CalculoISR".ToUpper())
                                                     | cnd.formulaConcepto.ToUpper().Contains("CalculoIMSS".ToUpper())
                                                     | cnd.formulaConcepto.ToUpper().Contains("CalculoIMSSPatronal".ToUpper()))
                                            {
                                                reciboConcepto.importeExento   = (0.0);
                                                reciboConcepto.importeGravable = (listMovNom[i].resultado == null ? 0.0 : listMovNom[i].resultado.GetValueOrDefault());
                                            }
                                            else
                                            {
                                                reciboConcepto.importeExento   = (baseAfectas[j].resultadoExento == null ? 0.0 : baseAfectas[j].resultadoExento.GetValueOrDefault());
                                                reciboConcepto.importeGravable = (baseAfectas[j].resultado == null ? 0.0 : baseAfectas[j].resultado.GetValueOrDefault());
                                            }
                                            if (claveConSat.otroPago & naturaleza == Naturaleza.PERCEPCION)
                                            {
                                                totalOtrosPagos = totalOtrosPagos + reciboConcepto.importeExento + reciboConcepto.importeGravable;
                                            }
                                            else if (naturaleza == Naturaleza.PERCEPCION)
                                            {
                                                totalPercepcion = totalPercepcion + reciboConcepto.importeExento + reciboConcepto.importeGravable;
                                            }
                                            else if (naturaleza == Naturaleza.DEDUCCION)
                                            {
                                                totalDeduccion = totalDeduccion + reciboConcepto.importeExento + reciboConcepto.importeGravable;
                                            }
                                            break;
                                        }
                                        else
                                        {
                                            if (claveConSat.otroPago & naturaleza == Naturaleza.PERCEPCION)
                                            {
                                                totalOtrosPagos = totalOtrosPagos + listMovNom[i].resultado.GetValueOrDefault();
                                            }
                                            else if (naturaleza == Naturaleza.PERCEPCION)
                                            {
                                                totalPercepcion = totalPercepcion + listMovNom[i].resultado.GetValueOrDefault();
                                            }
                                            else if (naturaleza == Naturaleza.DEDUCCION)
                                            {
                                                totalDeduccion = totalDeduccion + listMovNom[i].resultado.GetValueOrDefault();
                                            }


                                            reciboConcepto.importeExento   = (listMovNom[i].resultado.GetValueOrDefault());
                                            reciboConcepto.importeGravable = (0.0);
                                        }
                                    }
                                }
                            }

                            if (naturaleza == Naturaleza.PERCEPCION)
                            {
                                if (string.Equals(claveConSat.conceptoSatClave, "022", StringComparison.OrdinalIgnoreCase) | string.Equals(claveConSat.conceptoSatClave, "023", StringComparison.OrdinalIgnoreCase)
                                    | string.Equals(claveConSat.conceptoSatClave, "025", StringComparison.OrdinalIgnoreCase))
                                {
                                    totalSeparacionIndeminizacion = totalSeparacionIndeminizacion + reciboConcepto.importeExento + reciboConcepto.importeGravable;
                                }
                            }

                            listReciboConceptos.Add(reciboConcepto);
                        }
                        else
                        {
                            camposNecesariosMsg.Append(cnd.clave).Append(".- ").Append(cnd.descripcion).Append(" ").Append("");//Utilerias.ObtenerMensaje.getString("ConcepNomDefiMsgClaveSat")).append("|");Pendiente
                        }
                    }
                }
                listHrsExtras = listHrsExtras == null ? new List <DatosHorasExtras>() : listHrsExtras;
                if (listHrsExtras.Count() > 0)
                {
                    List <CFDIReciboHrsExtras> cfdiReciboHrsExtras = new List <CFDIReciboHrsExtras>();
                    CFDIReciboHrsExtras        cfdiReciboHrsExtra  = null;
                    for (i = 0; i < listHrsExtras.Count(); i++)
                    {
                        cfdiReciboHrsExtra = construyeCFDIReciboHrsExtras(cfdiReciboHrsExtra, listHrsExtras[i]);
                        if (cfdiReciboHrsExtra != null)
                        {
                            cfdiReciboHrsExtras.Add(cfdiReciboHrsExtra);
                        }
                    }
                    cfdiRecibo.cfdiReciboHrsExtras = (!cfdiReciboHrsExtras.Any() ? null : cfdiReciboHrsExtras);
                }
                listIncapacidades = listIncapacidades == null ? new List <DatosIncapacidades>() : listIncapacidades;
                if (listIncapacidades.Count() > 0)
                {
                    List <CFDIReciboIncapacidad> cfdiReciboIncapacidades = new List <CFDIReciboIncapacidad>();
                    CFDIReciboIncapacidad        cfdiIncapacidad         = null;
                    for (i = 0; i < listIncapacidades.Count(); i++)
                    {
                        cfdiIncapacidad = construyeCFDIReciboIncapacidad(cfdiIncapacidad, listIncapacidades[i]);
                        if (cfdiIncapacidad != null)
                        {
                            cfdiReciboIncapacidades.Add(cfdiIncapacidad);
                        }
                    }
                    cfdiRecibo.cfdiReciboIncapacidad = (!cfdiReciboIncapacidades.Any() ? null : cfdiReciboIncapacidades);
                }
                cfdiRecibo.cfdiReciboConcepto = (listReciboConceptos);
            }
            cfdiRecibo.totalPercepcion = (totalPercepcion);
            cfdiRecibo.totalOtroPagos  = (totalOtrosPagos);
            cfdiRecibo.totalDeduccion  = (totalDeduccion);
            cfdiRecibo.total           = (totalPercepcion + totalOtrosPagos + totalSeparacionIndeminizacion) - totalDeduccion;

            cfdiRecibo.mensajeRec = (camposNecesariosMsg.ToString());;
            return(cfdiRecibo);
        }