diff --git a/app/Models/Client.php b/app/Models/Client.php index b93af483ca13..08fc9614938e 100644 --- a/app/Models/Client.php +++ b/app/Models/Client.php @@ -123,7 +123,7 @@ class Client extends BaseModel return $this->getSettings(); } else { - //Log::error('harvesting company settings for key = '. $key); + //Log::error(print_r(new CompanySettings($this->company->settings),1)); return new CompanySettings($this->company->settings); } @@ -133,14 +133,16 @@ class Client extends BaseModel { switch ($entity) { case Client::class: - // Log::error('saving client settings'); + Log::error('saving client settings'); $this->settings = $settings; $this->save(); + $this->fresh(); break; case Company::class: - // Log::error('saving company settings'); + Log::error('saving company settings'); $this->company->settings = $settings; $this->company->save(); + $this->company->fresh(); break; default: diff --git a/app/Utils/Traits/GeneratesNumberCounter.php b/app/Utils/Traits/GeneratesNumberCounter.php index f416f4adb67b..e8854736c1b3 100644 --- a/app/Utils/Traits/GeneratesNumberCounter.php +++ b/app/Utils/Traits/GeneratesNumberCounter.php @@ -25,19 +25,19 @@ trait GeneratesNumberCounter $prefix = $this->getNumberPrefix($entity); $lastNumber = false; + $check = false; do { - if ($this->hasNumberPattern($entity)) { $number = $this->applyNumberPattern($entity, $counter); } else { $number = $prefix . str_pad($counter, $this->invoice_number_padding, '0', STR_PAD_LEFT); } - if ($entity == RecurringInvoice::class) { - $number = $this->recurring_invoice_number_prefix . $number; - } + // if ($entity == RecurringInvoice::class) { + // $number = $this->getSettingsByKey('recurring_invoice_number_prefix')->recurring_invoice_number_prefix . $number; + // } if ($entity == Client::class) { $check = Client::company($this->company_id)->whereIdNumber($number)->withTrashed()->first(); @@ -60,7 +60,8 @@ trait GeneratesNumberCounter } while ($check); - + $this->incrementCounter($entity); + return $number; //increment the counter here @@ -68,7 +69,7 @@ trait GeneratesNumberCounter public function hasSharedCounter() : bool { - Log::error('The Shared Counter = '. $this->getSettingsByKey('shared_invoice_quote_counter')->shared_invoice_quote_counter); + return $this->getSettingsByKey('shared_invoice_quote_counter')->shared_invoice_quote_counter === TRUE; } @@ -125,20 +126,23 @@ trait GeneratesNumberCounter $counter = $this->entityName($entity) . '_number_counter'; - //Log::error($counter); + Log::error('entity = '.$entity); $entity_settings = $this->getSettingsByKey( $counter ); //Log::error(print_r($entity_settings,1)); - $entity_settings->{$counter} = $entity_settings->{$counter} + 1; - + $entity_settings->$counter = $entity_settings->$counter + 1; + // Log::error('name '.$counter); + // Log::error('key '.$entity_settings->$counter); + // Log::error('value '.$entity_settings->{$counter}); + // Log::error('value inc '.$entity_settings->{$counter}++); //Log::error($entity_settings->{$counter}); //Log::error($entity_settings->entity); $this->setSettingsByEntity($entity_settings->entity, $entity_settings); - //Log::error(print_r($entity_settings,1)); + Log::error(print_r($entity_settings,1)); } @@ -186,9 +190,9 @@ trait GeneratesNumberCounter $replace[] = str_pad($counter, $this->getSettingsByKey( 'counter_padding' )->counter_padding, '0', STR_PAD_LEFT); if (strstr($pattern, '{$user_id}')) { - $user_id = $entity->user ? $entity->user->id : (auth()->check() ? auth()->user()->id : 0); + $user_id = auth()->check() ? auth()->user()->id : 0; $search[] = '{$user_id}'; - $replace[] = str_pad(($user_id + 1), 2, '0', STR_PAD_LEFT); + $replace[] = str_pad(($user_id), 2, '0', STR_PAD_LEFT); } $matches = false; @@ -202,10 +206,42 @@ trait GeneratesNumberCounter } $pattern = str_replace($search, $replace, $pattern); - $pattern = $this->getClientInvoiceNumber($pattern, $entity); + // $pattern = $this->getClientInvoiceNumber($pattern, $entity); return $pattern; } + private function getClientInvoiceNumber($pattern, $invoice) + { + if (! $invoice->client_id) { + return $pattern; + } + + $search = [ + '{$custom1}', + '{$custom2}', + '{$idNumber}', + '{$clientCustom1}', + '{$clientCustom2}', + '{$clientIdNumber}', + '{$clientCounter}', + ]; + + $client = $invoice->client; + $clientCounter = ($invoice->isQuote() && ! $this->share_counter) ? $client->quote_number_counter : $client->invoice_number_counter; + + $replace = [ + $client->custom_value1, + $client->custom_value2, + $client->id_number, + $client->custom_value1, // backwards compatibility + $client->custom_value2, + $client->id_number, + str_pad($clientCounter, $this->invoice_number_padding, '0', STR_PAD_LEFT), + ]; + + return str_replace($search, $replace, $pattern); + } + } \ No newline at end of file diff --git a/tests/Unit/GenerateNumberTest.php b/tests/Unit/GenerateNumberTest.php index c1f215f821ff..d070ae89fee4 100644 --- a/tests/Unit/GenerateNumberTest.php +++ b/tests/Unit/GenerateNumberTest.php @@ -4,6 +4,7 @@ namespace Tests\Unit; use App\DataMapper\DefaultSettings; use App\Models\Client; +use App\Models\Company; use App\Models\Credit; use App\Models\Invoice; use App\Models\RecurringInvoice; @@ -121,11 +122,9 @@ class GenerateNumberTest extends TestCase public function testRecurringInvoiceNumberPrefix() { - $settings = $this->client->getSettingsByKey('recurring_invoice_number_prefix'); - $settings->recurring_invoice_number_prefix = 'R'; - $this->client->setSettingsByEntity($settings->entity, $settings); - - $this->assertEquals($this->client->getNextNumber(RecurringInvoice::class), 'R1'); + $this->assertEquals($this->client->getNextNumber(RecurringInvoice::class), 'R1'); + $this->assertEquals($this->client->getCounter(Client::class), 1); + } public function testClientIncrementer() @@ -156,11 +155,29 @@ class GenerateNumberTest extends TestCase $this->assertEquals($this->client->getCounter(Invoice::class), 3); $this->assertEquals($this->client->getCounter(RecurringInvoice::class), 3); $this->assertEquals($this->client->getCounter(Credit::class), 2); + + } + /** + * {$counter} + * {$userId} + * {$year} + * {$date:format} - See options + * @return [type] [description] + */ public function testClientNumberPattern() { - + + $settings = $this->client->getSettingsByKey('client_number_pattern'); + $settings->client_number_pattern = '{$year}-{$counter}'; + $this->client->setSettingsByEntity($settings->entity, $settings); + $this->assertEquals($this->client->getNextNumber(Client::class), '2019-1'); + $this->assertEquals($this->client->getNextNumber(Client::class), '2019-2'); + + $company = Company::find($this->client->company_id); + + $this->assertEquals($company->settings->client_number_counter,3); } }