feat: add internship date fields and business day calculation to career applications
This commit is contained in:
@@ -6,6 +6,7 @@ use Filament\Forms\Components\FileUpload;
|
|||||||
use Filament\Forms\Components\Select;
|
use Filament\Forms\Components\Select;
|
||||||
use Filament\Forms\Components\Textarea;
|
use Filament\Forms\Components\Textarea;
|
||||||
use Filament\Forms\Components\TextInput;
|
use Filament\Forms\Components\TextInput;
|
||||||
|
use Filament\Forms\Components\DatePicker;
|
||||||
use Filament\Schemas\Components\Section;
|
use Filament\Schemas\Components\Section;
|
||||||
use Filament\Schemas\Schema;
|
use Filament\Schemas\Schema;
|
||||||
use Illuminate\Support\Facades\Hash;
|
use Illuminate\Support\Facades\Hash;
|
||||||
@@ -94,8 +95,53 @@ class CareerApplicationForm
|
|||||||
->directory('signed_interns')
|
->directory('signed_interns')
|
||||||
->downloadable()
|
->downloadable()
|
||||||
->nullable(),
|
->nullable(),
|
||||||
|
|
||||||
|
DatePicker::make('internship_start_date')
|
||||||
|
->label('Staj Başlangıç Tarihi')
|
||||||
|
->live()
|
||||||
|
->afterStateUpdated(fn ($state, $get, Set $set) => self::calculateTotalDays($state, $get('internship_end_date'), $set))
|
||||||
|
->nullable(),
|
||||||
|
|
||||||
|
DatePicker::make('internship_end_date')
|
||||||
|
->label('Staj Bitiş Tarihi')
|
||||||
|
->live()
|
||||||
|
->afterStateUpdated(fn ($state, $get, Set $set) => self::calculateTotalDays($get('internship_start_date'), $state, $set))
|
||||||
|
->nullable(),
|
||||||
|
|
||||||
|
TextInput::make('internship_total_days')
|
||||||
|
->label('Toplam Staj Süresi (İş Günü)')
|
||||||
|
->numeric()
|
||||||
|
->disabled()
|
||||||
|
->dehydrated()
|
||||||
|
->nullable(),
|
||||||
])
|
])
|
||||||
->columnSpanFull(),
|
->columnSpanFull(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function calculateTotalDays($start, $end, Set $set): void
|
||||||
|
{
|
||||||
|
if (!$start || !$end) {
|
||||||
|
$set('internship_total_days', null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$startDate = \Carbon\Carbon::parse($start);
|
||||||
|
$endDate = \Carbon\Carbon::parse($end);
|
||||||
|
|
||||||
|
if ($startDate->gt($endDate)) {
|
||||||
|
$set('internship_total_days', 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$days = 0;
|
||||||
|
while ($startDate->lte($endDate)) {
|
||||||
|
if (!$startDate->isWeekend()) {
|
||||||
|
$days++;
|
||||||
|
}
|
||||||
|
$startDate->addDay();
|
||||||
|
}
|
||||||
|
|
||||||
|
$set('internship_total_days', $days);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,11 +136,18 @@ class CareerController extends Controller
|
|||||||
|
|
||||||
$request->validate([
|
$request->validate([
|
||||||
'internship_form' => 'required|file|mimes:pdf,docx,jpg,png,jpeg|max:51200',
|
'internship_form' => 'required|file|mimes:pdf,docx,jpg,png,jpeg|max:51200',
|
||||||
|
'internship_start_date' => 'required|date',
|
||||||
|
'internship_end_date' => 'required|date|after_or_equal:internship_start_date',
|
||||||
], [
|
], [
|
||||||
'internship_form.required' => 'Lütfen bir dosya seçin.',
|
'internship_form.required' => 'Lütfen bir dosya seçin.',
|
||||||
'internship_form.file' => 'Yüklenen öğe geçerli bir dosya olmalıdır.',
|
'internship_form.file' => 'Yüklenen öğe geçerli bir dosya olmalıdır.',
|
||||||
'internship_form.mimes' => 'Yalnızca PDF, DOCX, JPG ve PNG formatındaki dosyalar kabul edilir.',
|
'internship_form.mimes' => 'Yalnızca PDF, DOCX, JPG ve PNG formatındaki dosyalar kabul edilir.',
|
||||||
'internship_form.max' => 'Dosya boyutu en fazla 50MB olabilir.',
|
'internship_form.max' => 'Dosya boyutu en fazla 50MB olabilir.',
|
||||||
|
'internship_start_date.required' => 'Lütfen staj başlangıç tarihini girin.',
|
||||||
|
'internship_start_date.date' => 'Geçerli bir başlangıç tarihi girin.',
|
||||||
|
'internship_end_date.required' => 'Lütfen staj bitiş tarihini girin.',
|
||||||
|
'internship_end_date.date' => 'Geçerli bir bitiş tarihi girin.',
|
||||||
|
'internship_end_date.after_or_equal' => 'Bitiş tarihi, başlangıç tarihinden önce olamaz.',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$intern = CareerApplication::findOrFail(session('intern_id'));
|
$intern = CareerApplication::findOrFail(session('intern_id'));
|
||||||
@@ -152,11 +159,27 @@ class CareerController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
$path = $request->file('internship_form')->store('to_be_signed_interns', 'public');
|
$path = $request->file('internship_form')->store('to_be_signed_interns', 'public');
|
||||||
|
|
||||||
|
// Calculate business days (excluding weekends)
|
||||||
|
$startDate = \Carbon\Carbon::parse($request->internship_start_date);
|
||||||
|
$endDate = \Carbon\Carbon::parse($request->internship_end_date);
|
||||||
|
$days = 0;
|
||||||
|
$tempDate = $startDate->copy();
|
||||||
|
while ($tempDate->lte($endDate)) {
|
||||||
|
if (!$tempDate->isWeekend()) {
|
||||||
|
$days++;
|
||||||
|
}
|
||||||
|
$tempDate->addDay();
|
||||||
|
}
|
||||||
|
|
||||||
$intern->update([
|
$intern->update([
|
||||||
'to_be_signed_internship_form_path' => $path
|
'to_be_signed_internship_form_path' => $path,
|
||||||
|
'internship_start_date' => $request->internship_start_date,
|
||||||
|
'internship_end_date' => $request->internship_end_date,
|
||||||
|
'internship_total_days' => $days,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return redirect()->back()->with('success', 'İmzalanacak staj formunuz başarıyla yüklendi.');
|
return redirect()->back()->with('success', 'İmzalanacak staj formunuz ve staj tarihleri başarıyla kaydedildi.');
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->back()->with('error', 'Dosya yüklenirken bir hata oluştu.');
|
return redirect()->back()->with('error', 'Dosya yüklenirken bir hata oluştu.');
|
||||||
|
|||||||
@@ -25,6 +25,9 @@ class CareerApplication extends Model
|
|||||||
'password',
|
'password',
|
||||||
'signed_internship_form_path',
|
'signed_internship_form_path',
|
||||||
'to_be_signed_internship_form_path',
|
'to_be_signed_internship_form_path',
|
||||||
|
'internship_start_date',
|
||||||
|
'internship_end_date',
|
||||||
|
'internship_total_days',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('career_applications', function (Blueprint $table) {
|
||||||
|
$table->date('internship_start_date')->nullable()->after('to_be_signed_internship_form_path');
|
||||||
|
$table->date('internship_end_date')->nullable()->after('internship_start_date');
|
||||||
|
$table->integer('internship_total_days')->nullable()->after('internship_end_date');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('career_applications', function (Blueprint $table) {
|
||||||
|
$table->dropColumn(['internship_start_date', 'internship_end_date', 'internship_total_days']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -86,6 +86,27 @@
|
|||||||
@else Beklemede @endif
|
@else Beklemede @endif
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@if($intern->internship_start_date)
|
||||||
|
<div class="border-t border-slate-100 pt-4">
|
||||||
|
<span class="text-xs text-slate-400 font-semibold block">Staj Başlangıç Tarihi</span>
|
||||||
|
<span class="text-sm font-semibold text-slate-700 block mt-0.5">{{ \Carbon\Carbon::parse($intern->internship_start_date)->format('d.m.Y') }}</span>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if($intern->internship_end_date)
|
||||||
|
<div>
|
||||||
|
<span class="text-xs text-slate-400 font-semibold block">Staj Bitiş Tarihi</span>
|
||||||
|
<span class="text-sm font-semibold text-slate-700 block mt-0.5">{{ \Carbon\Carbon::parse($intern->internship_end_date)->format('d.m.Y') }}</span>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if($intern->internship_total_days)
|
||||||
|
<div>
|
||||||
|
<span class="text-xs text-slate-400 font-semibold block">Toplam Süre</span>
|
||||||
|
<span class="text-sm font-bold text-blue-600 block mt-0.5">{{ $intern->internship_total_days }} İş Günü <span class="text-xs text-slate-400 font-normal">(Haftada 5 Gün)</span></span>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user