diff --git a/app/Factory/RecurringExpenseToExpenseFactory.php b/app/Factory/RecurringExpenseToExpenseFactory.php index bd8bc6516414..466baea038e9 100644 --- a/app/Factory/RecurringExpenseToExpenseFactory.php +++ b/app/Factory/RecurringExpenseToExpenseFactory.php @@ -51,9 +51,9 @@ class RecurringExpenseToExpenseFactory $expense->payment_type_id = $recurring_expense->payment_type_id; $expense->project_id = $recurring_expense->project_id; $expense->invoice_documents = $recurring_expense->invoice_documents; - $expense->tax_amount1 = $recurring_expense->tax_amount1; - $expense->tax_amount2 = $recurring_expense->tax_amount2; - $expense->tax_amount3 = $recurring_expense->tax_amount3; + $expense->tax_amount1 = $recurring_expense->tax_amount1 ?: 0; + $expense->tax_amount2 = $recurring_expense->tax_amount2 ?: 0; + $expense->tax_amount3 = $recurring_expense->tax_amount3 ?: 0; $expense->uses_inclusive_taxes = $recurring_expense->uses_inclusive_taxes; $expense->calculate_tax_by_amount = $recurring_expense->calculate_tax_by_amount; diff --git a/app/Http/Controllers/ClientPortal/InvitationController.php b/app/Http/Controllers/ClientPortal/InvitationController.php index bf72b36a0c84..750af7ee433a 100644 --- a/app/Http/Controllers/ClientPortal/InvitationController.php +++ b/app/Http/Controllers/ClientPortal/InvitationController.php @@ -80,7 +80,10 @@ class InvitationController extends Controller $query->where('is_deleted',0); }) ->with('contact.client') - ->firstOrFail(); + ->first(); + + if(!$invitation) + return abort(404,'The resource is no longer available.'); /* Return early if we have the correct client_hash embedded */ $client_contact = $invitation->contact; diff --git a/app/Http/Controllers/HostedMigrationController.php b/app/Http/Controllers/HostedMigrationController.php index 7415dca2395b..5f93b63c614f 100644 --- a/app/Http/Controllers/HostedMigrationController.php +++ b/app/Http/Controllers/HostedMigrationController.php @@ -13,8 +13,12 @@ namespace App\Http\Controllers; use App\Jobs\Account\CreateAccount; use App\Libraries\MultiDB; +use App\Models\Client; +use App\Models\ClientContact; +use App\Models\Company; use App\Models\CompanyToken; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Artisan; class HostedMigrationController extends Controller { @@ -49,4 +53,39 @@ class HostedMigrationController extends Controller } + public function confirmForwarding(Request $request) + { + if($request->header('X-API-HOSTED-SECRET') != config('ninja.ninja_hosted_secret')) + return; + + $input = $request->all(); + + MultiDB::findAndSetDbByCompanyKey($input['account_key']); + + $company = Company::with('account')->where('company_key', $input['account_key'])->first(); + $account = $company->account; + $client_id = false; + + if($contact = ClientContact::on('db-ninja-01')->where(['email' => $input['email'], 'company_id' => config('ninja.ninja_default_company_id')])->first()){ + $client_id = $contact->client_id; + } + else if($client = Client::on('db-ninja-01')->where(['custom_value2' => $account->key, 'company_id' => config('ninja.ninja_default_company_id')])->first()){ + $client_id = $client->id; + } + + //get ninja client_id; + + if(strlen($input['gateway_reference']) >1 && $client_id){ + + Artisan::call('ninja:add-token', [ + '--customer' => $input['gateway_reference'], '--client_id' => 1 + ]); + + } + + $forward_url = $company->domain(); + + return response()->json(['forward_url' => $forward_url], 200); + } + } \ No newline at end of file diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index c2889d2bd9b5..e99929a25349 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -522,6 +522,9 @@ class InvoiceController extends BaseController $ids = request()->input('ids'); +nlog($action); +nlog($ids); + $invoices = Invoice::withTrashed()->whereIn('id', $this->transformKeys($ids))->company()->get(); if (! $invoices) { @@ -532,13 +535,14 @@ class InvoiceController extends BaseController * Download Invoice/s */ - if ($action == 'download' && $invoices->count() > 1) { + if ($action == 'bulk_download' && $invoices->count() > 1) { $invoices->each(function ($invoice) { if (auth()->user()->cannot('view', $invoice)) { + nlog("access denied"); return response()->json(['message' => ctrans('text.access_denied')]); } }); - +nlog("bulky"); ZipInvoices::dispatch($invoices, $invoices->first()->company, auth()->user()); return response()->json(['message' => ctrans('texts.sent_message')], 200); @@ -713,13 +717,13 @@ class InvoiceController extends BaseController $this->itemResponse($invoice); } break; - case 'reverse': - $invoice = $invoice->service()->handleReversal()->deletePdf()->save(); + // case 'reverse': + // $invoice = $invoice->service()->handleReversal()->deletePdf()->save(); - if (! $bulk) { - $this->itemResponse($invoice); - } - break; + // if (! $bulk) { + // $this->itemResponse($invoice); + // } + // break; case 'email': //check query parameter for email_type and set the template else use calculateTemplate diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index 19489a4b7da5..153f76a656ae 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -217,8 +217,6 @@ class PreviewController extends BaseController if(!$request->has('entity_id')) $entity_obj->service()->fillDefaults()->save(); - // $entity_obj->load('client.contacts','client.company'); - App::forgetInstance('translator'); $t = app('translator'); App::setLocale($entity_obj->client->locale()); diff --git a/app/Http/Controllers/SubdomainController.php b/app/Http/Controllers/SubdomainController.php index 153c12b91d60..2239cec64b2f 100644 --- a/app/Http/Controllers/SubdomainController.php +++ b/app/Http/Controllers/SubdomainController.php @@ -31,6 +31,7 @@ class SubdomainController extends BaseController 'cname', 'sandbox', 'stage', + 'html', ]; public function __construct() diff --git a/app/Http/Livewire/BillingPortalPurchase.php b/app/Http/Livewire/BillingPortalPurchase.php index 9586ae7a9ee2..fe4fee314a46 100644 --- a/app/Http/Livewire/BillingPortalPurchase.php +++ b/app/Http/Livewire/BillingPortalPurchase.php @@ -26,6 +26,8 @@ use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Str; +use App\DataMapper\ClientSettings; use Livewire\Component; class BillingPortalPurchase extends Component @@ -241,7 +243,8 @@ class BillingPortalPurchase extends Component 'contacts' => [ ['email' => $this->email], ], - 'settings' => [], + 'client_hash' => Str::random(40), + 'settings' => ClientSettings::defaults(), ]; foreach ($this->request_data as $field => $value) { diff --git a/app/Http/Middleware/SetInviteDb.php b/app/Http/Middleware/SetInviteDb.php index a165fda3a4fa..4b8e8cdcbfe9 100644 --- a/app/Http/Middleware/SetInviteDb.php +++ b/app/Http/Middleware/SetInviteDb.php @@ -74,7 +74,7 @@ class SetInviteDb if (request()->json) { return response()->json($error, 403); } else { - abort(404,'I could not find the database for this object.'); + abort(404,'I could not find this resource.'); } } diff --git a/app/Http/ValidationRules/Ninja/CanAddUserRule.php b/app/Http/ValidationRules/Ninja/CanAddUserRule.php index 1c85687bf31c..6333edf1abe6 100644 --- a/app/Http/ValidationRules/Ninja/CanAddUserRule.php +++ b/app/Http/ValidationRules/Ninja/CanAddUserRule.php @@ -33,25 +33,16 @@ class CanAddUserRule implements Rule public function passes($attribute, $value) { - // $count = CompanyUser::query() - // ->with('user') - // ->where('account_id', auth()->user()->account_id) - // ->distinct() - // ->select('user_id') - // ->count(); - - - $count = User::query() - ->with(['company_user' => function ($query){ - return $query->whereNull('company_user.deleted_at'); - }]) - ->where('account_id', auth()->user()->account_id) - ->distinct() - ->select('users.id') - ->count(); + $count = CompanyUser::query() + ->where('company_user.account_id', auth()->user()->account_id) + ->join('users', 'users.id', '=', 'company_user.user_id') + ->whereNull('users.deleted_at') + ->whereNull('company_user.deleted_at') + ->distinct() + ->count('company_user.user_id'); return $count < auth()->user()->company()->account->num_users; - //return auth()->user()->company()->account->users->count() < auth()->user()->company()->account->num_users; + } /** diff --git a/app/Http/ValidationRules/Ninja/CanRestoreUserRule.php b/app/Http/ValidationRules/Ninja/CanRestoreUserRule.php index 45bf5ec7f351..c04676b6e09a 100644 --- a/app/Http/ValidationRules/Ninja/CanRestoreUserRule.php +++ b/app/Http/ValidationRules/Ninja/CanRestoreUserRule.php @@ -33,17 +33,16 @@ class CanRestoreUserRule implements Rule public function passes($attribute, $value) { - $count = User::query() - ->with(['company_user' => function ($query){ - return $query->whereNull('company_user.deleted_at'); - }]) - ->where('account_id', 1) - ->distinct() - ->select('users.id') - ->count(); + $count = CompanyUser::query() + ->where('company_user.account_id', auth()->user()->account_id) + ->join('users', 'users.id', '=', 'company_user.user_id') + ->whereNull('users.deleted_at') + ->whereNull('company_user.deleted_at') + ->distinct() + ->count('company_user.user_id'); return $count < auth()->user()->company()->account->num_users; - //return auth()->user()->company()->account->users->count() < auth()->user()->company()->account->num_users; + } /** diff --git a/app/Http/ValidationRules/Project/ValidProjectForClient.php b/app/Http/ValidationRules/Project/ValidProjectForClient.php index 9030c5985e5d..410348a9254e 100644 --- a/app/Http/ValidationRules/Project/ValidProjectForClient.php +++ b/app/Http/ValidationRules/Project/ValidProjectForClient.php @@ -24,6 +24,8 @@ class ValidProjectForClient implements Rule public $input; + public $message; + public function __construct($input) { $this->input = $input; @@ -35,15 +37,20 @@ class ValidProjectForClient implements Rule */ public function passes($attribute, $value) { + $this->message = ctrans('texts.project_client_do_not_match'); + if (empty($this->input['project_id'])) { return true; } - if (is_string($this->input['project_id'])) { - $this->input['project_id'] = $this->decodePrimaryKey($this->input['project_id']); - } + // if (is_string($this->input['project_id'])) { + // $this->input['project_id'] = $this->decodePrimaryKey($this->input['project_id']); + // } - $project = Project::findOrFail($this->input['project_id']); + $project = Project::find($this->input['project_id']); + + if(!$project) + $this->message = "Project not found"; return $project->client_id == $this->input['client_id']; } @@ -53,6 +60,6 @@ class ValidProjectForClient implements Rule */ public function message() { - return ctrans('texts.project_client_do_not_match'); + return $this->message; } } diff --git a/app/Jobs/Company/CompanyImport.php b/app/Jobs/Company/CompanyImport.php index 33c11acaa65b..605614b36367 100644 --- a/app/Jobs/Company/CompanyImport.php +++ b/app/Jobs/Company/CompanyImport.php @@ -338,14 +338,14 @@ class CompanyImport implements ShouldQueue if($this->account->plan == 'enterprise'){ - $total_import_users = count($backup_users_emails); + // $total_import_users = count($backup_users_emails); - $account_plan_num_user = $this->account->num_users; + // $account_plan_num_user = $this->account->num_users; - if($total_import_users > $account_plan_num_user){ - $this->message = "Total user count ({$total_import_users}) greater than your plan allows ({$account_plan_num_user})"; - $this->pre_flight_checks_pass = false; - } + // if($total_import_users > $account_plan_num_user){ + // $this->message = "Total user count ({$total_import_users}) greater than your plan allows ({$account_plan_num_user})"; + // $this->pre_flight_checks_pass = false; + // } } } diff --git a/app/Jobs/Import/CSVImport.php b/app/Jobs/Import/CSVImport.php index b5896b53203b..c893530b4e81 100644 --- a/app/Jobs/Import/CSVImport.php +++ b/app/Jobs/Import/CSVImport.php @@ -134,10 +134,6 @@ class CSVImport implements ShouldQueue { 'company' => $this->company, ]; - App::forgetInstance('translator'); - $t = app('translator'); - $t->replace(Ninja::transformTranslations($this->company->settings)); - $nmo = new NinjaMailerObject; $nmo->mailable = new ImportCompleted($this->company, $data); $nmo->company = $this->company; diff --git a/app/Jobs/Invoice/ZipInvoices.php b/app/Jobs/Invoice/ZipInvoices.php index 0dff22aa35c8..a38d90a087cd 100644 --- a/app/Jobs/Invoice/ZipInvoices.php +++ b/app/Jobs/Invoice/ZipInvoices.php @@ -70,7 +70,7 @@ class ZipInvoices implements ShouldQueue */ public function handle() - { + {nlog("bulky"); # create new zip object $zip = new ZipArchive(); diff --git a/app/Jobs/RecurringInvoice/SendRecurring.php b/app/Jobs/RecurringInvoice/SendRecurring.php index 4cb5ce6395d4..b5cd123ce6ba 100644 --- a/app/Jobs/RecurringInvoice/SendRecurring.php +++ b/app/Jobs/RecurringInvoice/SendRecurring.php @@ -120,6 +120,7 @@ class SendRecurring implements ShouldQueue */ + event('eloquent.created: App\Models\Invoice', $invoice); //Admin notification for recurring invoice sent. if ($invoice->invitations->count() >= 1 ) { diff --git a/app/Jobs/Util/WebhookHandler.php b/app/Jobs/Util/WebhookHandler.php index 38cafd03bb4c..27a8748d93fd 100644 --- a/app/Jobs/Util/WebhookHandler.php +++ b/app/Jobs/Util/WebhookHandler.php @@ -127,8 +127,8 @@ class WebhookHandler implements ShouldQueue $this->company ); - // if ($response->getStatusCode() == 410 || $response->getStatusCode() == 200) - // return true;// $subscription->delete(); + // if ($response->getStatusCode() == 410) + // return true; $subscription->delete(); } catch(\Exception $e){ diff --git a/app/Mail/Admin/ClientPaymentFailureObject.php b/app/Mail/Admin/ClientPaymentFailureObject.php index df13ad8a5049..6e4a734f5b1c 100644 --- a/app/Mail/Admin/ClientPaymentFailureObject.php +++ b/app/Mail/Admin/ClientPaymentFailureObject.php @@ -56,6 +56,10 @@ class ClientPaymentFailureObject public function build() { + if(!$this->payment_hash){ + nlog("no payment has for failure notification - ClientPaymentFailureObject"); + return; + } App::forgetInstance('translator'); /* Init a new copy of the translator*/ diff --git a/app/Mail/Import/ImportCompleted.php b/app/Mail/Import/ImportCompleted.php index b6fdbfd4f4c3..2a1e04da60f9 100644 --- a/app/Mail/Import/ImportCompleted.php +++ b/app/Mail/Import/ImportCompleted.php @@ -13,9 +13,11 @@ namespace App\Mail\Import; use App\Models\Company; +use App\Utils\Ninja; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; +use Illuminate\Support\Facades\App; class ImportCompleted extends Mailable { @@ -45,6 +47,11 @@ class ImportCompleted extends Mailable */ public function build() { + + App::forgetInstance('translator'); + $t = app('translator'); + $t->replace(Ninja::transformTranslations($this->company->settings)); + $data = array_merge($this->data, [ 'logo' => $this->company->present()->logo(), 'settings' => $this->company->settings, diff --git a/app/Mail/SupportMessageSent.php b/app/Mail/SupportMessageSent.php index 888fcf1c235b..afc8d0ea9438 100644 --- a/app/Mail/SupportMessageSent.php +++ b/app/Mail/SupportMessageSent.php @@ -65,9 +65,10 @@ class SupportMessageSent extends Mailable $is_large = $company->is_large ? "L" : "S"; $platform = array_key_exists('platform', $this->data) ? $this->data['platform'] : "U"; $migrated = strlen($company->company_key) == 32 ? "M" : ""; + $trial = $account->isTrial() ? "T" : ""; if(Ninja::isHosted()) - $subject = "{$priority}Hosted-{$db}-{$is_large}{$platform}{$migrated} :: {$plan} :: ".date('M jS, g:ia'); + $subject = "{$priority}Hosted-{$db}-{$is_large}{$platform}{$migrated}{$trial} :: {$plan} :: ".date('M jS, g:ia'); else $subject = "{$priority}Self Hosted :: {$plan} :: {$is_large}{$platform}{$migrated} :: ".date('M jS, g:ia'); diff --git a/app/Models/CompanyUser.php b/app/Models/CompanyUser.php index 3898abed0c5b..9ebfbd5693e6 100644 --- a/app/Models/CompanyUser.php +++ b/app/Models/CompanyUser.php @@ -88,7 +88,7 @@ class CompanyUser extends Pivot public function users() { - return $this->hasMany(User::class); + return $this->hasMany(User::class)->withTrashed(); } /*todo monitor this function - may fail under certain conditions*/ diff --git a/app/PaymentDrivers/BaseDriver.php b/app/PaymentDrivers/BaseDriver.php index cfdd0151acfd..0de59f60f565 100644 --- a/app/PaymentDrivers/BaseDriver.php +++ b/app/PaymentDrivers/BaseDriver.php @@ -71,7 +71,7 @@ class BaseDriver extends AbstractPaymentDriver public $payment_method; /* PaymentHash */ - public ?PaymentHash $payment_hash; + public $payment_hash; /* Array of payment methods */ public static $methods = []; diff --git a/app/PaymentDrivers/MolliePaymentDriver.php b/app/PaymentDrivers/MolliePaymentDriver.php index 8ec71a6d2a18..4b991a057a86 100644 --- a/app/PaymentDrivers/MolliePaymentDriver.php +++ b/app/PaymentDrivers/MolliePaymentDriver.php @@ -304,7 +304,7 @@ class MolliePaymentDriver extends BaseDriver try { $payment = $this->gateway->payments->get($request->id); - $record = Payment::where('transaction_reference', $payment->id)->firstOrFail(); + $record = Payment::withTrashed()->where('transaction_reference', $request->id)->firstOrFail(); $record->status_id = $codes[$payment->status]; $record->save(); diff --git a/app/Services/Credit/CreateInvitations.php b/app/Services/Credit/CreateInvitations.php index a4cca1d37b75..7a9fce00741b 100644 --- a/app/Services/Credit/CreateInvitations.php +++ b/app/Services/Credit/CreateInvitations.php @@ -23,7 +23,7 @@ class CreateInvitations extends AbstractService { use MakesHash; - private $credit; + public $credit; public function __construct(Credit $credit) { @@ -45,6 +45,7 @@ class CreateInvitations extends AbstractService $invitation = CreditInvitation::whereCompanyId($this->credit->company_id) ->whereClientContactId($contact->id) ->whereCreditId($this->credit->id) + ->withTrashed() ->first(); if (! $invitation) { @@ -58,6 +59,34 @@ class CreateInvitations extends AbstractService } }); + if($this->credit->invitations()->count() == 0) { + + if($contacts->count() == 0){ + $contact = $this->createBlankContact(); + } + else{ + $contact = $contacts->first(); + + $invitation = CreditInvitation::where('company_id', $this->credit->company_id) + ->where('client_contact_id', $contact->id) + ->where('credit_id', $this->credit->id) + ->withTrashed() + ->first(); + + if($invitation){ + $invitation->restore(); + return $this->credit; + } + } + + $ii = CreditInvitationFactory::create($this->credit->company_id, $this->credit->user_id); + $ii->key = $this->createDbHash($this->credit->company->db); + $ii->credit_id = $this->credit->id; + $ii->client_contact_id = $contact->id; + $ii->save(); + } + + return $this->credit; } diff --git a/app/Services/Credit/CreditService.php b/app/Services/Credit/CreditService.php index eea08769e1fa..acac1ff28ede 100644 --- a/app/Services/Credit/CreditService.php +++ b/app/Services/Credit/CreditService.php @@ -13,13 +13,14 @@ namespace App\Services\Credit; use App\Jobs\Util\UnlinkFile; use App\Models\Credit; +use App\Services\Credit\CreateInvitations; use App\Utils\Traits\MakesHash; class CreditService { use MakesHash; - protected $credit; + public $credit; public function __construct($credit) { diff --git a/app/Services/Invoice/CreateInvitations.php b/app/Services/Invoice/CreateInvitations.php index 7d7c6d7dad0a..07734ab6433f 100644 --- a/app/Services/Invoice/CreateInvitations.php +++ b/app/Services/Invoice/CreateInvitations.php @@ -62,7 +62,23 @@ class CreateInvitations extends AbstractService if($this->invoice->invitations()->count() == 0) { - $contact = $this->createBlankContact(); + if($contacts->count() == 0){ + $contact = $this->createBlankContact(); + } + else{ + $contact = $contacts->first(); + + $invitation = InvoiceInvitation::where('company_id', $this->invoice->company_id) + ->where('client_contact_id', $contact->id) + ->where('invoice_id', $this->invoice->id) + ->withTrashed() + ->first(); + + if($invitation){ + $invitation->restore(); + return $this->invoice; + } + } $ii = InvoiceInvitationFactory::create($this->invoice->company_id, $this->invoice->user_id); $ii->key = $this->createDbHash($this->invoice->company->db); diff --git a/app/Services/Invoice/InvoiceService.php b/app/Services/Invoice/InvoiceService.php index 45d0ab893a13..5ea2700892e8 100644 --- a/app/Services/Invoice/InvoiceService.php +++ b/app/Services/Invoice/InvoiceService.php @@ -33,7 +33,7 @@ class InvoiceService { use MakesHash; - private $invoice; + public $invoice; public function __construct($invoice) { diff --git a/app/Services/Quote/CreateInvitations.php b/app/Services/Quote/CreateInvitations.php index 2ef9fbb320c4..f4a937186fe0 100644 --- a/app/Services/Quote/CreateInvitations.php +++ b/app/Services/Quote/CreateInvitations.php @@ -59,6 +59,33 @@ class CreateInvitations } }); + if($this->quote->invitations()->count() == 0) { + + if($contacts->count() == 0){ + $contact = $this->createBlankContact(); + } + else{ + $contact = $contacts->first(); + + $invitation = QuoteInvitation::where('company_id', $this->quote->company_id) + ->where('client_contact_id', $contact->id) + ->where('quote_id', $this->quote->id) + ->withTrashed() + ->first(); + + if($invitation){ + $invitation->restore(); + return $this->quote; + } + } + + $ii = QuoteInvitationFactory::create($this->quote->company_id, $this->quote->user_id); + $ii->key = $this->createDbHash($this->quote->company->db); + $ii->quote_id = $this->quote->id; + $ii->client_contact_id = $contact->id; + $ii->save(); + } + return $this->quote->fresh(); } diff --git a/app/Utils/HtmlEngine.php b/app/Utils/HtmlEngine.php index e165c5102bfd..ef9ab63ecedf 100644 --- a/app/Utils/HtmlEngine.php +++ b/app/Utils/HtmlEngine.php @@ -151,6 +151,7 @@ class HtmlEngine if($this->entity->project) { $data['$project.name'] = ['value' => $this->entity->project->name, 'label' => ctrans('texts.project_name')]; + $data['$invoice.project'] = &$data['$project.name']; } } diff --git a/app/Utils/TemplateEngine.php b/app/Utils/TemplateEngine.php index f5f7c1b3a9de..def0b1b1156a 100644 --- a/app/Utils/TemplateEngine.php +++ b/app/Utils/TemplateEngine.php @@ -16,6 +16,8 @@ use App\Models\Client; use App\Models\ClientContact; use App\Models\Invoice; use App\Models\InvoiceInvitation; +use App\Models\Quote; +use App\Models\QuoteInvitation; use App\Services\PdfMaker\Designs\Utilities\DesignHelpers; use App\Utils\Ninja; use App\Utils\Traits\MakesHash; @@ -254,18 +256,38 @@ class TemplateEngine 'send_email' => true, ]); - $this->entity_obj = Invoice::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => auth()->user()->company()->id, - 'client_id' => $client->id, - ]); - $invitation = InvoiceInvitation::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => auth()->user()->company()->id, - 'invoice_id' => $this->entity_obj->id, - 'client_contact_id' => $contact->id, - ]); + if($this->entity == 'invoice') + { + $this->entity_obj = Invoice::factory()->create([ + 'user_id' => auth()->user()->id, + 'company_id' => auth()->user()->company()->id, + 'client_id' => $client->id, + ]); + + $invitation = InvoiceInvitation::factory()->create([ + 'user_id' => auth()->user()->id, + 'company_id' => auth()->user()->company()->id, + 'invoice_id' => $this->entity_obj->id, + 'client_contact_id' => $contact->id, + ]); + } + + if($this->entity == 'quote') + { + $this->entity_obj = Quote::factory()->create([ + 'user_id' => auth()->user()->id, + 'company_id' => auth()->user()->company()->id, + 'client_id' => $client->id, + ]); + + $invitation = QuoteInvitation::factory()->create([ + 'user_id' => auth()->user()->id, + 'company_id' => auth()->user()->company()->id, + 'quote_id' => $this->entity_obj->id, + 'client_contact_id' => $contact->id, + ]); + } $this->entity_obj->setRelation('invitations', $invitation); $this->entity_obj->setRelation('client', $client); diff --git a/routes/api.php b/routes/api.php index 0e2f9d4760cf..6dd956d0b5a6 100644 --- a/routes/api.php +++ b/routes/api.php @@ -220,5 +220,6 @@ Route::post('api/v1/postmark_webhook', 'PostMarkController@webhook')->middleware Route::get('token_hash_router', 'OneTimeTokenController@router'); Route::get('webcron', 'WebCronController@index'); Route::post('api/v1/get_migration_account', 'HostedMigrationController@getAccount')->middleware('guest'); +Route::post('api/v1/confirm_forwarding', 'HostedMigrationController@confirmForwarding')->middleware('guest'); Route::fallback('BaseController@notFound'); diff --git a/tests/Feature/InvitationTest.php b/tests/Feature/InvitationTest.php index ccf4d5ea68bd..12dc8ff9d806 100644 --- a/tests/Feature/InvitationTest.php +++ b/tests/Feature/InvitationTest.php @@ -33,18 +33,12 @@ use Tests\TestCase; class InvitationTest extends TestCase { use MakesHash; - //use DatabaseTransactions; - //use RefreshDatabase; + use DatabaseTransactions; + // use RefreshDatabase; public function setUp() :void { parent::setUp(); - - Session::start(); - - $this->faker = \Faker\Factory::create(); - - Model::reguard(); } public function testInvoiceCreationAfterInvoiceMarkedSent() diff --git a/tests/Integration/EventTest.php b/tests/Integration/EventTest.php index a9ab59282f3b..9127ff54c8d7 100644 --- a/tests/Integration/EventTest.php +++ b/tests/Integration/EventTest.php @@ -677,7 +677,6 @@ class EventTest extends TestCase { $this->withoutMiddleware(PasswordProtection::class); - $this->expectsEvents([ UserWasCreated::class, UserWasUpdated::class, diff --git a/tests/MockAccountData.php b/tests/MockAccountData.php index cd9c0f4b1335..bbd8b44adb62 100644 --- a/tests/MockAccountData.php +++ b/tests/MockAccountData.php @@ -170,6 +170,9 @@ trait MockAccountData } $this->account = Account::factory()->create(); + $this->account->num_users = 3; + $this->account->save(); + $this->company = Company::factory()->create([ 'account_id' => $this->account->id, ]);