diff --git a/app/Http/Middleware/SetInviteDb.php b/app/Http/Middleware/SetInviteDb.php
index 11bea4528342..a86fea3f0f69 100644
--- a/app/Http/Middleware/SetInviteDb.php
+++ b/app/Http/Middleware/SetInviteDb.php
@@ -13,6 +13,7 @@ namespace App\Http\Middleware;
use App\Libraries\MultiDB;
use Closure;
+use Hashids\Hashids;
use Illuminate\Http\Request;
use stdClass;
@@ -45,6 +46,30 @@ class SetInviteDb
if($entity == "pay")
$entity = "invoice";
+ /* Try and determine the DB from the invitation key STRING*/
+ if (config('ninja.db.multi_db_enabled')) {
+
+ // nlog("/ Try and determine the DB from the invitation key /");
+
+ $hashids = new Hashids(config('ninja.hash_salt'), 10);
+ $segments = explode('-', $request->route('invitation_key'));
+ $hashed_db = false;
+
+ if(is_array($segments)){
+ $hashed_db = $hashids->decode($segments[0]);
+ }
+
+ if(is_array($hashed_db)){
+
+ MultiDB::setDB(MultiDB::DB_PREFIX.str_pad($hashed_db[0], 2, '0', STR_PAD_LEFT));
+
+ return $next($request);
+
+ }
+
+ }
+
+ /* Attempt to set DB from invitatation key*/
if ($request->getSchemeAndHttpHost() && config('ninja.db.multi_db_enabled') && ! MultiDB::findAndSetDbByInvitation($entity, $request->route('invitation_key'))) {
if (request()->json) {
return response()->json($error, 403);
diff --git a/app/Jobs/Entity/CreateEntityPdf.php b/app/Jobs/Entity/CreateEntityPdf.php
index f545db11aadb..37f42a2fa149 100644
--- a/app/Jobs/Entity/CreateEntityPdf.php
+++ b/app/Jobs/Entity/CreateEntityPdf.php
@@ -101,7 +101,9 @@ class CreateEntityPdf implements ShouldQueue
public function handle()
{
-
+ $start = microtime(true);
+ nlog("Start ". $start);
+
/* Forget the singleton*/
App::forgetInstance('translator');
@@ -113,6 +115,9 @@ class CreateEntityPdf implements ShouldQueue
/* Set customized translations _NOW_ */
$t->replace(Ninja::transformTranslations($this->client->getMergedSettings()));
+ $translate = microtime(true);
+ nlog("Translate ". $translate - $start);
+
if (config('ninja.phantomjs_pdf_generation') || config('ninja.pdf_generator') == 'phantom') {
return (new Phantom)->generate($this->invitation);
}
@@ -148,6 +153,9 @@ class CreateEntityPdf implements ShouldQueue
$html = new HtmlEngine($this->invitation);
+ $design_time = microtime(true);
+ nlog("Design ". $design_time - $translate);
+
if ($design->is_custom) {
$options = [
'custom_partials' => json_decode(json_encode($design->design), true)
@@ -159,6 +167,9 @@ class CreateEntityPdf implements ShouldQueue
$variables = $html->generateLabelsAndValues();
+ $labels_time = microtime(true);
+ nlog("Labels ". $labels_time - $design_time);
+
$state = [
'template' => $template->elements([
'client' => $this->client,
@@ -181,6 +192,10 @@ class CreateEntityPdf implements ShouldQueue
->design($template)
->build();
+
+ $template_time = microtime(true);
+ nlog("Template Build ". $template_time - $labels_time);
+
$pdf = null;
try {
@@ -201,6 +216,9 @@ class CreateEntityPdf implements ShouldQueue
}
+ $pdf_time = microtime(true);
+ nlog("PDF time " . $pdf_time - $template_time);
+
if ($pdf) {
try{
diff --git a/app/Jobs/Quote/CreateQuoteInvitations.php b/app/Jobs/Quote/CreateQuoteInvitations.php
deleted file mode 100644
index f55ae6820131..000000000000
--- a/app/Jobs/Quote/CreateQuoteInvitations.php
+++ /dev/null
@@ -1,68 +0,0 @@
-quote = $quote;
-
- $this->company = $company;
- }
-
- public function handle()
- {
- MultiDB::setDB($this->company->db);
-
- $contacts = $this->quote->client->contacts;
-
- $contacts->each(function ($contact) {
- $invitation = QuoteInvitation::whereCompanyId($this->quote->company_id)
- ->whereClientContactId($contact->id)
- ->whereQuoteId($this->quote->id)
- ->first();
-
- if (! $invitation && $contact->send) {
- $ii = QuoteInvitationFactory::create($this->quote->company_id, $this->quote->user_id);
- $ii->quote_id = $this->quote->id;
- $ii->client_contact_id = $contact->id;
- $ii->save();
- } elseif ($invitation && ! $contact->send) {
- $invitation->delete();
- }
- });
- }
-}
diff --git a/app/Libraries/MultiDB.php b/app/Libraries/MultiDB.php
index 48d95d781d61..07d0cd0f7868 100644
--- a/app/Libraries/MultiDB.php
+++ b/app/Libraries/MultiDB.php
@@ -332,7 +332,7 @@ class MultiDB
$current_db = config('database.default');
foreach (self::$dbs as $db) {
- if ($invite = $class::on($db)->whereRaw('BINARY `key`= ?', [$invitation_key])->exists()) {
+ if ($invite = $class::on($db)->where('key', $invitation_key)->exists()) {
self::setDb($db);
return true;
}
diff --git a/app/Listeners/Credit/CreateCreditInvitation.php b/app/Listeners/Credit/CreateCreditInvitation.php
deleted file mode 100644
index 8e9af99e0dd4..000000000000
--- a/app/Listeners/Credit/CreateCreditInvitation.php
+++ /dev/null
@@ -1,51 +0,0 @@
-company->db);
-
- $credit = $event->credit;
-
- $contacts = $credit->client->contacts;
-
- $contacts->each(function ($contact) use ($credit) {
- $invitation = CreditInvitation::whereCompanyId($credit->company_id)
- ->whereClientContactId($contact->id)
- ->whereCreditId($credit->id)
- ->first();
-
- if (! $invitation && $contact->send_credit) {
- $ii = CreditInvitationFactory::create($credit->company_id, $credit->user_id);
- $ii->credit_id = $credit->id;
- $ii->client_contact_id = $contact->id;
- $ii->save();
- } elseif ($invitation && ! $contact->send_credit) {
- $invitation->delete();
- }
- });
- }
-}
diff --git a/app/Listeners/Invoice/CreateInvoiceInvitation.php b/app/Listeners/Invoice/CreateInvoiceInvitation.php
deleted file mode 100644
index d5f5de83e783..000000000000
--- a/app/Listeners/Invoice/CreateInvoiceInvitation.php
+++ /dev/null
@@ -1,51 +0,0 @@
-company->db);
-
- $invoice = $event->invoice;
-
- $contacts = $invoice->client->contacts;
-
- $contacts->each(function ($contact) use ($invoice) {
- $invitation = InvoiceInvitation::whereCompanyId($invoice->company_id)
- ->whereClientContactId($contact->id)
- ->whereInvoiceId($invoice->id)
- ->first();
-
- if (! $invitation && $contact->send) {
- $ii = InvoiceInvitationFactory::create($invoice->company_id, $invoice->user_id);
- $ii->invoice_id = $invoice->id;
- $ii->client_contact_id = $contact->id;
- $ii->save();
- } elseif ($invitation && ! $contact->send) {
- $invitation->delete();
- }
- });
- }
-}
diff --git a/app/Listeners/Quote/CreateQuoteInvitation.php b/app/Listeners/Quote/CreateQuoteInvitation.php
index b057e0874eb0..fa71ba6440a2 100644
--- a/app/Listeners/Quote/CreateQuoteInvitation.php
+++ b/app/Listeners/Quote/CreateQuoteInvitation.php
@@ -14,10 +14,13 @@ namespace App\Listeners\Quote;
use App\Factory\QuoteInvitationFactory;
use App\Libraries\MultiDB;
use App\Models\QuoteInvitation;
+use App\Utils\Traits\MakesHash;
use Illuminate\Contracts\Queue\ShouldQueue;
class CreateQuoteInvitation implements ShouldQueue
{
+ use MakesHash;
+
/**
* Handle the event.
*
@@ -40,6 +43,7 @@ class CreateQuoteInvitation implements ShouldQueue
if (! $invitation && $contact->send_credit) {
$ii = QuoteInvitationFactory::create($quote->company_id, $quote->user_id);
+ $ii->key = $this->createDbHash(config('database.default'));
$ii->quote_id = $quote->id;
$ii->client_contact_id = $contact->id;
$ii->save();
diff --git a/app/Mail/Engine/PaymentEmailEngine.php b/app/Mail/Engine/PaymentEmailEngine.php
index b0b7a43dabe2..f2fd269c42d6 100644
--- a/app/Mail/Engine/PaymentEmailEngine.php
+++ b/app/Mail/Engine/PaymentEmailEngine.php
@@ -239,10 +239,20 @@ class PaymentEmailEngine extends BaseEmailEngine
$data['$invoices'] = ['value' => $this->formatInvoices(), 'label' => ctrans('texts.invoices')];
$data['$invoice_references'] = ['value' => $this->formatInvoiceReferences(), 'label' => ctrans('texts.invoices')];
-
+ $data['$invoice'] = ['value' => $this->formatInvoice(), 'label' => ctrans('texts.invoices')];
return $data;
}
+ private function formatInvoice()
+ {
+ $invoice = '';
+
+ if($this->payment->invoices()->exists())
+ $invoice = ctrans('texts.invoice_number_short') . implode(",", $this->payment->invoices->pluck('number')->toArray());
+
+ return $invoice;
+ }
+
private function formatInvoices()
{
$invoice_list = '
';
diff --git a/app/Models/Presenters/CompanyPresenter.php b/app/Models/Presenters/CompanyPresenter.php
index 44dd0572275b..371c2312bcbf 100644
--- a/app/Models/Presenters/CompanyPresenter.php
+++ b/app/Models/Presenters/CompanyPresenter.php
@@ -72,7 +72,6 @@ class CompanyPresenter extends EntityPresenter
else
return "data:image/png;base64, ". base64_encode(file_get_contents(asset('images/new_logo.png'), false, stream_context_create($context_options)));
-
}
public function address($settings = null)
diff --git a/app/Services/Credit/CreateInvitations.php b/app/Services/Credit/CreateInvitations.php
index cadc297a4b80..498ba051c99d 100644
--- a/app/Services/Credit/CreateInvitations.php
+++ b/app/Services/Credit/CreateInvitations.php
@@ -16,10 +16,13 @@ use App\Factory\CreditInvitationFactory;
use App\Models\Credit;
use App\Models\CreditInvitation;
use App\Services\AbstractService;
+use App\Utils\Traits\MakesHash;
use Illuminate\Support\Str;
class CreateInvitations extends AbstractService
{
+ use MakesHash;
+
private $credit;
public function __construct(Credit $credit)
@@ -46,6 +49,7 @@ class CreateInvitations extends AbstractService
if (! $invitation) {
$ii = CreditInvitationFactory::create($this->credit->company_id, $this->credit->user_id);
+ $ii->key = $this->createDbHash(config('database.default'));
$ii->credit_id = $this->credit->id;
$ii->client_contact_id = $contact->id;
$ii->save();
diff --git a/app/Services/Invoice/CreateInvitations.php b/app/Services/Invoice/CreateInvitations.php
index 68955711aa66..00d45257c268 100644
--- a/app/Services/Invoice/CreateInvitations.php
+++ b/app/Services/Invoice/CreateInvitations.php
@@ -16,10 +16,13 @@ use App\Factory\InvoiceInvitationFactory;
use App\Models\Invoice;
use App\Models\InvoiceInvitation;
use App\Services\AbstractService;
+use App\Utils\Traits\MakesHash;
use Illuminate\Support\Str;
class CreateInvitations extends AbstractService
{
+ use MakesHash;
+
private $invoice;
public function __construct(Invoice $invoice)
@@ -48,6 +51,7 @@ class CreateInvitations extends AbstractService
if (! $invitation && $contact->send_email) {
$ii = InvoiceInvitationFactory::create($this->invoice->company_id, $this->invoice->user_id);
+ $ii->key = $this->createDbHash(config('database.default'));
$ii->invoice_id = $this->invoice->id;
$ii->client_contact_id = $contact->id;
$ii->save();
@@ -61,6 +65,7 @@ class CreateInvitations extends AbstractService
$contact = $this->createBlankContact();
$ii = InvoiceInvitationFactory::create($this->invoice->company_id, $this->invoice->user_id);
+ $ii->key = $this->createDbHash(config('database.default'));
$ii->invoice_id = $this->invoice->id;
$ii->client_contact_id = $contact->id;
$ii->save();
diff --git a/app/Services/PdfMaker/PdfMaker.php b/app/Services/PdfMaker/PdfMaker.php
index 55c600fe4480..ec492cf8e5a3 100644
--- a/app/Services/PdfMaker/PdfMaker.php
+++ b/app/Services/PdfMaker/PdfMaker.php
@@ -83,7 +83,7 @@ class PdfMaker
/**
* Final method to get compiled HTML.
*
- * @param bool $final @deprecated
+ * @param bool $final @deprecated // is it? i still see it being called elsewhere
* @return mixed
*/
public function getCompiledHTML($final = false)
diff --git a/app/Services/Quote/CreateInvitations.php b/app/Services/Quote/CreateInvitations.php
index b2e42395e088..e5da296d758c 100644
--- a/app/Services/Quote/CreateInvitations.php
+++ b/app/Services/Quote/CreateInvitations.php
@@ -15,10 +15,13 @@ use App\Factory\ClientContactFactory;
use App\Factory\QuoteInvitationFactory;
use App\Models\Quote;
use App\Models\QuoteInvitation;
+use App\Utils\Traits\MakesHash;
use Illuminate\Support\Str;
class CreateInvitations
{
+ use MakesHash;
+
public $quote;
public function __construct(Quote $quote)
@@ -47,6 +50,7 @@ class CreateInvitations
if (! $invitation && $contact->send_email) {
$ii = QuoteInvitationFactory::create($this->quote->company_id, $this->quote->user_id);
+ $ii->key = $this->createDbHash(config('database.default'));
$ii->quote_id = $this->quote->id;
$ii->client_contact_id = $contact->id;
$ii->save();
diff --git a/app/Services/Recurring/CreateRecurringInvitations.php b/app/Services/Recurring/CreateRecurringInvitations.php
index 4fe32521c05e..ae2692214a6c 100644
--- a/app/Services/Recurring/CreateRecurringInvitations.php
+++ b/app/Services/Recurring/CreateRecurringInvitations.php
@@ -12,11 +12,14 @@
namespace App\Services\Recurring;
use App\Services\AbstractService;
+use App\Utils\Traits\MakesHash;
use Exception;
use Illuminate\Support\Str;
class CreateRecurringInvitations extends AbstractService
{
+ use MakesHash;
+
private $entity;
private $entity_name;
@@ -48,6 +51,7 @@ class CreateRecurringInvitations extends AbstractService
if (! $invitation && $contact->send_email) {
$ii = $this->invitation_factory::create($this->entity->company_id, $this->entity->user_id);
+ $ii->key = $this->createDbHash(config('database.default'));
$ii->{$this->entity_id_name} = $this->entity->id;
$ii->client_contact_id = $contact->id;
$ii->save();
diff --git a/app/Utils/Traits/MakesReminders.php b/app/Utils/Traits/MakesReminders.php
index 9905379574bf..acd9a519ba31 100644
--- a/app/Utils/Traits/MakesReminders.php
+++ b/app/Utils/Traits/MakesReminders.php
@@ -77,9 +77,9 @@ trait MakesReminders
private function checkEndlessReminder($last_sent_date, $endless_reminder_frequency_id) :bool
{
- nlog("endless date match = ".$this->addTimeInterval($last_sent_date, $endless_reminder_frequency_id));
- nlog("Endless reminder bool = ");
- nlog(Carbon::now()->startOfDay()->eq($this->addTimeInterval($last_sent_date, $endless_reminder_frequency_id)));
+ // nlog("endless date match = ".$this->addTimeInterval($last_sent_date, $endless_reminder_frequency_id));
+ // nlog("Endless reminder bool = ");
+ // nlog(Carbon::now()->startOfDay()->eq($this->addTimeInterval($last_sent_date, $endless_reminder_frequency_id)));
if (Carbon::now()->startOfDay()->eq($this->addTimeInterval($last_sent_date, $endless_reminder_frequency_id))) {
return true;
diff --git a/config/ninja.php b/config/ninja.php
index f79b4b746fc6..a6fc87778173 100644
--- a/config/ninja.php
+++ b/config/ninja.php
@@ -21,7 +21,7 @@ return [
'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,
+ 'key_length' => 32,
'date_format' => 'Y-m-d',
'date_time_format' => 'Y-m-d H:i',
'daily_email_limit' => 300,
diff --git a/database/seeders/RandomDataSeeder.php b/database/seeders/RandomDataSeeder.php
index bfe3f30c4c47..167f1b0ee4e4 100644
--- a/database/seeders/RandomDataSeeder.php
+++ b/database/seeders/RandomDataSeeder.php
@@ -15,8 +15,6 @@ use App\DataMapper\CompanySettings;
use App\Events\Payment\PaymentWasCreated;
use App\Helpers\Invoice\InvoiceSum;
use App\Helpers\Invoice\InvoiceSumInclusive;
-use App\Listeners\Credit\CreateCreditInvitation;
-use App\Listeners\Invoice\CreateInvoiceInvitation;
use App\Models\Account;
use App\Models\Client;
use App\Models\ClientContact;
@@ -203,8 +201,6 @@ class RandomDataSeeder extends Seeder
$invoice->save();
- //event(new CreateInvoiceInvitation($invoice));
-
$invoice->service()->createInvitations()->markSent()->save();
$invoice->ledger()->updateInvoiceBalance($invoice->balance);
@@ -257,7 +253,6 @@ class RandomDataSeeder extends Seeder
$credit->save();
- //event(new CreateCreditInvitation($credit));
$credit->service()->createInvitations()->markSent()->save();
//$invoice->markSent()->save();
diff --git a/tests/Feature/InvitationTest.php b/tests/Feature/InvitationTest.php
index fe3eca5784a8..ccf4d5ea68bd 100644
--- a/tests/Feature/InvitationTest.php
+++ b/tests/Feature/InvitationTest.php
@@ -113,6 +113,7 @@ class InvitationTest extends TestCase
$this->assertNotNull($invoice->client->primary_contact);
$i = InvoiceInvitationFactory::create($invoice->company_id, $invoice->user_id);
+ $i->key = $this->createDbHash(config('database.default'));
$i->client_contact_id = $client->primary_contact->first()->id;
$i->invoice_id = $invoice->id;
$i->save();
diff --git a/tests/Feature/Payments/CreditPaymentTest.php b/tests/Feature/Payments/CreditPaymentTest.php
index 7414001a6fcb..edc2b7b87b0b 100644
--- a/tests/Feature/Payments/CreditPaymentTest.php
+++ b/tests/Feature/Payments/CreditPaymentTest.php
@@ -8,7 +8,7 @@
*
* @license https://opensource.org/licenses/AAL
*/
-namespace Tests\Feature;
+namespace Tests\Feature\Payments;
use App\DataMapper\ClientSettings;
use App\Factory\ClientFactory;
diff --git a/tests/MockAccountData.php b/tests/MockAccountData.php
index e6c955aa0b47..5c2fd1066bc2 100644
--- a/tests/MockAccountData.php
+++ b/tests/MockAccountData.php
@@ -487,6 +487,7 @@ trait MockAccountData
if (! $invitation && $contact->send_email) {
$ii = InvoiceInvitationFactory::create($this->invoice->company_id, $this->invoice->user_id);
+ $ii->key = $this->createDbHash(config('database.default'));
$ii->invoice_id = $this->invoice->id;
$ii->client_contact_id = $contact->id;
$ii->save();
diff --git a/tests/Unit/InvitationTest.php b/tests/Unit/InvitationTest.php
index f5a0fbd01f5f..e8dcdb96f34e 100644
--- a/tests/Unit/InvitationTest.php
+++ b/tests/Unit/InvitationTest.php
@@ -12,6 +12,7 @@ namespace Tests\Unit;
use App\Factory\InvoiceInvitationFactory;
use App\Models\CompanyToken;
+use App\Utils\Traits\MakesHash;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Routing\Middleware\ThrottleRequests;
use Illuminate\Validation\ValidationException;
@@ -22,7 +23,8 @@ class InvitationTest extends TestCase
{
use MockAccountData;
use DatabaseTransactions;
-
+ use MakesHash;
+
public function setUp() :void
{
parent::setUp();
@@ -79,6 +81,7 @@ class InvitationTest extends TestCase
$new_invite = InvoiceInvitationFactory::create($this->invoice->company_id, $this->invoice->user_id);
$new_invite->client_contact_id = $contact->hashed_id;
+ $new_invite->key = $this->createDbHash(config('database.default'));
$invitations = $this->invoice->invitations()->get();