Skip to content

Commit

Permalink
Add invoice number formatting
Browse files Browse the repository at this point in the history
  • Loading branch information
DASPRiD committed Jun 9, 2014
1 parent 378f34d commit d9a1e35
Show file tree
Hide file tree
Showing 17 changed files with 508 additions and 20 deletions.
39 changes: 28 additions & 11 deletions config/autoload/local.php.dist
Expand Up @@ -16,15 +16,32 @@ return [
],
],
],
'ajasta' => [
'core' => [
'email_sender_address' => 'ajasta@example.com',
'email_sender_name' => 'Ajasta',
],
'invoice' => [
'default_vat' => '0.0', // Decimal value, keep as string
'default_unit' => null, // Can be null, 'days' or 'hours'
'default_unit_price' => '0.0', // Decimal value, keep as string
],
],
// 'ajasta' => [
// // General options
// 'core' => [
// // Email address displayed as sender
// 'email_sender_address' => 'ajasta@example.com',
//
// // Name displayed as sender
// 'email_sender_name' => 'Ajasta',
// ],
// // Invoice options
// 'invoice' => [
// // Decimal value, keep as string
// 'default_vat' => '0.0',
//
// // Can be null, 'days' or 'hours'
// 'default_unit' => null,
//
// // Decimal value, keep as string
// 'default_unit_price' => '70.0',
//
// // sprintf() formatting for invoice numbers. The following values are available:
// // %1$s: invoice number incrementer
// // %2$s: 4-digit year of the issue date
// // %3$s: 2-digit month of the issue date
// // %4$s: 2-digit day of the issue date
// 'invoice_number_format' => '%2$s%1$s',
// ],
// ],
];
Expand Up @@ -10,6 +10,7 @@
<generator strategy="AUTO"/>
</id>

<field name="invoiceNumber" type="string"/>
<field name="locale" type="string"/>
<field name="currencyCode" type="string"/>
<field name="issueDate" type="date"/>
Expand Down
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping
xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">

<entity name="Ajasta\Invoice\Entity\InvoiceNumberIncrementer" table="invoiceNumberIncrementer">
<id name="id" type="integer">
<generator strategy="AUTO"/>
</id>

<field name="value" type="integer"/>
</entity>
</doctrine-mapping>
5 changes: 5 additions & 0 deletions module/AjastaInvoice/config/module.config.php
Expand Up @@ -75,6 +75,11 @@
],
'service_manager' => [
'factories' => [
'Ajasta\Invoice\Options' => 'Ajasta\Invoice\OptionsFactory',
'Ajasta\Invoice\Service\InvoiceNumberGenerator\GeneratorInterface'
=> 'Ajasta\Invoice\Service\InvoiceNumberGenerator\GeneratorFactory',
'Ajasta\Invoice\Service\InvoicePersistenceStrategy\StrategyInterface'
=> 'Ajasta\Invoice\Service\InvoicePersistenceStrategy\StrategyFactory',
'Ajasta\Invoice\Service\InvoiceService' => 'Ajasta\Invoice\Service\InvoiceServiceFactory',
],
],
Expand Down
21 changes: 21 additions & 0 deletions module/AjastaInvoice/src/Ajasta/Invoice/Entity/Invoice.php
Expand Up @@ -15,6 +15,11 @@ class Invoice
*/
protected $id;

/**
* @var string
*/
protected $invoiceNumber;

/**
* @var Client
*/
Expand Down Expand Up @@ -73,6 +78,22 @@ public function getId()
return $this->id;
}

/**
* @return string
*/
public function getInvoiceNumber()
{
return $this->invoiceNumber;
}

/**
* @param string $invoiceNumber
*/
public function setInvoiceNumber($invoiceNumber)
{
$this->invoiceNumber = $invoiceNumber;
}

/**
* @return Client
*/
Expand Down
@@ -0,0 +1,30 @@
<?php
namespace Ajasta\Invoice\Entity;

class InvoiceNumberIncrementer
{
const ID = 1;

/**
* @var int
*/
protected $id = self::ID;

/**
* @var int
*/
protected $value = 1;

/**
* @return int
*/
public function getValue()
{
return $this->value;
}

public function incrementValue()
{
$this->value++;
}
}
120 changes: 120 additions & 0 deletions module/AjastaInvoice/src/Ajasta/Invoice/Options.php
@@ -0,0 +1,120 @@
<?php
namespace Ajasta\Invoice;

use InvalidArgumentException;
use Zend\Stdlib\AbstractOptions;

