diff --git a/VERSION.txt b/VERSION.txt index 0a8951789b48..b2e4a751bf4e 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -5.0.46 \ No newline at end of file +5.0.47 \ No newline at end of file diff --git a/app/Console/Commands/SendRemindersCron.php b/app/Console/Commands/SendRemindersCron.php index 7a787ec31933..65271cbf1f8c 100644 --- a/app/Console/Commands/SendRemindersCron.php +++ b/app/Console/Commands/SendRemindersCron.php @@ -62,7 +62,7 @@ class SendRemindersCron extends Command $invoices = Invoice::where('is_deleted', 0) ->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL]) ->where('balance', '>', 0) - ->whereDate('due_date', now()->subDays(1)->startOfDay()) + ->whereDate('due_date', '<=', now()->subDays(1)->startOfDay()) ->cursor(); $invoices->each(function ($invoice) { @@ -74,7 +74,7 @@ class SendRemindersCron extends Command { $quotes = Quote::where('is_deleted', 0) ->where('status_id', Quote::STATUS_SENT) - ->whereDate('due_date', now()->subDays(1)->startOfDay()) + ->whereDate('due_date', '<=', now()->subDays(1)->startOfDay()) ->cursor(); $quotes->each(function ($quote) { diff --git a/app/Http/Requests/Client/StoreClientRequest.php b/app/Http/Requests/Client/StoreClientRequest.php index 6d70b3a29302..b9cb4f1a15d6 100644 --- a/app/Http/Requests/Client/StoreClientRequest.php +++ b/app/Http/Requests/Client/StoreClientRequest.php @@ -85,10 +85,12 @@ class StoreClientRequest extends Request $input = $this->decodePrimaryKeys($input); + if(isset($input['group_settings_id'])) + $input['group_settings_id'] = $this->decodePrimaryKey($input['group_settings_id']); //is no settings->currency_id is set then lets dive in and find either a group or company currency all the below may be redundant!! if (! property_exists($settings, 'currency_id') && isset($input['group_settings_id'])) { - $input['group_settings_id'] = $this->decodePrimaryKey($input['group_settings_id']); + $group_settings = GroupSetting::find($input['group_settings_id']); if ($group_settings && property_exists($group_settings->settings, 'currency_id') && isset($group_settings->settings->currency_id)) { diff --git a/app/Http/Requests/Credit/StoreCreditRequest.php b/app/Http/Requests/Credit/StoreCreditRequest.php index 064aed386758..78083c2abeb5 100644 --- a/app/Http/Requests/Credit/StoreCreditRequest.php +++ b/app/Http/Requests/Credit/StoreCreditRequest.php @@ -54,6 +54,7 @@ class StoreCreditRequest extends Request $rules['client_id'] = 'required|exists:clients,id,company_id,'.auth()->user()->company()->id; $rules['number'] = new UniqueCreditNumberRule($this->all()); + $rules['line_items'] = 'array'; return $rules; } diff --git a/app/Http/Requests/Credit/UpdateCreditRequest.php b/app/Http/Requests/Credit/UpdateCreditRequest.php index 4282dc93f307..426301ef39b4 100644 --- a/app/Http/Requests/Credit/UpdateCreditRequest.php +++ b/app/Http/Requests/Credit/UpdateCreditRequest.php @@ -56,6 +56,8 @@ class UpdateCreditRequest extends Request $rules['number'] = 'unique:credits,number,'.$this->id.',id,company_id,'.$this->credit->company_id; } + $rules['line_items'] = 'array'; + return $rules; } diff --git a/app/Http/Requests/Invoice/StoreInvoiceRequest.php b/app/Http/Requests/Invoice/StoreInvoiceRequest.php index 602c10021c5e..2da8e72603a6 100644 --- a/app/Http/Requests/Invoice/StoreInvoiceRequest.php +++ b/app/Http/Requests/Invoice/StoreInvoiceRequest.php @@ -55,6 +55,8 @@ class StoreInvoiceRequest extends Request $rules['project_id'] = ['bail', 'sometimes', new ValidProjectForClient($this->all())]; + $rules['line_items'] = 'array'; + return $rules; } diff --git a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php index c9d4bb67cb1c..7234211d1884 100644 --- a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php +++ b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php @@ -54,6 +54,8 @@ class UpdateInvoiceRequest extends Request $rules['number'] = 'unique:invoices,number,'.$this->id.',id,company_id,'.$this->invoice->company_id; } + $rules['line_items'] = 'array'; + return $rules; } diff --git a/app/Http/Requests/Payment/StorePaymentRequest.php b/app/Http/Requests/Payment/StorePaymentRequest.php index 9c039ac1f29d..a8ba807423fa 100644 --- a/app/Http/Requests/Payment/StorePaymentRequest.php +++ b/app/Http/Requests/Payment/StorePaymentRequest.php @@ -80,7 +80,7 @@ class StorePaymentRequest extends Request $input['amount'] = $invoices_total - $credits_total; } - $input['is_manual'] = true; + // $input['is_manual'] = true; if (! isset($input['date'])) { $input['date'] = now()->format('Y-m-d'); diff --git a/app/Http/Requests/Quote/StoreQuoteRequest.php b/app/Http/Requests/Quote/StoreQuoteRequest.php index aee92e98b627..48e2ee5508d4 100644 --- a/app/Http/Requests/Quote/StoreQuoteRequest.php +++ b/app/Http/Requests/Quote/StoreQuoteRequest.php @@ -94,6 +94,7 @@ class StoreQuoteRequest extends Request } $rules['number'] = new UniqueQuoteNumberRule($this->all()); + $rules['line_items'] = 'array'; return $rules; } diff --git a/app/Http/Requests/Quote/UpdateQuoteRequest.php b/app/Http/Requests/Quote/UpdateQuoteRequest.php index 40e022e41e5f..d9f65c710b06 100644 --- a/app/Http/Requests/Quote/UpdateQuoteRequest.php +++ b/app/Http/Requests/Quote/UpdateQuoteRequest.php @@ -50,6 +50,8 @@ class UpdateQuoteRequest extends Request $rules['number'] = 'unique:quotes,number,'.$this->id.',id,company_id,'.$this->quote->company_id; } + $rules['line_items'] = 'array'; + return $rules; } diff --git a/app/Models/Payment.php b/app/Models/Payment.php index 15e3042f3de9..f1ab6e08c87e 100644 --- a/app/Models/Payment.php +++ b/app/Models/Payment.php @@ -59,7 +59,7 @@ class Payment extends BaseModel 'date', 'transaction_reference', 'number', - 'is_manual', + // 'is_manual', 'private_notes', 'custom_value1', 'custom_value2', diff --git a/app/Repositories/PaymentRepository.php b/app/Repositories/PaymentRepository.php index a7d6e6fb6b1d..4829a9b75e88 100644 --- a/app/Repositories/PaymentRepository.php +++ b/app/Repositories/PaymentRepository.php @@ -95,6 +95,7 @@ class PaymentRepository extends BaseRepository /*Fill the payment*/ $payment->fill($data); + $payment->is_manual = true; $payment->status_id = Payment::STATUS_COMPLETED; $payment->save(); diff --git a/app/Services/Credit/CreateInvitations.php b/app/Services/Credit/CreateInvitations.php index 6213c1374c6f..2a819feb3f62 100644 --- a/app/Services/Credit/CreateInvitations.php +++ b/app/Services/Credit/CreateInvitations.php @@ -11,6 +11,7 @@ namespace App\Services\Credit; +use App\Factory\ClientContactFactory; use App\Factory\CreditInvitationFactory; use App\Models\Credit; use App\Models\CreditInvitation; @@ -29,6 +30,13 @@ class CreateInvitations extends AbstractService { $contacts = $this->credit->client->contacts; + if($contacts->count() == 0){ + $this->createBlankContact(); + + $this->credit->refresh(); + $contacts = $this->credit->client->contacts; + } + $contacts->each(function ($contact) { $invitation = CreditInvitation::whereCompanyId($this->credit->company_id) ->whereClientContactId($contact->id) @@ -47,4 +55,13 @@ class CreateInvitations extends AbstractService return $this->credit; } + + private function createBlankContact() + { + $new_contact = ClientContactFactory::create($this->credit->company_id, $this->credit->user_id); + $new_contact->client_id = $this->credit->client_id; + $new_contact->contact_key = Str::random(40); + $new_contact->is_primary = true; + $new_contact->save(); + } } diff --git a/app/Services/Invoice/CreateInvitations.php b/app/Services/Invoice/CreateInvitations.php index 735798c905a1..6ba4e6fbb9b7 100644 --- a/app/Services/Invoice/CreateInvitations.php +++ b/app/Services/Invoice/CreateInvitations.php @@ -11,6 +11,7 @@ namespace App\Services\Invoice; +use App\Factory\ClientContactFactory; use App\Factory\InvoiceInvitationFactory; use App\Models\Invoice; use App\Models\InvoiceInvitation; @@ -27,7 +28,17 @@ class CreateInvitations extends AbstractService public function run() { - $this->invoice->client->contacts->each(function ($contact) { + + $contacts = $this->invoice->client->contacts; + + if($contacts->count() == 0){ + $this->createBlankContact(); + + $this->invoice->refresh(); + $contacts = $this->invoice->client->contacts; + } + + $contacts->each(function ($contact) { $invitation = InvoiceInvitation::whereCompanyId($this->invoice->company_id) ->whereClientContactId($contact->id) ->whereInvoiceId($this->invoice->id) @@ -46,4 +57,13 @@ class CreateInvitations extends AbstractService return $this->invoice; } + + private function createBlankContact() + { + $new_contact = ClientContactFactory::create($this->invoice->company_id, $this->invoice->user_id); + $new_contact->client_id = $this->invoice->client_id; + $new_contact->contact_key = Str::random(40); + $new_contact->is_primary = true; + $new_contact->save(); + } } diff --git a/app/Services/Quote/CreateInvitations.php b/app/Services/Quote/CreateInvitations.php index 329eabd895d6..9ea688641a2b 100644 --- a/app/Services/Quote/CreateInvitations.php +++ b/app/Services/Quote/CreateInvitations.php @@ -11,26 +11,41 @@ namespace App\Services\Quote; +use App\Factory\ClientContactFactory; use App\Factory\QuoteInvitationFactory; +use App\Models\Quote; use App\Models\QuoteInvitation; class CreateInvitations { - public function __construct() + public $quote; + + public function __construct(Quote $quote) { + $this->quote = $quote; } - public function run($quote) + public function run() { - $quote->client->contacts->each(function ($contact) use ($quote) { - $invitation = QuoteInvitation::whereCompanyId($quote->company_id) + + $contacts = $this->quote->client->contacts; + + if($contacts->count() == 0){ + $this->createBlankContact(); + + $this->quote->refresh(); + $contacts = $this->quote->client->contacts; + } + + $contacts->each(function ($contact){ + $invitation = QuoteInvitation::whereCompanyId($this->quote->company_id) ->whereClientContactId($contact->id) - ->whereQuoteId($quote->id) + ->whereQuoteId($this->quote->id) ->first(); if (! $invitation && $contact->send_email) { - $ii = QuoteInvitationFactory::create($quote->company_id, $quote->user_id); - $ii->quote_id = $quote->id; + $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_email) { @@ -38,6 +53,16 @@ class CreateInvitations } }); - return $quote->fresh(); + return $this->quote->fresh(); } + + private function createBlankContact() + { + $new_contact = ClientContacstFactory::create($this->quote->company_id, $this->quote->user_id); + $new_contact->client_id = $this->quote->client_id; + $new_contact->contact_key = Str::random(40); + $new_contact->is_primary = true; + $new_contact->save(); + } + } diff --git a/app/Services/Quote/QuoteService.php b/app/Services/Quote/QuoteService.php index 33939e362615..92ac2731175a 100644 --- a/app/Services/Quote/QuoteService.php +++ b/app/Services/Quote/QuoteService.php @@ -22,7 +22,7 @@ class QuoteService { use MakesHash; - protected $quote; + public $quote; public $invoice; @@ -33,9 +33,7 @@ class QuoteService public function createInvitations() { - $create_invitation = new CreateInvitations(); - - $this->quote = $create_invitation->run($this->quote); + $this->quote = (new CreateInvitations($this->quote))->run(); return $this; } diff --git a/app/Utils/Traits/CleanLineItems.php b/app/Utils/Traits/CleanLineItems.php index 07904aba88b0..b9cb852db1f0 100644 --- a/app/Utils/Traits/CleanLineItems.php +++ b/app/Utils/Traits/CleanLineItems.php @@ -21,7 +21,7 @@ trait CleanLineItems { public function cleanItems($items) :array { - if (! isset($items)) { + if (! isset($items) || !is_array($items)) { return []; } diff --git a/config/ninja.php b/config/ninja.php index 32b9e879f07c..f569136aec69 100644 --- a/config/ninja.php +++ b/config/ninja.php @@ -13,7 +13,7 @@ return [ 'require_https' => env('REQUIRE_HTTPS', true), 'app_url' => rtrim(env('APP_URL', ''), '/'), 'app_domain' => env('APP_DOMAIN', ''), - 'app_version' => '5.0.46', + 'app_version' => '5.0.47', 'minimum_client_version' => '5.0.16', 'terms_version' => '1.0.1', 'api_secret' => env('API_SECRET', false), diff --git a/resources/views/portal/ninja2020/dashboard/index.blade.php b/resources/views/portal/ninja2020/dashboard/index.blade.php index 9a765b271888..3a20f9fa33d0 100644 --- a/resources/views/portal/ninja2020/dashboard/index.blade.php +++ b/resources/views/portal/ninja2020/dashboard/index.blade.php @@ -12,5 +12,5 @@ @endsection @section('body') - This page is empty, sad and alone. + Coming soon. @endsection