diff --git a/app/Entities/Subscriptions/Subscription.php b/app/Entities/Subscriptions/Subscription.php index 19e02ee..e479378 100755 --- a/app/Entities/Subscriptions/Subscription.php +++ b/app/Entities/Subscriptions/Subscription.php @@ -2,6 +2,7 @@ namespace App\Entities\Subscriptions; +use Carbon\Carbon; use Illuminate\Database\Eloquent\Model; use Laracasts\Presenter\PresentableTrait; @@ -12,6 +13,26 @@ class Subscription extends Model protected $presenter = 'App\Entities\Subscriptions\SubscriptionPresenter'; protected $guarded = ['id', 'created_at', 'updated_at']; + public function nameLink() + { + return link_to_route('subscriptions.show', $this->name, [$this->id], [ + 'title' => trans( + 'app.show_detail_title', + ['name' => $this->name, 'type' => trans('subscription.subscription')] + ), + ]); + } + + public function nearOfDueDate() + { + return Carbon::parse($this->due_date)->diffInDays(Carbon::now()) < 60; + } + + public function nearOfDueDateSign() + { + return $this->nearOfDueDate() ? '' : ''; + } + public function project() { return $this->belongsTo('App\Entities\Projects\Project'); diff --git a/app/Http/Controllers/SubscriptionsController.php b/app/Http/Controllers/SubscriptionsController.php index 546f320..db1daeb 100755 --- a/app/Http/Controllers/SubscriptionsController.php +++ b/app/Http/Controllers/SubscriptionsController.php @@ -5,9 +5,7 @@ namespace App\Http\Controllers; use App\Entities\Subscriptions\Subscription; use App\Entities\Subscriptions\SubscriptionsRepository; use App\Http\Controllers\Controller; -use App\Http\Requests\Subscriptions\CreateRequest; -use App\Http\Requests\Subscriptions\DeleteRequest; -use App\Http\Requests\Subscriptions\UpdateRequest; +use App\Http\Requests\SubscriptionRequest as FormRequest; use Illuminate\Http\Request; class SubscriptionsController extends Controller @@ -36,21 +34,9 @@ class SubscriptionsController extends Controller return view('subscriptions.create', compact('projects', 'vendors', 'subscriptionTypes')); } - public function store(CreateRequest $request) + public function store(FormRequest $subscriptionCreateRequest) { - $project = \App\Entities\Projects\Project::findOrFail($request->get('project_id')); - - $subscription = new Subscription; - $subscription->project_id = $project->id; - $subscription->vendor_id = $request->get('vendor_id'); - $subscription->customer_id = $project->customer_id; - $subscription->name = $request->get('name'); - $subscription->price = $request->get('price'); - $subscription->start_date = $request->get('start_date'); - $subscription->due_date = $request->get('due_date'); - $subscription->type_id = $request->get('type_id'); - $subscription->notes = $request->get('notes'); - $subscription->save(); + $subscriptionCreateRequest->approveFor(new Subscription); flash()->success(trans('subscription.created')); return redirect()->route('subscriptions.index'); @@ -67,36 +53,24 @@ class SubscriptionsController extends Controller $vendors = $this->repo->getVendorsList(); $subscriptionTypes = $this->getSubscriptionTypes(); - return view('subscriptions.edit', compact('subscription', 'projects', 'vendors', 'subscriptionTypes')); + $pageTitle = trans('subscription.edit').' - '.$subscription->name.' - '.$subscription->customer->name; + + return view('subscriptions.edit', compact('subscription', 'projects', 'vendors', 'subscriptionTypes', 'pageTitle')); } - public function update(UpdateRequest $request, Subscription $subscription) + public function update(FormRequest $subscriptionUpdateRequest, Subscription $subscription) { - $project = \App\Entities\Projects\Project::findOrFail($request->get('project_id')); - - $subscriptionData = $request->except(['_method', '_token']); - $subscriptionData['customer_id'] = $project->customer_id; - - $subscription->update($subscriptionData); + $subscriptionUpdateRequest->approveFor($subscription); flash()->success(trans('subscription.updated')); return redirect()->route('subscriptions.edit', $subscription->id); } - public function delete(Subscription $subscription) - { - return view('subscriptions.delete', compact('subscription')); - } - - public function destroy(DeleteRequest $request, Subscription $subscription) + public function destroy(FormRequest $subscriptionDeleteRequest, Subscription $subscription) { - if ($subscription->id == $request->get('subscription_id')) { - $subscription->delete(); - flash()->success(trans('subscription.deleted')); - } else { - flash()->error(trans('subscription.undeleted')); - } + $subscriptionDeleteRequest->approveToDelete($subscription); + flash()->success(trans('subscription.deleted')); return redirect()->route('subscriptions.index'); } diff --git a/app/Http/Requests/SubscriptionRequest.php b/app/Http/Requests/SubscriptionRequest.php new file mode 100644 index 0000000..4cde10a --- /dev/null +++ b/app/Http/Requests/SubscriptionRequest.php @@ -0,0 +1,117 @@ +user()->can('manage_subscriptions'); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + switch ($this->method()) { + case 'POST': + return $this->getCreateRules(); + break; + + case 'PATCH': + return $this->getUpdateRules(); + break; + + case 'DELETE': + return $this->getDeleteRules(); + break; + + default: + break; + } + } + + public function getCreateRules() + { + return [ + 'name' => 'required|max:60', + 'price' => 'required|numeric', + 'start_date' => 'required|date|date_format:Y-m-d', + 'due_date' => 'required|date|date_format:Y-m-d', + 'project_id' => 'required|numeric|exists:projects,id', + 'vendor_id' => 'required|numeric|exists:vendors,id', + 'type_id' => 'required|numeric', + 'remark' => 'max:255', + ]; + } + + public function getUpdateRules() + { + return [ + 'name' => 'required|max:60', + 'price' => 'required|numeric', + 'start_date' => 'required|date|date_format:Y-m-d', + 'due_date' => 'required|date|date_format:Y-m-d', + 'project_id' => 'required|numeric|exists:projects,id', + 'vendor_id' => 'required|numeric|exists:vendors,id', + 'type_id' => 'required|numeric', + 'remark' => 'max:255', + ]; + } + + public function getDeleteRules() + { + // dd($this->route('subscription')); + // dd($this->all(), $this->segment(2)); + return [ + 'subscription_id' => 'required|in:'.$this->segment(2), + ]; + } + + public function approveFor(Subscription $subscription) + { + $project = Project::findOrFail($this->get('project_id')); + + if ($subscription->exists) { + $subscriptionData = $this->except(['_method', '_token']); + $subscriptionData['customer_id'] = $project->customer_id; + + $subscription->update($subscriptionData); + + } else { + + $subscription->project_id = $project->id; + $subscription->vendor_id = $this->get('vendor_id'); + $subscription->customer_id = $project->customer_id; + $subscription->name = $this->get('name'); + $subscription->price = $this->get('price'); + $subscription->start_date = $this->get('start_date'); + $subscription->due_date = $this->get('due_date'); + $subscription->type_id = $this->get('type_id'); + $subscription->notes = $this->get('notes'); + + $subscription->save(); + } + + return $subscription; + } + + public function approveToDelete(Subscription $subscription) + { + $subscription->delete(); + } + +} diff --git a/app/Http/Requests/Subscriptions/CreateRequest.php b/app/Http/Requests/Subscriptions/CreateRequest.php deleted file mode 100644 index a883dd3..0000000 --- a/app/Http/Requests/Subscriptions/CreateRequest.php +++ /dev/null @@ -1,39 +0,0 @@ -user()->can('manage_subscriptions'); - } - - /** - * Get the validation rules that apply to the request. - * - * @return array - */ - public function rules() - { - return [ - 'name' => 'required|max:60', - 'price' => 'required|numeric', - 'start_date' => 'required|date|date_format:Y-m-d', - 'due_date' => 'required|date|date_format:Y-m-d', - 'project_id' => 'required|numeric|exists:projects,id', - 'vendor_id' => 'required|numeric|exists:vendors,id', - 'type_id' => 'required|numeric', - 'remark' => 'max:255', - ]; - } - -} diff --git a/app/Http/Requests/Subscriptions/DeleteRequest.php b/app/Http/Requests/Subscriptions/DeleteRequest.php deleted file mode 100644 index 675db2a..0000000 --- a/app/Http/Requests/Subscriptions/DeleteRequest.php +++ /dev/null @@ -1,31 +0,0 @@ -user()->can('manage_subscriptions'); - } - - /** - * Get the validation rules that apply to the request. - * - * @return array - */ - public function rules() - { - return [ - 'subscription_id' => 'required' - ]; - } - -} diff --git a/app/Http/Requests/Subscriptions/UpdateRequest.php b/app/Http/Requests/Subscriptions/UpdateRequest.php deleted file mode 100644 index bc9b4ea..0000000 --- a/app/Http/Requests/Subscriptions/UpdateRequest.php +++ /dev/null @@ -1,39 +0,0 @@ -user()->can('manage_subscriptions'); - } - - /** - * Get the validation rules that apply to the request. - * - * @return array - */ - public function rules() - { - return [ - 'name' => 'required|max:60', - 'price' => 'required|numeric', - 'start_date' => 'required|date|date_format:Y-m-d', - 'due_date' => 'required|date|date_format:Y-m-d', - 'project_id' => 'required|numeric', - 'vendor_id' => 'required|numeric', - 'type_id' => 'required|numeric', - 'remark' => 'max:255', - ]; - } - -} diff --git a/resources/lang/id/subscription.php b/resources/lang/id/subscription.php index f2d32ee..f5763c9 100644 --- a/resources/lang/id/subscription.php +++ b/resources/lang/id/subscription.php @@ -5,6 +5,8 @@ return [ // Labels 'subscription' => 'Langganan', 'subscriptions' => 'Daftar Langganan', + 'list' => 'Daftar Langganan', + 'detail' => 'Detail Langganan', 'search' => 'Cari Langganan', 'found' => 'Langganan ditemukan', 'not_found' => 'Langganan tidak ditemukan', @@ -14,7 +16,7 @@ return [ // Actions 'create' => 'Input Langganan Baru', 'created' => 'Input Langganan baru telah berhasil.', - 'show' => 'Detail Langganan', + 'show' => 'Lihat Detail Langganan', 'edit' => 'Edit Langganan', 'update' => 'Update Langganan', 'updated' => 'Update data Langganan telah berhasil.', diff --git a/resources/views/subscriptions/delete.blade.php b/resources/views/subscriptions/delete.blade.php deleted file mode 100755 index c00d4da..0000000 --- a/resources/views/subscriptions/delete.blade.php +++ /dev/null @@ -1,18 +0,0 @@ -@extends('layouts.app') - -@section('title', trans('subscription.delete')) - -@section('content') -

-
- {!! delete_button(['route'=>['subscriptions.destroy',$subscription->id]], trans('app.delete_confirm_button'), ['class'=>'btn btn-danger'], ['subscription_id'=>$subscription->id]) !!} -
- {{ trans('app.delete_confirm') }} - {!! link_to_route('subscriptions.show', trans('app.cancel'), [$subscription->id], ['class' => 'btn btn-default']) !!} -

-
-
- @include('subscriptions.partials.subscription-show') -
-
-@endsection \ No newline at end of file diff --git a/resources/views/subscriptions/edit.blade.php b/resources/views/subscriptions/edit.blade.php index 7b7c88e..b43b148 100755 --- a/resources/views/subscriptions/edit.blade.php +++ b/resources/views/subscriptions/edit.blade.php @@ -1,45 +1,56 @@ @extends('layouts.app') -@section('title', trans('subscription.edit')) +@section('title', $pageTitle) @section('content') -

-
+@include('subscriptions.partials.breadcrumb', ['title' => $pageTitle]) + +@includeWhen(request('action') == 'delete', 'subscriptions.partials.delete') + +@if (request('action') == null) +
+
{!! Form::model($subscription, ['route'=>['subscriptions.update', $subscription->id], 'method' => 'patch']) !!}
-

{{ $subscription->domain_name }} {{ trans('subscription.edit') }}

+

{{ $pageTitle }}

+
{!! FormField::radios('type_id', $subscriptionTypes, ['label' => trans('subscription.type'), 'value' => Request::get('type_id')]) !!}
+
{!! FormField::radios('status_id', [trans('app.in_active'), trans('app.active')],['label' => trans('app.status')]) !!}
+
+
- {!! FormField::text('name',['label'=> trans('subscription.name')]) !!} + {!! FormField::text('name',['label' => trans('subscription.name')]) !!}
- {!! FormField::price('price',['label'=> trans('subscription.price')]) !!} + {!! FormField::price('price',['label' => trans('subscription.price')]) !!}
- {!! FormField::text('start_date',['label'=> trans('subscription.start_date')]) !!} + {!! FormField::text('start_date',['label' => trans('subscription.start_date')]) !!}
- {!! FormField::text('due_date',['label'=> trans('subscription.due_date')]) !!} + {!! FormField::text('due_date',['label' => trans('subscription.due_date')]) !!}
- {!! FormField::select('project_id', $projects,['label'=> trans('subscription.project')]) !!} - {!! FormField::select('vendor_id', $vendors,['label'=> trans('subscription.vendor')]) !!} - {!! FormField::radios('status_id', ['Non Active','Active'],['label'=> trans('app.status')]) !!} - {!! FormField::radios('type_id', $subscriptionTypes, ['label' => trans('subscription.type'), 'value' => Request::get('type_id')]) !!} - {!! FormField::textarea('notes',['label'=> trans('subscription.notes')]) !!} + {!! FormField::select('project_id', $projects,['label' => trans('subscription.project')]) !!} + {!! FormField::select('vendor_id', $vendors,['label' => trans('subscription.vendor')]) !!} + {!! FormField::textarea('notes',['label' => trans('subscription.notes')]) !!}
{!! Form::close() !!}
+
+ @lang('app.action') +

{!! link_to_route('subscriptions.show', trans('subscription.show'), [$subscription->id], ['class' => 'btn btn-info']) !!}

+

{!! link_to_route('subscriptions.index', trans('subscription.back_to_index'), [], ['class' => 'btn btn-default']) !!}

+

{!! link_to_route('subscriptions.edit', trans('subscription.delete'), [$subscription->id, 'action' => 'delete'], ['class'=>'btn btn-danger']) !!}

+
+@endif @endsection diff --git a/resources/views/subscriptions/index.blade.php b/resources/views/subscriptions/index.blade.php index cf8d472..e859030 100755 --- a/resources/views/subscriptions/index.blade.php +++ b/resources/views/subscriptions/index.blade.php @@ -9,7 +9,7 @@
{!! Form::open(['method'=>'get','class'=>'form-inline']) !!} - {!! Form::text('q', Request::get('q'), ['class'=>'form-control index-search-field','placeholder'=>trans('subscription.search'),'style' => 'width:350px']) !!} + {!! Form::text('q', request('q'), ['class'=>'form-control index-search-field','placeholder'=>trans('subscription.search'),'style' => 'width:350px']) !!} {!! Form::submit(trans('subscription.search'), ['class' => 'btn btn-info btn-sm']) !!} {!! link_to_route('subscriptions.index','Reset',[],['class' => 'btn btn-default btn-sm']) !!} {!! Form::close() !!} @@ -24,25 +24,22 @@ {{ trans('subscription.extension_price') }} {{ trans('subscription.vendor') }} {{ trans('app.status') }} - {{ trans('app.action') }} @forelse($subscriptions as $key => $subscription) - due_date)->diffInDays(Carbon::now()) < 60 ? 'class=bg-danger' : '' }}> + {{ $subscriptions->firstItem() + $key }} - {{ $subscription->name }} + {{ $subscription->nameLink() }} {{ $subscription->customer->name }} {{ dateId($subscription->due_date) }} + "> + {{ dateId($subscription->due_date) }} {!! $subscription->nearOfDueDateSign() !!} + {{ formatRp($subscription->price) }} {{ $subscription->vendor->name }} {{ $subscription->status() }} - - {!! link_to_route('subscriptions.show',trans('app.show'),[$subscription->id],['class'=>'btn btn-info btn-xs']) !!} - {!! link_to_route('subscriptions.edit',trans('app.edit'),[$subscription->id],['class'=>'btn btn-warning btn-xs']) !!} - @empty diff --git a/resources/views/subscriptions/partials/breadcrumb.blade.php b/resources/views/subscriptions/partials/breadcrumb.blade.php new file mode 100644 index 0000000..02ed975 --- /dev/null +++ b/resources/views/subscriptions/partials/breadcrumb.blade.php @@ -0,0 +1,5 @@ + diff --git a/resources/views/subscriptions/partials/delete.blade.php b/resources/views/subscriptions/partials/delete.blade.php new file mode 100755 index 0000000..6ff97a8 --- /dev/null +++ b/resources/views/subscriptions/partials/delete.blade.php @@ -0,0 +1,20 @@ +
+
+
+

