Working on client numbering

This commit is contained in:
David Bomba 2019-05-28 15:55:50 +10:00
parent 7cf3b23089
commit efe81ffc64
3 changed files with 136 additions and 18 deletions

View File

@ -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;

View File

@ -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);
if(isset($prefix))
$number = $this->prefixCounter($number, $prefix); $number = $this->prefixCounter($number, $prefix);
else
$class = get_class($entity); $number = $this->applyNumberPattern($entity, $counter, $pattern);
//todo
$check = $class::whereCompanyId($entity->company_id)->whereIdNumber($number)->withTrashed()->first(); $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);
} }

View File

@ -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()
{ {