class Options extends AbstractOptions
{
/**
* @var decimal
*/
protected $defaultVat = '0.0';

/**
* @var string|null
*/
protected $defaultUnit;

/**
* @var decimal
*/
protected $defaultUnitPrice = '0.0';

/**
* @var string
*/
protected $invoiceNumberFormat = '%1$s';

/**
* @return decimal
*/
public function getDefaultVat()
{
return $this->defaultVat;
}

/**
* @param decimal $defaultVat
*/
public function setDefaultVat($defaultVat)
{
if (!is_string($defaultVat) || !preg_match('(^\d+(\.\d+)?$)', $defaultVat)) {
throw new InvalidArgumentException(sprintf(
'Default VAT must be a decimal string value, got %s',
$defaultVat
));
}

$this->defaultVat = $defaultVat;
}

/**
* @return string|null
*/
public function getDefaultUnit()
{
return $this->defaultUnit;
}

/**
* @param string|null $defaultUnit
*/
public function setDefaultUnit($defaultUnit)
{
if (!in_array($defaultUnit, [null, 'hours', 'days'], true)) {
throw new InvalidArgumentException(sprintf(
'Default unit must be either null, "hours" or "days", got %s',
$defaultUnit
));
}

$this->defaultUnit = $defaultUnit;
}

/**
* @return string|null
*/
public function getDefaultUnitPrice()
{
return $this->defaultUnitPrice;
}

/**
* @param decimal $defaultUnitPrice
*/
public function setDefaultUnitPrice($defaultUnitPrice)
{
if (!is_string($defaultUnitPrice) || !preg_match('(^\d+(\.\d+)?$)', $defaultUnitPrice)) {
throw new InvalidArgumentException(sprintf(
'Default unit price must be a decimal string value, got %s',
$defaultUnitPrice
));
}

$this->defaultUnitPrice = $defaultUnitPrice;
}

/**
* @return string
*/
public function getInvoiceNumberFormat()
{
return $this->invoiceNumberFormat;
}

/**
* @param string $invoiceNumberFormat
*/
public function setInvoiceNumberFormat($invoiceNumberFormat)
{
if (!is_string($invoiceNumberFormat)) {
throw new InvalidArgumentException(sprintf(
'Invoice number format must be a string, got %s',
is_object($invoiceNumberFormat) ? get_class($invoiceNumberFormat) : gettype($invoiceNumberFormat))
);
}

$this->invoiceNumberFormat = $invoiceNumberFormat;
}
}
22 changes: 22 additions & 0 deletions module/AjastaInvoice/src/Ajasta/Invoice/OptionsFactory.php
@@ -0,0 +1,22 @@
<?php
namespace Ajasta\Invoice;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class OptionsFactory implements FactoryInterface
{
/**
* @return Options
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
$config = $serviceLocator->get('Config');

if (!isset($config['ajasta']['invoice'])) {
return new Options();
}

return new Options($config['ajasta']['invoice']);
}
}
@@ -0,0 +1,33 @@
<?php
namespace Ajasta\Invoice\Service\InvoiceNumberGenerator;

use Ajasta\Invoice\Entity\Invoice;

class FormatGenerator implements GeneratorInterface
{
/**
* @var string
*/
protected $invoiceNumberFormat;

/**
* @param string $invoiceNumberFormat
*/
public function __construct($invoiceNumberFormat)
{
$this->invoiceNumberFormat = $invoiceNumberFormat;
}

public function generate(Invoice $invoice, $incrementer)
{
$issueDate = $invoice->getIssueDate();

return sprintf(
$this->invoiceNumberFormat,
$incrementer,
$issueDate->format('Y'),
$issueDate->format('m'),
$issueDate->format('d')
);
}
}
@@ -0,0 +1,16 @@
<?php
namespace Ajasta\Invoice\Service\InvoiceNumberGenerator;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class GeneratorFactory implements FactoryInterface
{
/**
* @return GeneratorInterface
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
return new FormatGenerator($serviceLocator->get('Ajasta\Invoice\Options')->getInvoiceNumberFormat());
}
}
@@ -0,0 +1,16 @@
<?php
namespace Ajasta\Invoice\Service\InvoiceNumberGenerator;

use Ajasta\Invoice\Entity\Invoice;

interface GeneratorInterface
{
/**
* Generates a new invoice number for an invoice with a given incrememter.
*
* @param Invoice $invoice
* @param int $incrementer
* @return string
*/
public function generate(Invoice $invoice, $incrementer);
}

0 comments on commit d9a1e35

Please sign in to comment.