private NominaDeduccionesDeduccion contruyeNominaDeduccion(CFDIReciboConcepto cfdiConceptoDeduccion)
        {
            NominaDeduccionesDeduccion deduccion = new NominaDeduccionesDeduccion();

            deduccion.Clave    = (cfdiConceptoDeduccion.claveConcepto);
            deduccion.Concepto = (cfdiConceptoDeduccion.descripcionConcepto);
            Double importe = cfdiConceptoDeduccion.importeExento + cfdiConceptoDeduccion.importeGravable;

            deduccion.Importe       = (UtileriasSat.castNumerosToBigDecimal(importe));
            deduccion.TipoDeduccion = (cfdiConceptoDeduccion.claveSAT);
            return(deduccion);
        }
        private NominaPercepcionesPercepcion contruyeNominaPercepcion(CFDIReciboConcepto cfdiConceptoPercepcion, List <CFDIReciboHrsExtras> listReciboHorasExtras)
        {
            NominaPercepcionesPercepcion percepcion = new NominaPercepcionesPercepcion();

            percepcion.Clave          = (cfdiConceptoPercepcion.claveConcepto);
            percepcion.Concepto       = (cfdiConceptoPercepcion.descripcionConcepto);
            percepcion.ImporteExento  = (UtileriasSat.castNumerosToBigDecimal(cfdiConceptoPercepcion.importeExento));
            percepcion.ImporteGravado = (UtileriasSat.castNumerosToBigDecimal(cfdiConceptoPercepcion.importeGravable));
            percepcion.TipoPercepcion = (cfdiConceptoPercepcion.claveSAT);
            if (string.Equals(cfdiConceptoPercepcion.claveSAT, "045"))
            { // accciones y titulos
                percepcion.AccionesOTitulos = (createAccionesTitulos());
            }
            else if (string.Equals(cfdiConceptoPercepcion.claveSAT, "019"))
            {  /// horas extras
                contruyeNominaListaHorasExtras(percepcion.HorasExtra.ToList(), listReciboHorasExtras);
            }
            return(percepcion);
        }
        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);
        }