/*public override bool AplicarCobros()
         * {
         *  bool resultado = false;
         *  List<Cobro> Cobros = this.ListaCobros;
         *
         *  foreach (Cobro Cobro in Cobros)
         *  {
         *      resultado = Cobro.ChequeTarjetaAltaModifica();
         *      Cobro.MovimientoCajaCobroAlta(this.Caja, this.FOperacion, this.Consecutivo, this.Folio);
         *      Cobro.MovimientoCajaEntradaAlta(this.Caja, this.FOperacion, this.Consecutivo, this.Folio);
         *      Cobro.ActualizaPagoReferenciado(this.Caja, this.FOperacion, this.Consecutivo, this.Folio);
         *
         *      //List<ReferenciaConciliadaPedido> Pedidos = Cobro.ListaPedidos;
         *      //if ((Cobro.ListaPedidos.GroupBy(s => s.Pedido).Select(s => s.First()).ToList().Count) == 1)
         *      //{
         *
         *      //}
         *      List<ReferenciaConciliadaPedido> Pedidos = Cobro.ListaPedidos.GroupBy(s => s.Pedido).Select(s => s.First()).ToList();
         *
         *      foreach (ReferenciaConciliadaPedido Pedido in Pedidos)
         *      {
         *          Pedido.MontoConciliado = Cobro.ListaPedidos.Where(y => y.Pedido == Pedido.Pedido).Sum(x => x.MontoConciliado);
         *          Pedido.CobroPedidoAlta(Cobro.AñoCobro, Cobro.NumCobro);
         *          Pedido.PedidoActualizaSaldo();
         *          Pedido.ActualizaPagosPorAplicar();
         *
         *      }
         *
         *  }
         *  if (resultado)
         *  {
         *      this.ImplementadorMensajes.MostrarMensaje("El Registro se guardo con éxito.");
         *  }
         *  return resultado;
         * }*/


        public override bool AplicarCobros(Conexion _conexion)
        {
            bool resultado = false;


            try
            {
                List <Cobro> Cobros = this.ListaCobros;

                foreach (Cobro Cobro in Cobros)
                {
                    resultado = Cobro.ChequeTarjetaAltaModifica(_conexion);
                    Cobro.MovimientoCajaCobroAlta(this.Caja, this.FOperacion, this.Consecutivo, this.Folio, _conexion);
                    Cobro.MovimientoCajaEntradaAlta(this.Caja, this.FOperacion, this.Consecutivo, this.Folio, _conexion);
                    Cobro.ActualizaPagoReferenciado(this.Caja, this.FOperacion, this.Consecutivo, this.Folio, _conexion);

                    List <ReferenciaConciliadaPedido> Pedidos =
                        Cobro.ListaPedidos.GroupBy(s => s.Pedido).Select(s => s.First()).ToList();

                    foreach (ReferenciaConciliadaPedido Pedido in Pedidos)
                    {
                        Pedido.MontoConciliado =
                            Cobro.ListaPedidos.Where(y => y.Pedido == Pedido.Pedido).Sum(x => x.MontoConciliado);
                        Pedido.CobroPedidoAlta(Cobro.AñoCobro, Cobro.NumCobro, _conexion);
                        Pedido.PedidoActualizaSaldo(_conexion);
                        Pedido.ActualizaPagosPorAplicar(_conexion);
                    }
                }
                //if (resultado)
                //{
                //    this.ImplementadorMensajes.MostrarMensaje("El Registro se guardo con éxito.");
                //}
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return(resultado);
        }
        /*public override bool AplicarCobros()
         * {
         *  bool resultado = false;
         *  List<Cobro> Cobros = this.ListaCobros;
         *
         *  foreach (Cobro Cobro in Cobros)
         *  {
         *      resultado = Cobro.ChequeTarjetaAltaModifica();
         *      Cobro.MovimientoCajaCobroAlta(this.Caja, this.FOperacion, this.Consecutivo, this.Folio);
         *      Cobro.MovimientoCajaEntradaAlta(this.Caja, this.FOperacion, this.Consecutivo, this.Folio);
         *      Cobro.ActualizaPagoReferenciado(this.Caja, this.FOperacion, this.Consecutivo, this.Folio);
         *
         *      //List<ReferenciaConciliadaPedido> Pedidos = Cobro.ListaPedidos;
         *      //if ((Cobro.ListaPedidos.GroupBy(s => s.Pedido).Select(s => s.First()).ToList().Count) == 1)
         *      //{
         *
         *      //}
         *      List<ReferenciaConciliadaPedido> Pedidos = Cobro.ListaPedidos.GroupBy(s => s.Pedido).Select(s => s.First()).ToList();
         *
         *      foreach (ReferenciaConciliadaPedido Pedido in Pedidos)
         *      {
         *          Pedido.MontoConciliado = Cobro.ListaPedidos.Where(y => y.Pedido == Pedido.Pedido).Sum(x => x.MontoConciliado);
         *          Pedido.CobroPedidoAlta(Cobro.AñoCobro, Cobro.NumCobro);
         *          Pedido.PedidoActualizaSaldo();
         *          Pedido.ActualizaPagosPorAplicar();
         *
         *      }
         *
         *  }
         *  if (resultado)
         *  {
         *      this.ImplementadorMensajes.MostrarMensaje("El Registro se guardo con éxito.");
         *  }
         *  return resultado;
         * }*/

        public override bool AplicarCobros(Conexion _conexion, short tipoConciliacion)
        {
            bool resultado    = false;
            bool EsVariosAUno = false;

            try
            {
                List <Cobro> Cobros = this.ListaCobros;
                // decimal AplicadoAPedido = 0;
                List <ReferenciaConciliadaPedido> PedidosActualizaSaldo = new List <ReferenciaConciliadaPedido>();

                foreach (Cobro Cobro in Cobros)
                {
                    List <ReferenciaConciliadaPedido> Pedidos = Cobro.ListaPedidos.ToList();
                    if (this.StatusAltaMC == StatusMovimientoCaja.Validado || tipoConciliacion == 2)
                    {
                        PedidosActualizaSaldo.AddRange(Pedidos);
                    }
                }

                foreach (Cobro Cobro in Cobros)
                {
                    Cobro.Usuario = this.Usuario;
                    resultado     = Cobro.ChequeTarjetaAltaModifica(_conexion);
                    Cobro.MovimientoCajaCobroAlta(this.Caja, this.FOperacion, this.Consecutivo, this.Folio, _conexion);
                    Cobro.MovimientoCajaEntradaAlta(this.Caja, this.FOperacion, this.Consecutivo, this.Folio, _conexion);
                    Cobro.ActualizaPagoReferenciado(this.Caja, this.FOperacion, this.Consecutivo, this.Folio, _conexion);

                    List <ReferenciaConciliadaPedido> Pedidos = Cobro.ListaPedidos.ToList();
                    //EsVariosAUno = Cobros.Count >= 1 && Pedidos.Count == 1;
                    //if (EsVariosAUno) //varios a uno
                    //{
                    //    foreach (ReferenciaConciliadaPedido Pedido in Pedidos)
                    //    {
                    //        Pedido.MontoConciliado =
                    //            Cobro.ListaPedidos.Where(y => y.AñoPedido == Pedido.AñoPedido && y.CelulaPedido == Pedido.CelulaPedido && y.Pedido == Pedido.Pedido).Sum(x => x.MontoConciliado);
                    //        Pedido.CobroPedidoAlta(Cobro.AñoCobro, Cobro.NumCobro, Cobro.Total - Cobro.Saldo, _conexion);
                    //        Pedido.PedidoActualizaSaldo(_conexion );
                    //        Pedido.ActualizaPagosPorAplicar(_conexion);
                    //    }

                    //}
                    //else//Uno a varios
                    //{
                    foreach (ReferenciaConciliadaPedido Pedido in Pedidos)
                    {
                        Pedido.MontoConciliado =
                            Cobro.ListaPedidos.Where(y => y.AñoPedido == Pedido.AñoPedido && y.CelulaPedido == Pedido.CelulaPedido && y.Pedido == Pedido.Pedido).Sum(x => x.MontoConciliado);
                        Pedido.CobroPedidoAlta(Cobro.AñoCobro, Cobro.NumCobro, _conexion);

                        //PedidoActualizaSaldo() NO se debe ejecutar
                        //cuando el status emitido y sea diferente de tipo c 2,
                        //solo cuando status sea validado
                        if (this.StatusAltaMC == StatusMovimientoCaja.Validado || tipoConciliacion == 2)
                        {
                            Pedido.PedidoActualizaSaldo(_conexion);
                        }
                        Pedido.ActualizaPagosPorAplicar(_conexion);
                    }
                    //}
                }

                //if (EsVariosAUno) //varios a uno
                //{
                //    if (this.StatusAltaMC == StatusMovimientoCaja.Validado || tipoConciliacion == 2)
                //    {
                //        int numpedidos = 0;
                //        var PedidosOrdenados =
                //            PedidosActualizaSaldo.GroupBy(f => new { f.Pedido }).Select(group => new { pedido = group.Key.Pedido, suma = group.Sum(f => f.MontoConciliado) }).ToList();
                //        foreach (ReferenciaConciliadaPedido Pedido in PedidosActualizaSaldo)
                //        {
                //            foreach (var p in PedidosOrdenados)
                //            {
                //                if (p.pedido == Pedido.Pedido)
                //                {
                //                    Pedido.PedidoActualizaSaldo(_conexion, p.suma);
                //                    numpedidos++;
                //                }
                //            }
                //            //if (numpedidos >= PedidosOrdenados.Count)
                //            //    break;
                //        }
                //    }
                //}

                //throw new Exception("PRUEBA");
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return(resultado);
        }