Files
Phraseanet/lib/Alchemy/Phrasea/Order/OrderValidator.php
Aina Sitraka a892887dd2 PHRAS-3783 Prod - Order manager - add Download Expiration date (#4191)
* add download expiration date

* add expiration info in mail

* add calendar on order-manager validation

* add a default config on patch if not exist

* fix

* add predifined expireon date

* expiration override

* fix order manager deny and sen in the same time

* patch for todo column

* bump version

record acl admin

fix pusher and date on order

* some improvement

* some fix
2022-12-20 12:42:59 +01:00

179 lines
4.7 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 User $pusher
* @param BasketElement[] $elements
* @param $expireOn
*/
public function grantHD(User $user, User $pusher, $elements, $expireOn)
{
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, $pusher, \ACL::GRANT_ACTION_ORDER, $expireOn);
}
}
/**
* @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);
}
}
}