feat-add-coa-master-to-connect-kasmasuk
WMS API/ERP-API/pipeline/head This commit looks good Details

This commit is contained in:
Hegifebrianto 2025-02-14 16:48:15 +07:00
parent 16ca1e9c01
commit 872942d770
7 changed files with 247 additions and 0 deletions

View File

@ -0,0 +1,57 @@
<?php
namespace App\Http\Controllers;
use App\Models\Coa;
use Illuminate\Http\Request;
class CoaController extends Controller
{
// Ambil semua data COA
public function index()
{
return response()->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);
}
}

22
app/Models/Coa.php Normal file
View File

@ -0,0 +1,22 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Coa extends Model
{
use HasFactory;
protected $fillable = ['code', 'name'];
/**
* Relasi ke Kas Masuk (satu akun bisa memiliki banyak transaksi).
*/
public function kasMasuks(): HasMany
{
return $this->hasMany(KasMasuk::class, 'coa_id');
}
}

View File

@ -0,0 +1,21 @@
<?php
namespace Database\Factories;
use App\Models\Coa;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Coa>
*/
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(),
];
}
}

View File

@ -0,0 +1,22 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('coas', function (Blueprint $table) {
$table->id();
$table->string('code')->unique(); // Kode akun bank
$table->string('name'); // Nama akun bank
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('coas');
}
};

View File

@ -0,0 +1,24 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Coa;
class CoaSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
Coa::insert([
['code' => '101', 'name' => 'Kas Besar'],
['code' => '102', 'name' => 'Kas Kecil'],
['code' => '103', 'name' => 'Bank BCA'],
['code' => '104', 'name' => 'Bank Mandiri'],
]);
}
}

View File

@ -3,6 +3,7 @@
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
use App\Http\Controllers\KasMasukController; use App\Http\Controllers\KasMasukController;
use App\Http\Controllers\CoaController;
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -24,3 +25,8 @@ Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
Route::middleware('auth:sanctum')->group(function () { Route::middleware('auth:sanctum')->group(function () {
Route::apiResource('kas-masuk', KasMasukController::class); Route::apiResource('kas-masuk', KasMasukController::class);
}); });
Route::middleware('auth:sanctum')->group(function () {
Route::apiResource('coas', CoaController::class);
});

95
tests/Unit/CoaApiTest.php Normal file
View File

@ -0,0 +1,95 @@
<?php
namespace Tests\Unit;
use Tests\TestCase;
use App\Models\Coa;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
class CoaApiTest extends TestCase
{
use RefreshDatabase;
protected $user;
protected function setUp(): void
{
parent::setUp();
$this->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]);
}
}