From eb63dae4054a6cd47842932d1f217207702b1ba0 Mon Sep 17 00:00:00 2001 From: Kevin Papst Date: Wed, 3 Nov 2021 12:00:52 +0100 Subject: [PATCH] added invoice replacer for currently logged-in user (#2899) --- .../ConfigurableNumberGenerator.php | 33 ++++++++++++++--- src/Repository/InvoiceRepository.php | 36 +++++++++++++------ .../ConfigurableNumberGeneratorTest.php | 21 ++++++++++- 3 files changed, 75 insertions(+), 15 deletions(-) diff --git a/src/Invoice/NumberGenerator/ConfigurableNumberGenerator.php b/src/Invoice/NumberGenerator/ConfigurableNumberGenerator.php index f579e0af..6ff2f07e 100644 --- a/src/Invoice/NumberGenerator/ConfigurableNumberGenerator.php +++ b/src/Invoice/NumberGenerator/ConfigurableNumberGenerator.php @@ -151,7 +151,7 @@ final class ConfigurableNumberGenerator implements NumberGeneratorInterface // for customer case 'cc': - $partialResult = $this->repository->getCounterForAllTime($this->model->getCustomer()) + $increaseBy; + $partialResult = $this->repository->getCounterForCustomerAllTime($this->model->getCustomer()) + $increaseBy; break; case 'ccy': @@ -166,9 +166,34 @@ final class ConfigurableNumberGenerator implements NumberGeneratorInterface $partialResult = $this->repository->getCounterForDay($invoiceDate, $this->model->getCustomer()) + $increaseBy; break; + // for user + case 'cu': + $partialResult = $this->repository->getCounterForUserAllTime($this->model->getUser()) + $increaseBy; + break; + + case 'cuy': + $partialResult = $this->repository->getCounterForYear($invoiceDate, null, $this->model->getUser()) + $increaseBy; + break; + + case 'cum': + $partialResult = $this->repository->getCounterForMonth($invoiceDate, null, $this->model->getUser()) + $increaseBy; + break; + + case 'cud': + $partialResult = $this->repository->getCounterForDay($invoiceDate, null, $this->model->getUser()) + $increaseBy; + break; + + case 'ustaff': + $partialResult = $this->model->getUser() !== null ? $this->model->getUser()->getAccountNumber() : ''; + break; + + case 'uid': + $partialResult = $this->model->getUser() !== null ? (string) $this->model->getUser()->getId() : ''; + break; + // across all invoices case 'c': - $partialResult = $this->repository->getCounterForAllTime() + $increaseBy; + $partialResult = $this->repository->getCounterForCustomerAllTime() + $increaseBy; break; case 'cy': @@ -184,11 +209,11 @@ final class ConfigurableNumberGenerator implements NumberGeneratorInterface break; case 'cname': - $partialResult = $this->model->getCustomer()->getName(); + $partialResult = $this->model->getCustomer() !== null ? $this->model->getCustomer()->getName() : ''; break; case 'cnumber': - $partialResult = $this->model->getCustomer()->getNumber(); + $partialResult = $this->model->getCustomer() !== null ? $this->model->getCustomer()->getNumber() : ''; break; default: diff --git a/src/Repository/InvoiceRepository.php b/src/Repository/InvoiceRepository.php index cd2fd035..aefff55b 100644 --- a/src/Repository/InvoiceRepository.php +++ b/src/Repository/InvoiceRepository.php @@ -54,7 +54,7 @@ class InvoiceRepository extends EntityRepository return $counter > 0; } - private function getCounterFor(\DateTime $start, \DateTime $end, ?Customer $customer = null): int + private function getCounterFor(\DateTime $start, \DateTime $end, ?Customer $customer = null, ?User $user = null): int { $qb = $this->getEntityManager()->createQueryBuilder(); $qb->select('count(i.createdAt) as counter') @@ -68,7 +68,14 @@ class InvoiceRepository extends EntityRepository if (null !== $customer) { $qb ->andWhere($qb->expr()->eq('i.customer', ':customer')) - ->setParameter('customer', $customer) + ->setParameter('customer', $customer->getId()) + ; + } + + if (null !== $user) { + $qb + ->andWhere($qb->expr()->eq('i.user', ':user')) + ->setParameter('user', $user->getId()) ; } @@ -81,34 +88,43 @@ class InvoiceRepository extends EntityRepository return $result['counter']; } - public function getCounterForDay(\DateTime $date, ?Customer $customer = null): int + public function getCounterForDay(\DateTime $date, ?Customer $customer = null, ?User $user = null): int { $start = (clone $date)->setTime(0, 0, 0); $end = (clone $date)->setTime(23, 59, 59); - return $this->getCounterFor($start, $end, $customer); + return $this->getCounterFor($start, $end, $customer, $user); } - public function getCounterForMonth(\DateTime $date, ?Customer $customer = null): int + public function getCounterForMonth(\DateTime $date, ?Customer $customer = null, ?User $user = null): int { $start = (clone $date)->setDate((int) $date->format('Y'), (int) $date->format('n'), 1)->setTime(0, 0, 0); $end = (clone $date)->setDate((int) $date->format('Y'), (int) $date->format('n'), (int) $date->format('t'))->setTime(23, 59, 59); - return $this->getCounterFor($start, $end, $customer); + return $this->getCounterFor($start, $end, $customer, $user); } - public function getCounterForYear(\DateTime $date, ?Customer $customer = null): int + public function getCounterForYear(\DateTime $date, ?Customer $customer = null, ?User $user = null): int { $start = (clone $date)->setDate((int) $date->format('Y'), 1, 1)->setTime(0, 0, 0); $end = (clone $date)->setDate((int) $date->format('Y'), 12, 31)->setTime(23, 59, 59); - return $this->getCounterFor($start, $end, $customer); + return $this->getCounterFor($start, $end, $customer, $user); } - public function getCounterForAllTime(?Customer $customer = null): int + public function getCounterForCustomerAllTime(?Customer $customer = null): int { if (null !== $customer) { - return $this->count(['customer' => $customer]); + return $this->count(['customer' => $customer->getId()]); + } + + return $this->count([]); + } + + public function getCounterForUserAllTime(?User $user = null): int + { + if (null !== $user) { + return $this->count(['user' => $user->getId()]); } return $this->count([]); diff --git a/tests/Invoice/NumberGenerator/ConfigurableNumberGeneratorTest.php b/tests/Invoice/NumberGenerator/ConfigurableNumberGeneratorTest.php index eb6c21e5..fe91b7af 100644 --- a/tests/Invoice/NumberGenerator/ConfigurableNumberGeneratorTest.php +++ b/tests/Invoice/NumberGenerator/ConfigurableNumberGeneratorTest.php @@ -11,6 +11,7 @@ namespace App\Tests\Invoice\NumberGenerator; use App\Configuration\SystemConfiguration; use App\Entity\Customer; +use App\Entity\User; use App\Invoice\InvoiceModel; use App\Invoice\NumberGenerator\ConfigurableNumberGenerator; use App\Repository\InvoiceRepository; @@ -32,7 +33,11 @@ class ConfigurableNumberGeneratorTest extends TestCase $repository = $this->createMock(InvoiceRepository::class); $repository ->expects($this->any()) - ->method('getCounterForAllTime') + ->method('getCounterForCustomerAllTime') + ->willReturn($counter); + $repository + ->expects($this->any()) + ->method('getCounterForUserAllTime') ->willReturn($counter); $repository ->expects($this->any()) @@ -68,12 +73,20 @@ class ConfigurableNumberGeneratorTest extends TestCase ['{cy}', '2', $invoiceDate], ['{cm}', '2', $invoiceDate], ['{cd}', '2', $invoiceDate], + // customer ['{cc}', '2', $invoiceDate], ['{ccy}', '2', $invoiceDate], ['{ccm}', '2', $invoiceDate], ['{ccd}', '2', $invoiceDate], ['{cname}', 'Acme company', $invoiceDate], ['{cnumber}', '0815', $invoiceDate], + // user + ['{cu}', '2', $invoiceDate], + ['{cuy}', '2', $invoiceDate], + ['{cum}', '2', $invoiceDate], + ['{cud}', '2', $invoiceDate], + ['{ustaff}', '0815', $invoiceDate], + ['{uid}', '13', $invoiceDate], // number formatting (not testing the lower case versions, as the tests might break depending on the date) ['{date,10}', '0000' . $invoiceDate->format('ymd'), $invoiceDate], ['{Y,6}', '00' . $invoiceDate->format('Y'), $invoiceDate], @@ -108,6 +121,7 @@ class ConfigurableNumberGeneratorTest extends TestCase ['{Y}{cy}{m}', $invoiceDate->format('Y') . '2' . $invoiceDate->format('n'), $invoiceDate], ['{Y}-{cy}/{m}', $invoiceDate->format('Y') . '-2/' . $invoiceDate->format('n'), $invoiceDate], ['{Y}-{cy}/{m}', $invoiceDate->format('Y') . '-2/' . $invoiceDate->format('n'), $invoiceDate], + ['{ustaff}|{cuy}_{Y}-{cy}/{m}', '0815|2_' . $invoiceDate->format('Y') . '-2/' . $invoiceDate->format('n'), $invoiceDate], ['{Y,5}/{cy,5}', '0' . $invoiceDate->format('Y') . '/00002', $invoiceDate], // with decrementing counter ['{c-1,2}', '00', $invoiceDate], @@ -137,10 +151,15 @@ class ConfigurableNumberGeneratorTest extends TestCase $customer->setName('Acme company'); $customer->setNumber('0815'); + $user = $this->createMock(User::class); + $user->method('getId')->willReturn(13); + $user->method('getAccountNumber')->willReturn('0815'); + $sut = $this->getSut($format, $counter); $model = new InvoiceModel(new DebugFormatter()); $model->setInvoiceDate($invoiceDate); $model->setCustomer($customer); + $model->setUser($user); $sut->setModel($model); $this->assertEquals($expectedInvoiceNumber, $sut->getInvoiceNumber());