/// <summary>
        /// The update erection sequence.
        /// </summary>
        /// <param name="factory">
        /// The factory.
        /// </param>
        /// <param name="project">
        /// The project.
        /// </param>
        /// <param name="erectionSequenceList">
        /// The erection sequence list.
        /// </param>
        /// <returns>
        /// The System.Boolean.
        /// </returns>
        public bool UpdateErectionSequence( string factory, string project, List<KeyValuePair<int, int>> erectionSequenceList )
        {
            project = project.PadLeft( 12 );

            List<string> statementList = new List<string>( erectionSequenceList.Count );

            using( var database = new ImpactDatabase() )
            {
                var allIdArray = erectionSequenceList.Select( x => (object)x.Key ).ToArray();
                ImpactQuery query = new ImpactQuery
                                    {
                    Select = {
                                ImpModelPlanning.ElementId 
                             }, 
                    From = {
                              ImpModelPlanning.As( "T1" ) 
                           }, 
                    Where =
                    {
                        ImpModelPlanning.Factory.Equal( factory ), 
                        ImpModelPlanning.Project.Equal( project ), 
                        ImpModelPlanning.ElementId.In( allIdArray ), 
                    }, 
                };

                string statement = query.ToString();
                var existingPlanningList = database.GetAll( statement, column => column[0].Cast<int>() );
                var groupedByInsertUpdate = erectionSequenceList.GroupBy( x => existingPlanningList.Remove( x.Key ) ).ToList();

                var updateList = groupedByInsertUpdate.Find( x => x.Key );

                var insertList = groupedByInsertUpdate.Find( x => !x.Key );

                if( null != updateList )
                {
                    foreach( var item in updateList )
                    {
                        var update = new ImpactUpdate( ImpModelPlanning.Instance )
                        {
                            Columns = {
                                         { ImpModelPlanning.ErectionSequenceNo, item.Value } 
                                      }, 
                            Where =
                            {
                                ImpModelPlanning.Factory.Equal( factory ), 
                                ImpModelPlanning.Project.Equal( project ), 
                                ImpModelPlanning.ElementId.Equal( item.Key ), 
                            }
                        };
                        statementList.Add( update.ToString() );
                    }
                }

                if( null != insertList )
                {
                    foreach( var item in insertList )
                    {
                        var insert = new ImpactInsert( ImpModelPlanning.Instance )
                        {
                            Columns =
                            {
                            { ImpModelPlanning.Factory, factory }, 
                            { ImpModelPlanning.Project, project }, 
                            { ImpModelPlanning.ElementId, item.Key }, 
                            { ImpModelPlanning.ErectionSequenceNo, item.Value }, 
                            }, 
                        };

                        statementList.Add( insert.ToString() );
                    }
                }

                int result = database.ExecuteNonQuery( statementList.ToArray() );

                return result > 0;
            }
        }
        public static List<CatalogoExpensas.Pagos> registrarPagosAutomaticos(DateTime periodo, List<Pagos> pagos)
        {
            try
            {
                admEntities db = new admEntities();

                //Si alguien paga por automatico, queda totalmente al dia. Sumar recargos cobrados de meses anteriores o si pago en 2 vto
                List<expensas> expensas = new List<expensas>();
                List<Recargo> gastosExclusivos = new List<Recargo>();
                List<recargos> recargos = new List<recargos>();

                foreach (var p in pagos)
                {
                    var exp = db.expensas.Where(x => x.nro_referencia == p.nroReferencia).OrderByDescending(x => x.fecha).First();
                    var uni = new unidad();
                    uni.dir_edificio = exp.dir_edificio;
                    uni.id_unidad = exp.id_unidad;
                    p.Edificio = uni.dir_edificio;
                    p.Unidad = uni.id_unidad;
                    p.Periodo = exp.fecha.Month + "/" + exp.fecha.Year;

                    var expensasMismaUnidad = db.expensas.Where(x => x.dir_edificio == uni.dir_edificio && x.id_unidad == uni.id_unidad && x.pagado == 0).ToList();
                    var exclusivosMismaUnidad = CatalogoGastosExclusivos.getAllRecargos(uni);

                    expensas.AddRange(expensasMismaUnidad);
                    gastosExclusivos.AddRange(exclusivosMismaUnidad);
                }

                var expGrouped = expensas.GroupBy(x => new { x.dir_edificio, x.id_unidad })
                                        .Select(x => new expensas { dir_edificio = x.Key.dir_edificio, id_unidad = x.Key.id_unidad })
                                        .Cast<expensas>()
                                        .ToList();

                foreach (expensas e in expensas)
                {
                    e.pagado = 1;
                    db.Entry(e).State = System.Data.EntityState.Modified;
                }

                foreach (expensas e in expGrouped)
                {
                    recargos r = new recargos();
                    var uni = new unidad();
                    uni.dir_edificio = e.dir_edificio;
                    uni.id_unidad = e.id_unidad;
                    r.dir_edificio = e.dir_edificio;
                    r.periodo = DateTime.Parse("1/" + DateTime.Now.Month + "/" + DateTime.Now.Year);
                    var detalles = CatalogoDeudores.getDetalleDeudaUnidad(uni);
                    r.importe = detalles.Sum(x => x.Recargo);

                    var rExistente = recargos.Where(x => x.dir_edificio == r.dir_edificio && x.periodo == r.periodo).SingleOrDefault();

                    if (rExistente != null)
                        rExistente.importe += r.importe;
                    else
                        recargos.Add(r);
                }

                db.SaveChanges();

                foreach (var excl in gastosExclusivos)
                {
                    switch (excl.Tipo)
                    {
                        case "Exclusivos":
                            CatalogoGastosExclusivos.pagarRecargoExclusivo(excl.Edificio, excl.Unidad, excl.Concepto, excl.Fecha);
                            break;
                        case "Legales":
                            CatalogoGastosExclusivos.pagarRecargoLegales(excl.Edificio, excl.Unidad, excl.Concepto, excl.Fecha);
                            break;
                        case "Varios":
                            CatalogoGastosExclusivos.pagarRecargoVarios(excl.Edificio, excl.Unidad, excl.Concepto, excl.Fecha);
                            break;
                    }
                }

                CatalogoRecargos.addRecargos(recargos);

                return pagos;

            }
            catch (Exception e)
            {
                Logger.Log.write(e.InnerException == null ? e.Message : e.InnerException.Message);
                var str = "";
                str = e.InnerException?.InnerException?.Message;
                Logger.Log.write("Otro error: " + str);
                throw e;
            }
        }