From a18f74b3dfc39bf7dae03eff032ba3cda9100c22 Mon Sep 17 00:00:00 2001 From: Thomas Peterson Date: Mon, 2 Mar 2026 14:42:39 +0100 Subject: [PATCH] Fixes --- src/new/config/reference.php | 4 +- .../OrderBundle/Api/Order/GetOneByUuid.php | 49 ++---- .../Shop/OrderBundle/Api/Upload/Create.php | 94 +++++++++++ .../OrderBundle/Dto/Upload/Create/Output.php | 14 ++ .../Position/Upload/IUploadTypeObject.php | 7 + .../OrderBundle/Service/UploadMode/Center.php | 2 +- .../Shop/Order/Upload/CreateCenterTest.php | 152 ++++++++++++++++++ .../PSC/Shop/Order/Upload/CreateMailTest.php | 5 +- .../PSC/CollectLayouter/Dto/Preview/Input.php | 2 +- .../PSC/CollectLayouter/Dto/Save/Input.php | 2 +- .../CollectLayouter/Dto/SaveContact/Input.php | 2 +- 11 files changed, 292 insertions(+), 41 deletions(-) create mode 100644 src/new/src/PSC/Shop/OrderBundle/Api/Upload/Create.php create mode 100644 src/new/src/PSC/Shop/OrderBundle/Dto/Upload/Create/Output.php create mode 100644 src/new/tests/PSC/Shop/Order/Upload/CreateCenterTest.php diff --git a/src/new/config/reference.php b/src/new/config/reference.php index a52f4b18b..848c5bec1 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: "Europe/Berlin" + * default_timezone?: scalar|Param|null, // Default: "UTC" * 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: "Europe/Berlin" + * default_timezone?: scalar|Param|null, // Default: "UTC" * cdata?: scalar|Param|null, // Default: true * }, * array_collection?: array{ diff --git a/src/new/src/PSC/Shop/OrderBundle/Api/Order/GetOneByUuid.php b/src/new/src/PSC/Shop/OrderBundle/Api/Order/GetOneByUuid.php index c1b586f5c..0d7a4ddc1 100755 --- a/src/new/src/PSC/Shop/OrderBundle/Api/Order/GetOneByUuid.php +++ b/src/new/src/PSC/Shop/OrderBundle/Api/Order/GetOneByUuid.php @@ -3,25 +3,21 @@ namespace PSC\Shop\OrderBundle\Api\Order; use Doctrine\ORM\EntityManagerInterface; -use Nelmio\ApiDocBundle\Annotation\Model; -use Nelmio\ApiDocBundle\Annotation\Security; -use OpenApi\Attributes as OA; -use OpenApi\Attributes\Response; -use OpenApi\Attributes\Tag; +use Nelmio\ApiDocBundle\Attribute\Model; +use Nelmio\ApiDocBundle\Attribute\Security; use OpenApi\Attributes\JsonContent; use OpenApi\Attributes\RequestBody; +use OpenApi\Attributes\Response; +use OpenApi\Attributes\Tag; use PSC\Component\ApiBundle\Dto\Error\NotFound; use PSC\Shop\OrderBundle\Dto\Order\GetOneByUuid\Input; -use PSC\Shop\OrderBundle\Model\Order\Position\DummyProductTypeObject; +use PSC\Shop\OrderBundle\Model\Order as PSCOrder; use PSC\Shop\OrderBundle\Service\Order; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; -use Symfony\Component\HttpFoundation\Response as HttpResponse; -use Symfony\Component\HttpKernel\KernelInterface; -use Symfony\Component\Routing\Attribute\Route; -use Symfony\Component\Yaml\Yaml; -use Symfony\Component\Security\Http\Attribute\IsGranted; use Symfony\Component\HttpKernel\Attribute\MapRequestPayload; +use Symfony\Component\Routing\Attribute\Route; +use Symfony\Component\Security\Http\Attribute\IsGranted; class GetOneByUuid extends AbstractController { @@ -34,35 +30,22 @@ class GetOneByUuid extends AbstractController $this->orderService = $orderService; } - /** - * get order by uuid - * - #[Response( - * response: 200, - * description: 'orders', - * content: new JsonContent(ref: new Model(type: PSC\Shop\OrderBundle\Model\Order::class)) - * )] - #[RequestBody( - * description: 'This is a request body', - * content: new Model(type: PSC\Shop\OrderBundle\Dto\Order\GetOneByUuid\Input::class) - * )] - #[Tag(name: 'Order')] - * @IsGranted("ROLE_SHOP") - * @Security(name="ApiKeyAuth") - * @Security(name="Bearer") - */ + #[Response(response: 200, description: 'orders', content: new JsonContent(ref: new Model(type: PSCOrder::class)))] + #[RequestBody(description: 'This is a request body', content: new Model(type: Input::class))] + #[Tag('Order')] + #[Security(name: 'ApiKeyAuth')] + #[Security(name: 'Bearer')] #[Route(path: '/order/getonebyuuid', methods: ['POST'])] - public function getonebyuuid(#[MapRequestPayload] Input $data): JsonResponse + #[IsGranted('ROLE_SHOP')] + public function getonebyuuid(#[MapRequestPayload] Input $data): JsonResponse { - $row = $this->entityManager - ->getRepository('PSC\Shop\EntityBundle\Entity\Order') - ->findOneByUuid($data->uuid); + $row = $this->entityManager->getRepository('PSC\Shop\EntityBundle\Entity\Order')->findOneByUuid($data->uuid); if ($row) { $order = $this->orderService->getOrderByUid($row->getUid()); return $this->json($order); } - return $this->json(new NotFound("order not found")); + return $this->json(new NotFound('order not found')); } } diff --git a/src/new/src/PSC/Shop/OrderBundle/Api/Upload/Create.php b/src/new/src/PSC/Shop/OrderBundle/Api/Upload/Create.php new file mode 100644 index 000000000..5bb663a1e --- /dev/null +++ b/src/new/src/PSC/Shop/OrderBundle/Api/Upload/Create.php @@ -0,0 +1,94 @@ +files->get('file'); + $positionUuid = $req->request->get('position', ''); + $typ = $req->request->get('typ', ''); + + if (!$file) { + return $this->json(['error' => 'file not provided'], JsonResponse::HTTP_BAD_REQUEST); + } + + /** @var Orderpos $orderpos */ + $orderpos = $this->entityManager->getRepository(Orderpos::class)->findOneBy(['uuid' => $positionUuid]); + + if (!$orderpos) { + return $this->json(new NotFound('Position not found'), JsonResponse::HTTP_NOT_FOUND); + } + + $shopUuid = $orderpos->getOrder()->getShop()->getUuid(); + $uploadDir = $this->getParameter('kernel.project_dir') . '/web/uploads/' . $shopUuid . '/article/'; + + if (!is_dir($uploadDir)) { + mkdir($uploadDir, 0755, true); + } + $originalName = $file->getClientOriginalName(); + $file->move($uploadDir, $originalName); + + $upload = new Upload(); + $upload->setUuid(Uuid::uuid4()->toString()); + $upload->setOrderPos($orderpos); + $upload->setName($originalName); + $upload->setPath($originalName); + $upload->setTyp($typ); + $upload->setExport(false); + $upload->setCreated(new \DateTime()); + $upload->setUpdated(new \DateTime()); + + $this->entityManager->persist($upload); + $this->entityManager->flush(); + + $output = new Output(); + $output->uuid = $upload->getUuid(); + $output->name = $originalName; + + return $this->json($output); + } +} diff --git a/src/new/src/PSC/Shop/OrderBundle/Dto/Upload/Create/Output.php b/src/new/src/PSC/Shop/OrderBundle/Dto/Upload/Create/Output.php new file mode 100644 index 000000000..8aec2a641 --- /dev/null +++ b/src/new/src/PSC/Shop/OrderBundle/Dto/Upload/Create/Output.php @@ -0,0 +1,14 @@ +get(ShopRepository::class); + + /** @var Shop $shop */ + $shop = $shopRepository->findOneBy(['title' => 'Printchampion']); + + $shippingRepository = static::getContainer()->get(ShippingRepository::class); + + $paymentRepository = static::getContainer()->get(PaymentRepository::class); + + $client->jsonRequest( + 'POST', + '/api/order/create', + [ + 'shop' => [ + 'uuid' => (string) $shop->getUuid(), + ], + 'type' => 2, + 'shipping' => [ + 'uid' => $shippingRepository->findOneBy(['title' => 'Deutschlandweit'])->getUid(), + ], + 'payment' => [ + 'uid' => $paymentRepository->findOneBy(['title' => 'per Rechnung'])->getUid(), + ], + 'draft' => false, + 'deliveryAddress' => [ + 'firstname' => 'Thomas', + 'lastname' => 'Peterson', + 'street' => 'Chausseestr.', + 'houseNumber' => '24', + 'zip' => '17506', + 'city' => 'Gribow', + ], + 'invoiceAddress' => [ + 'firstname' => 'Thomas', + 'lastname' => 'Peterson', + 'street' => 'Chausseestr.', + 'houseNumber' => '24', + 'zip' => '17400', + 'city' => 'Berlin', + ], + 'positions' => [ + [ + 'count' => 1, + 'product' => [ + 'title' => 'test XML', + 'specialProductTypeObject' => [ + 'typ' => 6, + 'taxClass' => 1900, + 'xml' => ' + + + Blocks A5 25blatt geleimt + kein + + + + + ', + ], + ], + 'uploadMode' => 'center', + ], + ], + ], + ['HTTP_apiKey' => $shop->getApiKey()], + ); + + self::assertSame(200, $client->getResponse()->getStatusCode()); + + $data = json_decode($client->getResponse()->getContent(), true); + $positionUuid = $data['positions'][0]['uuid']; + + // Dateien hochladen + $tmpUmschlag = tempnam(sys_get_temp_dir(), 'umschlag_'); + file_put_contents($tmpUmschlag, '%PDF-1.4 test umschlag'); + + $tmpInhalt = tempnam(sys_get_temp_dir(), 'inhalt_'); + file_put_contents($tmpInhalt, '%PDF-1.4 test inhalt'); + + $client->request( + 'POST', + '/api/upload/create', + ['position' => $positionUuid, 'type' => 'umschlag'], + ['file' => new UploadedFile($tmpUmschlag, 'umschlag.pdf', 'application/pdf', null, true)], + ['HTTP_apiKey' => $shop->getApiKey()], + ); + + self::assertSame(200, $client->getResponse()->getStatusCode()); + + $client->request( + 'POST', + '/api/upload/create', + ['position' => $positionUuid, 'type' => 'inhalt'], + ['file' => new UploadedFile($tmpInhalt, 'inhalt.pdf', 'application/pdf', null, true)], + ['HTTP_apiKey' => $shop->getApiKey()], + ); + + self::assertSame(200, $client->getResponse()->getStatusCode()); + + unlink($tmpUmschlag); + unlink($tmpInhalt); + + $client->jsonRequest( + 'POST', + '/api/order/getonebyuuid', + [ + 'uuid' => $data['uuid'], + ], + ['HTTP_apiKey' => $shop->getApiKey()], + ); + + self::assertSame(200, $client->getResponse()->getStatusCode()); + + $data = json_decode($client->getResponse()->getContent(), true); + + self::assertCount(2, $data['positions'][0]['uploads']); + self::assertSame('umschlag.pdf', $data['positions'][0]['uploadTypeObject']['files'][0]['fileName']); + self::assertSame('umschlag', $data['positions'][0]['uploadTypeObject']['files'][0]['typ']); + self::assertSame('inhalt.pdf', $data['positions'][0]['uploadTypeObject']['files'][1]['fileName']); + self::assertSame('inhalt', $data['positions'][0]['uploadTypeObject']['files'][1]['typ']); + + /** @var JobRepository $jobs */ + $jobs = static::getContainer()->get(JobRepository::class); + + self::assertCount(0, $jobs->findBy(['data.order' => $data['uuid']])); + } +} diff --git a/src/new/tests/PSC/Shop/Order/Upload/CreateMailTest.php b/src/new/tests/PSC/Shop/Order/Upload/CreateMailTest.php index 3e32cbc52..4088f1291 100644 --- a/src/new/tests/PSC/Shop/Order/Upload/CreateMailTest.php +++ b/src/new/tests/PSC/Shop/Order/Upload/CreateMailTest.php @@ -118,10 +118,11 @@ class CreateMailTest extends WebTestCase ); $data = json_decode($client->getResponse()->getContent(), true); - var_dump($data['positions'][0]['uploadTypeObject']); + self::assertFalse($data['positions'][0]['uploadTypeObject']['preview']); + self::assertSame('mail', $data['positions'][0]['uploadTypeObject']['code']); self::assertSame(7647, $data['gross']); self::assertSame('SAN-' . date('Ym') . '-1', $data['alias']); - + self::assertNull($data['positions'][1]['uploadTypeObject']); self::assertSame('Berlin', $data['invoiceAddress']['city']); self::assertSame('Gribow', $data['deliveryAddress']['city']); diff --git a/src/new/var/plugins/Custom/PSC/CollectLayouter/Dto/Preview/Input.php b/src/new/var/plugins/Custom/PSC/CollectLayouter/Dto/Preview/Input.php index e4c8fe3bb..5fe7a61b4 100755 --- a/src/new/var/plugins/Custom/PSC/CollectLayouter/Dto/Preview/Input.php +++ b/src/new/var/plugins/Custom/PSC/CollectLayouter/Dto/Preview/Input.php @@ -9,7 +9,7 @@ use PSC\Shop\ContactBundle\Model\Contact; class Input { - #[Property(type: 'array')] + #[Property(type: 'array', items: new \OpenApi\Attributes\Items(type: 'string'))] private array $data = []; public function getData(): array diff --git a/src/new/var/plugins/Custom/PSC/CollectLayouter/Dto/Save/Input.php b/src/new/var/plugins/Custom/PSC/CollectLayouter/Dto/Save/Input.php index a60cfe285..1eacc29c1 100755 --- a/src/new/var/plugins/Custom/PSC/CollectLayouter/Dto/Save/Input.php +++ b/src/new/var/plugins/Custom/PSC/CollectLayouter/Dto/Save/Input.php @@ -8,7 +8,7 @@ use PSC\Shop\ContactBundle\Model\Contact; class Input { - #[Property(type: 'array')] + #[Property(type: 'array', items: new \OpenApi\Attributes\Items(type: 'string'))] private array $data = []; private string $productUuid = ""; private string $contactUuid = ""; diff --git a/src/new/var/plugins/Custom/PSC/CollectLayouter/Dto/SaveContact/Input.php b/src/new/var/plugins/Custom/PSC/CollectLayouter/Dto/SaveContact/Input.php index 9e219ee76..5b231ce49 100755 --- a/src/new/var/plugins/Custom/PSC/CollectLayouter/Dto/SaveContact/Input.php +++ b/src/new/var/plugins/Custom/PSC/CollectLayouter/Dto/SaveContact/Input.php @@ -7,7 +7,7 @@ use Plugin\Custom\PSC\CollectLayouter\Model\ElementType; class Input { - #[Property(type: 'array')] + #[Property(type: 'array', items: new \OpenApi\Attributes\Items(type: 'string'))] private array $data = []; private string $contactUuid = "";