mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-14 05:23:21 +00:00

- Squashed Pull request #1730 - Squashed Pull request #1741 - Squashed Pull request #1742 - Squash merge branch 4.0 - Squashed Pull request #1744 - Squashed Pull request #1746 - Squashed merge branch 4.0 - Squashed merge branch 4.0 - Squashed merge branch 4.0 - Squashed merge branch 4.0 - Squashed Pull request #1758 - Avoid using imagine/imagine alias as it is causing install issues - Squashed merge branch 4.0 - Squashed Pull request #1763 - Squashed merge branch 4.0 - Squash of 6 commits - Squashed merge branch 4.0 - This is a combination of 2 commits. - Squashed Pull request #1775 - Squashed Pull request #1777 - Squashed Pull request #1779 - Squashed Pull request #1780 - Squashed Pull request #1782 - Adds a Pull request template - Squased Pull request #1783 - Squash Pull request #1786 - Squashed Pull request #1796 - Squashed merge branch 4.0 - Squash Pull request #1791 - Squashed merge branch 4.0 - Squashed Pull request #1808 - Squashed Pull request #1811 - Squashed Pull request #1809
177 lines
4.6 KiB
PHP
177 lines
4.6 KiB
PHP
<?php
|
|
/**
|
|
* This file is part of Phraseanet
|
|
*
|
|
* (c) 2005-2016 Alchemy
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Alchemy\Phrasea\Order;
|
|
|
|
use Alchemy\Phrasea\Application\Helper\AclAware;
|
|
use Alchemy\Phrasea\Collection\Reference\CollectionReferenceRepository;
|
|
use Alchemy\Phrasea\Model\Entities\BasketElement;
|
|
use Alchemy\Phrasea\Model\Entities\OrderElement;
|
|
use Alchemy\Phrasea\Model\Entities\User;
|
|
use Alchemy\Phrasea\Record\RecordReference;
|
|
use Alchemy\Phrasea\Record\RecordReferenceCollection;
|
|
use Assert\Assertion;
|
|
|
|
class OrderValidator
|
|
{
|
|
const VALIDATION_ACCEPT = false;
|
|
const VALIDATION_DENY = true;
|
|
|
|
use AclAware;
|
|
|
|
/**
|
|
* @var \appbox
|
|
*/
|
|
private $appbox;
|
|
|
|
/**
|
|
* @var CollectionReferenceRepository
|
|
*/
|
|
private $repository;
|
|
|
|
public function __construct(\appbox $appbox, CollectionReferenceRepository $repository)
|
|
{
|
|
$this->appbox = $appbox;
|
|
$this->repository = $repository;
|
|
}
|
|
|
|
/**
|
|
* @param User $acceptor
|
|
* @param OrderElement[] $elements
|
|
* @return bool
|
|
*/
|
|
public function isGrantedValidation(User $acceptor, $elements)
|
|
{
|
|
$acceptableCollections = $this->getAclForUser($acceptor)->getOrderMasterCollectionsBaseIds();
|
|
|
|
$elementsCollections = [];
|
|
|
|
foreach ($elements as $element) {
|
|
$elementsCollections[$element->getBaseId()] = true;
|
|
}
|
|
|
|
return empty(array_diff(array_keys($elementsCollections), $acceptableCollections));
|
|
}
|
|
|
|
/**
|
|
* @param PartialOrder $order
|
|
* @return BasketElement[]
|
|
*/
|
|
public function createBasketElements(PartialOrder $order)
|
|
{
|
|
$basketElements = [];
|
|
|
|
$references = $this->getRecordReferenceCollection($order);
|
|
|
|
foreach ($references->toRecords($this->appbox) as $record) {
|
|
$basketElement = new BasketElement();
|
|
$basketElement->setRecord($record);
|
|
|
|
$basketElements[] = $basketElement;
|
|
}
|
|
|
|
return $basketElements;
|
|
}
|
|
|
|
/**
|
|
* @param User $acceptor
|
|
* @param PartialOrder $order
|
|
*/
|
|
public function accept(User $acceptor, PartialOrder $order)
|
|
{
|
|
$this->acceptOrDenyPartialOrder($acceptor, $order, self::VALIDATION_ACCEPT);
|
|
}
|
|
|
|
/**
|
|
* @param User $acceptor
|
|
* @param PartialOrder $order
|
|
*/
|
|
public function deny(User $acceptor, PartialOrder $order)
|
|
{
|
|
$this->acceptOrDenyPartialOrder($acceptor, $order, self::VALIDATION_DENY);
|
|
}
|
|
|
|
/**
|
|
* @param User $user
|
|
* @param BasketElement[] $elements
|
|
*/
|
|
public function grantHD(User $user, $elements)
|
|
{
|
|
Assertion::allIsInstanceOf($elements, BasketElement::class);
|
|
|
|
$acl = $this->getAclForUser($user);
|
|
|
|
foreach ($elements as $element) {
|
|
$recordReference = RecordReference::createFromDataboxIdAndRecordId(
|
|
$element->getSbasId(),
|
|
$element->getRecordId()
|
|
);
|
|
|
|
$acl->grant_hd_on($recordReference, $user, 'order');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param PartialOrder $order
|
|
* @return RecordReferenceCollection
|
|
*/
|
|
private function getRecordReferenceCollection(PartialOrder $order)
|
|
{
|
|
$databoxIdMap = [];
|
|
|
|
foreach ($this->repository->findMany($order->getBaseIds()) as $collectionReference) {
|
|
$databoxIdMap[$collectionReference->getBaseId()] = $collectionReference->getDataboxId();
|
|
}
|
|
|
|
$references = new RecordReferenceCollection();
|
|
|
|
foreach ($order->getElements() as $orderElement) {
|
|
if (!isset($databoxIdMap[$orderElement->getBaseId()])) {
|
|
throw new \RuntimeException('At least one collection was not found.');
|
|
}
|
|
|
|
$references->add(RecordReference::createFromDataboxIdAndRecordId(
|
|
$databoxIdMap[$orderElement->getBaseId()],
|
|
$orderElement->getRecordId()
|
|
));
|
|
}
|
|
|
|
return $references;
|
|
}
|
|
|
|
/**
|
|
* @param User $acceptor
|
|
* @param PartialOrder $order
|
|
* @param bool $deny
|
|
*/
|
|
private function acceptOrDenyPartialOrder(User $acceptor, PartialOrder $order, $deny)
|
|
{
|
|
$elements = $order->getElements();
|
|
|
|
if (empty($elements)) {
|
|
return;
|
|
}
|
|
|
|
$decrementCount = 0;
|
|
|
|
foreach ($elements as $element) {
|
|
$element->setOrderMaster($acceptor);
|
|
if (null === $element->getDeny()) {
|
|
++$decrementCount;
|
|
}
|
|
$element->setDeny($deny);
|
|
}
|
|
|
|
if ($decrementCount) {
|
|
$order->getOrder()->decrementTodo($decrementCount);
|
|
}
|
|
}
|
|
}
|