{{ trans('subscription.delete') }}

+ @include('subscriptions.partials.subscription-show') +
+ {{ trans('app.delete_confirm') }} +
+ +
+
+
diff --git a/resources/views/subscriptions/partials/subscription-show.blade.php b/resources/views/subscriptions/partials/subscription-show.blade.php index 084b054..75e7812 100644 --- a/resources/views/subscriptions/partials/subscription-show.blade.php +++ b/resources/views/subscriptions/partials/subscription-show.blade.php @@ -1,25 +1,18 @@ -
-

{{ trans('subscription.show') }}

- - - - - - - - - - - - - - - -
{{ trans('subscription.project') }}{{ $subscription->project->name }}
{{ trans('subscription.name') }}{{ $subscription->name }}
{{ trans('subscription.price') }}{{ formatRp($subscription->price) }}
{{ trans('subscription.type') }}{{ $subscription->type }}
{{ trans('subscription.start_date') }}{{ dateId($subscription->start_date) }}
{{ trans('subscription.due_date') }}{{ dateId($subscription->due_date) }}
{{ trans('subscription.customer') }}{{ $subscription->customer->name }}
{{ trans('subscription.project') }} - {{ link_to_route('projects.subscriptions', $subscription->project->name, [$subscription->project_id], ['target' => '_blank']) }} -
{{ trans('subscription.notes') }}{!! nl2br($subscription->notes) !!}
- -
+ + + + + + + + + + + + + + + +
{{ trans('subscription.project') }}{{ $subscription->project->name }}
{{ trans('subscription.name') }}{{ $subscription->name }}
{{ trans('subscription.price') }}{{ formatRp($subscription->price) }}
{{ trans('subscription.type') }}{{ $subscription->type }}
{{ trans('subscription.start_date') }}{{ dateId($subscription->start_date) }}
{{ trans('subscription.due_date') }}{{ dateId($subscription->due_date) }}
{{ trans('subscription.customer') }}{{ $subscription->customer->name }}
{{ trans('subscription.project') }} + {{ link_to_route('projects.subscriptions', $subscription->project->name, [$subscription->project_id], ['target' => '_blank']) }} +
{{ trans('subscription.notes') }}{!! nl2br($subscription->notes) !!}
diff --git a/resources/views/subscriptions/show.blade.php b/resources/views/subscriptions/show.blade.php index eaf7ef0..74579f7 100755 --- a/resources/views/subscriptions/show.blade.php +++ b/resources/views/subscriptions/show.blade.php @@ -1,12 +1,21 @@ @extends('layouts.app') -@section('title', trans('subscription.show')) +@section('title', trans('subscription.detail')) @section('content') -

