From 20c2a1690f95045341b2a837d10de1b145be1744 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 17 May 2022 20:31:43 +1000 Subject: [PATCH 1/2] Improve resilience of client number creation --- .../Preview/PreviewInvoiceRequest.php | 7 ++-- app/Repositories/ClientRepository.php | 34 +++++++++++++++++-- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/app/Http/Requests/Preview/PreviewInvoiceRequest.php b/app/Http/Requests/Preview/PreviewInvoiceRequest.php index eb5944490ab2..53d9befc8ead 100644 --- a/app/Http/Requests/Preview/PreviewInvoiceRequest.php +++ b/app/Http/Requests/Preview/PreviewInvoiceRequest.php @@ -14,6 +14,9 @@ namespace App\Http\Requests\Preview; use App\Http\Requests\Request; use App\Http\ValidationRules\Project\ValidProjectForClient; use App\Models\Invoice; +use App\Models\Credit; +use App\Models\Quote; +use App\Models\RecurringInvoice; use App\Utils\Traits\CleanLineItems; use App\Utils\Traits\MakesHash; use Illuminate\Validation\Rule; @@ -30,15 +33,13 @@ class PreviewInvoiceRequest extends Request */ public function authorize() : bool { - return auth()->user()->can('create', Invoice::class); + return auth()->user()->can('create', Invoice::class) || auth()->user()->can('create', Quote::class) || auth()->user()->can('create', RecurringInvoice::class) || auth()->user()->can('create', Credit::class); } public function rules() { $rules = []; - // $rules['client_id'] = 'bail|required|exists:clients,id,company_id,'.auth()->user()->company()->id; - $rules['number'] = ['nullable']; return $rules; diff --git a/app/Repositories/ClientRepository.php b/app/Repositories/ClientRepository.php index 128eb5579e47..2d5e5f13710a 100644 --- a/app/Repositories/ClientRepository.php +++ b/app/Repositories/ClientRepository.php @@ -17,6 +17,7 @@ use App\Models\Company; use App\Utils\Traits\ClientGroupSettingsSaver; use App\Utils\Traits\GeneratesCounter; use App\Utils\Traits\SavesDocuments; +use Illuminate\Database\QueryException; /** * ClientRepository. @@ -26,6 +27,8 @@ class ClientRepository extends BaseRepository use GeneratesCounter; use SavesDocuments; + private bool $completed = true; + /** * @var ClientContactRepository */ @@ -76,8 +79,35 @@ class ClientRepository extends BaseRepository if (!isset($client->number) || empty($client->number) || strlen($client->number) == 0) { - $client->number = $this->getNextClientNumber($client); - $client->save(); + // $client->number = $this->getNextClientNumber($client); + // $client->save(); + + $x=1; + + do{ + + try{ + + $client->number = $this->getNextClientNumber($client); + $client->saveQuietly(); + + $this->completed = false; + + + } + catch(QueryException $e){ + + $x++; + + if($x>10) + $this->completed = false; + } + + } + while($this->completed); + + + } if (empty($data['name'])) { From 1973c4c214f46847aa0c3bcad24315bfddd50d1a Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 17 May 2022 21:03:07 +1000 Subject: [PATCH 2/2] v5.3.89 --- VERSION.txt | 2 +- app/Http/Controllers/InvoiceController.php | 10 ++++ .../Invoice/UpdateReminderRequest.php | 32 +++++++++++ app/Jobs/Invoice/UpdateReminders.php | 57 +++++++++++++++++++ app/Repositories/ClientRepository.php | 35 ++++++------ config/ninja.php | 4 +- routes/api.php | 3 +- 7 files changed, 121 insertions(+), 22 deletions(-) create mode 100644 app/Http/Requests/Invoice/UpdateReminderRequest.php create mode 100644 app/Jobs/Invoice/UpdateReminders.php diff --git a/VERSION.txt b/VERSION.txt index e042e08fb428..8e2c9223d4ec 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -5.3.88 \ No newline at end of file +5.3.89 \ No newline at end of file diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index e3661503b210..fff77983e423 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -25,10 +25,12 @@ use App\Http\Requests\Invoice\EditInvoiceRequest; use App\Http\Requests\Invoice\ShowInvoiceRequest; use App\Http\Requests\Invoice\StoreInvoiceRequest; use App\Http\Requests\Invoice\UpdateInvoiceRequest; +use App\Http\Requests\Invoice\UpdateReminderRequest; use App\Http\Requests\Invoice\UploadInvoiceRequest; use App\Jobs\Entity\EmailEntity; use App\Jobs\Invoice\BulkInvoiceJob; use App\Jobs\Invoice\StoreInvoice; +use App\Jobs\Invoice\UpdateReminders; use App\Jobs\Invoice\ZipInvoices; use App\Jobs\Ninja\TransactionLog; use App\Jobs\Util\UnlinkFile; @@ -957,4 +959,12 @@ class InvoiceController extends BaseController return $this->itemResponse($invoice->fresh()); } + + public function update_reminders(UpdateReminderRequest $request) + { + + UpdateReminders::dispatch(auth()->user()->company()); + + return response()->json(["message" => "Updating reminders"], 200); + } } diff --git a/app/Http/Requests/Invoice/UpdateReminderRequest.php b/app/Http/Requests/Invoice/UpdateReminderRequest.php new file mode 100644 index 000000000000..c52f4d3f025e --- /dev/null +++ b/app/Http/Requests/Invoice/UpdateReminderRequest.php @@ -0,0 +1,32 @@ +user()->isAdmin(); + } + + public function rules() + { + return []; + } +} diff --git a/app/Jobs/Invoice/UpdateReminders.php b/app/Jobs/Invoice/UpdateReminders.php new file mode 100644 index 000000000000..7b64a8d98507 --- /dev/null +++ b/app/Jobs/Invoice/UpdateReminders.php @@ -0,0 +1,57 @@ +company = $company; + } + + /** + * Execute the job. + * + * + * @return void + */ + public function handle() + { + + MultiDB::setDb($this->company->db); + + $this->company + ->invoices() + ->where('is_deleted', 0) + ->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL]) + ->cursor() + ->each(function ($invoice){ + $invoice->service()->setReminder()->save(); + }); + + } + +} diff --git a/app/Repositories/ClientRepository.php b/app/Repositories/ClientRepository.php index 2d5e5f13710a..8f63d3f2fedc 100644 --- a/app/Repositories/ClientRepository.php +++ b/app/Repositories/ClientRepository.php @@ -82,31 +82,30 @@ class ClientRepository extends BaseRepository // $client->number = $this->getNextClientNumber($client); // $client->save(); - $x=1; + $x=1; - do{ + do{ - try{ + try{ - $client->number = $this->getNextClientNumber($client); - $client->saveQuietly(); + $client->number = $this->getNextClientNumber($client); + $client->saveQuietly(); - $this->completed = false; - + $this->completed = false; + - } - catch(QueryException $e){ - - $x++; - - if($x>10) - $this->completed = false; - } - } - while($this->completed); + catch(QueryException $e){ - + $x++; + + if($x>10) + $this->completed = false; + + } + + } + while($this->completed); } diff --git a/config/ninja.php b/config/ninja.php index bb03bc104043..08f79e716c7f 100644 --- a/config/ninja.php +++ b/config/ninja.php @@ -14,8 +14,8 @@ return [ 'require_https' => env('REQUIRE_HTTPS', true), 'app_url' => rtrim(env('APP_URL', ''), '/'), 'app_domain' => env('APP_DOMAIN', 'invoicing.co'), - 'app_version' => '5.3.88', - 'app_tag' => '5.3.88', + 'app_version' => '5.3.89', + 'app_tag' => '5.3.89', 'minimum_client_version' => '5.0.16', 'terms_version' => '1.0.1', 'api_secret' => env('API_SECRET', ''), diff --git a/routes/api.php b/routes/api.php index baa3f56494d0..fe04fbe3c2bf 100644 --- a/routes/api.php +++ b/routes/api.php @@ -105,7 +105,8 @@ Route::group(['middleware' => ['throttle:100,1', 'api_db', 'token_auth', 'locale Route::put('invoices/{invoice}/upload', 'InvoiceController@upload')->name('invoices.upload'); Route::get('invoice/{invitation_key}/download', 'InvoiceController@downloadPdf')->name('invoices.downloadPdf'); Route::post('invoices/bulk', 'InvoiceController@bulk')->name('invoices.bulk'); - + Route::post('invoices/update_reminders', 'InvoiceController@update_reminders')->name('invoices.update_reminders'); + Route::post('logout', 'LogoutController@index')->name('logout'); Route::post('migrate', 'MigrationController@index')->name('migrate.start');