private NominaPercepcionesJubilacionPensionRetiro createJubilacionRetiro(ConceptosJubilacion conceptosJubilacion, Double total, Double?montoDiario, Double ultSueldoMen)
        {
            NominaPercepcionesJubilacionPensionRetiro jubilacionPensionRetiro = new NominaPercepcionesJubilacionPensionRetiro();

            if (conceptosJubilacion == ConceptosJubilacion.TOTAL)
            {
                jubilacionPensionRetiro.TotalUnaExhibicion = (UtileriasSat.castNumerosToBigDecimal(total));
            }
            if (conceptosJubilacion == ConceptosJubilacion.PARCIAL)
            {
                jubilacionPensionRetiro.MontoDiario      = (UtileriasSat.castNumerosToBigDecimal(total));
                jubilacionPensionRetiro.TotalParcialidad = (UtileriasSat.castNumerosToBigDecimal(montoDiario));
            }
            if (ultSueldoMen.CompareTo(total) > 0)
            {
                jubilacionPensionRetiro.IngresoAcumulable = (UtileriasSat.castNumerosToBigDecimal(total));
            }
            else
            {
                jubilacionPensionRetiro.IngresoAcumulable = (UtileriasSat.castNumerosToBigDecimal(ultSueldoMen));
            }
            jubilacionPensionRetiro.IngresoNoAcumulable = (UtileriasSat.castNumerosToBigDecimal(total - ultSueldoMen));

            return(jubilacionPensionRetiro);
        }
        private NominaDeducciones contruyeNominaListaDeducciones(List <CFDIReciboConcepto> listConceptos)
        {
            NominaDeducciones deducciones = null;

            listConceptos = listConceptos == null ? new List <CFDIReciboConcepto>() : listConceptos;
            if (listConceptos.Count() > 0)
            {
                deducciones = new NominaDeducciones();
                List <NominaDeduccionesDeduccion> listDeducciones = new List <NominaDeduccionesDeduccion>();
                int    i;
                Double totalImpuestosRetenidos = 0.0, totalOtrasDeducciones = 0.0;
                for (i = 0; i < listConceptos.Count(); i++)
                {
                    if (string.Equals(listConceptos[i].claveSAT, "002", StringComparison.OrdinalIgnoreCase))
                    {
                        totalImpuestosRetenidos = totalImpuestosRetenidos + listConceptos[i].importeExento + listConceptos[i].importeGravable;
                    }
                    else
                    {
                        totalOtrasDeducciones = totalOtrasDeducciones + listConceptos[i].importeGravable + listConceptos[i].importeExento;
                    }
                    listDeducciones.Add(contruyeNominaDeduccion(listConceptos[i]));
                }
                totalDeducciones      = totalImpuestosRetenidos + totalOtrasDeducciones;
                deducciones.Deduccion = listDeducciones.ToArray();
                if (totalImpuestosRetenidos > 0.0)
                {
                    deducciones.TotalImpuestosRetenidos = (UtileriasSat.castNumerosToBigDecimal(totalImpuestosRetenidos));
                }
                deducciones.TotalOtrasDeducciones = (UtileriasSat.castNumerosToBigDecimal(totalOtrasDeducciones));
            }
            return(deducciones);
        }
        private NominaOtroPago contruyeNominaOtroPago(List <CFDIReciboConcepto> listConceptosOtros)
        {
            NominaOtroPago otroPago = new NominaOtroPago();

            int    i;
            Double total1 = 0.0, total2 = 0.0;

            for (i = 0; i < listConceptosOtros.Count(); i++)
            {
                if (i == 0)
                {
                    total1 = listConceptosOtros[i].importeGravable + listConceptosOtros[i].importeExento;
                }
                if (i == 1)
                {
                    total2 = listConceptosOtros[i].importeExento + listConceptosOtros[i].importeGravable;
                }
            }

            if (total1 < total2)
            {
                otroPago.Clave        = (listConceptosOtros[0].claveConcepto);
                otroPago.Concepto     = (listConceptosOtros[0].descripcionConcepto);
                otroPago.TipoOtroPago = (listConceptosOtros[0].claveSAT);
                otroPago.Importe      = (UtileriasSat.castNumerosToBigDecimal(listConceptosOtros[0].importeExento));

                otroPago.SubsidioAlEmpleo = (creaSubsidioAlEmpleo(total2));
            }

            if (total1 > total2)
            {
                if (listConceptosOtros.Count() == 1)
                {
                    otroPago.Clave        = (listConceptosOtros[0].claveConcepto);
                    otroPago.Concepto     = (listConceptosOtros[0].descripcionConcepto);
                    otroPago.TipoOtroPago = (listConceptosOtros[0].claveSAT);
                    otroPago.Importe      = (UtileriasSat.castNumerosToBigDecimal(listConceptosOtros[0].importeExento));
                }
                else
                {
                    otroPago.Clave        = (listConceptosOtros[1].claveConcepto);
                    otroPago.Concepto     = (listConceptosOtros[1].descripcionConcepto);
                    otroPago.TipoOtroPago = (listConceptosOtros[1].claveSAT);
                    otroPago.Importe      = (UtileriasSat.castNumerosToBigDecimal(listConceptosOtros[1].importeExento));
                }

                otroPago.SubsidioAlEmpleo = (creaSubsidioAlEmpleo(total1));
            }

            /*  otroPago.Clave=(cfdiConceptoPercepcion.claveConcepto);
             * otroPago.Concepto=(cfdiConceptoPercepcion.descripcionConcepto);
             * otroPago.TipoOtroPago=(cfdiConceptoPercepcion.claveSAT);
             * otroPago.Importe=(UtileriasSat.castNumerosToBigDecimal(cfdiConceptoPercepcion.importeExento));
             *
             * otroPago.SubsidioAlEmpleo=(creaSubsidioAlEmpleo(cfdiConceptoPercepcion.importeExento));  ///pendiente
             * ////////        otroPago.setCompensacionSaldosAFavor(creaCompensacionSaldosAFavor());////pendiente
             */
            return(otroPago);
        }
        private NominaOtroPagoSubsidioAlEmpleo creaSubsidioAlEmpleo(Double subsidioCausado)
        {
            NominaOtroPagoSubsidioAlEmpleo subsidioAlEmpleo = new NominaOtroPagoSubsidioAlEmpleo();

            subsidioAlEmpleo.SubsidioCausado = (UtileriasSat.castNumerosToBigDecimal(subsidioCausado));

            return(subsidioAlEmpleo);
        }
        private NominaIncapacidad contruyeNominaIncapacidad(CFDIReciboIncapacidad cfdiReciboIncapacidad)
        {
            NominaIncapacidad incapacidad = new NominaIncapacidad();

            incapacidad.ImporteMonetario = (UtileriasSat.castNumerosToBigDecimal(cfdiReciboIncapacidad.importeMonetario));
            incapacidad.DiasIncapacidad  = (cfdiReciboIncapacidad.diasIncapacidad);
            incapacidad.TipoIncapacidad  = (cfdiReciboIncapacidad.tipoIncapacidad);
            return(incapacidad);
        }
        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 Nomina contruyeNomina12(CFDIEmpleado cfdiEmpleado)
        {
            Nomina nomina = new Nomina();

            try
            {
                nomina.Version          = ("1.2");
                nomina.FechaFinalPago   = (UtileriasSat.castXmlFechaFormatoIso8601(cfdiEmpleado.fechaFinalPago));
                nomina.FechaInicialPago = (UtileriasSat.castXmlFechaFormatoIso8601(cfdiEmpleado.fechaInicioPago));
                nomina.FechaPago        = (UtileriasSat.castXmlFechaFormatoIso8601(cfdiEmpleado.fechaPago));
                nomina.NumDiasPagados   = (UtileriasSat.castNumerosToBigDecimal(cfdiEmpleado.numeroDiasPago));
                nomina.Emisor           = (construyeNominaEmisor(cfdiEmpleado));
                nomina.Receptor         = (construyeNominaReceptor(cfdiEmpleado));
                anioServicio            = UtileriasSat.getAniosServicio(cfdiEmpleado.fechaInicioRelLaboral.GetValueOrDefault(), cfdiEmpleado.fechaFinalPago);
                if (string.Equals(cfdiEmpleado.tipoCorrida.clave, "ASI", StringComparison.OrdinalIgnoreCase))
                {// duda, no solo una corrida asimilados es tipo de nomina especial, tambien finiquitos, vacaciones
                    nomina.NumDiasPagados = (UtileriasSat.castNumerosToBigDecimal(1));
                    nomina.TipoNomina     = ManejadorEnum.GetDescription(CTipoNomina.E);
                    if (nomina.Receptor != null)
                    {
                        nomina.Receptor.PeriodicidadPago = ("99");
                    }
                    cargaConceptosANomina(nomina, cfdiEmpleado.cfdiRecibo.cfdiReciboConcepto, cfdiEmpleado.cfdiRecibo.cfdiReciboHrsExtras);
                    if (existeIncapacidades)
                    {
                        nomina.Incapacidades = (contruyeNominaListaIncapacidades(cfdiEmpleado.cfdiRecibo.cfdiReciboIncapacidad).ToArray());
                    }
                }
                else
                {
                    nomina.TipoNomina = ManejadorEnum.GetDescription(CTipoNomina.O);
                    cargaConceptosANomina(nomina, cfdiEmpleado.cfdiRecibo.cfdiReciboConcepto, cfdiEmpleado.cfdiRecibo.cfdiReciboHrsExtras);
                    if (existeIncapacidades)
                    {
                        NominaIncapacidad[] incapacidades = contruyeNominaListaIncapacidades(cfdiEmpleado.cfdiRecibo.cfdiReciboIncapacidad).ToArray();
                        if (incapacidades.Length > 0)
                        {
                            nomina.Incapacidades = incapacidades;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                mensajeNomina.error   = (ex.Message);
                mensajeNomina.noError = (1);
                //utilSat.bitacora(ex.Message);
                ///nomina = null;
            }
            return(nomina);
        }
        private List <NominaOtroPago> construyeSinSubsidio()
        {
            //---
            List <NominaOtroPago> listOtrosPagos = new List <NominaOtroPago>();
            NominaOtroPago        otroPago       = new NominaOtroPago();

            otroPago.Clave        = conceptoNominaSubsidio.clave;       //(listConceptosOtros[0].claveConcepto);
            otroPago.Concepto     = conceptoNominaSubsidio.descripcion; //(listConceptosOtros[0].descripcionConcepto);
            otroPago.TipoOtroPago = "002";                              //(listConceptosOtros[0].claveSAT);
            otroPago.Importe      = (UtileriasSat.castNumerosToBigDecimal(0.00));

            otroPago.SubsidioAlEmpleo = (creaSubsidioAlEmpleo(0));
            listOtrosPagos.Add(otroPago);

            return(listOtrosPagos);
        }
        /*finiquito*/
        private NominaPercepcionesSeparacionIndemnizacion createSeparacionIndemnizacion(Double totalSeparacionIndeminizacion, Double ultSueldoMes, int anioServ)
        {
            NominaPercepcionesSeparacionIndemnizacion separacionIndemnizacion = new NominaPercepcionesSeparacionIndemnizacion();

            separacionIndemnizacion.NumAñosServicio     = (anioServ);
            separacionIndemnizacion.TotalPagado         = (UtileriasSat.castNumerosToBigDecimal(totalSeparacionIndeminizacion));
            separacionIndemnizacion.UltimoSueldoMensOrd = (UtileriasSat.castNumerosToBigDecimal(ultSueldoMes));
            if (ultSueldoMes.CompareTo(totalSeparacionIndeminizacion) > 0)
            {
                separacionIndemnizacion.IngresoAcumulable = (UtileriasSat.castNumerosToBigDecimal(totalSeparacionIndeminizacion));
            }
            else
            {
                separacionIndemnizacion.IngresoAcumulable = (UtileriasSat.castNumerosToBigDecimal(ultSueldoMes));
            }
            separacionIndemnizacion.IngresoNoAcumulable = (UtileriasSat.castNumerosToBigDecimal(totalSeparacionIndeminizacion - ultSueldoMes));
            return(separacionIndemnizacion);
        }
        private Comprobante calculaImportesConceptos(Comprobante comprobante, CFDIEmpleado cfdiEmpleado)
        {
            if (comprobante == null)
            {
                comprobante = new Comprobante();
            }
            Double totalDeduccion = 0.0, subTotal = 0.0, impuestoRetenido = 0.0, descuentos = 0.0, total = 0.0;
            List <CFDIReciboConcepto> conceptos = cfdiEmpleado.cfdiRecibo.cfdiReciboConcepto;

            ////        CFDIReciboConcepto cfdiReciboConceptoISR = null;
            if (conceptos != null)
            {
                int i;
                for (i = 0; i < conceptos.Count(); i++)
                {
                    if (mapClaveConceptosISR.ContainsKey(conceptos[i].claveConcepto))
                    {
                        ////                    cfdiReciboConceptoISR = conceptos.get(i);
                        impuestoRetenido = (conceptos[i].importeExento) + (conceptos[i].importeGravable);
                    }
                    if (string.Equals(conceptos[i].tipoNaturaleza, ManejadorEnum.GetDescription(Naturaleza.PERCEPCION)) | conceptos[i].otroPago)
                    {
                        if (conceptos[i].tipoNaturaleza != "CALCULO")
                        {
                            subTotal = subTotal + (conceptos[i].importeExento) + (conceptos[i].importeGravable);
                        }
                    }
                    else if (string.Equals(conceptos[i].tipoNaturaleza, ManejadorEnum.GetDescription(Naturaleza.DEDUCCION), StringComparison.OrdinalIgnoreCase))
                    {
                        if (!mapClaveConceptosISR.ContainsKey(conceptos[i].claveConcepto))
                        {
                            descuentos = descuentos + (conceptos[i].importeExento) + (conceptos[i].importeGravable);
                        }
                        totalDeduccion = totalDeduccion + (conceptos[i].importeExento) + (conceptos[i].importeGravable);
                    }
                }
            }

            comprobante.Descuento = (UtileriasSat.castNumerosToBigDecimal(descuentos + impuestoRetenido));
            comprobante.SubTotal  = (UtileriasSat.castNumerosToBigDecimal(subTotal)); //@
            total             = subTotal - descuentos - impuestoRetenido;
            comprobante.Total = (UtileriasSat.castNumerosToBigDecimal(total));        //Pendiente
            return(comprobante);
        }
        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 ComprobanteConcepto contruyeConceptos(CFDIEmpleado cfdiEmpleado)
        {
            ComprobanteConcepto concepto = new ComprobanteConcepto();

            concepto.Cantidad      = (UtileriasSat.castNumerosToBigDecimal(1)); //@pendiente el cast
            concepto.Descripcion   = ("Pago de nómina");                        //@
            concepto.ClaveProdServ = ("84111505");                              //84111505
            concepto.ClaveUnidad   = ("ACT");
            //no hay necesidad de poner el nodo impuesto
            Double totalPercepcion = 0.0, totalDeduciones = 0.0, totalOtrosPagos = 0.00;
            List <CFDIReciboConcepto> conceptos = cfdiEmpleado.cfdiRecibo.cfdiReciboConcepto;

            if (conceptos != null)
            {
                int i;
                for (i = 0; i < conceptos.Count(); i++)
                {
                    if (string.Equals(conceptos[i].tipoNaturaleza, ManejadorEnum.GetDescription(Naturaleza.PERCEPCION), StringComparison.OrdinalIgnoreCase))
                    {
                        if (conceptos[i].otroPago)
                        {
                            totalOtrosPagos = totalOtrosPagos + (conceptos[i].importeExento) + (conceptos[i].importeGravable);
                        }
                        else
                        {
                            totalPercepcion = totalPercepcion + conceptos[i].importeExento + conceptos[i].importeGravable;
                        }
                    }
                    else if (string.Equals(conceptos[i].tipoNaturaleza, ManejadorEnum.GetDescription(Naturaleza.DEDUCCION), StringComparison.OrdinalIgnoreCase))
                    {
                        totalDeduciones = totalDeduciones + conceptos[i].importeExento + conceptos[i].importeGravable;
                    }
                }
            }
            concepto.Descuento     = UtileriasSat.castNumerosToBigDecimal(totalDeduciones);
            concepto.Importe       = (UtileriasSat.castNumerosToBigDecimal(totalPercepcion + totalOtrosPagos)); //@//pendiente la conversion
            concepto.ValorUnitario = (UtileriasSat.castNumerosToBigDecimal(totalPercepcion + totalOtrosPagos)); //@//pendiente la conversion
            return(concepto);
        }
        private NominaPercepciones contruyeNominaListaPercepciones(List <CFDIReciboConcepto> listConceptos, List <CFDIReciboHrsExtras> listReciboHorasExtras)
        {
            NominaPercepciones percepciones = null;

            existeIncapacidades = false;
            listConceptos       = listConceptos == null ? new List <CFDIReciboConcepto>() : listConceptos;
            if (listConceptos.Count() > 0)
            {
                double ultSueldo = 0.0;
                percepciones = new NominaPercepciones();
                List <NominaPercepcionesPercepcion> listPercepciones = new List <NominaPercepcionesPercepcion>();
                int    i;
                bool   jubilacion = false, separacionIndeminizacion = false;
                Double totalExento = 0.0, totalGravable = 0.0, totalSueldo = 0.0, totalSeparacionIndeminizacion = 0.0, totalJubilacionPension = 0.0;
                ConceptosJubilacion conceptosJubilacion = ConceptosJubilacion.NINGUNA;
                for (i = 0; i < listConceptos.Count(); i++)
                {
                    totalExento   = totalExento + listConceptos[i].importeExento;
                    totalGravable = totalGravable + listConceptos[i].importeGravable;
                    if (string.Equals(listConceptos[i].claveSAT, "014", StringComparison.OrdinalIgnoreCase))
                    {
                        existeIncapacidades = true;
                    }
                    if (string.Equals(listConceptos[i].claveSAT, "001", StringComparison.OrdinalIgnoreCase))
                    {
                        existeIncapacidades = true;
                        ultSueldo           = listConceptos[i].importeExento + listConceptos[i].importeGravable;
                    }

                    if (string.Equals(listConceptos[i].claveSAT, "022", StringComparison.OrdinalIgnoreCase) | string.Equals(listConceptos[i].claveSAT, "023", StringComparison.OrdinalIgnoreCase)
                        | string.Equals(listConceptos[i].claveSAT, "025", StringComparison.OrdinalIgnoreCase))
                    {  /////SeparacionIndeminizacion
                        totalSeparacionIndeminizacion = totalSeparacionIndeminizacion + listConceptos[i].importeExento + listConceptos[i].importeGravable;
                        separacionIndeminizacion      = true;
                    }
                    else if (string.Equals(listConceptos[i].claveSAT, "039", StringComparison.OrdinalIgnoreCase) | string.Equals(listConceptos[i].claveSAT, "044", StringComparison.OrdinalIgnoreCase))
                    {  ///JubilacionPension
                        totalJubilacionPension = totalJubilacionPension + listConceptos[i].importeExento + listConceptos[i].importeGravable;
                        jubilacion             = true;
                        if (string.Equals(listConceptos[i].claveSAT, "039", StringComparison.OrdinalIgnoreCase))
                        {
                            conceptosJubilacion = ConceptosJubilacion.TOTAL;
                        }
                        else if (string.Equals(listConceptos[i].claveSAT, "044", StringComparison.OrdinalIgnoreCase))
                        {
                            conceptosJubilacion = ConceptosJubilacion.PARCIAL;
                        }
                    }
                    else
                    {
                        totalSueldo = totalSueldo + listConceptos[i].importeExento + listConceptos[i].importeGravable;
                    }
                    listPercepciones.Add(contruyeNominaPercepcion(listConceptos[i], listReciboHorasExtras));
                }
                percepciones.Percepcion = listPercepciones.ToArray();

                totalPercepciones         = totalExento + totalGravable;
                percepciones.TotalExento  = (UtileriasSat.castNumerosToBigDecimal(totalExento));
                percepciones.TotalGravado = (UtileriasSat.castNumerosToBigDecimal(totalGravable));
                percepciones.TotalSueldos = (UtileriasSat.castNumerosToBigDecimal(totalSueldo));


                if (jubilacion)
                {
                    percepciones.JubilacionPensionRetiro      = (createJubilacionRetiro(conceptosJubilacion, totalJubilacionPension, null, ultSueldo)); //pendiente
                    percepciones.TotalJubilacionPensionRetiro = (UtileriasSat.castNumerosToBigDecimal(totalJubilacionPension));
                }
                if (separacionIndeminizacion)
                {
                    percepciones.TotalSeparacionIndemnizacion = (UtileriasSat.castNumerosToBigDecimal(totalSeparacionIndeminizacion));
                    percepciones.SeparacionIndemnizacion      = (createSeparacionIndemnizacion(totalSeparacionIndeminizacion, ultSueldo, anioServicio));
                }
            }
            return(percepciones);
        }