diff --git a/app/Http/Controllers/KasMasukController.php b/app/Http/Controllers/KasMasukController.php new file mode 100644 index 0000000..f54cc8b --- /dev/null +++ b/app/Http/Controllers/KasMasukController.php @@ -0,0 +1,79 @@ +get(); + return response()->json($kasMasuk, Response::HTTP_OK); + } + + // 2. Create New Entry + public function store(Request $request) + { + $request->validate([ + 'tanggal' => 'required|date', + 'deskripsi' => 'required|string', + 'jumlah' => 'required|numeric|min:0', + ]); + + $kasMasuk = KasMasuk::create([ + 'user_id' => Auth::id(), // Ambil user yang sedang login + 'tanggal' => $request->tanggal, + 'deskripsi' => $request->deskripsi, + 'jumlah' => $request->jumlah, + ]); + + return response()->json($kasMasuk, Response::HTTP_CREATED); + } + + // 3. Show Specific Entry + public function show($id) + { + $kasMasuk = KasMasuk::with('user')->find($id); + if (!$kasMasuk) { + return response()->json(['message' => 'Data tidak ditemukan'], Response::HTTP_NOT_FOUND); + } + return response()->json($kasMasuk, Response::HTTP_OK); + } + + // 4. Update Entry + public function update(Request $request, $id) + { + $kasMasuk = KasMasuk::find($id); + if (!$kasMasuk) { + return response()->json(['message' => 'Data tidak ditemukan'], Response::HTTP_NOT_FOUND); + } + + $request->validate([ + 'tanggal' => 'sometimes|date', + 'deskripsi' => 'sometimes|string', + 'jumlah' => 'sometimes|numeric|min:0', + ]); + + $kasMasuk->update($request->all()); + + return response()->json($kasMasuk, Response::HTTP_OK); + } + + // 5. Delete Entry + public function destroy($id) + { + $kasMasuk = KasMasuk::find($id); + if (!$kasMasuk) { + return response()->json(['message' => 'Data tidak ditemukan'], Response::HTTP_NOT_FOUND); + } + + $kasMasuk->delete(); + return response()->json(['message' => 'Data berhasil dihapus'], Response::HTTP_OK); + } +} diff --git a/app/Models/KasMasuk.php b/app/Models/KasMasuk.php new file mode 100644 index 0000000..9d38954 --- /dev/null +++ b/app/Models/KasMasuk.php @@ -0,0 +1,23 @@ +belongsTo(User::class); + } +} + diff --git a/database/factories/KasMasukFactory.php b/database/factories/KasMasukFactory.php new file mode 100644 index 0000000..2ebcdec --- /dev/null +++ b/database/factories/KasMasukFactory.php @@ -0,0 +1,20 @@ + + */ +class KasMasukFactory extends Factory +{ + public function definition() + { + return [ + 'tanggal' => $this->faker->date(), + 'deskripsi' => $this->faker->sentence(), + 'jumlah' => $this->faker->randomNumber(6), + ]; + } +} diff --git a/database/migrations/2025_02_13_134943_create_kas_masuks_table.php b/database/migrations/2025_02_13_134943_create_kas_masuks_table.php new file mode 100644 index 0000000..9a24fdd --- /dev/null +++ b/database/migrations/2025_02_13_134943_create_kas_masuks_table.php @@ -0,0 +1,26 @@ +id(); + $table->unsignedBigInteger('user_id'); // Metadata siapa yang membuat + $table->date('tanggal'); + $table->string('deskripsi'); + $table->float('jumlah', 15, 2); // Ubah dari decimal ke float + $table->timestamps(); + + // Foreign key ke tabel users + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + }); + } + + public function down() + { + Schema::dropIfExists('kas_masuks'); + } +}; diff --git a/database/seeders/KasMasukSeeder.php b/database/seeders/KasMasukSeeder.php new file mode 100644 index 0000000..db4beb6 --- /dev/null +++ b/database/seeders/KasMasukSeeder.php @@ -0,0 +1,17 @@ + 'John Doe', + 'email' => 'johndoe@example.com', + 'password' => Hash::make('password123'), + 'email_verified_at' => now(), + 'remember_token' => Str::random(10), + 'created_at' => now(), + 'updated_at' => now(), + ]); } } diff --git a/routes/api.php b/routes/api.php index 889937e..c16d3e2 100644 --- a/routes/api.php +++ b/routes/api.php @@ -2,6 +2,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; +use App\Http\Controllers\KasMasukController; /* |-------------------------------------------------------------------------- @@ -17,3 +18,9 @@ use Illuminate\Support\Facades\Route; Route::middleware('auth:sanctum')->get('/user', function (Request $request) { return $request->user(); }); + +// Route::apiResource(name: 'kas-masuk', KasMasukController::class); + +Route::middleware('auth:sanctum')->group(function () { + Route::apiResource('kas-masuk', KasMasukController::class); +}); \ No newline at end of file diff --git a/tests/Unit/KasMasukTest.php b/tests/Unit/KasMasukTest.php new file mode 100644 index 0000000..2169bfc --- /dev/null +++ b/tests/Unit/KasMasukTest.php @@ -0,0 +1,77 @@ +count(3)->create(); + + $response = $this->getJson('/api/kas-masuk'); + + $response->assertStatus(200) + ->assertJsonCount(3); + } + + /** @test */ + public function it_can_create_a_kas_masuk_entry() + { + $data = [ + 'tanggal' => now()->toDateString(), + 'deskripsi' => 'Pemasukan dari pelanggan', + 'jumlah' => 1000000, + ]; + + $response = $this->postJson('/api/kas-masuk', $data); + + $response->assertStatus(201) + ->assertJsonFragment(['deskripsi' => 'Pemasukan dari pelanggan']); + } + + /** @test */ + public function it_can_get_a_specific_kas_masuk_entry() + { + $kasMasuk = KasMasuk::factory()->create(); + + $response = $this->getJson("/api/kas-masuk/{$kasMasuk->id}"); + + $response->assertStatus(200) + ->assertJsonFragment(['deskripsi' => $kasMasuk->deskripsi]); + } + + /** @test */ + public function it_can_update_a_kas_masuk_entry() + { + $kasMasuk = KasMasuk::factory()->create(); + + $updateData = [ + 'deskripsi' => 'Pemasukan dari investasi', + 'jumlah' => 2000000 + ]; + + $response = $this->putJson("/api/kas-masuk/{$kasMasuk->id}", $updateData); + + $response->assertStatus(200) + ->assertJsonFragment(['deskripsi' => 'Pemasukan dari investasi']); + } + + /** @test */ + public function it_can_delete_a_kas_masuk_entry() + { + $kasMasuk = KasMasuk::factory()->create(); + + $response = $this->deleteJson("/api/kas-masuk/{$kasMasuk->id}"); + + $response->assertStatus(200); + $this->assertDatabaseMissing('kas_masuks', ['id' => $kasMasuk->id]); + } +}