/**
  * 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;
     }
 }
예제 #2
0
 /**
  * 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());
 }
예제 #3
0
 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();
 }
예제 #5
0
/**
 * 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";
예제 #7
0
 public function updateCategoryPathCache()
 {
     PartCategoryManager::getInstance()->updateCategoryPaths(PartCategoryManager::getInstance()->getRootNode());
     PartKeepr::getEM()->flush();
 }
예제 #8
0
 /**
  * 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")) . "%");
     }
 }
예제 #9
0
 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();
 }