Browse Source

Restructure subscriptions table and adjust the feature related to it

pull/1/head
Nafies Luthfi 8 years ago
parent
commit
e79d76ee60
  1. 9
      app/Entities/Subscriptions/Subscription.php
  2. 4
      app/Entities/Subscriptions/SubscriptionsRepository.php
  3. 61
      app/Http/Controllers/SubscriptionsController.php
  4. 19
      app/Http/Requests/Subscriptions/CreateRequest.php
  5. 18
      app/Http/Requests/Subscriptions/UpdateRequest.php
  6. 78
      database/factories/ModelFactory.php
  7. 31
      database/factories/SubscriptionFactory.php
  8. 13
      database/migrations/2016_07_08_182606_create_subscriptions_table.php
  9. 81
      resources/lang/id/app.php
  10. 61
      resources/lang/id/subscription.php
  11. 15
      resources/views/subscriptions/create.blade.php
  12. 16
      resources/views/subscriptions/edit.blade.php
  13. 14
      resources/views/subscriptions/index.blade.php
  14. 17
      resources/views/subscriptions/partials/subscription-show.blade.php
  15. 2
      routes/web/subscriptions.php
  16. 83
      tests/Feature/ManageSubscriptionsTest.php
  17. 11
      tests/Unit/Models/SubscriptionTest.php

9
app/Entities/Subscriptions/Subscription.php

@ -10,13 +10,18 @@ class Subscription extends Model
use PresentableTrait;
protected $presenter = 'App\Entities\Subscriptions\SubscriptionPresenter';
protected $guarded = ['id', 'created_at', 'updated_at'];
protected $guarded = ['id', 'created_at', 'updated_at'];
public function project()
{
return $this->belongsTo('App\Entities\Projects\Project');
}
public function customer()
{
return $this->belongsTo('App\Entities\Partners\Customer');
}
public function vendor()
{
return $this->belongsTo('App\Entities\Partners\Vendor');
@ -24,7 +29,7 @@ class Subscription extends Model
public function status()
{
return $this->status_id ? trans('app.active') : trans('app.in_active');
return $this->status_id == 1 ? trans('app.active') : trans('app.in_active');
}
public function getTypeAttribute()

4
app/Entities/Subscriptions/SubscriptionsRepository.php

@ -26,11 +26,11 @@ class SubscriptionsRepository extends BaseRepository
}
if ($q) {
$query->where('domain_name', 'like', '%'.$q.'%');
$query->where('name', 'like', '%'.$q.'%');
}
})
->with('vendor')
->with('customer', 'vendor')
->paginate($this->_paginate);
}
}

61
app/Http/Controllers/SubscriptionsController.php