{{ $subscription->domain_name }} {{ trans('subscription.show') }}

+@include('subscriptions.partials.breadcrumb') + +

{{ $subscription->name }} {{ trans('subscription.detail') }}

- @include('subscriptions.partials.subscription-show') +
+

{{ trans('subscription.detail') }}

+ @include('subscriptions.partials.subscription-show') + +
-@endsection \ No newline at end of file +@endsection diff --git a/routes/web.php b/routes/web.php index d6dc8ec..1f051ef 100644 --- a/routes/web.php +++ b/routes/web.php @@ -6,13 +6,17 @@ require __DIR__.'/web/references.php'; require __DIR__.'/web/account.php'; require __DIR__.'/web/projects.php'; require __DIR__.'/web/payments.php'; -require __DIR__.'/web/subscriptions.php'; require __DIR__.'/web/reports.php'; require __DIR__.'/web/invoices.php'; require __DIR__.'/web/options-vue.php'; require __DIR__.'/web/calendar.php'; Route::group(['middleware' => ['web', 'auth']], function () { + /** + * Subscriptions Routes + */ + Route::resource('subscriptions', 'SubscriptionsController'); + /* * Backup Restore Database Routes */ diff --git a/routes/web/subscriptions.php b/routes/web/subscriptions.php deleted file mode 100644 index a2abe39..0000000 --- a/routes/web/subscriptions.php +++ /dev/null @@ -1,9 +0,0 @@ - ['web', 'auth']], function () { - /** - * Subscriptions Routes - */ - Route::get('subscriptions/{subscription}/delete', ['as' => 'subscriptions.delete', 'uses' => 'SubscriptionsController@delete']); - Route::resource('subscriptions', 'SubscriptionsController'); -}); diff --git a/tests/Feature/ManageSubscriptionsTest.php b/tests/Feature/ManageSubscriptionsTest.php index 2cd5835..b8ad28d 100644 --- a/tests/Feature/ManageSubscriptionsTest.php +++ b/tests/Feature/ManageSubscriptionsTest.php @@ -90,6 +90,7 @@ class ManageSubscriptionsTest extends TestCase $this->visit(route('subscriptions.edit', $subscription->id)); $this->click(trans('subscription.delete')); + $this->press(trans('app.delete_confirm_button')); $this->seePageIs(route('subscriptions.index')); diff --git a/tests/Unit/Models/SubscriptionTest.php b/tests/Unit/Models/SubscriptionTest.php index 3ab89e4..3df094c 100644 --- a/tests/Unit/Models/SubscriptionTest.php +++ b/tests/Unit/Models/SubscriptionTest.php @@ -6,11 +6,60 @@ use App\Entities\Partners\Customer; use App\Entities\Partners\Vendor; use App\Entities\Projects\Project; use App\Entities\Subscriptions\Subscription; +use Carbon\Carbon; use Tests\TestCase as TestCase; class SubscriptionTest extends TestCase { /** @test */ + public function it_has_name_link_method() + { + $subscription = factory(Subscription::class)->create(); + + $this->assertEquals( + link_to_route('subscriptions.show', $subscription->name, [$subscription->id], [ + 'title' => trans( + 'app.show_detail_title', + ['name' => $subscription->name, 'type' => trans('subscription.subscription')] + ), + ]), $subscription->nameLink() + ); + } + + /** @test */ + public function it_has_near_of_due_date_method() + { + $next3Months = Carbon::now()->addMonths(2)->format('Y-m-d'); + $subscription = factory(Subscription::class)->make(['due_date' => $next3Months]); + + $this->assertFalse($subscription->nearOfDueDate()); + + $next1Months = Carbon::now()->addMonth()->format('Y-m-d'); + $subscription = factory(Subscription::class)->make(['due_date' => $next1Months]); + + $this->assertTrue($subscription->nearOfDueDate()); + } + + /** @test */ + public function it_has_near_of_due_date_sign_method() + { + // Due date within next 3 months + $next3Months = Carbon::now()->addMonths(2)->format('Y-m-d'); + $subscription = factory(Subscription::class)->make(['due_date' => $next3Months]); + + $this->assertEquals('', $subscription->nearOfDueDateSign()); + + // Due date within next month + $next1Months = Carbon::now()->addMonth()->format('Y-m-d'); + $subscription = factory(Subscription::class)->make(['due_date' => $next1Months]); + + $this->assertEquals( + '', + $subscription->nearOfDueDateSign() + ); + } + + /** @test */ public function it_has_project_relation() { $subscription = factory(Subscription::class)->create();