public function indexAction() { $request = $this->getRequest(); if (!$request instanceof ConsoleRequest) { throw new \RuntimeException('You can only use this action from a console!'); } $serviceLocator = $this->getServiceLocator(); $dbCheck = $serviceLocator->get('DbCheck'); if ($dbCheck['dbConnect'] !== false) { $productsModel = new ProductsModel($serviceLocator); } $params = $request->getParams()->toArray(); $products = array(); for ($i = 1; $i <= 5; $i++) { $products[$i] = $this->sanitize($params['arg' . $i]); } if (isset($params['ps'])) { $params['ps'] = (int) $params['ps']; } else { $params['ps'] = 0; } if ($params['ps'] <= 0) { $params['ps'] = 1; } $params['ps'] = 'P' . $params['ps']; $params['name'] = (bool) $params['name']; $params['id'] = (bool) $params['id']; if ($params['name'] !== false) { $checkType = "by Product's name"; $productsTitle = "Product names"; $field = 'ProductName'; } elseif ($params['id'] !== false) { $checkType = "by Product's database ID"; $productsTitle = "Product ids"; $field = 'ID'; } else { $checkType = "by Product's warehouse location"; $productsTitle = "Warehouse locations"; $field = 'WarehouseLocation'; $mapCallback = 'strtoupper'; } // elseif $return = ""; $return .= PHP_EOL; $return .= "Route calculator"; $return .= PHP_EOL; $return .= $this->sep; $return .= "Check type:" . $this->getTab(2) . $checkType; $return .= PHP_EOL . PHP_EOL; $return .= "Picking station:" . $this->getTab() . $params['ps']; $return .= PHP_EOL . PHP_EOL; $return .= $productsTitle . " (user entry):"; $return .= PHP_EOL; for ($i = 1; $i <= 5; $i++) { $return .= $this->getTab(3) . $i . ' - '; if (isset($mapCallback) && !empty($mapCallback)) { $return .= $mapCallback($params['arg' . $i]); } else { $return .= $params['arg' . $i]; } $return .= PHP_EOL; } // for $return .= PHP_EOL; if ($dbCheck['dbConnect'] === false) { $return .= $this->raiseError("A database connection cannot be established." . PHP_EOL . "\tPlease check your database connection settings."); return $return; } // if if (isset($mapCallback) && !empty($mapCallback)) { $products = array_map($mapCallback, $products); } $productsDB = $productsModel->getProductsIdNameLocation($products, $field); if (count($productsDB) != 5) { $return .= $this->raiseError('Some of the entered parameters doesn\'t corespond to the database products.'); return $return; } // if $return .= PHP_EOL; $return .= "Calculated route:"; $return .= PHP_EOL; $return .= $this->getTab(3) . "1 -" . $this->getTab() . "Start from picking station " . $params['ps']; $return .= PHP_EOL . PHP_EOL; $productsIDsDB = array_column($productsDB, 'ID'); $productsNamesDB = array_column($productsDB, 'ProductName'); $warehouseLocationsDB = array_column($productsDB, 'WarehouseLocation'); $warehouseLocations = array_combine($productsIDsDB, $warehouseLocationsDB); $routeCalculator = new RouteCalculatorLibrary(); $routeCalculator->init($params['ps'], $warehouseLocations); $route = $routeCalculator->getRoute(); $warehouseLocations = array_combine($productsIDsDB, $warehouseLocationsDB); $productsNames = array_combine($productsIDsDB, $productsNamesDB); for ($i = 1; $i <= 5; $i++) { $return .= $this->getTab(3) . ($i + 1) . ' - '; $return .= $this->getTab() . "Warehouse location:" . $this->getTab() . $warehouseLocations[$route[$i - 1]] . PHP_EOL; $return .= $this->getTab(4) . "Product ID:" . $this->getTab(2) . $route[$i - 1] . PHP_EOL; $return .= $this->getTab(4) . "Product name:" . $this->getTab(2) . $productsNames[$route[$i - 1]] . PHP_EOL; $return .= PHP_EOL; } // for $return .= $this->getTab(3) . "7 -" . $this->getTab() . "Back to picking station " . $params['ps']; $return .= PHP_EOL . PHP_EOL; $return .= $this->sep; return $return; }
public function indexAction() { $data = array(); $data['title'] = 'Products'; $data['new_order'] = true; $data['menu'] = array('link' => 'orders', 'anchor' => 'View orders'); $serviceLocator = $this->getServiceLocator(); $dbCheck = $serviceLocator->get('DbCheck'); if ($dbCheck['dbConnect'] === false) { $this->layout('db/error'); return false; } // if $stations = new PickingStationsLibrary($serviceLocator); $data['pickingStations'] = $stations->getPickingStations(); $currentPickingStation = $stations->getCurrentPickingStation(); $data['currentPickingStationName'] = $currentPickingStation['StationName']; $productsModel = new ProductsModel($serviceLocator); $form = new ProductsForm('newOrder'); $request = $this->getRequest(); if ($request->isPost()) { $filter = new ProductsFilter(); $form->setInputFilter($filter->getInputFilter()); $form->setData($request->getPost()); if (!$form->isValid()) { $messages = $form->getMessages(); return $this->raiseError(current($messages['ssf'])); } // if $products = $filter->isExtraValid($request->getPost('product')); if ($products === false) { return $this->raiseError('The "Send Order" operation encountered some problems. If this message persists, please refer to website\'s admin.'); } $productsIDs = array_keys($products); $availableStockUnitsAndLocations = $productsModel->getProductsAvailableUnitsAndLocations($productsIDs); $availableUnitsDB = array_column($availableStockUnitsAndLocations, 'AvailableStockUnits'); $productsIDsDB = array_column($availableStockUnitsAndLocations, 'ID'); $availableUnits = array_combine($productsIDsDB, $availableUnitsDB); foreach ($products as $id => $units) { if ($availableUnits[$id] < $units) { return $this->raiseError('There aren\'t enough available units to cover your request'); } } // foreach $warehouseLocationsDB = array_column($availableStockUnitsAndLocations, 'WarehouseLocation'); $warehouseLocations = array_combine($productsIDsDB, $warehouseLocationsDB); $routeCalculator = new RouteCalculatorLibrary(); $routeCalculator->init($currentPickingStation['StationAlias'], $warehouseLocations); $route = $routeCalculator->getRoute(); $routes = array_flip($route); $ordersModel = new OrdersModel($serviceLocator); $insertOrder = array('OrderDate' => date('Y-m-d H:i:s'), 'PickingStationID' => $currentPickingStation['ID']); $insertedOrderID = $ordersModel->newOrder($insertOrder); $insertOrderProducts = array(); foreach ($products as $productID => $orderedUnits) { $insertOrderProducts[] = array('OrderID' => $insertedOrderID, 'ProductID' => $productID, 'OrderedUnits' => $orderedUnits, 'Route' => $routes[$productID] + 1); } // foreach $insertedOrderProducts = $productsModel->addOrderProducts($insertOrderProducts); $updatedProducts = $productsModel->updateStockValue($products); return $this->redirect()->toRoute('orders', array(), array('query' => array('view' => $insertedOrderID))); } // if $data['form'] = $form; $data['letters'] = range('A', 'Z'); $products = $productsModel->getProducts(); $data['products'] = $this->sortProducts($products); $this->layout()->setVariables($data); return new ViewModel($data); }