From e79d76ee60ff60e0d7ca4c6b3d4495b535120b0b Mon Sep 17 00:00:00 2001 From: Nafies Luthfi Date: Tue, 7 Nov 2017 13:53:34 +0800 Subject: [PATCH] Restructure subscriptions table and adjust the feature related to it --- app/Entities/Subscriptions/Subscription.php | 9 ++- .../Subscriptions/SubscriptionsRepository.php | 4 +- app/Http/Controllers/SubscriptionsController.php | 61 +++++++++++----- app/Http/Requests/Subscriptions/CreateRequest.php | 19 +++-- app/Http/Requests/Subscriptions/UpdateRequest.php | 18 +++-- database/factories/ModelFactory.php | 78 +++++++------------- database/factories/SubscriptionFactory.php | 31 ++++++++ ...016_07_08_182606_create_subscriptions_table.php | 13 ++-- resources/lang/id/app.php | 81 +++++++++++---------- resources/lang/id/subscription.php | 61 ++++++++-------- resources/views/subscriptions/create.blade.php | 15 +--- resources/views/subscriptions/edit.blade.php | 16 ++--- resources/views/subscriptions/index.blade.php | 14 ++-- .../partials/subscription-show.blade.php | 17 ++--- routes/web/subscriptions.php | 2 +- tests/Feature/ManageSubscriptionsTest.php | 83 ++++++++++------------ tests/Unit/Models/SubscriptionTest.php | 11 +-- 17 files changed, 265 insertions(+), 268 deletions(-) create mode 100644 database/factories/SubscriptionFactory.php diff --git a/app/Entities/Subscriptions/Subscription.php b/app/Entities/Subscriptions/Subscription.php index 5c0a52a..19e02ee 100755 --- a/app/Entities/Subscriptions/Subscription.php +++ b/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() diff --git a/app/Entities/Subscriptions/SubscriptionsRepository.php b/app/Entities/Subscriptions/SubscriptionsRepository.php index 495aae4..e8c802d 100755 --- a/app/Entities/Subscriptions/SubscriptionsRepository.php +++ b/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); } } diff --git a/app/Http/Controllers/SubscriptionsController.php b/app/Http/Controllers/SubscriptionsController.php index 847857a..546f320 100755 --- a/app/Http/Controllers/SubscriptionsController.php +++ b/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'), + ]; + } + } diff --git a/app/Http/Requests/Subscriptions/CreateRequest.php b/app/Http/Requests/Subscriptions/CreateRequest.php index e0a5bd0..a883dd3 100644 --- a/app/Http/Requests/Subscriptions/CreateRequest.php +++ b/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', ]; } diff --git a/app/Http/Requests/Subscriptions/UpdateRequest.php b/app/Http/Requests/Subscriptions/UpdateRequest.php index 4cd1825..bc9b4ea 100644 --- a/app/Http/Requests/Subscriptions/UpdateRequest.php +++ b/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', ]; } diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php index 13f1c24..102d8df 100644 --- a/database/factories/ModelFactory.php +++ b/database/factories/ModelFactory.php @@ -1,93 +1,67 @@ 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; }, diff --git a/database/factories/SubscriptionFactory.php b/database/factories/SubscriptionFactory.php new file mode 100644 index 0000000..3dd9d3e --- /dev/null +++ b/database/factories/SubscriptionFactory.php @@ -0,0 +1,31 @@ +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; + }, + ]; +}); diff --git a/database/migrations/2016_07_08_182606_create_subscriptions_table.php b/database/migrations/2016_07_08_182606_create_subscriptions_table.php index a04309b..1a2190a 100644 --- a/database/migrations/2016_07_08_182606_create_subscriptions_table.php +++ b/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'); }); } diff --git a/resources/lang/id/app.php b/resources/lang/id/app.php index 0d55159..6d0719d 100644 --- a/resources/lang/id/app.php +++ b/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', ]; diff --git a/resources/lang/id/subscription.php b/resources/lang/id/subscription.php index c5a2576..f2d32ee 100644 --- a/resources/lang/id/subscription.php +++ b/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', ], ]; diff --git a/resources/views/subscriptions/create.blade.php b/resources/views/subscriptions/create.blade.php index ddeb332..2c34089 100755 --- a/resources/views/subscriptions/create.blade.php +++ b/resources/views/subscriptions/create.blade.php @@ -16,19 +16,10 @@
- {!! FormField::text('domain_name', ['label' => trans('subscription.domain_name')]) !!} + {!! FormField::text('name', ['label' => trans('subscription.name')]) !!}
- {!! FormField::price('domain_price', ['label' => trans('subscription.domain_price')]) !!} -
-
- {!! FormField::text('epp_code', ['label' => trans('subscription.epp_code')]) !!} -
-
- {!! FormField::text('hosting_capacity', ['label' => trans('subscription.hosting_capacity')]) !!} -
-
- {!! FormField::price('hosting_price', ['label' => trans('subscription.hosting_price')]) !!} + {!! FormField::price('price', ['label' => trans('subscription.price')]) !!}
@@ -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')]) !!}