diff --git a/src/Anleitung_V1.3.pdf.jpg b/src/Anleitung_V1.3.pdf.jpg new file mode 100644 index 000000000..20529fa61 Binary files /dev/null and b/src/Anleitung_V1.3.pdf.jpg differ diff --git a/src/new/assets/tailwind/js/order.js b/src/new/assets/tailwind/js/order.js index 2b66111a9..b6ebe1069 100644 --- a/src/new/assets/tailwind/js/order.js +++ b/src/new/assets/tailwind/js/order.js @@ -1,12 +1,39 @@ -const Order_List_Detail = ({ uuid, basketField1, customerInfo, basketField2, pos, price, product, status, allNet, reOrder, reOrderOrder, reOrderPos }, orderUuid) => ` +const Order_List_Preview = (uploadTypeObject) => { + const notAvailable = `
+ + + + not available +
`; + + if (!uploadTypeObject || !uploadTypeObject.preview || !uploadTypeObject.uploads || uploadTypeObject.uploads.length === 0) { + return notAvailable; + } + + const fileIconHtml = (typ) => ``; + + return uploadTypeObject.uploads.map(upload => { + const previewUrl = `/apps/backend/order/upload/preview?path=${encodeURIComponent(upload.path)}`; + return `
+ + ${fileIconHtml(upload.typ)} + ${upload.typ} +
`; + }).join(''); +}; + +const Order_List_Detail = ({ uuid, basketField1, customerInfo, basketField2, pos, price, product, status, allNet, reOrder, reOrderOrder, reOrderPos, uploadTypeObject }, orderUuid) => `
-
- - - - Vorschau -
+ ${Order_List_Preview(uploadTypeObject)}
Pos: diff --git a/src/new/config/packages/prod/monolog.php b/src/new/config/packages/prod/monolog.php index 14e829a7d..fc1a0799f 100755 --- a/src/new/config/packages/prod/monolog.php +++ b/src/new/config/packages/prod/monolog.php @@ -5,28 +5,33 @@ declare(strict_types=1); use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return static function (ContainerConfigurator $containerConfigurator): void { - $containerConfigurator->extension('monolog', - ['handlers' => - ['main' => - [ - 'type' => 'fingers_crossed', - 'action_level' => 'error', - 'handler' => 'nested', - 'excluded_http_codes' => [404, 405], - 'buffer_size' => 50 - ], - 'nested' => - [ - 'type' => 'stream', - 'path' => '%kernel.logs_dir%/%kernel.environment%.log', - 'level' => 'debug' - ], - 'console' => - [ - 'type' => 'console', - 'process_psr_3_messages' => false, - 'channels' => ['!event', '!doctrine'] - ] - ] - ]); + $containerConfigurator->extension('monolog', [ + 'channels' => ['ai'], + 'handlers' => [ + 'ai' => [ + 'type' => 'stream', + 'path' => '%kernel.logs_dir%/ai.log', + 'level' => 'debug', + 'channels' => ['ai'], + ], + + 'main' => [ + 'type' => 'fingers_crossed', + 'action_level' => 'error', + 'handler' => 'nested', + 'excluded_http_codes' => [404, 405], + 'buffer_size' => 50, + ], + 'nested' => [ + 'type' => 'stream', + 'path' => '%kernel.logs_dir%/%kernel.environment%.log', + 'level' => 'debug', + ], + 'console' => [ + 'type' => 'console', + 'process_psr_3_messages' => false, + 'channels' => ['!event', '!doctrine'], + ], + ], + ]); }; diff --git a/src/new/config/packages/security.php b/src/new/config/packages/security.php index 833e319ee..ae67f44dc 100755 --- a/src/new/config/packages/security.php +++ b/src/new/config/packages/security.php @@ -26,10 +26,12 @@ return static function (ContainerConfigurator $containerConfigurator): void { 'role_hierarchy' => [ 'ROLE_SHOP' => 'ROLE_USER', 'ROLE_PRODUCT_EDITOR' => ['ROLE_SHOP'], + 'ROLE_ORDER_VIEW' => ['ROLE_SHOP'], 'ROLE_SHOP_OPERATOR' => [ 'ROLE_SHOP', 'ROLE_PRODUCTION', 'ROLE_PRODUCT_EDITOR', + 'ROLE_ORDER_VIEW', ], 'ROLE_SHOP_ADMIN' => [ 'ROLE_SHOP', @@ -39,6 +41,7 @@ return static function (ContainerConfigurator $containerConfigurator): void { 'ROLE_SHOP', 'ROLE_SHOP_OPERATOR', 'ROLE_SHOP_ADMIN', + 'ROLE_ORDER_VIEW', ], 'ROLE_WAREHOUSE' => [ 'ROLE_USER', diff --git a/src/new/config/reference.php b/src/new/config/reference.php index 848c5bec1..a52f4b18b 100644 --- a/src/new/config/reference.php +++ b/src/new/config/reference.php @@ -476,7 +476,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param; * datetime?: array{ * default_format?: scalar|Param|null, // Default: "Y-m-d\\TH:i:sP" * default_deserialization_formats?: list, - * default_timezone?: scalar|Param|null, // Default: "UTC" + * default_timezone?: scalar|Param|null, // Default: "Europe/Berlin" * cdata?: scalar|Param|null, // Default: true * }, * array_collection?: array{ @@ -576,7 +576,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param; * datetime?: array{ * default_format?: scalar|Param|null, // Default: "Y-m-d\\TH:i:sP" * default_deserialization_formats?: list, - * default_timezone?: scalar|Param|null, // Default: "UTC" + * default_timezone?: scalar|Param|null, // Default: "Europe/Berlin" * cdata?: scalar|Param|null, // Default: true * }, * array_collection?: array{ diff --git a/src/new/src/PSC/Shop/MediaBundle/Helper/Transformer/PdfTransformer.php b/src/new/src/PSC/Shop/MediaBundle/Helper/Transformer/PdfTransformer.php index 6569f3ee6..512de4cd2 100755 --- a/src/new/src/PSC/Shop/MediaBundle/Helper/Transformer/PdfTransformer.php +++ b/src/new/src/PSC/Shop/MediaBundle/Helper/Transformer/PdfTransformer.php @@ -15,12 +15,21 @@ class PdfTransformer implements PreviewTransformerInterface { $info = pathinfo($absolutePath); - if (isset($info['extension']) && false !== strpos(strtolower($info['extension']), 'pdf') && file_exists($absolutePath)) { + if ( + isset($info['extension']) + && false !== strpos(strtolower($info['extension']), 'pdf') + && file_exists($absolutePath) + ) { // If it doesn't exist yet, extract the first page of the PDF $previewFilename = $this->getPreviewFilename($absolutePath); if (!file_exists($previewFilename)) { - exec("convert -background white -alpha remove -density 140 -resample 100 -colorspace sRGB '" . $absolutePath . "[0]' -quality 75 " . $previewFilename); + exec( + "convert -background white -alpha remove -density 140 -resample 100 -colorspace sRGB " + . escapeshellarg($absolutePath . '[0]') + . " -quality 75 " + . escapeshellarg($previewFilename), + ); } $absolutePath = $previewFilename; diff --git a/src/new/src/PSC/Shop/OrderBundle/Api/Upload/Create.php b/src/new/src/PSC/Shop/OrderBundle/Api/Upload/Create.php index 5bb663a1e..6fbd7b284 100644 --- a/src/new/src/PSC/Shop/OrderBundle/Api/Upload/Create.php +++ b/src/new/src/PSC/Shop/OrderBundle/Api/Upload/Create.php @@ -33,6 +33,7 @@ class Create extends AbstractController new MediaType('multipart/form-data', new Schema(properties: [ new Property(property: 'file', format: 'binary', type: 'string', description: 'File to upload'), new Property(property: 'position', type: 'string', description: 'Position UUID'), + new Property(property: 'typ', type: 'string', description: 'Typ'), ], required: ['file', 'position'])), ])] #[Response( diff --git a/src/new/src/PSC/Shop/OrderBundle/Controller/Backend/DetailController.php b/src/new/src/PSC/Shop/OrderBundle/Controller/Backend/DetailController.php index dd3c4732d..d2acbbd7e 100755 --- a/src/new/src/PSC/Shop/OrderBundle/Controller/Backend/DetailController.php +++ b/src/new/src/PSC/Shop/OrderBundle/Controller/Backend/DetailController.php @@ -49,6 +49,7 @@ use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\Routing\Attribute\Route; use Symfony\Bridge\Twig\Attribute\Template; +use Symfony\Component\Security\Http\Attribute\IsGranted; use Symfony\Component\HttpFoundation\Request; require_once __DIR__ . '/../../../EntityBundle/Lagacy/TP_Basket_Item.php'; @@ -65,6 +66,7 @@ class DetailController extends AbstractController { } + #[IsGranted('ROLE_ORDER_VIEW')] #[Route(path: '/detail/show/{uuid}/{enableDelivery}', defaults: ['enableDelivery' => 0], name: 'psc_shop_order_backend_detail_show')] #[Template('@PSCShopOrder/backend/detail/show.html.twig')] public function showAction( @@ -350,6 +352,7 @@ class DetailController extends AbstractController * @throws \Doctrine\ORM\ORMException * @internal param Request $request */ + #[IsGranted('ROLE_ORDER_VIEW')] #[Route(path: '/detail/switchposstatus/{order}/{pos}/{status}', name: 'psc_shop_order_backend_detail_switchposstatus')] #[Template('@PSCShopOrder/backend/detail/switchposstatus.html.twig')] public function switchPosStatusAction(EntityManagerInterface $entityManagerService, Manager $eventManagerService, Shop $shopService, $order = "", $pos = "", $status = 10) @@ -382,6 +385,7 @@ class DetailController extends AbstractController * @param string $uuid * @return RedirectResponse */ + #[IsGranted('ROLE_ORDER_VIEW')] #[Route(path: '/package/exported/{uuid}', name: 'psc_shop_order_backend_change_exported')] #[Template('@PSCShopOrder/backend/detail/setpackageexported.html.twig')] public function setPackageExportedAction(DocumentManager $mongoService, EntityManagerInterface $entityManagerService, Manager $eventManagerService, Shop $shopService, $uuid = "") @@ -426,6 +430,7 @@ class DetailController extends AbstractController * @param string $uuid * @return RedirectResponse */ + #[IsGranted('ROLE_ORDER_VIEW')] #[Route(path: '/detail/create/new/order/status/{uuid}', name: 'psc_shop_order_backend_create_new_order_status')] #[Template('@PSCShopOrder/backend/detail/createneworderstatus.html.twig')] public function createNewOrderStatus(DocumentManager $mongoService, EntityManagerInterface $entityManagerService, Manager $eventManagerService, Shop $shopService, $uuid = "") @@ -481,6 +486,7 @@ class DetailController extends AbstractController * @param string $uuid * @return RedirectResponse */ + #[IsGranted('ROLE_ORDER_VIEW')] #[Route(path: '/detail/delete/{uuid}', name: 'psc_shop_order_backend_detail_delete')] #[Template('@PSCShopOrder/backend/detail/deleteorder.html.twig')] public function deleteOrder(DocumentManager $mongoService, EntityManagerInterface $entityManagerService, Manager $eventManagerService, Shop $shopService, $uuid = "") diff --git a/src/new/src/PSC/Shop/OrderBundle/Controller/Backend/ListController.php b/src/new/src/PSC/Shop/OrderBundle/Controller/Backend/ListController.php index 71fd761eb..7d63775a5 100755 --- a/src/new/src/PSC/Shop/OrderBundle/Controller/Backend/ListController.php +++ b/src/new/src/PSC/Shop/OrderBundle/Controller/Backend/ListController.php @@ -66,7 +66,7 @@ class ListController extends AbstractController * @return array * @throws \Doctrine\ORM\ORMException */ - #[IsGranted('ROLE_ADMIN')] + #[IsGranted('ROLE_ORDER_VIEW')] #[Route(path: '/list/index', name: 'psc_shop_order_backend_list_index')] #[Template('@PSCShopOrder/backend/list/index.html.twig')] public function indexAction( diff --git a/src/new/src/PSC/Shop/OrderBundle/Controller/Backend/PrintController.php b/src/new/src/PSC/Shop/OrderBundle/Controller/Backend/PrintController.php index c2aa473a4..bbc715245 100755 --- a/src/new/src/PSC/Shop/OrderBundle/Controller/Backend/PrintController.php +++ b/src/new/src/PSC/Shop/OrderBundle/Controller/Backend/PrintController.php @@ -46,6 +46,7 @@ require_once(__DIR__ . '/../../../EntityBundle/Lagacy/TP_Basket_Item.php'); class PrintController extends AbstractController { + #[IsGranted('ROLE_ORDER_VIEW')] #[Route(path: '/detail/print/{type}/{uuid}', name: 'psc_shop_order_backend_detail_print')] #[Template('@PSCShopOrder/backend/print/print.html.twig')] public function printAction( @@ -89,6 +90,7 @@ class PrintController extends AbstractController return $response; } + #[IsGranted('ROLE_ORDER_VIEW')] #[Route(path: '/detail/printpos/{type}/{uuid}/{posuuid}', name: 'psc_shop_order_backend_detail_print_pos')] #[Template('@PSCShopOrder/backend/print/printpos.html.twig')] public function printPosAction( @@ -180,6 +182,7 @@ class PrintController extends AbstractController return $response; } + #[IsGranted('ROLE_ORDER_VIEW')] #[Route(path: '/detail/xrechnung/{uuid}', name: 'psc_shop_order_backend_detail_xrechnung')] #[Template('@PSCShopOrder/backend/print/xrechnung.html.twig')] public function xrechnung( diff --git a/src/new/src/PSC/Shop/OrderBundle/Controller/Backend/UploadController.php b/src/new/src/PSC/Shop/OrderBundle/Controller/Backend/UploadController.php index b81192201..2bee94445 100755 --- a/src/new/src/PSC/Shop/OrderBundle/Controller/Backend/UploadController.php +++ b/src/new/src/PSC/Shop/OrderBundle/Controller/Backend/UploadController.php @@ -15,15 +15,17 @@ namespace PSC\Shop\OrderBundle\Controller\Backend; use Doctrine\ORM\EntityManagerInterface; use PSC\Shop\EntityBundle\Entity\Motiv; +use PSC\Shop\MediaBundle\Helper\Transformer\PdfTransformer; use PSC\Shop\OrderBundle\Form\Backend\Upload\DeleteType; +use Symfony\Bridge\Twig\Attribute\Template; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\BinaryFileResponse; use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Component\HttpFoundation\JsonResponse; -use Symfony\Component\Security\Core\SecurityContext; -use Symfony\Component\Routing\Attribute\Route; -use Symfony\Bridge\Twig\Attribute\Template; -use Symfony\Component\Security\Http\Attribute\IsGranted; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\Routing\Attribute\Route; +use Symfony\Component\Security\Core\SecurityContext; +use Symfony\Component\Security\Http\Attribute\IsGranted; /** * UploadController fürs Backend @@ -33,6 +35,53 @@ use Symfony\Component\HttpFoundation\Request; */ class UploadController extends AbstractController { + #[IsGranted('ROLE_ORDER_VIEW')] + #[Route(path: '/upload/preview', name: 'psc_shop_order_backend_upload_preview', methods: ['GET'])] + public function previewAction(Request $request, PdfTransformer $pdfTransformer): BinaryFileResponse + { + $path = $request->query->get('path', ''); + + if ( + !str_starts_with($path, 'uploads/') + || str_contains($path, '..') + || str_contains($path, "\0") + || str_contains($path, "'") + ) { + throw $this->createNotFoundException(); + } + + $absolutePath = $this->getParameter('kernel.project_dir') . '/../old/public/' . $path; + + if (!file_exists($absolutePath)) { + throw $this->createNotFoundException(); + } + + $previewPath = $pdfTransformer->apply($absolutePath); + + $ext = strtolower(pathinfo($previewPath, PATHINFO_EXTENSION)); + if (!in_array($ext, ['jpg', 'jpeg', 'png', 'gif', 'webp'])) { + throw $this->createNotFoundException(); + } + + if (!file_exists($previewPath)) { + throw $this->createNotFoundException(); + } + + $mimeMap = [ + 'jpg' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'png' => 'image/png', + 'gif' => 'image/gif', + 'webp' => 'image/webp', + ]; + $response = new BinaryFileResponse($previewPath); + $response->headers->set('Content-Type', $mimeMap[$ext] ?? 'image/jpeg'); + $response->setPublic(); + $response->setMaxAge(3600); + + return $response; + } + /** * Delete Seite * @@ -44,19 +93,19 @@ class UploadController extends AbstractController * @return array|View|\Symfony\Component\HttpFoundation\RedirectResponse * @throws \Doctrine\ORM\ORMException */ + #[IsGranted('ROLE_ORDER_VIEW')] #[Route(path: '/upload/deleteAll/{uuid}', name: 'psc_shop_order_backend_upload_deleteAll')] #[Template('@PSCShopOrder/backend/upload/deleteall.html.twig')] public function deleteAllAction( Request $request, \PSC\System\SettingsBundle\Service\Shop $shopService, EntityManagerInterface $entityManager, - $uuid = "" + $uuid = '', ) { - $selectedShop = $shopService->getSelectedShop(); $order = $entityManager - ->getRepository('PSC\Shop\EntityBundle\Entity\Order') - ->findOneBy(array('shop' => $selectedShop, 'uuid' => $uuid)); + ->getRepository('PSC\Shop\EntityBundle\Entity\Order') + ->findOneBy(array('shop' => $selectedShop, 'uuid' => $uuid)); $form = $this->createForm(DeleteType::class); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { @@ -64,7 +113,7 @@ class UploadController extends AbstractController foreach ($order->getPositions() as $position) { foreach ($position->getUploads() as $upload) { if (file_exists($upload->getPath())) { - unlink($upload->getPath()); + unlink($upload->getPath()); } } } @@ -75,7 +124,7 @@ class UploadController extends AbstractController return array( 'order' => $order, - 'form' => $form->createView() + 'form' => $form->createView(), ); } } diff --git a/src/new/src/PSC/Shop/OrderBundle/EventListener/ConfigureMenuListener.php b/src/new/src/PSC/Shop/OrderBundle/EventListener/ConfigureMenuListener.php index 7f76ba872..db0e6ddcf 100755 --- a/src/new/src/PSC/Shop/OrderBundle/EventListener/ConfigureMenuListener.php +++ b/src/new/src/PSC/Shop/OrderBundle/EventListener/ConfigureMenuListener.php @@ -19,7 +19,7 @@ class ConfigureMenuListener */ public function onMenuConfigureMain(ConfigureMenuEvent $event) { - if ($this->authorizationChecker->isGranted('ROLE_ADMIN')) { + if ($this->authorizationChecker->isGranted('ROLE_ORDER_VIEW')) { $menu = $event->getMenu(); $menu->addChild('Aufträge', array( 'route' => 'psc_shop_order_backend_list_index', diff --git a/src/new/src/PSC/Shop/OrderBundle/Model/Order/Position/Upload/Center.php b/src/new/src/PSC/Shop/OrderBundle/Model/Order/Position/Upload/Center.php index 0942e511e..88e523145 100644 --- a/src/new/src/PSC/Shop/OrderBundle/Model/Order/Position/Upload/Center.php +++ b/src/new/src/PSC/Shop/OrderBundle/Model/Order/Position/Upload/Center.php @@ -2,6 +2,8 @@ namespace PSC\Shop\OrderBundle\Model\Order\Position\Upload; +use PSC\Shop\OrderBundle\Model\Order\Position\Upload; + class Center implements IUploadTypeObject { public array $uploads = []; @@ -18,10 +20,10 @@ class Center implements IUploadTypeObject public function canPreview(): bool { - return false; + return true; } - public function addUpload(array $upload): void + public function addUpload(Upload $upload): void { $this->uploads[] = $upload; } diff --git a/src/new/src/PSC/Shop/OrderBundle/Resources/views/backend/detail/show.html.twig b/src/new/src/PSC/Shop/OrderBundle/Resources/views/backend/detail/show.html.twig index aa033eaf3..6db8f08bc 100755 --- a/src/new/src/PSC/Shop/OrderBundle/Resources/views/backend/detail/show.html.twig +++ b/src/new/src/PSC/Shop/OrderBundle/Resources/views/backend/detail/show.html.twig @@ -441,7 +441,7 @@ {% for pos in positions %} {% set posModel = orderModel.getPositionByUuid(pos.obj.uuid) %} - + {{ pos.obj.pos }} {{ pos.obj.product.title }} @@ -480,7 +480,7 @@ {% endif %} - + {% if pos.objDoc.setConfig|length > 0 %} @@ -528,7 +528,7 @@ {{ form_start(pos.formProdinfo) }}
{{ form_widget(pos.formProdinfo.customerInfo) }}
{{ form_rest(pos.formProdinfo) }} - + {{ form_end(pos.formProdinfo) }}
{% if posModel.reOrder %} @@ -538,7 +538,7 @@
- +
{% if shop.docOfferPosition != "" %}{{'offer'|trans}}{% endif %} @@ -551,6 +551,29 @@
+ {% if pos.obj.uploads|length > 0 %} + + +
+ {% for upload in pos.obj.uploads %} +
+ + + {{ upload.name }} +
+ {% endfor %} +
+ + + {% endif %} diff --git a/src/new/src/PSC/Shop/OrderBundle/Transformer/Order/Position/Upload/Center.php b/src/new/src/PSC/Shop/OrderBundle/Transformer/Order/Position/Upload/Center.php index c532c2d97..0d9ce7b28 100644 --- a/src/new/src/PSC/Shop/OrderBundle/Transformer/Order/Position/Upload/Center.php +++ b/src/new/src/PSC/Shop/OrderBundle/Transformer/Order/Position/Upload/Center.php @@ -5,6 +5,7 @@ namespace PSC\Shop\OrderBundle\Transformer\Order\Position\Upload; use PSC\Shop\EntityBundle\Document\Position as PosDoc; use PSC\Shop\EntityBundle\Entity\Orderpos; use PSC\Shop\OrderBundle\Model\Order\Position; +use PSC\Shop\OrderBundle\Model\Order\Position\Upload; use PSC\Shop\OrderBundle\Model\Order\Position\Upload\Center as PSCCenter; use PSC\Shop\OrderBundle\Transformer\Order\Position\IUploadModeTransformer; @@ -14,10 +15,13 @@ class Center implements IUploadModeTransformer { $center = new PSCCenter(); foreach ($posEntity->getUploads() as $upload) { - var_dump($upload->getName()); - var_dump($upload->getPath()); + $up = new Upload(); + $up->setFileName($upload->getName()); + $up->setTyp($upload->getTyp()); + $up->setChunkTitle((string) $upload->getChunktitle()); + $up->setPath($upload->getPath()); + $center->addUpload($up); } - $center->addUpload(['fileName' => 'test', 'name' => 'test', 'type' => 'umschlag']); $position->setUploadTypeObject($center); } diff --git a/src/new/src/PSC/Shop/QueueBundle/Type/Mail.php b/src/new/src/PSC/Shop/QueueBundle/Type/Mail.php index 45975aa52..2bba90262 100755 --- a/src/new/src/PSC/Shop/QueueBundle/Type/Mail.php +++ b/src/new/src/PSC/Shop/QueueBundle/Type/Mail.php @@ -38,6 +38,7 @@ use PSC\System\SettingsBundle\Service\Log; use PSC\System\SettingsBundle\Service\Printing; use PSC\System\SettingsBundle\Service\TemplateVars; use Ramsey\Uuid\Uuid; +use Symfony\Bridge\Twig\Mime\WrappedTemplatedEmail; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\CollectionType; @@ -408,7 +409,9 @@ class Mail implements QueueInterface, ConfigurableElementInterface } if ($html) { - $message->html($html->render($params)); + $message->html($html->render(array_merge($params, [ + 'email' => new WrappedTemplatedEmail($this->_template, $message), + ]))); } $this->_logService->createLogEntry( $shop, @@ -444,9 +447,9 @@ class Mail implements QueueInterface, ConfigurableElementInterface return true; } if ( - $event instanceof UnLock || - $event instanceof \PSC\Shop\QueueBundle\Event\Contact\Create || - $event instanceof \PSC\Shop\QueueBundle\Event\Contact\Login + $event instanceof UnLock + || $event instanceof \PSC\Shop\QueueBundle\Event\Contact\Create + || $event instanceof \PSC\Shop\QueueBundle\Event\Contact\Login ) { $contactRepo = $this->_entityManager->getRepository('PSC\Shop\EntityBundle\Entity\Contact'); /** @@ -488,7 +491,9 @@ class Mail implements QueueInterface, ConfigurableElementInterface } if ($html) { - $message->html($html->render($params)); + $message->html($html->render(array_merge($params, [ + 'email' => new WrappedTemplatedEmail($this->_template, $message), + ]))); } $this->_logService->createLogEntry( $shop, @@ -561,7 +566,9 @@ class Mail implements QueueInterface, ConfigurableElementInterface } if ($html) { - $message->html($html->render($params)); + $message->html($html->render(array_merge($params, [ + 'email' => new WrappedTemplatedEmail($this->_template, $message), + ]))); } $this->_logService->createLogEntry( $shop, @@ -636,7 +643,9 @@ class Mail implements QueueInterface, ConfigurableElementInterface } if ($html) { - $message->html($html->render($params)); + $message->html($html->render(array_merge($params, [ + 'email' => new WrappedTemplatedEmail($this->_template, $message), + ]))); } $this->_logService->createLogEntry( @@ -708,7 +717,9 @@ class Mail implements QueueInterface, ConfigurableElementInterface } if ($html) { - $message->html($html->render($params)); + $message->html($html->render(array_merge($params, [ + 'email' => new WrappedTemplatedEmail($this->_template, $message), + ]))); } $content = $printing->generatePosition($position, Printing::JOBTICKET_PRINTPARTNER); @@ -750,7 +761,9 @@ class Mail implements QueueInterface, ConfigurableElementInterface } if ($html) { - $message->html($html->render($templateVars->getPosTwigVars($position->getUuid()))); + $message->html($html->render(array_merge($templateVars->getPosTwigVars($position->getUuid(), [ + 'email' => new WrappedTemplatedEmail($this->_template, $html), + ])))); } if ($mailDoc->isSendInvoice()) { @@ -893,10 +906,10 @@ class Mail implements QueueInterface, ConfigurableElementInterface return true; } if ( - $event instanceof Create || - $event instanceof Uploaded || - $event instanceof \PSC\Shop\QueueBundle\Event\Order\Status\Change || - $event instanceof \PSC\Shop\QueueBundle\Event\Offer\Create + $event instanceof Create + || $event instanceof Uploaded + || $event instanceof \PSC\Shop\QueueBundle\Event\Order\Status\Change + || $event instanceof \PSC\Shop\QueueBundle\Event\Offer\Create ) { $templateVars->loadOrder($event->getOrder()); try { @@ -918,7 +931,9 @@ class Mail implements QueueInterface, ConfigurableElementInterface } if ($html) { - $message->html($html->render($templateVars->getTwigVars())); + $message->html($html->render(array_merge($templateVars->getTwigVars(), [ + 'email' => new WrappedTemplatedEmail($this->_template, $html), + ]))); } if ($mailDoc->isSendInvoice()) { diff --git a/src/new/src/PSC/System/UpdateBundle/Migrations/Version20260303100000.php b/src/new/src/PSC/System/UpdateBundle/Migrations/Version20260303100000.php new file mode 100644 index 000000000..75485d1b0 --- /dev/null +++ b/src/new/src/PSC/System/UpdateBundle/Migrations/Version20260303100000.php @@ -0,0 +1,11 @@ +entityManager->getConnection()->executeQuery("INSERT IGNORE INTO role (name, level) VALUES ('ROLE_ORDER_VIEW', 22);"); + } +} diff --git a/src/new/tests/PSC/Shop/Order/Upload/CreateCenterTest.php b/src/new/tests/PSC/Shop/Order/Upload/CreateCenterTest.php index 134979569..852bceb18 100644 --- a/src/new/tests/PSC/Shop/Order/Upload/CreateCenterTest.php +++ b/src/new/tests/PSC/Shop/Order/Upload/CreateCenterTest.php @@ -105,7 +105,7 @@ class CreateCenterTest extends WebTestCase $client->request( 'POST', '/api/upload/create', - ['position' => $positionUuid, 'type' => 'umschlag'], + ['position' => $positionUuid, 'typ' => 'umschlag'], ['file' => new UploadedFile($tmpUmschlag, 'umschlag.pdf', 'application/pdf', null, true)], ['HTTP_apiKey' => $shop->getApiKey()], ); @@ -115,7 +115,7 @@ class CreateCenterTest extends WebTestCase $client->request( 'POST', '/api/upload/create', - ['position' => $positionUuid, 'type' => 'inhalt'], + ['position' => $positionUuid, 'typ' => 'inhalt'], ['file' => new UploadedFile($tmpInhalt, 'inhalt.pdf', 'application/pdf', null, true)], ['HTTP_apiKey' => $shop->getApiKey()], ); @@ -137,9 +137,7 @@ class CreateCenterTest extends WebTestCase self::assertSame(200, $client->getResponse()->getStatusCode()); $data = json_decode($client->getResponse()->getContent(), true); - self::assertCount(2, $data['positions'][0]['uploads']); - var_dump($data['positions'][0]['uploadTypeObject']['uploads']); self::assertSame('umschlag.pdf', $data['positions'][0]['uploadTypeObject']['uploads'][0]['fileName']); self::assertSame('umschlag', $data['positions'][0]['uploadTypeObject']['uploads'][0]['typ']); self::assertSame('inhalt.pdf', $data['positions'][0]['uploadTypeObject']['uploads'][1]['fileName']); diff --git a/src/new/var/tailwind/backend.built.css b/src/new/var/tailwind/backend.built.css index 3c8da1b7d..5f0a75a6b 100644 --- a/src/new/var/tailwind/backend.built.css +++ b/src/new/var/tailwind/backend.built.css @@ -2072,6 +2072,11 @@ html { fill: currentColor; } +.object-cover{ + -o-object-fit: cover; + object-fit: cover; +} + .p-0{ padding: 0px; } diff --git a/src/new/version.yaml b/src/new/version.yaml index 1f66a4dcb..152f554a6 100755 --- a/src/new/version.yaml +++ b/src/new/version.yaml @@ -6,6 +6,9 @@ changelog: - version: 2.3.3 datum: 25.02.2026 changes: + - "Auftragsdetails in Tailwind" + - "Bereich Aufträge hat jetzt eigene Benutzergruppe" + - "In EMails können Bilder eingebettet werden: {{ email.image('@images/logo.png') }}" - "Fix Graphgeneration in Calc" - version: 2.3.2 datum: 17.02.2026 diff --git a/src/new/web/Anleitung_V1.3.pdf.jpg b/src/new/web/Anleitung_V1.3.pdf.jpg new file mode 100644 index 000000000..20529fa61 Binary files /dev/null and b/src/new/web/Anleitung_V1.3.pdf.jpg differ diff --git a/src/old/market/steplayouter/basket/283/1/AF-03.03.2026-78_1.pdf b/src/old/market/steplayouter/basket/283/1/AF-03.03.2026-78_1.pdf new file mode 100644 index 000000000..c978d7bac Binary files /dev/null and b/src/old/market/steplayouter/basket/283/1/AF-03.03.2026-78_1.pdf differ diff --git a/src/old/public/uploads/b3ddbe0b-947f-423f-96a5-e0564c90b742/article/AF-03.03.2026-78_369_HF Spindel Anleitung_V1.3.pdf b/src/old/public/uploads/b3ddbe0b-947f-423f-96a5-e0564c90b742/article/AF-03.03.2026-78_369_HF Spindel Anleitung_V1.3.pdf new file mode 100644 index 000000000..b88cdf781 Binary files /dev/null and b/src/old/public/uploads/b3ddbe0b-947f-423f-96a5-e0564c90b742/article/AF-03.03.2026-78_369_HF Spindel Anleitung_V1.3.pdf differ diff --git a/src/old/public/uploads/b3ddbe0b-947f-423f-96a5-e0564c90b742/article/AF-03.03.2026-78_369_HF Spindel Anleitung_V1.3.pdf.jpg b/src/old/public/uploads/b3ddbe0b-947f-423f-96a5-e0564c90b742/article/AF-03.03.2026-78_369_HF Spindel Anleitung_V1.3.pdf.jpg new file mode 100644 index 000000000..20529fa61 Binary files /dev/null and b/src/old/public/uploads/b3ddbe0b-947f-423f-96a5-e0564c90b742/article/AF-03.03.2026-78_369_HF Spindel Anleitung_V1.3.pdf.jpg differ diff --git a/src/old/public/uploads/b3ddbe0b-947f-423f-96a5-e0564c90b742/article/AF-03.03.2026-78_369_IMG_0210.jpg b/src/old/public/uploads/b3ddbe0b-947f-423f-96a5-e0564c90b742/article/AF-03.03.2026-78_369_IMG_0210.jpg new file mode 100644 index 000000000..32940bebb Binary files /dev/null and b/src/old/public/uploads/b3ddbe0b-947f-423f-96a5-e0564c90b742/article/AF-03.03.2026-78_369_IMG_0210.jpg differ