changes to sms packages and option to create user

This commit is contained in:
Simon Pocrnjič
2025-11-06 21:54:07 +01:00
parent ad8e0d5cee
commit 1395b72ae8
102 changed files with 1386 additions and 319 deletions
@@ -4,10 +4,8 @@
use App\Models\User;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Pest\Laravel; // for static analysis hints
use function Pest\Laravel\actingAs;
use function Pest\Laravel\get;
use function Pest\Laravel\post;
// for static analysis hints
it('shows index page', function () {
$user = User::factory()->create();
@@ -0,0 +1,152 @@
<?php
use App\Models\Client;
use App\Models\ClientCase;
use App\Models\Contract;
use App\Models\Permission;
use App\Models\Person\Person;
use App\Models\Person\PersonPhone;
use App\Models\Role;
use App\Models\Segment;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\DB;
uses(RefreshDatabase::class);
it('can filter contracts by start date range', function () {
// Create and authenticate admin user with manage-settings permission
$user = User::factory()->create();
$adminRole = Role::firstOrCreate(['slug' => 'admin'], ['name' => 'Admin']);
$permission = Permission::firstOrCreate(['slug' => 'manage-settings'], ['name' => 'Manage Settings']);
$adminRole->permissions()->syncWithoutDetaching([$permission->id]);
DB::table('role_user')->insert([
'role_id' => $adminRole->id,
'user_id' => $user->id,
'created_at' => now(),
'updated_at' => now(),
]);
$this->actingAs($user);
// Create a segment
$segment = Segment::factory()->create(['active' => true]);
// Create a person with phone
$person = Person::factory()->create();
$phone = PersonPhone::factory()->create([
'person_id' => $person->id,
'phone_type' => 'mobile',
'validated' => true,
]);
// Create a client
$client = Client::factory()->create(['person_id' => $person->id]);
// Create a client case
$clientCase = ClientCase::factory()->create([
'client_id' => $client->id,
'person_id' => $person->id,
]);
// Create contracts with different start dates
$contract1 = Contract::factory()->create([
'client_case_id' => $clientCase->id,
'start_date' => '2024-01-15',
'reference' => 'CONTRACT-2024-001',
]);
$contract2 = Contract::factory()->create([
'client_case_id' => $clientCase->id,
'start_date' => '2024-03-20',
'reference' => 'CONTRACT-2024-002',
]);
$contract3 = Contract::factory()->create([
'client_case_id' => $clientCase->id,
'start_date' => '2024-05-10',
'reference' => 'CONTRACT-2024-003',
]);
// Attach contracts to segment
$contract1->segments()->attach($segment->id, ['active' => true]);
$contract2->segments()->attach($segment->id, ['active' => true]);
$contract3->segments()->attach($segment->id, ['active' => true]);
// Test without date filters - should return all contracts
$response = $this->getJson(route('admin.packages.contracts', [
'segment_id' => $segment->id,
]));
$response->assertSuccessful();
$data = $response->json('data');
expect($data)->toHaveCount(3);
// Test with start_date_from filter
$response = $this->getJson(route('admin.packages.contracts', [
'segment_id' => $segment->id,
'start_date_from' => '2024-02-01',
]));
$response->assertSuccessful();
$data = $response->json('data');
expect($data)->toHaveCount(2);
expect(collect($data)->pluck('reference'))->toContain('CONTRACT-2024-002', 'CONTRACT-2024-003');
// Test with start_date_to filter
$response = $this->getJson(route('admin.packages.contracts', [
'segment_id' => $segment->id,
'start_date_to' => '2024-03-31',
]));
$response->assertSuccessful();
$data = $response->json('data');
expect($data)->toHaveCount(2);
expect(collect($data)->pluck('reference'))->toContain('CONTRACT-2024-001', 'CONTRACT-2024-002');
// Test with both date filters
$response = $this->getJson(route('admin.packages.contracts', [
'segment_id' => $segment->id,
'start_date_from' => '2024-02-01',
'start_date_to' => '2024-04-30',
]));
$response->assertSuccessful();
$data = $response->json('data');
expect($data)->toHaveCount(1);
expect($data[0]['reference'])->toBe('CONTRACT-2024-002');
expect($data[0]['start_date'])->toBe('2024-03-20');
});
it('validates date filter parameters', function () {
// Create and authenticate admin user with manage-settings permission
$user = User::factory()->create();
$adminRole = Role::firstOrCreate(['slug' => 'admin'], ['name' => 'Admin']);
$permission = Permission::firstOrCreate(['slug' => 'manage-settings'], ['name' => 'Manage Settings']);
$adminRole->permissions()->syncWithoutDetaching([$permission->id]);
DB::table('role_user')->insert([
'role_id' => $adminRole->id,
'user_id' => $user->id,
'created_at' => now(),
'updated_at' => now(),
]);
$this->actingAs($user);
$segment = Segment::factory()->create(['active' => true]);
// Test invalid start_date_from
$response = $this->getJson(route('admin.packages.contracts', [
'segment_id' => $segment->id,
'start_date_from' => 'invalid-date',
]));
$response->assertStatus(422);
$response->assertJsonValidationErrors('start_date_from');
// Test invalid start_date_to
$response = $this->getJson(route('admin.packages.contracts', [
'segment_id' => $segment->id,
'start_date_to' => 'invalid-date',
]));
$response->assertStatus(422);
$response->assertJsonValidationErrors('start_date_to');
});