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) !!}
+
+
+
+
+
+
+
+
+
+