| Id | Index | Year | | ----------|:------------ -:| -----:| | 1 | 2 | 2018 | | 2 | 3 | 2019 |
Last active
April 9, 2019 08:52
-
-
Save hoekstramenno/43ced46affdab00fb966972e07a3514b to your computer and use it in GitHub Desktop.
BookingNumber By Year Generator. Creates unique incremental invoice numbers ; inspired by Sylius
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\BookingNumbers; | |
use App\Interfaces\BookingNumberGeneratorInterface; | |
use App\Interfaces\BookingNumberSequenceInterface; | |
/** | |
* Generates an unique Booking number with the format <current year>0000 | |
* The sequence is divided by year in the order_sequence table and incremented with each order | |
* | |
* Class BookingByYearSequenceGenerator | |
* | |
* @package App\BookingNumbers;s | |
*/ | |
class BookingByYearSequenceGenerator implements BookingNumberGeneratorInterface | |
{ | |
/** | |
* @var int | |
*/ | |
protected $startNumber; | |
/** | |
* @var int | |
*/ | |
protected $numberLength; | |
/** | |
* @var \App\Models\BookingNumberSequence | |
*/ | |
protected $bookingNumberSequenceModel; | |
/** | |
* @param \App\Contracts\BookingNumberSequenceInterface $bookingNumberSequenceModel | |
* @param int $startNumber | |
* @param int $numberLength | |
*/ | |
public function __construct( | |
BookingNumberSequenceInterface $bookingNumberSequenceModel, | |
int $startNumber = 1, | |
int $numberLength = 4 | |
) { | |
$this->bookingNumberSequenceModel = $bookingNumberSequenceModel; | |
$this->startNumber = $startNumber; | |
$this->numberLength = $numberLength; | |
} | |
/** | |
* @return string | |
*/ | |
public function generate(): string | |
{ | |
$sequence = $this->getSequence(); | |
$number = $this->generateNumber($sequence->index); | |
$sequence->incrementIndex(); | |
$sequence->save(); | |
return $number; | |
} | |
/** | |
* @param int $index | |
* | |
* @return string | |
*/ | |
protected function generateNumber(int $index): string | |
{ | |
$number = $this->startNumber + $index; | |
$number = str_pad((string)$number, $this->numberLength, '0', STR_PAD_LEFT); | |
return date('Y').$number; | |
} | |
/** | |
* @return BookingNumberSequenceInterface | |
*/ | |
protected function getSequence(): BookingNumberSequenceInterface | |
{ | |
/** @var BookingNumberSequenceInterface $sequence */ | |
$sequence = $this->bookingNumberSequenceModel | |
->where('year', date('Y')) | |
->first(); | |
if (null !== $sequence) { | |
return $sequence; | |
} | |
/** @var BookingNumberSequenceInterface $sequence */ | |
return $this->bookingNumberSequenceModel->create([ | |
'index' => 1, | |
'year' => date('Y'), | |
]); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Interfaces; | |
interface BookingNumberGeneratorInterface | |
{ | |
public function generate(): string; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Interfaces; | |
/** | |
* Interface BookingNumberSequenceInterface | |
* | |
* @package App\Interfaces | |
*/ | |
interface BookingNumberSequenceInterface | |
{ | |
public function getIndex(); | |
public function incrementIndex(); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$booking = new Booking(); // your own implimentation | |
$bookingNumberGenerator = new BookingNumberGenerator(); | |
try { | |
$booking->invoice_number = $bookingNumberGenerator->generate(); | |
} catch (\Exception $exception) { | |
throw $exception; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment