Add personal application fields to members
This commit is contained in:
@@ -46,7 +46,7 @@ class ImportMembers extends Command
|
|||||||
|
|
||||||
$header = array_map('trim', $header);
|
$header = array_map('trim', $header);
|
||||||
|
|
||||||
$expected = [
|
$required = [
|
||||||
'full_name',
|
'full_name',
|
||||||
'email',
|
'email',
|
||||||
'phone',
|
'phone',
|
||||||
@@ -60,7 +60,7 @@ class ImportMembers extends Command
|
|||||||
'membership_expires_at',
|
'membership_expires_at',
|
||||||
];
|
];
|
||||||
|
|
||||||
foreach ($expected as $column) {
|
foreach ($required as $column) {
|
||||||
if (! in_array($column, $header, true)) {
|
if (! in_array($column, $header, true)) {
|
||||||
$this->error("Missing required column: {$column}");
|
$this->error("Missing required column: {$column}");
|
||||||
fclose($handle);
|
fclose($handle);
|
||||||
@@ -82,8 +82,19 @@ class ImportMembers extends Command
|
|||||||
}
|
}
|
||||||
|
|
||||||
$fullName = trim($row[$indexes['full_name']] ?? '');
|
$fullName = trim($row[$indexes['full_name']] ?? '');
|
||||||
$nationalId = trim($row[$indexes['national_id']] ?? '');
|
$memberNumber = isset($indexes['member_number']) ? trim($row[$indexes['member_number']] ?? '') : '';
|
||||||
|
$nationalId = isset($indexes['national_id']) ? trim($row[$indexes['national_id']] ?? '') : '';
|
||||||
$phone = trim($row[$indexes['phone']] ?? '');
|
$phone = trim($row[$indexes['phone']] ?? '');
|
||||||
|
$phoneHome = isset($indexes['phone_home']) ? trim($row[$indexes['phone_home']] ?? '') : '';
|
||||||
|
$phoneFax = isset($indexes['phone_fax']) ? trim($row[$indexes['phone_fax']] ?? '') : '';
|
||||||
|
$birthDate = isset($indexes['birth_date']) ? trim($row[$indexes['birth_date']] ?? '') : '';
|
||||||
|
$gender = isset($indexes['gender']) ? trim($row[$indexes['gender']] ?? '') : '';
|
||||||
|
$identityType = isset($indexes['identity_type']) ? trim($row[$indexes['identity_type']] ?? '') : '';
|
||||||
|
$identityOtherText = isset($indexes['identity_other_text']) ? trim($row[$indexes['identity_other_text']] ?? '') : '';
|
||||||
|
$occupation = isset($indexes['occupation']) ? trim($row[$indexes['occupation']] ?? '') : '';
|
||||||
|
$employer = isset($indexes['employer']) ? trim($row[$indexes['employer']] ?? '') : '';
|
||||||
|
$jobTitle = isset($indexes['job_title']) ? trim($row[$indexes['job_title']] ?? '') : '';
|
||||||
|
$appliedAt = isset($indexes['applied_at']) ? trim($row[$indexes['applied_at']] ?? '') : '';
|
||||||
$started = trim($row[$indexes['membership_started_at']] ?? '');
|
$started = trim($row[$indexes['membership_started_at']] ?? '');
|
||||||
$expires = trim($row[$indexes['membership_expires_at']] ?? '');
|
$expires = trim($row[$indexes['membership_expires_at']] ?? '');
|
||||||
$address1 = trim($row[$indexes['address_line_1']] ?? '');
|
$address1 = trim($row[$indexes['address_line_1']] ?? '');
|
||||||
@@ -109,10 +120,21 @@ class ImportMembers extends Command
|
|||||||
$member = Member::updateOrCreate(
|
$member = Member::updateOrCreate(
|
||||||
['user_id' => $user->id],
|
['user_id' => $user->id],
|
||||||
[
|
[
|
||||||
|
'member_number' => $memberNumber !== '' ? $memberNumber : null,
|
||||||
'full_name' => $fullName !== '' ? $fullName : $user->name,
|
'full_name' => $fullName !== '' ? $fullName : $user->name,
|
||||||
'email' => $email,
|
'email' => $email,
|
||||||
'national_id' => $nationalId !== '' ? $nationalId : null,
|
'national_id' => $nationalId !== '' ? $nationalId : null,
|
||||||
'phone' => $phone !== '' ? $phone : null,
|
'phone' => $phone !== '' ? $phone : null,
|
||||||
|
'phone_home' => $phoneHome !== '' ? $phoneHome : null,
|
||||||
|
'phone_fax' => $phoneFax !== '' ? $phoneFax : null,
|
||||||
|
'birth_date' => $birthDate !== '' ? $birthDate : null,
|
||||||
|
'gender' => $gender !== '' ? $gender : null,
|
||||||
|
'identity_type' => $identityType !== '' ? $identityType : null,
|
||||||
|
'identity_other_text' => $identityOtherText !== '' ? $identityOtherText : null,
|
||||||
|
'occupation' => $occupation !== '' ? $occupation : null,
|
||||||
|
'employer' => $employer !== '' ? $employer : null,
|
||||||
|
'job_title' => $jobTitle !== '' ? $jobTitle : null,
|
||||||
|
'applied_at' => $appliedAt !== '' ? $appliedAt : null,
|
||||||
'address_line_1' => $address1 ?: null,
|
'address_line_1' => $address1 ?: null,
|
||||||
'address_line_2' => $address2 ?: null,
|
'address_line_2' => $address2 ?: null,
|
||||||
'city' => $city ?: null,
|
'city' => $city ?: null,
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ use Illuminate\Console\Command;
|
|||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use Illuminate\Support\Facades\Hash;
|
use Illuminate\Support\Facades\Hash;
|
||||||
use PhpOffice\PhpSpreadsheet\IOFactory;
|
use PhpOffice\PhpSpreadsheet\IOFactory;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Shared\Date as ExcelDate;
|
||||||
|
|
||||||
class ImportMembersCommand extends Command
|
class ImportMembersCommand extends Command
|
||||||
{
|
{
|
||||||
@@ -78,11 +79,17 @@ class ImportMembersCommand extends Command
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$phone = $this->normalizePhone($row[6] ?? '');
|
$memberNumber = $this->normalizeMemberNumber($row[0] ?? '');
|
||||||
$email = $this->resolveEmail($name, $row[10] ?? '');
|
$birthDate = $this->normalizeRocDate($row[2] ?? '');
|
||||||
$nationalId = trim($row[7] ?? '');
|
$gender = $this->normalizeGender($row[3] ?? '');
|
||||||
|
$occupation = trim($row[4] ?? '');
|
||||||
$address = trim($row[5] ?? '');
|
$address = trim($row[5] ?? '');
|
||||||
$memberType = $this->mapMemberType($row[8] ?? '');
|
$phone = $this->normalizePhone($row[6] ?? '');
|
||||||
|
$nationalId = trim($row[7] ?? '');
|
||||||
|
[$identityType, $identityOtherText] = $this->parseIdentityType($row[8] ?? '');
|
||||||
|
$applyDate = $this->normalizeRocDate($row[9] ?? '');
|
||||||
|
$email = $this->resolveEmail($name, $row[10] ?? '');
|
||||||
|
$memberType = Member::TYPE_INDIVIDUAL;
|
||||||
|
|
||||||
// Validate phone for password generation
|
// Validate phone for password generation
|
||||||
if (strlen($phone) < 4) {
|
if (strlen($phone) < 4) {
|
||||||
@@ -102,6 +109,15 @@ class ImportMembersCommand extends Command
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($memberNumber) {
|
||||||
|
$existingMemberNumber = Member::where('member_number', $memberNumber)->first();
|
||||||
|
if ($existingMemberNumber) {
|
||||||
|
$this->warn("Row {$rowNum}: {$name} - Member number already exists: {$memberNumber}");
|
||||||
|
$skipped++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Check for existing member by national ID
|
// Check for existing member by national ID
|
||||||
if ($nationalId) {
|
if ($nationalId) {
|
||||||
$existingMember = Member::where('national_id_hash', hash('sha256', $nationalId))->first();
|
$existingMember = Member::where('national_id_hash', hash('sha256', $nationalId))->first();
|
||||||
@@ -128,13 +144,24 @@ class ImportMembersCommand extends Command
|
|||||||
// Create Member
|
// Create Member
|
||||||
$member = Member::create([
|
$member = Member::create([
|
||||||
'user_id' => $user->id,
|
'user_id' => $user->id,
|
||||||
|
'member_number' => $memberNumber ?: null,
|
||||||
'full_name' => $name,
|
'full_name' => $name,
|
||||||
'email' => $email,
|
'email' => $email,
|
||||||
'phone' => $phone,
|
'phone' => $phone,
|
||||||
|
'phone_home' => null,
|
||||||
|
'phone_fax' => null,
|
||||||
'address_line_1' => $address,
|
'address_line_1' => $address,
|
||||||
'national_id' => $nationalId ?: null,
|
'national_id' => $nationalId ?: null,
|
||||||
'membership_status' => Member::STATUS_ACTIVE,
|
'membership_status' => Member::STATUS_ACTIVE,
|
||||||
'membership_type' => $memberType,
|
'membership_type' => $memberType,
|
||||||
|
'identity_type' => $identityType,
|
||||||
|
'identity_other_text' => $identityOtherText ?: null,
|
||||||
|
'birth_date' => $birthDate,
|
||||||
|
'gender' => $gender,
|
||||||
|
'occupation' => $occupation ?: null,
|
||||||
|
'employer' => null,
|
||||||
|
'job_title' => null,
|
||||||
|
'applied_at' => $applyDate,
|
||||||
'membership_started_at' => now(),
|
'membership_started_at' => now(),
|
||||||
'membership_expires_at' => now()->endOfYear(), // 2026-12-31
|
'membership_expires_at' => now()->endOfYear(), // 2026-12-31
|
||||||
]);
|
]);
|
||||||
@@ -277,18 +304,96 @@ class ImportMembersCommand extends Command
|
|||||||
return $phone;
|
return $phone;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function mapMemberType(string $type): string
|
protected function normalizeMemberNumber(mixed $value): ?string
|
||||||
{
|
{
|
||||||
// Map Chinese member types to constants
|
if ($value === null || $value === '') {
|
||||||
$type = trim($type);
|
return null;
|
||||||
return match ($type) {
|
}
|
||||||
'榮譽會員' => Member::TYPE_HONORARY,
|
|
||||||
'終身會員' => Member::TYPE_LIFETIME,
|
$raw = is_numeric($value) ? (string) (int) $value : trim((string) $value);
|
||||||
'學生會員' => Member::TYPE_STUDENT,
|
return $raw !== '' ? $raw : null;
|
||||||
default => Member::TYPE_REGULAR, // 患者, 家屬, etc.
|
}
|
||||||
|
|
||||||
|
protected function normalizeGender(mixed $value): ?string
|
||||||
|
{
|
||||||
|
$value = trim((string) $value);
|
||||||
|
return match ($value) {
|
||||||
|
'男' => 'male',
|
||||||
|
'女' => 'female',
|
||||||
|
'其他' => 'other',
|
||||||
|
default => null,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function normalizeRocDate(mixed $value): ?string
|
||||||
|
{
|
||||||
|
if ($value === null || $value === '') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($value instanceof \DateTimeInterface) {
|
||||||
|
return $value->format('Y-m-d');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_numeric($value)) {
|
||||||
|
$numeric = (float) $value;
|
||||||
|
if ($numeric > 10000) {
|
||||||
|
return ExcelDate::excelToDateTimeObject($numeric)->format('Y-m-d');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$raw = trim((string) $value);
|
||||||
|
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $raw)) {
|
||||||
|
return $raw;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (preg_match('/^\d{4}\/\d{2}\/\d{2}$/', $raw)) {
|
||||||
|
return str_replace('/', '-', $raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
$digits = preg_replace('/\D/', '', $raw);
|
||||||
|
if (strlen($digits) === 6 || strlen($digits) === 7) {
|
||||||
|
$yearLength = strlen($digits) - 4;
|
||||||
|
$rocYear = (int) substr($digits, 0, $yearLength);
|
||||||
|
$month = (int) substr($digits, $yearLength, 2);
|
||||||
|
$day = (int) substr($digits, $yearLength + 2, 2);
|
||||||
|
$year = $rocYear + 1911;
|
||||||
|
|
||||||
|
if (checkdate($month, $day, $year)) {
|
||||||
|
return sprintf('%04d-%02d-%02d', $year, $month, $day);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function parseIdentityType(mixed $value): array
|
||||||
|
{
|
||||||
|
$raw = trim((string) $value);
|
||||||
|
|
||||||
|
if ($raw === '') {
|
||||||
|
return [null, null];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (str_contains($raw, '病友')) {
|
||||||
|
return [Member::IDENTITY_PATIENT, null];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (str_contains($raw, '父母') || str_contains($raw, '家長')) {
|
||||||
|
return [Member::IDENTITY_PARENT, null];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (str_contains($raw, '社會') || str_contains($raw, '學者') || str_contains($raw, '醫師')) {
|
||||||
|
return [Member::IDENTITY_SOCIAL, null];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (str_contains($raw, '其他')) {
|
||||||
|
return [Member::IDENTITY_OTHER, $raw];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [Member::IDENTITY_OTHER, $raw];
|
||||||
|
}
|
||||||
|
|
||||||
protected function toPinyin(string $name): string
|
protected function toPinyin(string $name): string
|
||||||
{
|
{
|
||||||
// Simple romanization for email generation
|
// Simple romanization for email generation
|
||||||
|
|||||||
@@ -22,10 +22,21 @@ class StoreMemberRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
'member_number' => ['nullable', 'string', 'max:50', 'unique:members,member_number'],
|
||||||
'full_name' => ['required', 'string', 'max:255'],
|
'full_name' => ['required', 'string', 'max:255'],
|
||||||
'email' => ['required', 'email', 'max:255', 'unique:users,email'],
|
'email' => ['required', 'email', 'max:255', 'unique:users,email'],
|
||||||
'national_id' => ['nullable', 'string', 'max:50'],
|
'national_id' => ['nullable', 'string', 'max:50'],
|
||||||
'phone' => ['nullable', 'string', 'max:50'],
|
'phone' => ['nullable', 'string', 'max:50'],
|
||||||
|
'phone_home' => ['nullable', 'string', 'max:50'],
|
||||||
|
'phone_fax' => ['nullable', 'string', 'max:50'],
|
||||||
|
'birth_date' => ['nullable', 'date'],
|
||||||
|
'gender' => ['nullable', 'in:male,female,other'],
|
||||||
|
'identity_type' => ['nullable', 'in:patient,parent,social,other'],
|
||||||
|
'identity_other_text' => ['nullable', 'string', 'max:255', 'required_if:identity_type,other'],
|
||||||
|
'occupation' => ['nullable', 'string', 'max:120'],
|
||||||
|
'employer' => ['nullable', 'string', 'max:255'],
|
||||||
|
'job_title' => ['nullable', 'string', 'max:120'],
|
||||||
|
'applied_at' => ['nullable', 'date'],
|
||||||
'address_line_1' => ['nullable', 'string', 'max:255'],
|
'address_line_1' => ['nullable', 'string', 'max:255'],
|
||||||
'address_line_2' => ['nullable', 'string', 'max:255'],
|
'address_line_2' => ['nullable', 'string', 'max:255'],
|
||||||
'city' => ['nullable', 'string', 'max:120'],
|
'city' => ['nullable', 'string', 'max:120'],
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
namespace App\Http\Requests;
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
use Illuminate\Foundation\Http\FormRequest;
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
use Illuminate\Validation\Rule;
|
||||||
|
|
||||||
class UpdateMemberRequest extends FormRequest
|
class UpdateMemberRequest extends FormRequest
|
||||||
{
|
{
|
||||||
@@ -22,10 +23,26 @@ class UpdateMemberRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
'member_number' => [
|
||||||
|
'nullable',
|
||||||
|
'string',
|
||||||
|
'max:50',
|
||||||
|
Rule::unique('members', 'member_number')->ignore($this->member),
|
||||||
|
],
|
||||||
'full_name' => ['required', 'string', 'max:255'],
|
'full_name' => ['required', 'string', 'max:255'],
|
||||||
'email' => ['required', 'email', 'max:255'],
|
'email' => ['required', 'email', 'max:255'],
|
||||||
'national_id' => ['nullable', 'string', 'max:50'],
|
'national_id' => ['nullable', 'string', 'max:50'],
|
||||||
'phone' => ['nullable', 'string', 'max:50'],
|
'phone' => ['nullable', 'string', 'max:50'],
|
||||||
|
'phone_home' => ['nullable', 'string', 'max:50'],
|
||||||
|
'phone_fax' => ['nullable', 'string', 'max:50'],
|
||||||
|
'birth_date' => ['nullable', 'date'],
|
||||||
|
'gender' => ['nullable', 'in:male,female,other'],
|
||||||
|
'identity_type' => ['nullable', 'in:patient,parent,social,other'],
|
||||||
|
'identity_other_text' => ['nullable', 'string', 'max:255', 'required_if:identity_type,other'],
|
||||||
|
'occupation' => ['nullable', 'string', 'max:120'],
|
||||||
|
'employer' => ['nullable', 'string', 'max:255'],
|
||||||
|
'job_title' => ['nullable', 'string', 'max:120'],
|
||||||
|
'applied_at' => ['nullable', 'date'],
|
||||||
'address_line_1' => ['nullable', 'string', 'max:255'],
|
'address_line_1' => ['nullable', 'string', 'max:255'],
|
||||||
'address_line_2' => ['nullable', 'string', 'max:255'],
|
'address_line_2' => ['nullable', 'string', 'max:255'],
|
||||||
'city' => ['nullable', 'string', 'max:120'],
|
'city' => ['nullable', 'string', 'max:120'],
|
||||||
|
|||||||
@@ -33,18 +33,30 @@ class Member extends Model
|
|||||||
// Identity type constants (病友/家長)
|
// Identity type constants (病友/家長)
|
||||||
const IDENTITY_PATIENT = 'patient'; // 病友
|
const IDENTITY_PATIENT = 'patient'; // 病友
|
||||||
const IDENTITY_PARENT = 'parent'; // 家長/父母
|
const IDENTITY_PARENT = 'parent'; // 家長/父母
|
||||||
|
const IDENTITY_SOCIAL = 'social'; // 社會人士
|
||||||
|
const IDENTITY_OTHER = 'other'; // 其他
|
||||||
|
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'user_id',
|
'user_id',
|
||||||
|
'member_number',
|
||||||
'full_name',
|
'full_name',
|
||||||
'email',
|
'email',
|
||||||
'phone',
|
'phone',
|
||||||
|
'phone_home',
|
||||||
|
'phone_fax',
|
||||||
'address_line_1',
|
'address_line_1',
|
||||||
'address_line_2',
|
'address_line_2',
|
||||||
'city',
|
'city',
|
||||||
'postal_code',
|
'postal_code',
|
||||||
|
'birth_date',
|
||||||
|
'gender',
|
||||||
|
'occupation',
|
||||||
|
'employer',
|
||||||
|
'job_title',
|
||||||
|
'applied_at',
|
||||||
'emergency_contact_name',
|
'emergency_contact_name',
|
||||||
'emergency_contact_phone',
|
'emergency_contact_phone',
|
||||||
|
'national_id',
|
||||||
'national_id_encrypted',
|
'national_id_encrypted',
|
||||||
'national_id_hash',
|
'national_id_hash',
|
||||||
'membership_started_at',
|
'membership_started_at',
|
||||||
@@ -52,6 +64,7 @@ class Member extends Model
|
|||||||
'membership_status',
|
'membership_status',
|
||||||
'membership_type',
|
'membership_type',
|
||||||
'identity_type',
|
'identity_type',
|
||||||
|
'identity_other_text',
|
||||||
'guardian_member_id',
|
'guardian_member_id',
|
||||||
'disability_certificate_path',
|
'disability_certificate_path',
|
||||||
'disability_certificate_status',
|
'disability_certificate_status',
|
||||||
@@ -63,6 +76,8 @@ class Member extends Model
|
|||||||
protected $casts = [
|
protected $casts = [
|
||||||
'membership_started_at' => 'date',
|
'membership_started_at' => 'date',
|
||||||
'membership_expires_at' => 'date',
|
'membership_expires_at' => 'date',
|
||||||
|
'birth_date' => 'date',
|
||||||
|
'applied_at' => 'date',
|
||||||
'disability_verified_at' => 'datetime',
|
'disability_verified_at' => 'datetime',
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -118,6 +133,8 @@ class Member extends Model
|
|||||||
return match ($this->identity_type) {
|
return match ($this->identity_type) {
|
||||||
self::IDENTITY_PATIENT => '病友',
|
self::IDENTITY_PATIENT => '病友',
|
||||||
self::IDENTITY_PARENT => '家長/父母',
|
self::IDENTITY_PARENT => '家長/父母',
|
||||||
|
self::IDENTITY_SOCIAL => '社會人士',
|
||||||
|
self::IDENTITY_OTHER => $this->identity_other_text ? '其他(' . $this->identity_other_text . ')' : '其他',
|
||||||
default => '未設定',
|
default => '未設定',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
<?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('members', function (Blueprint $table) {
|
||||||
|
$table->string('member_number', 50)->unique()->nullable();
|
||||||
|
$table->date('birth_date')->nullable();
|
||||||
|
$table->string('gender', 20)->nullable();
|
||||||
|
$table->string('occupation', 120)->nullable();
|
||||||
|
$table->string('employer', 255)->nullable();
|
||||||
|
$table->string('job_title', 120)->nullable();
|
||||||
|
$table->date('applied_at')->nullable();
|
||||||
|
$table->string('phone_home', 50)->nullable();
|
||||||
|
$table->string('phone_fax', 50)->nullable();
|
||||||
|
$table->string('identity_other_text', 255)->nullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('members', function (Blueprint $table) {
|
||||||
|
$table->dropColumn([
|
||||||
|
'member_number',
|
||||||
|
'birth_date',
|
||||||
|
'gender',
|
||||||
|
'occupation',
|
||||||
|
'employer',
|
||||||
|
'job_title',
|
||||||
|
'applied_at',
|
||||||
|
'phone_home',
|
||||||
|
'phone_fax',
|
||||||
|
'identity_other_text',
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -37,6 +37,22 @@
|
|||||||
@enderror
|
@enderror
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="member_number" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
會員編號
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="member_number"
|
||||||
|
id="member_number"
|
||||||
|
value="{{ old('member_number') }}"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
@error('member_number')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label for="email" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
<label for="email" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
電子郵件
|
電子郵件
|
||||||
@@ -57,6 +73,82 @@
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="grid gap-6 sm:grid-cols-2">
|
||||||
|
<div>
|
||||||
|
<label for="birth_date" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
出生年月日
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="date"
|
||||||
|
name="birth_date"
|
||||||
|
id="birth_date"
|
||||||
|
value="{{ old('birth_date') }}"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
@error('birth_date')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="gender" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
性別
|
||||||
|
</label>
|
||||||
|
<select
|
||||||
|
name="gender"
|
||||||
|
id="gender"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
<option value="">未設定</option>
|
||||||
|
<option value="male" @selected(old('gender') === 'male')>男</option>
|
||||||
|
<option value="female" @selected(old('gender') === 'female')>女</option>
|
||||||
|
<option value="other" @selected(old('gender') === 'other')>其他</option>
|
||||||
|
</select>
|
||||||
|
@error('gender')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid gap-6 sm:grid-cols-2">
|
||||||
|
<div>
|
||||||
|
<label for="identity_type" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
身份別
|
||||||
|
</label>
|
||||||
|
<select
|
||||||
|
name="identity_type"
|
||||||
|
id="identity_type"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
<option value="">未設定</option>
|
||||||
|
<option value="patient" @selected(old('identity_type') === 'patient')>病友</option>
|
||||||
|
<option value="parent" @selected(old('identity_type') === 'parent')>父母</option>
|
||||||
|
<option value="social" @selected(old('identity_type') === 'social')>社會人士</option>
|
||||||
|
<option value="other" @selected(old('identity_type') === 'other')>其他</option>
|
||||||
|
</select>
|
||||||
|
@error('identity_type')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="identity_other_text" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
身份別其他說明
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="identity_other_text"
|
||||||
|
id="identity_other_text"
|
||||||
|
value="{{ old('identity_other_text') }}"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
placeholder="若選其他請填寫"
|
||||||
|
>
|
||||||
|
@error('identity_other_text')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label for="national_id" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
<label for="national_id" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
身分證號
|
身分證號
|
||||||
@@ -77,18 +169,118 @@
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="grid gap-6 sm:grid-cols-2">
|
||||||
|
<div>
|
||||||
|
<label for="phone" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
行動電話
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="phone"
|
||||||
|
id="phone"
|
||||||
|
value="{{ old('phone') }}"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
@error('phone')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="phone_home" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
室內電話
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="phone_home"
|
||||||
|
id="phone_home"
|
||||||
|
value="{{ old('phone_home') }}"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
@error('phone_home')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label for="phone" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
<label for="phone_fax" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
電話
|
傳真
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
name="phone"
|
name="phone_fax"
|
||||||
id="phone"
|
id="phone_fax"
|
||||||
value="{{ old('phone') }}"
|
value="{{ old('phone_fax') }}"
|
||||||
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
>
|
>
|
||||||
@error('phone')
|
@error('phone_fax')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid gap-6 sm:grid-cols-2">
|
||||||
|
<div>
|
||||||
|
<label for="occupation" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
現職
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="occupation"
|
||||||
|
id="occupation"
|
||||||
|
value="{{ old('occupation') }}"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
@error('occupation')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="job_title" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
職稱
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="job_title"
|
||||||
|
id="job_title"
|
||||||
|
value="{{ old('job_title') }}"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
@error('job_title')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="employer" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
服務單位
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="employer"
|
||||||
|
id="employer"
|
||||||
|
value="{{ old('employer') }}"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
@error('employer')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="applied_at" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
申請日期
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="date"
|
||||||
|
name="applied_at"
|
||||||
|
id="applied_at"
|
||||||
|
value="{{ old('applied_at') }}"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
@error('applied_at')
|
||||||
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
@enderror
|
@enderror
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -38,6 +38,22 @@
|
|||||||
@enderror
|
@enderror
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="member_number" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
會員編號
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="member_number"
|
||||||
|
id="member_number"
|
||||||
|
value="{{ old('member_number', $member->member_number) }}"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
@error('member_number')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label for="email" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
<label for="email" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
電子郵件
|
電子郵件
|
||||||
@@ -55,6 +71,82 @@
|
|||||||
@enderror
|
@enderror
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="grid gap-6 sm:grid-cols-2">
|
||||||
|
<div>
|
||||||
|
<label for="birth_date" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
出生年月日
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="date"
|
||||||
|
name="birth_date"
|
||||||
|
id="birth_date"
|
||||||
|
value="{{ old('birth_date', optional($member->birth_date)->toDateString()) }}"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
@error('birth_date')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="gender" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
性別
|
||||||
|
</label>
|
||||||
|
<select
|
||||||
|
name="gender"
|
||||||
|
id="gender"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
<option value="">未設定</option>
|
||||||
|
<option value="male" @selected(old('gender', $member->gender) === 'male')>男</option>
|
||||||
|
<option value="female" @selected(old('gender', $member->gender) === 'female')>女</option>
|
||||||
|
<option value="other" @selected(old('gender', $member->gender) === 'other')>其他</option>
|
||||||
|
</select>
|
||||||
|
@error('gender')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid gap-6 sm:grid-cols-2">
|
||||||
|
<div>
|
||||||
|
<label for="identity_type" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
身份別
|
||||||
|
</label>
|
||||||
|
<select
|
||||||
|
name="identity_type"
|
||||||
|
id="identity_type"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
<option value="">未設定</option>
|
||||||
|
<option value="patient" @selected(old('identity_type', $member->identity_type) === 'patient')>病友</option>
|
||||||
|
<option value="parent" @selected(old('identity_type', $member->identity_type) === 'parent')>父母</option>
|
||||||
|
<option value="social" @selected(old('identity_type', $member->identity_type) === 'social')>社會人士</option>
|
||||||
|
<option value="other" @selected(old('identity_type', $member->identity_type) === 'other')>其他</option>
|
||||||
|
</select>
|
||||||
|
@error('identity_type')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="identity_other_text" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
身份別其他說明
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="identity_other_text"
|
||||||
|
id="identity_other_text"
|
||||||
|
value="{{ old('identity_other_text', $member->identity_other_text) }}"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
placeholder="若選其他請填寫"
|
||||||
|
>
|
||||||
|
@error('identity_other_text')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label for="national_id" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
<label for="national_id" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
身分證號
|
身分證號
|
||||||
@@ -75,18 +167,118 @@
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="grid gap-6 sm:grid-cols-2">
|
||||||
|
<div>
|
||||||
|
<label for="phone" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
行動電話
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="phone"
|
||||||
|
id="phone"
|
||||||
|
value="{{ old('phone', $member->phone) }}"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
@error('phone')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="phone_home" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
室內電話
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="phone_home"
|
||||||
|
id="phone_home"
|
||||||
|
value="{{ old('phone_home', $member->phone_home) }}"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
@error('phone_home')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label for="phone" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
<label for="phone_fax" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
電話
|
傳真
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
name="phone"
|
name="phone_fax"
|
||||||
id="phone"
|
id="phone_fax"
|
||||||
value="{{ old('phone', $member->phone) }}"
|
value="{{ old('phone_fax', $member->phone_fax) }}"
|
||||||
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
>
|
>
|
||||||
@error('phone')
|
@error('phone_fax')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid gap-6 sm:grid-cols-2">
|
||||||
|
<div>
|
||||||
|
<label for="occupation" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
現職
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="occupation"
|
||||||
|
id="occupation"
|
||||||
|
value="{{ old('occupation', $member->occupation) }}"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
@error('occupation')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="job_title" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
職稱
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="job_title"
|
||||||
|
id="job_title"
|
||||||
|
value="{{ old('job_title', $member->job_title) }}"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
@error('job_title')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="employer" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
服務單位
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="employer"
|
||||||
|
id="employer"
|
||||||
|
value="{{ old('employer', $member->employer) }}"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
@error('employer')
|
||||||
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="applied_at" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
申請日期
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="date"
|
||||||
|
name="applied_at"
|
||||||
|
id="applied_at"
|
||||||
|
value="{{ old('applied_at', optional($member->applied_at)->toDateString()) }}"
|
||||||
|
class="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm dark:bg-gray-900 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
@error('applied_at')
|
||||||
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
<p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ $message }}</p>
|
||||||
@enderror
|
@enderror
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -14,8 +14,20 @@
|
|||||||
</p>
|
</p>
|
||||||
<ul class="list-disc list-inside text-sm text-gray-700 dark:text-gray-300 mb-4 space-y-1">
|
<ul class="list-disc list-inside text-sm text-gray-700 dark:text-gray-300 mb-4 space-y-1">
|
||||||
<li><code class="text-gray-800 dark:text-gray-200">full_name</code></li>
|
<li><code class="text-gray-800 dark:text-gray-200">full_name</code></li>
|
||||||
|
<li><code class="text-gray-800 dark:text-gray-200">member_number</code> (optional)</li>
|
||||||
<li><code class="text-gray-800 dark:text-gray-200">email</code></li>
|
<li><code class="text-gray-800 dark:text-gray-200">email</code></li>
|
||||||
<li><code class="text-gray-800 dark:text-gray-200">phone</code></li>
|
<li><code class="text-gray-800 dark:text-gray-200">phone</code></li>
|
||||||
|
<li><code class="text-gray-800 dark:text-gray-200">phone_home</code> (optional)</li>
|
||||||
|
<li><code class="text-gray-800 dark:text-gray-200">phone_fax</code> (optional)</li>
|
||||||
|
<li><code class="text-gray-800 dark:text-gray-200">birth_date</code> (YYYY-MM-DD, optional)</li>
|
||||||
|
<li><code class="text-gray-800 dark:text-gray-200">gender</code> (male/female/other, optional)</li>
|
||||||
|
<li><code class="text-gray-800 dark:text-gray-200">identity_type</code> (patient/parent/social/other, optional)</li>
|
||||||
|
<li><code class="text-gray-800 dark:text-gray-200">identity_other_text</code> (optional)</li>
|
||||||
|
<li><code class="text-gray-800 dark:text-gray-200">occupation</code> (optional)</li>
|
||||||
|
<li><code class="text-gray-800 dark:text-gray-200">employer</code> (optional)</li>
|
||||||
|
<li><code class="text-gray-800 dark:text-gray-200">job_title</code> (optional)</li>
|
||||||
|
<li><code class="text-gray-800 dark:text-gray-200">applied_at</code> (YYYY-MM-DD, optional)</li>
|
||||||
|
<li><code class="text-gray-800 dark:text-gray-200">national_id</code> (optional)</li>
|
||||||
<li><code class="text-gray-800 dark:text-gray-200">address_line_1</code> (optional)</li>
|
<li><code class="text-gray-800 dark:text-gray-200">address_line_1</code> (optional)</li>
|
||||||
<li><code class="text-gray-800 dark:text-gray-200">address_line_2</code> (optional)</li>
|
<li><code class="text-gray-800 dark:text-gray-200">address_line_2</code> (optional)</li>
|
||||||
<li><code class="text-gray-800 dark:text-gray-200">city</code> (optional)</li>
|
<li><code class="text-gray-800 dark:text-gray-200">city</code> (optional)</li>
|
||||||
|
|||||||
@@ -85,6 +85,15 @@
|
|||||||
</dd>
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="overflow-hidden rounded-lg bg-gray-50 dark:bg-gray-700 px-4 py-5 sm:p-6">
|
||||||
|
<dt class="truncate text-sm font-medium text-gray-500 dark:text-gray-400">
|
||||||
|
會員編號
|
||||||
|
</dt>
|
||||||
|
<dd class="mt-1 text-sm text-gray-900 dark:text-gray-100">
|
||||||
|
{{ $member->member_number ?? __('Not set') }}
|
||||||
|
</dd>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="overflow-hidden rounded-lg bg-gray-50 dark:bg-gray-700 px-4 py-5 sm:p-6">
|
<div class="overflow-hidden rounded-lg bg-gray-50 dark:bg-gray-700 px-4 py-5 sm:p-6">
|
||||||
<dt class="truncate text-sm font-medium text-gray-500 dark:text-gray-400">
|
<dt class="truncate text-sm font-medium text-gray-500 dark:text-gray-400">
|
||||||
電話
|
電話
|
||||||
@@ -94,6 +103,16 @@
|
|||||||
</dd>
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="overflow-hidden rounded-lg bg-gray-50 dark:bg-gray-700 px-4 py-5 sm:p-6">
|
||||||
|
<dt class="truncate text-sm font-medium text-gray-500 dark:text-gray-400">
|
||||||
|
室內電話/傳真
|
||||||
|
</dt>
|
||||||
|
<dd class="mt-1 text-sm text-gray-900 dark:text-gray-100 space-y-1">
|
||||||
|
<div>{{ $member->phone_home ?? __('Not set') }}</div>
|
||||||
|
<div>{{ $member->phone_fax ?? '' }}</div>
|
||||||
|
</dd>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="overflow-hidden rounded-lg bg-gray-50 dark:bg-gray-700 px-4 py-5 sm:p-6">
|
<div class="overflow-hidden rounded-lg bg-gray-50 dark:bg-gray-700 px-4 py-5 sm:p-6">
|
||||||
<dt class="truncate text-sm font-medium text-gray-500 dark:text-gray-400">
|
<dt class="truncate text-sm font-medium text-gray-500 dark:text-gray-400">
|
||||||
會員資格狀態
|
會員資格狀態
|
||||||
@@ -112,6 +131,45 @@
|
|||||||
</dd>
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="overflow-hidden rounded-lg bg-gray-50 dark:bg-gray-700 px-4 py-5 sm:p-6">
|
||||||
|
<dt class="truncate text-sm font-medium text-gray-500 dark:text-gray-400">
|
||||||
|
出生年月日
|
||||||
|
</dt>
|
||||||
|
<dd class="mt-1 text-sm text-gray-900 dark:text-gray-100">
|
||||||
|
@if ($member->birth_date)
|
||||||
|
{{ $member->birth_date->toDateString() }}
|
||||||
|
@else
|
||||||
|
未設定
|
||||||
|
@endif
|
||||||
|
</dd>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="overflow-hidden rounded-lg bg-gray-50 dark:bg-gray-700 px-4 py-5 sm:p-6">
|
||||||
|
<dt class="truncate text-sm font-medium text-gray-500 dark:text-gray-400">
|
||||||
|
性別
|
||||||
|
</dt>
|
||||||
|
<dd class="mt-1 text-sm text-gray-900 dark:text-gray-100">
|
||||||
|
@php
|
||||||
|
$genderLabel = match($member->gender) {
|
||||||
|
'male' => '男',
|
||||||
|
'female' => '女',
|
||||||
|
'other' => '其他',
|
||||||
|
default => '未設定',
|
||||||
|
};
|
||||||
|
@endphp
|
||||||
|
{{ $genderLabel }}
|
||||||
|
</dd>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="overflow-hidden rounded-lg bg-gray-50 dark:bg-gray-700 px-4 py-5 sm:p-6">
|
||||||
|
<dt class="truncate text-sm font-medium text-gray-500 dark:text-gray-400">
|
||||||
|
身份別
|
||||||
|
</dt>
|
||||||
|
<dd class="mt-1 text-sm text-gray-900 dark:text-gray-100">
|
||||||
|
{{ $member->identity_type_label }}
|
||||||
|
</dd>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="overflow-hidden rounded-lg bg-gray-50 dark:bg-gray-700 px-4 py-5 sm:p-6">
|
<div class="overflow-hidden rounded-lg bg-gray-50 dark:bg-gray-700 px-4 py-5 sm:p-6">
|
||||||
<dt class="truncate text-sm font-medium text-gray-500 dark:text-gray-400">
|
<dt class="truncate text-sm font-medium text-gray-500 dark:text-gray-400">
|
||||||
會員資格開始
|
會員資格開始
|
||||||
@@ -125,6 +183,19 @@
|
|||||||
</dd>
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="overflow-hidden rounded-lg bg-gray-50 dark:bg-gray-700 px-4 py-5 sm:p-6">
|
||||||
|
<dt class="truncate text-sm font-medium text-gray-500 dark:text-gray-400">
|
||||||
|
申請日期
|
||||||
|
</dt>
|
||||||
|
<dd class="mt-1 text-sm text-gray-900 dark:text-gray-100">
|
||||||
|
@if ($member->applied_at)
|
||||||
|
{{ $member->applied_at->toDateString() }}
|
||||||
|
@else
|
||||||
|
未設定
|
||||||
|
@endif
|
||||||
|
</dd>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="overflow-hidden rounded-lg bg-gray-50 dark:bg-gray-700 px-4 py-5 sm:p-6">
|
<div class="overflow-hidden rounded-lg bg-gray-50 dark:bg-gray-700 px-4 py-5 sm:p-6">
|
||||||
<dt class="truncate text-sm font-medium text-gray-500 dark:text-gray-400">
|
<dt class="truncate text-sm font-medium text-gray-500 dark:text-gray-400">
|
||||||
會員資格到期
|
會員資格到期
|
||||||
@@ -138,6 +209,21 @@
|
|||||||
</dd>
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="overflow-hidden rounded-lg bg-gray-50 dark:bg-gray-700 px-4 py-5 sm:p-6 sm:col-span-2">
|
||||||
|
<dt class="truncate text-sm font-medium text-gray-500 dark:text-gray-400">
|
||||||
|
現職/服務單位
|
||||||
|
</dt>
|
||||||
|
<dd class="mt-1 text-sm text-gray-900 dark:text-gray-100 space-y-1">
|
||||||
|
<div>{{ $member->occupation ?? __('Not set') }}</div>
|
||||||
|
@if ($member->employer)
|
||||||
|
<div>{{ $member->employer }}</div>
|
||||||
|
@endif
|
||||||
|
@if ($member->job_title)
|
||||||
|
<div>{{ $member->job_title }}</div>
|
||||||
|
@endif
|
||||||
|
</dd>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="overflow-hidden rounded-lg bg-gray-50 dark:bg-gray-700 px-4 py-5 sm:p-6 sm:col-span-2">
|
<div class="overflow-hidden rounded-lg bg-gray-50 dark:bg-gray-700 px-4 py-5 sm:p-6 sm:col-span-2">
|
||||||
<dt class="truncate text-sm font-medium text-gray-500 dark:text-gray-400">
|
<dt class="truncate text-sm font-medium text-gray-500 dark:text-gray-400">
|
||||||
地址
|
地址
|
||||||
|
|||||||
Reference in New Issue
Block a user