From 87ddad667036d73fcadb5cd7dca1fee88e98911b Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 9 May 2021 21:30:31 +1000 Subject: [PATCH 1/3] Working on PDF generator flags --- .env.example | 6 ++++-- app/Http/Controllers/ActivityController.php | 4 ++-- app/Http/Controllers/PreviewController.php | 4 ++-- app/Jobs/Entity/CreateEntityPdf.php | 4 ++-- app/Services/Invoice/GenerateDeliveryNote.php | 4 ++-- app/Utils/SystemHealth.php | 2 ++ config/ninja.php | 3 ++- tests/Unit/InvitationTest.php | 1 - 8 files changed, 16 insertions(+), 12 deletions(-) diff --git a/.env.example b/.env.example index 9f8319b007..f84708528e 100644 --- a/.env.example +++ b/.env.example @@ -51,11 +51,13 @@ TRUSTED_PROXIES= NINJA_ENVIRONMENT=selfhost -PHANTOMJS_PDF_GENERATION=true +#options - snappdf / phantom / hosted_ninja +PDF_GENERATOR=phantom + PHANTOMJS_KEY='a-demo-key-with-low-quota-per-ip-address' PHANTOMJS_SECRET=secret -UPDATE_SECRET= +UPDATE_SECRET=secret COMPOSER_AUTH='{"github-oauth": {"github.com": "${{ secrets.GITHUB_TOKEN }}"}}' SENTRY_LARAVEL_DSN=https://cc7e8e2c678041689e53e409b7dba236@sentry.invoicing.co/5 \ No newline at end of file diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php index 4f85449878..0a7c8d2b19 100644 --- a/app/Http/Controllers/ActivityController.php +++ b/app/Http/Controllers/ActivityController.php @@ -141,10 +141,10 @@ class ActivityController extends BaseController return response()->json(['message'=> ctrans('texts.no_backup_exists'), 'errors' => new stdClass], 404); } - if (config('ninja.phantomjs_pdf_generation')) { + if (config('ninja.phantomjs_pdf_generation') || config('ninja.pdf_generator') == 'phantom') { $pdf = (new Phantom)->convertHtmlToPdf($backup->html_backup); } - elseif(config('ninja.invoiceninja_hosted_pdf_generation')){ + elseif(config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja'){ $pdf = (new NinjaPdf())->build($backup->html_backup); } else { diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index 70c21a9554..d15bd37fff 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -131,11 +131,11 @@ class PreviewController extends BaseController } //if phantom js...... inject here.. - if (config('ninja.phantomjs_pdf_generation')) { + if (config('ninja.phantomjs_pdf_generation') || config('ninja.pdf_generator') == 'phantom') { return (new Phantom)->convertHtmlToPdf($maker->getCompiledHTML(true)); } - if(config('ninja.invoiceninja_hosted_pdf_generation')){ + if(config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja'){ return (new NinjaPdf())->build($maker->getCompiledHTML(true)); } diff --git a/app/Jobs/Entity/CreateEntityPdf.php b/app/Jobs/Entity/CreateEntityPdf.php index 0677062273..6fd777da27 100644 --- a/app/Jobs/Entity/CreateEntityPdf.php +++ b/app/Jobs/Entity/CreateEntityPdf.php @@ -105,7 +105,7 @@ class CreateEntityPdf implements ShouldQueue $this->entity->service()->deletePdf(); - if (config('ninja.phantomjs_pdf_generation')) { + if (config('ninja.phantomjs_pdf_generation') || config('ninja.pdf_generator') == 'phantom') { return (new Phantom)->generate($this->invitation); } @@ -171,7 +171,7 @@ class CreateEntityPdf implements ShouldQueue try { - if(config('ninja.invoiceninja_hosted_pdf_generation')){ + if(config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja'){ $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); } else { diff --git a/app/Services/Invoice/GenerateDeliveryNote.php b/app/Services/Invoice/GenerateDeliveryNote.php index 581a5da1fa..b6c93fa494 100644 --- a/app/Services/Invoice/GenerateDeliveryNote.php +++ b/app/Services/Invoice/GenerateDeliveryNote.php @@ -60,7 +60,7 @@ class GenerateDeliveryNote $file_path = sprintf('%s%s_delivery_note.pdf', $this->invoice->client->invoice_filepath(), $this->invoice->number); - if (config('ninja.phantomjs_pdf_generation')) { + if (config('ninja.phantomjs_pdf_generation') || config('ninja.pdf_generator') == 'phantom') { return (new Phantom)->generate($this->invoice->invitations->first()); } @@ -92,7 +92,7 @@ class GenerateDeliveryNote // Storage::makeDirectory($this->invoice->client->invoice_filepath(), 0775); - if(config('ninja.invoiceninja_hosted_pdf_generation')){ + if(config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja'){ $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); } else { diff --git a/app/Utils/SystemHealth.php b/app/Utils/SystemHealth.php index b130585ac2..552d580df4 100644 --- a/app/Utils/SystemHealth.php +++ b/app/Utils/SystemHealth.php @@ -17,6 +17,7 @@ use Exception; use Illuminate\Support\Arr; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Mail; +use Illuminate\Support\Facades\Queue; /** * Class SystemHealth. @@ -80,6 +81,7 @@ class SystemHealth 'open_basedir' => (bool)self::checkOpenBaseDir(), 'mail_mailer' => (string)self::checkMailMailer(), 'flutter_renderer' => (string)config('ninja.flutter_canvas_kit'), + 'jobs_pending' => (int) Queue::size(), ]; } diff --git a/config/ninja.php b/config/ninja.php index c6fa1d9b89..4c7da8e806 100644 --- a/config/ninja.php +++ b/config/ninja.php @@ -18,7 +18,7 @@ return [ 'app_tag' => '5.1.61-release', 'minimum_client_version' => '5.0.16', 'terms_version' => '1.0.1', - 'api_secret' => env('API_SECRET', false), + 'api_secret' => env('API_SECRET', ''), 'google_maps_api_key' => env('GOOGLE_MAPS_API_KEY'), 'google_analytics_url' => env('GOOGLE_ANALYTICS_URL', 'https://www.google-analytics.com/collect'), 'key_length' => 64, @@ -148,4 +148,5 @@ return [ 'disable_auto_update' => env('DISABLE_AUTO_UPDATE', false), 'invoiceninja_hosted_pdf_generation' => env('NINJA_HOSTED_PDF', false), 'ninja_stripe_key' => env('NINJA_STRIPE_KEY', null), + 'pdf_generator' => env('PDF_GENERATOR', false), ]; diff --git a/tests/Unit/InvitationTest.php b/tests/Unit/InvitationTest.php index 0bee7f83e1..c66cfbafc8 100644 --- a/tests/Unit/InvitationTest.php +++ b/tests/Unit/InvitationTest.php @@ -52,7 +52,6 @@ class InvitationTest extends TestCase try { $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->put('/api/v1/invoices/'.$this->encodePrimaryKey($this->invoice->id), $this->invoice->toArray()); } catch (\Exception $e) { From 7808b4c30d299704dabf4f37bf0cdc5eebd4c04a Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 10 May 2021 09:52:58 +1000 Subject: [PATCH 2/3] Fixes for created_at dates in migration --- app/Http/Controllers/MigrationController.php | 14 +++-- app/Http/Controllers/SelfUpdateController.php | 1 - app/Jobs/Util/Import.php | 59 ++++++++++++++++--- app/Jobs/Util/SchedulerCheck.php | 1 - app/Jobs/Util/StartMigration.php | 26 +++++++- app/Repositories/BaseRepository.php | 5 -- .../Migration/InvoiceMigrationRepository.php | 21 +++++-- app/Utils/Traits/AppSetup.php | 2 +- 8 files changed, 101 insertions(+), 28 deletions(-) diff --git a/app/Http/Controllers/MigrationController.php b/app/Http/Controllers/MigrationController.php index c554a657e8..92130a3374 100644 --- a/app/Http/Controllers/MigrationController.php +++ b/app/Http/Controllers/MigrationController.php @@ -21,6 +21,7 @@ use App\Mail\ExistingMigration; use App\Mail\Migration\MaxCompanies; use App\Models\Company; use App\Models\CompanyToken; +use App\Utils\Ninja; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Http\Request; use Illuminate\Support\Str; @@ -378,14 +379,15 @@ class MigrationController extends BaseController return; } - // try { - // StartMigration::dispatch(base_path("storage/app/public/$migration_file"), $user, $fresh_company)->delay(now()->addSeconds(5)); nlog("starting migration job"); nlog($migration_file); - StartMigration::dispatch($migration_file, $user, $fresh_company)->onQueue('migration'); - // } catch (\Exception $e) { - // nlog($e->getMessage()); - // } + + if(Ninja::isHosted()) + StartMigration::dispatch($migration_file, $user, $fresh_company)->onQueue('migration'); + else + StartMigration::dispatch($migration_file, $user, $fresh_company); + + } } diff --git a/app/Http/Controllers/SelfUpdateController.php b/app/Http/Controllers/SelfUpdateController.php index 4955cda39b..2fab7b5a12 100644 --- a/app/Http/Controllers/SelfUpdateController.php +++ b/app/Http/Controllers/SelfUpdateController.php @@ -79,7 +79,6 @@ class SelfUpdateController extends BaseController if (file_exists($cacheServices)) { unlink ($cacheServices); } Artisan::call('clear-compiled'); - Artisan::call('cache:clear'); Artisan::call('route:clear'); Artisan::call('view:clear'); Artisan::call('config:clear'); diff --git a/app/Jobs/Util/Import.php b/app/Jobs/Util/Import.php index 66d4897a8e..a1fca23817 100644 --- a/app/Jobs/Util/Import.php +++ b/app/Jobs/Util/Import.php @@ -83,6 +83,7 @@ use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Http\UploadedFile; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; +use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Validator; use Illuminate\Support\Str; @@ -461,6 +462,8 @@ class Import implements ShouldQueue private function checkUniqueConstraint($model, $column, $value) { + $value = trim($value); + $model_query = (new $model()) ->query() ->where($column, $value) @@ -503,10 +506,10 @@ class Import implements ShouldQueue ); if(array_key_exists('created_at', $modified)) - $client->created_at = $modified['created_at']; + $client->created_at = Carbon::parse($modified['created_at']); if(array_key_exists('updated_at', $modified)) - $client->updated_at = $modified['updated_at']; + $client->updated_at = Carbon::parse($modified['updated_at']); $client->save(['timestamps' => false]); @@ -583,6 +586,12 @@ class Import implements ShouldQueue unset($modified['id']); unset($modified['contacts']); + if(array_key_exists('created_at', $modified)) + $modified['created_at'] = Carbon::parse($modified['created_at']); + + if(array_key_exists('updated_at', $modified)) + $modified['updated_at'] = Carbon::parse($modified['updated_at']); + $vendor = $vendor_repository->save( $modified, VendorFactory::create( @@ -650,6 +659,12 @@ class Import implements ShouldQueue $modified['company_id'] = $this->company->id; $modified['user_id'] = $this->processUserId($resource); + if(array_key_exists('created_at', $modified)) + $modified['created_at'] = Carbon::parse($modified['created_at']); + + if(array_key_exists('updated_at', $modified)) + $modified['updated_at'] = Carbon::parse($modified['updated_at']); + unset($modified['id']); $product_repository->save( @@ -696,6 +711,12 @@ class Import implements ShouldQueue $modified['company_id'] = $this->company->id; $modified['line_items'] = $this->cleanItems($modified['line_items']); + if(array_key_exists('created_at', $modified)) + $modified['created_at'] = Carbon::parse($modified['created_at']); + + if(array_key_exists('updated_at', $modified)) + $modified['updated_at'] = Carbon::parse($modified['updated_at']); + unset($modified['id']); if (array_key_exists('invitations', $resource)) { @@ -832,6 +853,12 @@ class Import implements ShouldQueue $modified['user_id'] = $this->processUserId($resource); $modified['company_id'] = $this->company->id; + if(array_key_exists('created_at', $modified)) + $modified['created_at'] = Carbon::parse($modified['created_at']); + + if(array_key_exists('updated_at', $modified)) + $modified['updated_at'] = Carbon::parse($modified['updated_at']); + unset($modified['id']); $credit = $credit_repository->save( @@ -891,6 +918,18 @@ class Import implements ShouldQueue $modified['company_id'] = $this->company->id; + if(array_key_exists('created_at', $modified)) + $modified['created_at'] = Carbon::parse($modified['created_at']); + + if(array_key_exists('updated_at', $modified)) + $modified['updated_at'] = Carbon::parse($modified['updated_at']); + + if(array_key_exists('tax_rate1', $modified) && is_null($modified['tax_rate1'])) + $modified['tax_rate1'] = 0; + + if(array_key_exists('tax_rate2', $modified) && is_null($modified['tax_rate2'])) + $modified['tax_rate2'] = 0; + unset($modified['id']); @@ -988,10 +1027,10 @@ class Import implements ShouldQueue ); if(array_key_exists('created_at', $modified)) - $payment->created_at = $modified['created_at']; + $payment->created_at = Carbon::parse($modified['created_at']); if(array_key_exists('updated_at', $modified)) - $payment->updated_at = $modified['updated_at']; + $payment->updated_at = Carbon::parse($modified['updated_at']); $payment->save(['timestamps' => false]); @@ -1358,10 +1397,12 @@ class Import implements ShouldQueue $task = Task::Create($modified); if(array_key_exists('created_at', $modified)) - $task->created_at = $modified['created_at']; + $task->created_at = Carbon::parse($modified['created_at']); if(array_key_exists('updated_at', $modified)) - $task->updated_at = $modified['updated_at']; + $task->updated_at = Carbon::parse($modified['updated_at']); + + $task->save(['timestamps' => false]); @@ -1446,10 +1487,12 @@ class Import implements ShouldQueue $expense = Expense::Create($modified); if(array_key_exists('created_at', $modified)) - $expense->created_at = $modified['created_at']; + $expense->created_at = Carbon::parse($modified['created_at']); if(array_key_exists('updated_at', $modified)) - $expense->updated_at = $modified['updated_at']; + $expense->updated_at = Carbon::parse($modified['updated_at']); + + $expense->save(['timestamps' => false]); diff --git a/app/Jobs/Util/SchedulerCheck.php b/app/Jobs/Util/SchedulerCheck.php index c96be09f00..adeb4e0160 100644 --- a/app/Jobs/Util/SchedulerCheck.php +++ b/app/Jobs/Util/SchedulerCheck.php @@ -53,7 +53,6 @@ class SchedulerCheck implements ShouldQueue try { Artisan::call('clear-compiled'); - Artisan::call('cache:clear'); Artisan::call('route:clear'); Artisan::call('config:cache'); } catch (\Exception $e) { diff --git a/app/Jobs/Util/StartMigration.php b/app/Jobs/Util/StartMigration.php index e26c7462ed..ab2e7d6cdb 100644 --- a/app/Jobs/Util/StartMigration.php +++ b/app/Jobs/Util/StartMigration.php @@ -91,6 +91,21 @@ class StartMigration implements ShouldQueue $archive = $zip->open(public_path("storage/{$this->filepath}")); $filename = pathinfo($this->filepath, PATHINFO_FILENAME); + if($this->company->id == $this->company->account->default_company_id) + { + $new_default_company = $this->company->account->companies->first(); + + if ($new_default_company) { + $this->company->account->default_company_id = $new_default_company->id; + $this->company->account->save(); + } + } + + $update_product_flag = $this->company->update_products; + + $this->company->update_products = false; + $this->company->save(); + try { if (! $archive) { throw new ProcessingMigrationArchiveFailed('Processing migration archive failed. Migration file is possibly corrupted.'); @@ -113,7 +128,16 @@ class StartMigration implements ShouldQueue Storage::deleteDirectory(public_path("storage/migrations/{$filename}")); - } catch (NonExistingMigrationFile | ProcessingMigrationArchiveFailed | ResourceNotAvailableForMigration | MigrationValidatorFailed | ResourceDependencyMissing $e) { + $this->company->account->default_company_id = $this->company->id; + $this->company->account->save(); + + $this->company->update_products = $update_product_flag; + $this->company->save(); + + } catch (NonExistingMigrationFile | ProcessingMigrationArchiveFailed | ResourceNotAvailableForMigration | MigrationValidatorFailed | ResourceDependencyMissing | \Exception $e) { + + $this->company->update_products = $update_product_flag; + $this->company->save(); Mail::to($this->user)->send(new MigrationFailed($e, $e->getMessage())); diff --git a/app/Repositories/BaseRepository.php b/app/Repositories/BaseRepository.php index 9cafb79bfb..b5062a061b 100644 --- a/app/Repositories/BaseRepository.php +++ b/app/Repositories/BaseRepository.php @@ -302,11 +302,6 @@ class BaseRepository /* Perform model specific tasks */ if ($model instanceof Invoice) { -nlog("in base"); -nlog($state['finished_amount']); -nlog($state['starting_amount']); -nlog($model->status_id); - if (($state['finished_amount'] != $state['starting_amount']) && ($model->status_id != Invoice::STATUS_DRAFT)) { $model->service()->updateStatus()->save(); diff --git a/app/Repositories/Migration/InvoiceMigrationRepository.php b/app/Repositories/Migration/InvoiceMigrationRepository.php index ee142650f2..76406cdd52 100644 --- a/app/Repositories/Migration/InvoiceMigrationRepository.php +++ b/app/Repositories/Migration/InvoiceMigrationRepository.php @@ -23,6 +23,7 @@ use App\Models\RecurringInvoiceInvitation; use App\Repositories\BaseRepository; use App\Utils\Traits\MakesHash; use App\Utils\Traits\SavesDocuments; +use Illuminate\Support\Carbon; use ReflectionClass; /** @@ -59,6 +60,12 @@ class InvoiceMigrationRepository extends BaseRepository $tmp_data = $data; + if(array_key_exists('tax_rate1', $tmp_data) && is_null($tmp_data['tax_rate1'])) + $tmp_data['tax_rate1'] = 0; + + if(array_key_exists('tax_rate2', $tmp_data) && is_null($tmp_data['tax_rate2'])) + $tmp_data['tax_rate2'] = 0; + /* We need to unset some variable as we sometimes unguard the model */ if (isset($tmp_data['invitations'])) { @@ -71,7 +78,15 @@ class InvoiceMigrationRepository extends BaseRepository $model->fill($tmp_data); $model->status_id = $tmp_data['status_id']; - $model->save(); + + if($tmp_data['created_at']) + $model->created_at = Carbon::parse($tmp_data['created_at']); + + if($tmp_data['updated_at']) + $model->updated_at = Carbon::parse($tmp_data['updated_at']); + + $model->save(['timestamps' => false]); + if (array_key_exists('documents', $data)) { $this->saveDocuments($data['documents'], $model); @@ -130,10 +145,6 @@ class InvoiceMigrationRepository extends BaseRepository $model->design_id = $this->decodePrimaryKey($client->getSetting('invoice_design_id')); } - - if ($model->company->update_products) { - //UpdateOrCreateProduct::dispatchNow($model->line_items, $model, $model->company); - } } if ($class->name == Credit::class) { diff --git a/app/Utils/Traits/AppSetup.php b/app/Utils/Traits/AppSetup.php index 4b316b3dfe..fbe079e39f 100644 --- a/app/Utils/Traits/AppSetup.php +++ b/app/Utils/Traits/AppSetup.php @@ -54,7 +54,7 @@ trait AppSetup $orderBy = 'id'; } $tableData = $class::orderBy($orderBy)->get(); - if ($tableData->count()) { + if ($tableData->count() > 1) { Cache::forever($name, $tableData); } } From cd694869afc77147ec484a80469d27ce2844d41e Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 10 May 2021 10:04:30 +1000 Subject: [PATCH 3/3] Fixes for stripe connect --- routes/api.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routes/api.php b/routes/api.php index 2e84a7977c..c690fd9409 100644 --- a/routes/api.php +++ b/routes/api.php @@ -197,8 +197,8 @@ Route::get('token_hash_router', 'OneTimeTokenController@router'); Route::get('webcron', 'WebCronController@index'); Route::group(['middleware' => ['locale']], function () { - Route::get('stripe_connect/{token}', 'StripeConnectController@initialize')->name('stripe_connect.initialization'); - Route::get('stripe_connect/completed', 'StripeConnectController@completed')->name('stripe_connect.return'); + Route::get('stripe/signup/{token}', 'StripeConnectController@initialize')->name('stripe_connect.initialization'); + Route::get('stripe/signup/completed', 'StripeConnectController@completed')->name('stripe_connect.return'); }); Route::fallback('BaseController@notFound');