200 lines
5.9 KiB
PHP
200 lines
5.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Models\Park;
|
|
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
|
|
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
|
use Illuminate\Http\UploadedFile;
|
|
use Illuminate\Support\Collection;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class ParkService
|
|
{
|
|
public function paginate(array $filters, int $perPage = 20): LengthAwarePaginator
|
|
{
|
|
$query = DB::table('park as p')
|
|
->leftJoin('city as c', 'p.city_id', '=', 'c.city_id')
|
|
->select([
|
|
'p.*',
|
|
'c.city_name',
|
|
]);
|
|
|
|
if (!empty($filters['park_name'])) {
|
|
$query->where('p.park_name', 'like', '%' . (string) $filters['park_name'] . '%');
|
|
}
|
|
|
|
if (!empty($filters['city_id'])) {
|
|
$query->where('p.city_id', (int) $filters['city_id']);
|
|
}
|
|
|
|
$sort = (string) ($filters['sort'] ?? '');
|
|
$sortType = (string) ($filters['sort_type'] ?? 'asc');
|
|
|
|
if ($sort === '') {
|
|
$sort = 'p.park_id';
|
|
}
|
|
|
|
$allowedSorts = [
|
|
'p.park_id',
|
|
'p.park_name',
|
|
'p.city_id',
|
|
'p.updated_at',
|
|
'c.city_name',
|
|
];
|
|
|
|
if (!in_array($sort, $allowedSorts, true)) {
|
|
$sort = 'p.park_id';
|
|
}
|
|
|
|
if (!in_array($sortType, ['asc', 'desc'], true)) {
|
|
$sortType = 'asc';
|
|
}
|
|
|
|
$query->orderBy($sort, $sortType);
|
|
|
|
return $query->paginate($perPage)->appends([
|
|
'park_name' => $filters['park_name'] ?? null,
|
|
'city_id' => $filters['city_id'] ?? null,
|
|
'sort' => $sort,
|
|
'sort_type' => $sortType,
|
|
]);
|
|
}
|
|
|
|
public function findOrFail(int $parkId): Park
|
|
{
|
|
$park = Park::find($parkId);
|
|
|
|
if (!$park) {
|
|
throw new ModelNotFoundException();
|
|
}
|
|
|
|
return $park;
|
|
}
|
|
|
|
public function create(array $payload, int $operatorId): Park
|
|
{
|
|
return DB::transaction(function () use ($payload, $operatorId) {
|
|
$park = new Park();
|
|
$park->fill($payload);
|
|
$park->operator_id = $operatorId;
|
|
$park->save();
|
|
|
|
return $park;
|
|
});
|
|
}
|
|
|
|
public function update(Park $park, array $payload, int $operatorId): Park
|
|
{
|
|
return DB::transaction(function () use ($park, $payload, $operatorId) {
|
|
$park->fill($payload);
|
|
$park->operator_id = $operatorId;
|
|
$park->save();
|
|
|
|
return $park;
|
|
});
|
|
}
|
|
|
|
public function deleteByIds(array $ids): bool
|
|
{
|
|
return (bool) Park::destroy($ids);
|
|
}
|
|
|
|
public function exportRows(): Collection
|
|
{
|
|
return DB::table('park as p')
|
|
->select([
|
|
'p.park_id',
|
|
'p.city_id',
|
|
'p.park_name',
|
|
'p.park_ruby',
|
|
'p.park_syllabary',
|
|
'p.park_adrs',
|
|
'p.park_close_flag',
|
|
'p.park_day',
|
|
'p.alert_flag',
|
|
'p.print_number',
|
|
'p.keep_alive',
|
|
'p.operator_id',
|
|
'p.update_grace_period_start_date',
|
|
'p.update_grace_period_start_time',
|
|
'p.update_grace_period_end_date',
|
|
'p.update_grace_period_end_time',
|
|
'p.parking_start_grace_period',
|
|
'p.reminder_type',
|
|
'p.reminder_time',
|
|
'p.immediate_use_permit',
|
|
'p.gender_display_flag',
|
|
'p.bd_display_flag',
|
|
'p.securityreg_display_flag',
|
|
'p.distance_twopoints',
|
|
'p.park_latitude',
|
|
'p.park_longitude',
|
|
'p.park_tel',
|
|
'p.park_fixed_contract',
|
|
'p.park_temporary_contract',
|
|
'p.park_restriction',
|
|
'p.park_procedure',
|
|
'p.park_payment',
|
|
'p.park_available_time_flag',
|
|
'p.park_available_time_from',
|
|
'p.park_available_time_to',
|
|
'p.park_manager_flag',
|
|
'p.park_manager_resident_from',
|
|
'p.park_manager_resident_to',
|
|
'p.park_roof_flag',
|
|
'p.park_issuing_machine_flag',
|
|
'p.park_using_method',
|
|
'p.park_contract_renewal_term',
|
|
'p.park_reservation',
|
|
'p.park_reference',
|
|
'p.student_id_confirm_type',
|
|
'p.reduction_guide_display_flag',
|
|
'p.reduction_age',
|
|
'p.reduction_guide_display_start_month',
|
|
'p.overyear_flag',
|
|
])
|
|
->orderBy('p.park_id', 'asc')
|
|
->get();
|
|
}
|
|
|
|
public function importCsv(UploadedFile $file): void
|
|
{
|
|
$data = \App\Utils::csvToArray($file);
|
|
|
|
DB::transaction(function () use ($data) {
|
|
Park::query()->delete();
|
|
|
|
$expectedCols = 13;
|
|
|
|
foreach ($data as $index => $items) {
|
|
if (count($items) !== $expectedCols) {
|
|
throw new \RuntimeException('列数が一致しません。line=' . ($index + 2));
|
|
}
|
|
|
|
$row = new Park();
|
|
$row->park_id = $items[0];
|
|
$row->city_id = $items[1];
|
|
$row->park_name = $items[3];
|
|
$row->park_ruby = $items[4];
|
|
$row->park_syllabary = $items[5];
|
|
$row->park_adrs = $items[6];
|
|
$row->park_close_flag = $items[7];
|
|
$row->park_day = $items[9];
|
|
$row->alert_flag = $items[10];
|
|
$row->print_number = $items[11];
|
|
$row->keep_alive = $items[12];
|
|
|
|
$row->save();
|
|
}
|
|
});
|
|
}
|
|
|
|
public function checkDuplicateByName(string $parkName): ?Park
|
|
{
|
|
return Park::where('park_name', $parkName)->first();
|
|
}
|
|
}
|