public static function DescontarDeAlmacenes(VentaProducto $detalle_producto, $id_sucursal) { Logger::log(" ===== Descontando de almacenes ====== "); //Validemos la sucursal $sucursal = SucursalDAO::GetByPK($id_sucursal); Logger::log("sucursal=" . $id_sucursal); if (is_null($sucursal)) { throw new InvalidDataException("Esta sucursal no existe"); } if (!$sucursal->getActiva()) { throw new BusinessLogicException("No se pueden descontar de una sucursal inactiva"); } //buscar sus lotes y buscar que exista el proudcto en esos lotes $almacenes = AlmacenDAO::search(new Almacen(array("id_sucursal" => $id_sucursal))); if (sizeof($almacenes) == 0) { throw new InvalidDataException("Esta scursal no tiene almacenes"); } $existencias = ProductoDAO::buscarProductoEnSucursal($detalle_producto->getIdProducto(), $id_sucursal); $total_existencias = 0; $a_descontar = array(); $necesito = $detalle_producto->getCantidad(); Logger::log("Necesito " . $necesito . " del producto pid=" . $detalle_producto->getIdProducto()); foreach ($existencias as $e) { Logger::log("En el lote idlote=" . $e["id_lote"] . " tengo c=" . $e["cantidad"]); $total_existencias += $e["cantidad"]; if ($necesito - $e["cantidad"] < 0) { //me basta con el producto //en este lote Logger::log("con este me basta..."); array_push($a_descontar, array("id_lote" => $e["id_lote"], "cantidad" => $necesito)); $necesito = 0; } else { Logger::log("no me basta, necesito mas..."); array_push($a_descontar, array("id_lote" => $e["id_lote"], "cantidad" => $e["cantidad"])); $necesito -= $e["cantidad"]; } } if ($total_existencias < $detalle_producto->getCantidad()) { $_p = ProductoDAO::getByPK($detalle_producto->getIdProducto()); throw new BusinessLogicException("No hay suficientes existencias del producto " . $_p->getCodigoProducto() . " en los almacenes de esta sucursal."); } for ($i = 0; $i < sizeof($a_descontar); $i++) { Logger::log("Descontando " . $a_descontar[$i]["cantidad"] . " de lote id_lote=" . $a_descontar[$i]["id_lote"]); AlmacenesController::SalidaLote($a_descontar[$i]["id_lote"], array(array("id_producto" => $detalle_producto->getIdProducto(), "cantidad" => $a_descontar[$i]["cantidad"], "id_unidad" => $detalle_producto->getIdUnidad())), "venta"); } //while($cantidad > 0){ //AlmacenController::SalidaLote( /* id_lote */, /* productos */, /* motivo */ "venta" ); //} Logger::log(" ===== Descontando de almacenes [OK] ====== "); }