/**
  *
  *Lista los gastos, se puede filtrar de acuerdo a la empresa, la sucursal, el usuario que registra el gasto, el concepto de gasto, la orden de servicio, la caja de la cual se sustrajo el dinero para pagar el gasto, de una fecha inicial a una final, por monto, por cancelacion, y se puede ordenar de acuerdo a ss atributos.
  *
  * @param id_empresa int Id de la empresa de la cual se listaran sus gastos
  * @param id_usuario int Id del usuario del cual se listaran los gastos que ha registrado
  * @param id_concepto_gasto int Se listaran solo los gastos que tengan como concepto este id
  * @param id_orden_servicio int Se listaran los gastos que pertenezcan solamente a esta orden de servicio
  * @param id_caja int Id de caja de la cual se listaran los gastos que ha financiado
  * @param fecha_inicial string Se listaran los gastos cuya fecha de gasto sea mayor a esta fecha
  * @param fecha_final string Se listaran los gastos cuya fecha de gasto sea menor a esta fecha
  * @param id_sucursal int Id de la sucursal de la cual se listaran sus gastos
  * @param cancelado bool Si este valor no es obtenido, se listaran los gastos tanto cancelados como no cancelados. Si es true, se listaran solo los gastos cancelados, si es false, se listaran solo los gastos que no han sido cancelados
  * @param monto_minimo float Se listaran los gastos cuyo monto sea mayor a este valor
  * @param monto_maximo float Se listaran los gastos cuyo monto sea menor a este valor
  **/
 public static function ListaGasto($cancelado = null, $fecha_actual = null, $fecha_final = null, $fecha_inicial = null, $id_caja = null, $id_concepto_gasto = null, $id_empresa = null, $id_orden_servicio = null, $id_sucursal = null, $id_usuario = null, $monto_maximo = null, $monto_minimo = null, $orden = null)
 {
     //valida la variable orden
     if (!is_null($orden)) {
         if ($orden != "id_gasto" && $orden != "id_empresa" && $orden != "id_usuario" && $orden != "id_concepto_gasto" && $orden != "id_orden_de_servicio" && $orden != "id_caja" && $orden != "fecha_del_gasto" && $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 recibido parametros
     $parametros = false;
     if (!is_null($id_empresa) || !is_null($id_usuario) || !is_null($id_concepto_gasto) || !is_null($id_orden_servicio) || !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;
     }
     $gastos = null;
     if ($parametros) {
         Logger::log("Se recibieron parametros, se listan los Gastos dentro del rango");
         //
         //Se almacenan los parametros recibidos en el objeto criterio 1
         //para luego ser comparados.
         //
         $gasto_criterio_1 = new Gasto();
         $gasto_criterio_2 = new Gasto();
         $gasto_criterio_1->setIdEmpresa($id_empresa);
         $gasto_criterio_1->setIdUsuario($id_usuario);
         $gasto_criterio_1->setIdConceptoGasto($id_concepto_gasto);
         $gasto_criterio_1->setIdOrdenDeServicio($id_orden_servicio);
         $gasto_criterio_1->setIdCaja($id_caja);
         $gasto_criterio_1->setIdSucursal($id_sucursal);
         $gasto_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 gastos entre esas dos fechas.
             //
             //Si no hay fecha maxima, el objeto 2 almacenara la fecha de hoy
             //para que se impriman los gastos desde la fecha minima hasta hoy.
             //
             //
             $gasto_criterio_1->setFechaDelGasto($fecha_inicial);
             if (!is_null($fecha_final)) {
                 $gasto_criterio_2->setFechaDelGasto($fecha_final);
             } else {
                 $gasto_criterio_2->setFechaDelGasto(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 gastos anteriores a la fecha maxima.
                 //
                 $gasto_criterio_1->setFechaDelGasto($fecha_final);
                 $gasto_criterio_2->setFechaDelGasto("1000-01-01 00:00:00");
             } else {
                 if ($fecha_actual) {
                     //
                     //Si se recibio el booleano fecha_actual, se listaran los abonos
                     //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"));
                     $gasto_criterio_1->setFechaDelGasto(date("Y-m-d H:i:s", $hoy));
                     $manana = mktime(23, 59, 59, date("m"), date("d"), date("Y"));
                     $gasto_criterio_2->setFechaDelGasto(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 gastos 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
             //
             $gasto_criterio_1->setMonto($monto_minimo);
             if (!is_null($monto_maximo)) {
                 $gasto_criterio_2->setMonto($monto_maximo);
             } else {
                 $gasto_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
                 //
                 $gasto_criterio_1->setMonto($monto_maximo);
                 $gasto_criterio_2->setMonto(0);
             }
         }
         $gastos = GastoDAO::byRange($gasto_criterio_1, $gasto_criterio_2, $orden);
     } else {
         Logger::log("No se recibieron parametros, se listan todos los Gastos");
         $tipo_de_orden = "desc";
         if (is_null($orden)) {
             $orden = "fecha_de_registro";
         }
         $gastos = GastoDAO::getAll(null, null, $orden, $tipo_de_orden);
     }
     Logger::log("Se obtuvo la lista de gastos exitosamente");
     return array("resultados" => $gastos, "numero_de_resultados" => sizeof($gastos));
 }