Tests for generates numbers

This commit is contained in:
David Bomba 2019-04-30 22:30:47 +10:00
parent 21edcdf919
commit b276cc729f
5 changed files with 71 additions and 16 deletions

View File

@ -60,8 +60,8 @@ class ClientSettings extends BaseSettings
public $quote_number_pattern; public $quote_number_pattern;
public $quote_number_counter; public $quote_number_counter;
public $client_number_prefix; //public $client_number_prefix;
public $client_number_pattern; //public $client_number_pattern;
public $credit_number_prefix; public $credit_number_prefix;
public $credit_number_pattern; public $credit_number_pattern;

View File

@ -147,6 +147,7 @@ class CompanySettings extends BaseSettings
'credit_number_counter' => 1, 'credit_number_counter' => 1,
'client_number_counter' => 1, 'client_number_counter' => 1,
'counter_padding' => 0, 'counter_padding' => 0,
'recurring_invoice_number_prefix' => 'R',
'translations' => (object) [], 'translations' => (object) [],
]; ];

View File

@ -14,6 +14,7 @@ use App\Utils\Traits\MakesDates;
use App\Utils\Traits\MakesHash; use App\Utils\Traits\MakesHash;
use Hashids\Hashids; use Hashids\Hashids;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Log;
use Laracasts\Presenter\PresentableTrait; use Laracasts\Presenter\PresentableTrait;
class Client extends BaseModel class Client extends BaseModel
@ -129,12 +130,14 @@ class Client extends BaseModel
{ {
switch ($entity) { switch ($entity) {
case Client::class: case Client::class:
Log::error('saving client settings');
$this->settings = $settings; $this->settings = $settings;
$this->save(); $this->save();
break; break;
case Company::class: case Company::class:
Log::error('saving company settings');
$this->company->settings = $settings; $this->company->settings = $settings;
$this->company->save(); $this->push();
break; break;
default: default:

View File

@ -8,6 +8,7 @@ use App\Models\Invoice;
use App\Models\Quote; use App\Models\Quote;
use App\Models\RecurringInvoice; use App\Models\RecurringInvoice;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Log;
/** /**
* Class GeneratesNumberCounter * Class GeneratesNumberCounter
@ -20,7 +21,9 @@ trait GeneratesNumberCounter
{ {
$counter = $this->getCounter($entity); $counter = $this->getCounter($entity);
$prefix = $this->getNumberPrefix($entityType); $counter_offset = 0;
$prefix = $this->getNumberPrefix($entity);
$lastNumber = false;
$check = false; $check = false;
@ -32,17 +35,22 @@ trait GeneratesNumberCounter
$number = $prefix . str_pad($counter, $this->invoice_number_padding, '0', STR_PAD_LEFT); $number = $prefix . str_pad($counter, $this->invoice_number_padding, '0', STR_PAD_LEFT);
} }
if ($entity->recurring_invoice_id) { if ($entity == RecurringInvoice::class) {
$number = $this->recurring_invoice_number_prefix . $number; $number = $this->recurring_invoice_number_prefix . $number;
} }
if ($entity->isentity(ENTITY_CLIENT)) { if ($entity == Client::class) {
$check = Client::scope(false, $this->id)->whereIdNumber($number)->withTrashed()->first(); $check = Client::whereIdNumber($number)->withTrashed()->first();
} else { } elseif ($entity == Invoice::class) {
$check = Invoice::scope(false, $this->id)->whereInvoiceNumber($number)->withTrashed()->first(); $check = Invoice::whereInvoiceNumber($number)->withTrashed()->first();
} elseif ($entity == Quote::class) {
$check = Quote::whereQuoteNumber($number)->withTrashed()->first();
} elseif ($entity == Credit::class) {
$check = Credit::whereCreditNumber($number)->withTrashed()->first();
} }
$counter++; $counter++;
$counterOffset++; $counter_offset++; //?
// prevent getting stuck in a loop // prevent getting stuck in a loop
if ($number == $lastNumber) { if ($number == $lastNumber) {
@ -53,6 +61,9 @@ trait GeneratesNumberCounter
} while ($check); } while ($check);
return $number;
//increment the counter here
} }
public function hasSharedCounter() : bool public function hasSharedCounter() : bool
@ -69,7 +80,9 @@ trait GeneratesNumberCounter
*/ */
public function hasNumberPattern($entity) : bool public function hasNumberPattern($entity) : bool
{ {
return $this->getNumberPattern($entity) ? true : false; return $this->getNumberPattern($entity) ? true : false;
} }
/** /**
@ -79,6 +92,7 @@ trait GeneratesNumberCounter
*/ */
public function getNumberPattern($entity) public function getNumberPattern($entity)
{ {
/** Recurring invoice share the same number pattern as invoices */ /** Recurring invoice share the same number pattern as invoices */
if($entity == RecurringInvoice::class ) if($entity == RecurringInvoice::class )
$entity = Invoice::class; $entity = Invoice::class;
@ -100,25 +114,47 @@ trait GeneratesNumberCounter
$field = $this->entityName($entity) . "_number_prefix"; $field = $this->entityName($entity) . "_number_prefix";
return $this->getSettingsByKey( $field )->{$field}; return $this->getSettingsByKey( $field )->{$field};
} }
private function incrementCounter($entity) public function incrementCounter($entity)
{ {
if($entity == RecurringInvoice::class || ( $entity == Quote::class && $this->hasSharedCounter()) )
$entity = Invoice::class;
$counter = $this->entityName($entity) . '_number_counter';
Log::error($counter);
$entity_settings = $this->getSettingsByKey( $counter );
Log::error(print_r($entity_settings,1));
$entity_settings->{$counter} = $entity_settings->{$counter} + 1;
Log::error($entity_settings->{$counter});
Log::error($entity_settings->entity);
$this->setSettingsByEntity($entity_settings->entity, $entity_settings);
Log::error(print_r($entity_settings,1));
} }
private function entityName($entity) private function entityName($entity)
{ {
return strtolower(class_basename($entity)); return strtolower(snake_case(class_basename($entity)));
} }
public function getCounter($entity) : int public function getCounter($entity) : int
{ {
/** Recurring invoice share the same counter as invoices also harvest the invoice_counter if quote and invoices are sharing a counter */ /** Recurring invoice share the same counter as invoices also harvest the invoice_counter if quote and invoices are sharing a counter */
if($entity == RecurringInvoice::class || $this->hasSharedCounter()) if($entity == RecurringInvoice::class || ( $entity == Quote::class && $this->hasSharedCounter()) )
$entity = Invoice::class; $entity = Invoice::class;
$counter = $this->entityName($entity) . '_number_counter'; $counter = $this->entityName($entity) . '_number_counter';
@ -135,6 +171,7 @@ trait GeneratesNumberCounter
*/ */
public function applyNumberPattern($entity, $counter = 1) public function applyNumberPattern($entity, $counter = 1)
{ {
$counter = $counter ?: $this->getCounter($entity); $counter = $counter ?: $this->getCounter($entity);
$pattern = $this->getNumberPattern($entity); $pattern = $this->getNumberPattern($entity);
@ -168,6 +205,7 @@ trait GeneratesNumberCounter
$pattern = $this->getClientInvoiceNumber($pattern, $entity); $pattern = $this->getClientInvoiceNumber($pattern, $entity);
return $pattern; return $pattern;
} }
} }

View File

@ -4,12 +4,13 @@ namespace Tests\Unit;
use App\DataMapper\DefaultSettings; use App\DataMapper\DefaultSettings;
use App\Models\Client; use App\Models\Client;
use App\Models\RecurringInvoice;
use App\Utils\Traits\GeneratesNumberCounter; use App\Utils\Traits\GeneratesNumberCounter;
use App\Utils\Traits\MakesHash; use App\Utils\Traits\MakesHash;
use Illuminate\Support\Facades\Session;
use Tests\TestCase;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Session;
use Tests\TestCase;
/** /**
* @test * @test
@ -97,5 +98,17 @@ class GenerateNumberTest extends TestCase
$client = Client::whereUserId($user->id)->whereCompanyId($company->id)->first(); $client = Client::whereUserId($user->id)->whereCompanyId($company->id)->first();
$this->assertEquals($client->getCounter(Client::class), 1); $this->assertEquals($client->getCounter(Client::class), 1);
$this->assertEquals($client->getNextNumber(Client::class),1);
$settings = $client->getSettingsByKey('recurring_invoice_number_prefix');
$settings->recurring_invoice_number_prefix = 'R';
$client->setSettingsByEntity($settings->entity, $settings);
$this->assertEquals($client->getNextNumber(RecurringInvoice::class), 'R1');
$client->incrementCounter(Client::class);
$this->assertEquals($client->getCounter(Client::class), 2);
} }
} }