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.typ }}
+
+ {{ 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