diff --git a/app/Http/Controllers/ClientPortal/RecurringInvoiceController.php b/app/Http/Controllers/ClientPortal/RecurringInvoiceController.php index 639c1a9d88f2..d407fea397db 100644 --- a/app/Http/Controllers/ClientPortal/RecurringInvoiceController.php +++ b/app/Http/Controllers/ClientPortal/RecurringInvoiceController.php @@ -11,7 +11,6 @@ namespace App\Http\Controllers\ClientPortal; -use App\Filters\InvoiceFilters; use App\Http\Controllers\Controller; use App\Models\RecurringInvoice; use App\Utils\Traits\MakesHash; @@ -37,19 +36,24 @@ class RecurringInvoiceController extends Controller * * @return \Illuminate\Http\Response */ - public function index(InvoiceFilters $filters, Builder $builder) + public function index(Builder $builder) { - $invoices = Invoice::filter($filters); + $invoices = RecurringInvoice::whereClientId(auth()->user()->client->id) + ->whereIn('status_id', [RecurringInvoice::STATUS_PENDING, RecurringInvoice::STATUS_ACTIVE, RecurringInvoice::STATUS_COMPLETED]) + ->orderBy('status_id', 'asc') + ->get(); if (request()->ajax()) { return DataTables::of($invoices)->addColumn('action', function ($invoice) { return ''.ctrans('texts.view').''; + })->addColumn('frequency_id', function ($invoice) { + return RecurringInvoice::frequencyForKey($invoice->frequency_id); }) ->editColumn('status_id', function ($invoice){ - return Invoice::badgeForStatus($invoice->status); + return RecurringInvoice::badgeForStatus($invoice->status); }) - ->rawColumns(['checkbox', 'action', 'status_id']) + ->rawColumns(['action', 'status_id']) ->make(true); } diff --git a/app/Models/RecurringInvoice.php b/app/Models/RecurringInvoice.php index 2b8aa715eca3..4c8808361c3c 100644 --- a/app/Models/RecurringInvoice.php +++ b/app/Models/RecurringInvoice.php @@ -31,9 +31,9 @@ class RecurringInvoice extends BaseModel */ const STATUS_DRAFT = 2; const STATUS_ACTIVE = 3; + const STATUS_CANCELLED = 4; const STATUS_PENDING = -1; const STATUS_COMPLETED = -2; - const STATUS_CANCELLED = -3; /** @@ -85,9 +85,9 @@ class RecurringInvoice extends BaseModel 'line_items' => 'object', ]; - protected $with = [ - // 'client', - // 'company', + protected $appends = [ + 'hashed_id', + 'status' ]; public function company() @@ -110,30 +110,42 @@ class RecurringInvoice extends BaseModel $this->morphMany(RecurringInvoiceInvitation::class); } + public function getStatusAttribute() + { + + if($this->status_id == RecurringInvoice::STATUS_ACTIVE && $this->start_date > Carbon::now()) //marked as active, but yet to fire first cycle + return RecurringInvoice::STATUS_PENDING; + else if($this->status_id == RecurringInvoice::STATUS_ACTIVE && $this->next_send_date > Carbon::now()) + return RecurringInvoice::STATUS_COMPLETED; + else + return $this->status_id; + + } + public function nextSendDate() :?Carbon { switch ($this->frequency_id) { - case FREQUENCY_WEEKLY: + case RecurringInvoice::FREQUENCY_WEEKLY: return Carbon::parse($this->next_send_date->addWeek()); - case FREQUENCY_TWO_WEEKS: + case RecurringInvoice::FREQUENCY_TWO_WEEKS: return Carbon::parse($this->next_send_date->addWeeks(2)); - case FREQUENCY_FOUR_WEEKS: + case RecurringInvoice::FREQUENCY_FOUR_WEEKS: return Carbon::parse($this->next_send_date->addWeeks(4)); - case FREQUENCY_MONTHLY: + case RecurringInvoice::FREQUENCY_MONTHLY: return Carbon::parse($this->next_send_date->addMonth()); - case FREQUENCY_TWO_MONTHS: + case RecurringInvoice::FREQUENCY_TWO_MONTHS: return Carbon::parse($this->next_send_date->addMonths(2)); - case FREQUENCY_THREE_MONTHS: + case RecurringInvoice::FREQUENCY_THREE_MONTHS: return Carbon::parse($this->next_send_date->addMonths(3)); - case FREQUENCY_FOUR_MONTHS: + case RecurringInvoice::FREQUENCY_FOUR_MONTHS: return Carbon::parse($this->next_send_date->addMonths(4)); - case FREQUENCY_SIX_MONTHS: + case RecurringInvoice::FREQUENCY_SIX_MONTHS: return Carbon::parse($this->next_send_date->addMonths(6)); - case FREQUENCY_ANNUALLY: + case RecurringInvoice::FREQUENCY_ANNUALLY: return Carbon::parse($this->next_send_date->addYear()); - case FREQUENCY_TWO_YEARS: + case RecurringInvoice::FREQUENCY_TWO_YEARS: return Carbon::parse($this->next_send_date->addYears(2)); default: return null; @@ -160,4 +172,71 @@ class RecurringInvoice extends BaseModel $this->save(); } + + public static function badgeForStatus(int $status) + { + switch ($status) { + case RecurringInvoice::STATUS_DRAFT: + return '

'.ctrans('texts.draft').'

'; + break; + case RecurringInvoice::STATUS_PENDING: + return '

'.ctrans('texts.sent').'

'; + break; + case RecurringInvoice::STATUS_ACTIVE: + return '

'.ctrans('texts.partial').'

'; + break; + case RecurringInvoice::STATUS_COMPLETED: + return '

'.ctrans('texts.status_completed').'

'; + break; + case RecurringInvoice::STATUS_CANCELLED: + return '

'.ctrans('texts.overdue').'

'; + break; + default: + # code... + break; + } + } + + public static function frequencyForKey(int $frequency_id) :string + { + switch ($frequency_id) { + case RecurringInvoice::FREQUENCY_WEEKLY: + return ctrans('texts.freq_weekly'); + break; + case RecurringInvoice::FREQUENCY_TWO_WEEKS: + return ctrans('texts.freq_two_weeks'); + break; + case RecurringInvoice::FREQUENCY_FOUR_WEEKS: + return ctrans('texts.freq_four_weeks'); + break; + case RecurringInvoice::FREQUENCY_MONTHLY: + return ctrans('texts.freq_monthly'); + break; + case RecurringInvoice::FREQUENCY_TWO_MONTHS: + return ctrans('texts.freq_two_months'); + break; + case RecurringInvoice::FREQUENCY_THREE_MONTHS: + return ctrans('texts.freq_three_months'); + break; + case RecurringInvoice::FREQUENCY_FOUR_MONTHS: + return ctrans('texts.freq_four_months'); + break; + case RecurringInvoice::FREQUENCY_SIX_MONTHS: + return ctrans('texts.freq_six_months'); + break; + case RecurringInvoice::FREQUENCY_ANNUALLY: + return ctrans('texts.freq_annually'); + break; + case RecurringInvoice::FREQUENCY_TWO_YEARS: + return ctrans('texts.freq_two_years'); + break; + case RecurringInvoice::RECURS_INDEFINITELY: + return ctrans('texts.freq_indefinitely'); + break; + default: + # code... + break; + } + } + } diff --git a/database/factories/RecurringInvoiceFactory.php b/database/factories/RecurringInvoiceFactory.php index cb735c181f8c..af8efcf3ac53 100644 --- a/database/factories/RecurringInvoiceFactory.php +++ b/database/factories/RecurringInvoiceFactory.php @@ -6,7 +6,7 @@ use Faker\Generator as Faker; $factory->define(App\Models\RecurringInvoice::class, function (Faker $faker) { return [ - 'status_id' => App\Models\RecurringInvoice::STATUS_PENDING, + 'status_id' => App\Models\RecurringInvoice::STATUS_ACTIVE, 'discount' => $faker->numberBetween(1,10), 'is_amount_discount' => $faker->boolean(), 'tax_name1' => 'GST', @@ -28,5 +28,7 @@ $factory->define(App\Models\RecurringInvoice::class, function (Faker $faker) { 'last_sent_date' => $faker->date(), 'next_send_date' => $faker->date(), 'remaining_cycles' => $faker->numberBetween(1,10), + 'amount' => $faker->randomFloat(2, $min = 1, $max = 1000) // 48.8932 + ]; }); \ No newline at end of file diff --git a/database/migrations/2014_10_13_000000_create_users_table.php b/database/migrations/2014_10_13_000000_create_users_table.php index a1844d31d2f7..c5444960c1eb 100644 --- a/database/migrations/2014_10_13_000000_create_users_table.php +++ b/database/migrations/2014_10_13_000000_create_users_table.php @@ -468,7 +468,7 @@ class CreateUsersTable extends Migration $t->datetime('last_viewed')->nullable(); $t->unsignedInteger('frequency_id'); - $t->date('start_date')->nullable(); + $t->datetime('start_date')->nullable(); $t->datetime('last_sent_date')->nullable(); $t->datetime('next_send_date')->nullable(); $t->unsignedInteger('remaining_cycles')->nullable(); diff --git a/database/seeds/RandomDataSeeder.php b/database/seeds/RandomDataSeeder.php index bc08b4bd0672..2b751688c4f7 100644 --- a/database/seeds/RandomDataSeeder.php +++ b/database/seeds/RandomDataSeeder.php @@ -98,11 +98,16 @@ class RandomDataSeeder extends Seeder /** Invoice Factory */ factory(\App\Models\Invoice::class,500)->create(['user_id' => $user->id, 'company_id' => $company->id, 'client_id' => $client->id]); + /** Recurring Invoice Factory */ + factory(\App\Models\RecurringInvoice::class,20)->create(['user_id' => $user->id, 'company_id' => $company->id, 'client_id' => $client->id]); + + $clients = Client::all(); foreach($clients as $client) { - $client->getNextClientNumber($client); + //$client->getNextClientNumber($client); + $client->id_number = $client->getNextClientNumber($client); $client->save(); } diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index 46be7cf5c072..b1a7ca6b11d4 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -3105,6 +3105,9 @@ $LANG = array( 'email_already_register' => 'This email is already linked to an account', 'create_account' => 'Create Account', 'locations' => 'Locations', + 'freq_indefinitely' => 'Indefinitely', + 'next_send_date' => 'Next send date', + 'cycles_remaining' => 'Cycles remaining', ); return $LANG; diff --git a/resources/views/portal/default/recurring_invoices/index.blade.php b/resources/views/portal/default/recurring_invoices/index.blade.php index e69de29bb2d1..6728bd2d475b 100644 --- a/resources/views/portal/default/recurring_invoices/index.blade.php +++ b/resources/views/portal/default/recurring_invoices/index.blade.php @@ -0,0 +1,82 @@ +@extends('portal.default.layouts.master') +@section('header') + @parent + +@stop +@section('body') +
+
+ +
+ +
+ +
+
+ + {!! $html->table(['class' => 'table table-hover table-striped', 'id' => 'datatable'], true) !!} + +
+
+
+ +
+ +
+
+ +@endsection +@push('scripts') + + +@endpush +@section('footer') + +@endsection + diff --git a/routes/client.php b/routes/client.php index 7c54247ca187..8cd4a4896fd7 100644 --- a/routes/client.php +++ b/routes/client.php @@ -15,9 +15,13 @@ Route::post('client/password/reset', 'Auth\ContactResetPasswordController@reset' Route::group(['middleware' => ['auth:contact'], 'prefix' => 'client', 'as' => 'client.'], function () { Route::get('dashboard', 'ClientPortal\DashboardController@index')->name('dashboard'); // name = (dashboard. index / create / show / update / destroy / edit + Route::get('invoices', 'ClientPortal\InvoiceController@index')->name('invoices.index'); - Route::get('recurring_invoices', 'ClientPortal\RecurringInvoiceController@index')->name('recurring_invoices.index'); Route::post('invoices/payment', 'ClientPortal\InvoiceController@bulk')->name('invoices.bulk'); + + Route::get('recurring_invoices', 'ClientPortal\RecurringInvoiceController@index')->name('recurring_invoices.index'); + + Route::get('profile/{client_contact}/edit', 'ClientPortal\ProfileController@edit')->name('profile.edit'); Route::put('profile/{client_contact}/edit', 'ClientPortal\ProfileController@update')->name('profile.update'); Route::put('profile/{client_contact}/edit_client', 'ClientPortal\ProfileController@updateClient')->name('profile.edit_client');