From 7a9c8cd1847ec4341e904388f1f640bafd2a775e Mon Sep 17 00:00:00 2001 From: Anton Fedurtsya Date: Sun, 22 Sep 2024 15:58:16 +0300 Subject: [PATCH] Move invoice number generation to invoice generator decorator in order space Signed-off-by: Anton Fedurtsya --- services.yaml | 1 + src/Document/MpdfDocument/Builder.php | 4 +- .../Decoration/InvoiceGeneratorDecorator.php | 29 +++++++++ src/Order/Decoration/services.yaml | 9 +++ src/Order/services.yaml | 7 +++ .../Document/MpdfDocument/BuilderTest.php | 19 ------ .../InvoiceGeneratorDecoratorTest.php | 26 ++++++++ .../InvoiceGeneratorDecoratorTest.php | 62 +++++++++++++++++++ 8 files changed, 135 insertions(+), 22 deletions(-) create mode 100644 src/Order/Decoration/InvoiceGeneratorDecorator.php create mode 100644 src/Order/Decoration/services.yaml create mode 100644 src/Order/services.yaml create mode 100644 tests/Integration/Order/Decoration/InvoiceGeneratorDecoratorTest.php create mode 100644 tests/Unit/Order/Decoration/InvoiceGeneratorDecoratorTest.php diff --git a/services.yaml b/services.yaml index aa2d362..e40ea27 100644 --- a/services.yaml +++ b/services.yaml @@ -4,6 +4,7 @@ imports: - { resource: src/Service/services.yaml } - { resource: src/Settings/services.yaml } - { resource: src/Language/Service/services.yaml } + - { resource: src/Order/services.yaml } - { resource: src/Transput/services.yaml } services: diff --git a/src/Document/MpdfDocument/Builder.php b/src/Document/MpdfDocument/Builder.php index f1c0c24..d2fda23 100644 --- a/src/Document/MpdfDocument/Builder.php +++ b/src/Document/MpdfDocument/Builder.php @@ -29,8 +29,7 @@ public function __construct( protected TemplateRendererInterface $templateRenderer, protected LanguageInterface $shopLanguage, protected DocumentLayoutSettingsServiceInterface $layoutSettingsService, - protected NumberWordingServiceInterface $numberWordingService, - protected OrderServiceInterface $orderService, + protected NumberWordingServiceInterface $numberWordingService ) { } @@ -44,7 +43,6 @@ public function generate(InvoiceDataInterface $invoiceData): void mkdir(Path::getDirectory($invoiceFilePath), 0777, true); } - $this->orderService->prepareOrderInvoiceNumber($invoiceData); $this->pdfProcessor->OutputFile($invoiceFilePath); } diff --git a/src/Order/Decoration/InvoiceGeneratorDecorator.php b/src/Order/Decoration/InvoiceGeneratorDecorator.php new file mode 100644 index 0000000..6a68b96 --- /dev/null +++ b/src/Order/Decoration/InvoiceGeneratorDecorator.php @@ -0,0 +1,29 @@ +orderService->prepareOrderInvoiceNumber($invoiceData); + $this->originalGenerator->generate($invoiceData); + } +} diff --git a/src/Order/Decoration/services.yaml b/src/Order/Decoration/services.yaml new file mode 100644 index 0000000..0327533 --- /dev/null +++ b/src/Order/Decoration/services.yaml @@ -0,0 +1,9 @@ +services: + _defaults: + public: false + autowire: true + + FreshAdvance\Invoice\Order\Decoration\InvoiceGeneratorDecorator: + decorates: FreshAdvance\Invoice\Document\InvoiceGeneratorInterface + arguments: + $originalGenerator: '@.inner' diff --git a/src/Order/services.yaml b/src/Order/services.yaml new file mode 100644 index 0000000..d0772c2 --- /dev/null +++ b/src/Order/services.yaml @@ -0,0 +1,7 @@ +imports: + - { resource: Decoration/services.yaml } + +services: + _defaults: + public: false + autowire: true diff --git a/tests/Integration/Document/MpdfDocument/BuilderTest.php b/tests/Integration/Document/MpdfDocument/BuilderTest.php index 54f5f29..5fe0055 100644 --- a/tests/Integration/Document/MpdfDocument/BuilderTest.php +++ b/tests/Integration/Document/MpdfDocument/BuilderTest.php @@ -74,30 +74,12 @@ public function testGetBinaryPdfFromData(): void $this->assertDirectoryExists($tempDirectory->url() . '/somePath/'); } - public function testGenerateTriggersOrderNumberingUpdate(): void - { - $invoiceData = $this->createConfiguredMock(InvoiceDataInterface::class, [ - 'getOrder' => $this->createStub(Order::class) - ]); - - $sut = $this->getSut( - orderService: $orderServiceSpy = $this->createMock(OrderServiceInterface::class), - ); - - $orderServiceSpy->expects($this->once()) - ->method('prepareOrderInvoiceNumber') - ->with($invoiceData); - - $sut->generate($invoiceData); - } - public function getSut( Mpdf $pdfProcessor = null, TemplateRendererInterface $templateRenderer = null, LanguageProxy $shopLanguage = null, DocumentLayoutSettingsServiceInterface $layoutSettingsService = null, NumberWordingServiceInterface $numberWordingService = null, - OrderServiceInterface $orderService = null, ): Builder { $layoutSettingsService ??= $this->createStub(DocumentLayoutSettingsServiceInterface::class); @@ -107,7 +89,6 @@ public function getSut( shopLanguage: $shopLanguage ?? $this->createStub(LanguageProxy::class), layoutSettingsService: $layoutSettingsService, numberWordingService: $numberWordingService ?? $this->createStub(NumberWordingServiceInterface::class), - orderService: $orderService ?? $this->createStub(OrderServiceInterface::class), ); } } diff --git a/tests/Integration/Order/Decoration/InvoiceGeneratorDecoratorTest.php b/tests/Integration/Order/Decoration/InvoiceGeneratorDecoratorTest.php new file mode 100644 index 0000000..0998ef1 --- /dev/null +++ b/tests/Integration/Order/Decoration/InvoiceGeneratorDecoratorTest.php @@ -0,0 +1,26 @@ +getContainer()->get(InvoiceGeneratorInterface::class); + + $this->assertInstanceOf(InvoiceGeneratorDecorator::class, $sut); + } +} diff --git a/tests/Unit/Order/Decoration/InvoiceGeneratorDecoratorTest.php b/tests/Unit/Order/Decoration/InvoiceGeneratorDecoratorTest.php new file mode 100644 index 0000000..8e8ec95 --- /dev/null +++ b/tests/Unit/Order/Decoration/InvoiceGeneratorDecoratorTest.php @@ -0,0 +1,62 @@ +createStub(InvoiceDataInterface::class); + + $generatorSpy = $this->createMock(InvoiceGeneratorInterface::class); + $generatorSpy->expects($this->once()) + ->method('generate') + ->with($invoiceDataStub); + + $sut = $this->getSut($generatorSpy); + + $sut->generate($invoiceDataStub); + } + + public function testGenerateTriggersOrderNumberingUpdate(): void + { + $invoiceData = $this->createConfiguredMock(InvoiceDataInterface::class, [ + 'getOrder' => $this->createStub(Order::class) + ]); + + $sut = $this->getSut( + orderService: $orderServiceSpy = $this->createMock(OrderServiceInterface::class), + ); + + $orderServiceSpy->expects($this->once()) + ->method('prepareOrderInvoiceNumber') + ->with($invoiceData); + + $sut->generate($invoiceData); + } + + public function getSut( + InvoiceGeneratorInterface $originalGenerator = null, + OrderServiceInterface $orderService = null, + ): InvoiceGeneratorInterface { + return new InvoiceGeneratorDecorator( + originalGenerator: $originalGenerator ?? $this->createStub(InvoiceGeneratorInterface::class), + orderService: $orderService ?? $this->createStub(OrderServiceInterface::class), + ); + } +}