From 95e5a278318345960977e6499d9a108202ff5522 Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Tue, 7 Nov 2023 17:45:23 +0100 Subject: [PATCH] Calculate the charged spent time based on billing interval --- src/Controller/Tickets/MessagesController.php | 8 ++++- .../Tickets/MessagesControllerTest.php | 34 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/Controller/Tickets/MessagesController.php b/src/Controller/Tickets/MessagesController.php index 7d25d51f..4b371590 100644 --- a/src/Controller/Tickets/MessagesController.php +++ b/src/Controller/Tickets/MessagesController.php @@ -183,9 +183,11 @@ public function create( if ($minutesSpent > 0 && $security->isGranted('orga:create:tickets:time_spent', $organization)) { $contract = $ticket->getOngoingContract(); + $minutesCharged = $minutesSpent; if ($contract) { $contractAvailableMinutes = $contract->getRemainingMinutes(); + $billingInterval = $contract->getBillingInterval(); // If there is more spent time than time available in the // contract, we don't want to charge the entire time. So we @@ -203,13 +205,17 @@ public function create( // Calculate the remaining time, and make sure it will not // be charged. $minutesSpent = $minutesSpent - $contractAvailableMinutes; + $minutesCharged = $minutesSpent; $contract = null; + } elseif ($billingInterval > 0) { + $minutesCharged = intval(ceil($minutesSpent / $billingInterval)) * $billingInterval; + $minutesCharged = min($minutesCharged, $contractAvailableMinutes); } } $timeSpent = new TimeSpent(); $timeSpent->setTicket($ticket); - $timeSpent->setTime($minutesSpent); + $timeSpent->setTime($minutesCharged); $timeSpent->setRealTime($minutesSpent); $timeSpent->setContract($contract); diff --git a/tests/Controller/Tickets/MessagesControllerTest.php b/tests/Controller/Tickets/MessagesControllerTest.php index 42721367..cf651fcf 100644 --- a/tests/Controller/Tickets/MessagesControllerTest.php +++ b/tests/Controller/Tickets/MessagesControllerTest.php @@ -152,6 +152,40 @@ public function testPostCreateAcceptsTimeSpent(): void $this->assertSame($ticket->getId(), $timeSpent->getTicket()->getId()); } + public function testPostCanAssociateTimeSpentToContract(): void + { + $client = static::createClient(); + $user = UserFactory::createOne(); + $client->loginUser($user->object()); + $this->grantOrga($user->object(), [ + 'orga:create:tickets:messages', + 'orga:create:tickets:time_spent', + ]); + $contract = ContractFactory::createOne([ + 'startAt' => Time::ago(1, 'week'), + 'endAt' => Time::fromNow(1, 'week'), + 'maxHours' => 10, + 'billingInterval' => 30, + ]); + $ticket = TicketFactory::createOne([ + 'createdBy' => $user, + ]); + $ticket->addContract($contract->object()); + $messageContent = 'My message'; + + $client->request('POST', "/tickets/{$ticket->getUid()}/messages/new", [ + '_csrf_token' => $this->generateCsrfToken($client, 'create ticket message'), + 'message' => $messageContent, + 'timeSpent' => 10, + ]); + + $timeSpent = TimeSpentFactory::first(); + $this->assertSame(30, $timeSpent->getTime()); + $this->assertSame(10, $timeSpent->getRealTime()); + $this->assertSame($ticket->getId(), $timeSpent->getTicket()->getId()); + $this->assertSame($contract->getId(), $timeSpent->getContract()->getId()); + } + public function testPostCreateCanCreateTwoTimeSpentIfContractIsAlmostFinished(): void { $client = static::createClient();