mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-09 03:14:30 -04:00
Working on client numbering
This commit is contained in:
parent
7cf3b23089
commit
efe81ffc64
@ -62,6 +62,9 @@ class ClientSettings extends BaseSettings
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Counter Variables
|
* Counter Variables
|
||||||
|
*
|
||||||
|
* Currently we have only engineered counters to be implemented at the client level
|
||||||
|
* prefix/patterns and padding are not there yet.
|
||||||
*/
|
*/
|
||||||
public $invoice_number_prefix;
|
public $invoice_number_prefix;
|
||||||
public $invoice_number_pattern;
|
public $invoice_number_pattern;
|
||||||
|
@ -26,13 +26,22 @@ use Illuminate\Support\Facades\Log;
|
|||||||
trait GeneratesCounter
|
trait GeneratesCounter
|
||||||
{
|
{
|
||||||
|
|
||||||
public function getNextInvoiceNumber(Client $client)
|
|
||||||
|
/**
|
||||||
|
* Gets the next invoice number.
|
||||||
|
*
|
||||||
|
* @param \App\Models\Client $client The client
|
||||||
|
*
|
||||||
|
* @return string The next invoice number.
|
||||||
|
*/
|
||||||
|
public function getNextInvoiceNumber(Client $client) :string
|
||||||
{
|
{
|
||||||
//Reset counters if enabled
|
//Reset counters if enabled
|
||||||
$this->resetCounters($client);
|
$this->resetCounters($client);
|
||||||
|
|
||||||
$is_client_counter = false;
|
$is_client_counter = false;
|
||||||
|
|
||||||
|
//todo handle if we have specific client patterns in the future
|
||||||
$pattern = $client->company->settings->invoice_number_pattern;
|
$pattern = $client->company->settings->invoice_number_pattern;
|
||||||
|
|
||||||
//Determine if we are using client_counters
|
//Determine if we are using client_counters
|
||||||
@ -47,12 +56,12 @@ trait GeneratesCounter
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Return a valid counter
|
//Return a valid counter
|
||||||
$counter = $this->checkEntityNumber($client, $counter, $client->company->settings->counter_padding, $client->company->settings->invoice_number_prefix);
|
$counter = $this->checkEntityNumber(Client::class, $client->company_id, $counter, $client->company->settings->counter_padding, $client->company->settings->invoice_number_prefix);
|
||||||
|
|
||||||
//build number pattern and replace variables in pattern
|
//build number pattern and replace variables in pattern
|
||||||
$invoice_number = $this->applyNumberPattern($client, $counter, $client->company->settings->invoice_number_pattern);
|
$invoice_number = $this->applyNumberPattern($client, $counter, $client->company->settings->invoice_number_pattern);
|
||||||
|
|
||||||
//increment the corrent invoice_number Counter (company vs client)
|
//increment the correct invoice_number Counter (company vs client)
|
||||||
if($is_client_counter)
|
if($is_client_counter)
|
||||||
$this->incrementCounter($client, 'invoice_number_counter');
|
$this->incrementCounter($client, 'invoice_number_counter');
|
||||||
else
|
else
|
||||||
@ -61,8 +70,17 @@ trait GeneratesCounter
|
|||||||
return $invoice_number;
|
return $invoice_number;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getNextCreditNumber()
|
public function getNextCreditNumber(Client $client)
|
||||||
{
|
{
|
||||||
|
//Reset counters if enabled
|
||||||
|
$this->resetCounters($client);
|
||||||
|
|
||||||
|
//todo handle if we have specific client patterns in the future
|
||||||
|
$pattern = $client->company->settings->credit_number_pattern;
|
||||||
|
|
||||||
|
$counter = $this->checkEntityNumber(Credit::class, $client->company_id, $counter, $client->company->settings->counter_padding, $client->company->settings->invoice_number_prefix);
|
||||||
|
|
||||||
|
$credit_number = $this->applyNumberPattern($client, $counter, $client->company->settings->credit_number_pattern);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,9 +105,12 @@ trait GeneratesCounter
|
|||||||
$this->resetCounters($client);
|
$this->resetCounters($client);
|
||||||
|
|
||||||
$counter = $client->company->getSettingsByKey( 'client_number_counter' );
|
$counter = $client->company->getSettingsByKey( 'client_number_counter' );
|
||||||
$counter = $this->checkEntityNumber($client, $counter, $client->company->settings->counter_padding, $client->company->settings->client_number_prefix);
|
|
||||||
|
|
||||||
$client_number = $this->applyNumberPattern($client, $counter, $counter, $client->company->settings->client_number_pattern);
|
$client_number = $this->checkEntityNumber(Client::class, $counter, $client->company->settings->counter_padding, $client->company->settings->client_number_prefix, $client->company->settings->client_number_pattern);
|
||||||
|
|
||||||
|
//$client_number = $this->applyNumberPattern($client, $counter, $client->company->settings->client_number_pattern);
|
||||||
|
|
||||||
|
$this->incrementCounter($client->company, 'client_number_counter');
|
||||||
|
|
||||||
return $client_number;
|
return $client_number;
|
||||||
}
|
}
|
||||||
@ -109,20 +130,22 @@ trait GeneratesCounter
|
|||||||
* @param integer $padding The padding
|
* @param integer $padding The padding
|
||||||
* @param string $prefix The prefix
|
* @param string $prefix The prefix
|
||||||
*
|
*
|
||||||
* @return <type> ( description_of_the_return_value )
|
* @return string The padded and prefixed invoice number
|
||||||
*/
|
*/
|
||||||
private function checkEntityNumber($entity, $counter, $padding, $prefix)
|
private function checkEntityNumber($entity, $counter, $padding, $prefix, $pattern)
|
||||||
{
|
{
|
||||||
$check = false;
|
$check = false;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
$number = $this->padCounter($counter, $padding);
|
$number = $this->padCounter($counter, $padding);
|
||||||
$number = $this->prefixCounter($number, $prefix);
|
|
||||||
|
|
||||||
$class = get_class($entity);
|
if(isset($prefix))
|
||||||
|
$number = $this->prefixCounter($number, $prefix);
|
||||||
$check = $class::whereCompanyId($entity->company_id)->whereIdNumber($number)->withTrashed()->first();
|
else
|
||||||
|
$number = $this->applyNumberPattern($entity, $counter, $pattern);
|
||||||
|
//todo
|
||||||
|
$check = $entity::whereCompanyId($entity->company_id)->whereIdNumber($number)->withTrashed()->first();
|
||||||
|
|
||||||
$counter++;
|
$counter++;
|
||||||
|
|
||||||
@ -240,11 +263,15 @@ Log::error('we are resetting here!!');
|
|||||||
$client->company->save();
|
$client->company->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
private function applyNumberPattern($client, $counter, $pattern)
|
private function applyNumberPattern($entity, $counter, $pattern)
|
||||||
{
|
{
|
||||||
if(!$pattern)
|
if(!$pattern)
|
||||||
return $counter;
|
return $counter;
|
||||||
|
|
||||||
|
if($entity instanceof Client)
|
||||||
|
$client = $entity;
|
||||||
|
else
|
||||||
|
$client = $entity->client;
|
||||||
|
|
||||||
$search = ['{$year}'];
|
$search = ['{$year}'];
|
||||||
$replace = [date('Y')];
|
$replace = [date('Y')];
|
||||||
@ -256,7 +283,7 @@ Log::error('we are resetting here!!');
|
|||||||
$replace[] = $counter;
|
$replace[] = $counter;
|
||||||
|
|
||||||
if (strstr($pattern, '{$user_id}')) {
|
if (strstr($pattern, '{$user_id}')) {
|
||||||
$user_id = auth()->check() ? auth()->user()->id : 0;
|
$user_id = $entity->user_id ? $entity->user_ids : 0;
|
||||||
$search[] = '{$user_id}';
|
$search[] = '{$user_id}';
|
||||||
$replace[] = str_pad(($user_id), 2, '0', STR_PAD_LEFT);
|
$replace[] = str_pad(($user_id), 2, '0', STR_PAD_LEFT);
|
||||||
}
|
}
|
||||||
@ -268,7 +295,7 @@ Log::error('we are resetting here!!');
|
|||||||
$search[] = $matches[0];
|
$search[] = $matches[0];
|
||||||
|
|
||||||
/* The following adjusts for the company timezone - may bork tests depending on the time of day the tests are run!!!!!!*/
|
/* The following adjusts for the company timezone - may bork tests depending on the time of day the tests are run!!!!!!*/
|
||||||
$date = Carbon::now($client->company->timezone()->name)->format($format);
|
$date = Carbon::now($entity->company->timezone()->name)->format($format);
|
||||||
$replace[] = str_replace($format, $date, $matches[1]);
|
$replace[] = str_replace($format, $date, $matches[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -286,9 +313,9 @@ Log::error('we are resetting here!!');
|
|||||||
|
|
||||||
$search[] = '{$id_number}';
|
$search[] = '{$id_number}';
|
||||||
$replace[] = $client->id_number;
|
$replace[] = $client->id_number;
|
||||||
Log::error($search);
|
//Log::error($search);
|
||||||
Log::error($replace);
|
//Log::error($replace);
|
||||||
Log::error($pattern);
|
//Log::error($pattern);
|
||||||
return str_replace($search, $replace, $pattern);
|
return str_replace($search, $replace, $pattern);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -145,6 +145,94 @@ class GeneratesCounterTest extends TestCase
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testInvoicePadding()
|
||||||
|
{
|
||||||
|
$settings = $this->client->company->settings;
|
||||||
|
$settings->counter_padding = 5;
|
||||||
|
$this->client->company->settings = $settings;
|
||||||
|
$this->client->company->save();
|
||||||
|
|
||||||
|
$invoice_number = $this->getNextInvoiceNumber($this->client);
|
||||||
|
|
||||||
|
$this->assertEquals(strlen($invoice_number), 5);
|
||||||
|
|
||||||
|
$settings = $this->client->company->settings;
|
||||||
|
$settings->counter_padding = 10;
|
||||||
|
$this->client->company->settings = $settings;
|
||||||
|
$this->client->company->save();
|
||||||
|
|
||||||
|
$invoice_number = $this->getNextInvoiceNumber($this->client);
|
||||||
|
|
||||||
|
$this->assertEquals(strlen($invoice_number), 10);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testInvoicePrefix()
|
||||||
|
{
|
||||||
|
$settings = $this->client->company->settings;
|
||||||
|
$settings->invoice_number_prefix = 'R';
|
||||||
|
$this->client->company->settings = $settings;
|
||||||
|
$this->client->company->save();
|
||||||
|
|
||||||
|
$invoice_number = $this->getNextInvoiceNumber($this->client);
|
||||||
|
|
||||||
|
$this->assertEquals($invoice_number, 'R1');
|
||||||
|
|
||||||
|
$invoice_number = $this->getNextInvoiceNumber($this->client);
|
||||||
|
|
||||||
|
$this->assertEquals($invoice_number, 'R2');
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testClientNumber()
|
||||||
|
{
|
||||||
|
$client_number = $this->getNextClientNumber($this->client);
|
||||||
|
|
||||||
|
$this->assertEquals($client_number, '1');
|
||||||
|
|
||||||
|
$client_number = $this->getNextClientNumber($this->client);
|
||||||
|
|
||||||
|
$this->assertEquals($client_number, '2');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function testClientNumberPrefix()
|
||||||
|
{
|
||||||
|
$settings = $this->client->company->settings;
|
||||||
|
$settings->client_number_prefix = 'C';
|
||||||
|
$this->client->company->settings = $settings;
|
||||||
|
$this->client->company->save();
|
||||||
|
|
||||||
|
$client_number = $this->getNextClientNumber($this->client);
|
||||||
|
|
||||||
|
$this->assertEquals($client_number, 'C1');
|
||||||
|
|
||||||
|
$client_number = $this->getNextClientNumber($this->client);
|
||||||
|
|
||||||
|
$this->assertEquals($client_number, 'C2');
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testClientNumberPattern()
|
||||||
|
{
|
||||||
|
$settings = $this->client->company->settings;
|
||||||
|
$settings->client_number_prefix = 'C-';
|
||||||
|
$settings->client_number_pattern = '{$year}-{$user_id}-{$counter}';
|
||||||
|
$this->client->company->settings = $settings;
|
||||||
|
$this->client->company->save();
|
||||||
|
|
||||||
|
$client_number = $this->getNextClientNumber($this->client);
|
||||||
|
|
||||||
|
$this->assertEquals($client_number, 'C-' . date('Y') . '-' . $this->client->user_id . '-1');
|
||||||
|
|
||||||
|
$client_number = $this->getNextClientNumber($this->client);
|
||||||
|
|
||||||
|
$this->assertEquals($client_number, 'C-' . date('Y') . '-' . $this->client->user_id . '-1');
|
||||||
|
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
public function testPrefixOnlyInvoiceNumber()
|
public function testPrefixOnlyInvoiceNumber()
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user