/** * Migrates the old categories */ public function run() { $this->addCategoryRecursive(0, array()); foreach ($this->categories as $oldid => $category) { $newcategory = PartCategoryManager::getInstance()->createCategoryTreeByArray($category); self::$migratedCategories[$oldid] = $newcategory; } }
/** * Verifies that querying for a part works correctly. * * There was a bug where only lower-case strings matched against parts, fixed 2012-03-16. */ public function testPartNameQuerying() { $partName = "testPartNameQuerying"; $part = new Part(); $part->setName($partName); $part->setCategory(PartCategoryManager::getInstance()->getRootNode()->getNode()); $part->setStorageLocation(StorageLocationManager::getInstance()->getStorageLocation(self::$storageLocation)); PartKeepr::getEM()->persist($part); PartKeepr::getEM()->flush(); $service = new PartService(array("query" => $partName)); $response = $service->get(); $this->assertEquals(1, $response["totalCount"], "The resultset totalCount is wrong."); $this->assertEquals($response["data"][0]["name"], $part->getName()); }
public function getCurrentStats() { $aData = array(); $aData["partCount"] = PartManager::getInstance()->getPartCount(); $aData["categoryCount"] = PartCategoryManager::getInstance()->getCategoryCount(); $aData["totalPrice"] = PartManager::getInstance()->getTotalPrice(); $aData["averagePrice"] = PartManager::getInstance()->getAveragePrice(); $aData["partsWithPrice"] = PartManager::getInstance()->getPartCount(true); $aData["partsWithoutPrice"] = $aData["partCount"] - $aData["partsWithPrice"]; $result = PartUnitManager::getInstance()->getUnitCounts(); $aUnits = array(); foreach ($result as $row) { $aUnits[] = array("name" => PartUnit::loadById($row["puid"])->getName(), "stockLevel" => $row["stockLevel"]); } $aData["units"] = $aUnits; return $aData; }
public function createSnapshot() { $snapshot = new StatisticSnapshot(); $snapshot->setParts(PartManager::getInstance()->getPartCount()); $snapshot->setCategories(PartCategoryManager::getInstance()->getCategoryCount()); $result = PartUnitManager::getInstance()->getUnitCounts(); foreach ($result as $row) { $snapshotUnit = new StatisticSnapshotUnit(); $snapshotUnit->setPartUnit(PartUnit::loadById($row["puid"])); $snapshotUnit->setStatisticSnapshot($snapshot); if ($row["stockLevel"] !== null) { $snapshotUnit->setStockLevel($row["stockLevel"]); } else { $snapshotUnit->setStockLevel(0); } $snapshot->getUnits()->add($snapshotUnit); } PartKeepr::getEM()->persist($snapshot); PartKeepr::getEM()->flush(); }
/** * Initializes a bootstrapped PartKeepr environment. * * This is done within a function because we don't want to pollute the globals, which would give the following message * during unit tests: * * "PDOException: You cannot serialize or unserialize PDO instances" */ function initializeEnvironment() { PartKeepr::initialize("test"); $tool = new \Doctrine\ORM\Tools\SchemaTool(PartKeepr::getEM()); $classes = PartKeepr::getClassMetaData(); $tool->dropDatabase(); $tool->createSchema($classes); /* Some very basic installation things */ PartCategoryManager::getInstance()->ensureRootExists(); /* Create a blank admin user */ $user = new User(); $user->setUsername("admin"); $user->setPassword("admin"); $user->setAdmin(true); PartKeepr::getEM()->persist($user); /* Create a blank regular user */ $user2 = new User(); $user2->setUsername("regular"); $user2->setPassword("regular"); $user2->setAdmin(false); PartKeepr::getEM()->persist($user2); PartKeepr::getEM()->flush(); }
<?php /** * This is a script which updates all category path caches to the configured path separator. * * This script needs to be called after changing the partkeepr.category.path_separator. */ namespace PartKeepr\Scripts; use PartKeepr\PartKeepr, PartKeepr\PartCategory\PartCategoryManager, PartKeepr\Util\Configuration, PartKeepr\FootprintCategory\FootprintCategoryManager; include "../src/backend/PartKeepr/PartKeepr.php"; PartKeepr::initialize(); PartCategoryManager::getInstance()->updateCategoryPaths(PartCategoryManager::getInstance()->getRootNode()); FootprintCategoryManager::getInstance()->updateCategoryPaths(FootprintCategoryManager::getInstance()->getRootNode()); PartKeepr::getEM()->flush(); echo "All categories are updated for the configured category seperator of "; echo Configuration::getOption("partkeepr.category.path_separator") . "\n";
public function updateCategoryPathCache() { PartCategoryManager::getInstance()->updateCategoryPaths(PartCategoryManager::getInstance()->getRootNode()); PartKeepr::getEM()->flush(); }
/** * Advanced filtering for the list * @param QueryBuilder The $queryBuilder */ public function filterCallback($queryBuilder) { /** * Applies text-based filtering */ if ($this->hasParameter("query") && $this->getParameter("query") != "") { // Special case: If the user passes id:<number>, we retrieve that number only. // This is $additionalResults = array(); $regExp = "id:[0-9]+"; if (preg_match_all("/id:[0-9]+/", $this->getParameter("query"), $pregResults) === 1) { foreach ($pregResults as $match) { foreach ($match as $result) { $additionalResults[] = str_replace("id:", "", $result); } } } $fulltextSearch = new PartFulltextSearch($this->getParameter("query")); $fulltextSearchResults = $fulltextSearch->query(); $ids = array_merge($fulltextSearchResults, $additionalResults); $queryBuilder->andWhere("q.id IN (" . implode(",", $ids) . ")"); } /** * Applies filtering by the storage location id */ if ($this->getParameter("storageLocation") !== null) { $queryBuilder->andWhere("st.id = :storageLocation"); $queryBuilder->setParameter("storageLocation", $this->getParameter("storageLocation")); } // We need that join multiple times. Not exactly nice, as this should get pulled in only when needed. // @todo Refactor so that this join only gets inside when needed $queryBuilder->leftJoin("q.distributors", "di"); if ($this->getParameter("distributor") !== null) { $queryBuilder->leftJoin("di.distributor", "did"); $queryBuilder->andWhere("did.id = :distributor"); $queryBuilder->setParameter("distributor", $this->getParameter("distributor")); } if ($this->getParameter("manufacturer") !== null) { $queryBuilder->leftJoin("q.manufacturers", "ma"); $queryBuilder->leftJoin("ma.manufacturer", "mam"); $queryBuilder->andWhere("mam.id = :manufacturer"); $queryBuilder->setParameter("manufacturer", $this->getParameter("manufacturer")); } if ($this->getParameter("footprint") !== null) { $queryBuilder->andWhere("f.id = :footprintId"); $queryBuilder->setParameter("footprintId", $this->getParameter("footprint")); } /** * Filter by the category id and set the category mode * */ $category = intval($this->getParameter("category", 0)); if ($category !== 0) { /* Fetch all children */ if ($this->getParameter("categoryScope") == "selected") { $queryBuilder->andWhere("q.category = :category"); $queryBuilder->setParameter("category", $category); } else { $childs = PartCategoryManager::getInstance()->getChildNodes($category); $childs[] = $category; $queryBuilder->andWhere("q.category IN (" . implode(",", $childs) . ")"); } } /** * Filter by the stock mode */ switch ($this->getParameter("stockMode")) { case "all": break; case "zero": $queryBuilder->andWhere("q.stockLevel = 0"); break; case "nonzero": $queryBuilder->andWhere("q.stockLevel > 0"); break; case "below": $queryBuilder->andWhere("q.stockLevel < q.minStockLevel"); break; } /** * Query by the distributor's order number */ if ($this->getParameter("distributorOrderNumber")) { $queryBuilder->andWhere("LOWER(di.orderNumber) LIKE :orderNumber"); $queryBuilder->setParameter("orderNumber", "%" . strtolower($this->getParameter("distributorOrderNumber")) . "%"); } /** * Filter by the price */ if ($this->getParameter("withoutPrice") === true || $this->getParameter("withoutPrice") === "true") { $queryBuilder->andWhere("q.averagePrice IS NULL"); } if ($this->getParameter("createDateRestriction") !== "") { try { $dateTime = new \DateTime($this->getParameter("createDate")); $date = $dateTime->format("Y-m-d"); switch ($this->getParameter("createDateRestriction")) { case ">": $queryBuilder->andWhere("q.createDate > :createDate"); $queryBuilder->setParameter("createDate", $date); break; case "<": $queryBuilder->andWhere("q.createDate < :createDate"); $queryBuilder->setParameter("createDate", $date); break; case "=": $queryBuilder->andWhere("q.createDate > :createDate AND q.createDate < :createDate2"); $queryBuilder->setParameter("createDate", $date . " 00:00:00"); $queryBuilder->setParameter("createDate2", $date . " 23:59:59"); break; default: break; } } catch (\Exception $e) { // Do nothing for now } } if ($this->getParameter("withoutStockRemovals", false) === true || $this->getParameter("withoutStockRemovals", false) === "true") { $q = PartKeepr::getEM()->createQueryBuilder(); $q->select("p.id")->from("PartKeepr\\Part\\Part", "p")->leftJoin("p.stockLevels", "sl")->where("sl.stockLevel < 0"); $query = $q->getQuery(); $result = $query->getResult(); $filter = array(); foreach ($result as $res) { $filter[] = $res["id"]; } $queryBuilder->andWhere("q.id NOT IN (" . implode(",", $filter) . ")"); } /** * Query by the review flag */ if ($this->getParameter("needsReview") === true || $this->getParameter("needsReview") === "true") { $queryBuilder->andWhere("q.needsReview = true"); } /** * Query by the status */ if ($this->getParameter("status")) { $queryBuilder->andWhere("LOWER(q.status) LIKE :status"); $queryBuilder->setParameter("status", "%" . strtolower($this->getParameter("status")) . "%"); } /** * Query by the condition */ if ($this->getParameter("condition")) { $queryBuilder->andWhere("LOWER(q.partCondition) LIKE :condition"); $queryBuilder->setParameter("condition", "%" . strtolower($this->getParameter("condition")) . "%"); } }
public function addOrUpdatePart($aParameters) { if (!array_key_exists("quantity", $aParameters)) { $aParameters["quantity"] = 0; } if ($aParameters["part"] !== null) { try { $part = $this->getPart($aParameters["part"]); } catch (\Exception $e) { $part = new Part(); $user = SessionManager::getCurrentSession()->getUser(); $stock = new StockEntry($part, $aParameters["quantity"], $user); PartKeepr::getEM()->persist($stock); } } else { $part = new Part(); $user = SessionManager::getCurrentSession()->getUser(); $stock = new StockEntry($part, $aParameters["quantity"], $user); PartKeepr::getEM()->persist($stock); } if (array_key_exists("name", $aParameters)) { $part->setName($aParameters["name"]); } if (array_key_exists("description", $aParameters)) { $part->setDescription($aParameters["description"]); } if (array_key_exists("minstock", $aParameters)) { $part->setMinStockLevel($aParameters["minstock"]); } if (array_key_exists("comment", $aParameters)) { $part->setComment($aParameters["comment"]); } if (array_key_exists("footprint", $aParameters)) { if ($aParameters["footprint"] === null) { $part->setFootprint(null); } else { $footprint = FootprintManager::getInstance()->getOrCreateFootprint($aParameters["footprint"]); $part->setFootprint($footprint); } } if (array_key_exists("storagelocation", $aParameters)) { $storageLocation = StorageLocationManager::getInstance()->getOrCreateStorageLocation($aParameters["storagelocation"]); $part->setStorageLocation($storageLocation); } if (array_key_exists("category", $aParameters)) { $category = PartCategoryManager::getInstance()->getCategory($aParameters["category"]); $part->setCategory($category->getNode()); } /* Process linked changes */ if (array_key_exists("distributorChanges", $aParameters)) { if (is_array($aParameters["distributorChanges"])) { $this->processDistributorChanges($part, $aParameters["distributorChanges"]); } } if (array_key_exists("manufacturerChanges", $aParameters)) { if (is_array($aParameters["manufacturerChanges"])) { $this->processManufacturerChanges($part, $aParameters["manufacturerChanges"]); } } if (array_key_exists("parameterChanges", $aParameters)) { if (is_array($aParameters["parameterChanges"])) { $this->processParameterChanges($part, $aParameters["parameterChanges"]); } } if (array_key_exists("attachmentChanges", $aParameters)) { if (is_array($aParameters["attachmentChanges"])) { $this->processAttachmentChanges($part, $aParameters["attachmentChanges"]); } } if (array_key_exists("partUnit", $aParameters)) { if ($aParameters["partUnit"] === null || $aParameters["partUnit"] === 0) { $part->setPartUnit(null); } else { $part->setPartUnit(PartUnitManager::getInstance()->getPartUnit($aParameters["partUnit"])); } } PartKeepr::getEM()->persist($part); PartKeepr::getEM()->flush(); }