Skip to content

Instantly share code, notes, and snippets.

@hoekstramenno
Last active April 9, 2019 08:52
Show Gist options
  • Save hoekstramenno/43ced46affdab00fb966972e07a3514b to your computer and use it in GitHub Desktop.
Save hoekstramenno/43ced46affdab00fb966972e07a3514b to your computer and use it in GitHub Desktop.
BookingNumber By Year Generator. Creates unique incremental invoice numbers ; inspired by Sylius
<?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'),
]);
}
}
<?php
namespace App\Interfaces;
interface BookingNumberGeneratorInterface
{
public function generate(): string;
}
<?php
namespace App\Interfaces;
/**
* Interface BookingNumberSequenceInterface
*
* @package App\Interfaces
*/
interface BookingNumberSequenceInterface
{
public function getIndex();
public function incrementIndex();
}

| Id | Index | Year | | ----------|:------------ -:| -----:| | 1 | 2 | 2018 | | 2 | 3 | 2019 |

$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