@ -2,6 +2,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;
@ -30,53 +31,67 @@ class SubscriptionsController extends Controller
$projects = $this->repo->getProjectsList();
$vendors = $this->repo->getVendorsList();
$subscriptionTypes = [
1 => trans('subscription.types.domain'),
2 => trans('subscription.types.hosting'),
];
$subscriptionTypes = $this->getSubscriptionTypes();
return view('subscriptions.create', compact('projects', 'vendors', 'subscriptionTypes'));
}
public function store(CreateRequest $request)
{
$subscription = $this->repo->create($request->except('_token'));
$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();
flash()->success(trans('subscription.created'));
return redirect()->route('subscriptions.index');
}
public function show($subscriptionId)
public function show(Subscription $subscription)
{
$subscription = $this->repo->requireById($subscriptionId);
return view('subscriptions.show', compact('subscription'));
}
public function edit($subscriptionId)
public function edit(Subscription $subscription)
{
$subscription = $this->repo->requireById($subscriptionId);
$projects = $this->repo->getProjectsList();
$customers = $this->repo->getCustomersList();
$vendors = $this->repo->getVendorsList();
return view('subscriptions.edit', compact('subscription', 'projects', 'customers', 'vendors'));
$subscriptionTypes = $this->getSubscriptionTypes();
return view('subscriptions.edit', compact('subscription', 'projects', 'vendors', 'subscriptionTypes'));
}
public function update(UpdateRequest $request, $subscriptionId)
public function update(UpdateRequest $request, Subscription $subscription)
{
$subscription = $this->repo->update($request->except(['_method', '_token']), $subscriptionId);
$project = \App\Entities\Projects\Project::findOrFail($request->get('project_id'));
$subscriptionData = $request->except(['_method', '_token']);
$subscriptionData['customer_id'] = $project->customer_id;
$subscription->update($subscriptionData);
flash()->success(trans('subscription.updated'));
return redirect()->route('subscriptions.edit', $subscriptionId);
return redirect()->route('subscriptions.edit', $subscription->id);
}
public function delete($subscriptionId)
public function delete(Subscription $subscription)
{
$subscription = $this->repo->requireById($subscriptionId);
return view('subscriptions.delete', compact('subscription'));
}
public function destroy(DeleteRequest $request, $subscriptionId)
public function destroy(DeleteRequest $request, Subscription $subscription)
{
if ($subscriptionId == $request->get('subscription_id')) {
$this->repo->delete($subscriptionId);
if ($subscription->id == $request->get('subscription_id')) {
$subscription->delete();
flash()->success(trans('subscription.deleted'));
} else {
flash()->error(trans('subscription.undeleted'));
@ -85,4 +100,12 @@ class SubscriptionsController extends Controller
return redirect()->route('subscriptions.index');
}
public function getSubscriptionTypes()
{
return [
1 => trans('subscription.types.domain'),
2 => trans('subscription.types.hosting'),
];
}
}

19
app/Http/Requests/Subscriptions/CreateRequest.php

@ -25,17 +25,14 @@ class CreateRequest extends Request
public function rules()
{
return [
'domain_name' => 'required|max:60|unique:subscriptions,domain_name',
'epp_code' => 'max:60',
'domain_price' => 'required|numeric',
'hosting_capacity' => 'max:60',
'hosting_price' => 'required_with:hosting_capacity|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',
'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',
];
}

18
app/Http/Requests/Subscriptions/UpdateRequest.php

@ -25,16 +25,14 @@ class UpdateRequest extends Request
public function rules()
{
return [
'domain_name' => 'required|max:60|unique:subscriptions,domain_name,'.$this->segment(2),
'epp_code' => 'max:60',
'domain_price' => 'required|numeric',
'hosting_capacity' => 'max:60',
'hosting_price' => 'required_with:hosting_capacity|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',
'remark' => 'max:255',
'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',
];
}

78
database/factories/ModelFactory.php

@ -1,93 +1,67 @@
<?php
use App\Entities\Invoices\Invoice;
use App\Entities\Partners\Vendor;
use App\Entities\Projects\Feature;
use App\Entities\Projects\Project;
use App\Entities\Projects\Task;
use App\Entities\Subscriptions\Subscription;
use App\Entities\Users\Event;
use App\Entities\Users\User;
$factory->define(User::class, function (Faker\Generator $faker) {
return [
'name' => $faker->name,
'email' => $faker->unique()->email,
'password' => 'member',
'name' => $faker->name,
'email' => $faker->unique()->email,
'password' => 'member',
'remember_token' => str_random(10),
'api_token' => str_random(32),
];
});
$factory->define(Subscription::class, function (Faker\Generator $faker) {
$startDate = Carbon::parse($faker->dateTimeBetween('-1 year', '-1 month')->format('Y-m-d'));
return [
'project_id' => function () {
return factory(Project::class)->create()->id;
},
'type_id' => 1,
'status_id' => 1,
'domain_name' => 'www.'.str_random(10).'.com',
'domain_price' => 125000,
'epp_code' => str_random(10),
'hosting_capacity' => rand(1, 3).' GB',
'hosting_price' => rand(1, 5) * 100000,
'start_date' => $startDate->format('Y-m-d'),
'due_date' => $startDate->addYears(1)->format('Y-m-d'),
'remark' => $faker->paragraph,
'vendor_id' => function () {
return factory(Vendor::class)->create()->id;
},
'api_token' => str_random(32),
];
});
$factory->define(Feature::class, function (Faker\Generator $faker) {
return [
'project_id' => function () {
'project_id' => function () {
return factory(Project::class)->create()->id;
},
'name' => $faker->sentence(3),
'price' => rand(1, 10) * 100000,
'name' => $faker->sentence(3),
'price' => rand(1, 10) * 100000,
'description' => $faker->paragraph,
'worker_id' => function () {
'worker_id' => function () {
return factory(User::class)->create()->id;
},
'type_id' => 1, // Main feature
'position' => rand(1, 10),
'type_id' => 1, // Main feature
'position' => rand(1, 10),
];
});
$factory->define(Task::class, function (Faker\Generator $faker) {
return [
'feature_id' => function () {
'feature_id' => function () {
return factory(Feature::class)->create()->id;
},
'name' => $faker->sentence(3),
'name' => $faker->sentence(3),
'description' => $faker->paragraph,
'progress' => rand(40, 100),
'route_name' => implode('.', $faker->words(3)),
'position' => rand(1, 10),
'progress' => rand(40, 100),
'route_name' => implode('.', $faker->words(3)),
'position' => rand(1, 10),
];
});
$factory->define(Event::class, function (Faker\Generator $faker) {
return [
'user_id' => function () {
'user_id' => function () {
return factory(User::class)->create()->id;
},
'project_id' => function () {
return factory(Project::class)->create()->id;
},
'title' => $faker->words(rand(2, 4), true),
'body' => $faker->sentence,
'start' => $faker->dateTimeBetween('-2 months', '-2 months')->format('Y-m-d H:i:s'),
'end' => $faker->dateTimeBetween('-2 months', '-2 months')->format('Y-m-d H:i:s'),
'is_allday' => rand(0, 1),
'title' => $faker->words(rand(2, 4), true),
'body' => $faker->sentence,
'start' => $faker->dateTimeBetween('-2 months', '-2 months')->format('Y-m-d H:i:s'),
'end' => $faker->dateTimeBetween('-2 months', '-2 months')->format('Y-m-d H:i:s'),
'is_allday' => rand(0, 1),
];
});
@ -96,11 +70,11 @@ $factory->define(Invoice::class, function (Faker\Generator $faker) {
'project_id' => function () {
return factory(Project::class)->create()->id;
},
'number' => (new Invoice)->generateNewNumber(),
'items' => [],
'amount' => 100000,
'notes' => $faker->paragraph,
'status_id' => 1,
'number' => (new Invoice)->generateNewNumber(),
'items' => [],
'amount' => 100000,
'notes' => $faker->paragraph,
'status_id' => 1,
'creator_id' => function () {
return factory(User::class)->create()->id;
},

31
database/factories/SubscriptionFactory.php

@ -0,0 +1,31 @@
<?php
use App\Entities\Partners\Customer;
use App\Entities\Partners\Vendor;
use App\Entities\Projects\Project;
use App\Entities\Subscriptions\Subscription;
use Carbon\Carbon;
use Faker\Generator as Faker;
$factory->define(Subscription::class, function (Faker $faker) {
$startDate = Carbon::parse($faker->dateTimeBetween('-1 year', '-1 month')->format('Y-m-d'));
return [
'project_id' => function () {
return factory(Project::class)->create()->id;
},
'type_id' => 1,
'status_id' => 1,
'name' => 'www.'.str_random(10).'.com',
'price' => 125000,
'start_date' => $startDate->format('Y-m-d'),
'due_date' => $startDate->addYears(1)->format('Y-m-d'),
'customer_id' => function () {
return factory(Customer::class)->create()->id;
},
'vendor_id' => function () {
return factory(Vendor::class)->create()->id;
},
];
});

13
database/migrations/2016_07_08_182606_create_subscriptions_table.php

@ -15,19 +15,16 @@ class CreateSubscriptionsTable extends Migration
Schema::create('subscriptions', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('project_id');
$table->unsignedInteger('customer_id');
$table->unsignedInteger('vendor_id');
$table->unsignedTinyInteger('type_id');
$table->string('domain_name', 60);
$table->string('epp_code', 60)->nullable();
$table->unsignedInteger('domain_price');
$table->string('hosting_capacity', 60)->nullable();
$table->boolean('status_id')->unsigned()->default(1);
$table->integer('hosting_price')->unsigned()->nullable();
$table->string('name', 60);
$table->unsignedInteger('price');
$table->date('start_date')->nullable();
$table->date('due_date')->nullable();
$table->string('remark')->nullable();
$table->boolean('status_id')->unsigned()->default(1);
$table->string('notes')->nullable();
$table->timestamps();
$table->unique(['domain_name', 'epp_code'], 'domain_name_epp_code');
});
}

81
resources/lang/id/app.php

@ -2,50 +2,49 @@
return [
// Labels
'table_no' => '#',
'no' => 'Tidak',
'label' => 'Label',
'action' => 'Pilihan',
'welcome' => 'Selamat Datang',
'to' => 'Kepada',
'from' => 'Dari',
'active' => 'Aktif',
'in_active' => 'Non Aktif',
'show_detail_title' => 'Lihat detail :type :name',
'active' => 'Status',
'status' => 'Status',
'total' => 'Total',
'count' => 'Jumlah',
'table_no' => '#',
'no' => 'Tidak',
'label' => 'Label',
'action' => 'Pilihan',
'welcome' => 'Selamat Datang',
'to' => 'Kepada',
'from' => 'Dari',
'active' => 'Aktif',
'in_active' => 'Non Aktif',
'show_detail_title' => 'Lihat detail :type :name',
'status' => 'Status',
'total' => 'Total',
'count' => 'Jumlah',
// Action
'add' => 'Tambah',
'submit' => 'Submit',
'update' => 'Simpan Perubahan',
'delete' => 'Hapus',
'back' => 'Kembali',
'cancel' => 'Batal',
'reset' => 'Reset',
'show' => 'Lihat Detail',
'edit' => 'Edit',
'print' => 'Cetak',
'search' => 'Cari',
'filter' => 'Filter',
'pick' => 'Pilih',
'close' => 'Tutup',
'add' => 'Tambah',
'submit' => 'Submit',
'update' => 'Simpan Perubahan',
'delete' => 'Hapus',
'back' => 'Kembali',
'cancel' => 'Batal',
'reset' => 'Reset',
'show' => 'Lihat Detail',
'edit' => 'Edit',
'print' => 'Cetak',
'search' => 'Cari',
'filter' => 'Filter',
'pick' => 'Pilih',
'close' => 'Tutup',
'delete_confirm_button' => 'Ya, silakan hapus!',
'delete_confirm' => 'Anda yakin ingin menghapus?',
'change_photo' => 'Ganti Foto',
'done' => 'Selesai',
'delete_confirm' => 'Anda yakin ingin menghapus?',
'change_photo' => 'Ganti Foto',
'done' => 'Selesai',
// Attributes
'name' => 'Nama',
'notes' => 'Catatan',
'description' => 'Deskripsi',
'code' => 'Kode',
'date' => 'Tanggal',
'time' => 'Jam',
'created_at' => 'Dibuat pada',
'created_by' => 'Oleh',
'start_date' => 'Tanggal Mulai',
'end_date' => 'Tanggal Selesai',
'name' => 'Nama',
'notes' => 'Catatan',
'description' => 'Deskripsi',
'code' => 'Kode',
'date' => 'Tanggal',
'time' => 'Jam',
'created_at' => 'Dibuat pada',
'created_by' => 'Oleh',
'start_date' => 'Tanggal Mulai',
'end_date' => 'Tanggal Selesai',
];

61
resources/lang/id/subscription.php

@ -3,42 +3,45 @@
return [
// Labels
'subscription' => 'Langganan',
'subscriptions' => 'Daftar Langganan',
'search' => 'Cari Langganan',
'found' => 'Langganan ditemukan',
'not_found' => 'Langganan tidak ditemukan',
'empty' => 'Belum ada Langganan',
'back_to_index' => 'Kembali ke daftar Langganan',
'subscription' => 'Langganan',
'subscriptions' => 'Daftar Langganan',
'search' => 'Cari Langganan',
'found' => 'Langganan ditemukan',
'not_found' => 'Langganan tidak ditemukan',
'empty' => 'Belum ada Langganan',
'back_to_index' => 'Kembali ke daftar Langganan',
// Actions
'create' => 'Input Langganan Baru',
'created' => 'Input Langganan baru telah berhasil.',
'show' => 'Detail Langganan',
'edit' => 'Edit Langganan',
'update' => 'Update Langganan',
'updated' => 'Update data Langganan telah berhasil.',
'delete' => 'Hapus Langganan',
'deleted' => 'Hapus data Langganan telah berhasil.',
'undeleted' => 'Data Langganan gagal dihapus.',
'create' => 'Input Langganan Baru',
'created' => 'Input Langganan baru telah berhasil.',
'show' => 'Detail Langganan',
'edit' => 'Edit Langganan',
'update' => 'Update Langganan',
'updated' => 'Update data Langganan telah berhasil.',
'delete' => 'Hapus Langganan',
'deleted' => 'Hapus data Langganan telah berhasil.',
'undeleted' => 'Data Langganan gagal dihapus.',
// Attributes
'domain_name' => 'Domain',
'domain_price' => 'Harga Domain',
'epp_code' => 'Kode EPP',
'name' => 'Nama Langganan',
'price' => 'Harga',
'domain_name' => 'Domain',
'domain_price' => 'Harga Domain',
'epp_code' => 'Kode EPP',
'hosting_capacity' => 'Kapasitas Hosting',
'hosting_price' => 'Harga Hosting',
'start_date' => 'Mulai Sewa',
'due_date' => 'Perpanjangan',
'extension_price' => 'Biaya Perpanjangan',
'project' => 'Project',
'vendor' => 'Vendor',
'remark' => 'Catatan',
'type' => 'Jenis Langganan',
'hosting_price' => 'Harga Hosting',
'start_date' => 'Mulai Sewa',
'due_date' => 'Perpanjangan',
'extension_price' => 'Biaya Perpanjangan',
'project' => 'Project',
'customer' => 'Customer',
'vendor' => 'Vendor',
'notes' => 'Catatan',
'type' => 'Jenis Langganan',
// Types
'types' => [
'domain' => 'Domain',
'types' => [
'domain' => 'Domain',
'hosting' => 'Hosting',
],
];

15
resources/views/subscriptions/create.blade.php

@ -16,19 +16,10 @@
<div class="panel-body">
<div class="row">
<div class="col-sm-6">
{!! FormField::text('domain_name', ['label' => trans('subscription.domain_name')]) !!}
{!! FormField::text('name', ['label' => trans('subscription.name')]) !!}
</div>
<div class="col-sm-6">
{!! FormField::price('domain_price', ['label' => trans('subscription.domain_price')]) !!}
</div>
</div>
{!! FormField::text('epp_code', ['label' => trans('subscription.epp_code')]) !!}
<div class="row">
<div class="col-sm-6">
{!! FormField::text('hosting_capacity', ['label' => trans('subscription.hosting_capacity')]) !!}
</div>
<div class="col-sm-6">
{!! FormField::price('hosting_price', ['label' => trans('subscription.hosting_price')]) !!}
{!! FormField::price('price', ['label' => trans('subscription.price')]) !!}
</div>
</div>
<div class="row">
@ -42,7 +33,7 @@
{!! FormField::select('project_id', $projects, ['label' => trans('subscription.project'), 'value' => Request::get('project_id')]) !!}
{!! FormField::select('vendor_id', $vendors, ['label' => trans('subscription.vendor'), 'value' => Request::get('vendor_id')]) !!}
{!! FormField::radios('type_id', $subscriptionTypes, ['label' => trans('subscription.type'), 'value' => Request::get('type_id')]) !!}
{!! FormField::textarea('remark', ['label' => trans('subscription.remark')]) !!}
{!! FormField::textarea('notes', ['label' => trans('subscription.notes')]) !!}
</div>
<div class="panel-footer">

16
resources/views/subscriptions/edit.blade.php

@ -11,19 +11,10 @@
<div class="panel-body">
<div class="row">
<div class="col-sm-6">
{!! FormField::text('domain_name',['label'=> trans('subscription.domain_name')]) !!}
{!! FormField::text('name',['label'=> trans('subscription.name')]) !!}
</div>
<div class="col-sm-6">
{!! FormField::price('domain_price',['label'=> trans('subscription.domain_price')]) !!}
</div>
</div>
{!! FormField::text('epp_code',['label'=> trans('subscription.epp_code')]) !!}
<div class="row">
<div class="col-sm-6">
{!! FormField::text('hosting_capacity',['label'=> trans('subscription.hosting_capacity')]) !!}
</div>
<div class="col-sm-6">
{!! FormField::price('hosting_price',['label'=> trans('subscription.hosting_price')]) !!}
{!! FormField::price('price',['label'=> trans('subscription.price')]) !!}
</div>
</div>
<div class="row">
@ -37,7 +28,8 @@
{!! 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::textarea('remark',['label'=> trans('subscription.remark')]) !!}
{!! FormField::radios('type_id', $subscriptionTypes, ['label' => trans('subscription.type'), 'value' => Request::get('type_id')]) !!}
{!! FormField::textarea('notes',['label'=> trans('subscription.notes')]) !!}
</div>
<div class="panel-footer">

14
resources/views/subscriptions/index.blade.php

@ -18,11 +18,11 @@
<table class="table table-condensed">
<thead>
<th>{{ trans('app.table_no') }}</th>
<th>{{ trans('subscription.domain_name') }}</th>
<th class="text-center">{{ trans('subscription.hosting_capacity') }}</th>
<th>{{ trans('subscription.vendor') }}</th>
<th>{{ trans('subscription.name') }}</th>
<th>{{ trans('subscription.customer') }}</th>
<th class="text-right">{{ trans('subscription.due_date') }}</th>
<th class="text-right">{{ trans('subscription.extension_price') }}</th>
<th>{{ trans('subscription.vendor') }}</th>
<th class="text-center">{{ trans('app.status') }}</th>
<th>{{ trans('app.action') }}</th>
</thead>
@ -30,14 +30,14 @@
@forelse($subscriptions as $key => $subscription)
<tr {{ Carbon::parse($subscription->due_date)->diffInDays(Carbon::now()) < 60 ? 'class=bg-danger' : '' }}>
<td>{{ $subscriptions->firstItem() + $key }}</td>
<td>{{ $subscription->domain_name }}</td>
<td class="text-center">{{ $subscription->hosting_capacity }}</td>
<td>{{ $subscription->vendor->name }}</td>
<td>{{ $subscription->name }}</td>
<td>{{ $subscription->customer->name }}</td>
<td class="text-right" title="
{{ trans('subscription.start_date') }} : {{ dateId($subscription->start_date) }} \n
{{ trans('subscription.due_date') }} : {{ dateId($subscription->due_date) }}
">{{ dateId($subscription->due_date) }}</td>
<td class="text-right">{{ formatRp($subscription->domain_price + $subscription->hosting_price) }}</td>
<td class="text-right">{{ formatRp($subscription->price) }}</td>
<td>{{ $subscription->vendor->name }}</td>
<td class="text-center">{{ $subscription->status() }}</td>
<td>
{!! link_to_route('subscriptions.show',trans('app.show'),[$subscription->id],['class'=>'btn btn-info btn-xs']) !!}

17
resources/views/subscriptions/partials/subscription-show.blade.php

@ -3,26 +3,19 @@
<table class="table table-condensed">
<tbody>
<tr><td>{{ trans('subscription.project') }}</td><td>{{ $subscription->project->name }}</td></tr>
<tr><td>{{ trans('subscription.domain_name') }}</td><td>{{ $subscription->domain_name }}</td></tr>
<tr><td>{{ trans('subscription.domain_price') }}</td><td>{{ formatRp($subscription->domain_price) }}</td></tr>
<tr><td>{{ trans('subscription.epp_code') }}</td><td>{{ $subscription->epp_code }}</td></tr>
<tr><td>{{ trans('subscription.hosting_capacity') }}</td><td>{{ $subscription->hosting_capacity }}</td></tr>
<tr><td>{{ trans('subscription.hosting_price') }}</td><td>{{ formatRp($subscription->hosting_price) }}</td></tr>
<tr><td>{{ trans('subscription.name') }}</td><td>{{ $subscription->name }}</td></tr>
<tr><td>{{ trans('subscription.price') }}</td><td>{{ formatRp($subscription->price) }}</td></tr>
<tr><td>{{ trans('subscription.type') }}</td><td>{{ $subscription->type }}</td></tr>
<tr><td>{{ trans('subscription.start_date') }}</td><td>{{ dateId($subscription->start_date) }}</td></tr>
<tr><td>{{ trans('subscription.due_date') }}</td><td>{{ dateId($subscription->due_date) }}</td></tr>
<tr>
<td>{{ trans('subscription.customer') }}</td>
<td>
{{ $subscription->project->customer->name }}
</td>
</tr>
<tr><td>{{ trans('subscription.customer') }}</td><td>{{ $subscription->customer->name }}</td></tr>
<tr>
<td>{{ trans('subscription.project') }}</td>
<td>
{{ link_to_route('projects.subscriptions', $subscription->project->name, [$subscription->project_id], ['target' => '_blank']) }}
</td>
</tr>
<tr><td>{{ trans('subscription.remark') }}</td><td>{!! nl2br($subscription->remark) !!}</td></tr>
<tr><td>{{ trans('subscription.notes') }}</td><td>{!! nl2br($subscription->notes) !!}</td></tr>
</tbody>
</table>
<div class="panel-footer">

2
routes/web/subscriptions.php

@ -4,6 +4,6 @@ Route::group(['middleware' => ['web', 'auth']], function () {
/**
* Subscriptions Routes
*/
Route::get('subscriptions/{id}/delete', ['as' => 'subscriptions.delete', 'uses' => 'SubscriptionsController@delete']);
Route::get('subscriptions/{subscription}/delete', ['as' => 'subscriptions.delete', 'uses' => 'SubscriptionsController@delete']);
Route::resource('subscriptions', 'SubscriptionsController');
});

83
tests/Feature/ManageSubscriptionsTest.php

@ -12,8 +12,8 @@ class ManageSubscriptionsTest extends TestCase
/** @test */
public function admin_can_entry_subscription()
{
$user = $this->adminUserSigningIn();
$vendor = factory(Vendor::class)->create();
$user = $this->adminUserSigningIn();
$vendor = factory(Vendor::class)->create();
$project = factory(Project::class)->create();
$this->visit(route('subscriptions.index'));
@ -21,39 +21,36 @@ class ManageSubscriptionsTest extends TestCase
// Fill Form
$this->submitForm(trans('subscription.create'), [
'domain_name' => 'www.domain.com',
'domain_price' => 100000,
'epp_code' => 'EPPCODE',
'hosting_capacity' => '3GB',
'hosting_price' => 500000,
'start_date' => '2015-05-02',
'due_date' => '2016-05-02',
'project_id' => $project->id,
'vendor_id' => $vendor->id,
'type_id' => 1,
'remark' => '',
'name' => 'www.domain.com',
'price' => 100000,
'start_date' => '2015-05-02',
'due_date' => '2016-05-02',
'project_id' => $project->id,
'vendor_id' => $vendor->id,
'type_id' => 1,
'notes' => 'epp_code:EPPCODE',
]);
$this->see(trans('subscription.created'));
$this->seePageIs(route('subscriptions.index'));
$this->seeInDatabase('subscriptions', [
'project_id' => $project->id,
'domain_price' => 100000,
'epp_code' => 'EPPCODE',
'status_id' => 1,
'start_date' => '2015-05-02',
'due_date' => '2016-05-02',
'vendor_id' => $vendor->id,
'type_id' => 1,
'name' => 'www.domain.com',
'price' => 100000,
'start_date' => '2015-05-02',
'due_date' => '2016-05-02',
'project_id' => $project->id,
'vendor_id' => $vendor->id,
'type_id' => 1,
'notes' => 'epp_code:EPPCODE',
]);
}
/** @test */
public function admin_can_edit_subscription_data()
{
$user = $this->adminUserSigningIn();
$vendor = factory(Vendor::class)->create();
$user = $this->adminUserSigningIn();
$vendor = factory(Vendor::class)->create();
$project = factory(Project::class)->create();
$subscription = factory(Subscription::class)->create(['project_id' => $project->id]);
@ -62,35 +59,33 @@ class ManageSubscriptionsTest extends TestCase
// Fill Form
$this->submitForm(trans('subscription.update'), [
'epp_code' => 'EPPCODE1',
'hosting_capacity' => '4GB',
'hosting_price' => 500000,
'start_date' => '2015-05-02',
'due_date' => '2016-05-02',
'project_id' => $project->id,
'vendor_id' => $vendor->id,
'status_id' => 1,
'start_date' => '2015-05-02',
'due_date' => '2016-05-02',
'project_id' => $project->id,
'vendor_id' => $vendor->id,
'type_id' => 1,
'status_id' => 1,
'notes' => 'epp_code:EPPCODE1',
]);
$this->seePageIs(route('subscriptions.edit', $subscription->id));
$this->see(trans('subscription.updated'));
$this->seeInDatabase('subscriptions', [
'epp_code' => 'EPPCODE1',
'project_id' => $project->id,
'status_id' => 1,
'hosting_capacity' => '4GB',
'hosting_price' => '500000',
'start_date' => '2015-05-02',
'due_date' => '2016-05-02',
'vendor_id' => $vendor->id,
'start_date' => '2015-05-02',
'due_date' => '2016-05-02',
'project_id' => $project->id,
'vendor_id' => $vendor->id,
'type_id' => 1,
'status_id' => 1,
'notes' => 'epp_code:EPPCODE1',
]);
}
/** @test */
public function admin_can_delete_a_subscription()
{
$user = $this->adminUserSigningIn();
$user = $this->adminUserSigningIn();
$subscription = factory(Subscription::class)->create();
$this->visit(route('subscriptions.edit', $subscription->id));
@ -106,15 +101,13 @@ class ManageSubscriptionsTest extends TestCase
/** @test */
public function admin_can_see_a_subscription()
{
$user = $this->adminUserSigningIn();
$user = $this->adminUserSigningIn();
$subscription = factory(Subscription::class)->create();
$this->visit(route('subscriptions.show', $subscription->id));
$this->see($subscription->domain_name);
$this->see(formatRp($subscription->domain_price));
$this->see($subscription->hosting_capacity);
$this->see(formatRp($subscription->hosting_price));
$this->see($subscription->name);
$this->see(formatRp($subscription->price));
$this->see(dateId($subscription->start_date));
$this->see(dateId($subscription->due_date));
}

11
tests/Unit/Models/SubscriptionTest.php

@ -2,6 +2,7 @@
namespace Tests\Unit\Models;
use App\Entities\Partners\Customer;
use App\Entities\Partners\Vendor;
use App\Entities\Projects\Project;
use App\Entities\Subscriptions\Subscription;
@ -10,17 +11,17 @@ use Tests\TestCase as TestCase;
class SubscriptionTest extends TestCase
{
/** @test */
public function it_has_domain_name_attribute()
public function it_has_project_relation()
{
$subscription = factory(Subscription::class)->create(['domain_name' => 'Subscription 1 Domain Name']);
$this->assertEquals('Subscription 1 Domain Name', $subscription->domain_name);
$subscription = factory(Subscription::class)->create();
$this->assertInstanceOf(Project::class, $subscription->project);
}
/** @test */
public function it_has_project_relation()
public function it_has_customer_relation()
{
$subscription = factory(Subscription::class)->create();
$this->assertInstanceOf(Project::class, $subscription->project);
$this->assertInstanceOf(Customer::class, $subscription->customer);
}
/** @test */

Loading…
Cancel
Save