From 872942d770a24045149d2b676dcf02c2ddd8e640 Mon Sep 17 00:00:00 2001 From: Hegifebrianto Date: Fri, 14 Feb 2025 16:48:15 +0700 Subject: [PATCH] feat-add-coa-master-to-connect-kasmasuk --- app/Http/Controllers/CoaController.php | 57 +++++++++++ app/Models/Coa.php | 22 +++++ database/factories/CoaFactory.php | 21 ++++ .../2025_02_14_083550_create_coas_table.php | 22 +++++ database/seeders/CoaSeeder.php | 24 +++++ routes/api.php | 6 ++ tests/Unit/CoaApiTest.php | 95 +++++++++++++++++++ 7 files changed, 247 insertions(+) create mode 100644 app/Http/Controllers/CoaController.php create mode 100644 app/Models/Coa.php create mode 100644 database/factories/CoaFactory.php create mode 100644 database/migrations/2025_02_14_083550_create_coas_table.php create mode 100644 database/seeders/CoaSeeder.php create mode 100644 tests/Unit/CoaApiTest.php diff --git a/app/Http/Controllers/CoaController.php b/app/Http/Controllers/CoaController.php new file mode 100644 index 0000000..d0b2b54 --- /dev/null +++ b/app/Http/Controllers/CoaController.php @@ -0,0 +1,57 @@ +json(Coa::all(), 200); + } + + // Simpan COA baru + public function store(Request $request) + { + $request->validate([ + 'code' => 'required|string|unique:coas,code', + 'name' => 'required|string', + ]); + + $coa = Coa::create($request->all()); + + return response()->json($coa, 201); + } + + // Ambil detail COA + public function show($id) + { + $coa = Coa::findOrFail($id); + return response()->json($coa, 200); + } + + // Update COA + public function update(Request $request, $id) + { + $coa = Coa::findOrFail($id); + + $request->validate([ + 'code' => 'sometimes|string|unique:coas,code,' . $id, + 'name' => 'sometimes|string', + ]); + + $coa->update($request->all()); + + return response()->json($coa, 200); + } + + // Hapus COA + public function destroy($id) + { + Coa::destroy($id); + return response()->json(['message' => 'Akun bank berhasil dihapus'], 200); + } +} diff --git a/app/Models/Coa.php b/app/Models/Coa.php new file mode 100644 index 0000000..29c0bc9 --- /dev/null +++ b/app/Models/Coa.php @@ -0,0 +1,22 @@ +hasMany(KasMasuk::class, 'coa_id'); + } +} \ No newline at end of file diff --git a/database/factories/CoaFactory.php b/database/factories/CoaFactory.php new file mode 100644 index 0000000..a4760f9 --- /dev/null +++ b/database/factories/CoaFactory.php @@ -0,0 +1,21 @@ + + */ +class CoaFactory extends Factory +{ + protected $model = Coa::class; + + public function definition() + { + return [ + 'code' => $this->faker->unique()->numerify('10#'), // 101, 102, 103, dll + 'name' => $this->faker->company(), + ]; + } +} diff --git a/database/migrations/2025_02_14_083550_create_coas_table.php b/database/migrations/2025_02_14_083550_create_coas_table.php new file mode 100644 index 0000000..aabc533 --- /dev/null +++ b/database/migrations/2025_02_14_083550_create_coas_table.php @@ -0,0 +1,22 @@ +id(); + $table->string('code')->unique(); // Kode akun bank + $table->string('name'); // Nama akun bank + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('coas'); + } +}; diff --git a/database/seeders/CoaSeeder.php b/database/seeders/CoaSeeder.php new file mode 100644 index 0000000..eeea98b --- /dev/null +++ b/database/seeders/CoaSeeder.php @@ -0,0 +1,24 @@ + '101', 'name' => 'Kas Besar'], + ['code' => '102', 'name' => 'Kas Kecil'], + ['code' => '103', 'name' => 'Bank BCA'], + ['code' => '104', 'name' => 'Bank Mandiri'], + ]); + } +} diff --git a/routes/api.php b/routes/api.php index c16d3e2..be9847b 100644 --- a/routes/api.php +++ b/routes/api.php @@ -3,6 +3,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; use App\Http\Controllers\KasMasukController; +use App\Http\Controllers\CoaController; /* |-------------------------------------------------------------------------- @@ -23,4 +24,9 @@ Route::middleware('auth:sanctum')->get('/user', function (Request $request) { Route::middleware('auth:sanctum')->group(function () { Route::apiResource('kas-masuk', KasMasukController::class); +}); + + +Route::middleware('auth:sanctum')->group(function () { + Route::apiResource('coas', CoaController::class); }); \ No newline at end of file diff --git a/tests/Unit/CoaApiTest.php b/tests/Unit/CoaApiTest.php new file mode 100644 index 0000000..e8c9ca9 --- /dev/null +++ b/tests/Unit/CoaApiTest.php @@ -0,0 +1,95 @@ +user = User::factory()->create(); // ✅ Create test user + } + + + public function test_can_get_all_coas() + { + Coa::factory()->count(3)->create(); + + $response = $this->actingAs($this->user)->getJson('/api/coas'); // ✅ Authenticate request + + $response->assertStatus(200) + ->assertJsonCount(3); + } + + + public function test_can_create_coa() + { + $coaData = [ + 'code' => '105', + 'name' => 'Bank BRI' + ]; + + $response = $this->actingAs($this->user)->postJson('/api/coas', $coaData); + + $response->assertStatus(201) + ->assertJson($coaData); + + $this->assertDatabaseHas('coas', $coaData); + } + + + public function test_can_get_single_coa() + { + $coa = Coa::factory()->create(); + + $response = $this->actingAs($this->user)->getJson("/api/coas/{$coa->id}"); + + $response->assertStatus(200) + ->assertJson([ + 'id' => $coa->id, + 'code' => $coa->code, + 'name' => $coa->name + ]); + } + + + public function test_can_update_coa() + { + $coa = Coa::factory()->create(); + + $updatedData = [ + 'code' => '106', + 'name' => 'Bank Permata' + ]; + + $response = $this->actingAs($this->user)->putJson("/api/coas/{$coa->id}", $updatedData); + + $response->assertStatus(200) + ->assertJson($updatedData); + + $this->assertDatabaseHas('coas', $updatedData); + } + + + public function test_can_delete_coa() + { + $coa = Coa::factory()->create(); + + $response = $this->actingAs($this->user)->deleteJson("/api/coas/{$coa->id}"); + + $response->assertStatus(200) + ->assertJson(['message' => 'Akun bank berhasil dihapus']); + + $this->assertDatabaseMissing('coas', ['id' => $coa->id]); + } +}