/**
  *
  *Lista los ingresos, se puede filtrar de acuerdo a la empresa, la sucursal, el usuario que registra el ingreso, el concepto de ingreso, la caja que recibi? ingreso, de una fecha inicial a una final, por monto, por cancelacion, y se puede ordenar de acuerdo a sus atributos.
  *
  * @param id_caja int Id de la caja de la cual se listaran los ingresos que ha recibido
  * @param fecha_inicial string Se listaran los ingresos cuya fecha de ingreso sea mayor a este valor
  * @param fecha_final string Se listaran los ingresos cuya fecha de ingreso sea menor a este valor
  * @param id_sucursal int Id de la sucursal de la cual se listaran sus ingresos
  * @param id_concepto_ingreso int Se listaran los ingresos que tengan este concepto de ingreso
  * @param id_empresa int Id de la empresa de la cual se listaran sus ingresos
  * @param id_usuario int Id del usuario del cual se listaran los ingresos que ha registrado
  * @param cancelado bool Si este valor no es obtenido, se listaran tanto ingresos cancelados como no cancelados, si es true, solo se listaran los ingresos cancelados, si es false, se listaran solo los ingresos no cancelados
  * @param monto_minimo float Se listaran los ingresos cuyo monto sea mayor a este valor
  * @param monto_maximo float Se listaran los ingresos cuyo monto sea menor a este valor
  **/
 public static function ListaIngreso($cancelado = null, $fecha_actual = null, $fecha_final = null, $fecha_inicial = null, $id_caja = null, $id_concepto_ingreso = null, $id_empresa = null, $id_sucursal = null, $id_usuario = null, $monto_maximo = null, $monto_minimo = null, $orden = null)
 {
     Logger::log("Listando ingresos....");
     //verifica que el orden sea valida
     if (!is_null($orden)) {
         if ($orden != "id_ingreso" && $orden != "id_empresa" && $orden != "id_usuario" && $orden != "id_concepto_ingreso" && $orden != "id_caja" && $orden != "fecha_del_ingreso" && $orden != "fecha_de_registro" && $orden != "id_sucursal" && $orden != "nota" && $orden != "descripcion" && $orden != "folio" && $orden != "monto" && $orden != "cancelado" && $orden != "motivo_cancelacion") {
             Logger::error("La variable orden (" . $orden . ") no es valida");
             throw new Exception("La variable orden (" . $orden . ") no es valida");
         }
     }
     //verifica que se hayan obtenido los parametros para usar getAll o getByRange
     $parametros = false;
     if (!is_null($id_empresa) || !is_null($id_usuario) || !is_null($id_concepto_ingreso) || !is_null($id_caja) || !is_null($fecha_inicial) || !is_null($fecha_final) || !is_null($id_sucursal) || !is_null($cancelado) || !is_null($monto_minimo) || !is_null($monto_maximo) || !is_null($fecha_actual)) {
         $parametros = true;
     }
     $ingresos = null;
     if ($parametros) {
         Logger::log("Se recibieron parametros, se listan los Ingresos dentro del rango");
         //
         //Se almacenan los parametros recibidos en el objeto criterio 1
         //para luego ser comparados.
         //
         $ingreso_criterio_1 = new Ingreso();
         $ingreso_criterio_2 = new Ingreso();
         $ingreso_criterio_1->setIdEmpresa($id_empresa);
         $ingreso_criterio_1->setIdUsuario($id_usuario);
         $ingreso_criterio_1->setIdConceptoIngreso($id_concepto_ingreso);
         $ingreso_criterio_1->setIdCaja($id_caja);
         $ingreso_criterio_1->setIdSucursal($id_sucursal);
         $ingreso_criterio_1->setCancelado($cancelado);
         if (!is_null($fecha_inicial)) {
             //
             //Si pasaron una fecha minima y existe una fecha maxima, entonces
             //el objeto 1 almacenara la minima y el objeto 2 la maxima para
             //que se impriman los ingresos entre esas dos fechas.
             //
             //Si no hay fecha maxima, el objeto 2 almacenara la fecha de hoy
             //para que se impriman los ingresos desde la fecha minima hasta hoy.
             //
             //
             $ingreso_criterio_1->setFechaDelIngreso($fecha_inicial);
             if (!is_null($fecha_final)) {
                 $ingreso_criterio_2->setFechaDelIngreso($fecha_final);
             } else {
                 $ingreso_criterio_2->setFechaDelIngreso(date("Y-m-d H:i:s", time()));
             }
         } else {
             if (!is_null($fecha_final)) {
                 //
                 //Si no se recibio fecha minima pero si fecha maxima
                 //El objeto 1 guarda la fecha maxima y el objeto 2 guarda
                 //la fecha minima posible de MySQL, para asi poder listar
                 //los ingresos anteriores a la fecha maxima.
                 //
                 $ingreso_criterio_1->setFechaDelIngreso($fecha_final);
                 $ingreso_criterio_2->setFechaDelIngreso("1000-01-01 00:00:00");
             } else {
                 if ($fecha_actual) {
                     //
                     //Si se recibio el booleano fecha_actual, se listaran los ingresos
                     //solo de hoy, se crea un timestamp con el año, el mes y el dia de hoy
                     //pero se inicia con la hora 00:00:00 y se almacena como fecha en el objeto 1.
                     //
                     //Se crea un segundo timestamp con el año, el mes y el dia de hoy pero
                     //con la hora 23:59:59 y se almacena como fecha en el objeto 2.
                     //
                     $hoy = mktime(0, 0, 0, date("m"), date("d"), date("Y"));
                     $ingreso_criterio_1->setFechaDelIngreso(date("Y-m-d H:i:s", $hoy));
                     $manana = mktime(23, 59, 59, date("m"), date("d"), date("Y"));
                     $ingreso_criterio_2->setFechaDelIngreso(date("Y-m-d H:i:s", $manana));
                 }
             }
         }
         if (!is_null($monto_minimo)) {
             //
             //Si se recibio el monto_minimo y se recibio el monto_maximo
             //el objeto 1 guarda el primero y el objeto2 guarda el segundo
             //para asi listar los ingresos cuyo monto sea mayor al minimo y
             //menor que el maximo
             //
             //Si no, el objeto 2 almacena el valor mas grande posible
             //para que se listen los gastos cuyo monto sea mayor al minimo
             //
             $ingreso_criterio_1->setMonto($monto_minimo);
             if (!is_null($monto_maximo)) {
                 $ingreso_criterio_2->setMonto($monto_maximo);
             } else {
                 $ingreso_criterio_2->setMonto(1.8E+100);
             }
         } else {
             if (!is_null($monto_maximo)) {
                 //
                 //Si solo se obtuvo monto_maximo, el objeto 1 lo almacena y el
                 //objeto 2 almacena el monto mas bajo posible para que  se listen
                 //los gastos cuyo monto sea menor al maximo
                 //
                 $ingreso_criterio_1->setMonto($monto_maximo);
                 $ingreso_criterio_2->setMonto(0);
             }
         }
         $ingresos = IngresoDAO::byRange($ingreso_criterio_1, $ingreso_criterio_2, $orden);
     } else {
         if (is_null($orden)) {
             $orden = "fecha_del_ingreso";
         }
         $ingresos = IngresoDAO::getAll(null, null, $orden, "desc");
     }
     Logger::log("Se obtuvo la lista de ingresos exitosamente");
     return array("resultados" => $ingresos, "numero_de_resultados" => sizeof($ingresos));
 }