/** * *Realiza un corte de caja. Este metodo reduce el dinero de la caja y va registrando el dinero acumulado de esa caja. Si faltase dinero se carga una deuda al cajero. La fecha sera tomada del servidor. El usuario sera tomado de la sesion. * * @param saldo_final float Saldo que se dejara en la caja para que continue realizando sus operaciones. * @param id_caja int Id de la caja a la que se le hace el corte * @param saldo_real float Saldo real encontrado en la caja * @param billetes_encontrados json Ids de billetes encontrados en la caja al hacer el corte * @param billetes_dejados json Ids de billetes dejados en la caja despues de hacer el corte * @param id_cajero int Id del cajero en caso de que no sea este el que realiza el corte * @param id_cajero_nuevo int Id del cajero que entrara despues de realizar el corte * @return id_corte_caja int Id generado por la insercion del nuevo corte **/ public static function CorteCaja($id_caja, $saldo_final, $saldo_real, $billetes_dejados = null, $billetes_encontrados = null, $id_cajero = null, $id_cajero_nuevo = null) { Logger::log("Realizando corte de caja"); //valida que la caja exista, que este abierta y que este activada $caja = CajaDAO::getByPK($id_caja); if (is_null($caja)) { Logger::error("La caja con id: " . $id_caja . " no existe"); throw new Exception("La caja con id: " . $id_caja . " no existe"); } if (!$caja->getActiva()) { Logger::error("La caja proporcionada no esta activa, no se le puede hacer un corte"); throw new Exception("La caja proporcionada no esta activa, no se le puede hacer un corte"); } if (!$caja->getAbierta()) { Logger::error("La caja proporcionada esta cerrada, no se pueden realizar movimientos a una caja cerrada"); throw new Exception("La caja proporcionada esta cerrada, no se pueden realizar movimientos a una caja cerrada"); } //se inicializa el registro de la tabla corte de caja $corte_de_caja = new CorteDeCaja(array("id_caja" => $id_caja, "id_cajero" => $id_cajero, "id_cajero_nuevo" => $id_cajero_nuevo, "fecha" => time(), "saldo_real" => $saldo_real, "saldo_esperado" => $caja->getSaldo(), "saldo_final" => $saldo_final)); DAO::transBegin(); try { //Se guarda el corte de caja y se modifica la caja, restandole los billetes encontrados y el saldo de la caja. CorteDeCajaDAO::save($corte_de_caja); CajasController::modificarCaja($id_caja, 0, $billetes_encontrados, $caja->getSaldo()); CajasController::modificarCaja($id_caja, 1, $billetes_dejados, $saldo_final); //Si se lleva control de billetes, se hac eun registro por cada tipo de billete encontrado. //Despues, se buscan los billetes que quedan en la caja entre los tipos de billetes encontrados, //si no se encuentran, se crea su registro. //Como los billetes ya han sido restados de la caja, los que queden con numeros positivos seran //aquellos que hagan falta, y los que queden en numeros negativos seran los que sobraran. if ($caja->getControlBilletes()) { $billete_corte_caja = new BilleteCorteCaja(array("id_corte_caja" => $corte_de_caja->getIdCorteDeCaja(), "cantidad_dejada" => 0, "cantidad_sobrante" => 0, "cantidad_faltante" => 0)); $billetes_encontrados = object_to_array($billetes_encontrados); foreach ($billetes_encontrados as $billete) { $billete_corte_caja->setIdBillete($billete["id_billete"]); $billete_corte_caja->setCantidadEncontrada($billete["cantidad"]); BilleteCorteCajaDAO::save($billete_corte_caja); } $billetes_caja = BilleteCajaDAO::search(new BilleteCaja(array("id_caja" => $id_caja))); foreach ($billetes_caja as $b_c) { $billete_corte_caja = BilleteCorteCajaDAO::getByPK($b_c->getIdBillete(), $corte_de_caja->getIdCorteDeCaja()); if (is_null($billete_corte_caja)) { $billete_corte_caja = new BilleteCorteCaja(array("id_billete" => $b_c->getIdBillete(), "id_corte_caja" => $corte_de_caja->getIdCorteDeCaja(), "cantidad_encontrada" => 0, "cantidad_dejada" => 0, "cantidad_sobrante" => 0, "cantidad_faltante" => 0)); } if ($b_c->getCantidad() < 0) { $billete_corte_caja->setCantidadSobrante($b_c->getCantidad()); } else { if ($b_c->getCantidad() > 0) { $billete_corte_caja->setCantidadFaltante($b_c->getCantidad() * -1); } else { continue; } } $b_c->setCantidad(0); BilleteCajaDAO::save($b_c); BilleteCorteCajaDAO::save($billete_corte_caja); } /* Fin del foreach */ //Si los billetes dejados despues del corte no son obtenidos y el saldo de la caja //no es cero, se arroja una excepcion. if (is_null($billetes_dejados) && $saldo_final != 0) { throw new Exception("No se encontro el parametro billetes_dejados cuando se esta llevando control de los billetes en esta caja y su saldo no quedara en 0"); } $billetes_dejados = object_to_array($billetes_dejados); //Por cada billete dejado se busca su registro en la tabla billete_corte_caja, si no existe se crea, //si existe, se actualiza su parametro cantidad_dejada foreach ($billetes_dejados as $b_d) { $billete_corte_caja = BilleteCorteCajaDAO::getByPK($b_d["id_billete"], $corte_de_caja->getIdCorteDeCaja()); if (is_null($billete_corte_caja)) { $billete_corte_caja = new BilleteCorteCaja(array("id_billete" => $b_d["id_billete"], "id_corte_caja" => $corte_de_caja->getIdCorteDeCaja(), "cantidad_encontrada" => 0, "cantidad_dejada" => 0, "cantidad_sobrante" => 0, "cantidad_faltante" => 0)); } $billete_corte_caja->setCantidadDejada($b_d["cantidad"]); BilleteCorteCajaDAO::save($billete_corte_caja); } } /* Fin if control billetes*/ } catch (Exception $e) { DAO::transRollback(); Logger::error("No se pudo realizar el corte de caja: " . $e); throw new Exception("No se pudo realizar el corte de caja"); } DAO::transEnd(); Logger::log("Corte de caja realizado correctamente"); return array("id_corte_caja" => $corte_de_caja->getIdCorteDeCaja()); }