diff --git a/app/Entities/Agencies/Agency.php b/app/Entities/Agencies/Agency.php new file mode 100644 index 0000000..d0eda06 --- /dev/null +++ b/app/Entities/Agencies/Agency.php @@ -0,0 +1,10 @@ +assignRole('worker'); Auth::login($user); + $agency = Agency::create([ + 'name' => $request->get('agency_name'), + 'email' => $request->get('email'), + 'website' => $request->get('agency_website'), + 'owner_id' => $user->id, + ]); + flash()->success(trans('auth.welcome', ['name' => $user->name])); return redirect()->route('home'); } diff --git a/app/Http/Requests/Accounts/RegisterRequest.php b/app/Http/Requests/Accounts/RegisterRequest.php index a1bae41..b078562 100644 --- a/app/Http/Requests/Accounts/RegisterRequest.php +++ b/app/Http/Requests/Accounts/RegisterRequest.php @@ -24,9 +24,11 @@ class RegisterRequest extends Request public function rules() { return [ - 'name' => 'required', - 'email' => 'required|email|unique:users,email', - 'password' => 'required|between:6,15|confirmed', + 'agency_name' => 'required|max:255', + 'agency_website' => 'nullable|url|max:255', + 'name' => 'required|max:255', + 'email' => 'required|email|max:255|unique:users,email|unique:agencies,email', + 'password' => 'required|between:6,15|confirmed', 'password_confirmation' => 'required', ]; } @@ -34,13 +36,15 @@ class RegisterRequest extends Request public function messages() { return [ - 'name.required' => 'Nama harus diisi.', - 'email.required' => 'Email harus diisi.', - 'email.email' => 'Email tidak valid.', - 'email.unique' => 'Email ini sudah terdaftar.', - 'password.required' => 'Password harus diisi.', - 'password.between' => 'Password baru harus antara 6 - 15 karakter.', - 'password.confirmed' => 'Konfirmasi password tidak sesuai.', + 'agency_name.required' => 'Nama Agensi harus diisi.', + 'agency_website.url' => 'Alamat Website Agensi tidak valid.', + 'name.required' => 'Nama harus diisi.', + 'email.required' => 'Email harus diisi.', + 'email.email' => 'Email tidak valid.', + 'email.unique' => 'Email ini sudah terdaftar.', + 'password.required' => 'Password harus diisi.', + 'password.between' => 'Password baru harus antara 6 - 15 karakter.', + 'password.confirmed' => 'Konfirmasi password tidak sesuai.', 'password_confirmation.required' => 'Konfirmasi password harus diisi.', ]; } diff --git a/database/migrations/2017_10_28_170121_create_agencies_table.php b/database/migrations/2017_10_28_170121_create_agencies_table.php new file mode 100644 index 0000000..b85c38c --- /dev/null +++ b/database/migrations/2017_10_28_170121_create_agencies_table.php @@ -0,0 +1,37 @@ +increments('id'); + $table->string('name'); + $table->string('email')->unique(); + $table->string('address')->nullable(); + $table->string('phone')->nullable(); + $table->string('website')->nullable(); + $table->unsignedInteger('owner_id'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('agencies'); + } +} diff --git a/readme.md b/readme.md index dd17f32..7b122c1 100644 --- a/readme.md +++ b/readme.md @@ -1,3 +1,111 @@ # Project Management Office -Project Management Office, is a project management tool for freelancers and agencies to manage their project professionally. \ No newline at end of file +> # PMO.web.id + +Project Management Office, is a project management tool for freelancers and agencies to manage their project professionally. +Sebuah aplikasi untuk membantu freelancer dan agensi mengelola project web + +## Konsep + +### 1. Agency + +Agency adalah lembaga yang mengelola dan mengerjakan project, Agency tidak terbatas untuk perusahaan saja, freelancer juga dapat membuat agency + +1. User yang mendaftar menjadi seorang admin dari sebuah agency +2. Agency memiliki dari beberapa project +3. Agency memiliki dari beberapa user (pekerja) +4. Agency memiliki dari beberapa vendor +5. Agency memiliki beberapa customer +6. Seorang User yang telah terdaftar sebagai Worker dapat membuat Agency sendiri, untuk mengelola project sendiri. + +#### Relasi + +1. User has 0 to 1 Agency; Agency belongs to 1 User +2. Agency has 0 to many projects; Project belongs to an Agency +3. Agency has 1 to many workers; Worker (User) belongs to an Agency +4. Agency has 0 to many vendor; Vendor belongs to an Agency +5. Agency has 0 to many customer; Customer belongs to an Agency + +### 2. Project + +Project adalah pekerjaan yang dikerjakan oleh agency untuk seorang customernya + +1. Sebuah project adalah milik sebuah Agency +2. Sebuah project adalah milik sebuah Customer +3. Project memiliki beberapa Fitur/Item pekerjaan +4. Project memiliki beberapa Invoice +5. Project memiliki beberapa Pembayaran (dengan atau tanpa invoice) +6. Project memiliki beberapa Meeting (pertemuan dengan customer) + +#### Relasi + +1. Project belongs to an Agency; Agency has 0 to many Projects +2. Project belongs to a Customer; Customer has 0 to many Projects +3. Project has 0 to many Features/Project Items; Feature belongs to a Project +4. Project has 0 to many Invoices; Invoice belongs to a Project +5. Project has 0 to many Payments; Payment belongs to a Project +6. Project has 0 to many Meetings; Meeting belongs to a Project + + +### 3. Fitur/Item pekerjaan + +1. Fitur memiliki harga/biaya +2. Fitur memiliki seorang pekerja/PIC +3. Fitur memiliki beberapa sub-fitur +4. Fitur memiliki beberapa task (semacam checklist pekerjaan) +5. Fitur memiliki Atribut: + - Nama fitur + - Deskripsi + - PIC (pekerja/worker) + - Biaya/Fee + - Prioritas + - tanggal mulai + - tanggal selesai + - tanggal batal +6. Fitur memiliki beberapa dependency terhadap fitur lain + - Misal Fitur A merupakan dependency dari Fitur B + - Maka Fitur A harus diselesaikan dulu sebelum fitur B dikerjakan +7. Progress pengerjaan fitur dihitung otomatis berdasarkan rata-rata % Progress task +8. Fitur dapat diurutkan berdasarkan prioritas + +### 4. Task + +Task adalah item tugas yang dilakukan oleh PIC/Pekerja untuk memgerjakan 1 fitur + +1. Task dimiliki oleh sebuah Fitur/Item pekerjaan +2. Task dapat diurutkan berdasarkan prioritas +3. Task memiliki Atribut : + - Nama Task + - Deskripsi + - Progress (0 - 100 %) + - Prioritas + +### 5. Meeting + +Meeting adalah pertemuan yang dilakukan bersama Customer + +1. Meeting dilakukan untuk 1 project +2. Meeting memiliki Berita Acara Pertemuan (BAP) +3. BAP terdiri dari : + - tanggal + - daftar hadir + - agenda + - hasil pertemuan + + +### 6. Invoice + +Invoice adalah tagihan pembayaran yang dibuat oleh Agency kepada diberikan Customer. + +1. Invoice adalah milik sebuah project +2. Invoice memiliki beberapa pembayaran (misal invoice dibayar dicicil) +3. Invoice bisa diupdate status Lunas + +### 7. Pembayaran + +Adalah pembayaran yang dilakukan dari Customer kepada Agency (pemasukan), atau Agency kepada vendor (pengeluaran). + +1. Project memiliki beberapa Pembayaran +2. Pembayaran memiliki 1 Project +3. Pembayaran memiliki 1 Invoice +4. Pembayaran dapat cetak Kuitansi/Bukti pembayaran \ No newline at end of file diff --git a/resources/lang/id/agency.php b/resources/lang/id/agency.php new file mode 100644 index 0000000..ae9b8c5 --- /dev/null +++ b/resources/lang/id/agency.php @@ -0,0 +1,33 @@ + 'Agensi', + 'list' => 'Daftar Agensi', + 'search' => 'Cari Agensi', + 'not_found' => 'Agensi tidak ditemukan', + 'empty' => 'Belum ada Agensi', + 'back_to_show' => 'Kembali ke detail Agensi', + 'back_to_index' => 'Kembali ke daftar Agensi', + + // Actions + 'create' => 'Input Agensi Baru', + 'created' => 'Input Agensi baru telah berhasil.', + 'show' => 'Detail Agensi', + 'edit' => 'Edit Agensi', + 'update' => 'Update Agensi', + 'updated' => 'Update data Agensi telah berhasil.', + 'delete' => 'Hapus Agensi', + 'delete_confirm' => 'Anda yakin akan menghapus Agensi ini?', + 'deleted' => 'Hapus data Agensi telah berhasil.', + 'undeleted' => 'Data Agensi gagal dihapus.', + 'undeleteable' => 'Data Agensi tidak dapat dihapus.', + + // Attributes + 'name' => 'Nama Agensi', + 'email' => 'Email Agensi', + 'website' => 'Website Agensi', + 'address' => 'Alamat Agensi', + 'phone' => 'Telp. Agensi', + 'owner' => 'Pemilik Agensi', +]; diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php index 777dd00..22f602a 100644 --- a/resources/views/auth/register.blade.php +++ b/resources/views/auth/register.blade.php @@ -9,6 +9,18 @@
@include('auth.partials._notifications') {!! Form::open(['route'=>'auth.register','class'=>'form-horizontal']) !!} +
+ {!! Form::label('agency_name', trans('agency.name'), ['class'=>'col-md-4 control-label']) !!} +
+ {!! Form::text('agency_name', null, ['class'=>'form-control','placeholder' => trans('agency.name')]) !!} +
+
+
+ {!! Form::label('agency_website', trans('agency.website'), ['class'=>'col-md-4 control-label']) !!} +
+ {!! Form::text('agency_website', null, ['class'=>'form-control','placeholder' => trans('agency.website')]) !!} +
+
{!! Form::label('name', trans('app.name'), ['class'=>'col-md-4 control-label']) !!}
diff --git a/tests/Feature/Auth/MemberRegistrationTest.php b/tests/Feature/Auth/MemberRegistrationTest.php index 9543098..e0428be 100644 --- a/tests/Feature/Auth/MemberRegistrationTest.php +++ b/tests/Feature/Auth/MemberRegistrationTest.php @@ -44,12 +44,25 @@ class MemberRegistrationTest extends TestCase { $this->visit(route('auth.register')); $this->submitForm(trans('auth.register'), [ + 'agency_name' => 'Nama Agency', 'name' => 'Nama Member', 'email' => 'email@mail.com', 'password' => 'password.111', 'password_confirmation' => 'password.111', ]); + $this->seePageIs(route('home')); + $this->see(trans('auth.welcome', ['name' => 'Nama Member'])); + + $this->seeInDatabase('users', [ + 'name' => 'Nama Member', + 'email' => 'email@mail.com', + ]); + + $this->seeInDatabase('agencies', [ + 'name' => 'Nama Agency', + 'email' => 'email@mail.com', + ]); } }