Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions app/Enums/ApplicationStatus.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

declare(strict_types=1);

namespace App\Enums;

enum ApplicationStatus: string
{
case LEAD = 'lead';
case APPLIED = 'applied';
case INTERVIEWING = 'interviewing';
case OFFER = 'offer'; // terminal
case REJECTED = 'rejected'; // terminal
case WITHDRAWN = 'withdrawn'; // terminal
}
14 changes: 14 additions & 0 deletions app/Enums/InteractionType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

declare(strict_types=1);

namespace App\Enums;

enum InteractionType: string
{
case NOTE = 'note';
case STATUS_CHANGE = 'status_change';
case EMAIL = 'email';
case CALL = 'call';
case INTERVIEW = 'interview';
}
63 changes: 63 additions & 0 deletions app/Models/Application.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<?php

declare(strict_types=1);

namespace App\Models;

use App\Enums\ApplicationStatus;
use Carbon\CarbonImmutable;
use Database\Factories\ApplicationFactory;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Carbon;

/**
* @property int $id
* @property int $company_id
* @property string $role_title
* @property string|null $source
* @property ApplicationStatus $status
* @property CarbonImmutable|null $applied_at
* @property string|null $notes
* @property Carbon $created_at
* @property Carbon $updated_at
* @property-read Company $company
* @property-read Collection<int, Interaction> $interactions
*/
final class Application extends Model
{
/** @use HasFactory<ApplicationFactory> */
use HasFactory;

protected $fillable = [
'company_id',
'role_title',
'source',
'status',
'applied_at',
'notes',
];

/** @phpstan-return BelongsTo<Company, $this> */
public function company(): BelongsTo
{
return $this->belongsTo(Company::class);
}

/** @phpstan-return HasMany<Interaction, $this> */
public function interactions(): HasMany
{
return $this->hasMany(Interaction::class);
}

protected function casts(): array
{
return [
'status' => ApplicationStatus::class,
'applied_at' => 'immutable_datetime',
];
}
}
62 changes: 62 additions & 0 deletions app/Models/Company.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php

declare(strict_types=1);

namespace App\Models;

use Carbon\CarbonImmutable;
use Database\Factories\CompanyFactory;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Carbon;

/**
* @property int $id
* @property string $name
* @property string|null $kvk_number
* @property string|null $website
* @property string|null $city
* @property string|null $sbi_code
* @property string|null $sbi_description
* @property CarbonImmutable|null $enriched_at
* @property Carbon $created_at
* @property Carbon $updated_at
* @property-read Collection<int, Application> $applications
* @property-read Collection<int, Contact> $contacts
*/
final class Company extends Model
{
/** @use HasFactory<CompanyFactory> */
use HasFactory;

protected $fillable = [
'name',
'kvk_number',
'website',
'city',
'sbi_code',
'sbi_description',
'enriched_at',
];

/** @phpstan-return HasMany<Application, $this> */
public function applications(): HasMany
{
return $this->hasMany(Application::class);
}

/** @phpstan-return HasMany<Contact, $this> */
public function contacts(): HasMany
{
return $this->hasMany(Contact::class);
}

protected function casts(): array
{
return [
'enriched_at' => 'immutable_datetime',
];
}
}
51 changes: 51 additions & 0 deletions app/Models/Contact.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?php

declare(strict_types=1);

namespace App\Models;

use Database\Factories\ContactFactory;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Carbon;

/**
* @property int $id
* @property int $company_id
* @property string $name
* @property string|null $role
* @property string|null $email
* @property string|null $phone
* @property Carbon $created_at
* @property Carbon $updated_at
* @property-read Company $company
* @property-read Collection<int, Interaction> $interactions
*/
final class Contact extends Model
{
/** @use HasFactory<ContactFactory> */
use HasFactory;

protected $fillable = [
'company_id',
'name',
'role',
'email',
'phone',
];

/** @phpstan-return BelongsTo<Company, $this> */
public function company(): BelongsTo
{
return $this->belongsTo(Company::class);
}

/** @phpstan-return HasMany<Interaction, $this> */
public function interactions(): HasMany
{
return $this->hasMany(Interaction::class);
}
}
59 changes: 59 additions & 0 deletions app/Models/Interaction.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?php

declare(strict_types=1);

namespace App\Models;

use App\Enums\InteractionType;
use Carbon\CarbonImmutable;
use Database\Factories\InteractionFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Carbon;

/**
* @property int $id
* @property int $application_id
* @property int|null $contact_id
* @property InteractionType $type
* @property CarbonImmutable $occurred_at
* @property string|null $body
* @property Carbon $created_at
* @property Carbon $updated_at
* @property-read Application $application
* @property-read Contact|null $contact
*/
final class Interaction extends Model
{
/** @use HasFactory<InteractionFactory> */
use HasFactory;

protected $fillable = [
'application_id',
'contact_id',
'type',
'occurred_at',
'body',
];

/** @phpstan-return BelongsTo<Application, $this> */
public function application(): BelongsTo
{
return $this->belongsTo(Application::class);
}

/** @phpstan-return BelongsTo<Contact, $this> */
public function contact(): BelongsTo
{
return $this->belongsTo(Contact::class);
}

protected function casts(): array
{
return [
'type' => InteractionType::class,
'occurred_at' => 'immutable_datetime',
];
}
}
64 changes: 64 additions & 0 deletions database/factories/ApplicationFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php

declare(strict_types=1);

namespace Database\Factories;

use App\Enums\ApplicationStatus;
use App\Models\Application;
use App\Models\Company;
use Illuminate\Database\Eloquent\Factories\Factory;

/**
* @extends Factory<Application>
*/
final class ApplicationFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'company_id' => Company::factory(),
'role_title' => $this->faker->jobTitle(),
'source' => null,
'status' => ApplicationStatus::APPLIED,
'applied_at' => null,
'notes' => null,
];
}

public function lead(): self
{
return $this->set('status', ApplicationStatus::LEAD);
}

public function interviewing(): self
{
return $this->set('status', ApplicationStatus::INTERVIEWING);
}

public function offer(): self
{
return $this->set('status', ApplicationStatus::OFFER);
}

public function rejected(): self
{
return $this->set('status', ApplicationStatus::REJECTED);
}

public function withdrawn(): self
{
return $this->set('status', ApplicationStatus::WITHDRAWN);
}

/** @param Company|Factory<Company> $company */
public function forCompany(Company|Factory $company): self
{
return $this->set('company_id', $company);
}
}
32 changes: 32 additions & 0 deletions database/factories/CompanyFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

declare(strict_types=1);

namespace Database\Factories;

use App\Models\Company;
use Illuminate\Database\Eloquent\Factories\Factory;

/**
* @extends Factory<Company>
*/
final class CompanyFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'name' => $this->faker->company(),
'kvk_number' => null,
'website' => null,
'city' => null,
'sbi_code' => null,
'sbi_description' => null,
'enriched_at' => null,
];
}
}
Loading