'storeCategoryWithID', 'setCourse' => 'setCourse', 'hideMsg' => 'hideMsg']; use WithFileUploads; public $sortField = 'id'; public $sortAsc = false; public $groupMsg = ''; public $type = 'dati'; public $from = ''; public $selectedCourseMember = 0; public $festivita = []; protected $messages = [ 'birth_nation_id.required' => 'birth_nation_id', 'birth_province_id.required' => 'birth_province_id', 'birth_city_id.required' => 'birth_city_id', 'nation_id.required' => 'nation_id', 'province_id.required' => 'province_id', 'city_id.required' => 'city_id', 'gender' => 'gender' ]; public function change($type) { $this->type = $type; if ($type === 'corsi' && $this->dataId > 0) { $this->loadMemberCards(); $this->checkCourseAvailability(); } if ($type === 'presenze') { //$this->emit('load-chart', $this->mesi, $this->valori); //if (sizeof($this->mesi) == 0 && sizeof($this->valori) == 0) $this->loadMemberPresences(); //else // $this->emit('load-chart', $this->mesi, $this->valori); } $this->dispatchBrowserEvent('scroll-to-top'); } public function sortBy($field) { if ($this->sortField === $field) { $this->sortAsc = ! $this->sortAsc; } else { $this->sortAsc = true; } $this->sortField = $field; } public $records, $first_name, $last_name, $image, $image_old, $status, $birth_place, $birth_city_id, $birth_province_id, $birth_nation_id, $birth_date, $gender, $no_send_mail, $exclude_from_records, $fiscal_code, $address, $zip_code, $nation_id, $province_id, $city_id, $phone, $phone2, $phone3, $email, $enabled, $dataId, $update = false, $add = false; public $isSaving = false; public $importoBorsellino, $father_name, $mother_name, $father_email, $mother_email, $father_phone, $mother_phone, $father_fiscal_code, $mother_fiscal_code, $father_doc_number, $father_doc_type, $mother_doc_number, $mother_doc_type, $mother_document_files, $father_document_files; public $document_type, $document_number, $document_from, $document_expire_date, $document_files, $document_files_old; public $selectId = 0; public $causalId = 0; public $error_fc = false; public $under18 = false; public $money = 0; public $refreshAfter = 0; public $checkedAll = false; public $multipleIds = []; public $multipleAction = ''; public $isItaly = true; public $isBirthItaly = true; public $showDetail = false; public $currentMember; public $currentStatus; public $age = ''; public $disciplines = array(); public $cards = array(); public $categories = array(); public $courses = array(); public $course_names = array(); public $course_levels = array(); public $course_types = array(); public $course_frequencies = array(); public $course_subscriptions = array(); public $createSubscription = false; public $payMonths = array(); public $suspendedMonths = array(); public $showCourse = array(); public $searchTxt; public $search; public $showReset = false; public $advanced = false; public $birthNations = array(); public $birthProvinces = array(); public $birthCities = array(); public $active; // Card data public $member_cards = array(), $card_card_id, $card_number, $card_date, $card_accept_date, $card_status, $card_discipline1_id, $card_discipline2_id, $card_discipline3_id, $addCard, $updateCard, $cardDataId; // Categories data public $member_categories = array(), $category_category_id; // Courses data public $member_courses = array(), $course_course_id, $course_date_from, $course_date_to, $course_when = array(), $addCourse, $updateCourse, $courseDataId, $course_course_subscription_id, $course_status, $course_note, $course_price, $course_subscription_price, $course_subscribed, $course_months = array(), $course_exist; public $course_name, $course_level_id, $course_type_id, $course_frequency_id; // Certificates data public $member_certificates = array(), $certificate_type, $certificate_filename_old, $certificate_filename, $certificate_expire_date, $certificate_status, $cardCertificateId, $addCertificate, $updateCertificate, $certificateDataId; public $filterCard = []; public $filterCategory = []; public $filterCertNormal = 0; public $filterCertAgonistic = 0; public $filterCertScaduto = 0; public $filterCertInScadenza = 0; public $already_existing = false; public $tabOrder = ['dati', 'tesseramento', 'corsi', 'gruppi']; public $presenceYears = []; public $presenceYearFilter = ''; public $presenceTitle = []; public $presenceTitleFilter = ''; public $member_presences = []; public $totals = 0; public $presenze = 0; public $assenze = 0; public $annullate = 0; public $recuperi = []; protected $rules = [ 'first_name' => 'required', 'last_name' => 'required', 'email' => 'required', 'phone' => 'required', 'birth_date' => 'before_or_equal:today' ]; public $mesi = []; public $valori = []; public function resetFields() { $this->dataId = -1; $this->first_name = ''; $this->last_name = ''; $this->status = ''; $this->birth_city_id = null; $this->birth_province_id = null; $this->birth_nation_id = null; $this->birth_date = null; $this->birth_place = ''; $this->importoBorsellino = 0; $this->father_name = ''; $this->mother_name = ''; $this->father_email = ''; $this->mother_email = ''; $this->father_phone = ''; $this->mother_phone = ''; $this->father_fiscal_code = ''; $this->mother_fiscal_code = ''; $this->father_doc_number = ''; $this->mother_doc_number = ''; $this->father_doc_type = ''; $this->mother_doc_type = ''; $this->mother_document_files = array(); $this->father_document_files = array(); $this->gender = null; $this->no_send_mail = false; $this->exclude_from_records = false; $this->fiscal_code = ''; $this->address = ''; $this->zip_code = ''; $this->document_type = ''; $this->document_number = ''; $this->document_from = ''; $this->document_expire_date = null; $this->document_files = array(); //$this->nation_id = null; //$this->province_id = null; $this->nation_id = null; $this->province_id = null; $this->city_id = null; $this->phone = ''; $this->phone2 = ''; $this->phone3 = ''; $this->email = ''; $this->enabled = true; $this->under18 = false; $this->money = 0; $this->image = null; $this->age = ''; $this->error_fc = false; $this->isSaving = false; $this->emit('load-data-table'); } public function resetCardFields() { $this->card_card_id = null; $this->card_number = ''; $this->card_date = null; $this->card_accept_date = null; $this->card_status = 0; $this->card_discipline1_id = null; $this->card_discipline2_id = null; $this->card_discipline3_id = null; } public function resetCertificateFields() { $this->certificate_type = ''; $this->certificate_filename = ''; $this->certificate_filename_old = ''; $this->certificate_expire_date = date('Y-m-d', strtotime('+1 year')); $this->certificate_status = 0; } public function resetCourseFields() { $this->course_course_id = null; $this->course_when = array(); $this->course_when[] = array('day' => array(), 'from' => '', 'to' => ''); $this->course_date_from = null; $this->course_date_to = null; $this->course_course_subscription_id = null; $this->course_status = 0; $this->course_price = 0; $this->course_subscription_price = 0; $this->course_exist = false; $this->course_subscribed = false; $this->course_months = array(); $this->course_note = ''; $this->course_name = ''; $this->course_level_id = ''; $this->course_type_id = ''; $this->course_frequency_id = ''; } public function executeMultipleAction() { if ($this->multipleAction == 'delete') $this->multipleDelete(); } public function updatedImage() { $this->validate([ 'image' => 'image|max:1024', ]); $this->image_old = ''; } public function updatedPresenceYearFilter() { $this->loadMemberPresences(); } public function updatedPresenceTitleFilter() { $this->loadMemberPresences(); } public function updatedCourseName() { $this->course_course_id = null; $this->course_level_id = ''; $this->course_type_id = ''; $this->course_frequency_id = ''; $levels_ids = []; if ($this->course_name != '') { list($n, $y) = explode("(", $this->course_name); $y = trim(str_replace(")", "", $y)); $all = \App\Models\Course::where('name', 'like', '%' . trim($n) . "%")->where('year', $y)->where('enabled', true)->get(); foreach ($all as $a) { $levels_ids[] = $a->course_level_id; } } $this->course_levels = \App\Models\CourseLevel::select('*')->where('enabled', true)->whereIn('id', $levels_ids)->get(); $this->course_types = []; $this->course_frequencies = []; } public function updatedCourseLevelId() { $this->course_course_id = null; $this->course_type_id = ''; $this->course_frequency_id = ''; $types_ids = []; if ($this->course_level_id != '') { list($n, $y) = explode("(", $this->course_name); $y = trim(str_replace(")", "", $y)); $all = \App\Models\Course::where('name', 'like', '%' . trim($n) . "%")->where('year', $y)->where('enabled', true)->where('course_level_id', $this->course_level_id)->get(); foreach ($all as $a) { $types_ids[] = $a->course_type_id; } } $this->course_types = \App\Models\CourseType::select('*')->where('enabled', true)->whereIn('id', $types_ids)->get(); $this->course_frequencies = []; } public function updatedCourseTypeId() { $this->course_course_id = null; $this->course_frequency_id = ''; $frequencies_ids = []; if ($this->course_type_id != '') { list($n, $y) = explode("(", $this->course_name); $y = trim(str_replace(")", "", $y)); $all = \App\Models\Course::where('name', 'like', '%' . trim($n) . "%")->where('year', $y)->where('enabled', true)->where('course_level_id', $this->course_level_id)->where('course_type_id', $this->course_type_id)->get(); foreach ($all as $a) { $frequencies_ids[] = $a->course_frequency_id; } } $this->course_frequencies = \App\Models\CourseFrequency::select('*')->where('enabled', true)->whereIn('id', $frequencies_ids)->get(); } public function updatedCourseFrequencyId() { $this->course_course_id = null; if ($this->course_frequency_id != '') { list($n, $y) = explode("(", $this->course_name); $y = trim(str_replace(")", "", $y)); $course = \App\Models\Course::where('name', 'like', '%' . trim($n) . "%") ->where('year', $y) ->where('course_level_id', $this->course_level_id) ->where('course_type_id', $this->course_type_id) ->where('course_frequency_id', $this->course_frequency_id) ->first(); if ($course) { $this->course_course_id = $course->id; $this->course_price = formatPrice($course->price); $this->course_subscription_price = formatPrice($course->subscription_price); } else { $this->course_price = 0; $this->course_subscription_price = 0; $this->course_exist = false; } } else { $this->course_price = 0; $this->course_subscription_price = 0; $this->course_exist = false; } } public $documents = []; public $father_documents = []; public $mother_documents = []; public function removeDocument($idx, $type) { if ($type == 'father') { unset($this->father_document_files[$idx]); } elseif ($type == 'mother') { unset($this->mother_document_files[$idx]); } else { unset($this->document_files[$idx]); } } public function updatedDocuments() { foreach ($this->documents as $document) { $name = $document->getClientOriginalName(); $document->storeAs('public', $name); $this->document_files[] = $name; } $this->documents = []; } public function updatedFatherDocuments() { foreach ($this->father_documents as $document) { $name = $document->getClientOriginalName(); $document->storeAs('public', $name); $this->father_document_files[] = $name; } $this->father_documents = []; } public function updatedMotherDocuments() { foreach ($this->mother_documents as $document) { $name = $document->getClientOriginalName(); $document->storeAs('public', $name); $this->mother_document_files[] = $name; } $this->mother_documents = []; } public function resetCategoryFields() { $this->category_category_id = null; } public function getCategories($records, $indentation) { foreach ($records as $record) { $this->categories[] = array('id' => $record->id, 'name' => $record->getTree(), 'indentation' => $indentation); if (count($record->childs)) $this->getCategories($record->childs, $indentation + 1); } } public function getCourses($records, $indentation) { foreach ($records as $record) { $this->courses[] = array('id' => $record->id, 'name' => $record->getTree()); if (count($record->childs)) $this->getCourses($record->childs, $indentation + 1); } } public function updatedBirthDate() { $this->validateOnly('birth_date'); $date1 = new DateTime($this->birth_date); $date2 = new DateTime("now"); $interval = $date1->diff($date2); $this->age = $interval->y . " anni"; $this->under18 = $interval->y < 18; } public function mount() { if (isset($_GET["new"])) { $this->refreshAfter = 1; $this->add(); } if (isset($_GET["from"])) { $this->from = $_GET["from"]; } $this->cards = \App\Models\Card::select('id', 'name')->get(); $this->disciplines = \App\Models\Discipline::select('id', 'name')->get(); $this->categories = array(); $this->getCategories(\App\Models\Category::select('id', 'name')->where('parent_id', null)->orderBy('name')->get(), 0); $this->courses = \App\Models\Course::select('id', 'name')->where('enabled', null)->get(); $this->course_subscriptions = \App\Models\CourseSubscription::select('*')->where('enabled', true)->get(); $c = \App\Models\Causal::where('type', 'IN')->where('money', true)->first(); if ($c) $this->causalId = $c->id; if (isset($_GET["member_detail"])) { $this->showDetailF($_GET["member_detail"]); $this->refreshAfter = 1; } // Anni dal 2025 al 2040 for ($anno = 2025; $anno <= 2037; $anno++) { // Festività fisse $this->festivita[] = "$anno-01-01"; // Capodanno $this->festivita[] = "$anno-01-06"; // Epifania $this->festivita[] = "$anno-04-25"; // Festa della Liberazione $this->festivita[] = "$anno-05-01"; // Festa del Lavoro $this->festivita[] = "$anno-06-02"; // Festa della Repubblica $this->festivita[] = "$anno-08-15"; // Ferragosto $this->festivita[] = "$anno-11-01"; // Ognissanti $this->festivita[] = "$anno-12-08"; // Immacolata Concezione $this->festivita[] = "$anno-12-25"; // Natale $this->festivita[] = "$anno-12-26"; // Santo Stefano // Calcolo Pasqua e Pasquetta $pasqua = date("Y-m-d", easter_date($anno)); $pasquetta = date("Y-m-d", strtotime("$pasqua +1 day")); $this->festivita[] = $pasqua; // Domenica di Pasqua $this->festivita[] = $pasquetta; // Lunedì dell'Angelo } } public function updated() { if ($this->isSaving) { $zzz = []; if ($this->birth_nation_id == null) $zzz[] = 'birth_nation_id=' . $this->birth_nation_id; if ($this->isBirthItaly) { if ($this->birth_province_id == null) $zzz[] = 'birth_province_id=' . $this->birth_province_id; if ($this->birth_city_id == null) $zzz[] = 'birth_city_id=' . $this->birth_city_id; } if ($this->nation_id == null) $zzz[] = 'nation_id=' . $this->nation_id; if ($this->isItaly) { if ($this->province_id == null) $zzz[] = 'province_id=' . $this->province_id; if ($this->city_id == null) $zzz[] = 'city_id=' . $this->city_id; } $this->emit('setErrorMsg', $zzz); } // $this->emit('load-select'); } public function hydrate() { if ($this->isSaving) { $zzz = []; if ($this->birth_nation_id == null) $zzz[] = 'birth_nation_id=' . $this->birth_nation_id; if ($this->isBirthItaly) { if ($this->birth_province_id == null) $zzz[] = 'birth_province_id=' . $this->birth_province_id; if ($this->birth_city_id == null) $zzz[] = 'birth_city_id=' . $this->birth_city_id; } if ($this->nation_id == null) $zzz[] = 'nation_id=' . $this->nation_id; if ($this->isItaly) { if ($this->province_id == null) $zzz[] = 'province_id=' . $this->province_id; if ($this->city_id == null) $zzz[] = 'city_id=' . $this->city_id; } $this->emit('setErrorMsg', $zzz); } $this->emit('load-select'); } public function checkIsItaly() { if ($this->nation_id > 0) { $n = \App\Models\Nation::findOrFail($this->nation_id); $this->isItaly = $n->is_italy; } else $this->isItaly = false; } public function checkIsBirthItaly() { if ($this->birth_nation_id > 0) { $n = \App\Models\Nation::findOrFail($this->birth_nation_id); $this->isBirthItaly = $n->is_italy; } else $this->isBirthItaly = false; } public function search() { if ($this->searchTxt != '') { $this->search = $this->searchTxt; $this->showReset = true; } } public function resetSearch() { $this->showReset = false; $this->searchTxt = ''; $this->search = $this->searchTxt; } public function advancedSearch() { $this->advanced = true; } public function advancedSearchCancel() { $this->filterCard = []; $this->filterCategory = []; $this->filterCertNormal = 0; $this->filterCertAgonistic = 0; $this->filterCertScaduto = 0; $this->filterCertInScadenza = 0; $this->advanced = false; } public function render() { $this->course_names = []; $allC = \App\Models\Course::orderBy('name')->get(); foreach ($allC as $c) { $cN = $c->name . " (" . $c->year . ")"; if (!in_array($cN, $this->course_names)) $this->course_names[] = $cN; } //$this->course_names = \App\Models\Course::orderBy('name')->groupBy('name')->pluck('name'); $datas = []; $this->loadMemberCards(); $this->loadMemberCourses(); $this->loadMemberCategories(); $this->loadMemberCertificates(); return view('livewire.member', ['datas' => $datas]); } public function updatedCourseCourseId() { if ($this->course_course_id > 0) { $c = \App\Models\Course::findOrFail($this->course_course_id); $this->course_price = formatPrice($c->price); $this->course_subscription_price = formatPrice($c->subscription_price); // Controllo se sono già iscritto la corso $this->course_exist = \App\Models\MemberCourse::where('course_id', $this->course_course_id)->where('member_id', $this->dataId)->count() > 0; } else { $this->course_price = 0; $this->course_subscription_price = 0; $this->course_exist = false; } } public function loadMemberCards() { $this->member_cards = \App\Models\MemberCard::where('member_id', $this->dataId)->get(); // return view('livewire.member'); } public function loadMemberCourses() { $this->member_courses = \App\Models\MemberCourse::where('member_id', $this->dataId)->get(); if ($this->dataId) { $order = [9,10,11,12,1,2,3,4,5,6,7,8]; $this->member_courses = $this->member_courses->map(function($course) use ($order) { $months = json_decode($course->months, true); usort($months, function($a, $b) use ($order) { $posA = array_search($a['m'], $order); $posB = array_search($b['m'], $order); return $posA <=> $posB; }); $course->months = json_encode($months); return $course; }); } } public function loadMemberCategories() { $this->member_categories = \App\Models\MemberCategory::where('member_id', $this->dataId)->get(); // return view('livewire.member'); } public function loadMemberCertificates() { $this->member_certificates = \App\Models\MemberCertificate::where('member_id', $this->dataId)->orderBy('expire_date', 'DESC')->get(); // return view('livewire.member'); } public function loadMemberPresences() { $this->mesi = array('Settembre', 'Ottobre', 'Novembre', 'Dicembre', 'Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto'); $this->valori = array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); $this->loadCombo(); $this->member_presences = []; // Carico tutti i calendar_id delle presenza $presences = \App\Models\Presence::where('member_id', $this->dataId)->where('status', '<>', 99)->pluck('calendar_id')->toArray(); $presences_annullate = \App\Models\Presence::where('member_id', $this->dataId)->where('status', 99)->pluck('calendar_id')->toArray(); $course_ids = array(); // Tutti i calendari if ($this->presenceYearFilter == '' && sizeof($this->presenceYears) > 0) $this->presenceYearFilter = $this->presenceYears[0]; if ($this->presenceTitleFilter == '' && sizeof($this->presenceTitle) > 0) $this->presenceTitleFilter = $this->presenceTitle[0]; $curses_ids = \App\Models\Course::where('year', $this->presenceYearFilter)->pluck('id')->toArray(); $calendars = \App\Models\Calendar::whereNull('manual')->whereIn('course_id', $curses_ids)->where('name', $this->presenceTitleFilter)->orderBy('from')->get(); $this->totals = 0; $this->presenze = 0; $this->assenze = 0; $this->annullate = 0; $this->recuperi = []; define("PRESENZE", 0); define("ASSENZE", 1); // define("RECUPERO", 2); define("ANNULLATE", 2); $chartData = [ PRESENZE => [ "label" => "Presenze", "backgroundColor" => "#0c6197", "data" => array_fill(0, 12, 0), "grouped" => true, "stack" => "chartData", "barThickness" => "flex", "barPercentage" => 0.5, "categoryPercentage" => 0.3, ], ASSENZE => [ "label" => "Assenze", "backgroundColor" => "#ff0000", "data" => array_fill(0, 12, 0), "grouped" => true, "stack" => "chartData", "barThickness" => "flex", "barPercentage" => 0.5, "categoryPercentage" => 0.3, ], // RECUPERO => [ // "label" => "Recupero", // "backgroundColor" => "#7136f6", // "data" => array_fill(0, 12, 0), // "grouped" => true, // "stack" => "chartData", // "barThickness" => "flex", // "barPercentage" => 0.5, // "categoryPercentage" => 0.3, // ], ANNULLATE => [ "label" => "Annullate", "backgroundColor" => "#808080", "data" => array_fill(0, 12, 0), "grouped" => true, "stack" => "chartData", "barThickness" => "flex", "barPercentage" => 0.5, "categoryPercentage" => 0.3, ], ]; $monthMap = [ 9 => 0, 10 => 1, 11 => 2, 12 => 3, 1 => 4, 2 => 5, 3 => 6, 4 => 7, 5 => 8, 6 => 9, 7 => 10, 8 => 11, ]; foreach($calendars as $calendar) { $days = ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab']; $dow = date('w', strtotime($calendar->from)); $d = $days[$dow]; $h = date('H:i', strtotime($calendar->from)); // Elenco corsi per tipologia in base al calendario $courses = \App\Models\Course::where('name', $calendar->name)->where('date_from', '<=', $calendar->from)->where('date_to', '>=', $calendar->to)->pluck('id')->toArray(); $months = date("n", strtotime($calendar->from)); // Elenco utenti iscritti al corso "padre" if (\App\Models\MemberCourse::where('when', 'like', "%" . $d . "%")->where('when', 'like', '%"from":"' . $h . '"%')->whereNot('months', 'like', '%"m":' . $months . ',"status":2%')->whereDate('date_from', '<=', $calendar->from)->whereDate('date_to', '>=', $calendar->from)->where('months', 'like', '%"m":' . $months . ',%')->whereIn('course_id', $courses)->where('member_id', $this->dataId)->first()) { $status = ''; $annullata = false; $motivation = null; if (in_array($calendar->id, $presences)) { $status = "Presenza"; $this->presenze += 1; $this->valori[$monthMap[date('n', strtotime($calendar->from))]] += 1; $chartData[PRESENZE]["data"][$monthMap[date('n', strtotime($calendar->from))]] += 1; $presence = \App\Models\Presence::where('member_id', $this->dataId)->where('status', '<>', 99)->where('calendar_id', $calendar->id)->first(); if ($presence->motivation && $presence->motivation->show_in_member_presences) { $motivation = $presence->motivation->name; if (!isset($this->recuperi[$motivation])) $this->recuperi[$motivation] = 0; $this->recuperi[$motivation] += 1; } } else { if (in_array($calendar->id, $presences_annullate)) { $status = "Annullata"; $this->annullate += 1; $chartData[ANNULLATE]["data"][$monthMap[date('n', strtotime($calendar->from))]] += 1; $annullata = true; } else { if (date("Ymd") > date("Ymd", strtotime($calendar->from))) { $status = "Assenza"; $this->assenze += 1; $chartData[ASSENZE]["data"][$monthMap[date('n', strtotime($calendar->from))]] += 1; } } } if ($calendar->status == 99 && !$annullata) { $status = "Annullata"; $this->annullate += 1; $chartData[ANNULLATE]["data"][$monthMap[date('n', strtotime($calendar->from))]] += 1; } $this->member_presences[] = array('calendar_id' => $calendar->id, 'from' => $calendar->from, 'to' => $calendar->to, 'status' => $status, 'motivation' => $motivation);//\App\Models\Presence::where('member_id', $this->dataId)->get(); } //$courses = array(1); foreach($courses as $c) { $course_ids[] = $c; } //$course_ids = array_push($course_ids, $courses); } // Manuali (recuperi) // $calendar_recuperi = \App\Models\Calendar::where('manual', 1)->where('name', $this->presenceTitleFilter)->pluck('id')->toArray(); $calendar_recuperi = \App\Models\Calendar::where('manual', 1)->where('name', $this->presenceTitleFilter)->pluck('id')->toArray(); $presences_recuperi = \App\Models\Presence::whereIn('calendar_id', $calendar_recuperi)->where('member_id', $this->dataId)->get(); foreach($presences_recuperi as $p) { if ($p->motivation && $p->motivation->show_in_member_presences) { // $this->member_presences[] = array('calendar_id' => $p->calendar->id, 'from' => $p->calendar->from, 'to' => $p->calendar->to, 'status' => 'Recupero', 'motivation' => $p->motivation->name);//\App\Models\Presence::where('member_id', $this->dataId)->get(); $this->member_presences[] = array('calendar_id' => $p->calendar->id, 'from' => $p->calendar->from, 'to' => $p->calendar->to, 'status' => 'Presenza', 'motivation' => $p->motivation->name);//\App\Models\Presence::where('member_id', $this->dataId)->get(); if (!isset($this->recuperi[$p->motivation->name])) $this->recuperi[$p->motivation->name] = 0; $this->recuperi[$p->motivation->name] += 1; $this->presenze += 1; // $chartData[RECUPERO]["data"][$monthMap[date('n', strtotime($p->calendar->from))]] += 1; $chartData[PRESENZE]["data"][$monthMap[date('n', strtotime($p->calendar->from))]] += 1; } } $sortVariable='from'; usort( $this->member_presences, fn(array $a, array $b): int => $a[$sortVariable] <=> $b[$sortVariable] ); $this->emit('load-chart', $this->mesi, $this->valori, $chartData); //usort($this->member_presences, $this->cmp); //usort($this->member_presences, function ($a, $b) { return $a['from'] > $b['from']; }); //$this->presenceYears = \App\Models\Course::whereIn('id', $course_ids)->orderBy('year')->groupBy('year')->pluck('year')->toArray(); //if (sizeof($this->presenceYears) > 0) // $this->presenceYearFilter = $this->presenceYears[0]; //$this->presenceTitle = \App\Models\Course::whereIn('id', $course_ids)->orderBy('name')->groupBy('name')->pluck('name')->toArray(); // return view('livewire.member'); } public function loadCombo() { $course_ids = array(); //$calendars = \App\Models\Calendar::whereNull('manual')->orderBy('from')->get(); /* foreach($calendars as $calendar) { $days = ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab']; $dow = date('w', strtotime($calendar->from)); $d = $days[$dow]; // Elenco corsi per tipologia in base al calendario $courses = \App\Models\Course::where('name', $calendar->name)->where('date_from', '<=', $calendar->from)->where('date_to', '>=', $calendar->to)->pluck('id')->toArray(); //$courses = array(1); foreach($courses as $c) { $course_ids[] = $c; } //$course_ids = array_push($course_ids, $courses); } */ $course_ids = \App\Models\MemberCourse::where('member_id', $this->dataId)->pluck('course_id')->toArray(); // Manuali (recuperi) $calendar_recuperi = \App\Models\Calendar::where('manual', 1)->pluck('name')->toArray(); // $this->presenceYears = \App\Models\Course::where('created_at', '>', '2025-08-01')->whereIn('id', $course_ids)->orderBy('year')->groupBy('year')->pluck('year')->toArray(); $this->presenceYears = \App\Models\Course::whereIn('id', $course_ids)->orderBy('year')->groupBy('year')->pluck('year')->toArray(); $this->presenceTitle = \App\Models\Course::whereIn('id', $course_ids)->orderBy('name')->groupBy('name')->pluck('name')->toArray(); foreach($calendar_recuperi as $cr) { $this->presenceTitle[] = $cr; } } public function showDetailF($id) { if (!isset($_GET["from"]) && $this->from == '') $this->from = 'members'; $this->currentMember = \App\Models\Member::findOrFail($id); $this->currentStatus = $this->currentMember->getStatus(); $this->showDetail = true; } public function add() { //$this->from = 'members'; $this->emit('load-select'); $this->emit('hide-search'); $this->showDetail = false; $this->resetFields(); $this->add = true; $this->update = false; $this->emit('setEdit', true); $this->emit('setEditCorso', false); } private function moveToNextTab() { $currentIndex = array_search($this->type, $this->tabOrder); if ($currentIndex !== false && $currentIndex < count($this->tabOrder) - 1) { $this->type = $this->tabOrder[$currentIndex + 1]; } } public function store($close) { $this->isSaving = true; $this->emit('load-select'); $this->emit('goToTop'); $rules = [ 'first_name' => 'required', 'last_name' => 'required', 'email' => 'required', 'phone' => 'required', 'birth_nation_id' => 'required', 'address' => 'required', 'zip_code' => 'required', 'nation_id' => 'required', 'birth_date' => 'before_or_equal:today', 'gender' => 'required' ]; if ($this->isBirthItaly) { $rules['birth_province_id'] = 'required'; $rules['birth_city_id'] = 'required'; $rules['fiscal_code'] = 'required'; } else { $rules['birth_place'] = 'required'; } if ($this->isItaly) { $rules['province_id'] = 'required'; $rules['city_id'] = 'required'; } $zzz = []; if ($this->birth_nation_id == null) $zzz[] = 'birth_nation_id=' . $this->birth_nation_id; if ($this->isBirthItaly) { if ($this->birth_province_id == null) $zzz[] = 'birth_province_id=' . $this->birth_province_id; if ($this->birth_city_id == null) $zzz[] = 'birth_city_id=' . $this->birth_city_id; } if ($this->nation_id == null) $zzz[] = 'nation_id=' . $this->nation_id; if ($this->isItaly) { if ($this->province_id == null) $zzz[] = 'province_id=' . $this->province_id; if ($this->city_id == null) $zzz[] = 'city_id=' . $this->city_id; } $this->emit('setErrorMsg', $zzz); if (!empty($this->fiscal_code)) { $existingMember = \App\Models\Member::where('fiscal_code', $this->fiscal_code)->first(); if ($existingMember) { $this->already_existing = true; $this->emit('focus-error-field', 'fiscal_code'); return; } } if ($this->under18) { $rules['father_name'] = 'required_without:mother_name'; $rules['father_email'] = 'required_without:mother_email|email'; $rules['father_fiscal_code'] = 'required_without:mother_fiscal_code'; $rules['mother_name'] = 'required_without:father_name'; $rules['mother_email'] = 'required_without:father_email|email'; $rules['mother_fiscal_code'] = 'required_without:father_fiscal_code'; } // override regole validazione utente $std_rules = $rules; $rules = [ 'first_name' => 'required', 'last_name' => 'required' ]; try { $this->validate($rules); } catch (\Illuminate\Validation\ValidationException $e) { $this->isSaving = false; $errorFields = array_keys($e->errors()); if (!empty($errorFields)) { $this->emit('focus-error-field', $errorFields[0]); } Log::error('Validation failed', ['errors' => $e->errors()]); return; } try { $name = ''; if ($this->image) { $name = md5($this->image . microtime()) . '.' . $this->image->extension(); $this->image->storeAs('public', $name); } $docs = implode("|", $this->document_files); $father_docs = implode("|", $this->father_document_files); $mother_docs = implode("|", $this->mother_document_files); $to_complete = false; try { $this->validate($std_rules); } catch(\Illuminate\Validation\ValidationException $e) { $to_complete = true; } $member = \App\Models\Member::create([ 'first_name' => strtoupper($this->first_name), 'last_name' => strtoupper($this->last_name), 'status' => $this->status, 'birth_city_id' => $this->birth_city_id > 0 ? $this->birth_city_id : null, 'birth_province_id' => $this->birth_province_id > 0 ? $this->birth_province_id : null, 'birth_nation_id' => $this->birth_nation_id > 0 ? $this->birth_nation_id : null, 'birth_date' => $this->birth_date, 'birth_place' => $this->birth_place, 'father_name' => $this->father_name, 'mother_name' => $this->mother_name, 'father_email' => strtolower($this->father_email), 'mother_email' => strtolower($this->mother_email), 'father_phone' => $this->father_phone, 'mother_phone' => $this->mother_phone, 'father_fiscal_code' => $this->father_fiscal_code, 'mother_fiscal_code' => $this->mother_fiscal_code, 'father_doc_number' => $this->father_doc_number, 'father_doc_type' => $this->father_doc_type, 'mother_doc_number' => $this->mother_doc_number, 'mother_doc_type' => $this->mother_doc_type, 'document_type' => $this->document_type, 'document_number' => $this->document_number, 'document_from' => $this->document_from, 'document_expire_date' => $this->document_expire_date, 'document_files' => $docs, 'mother_document_files' => $mother_docs, 'father_document_files' => $father_docs, 'gender' => $this->gender, 'no_send_mail' => $this->no_send_mail, 'exclude_from_records' => $this->exclude_from_records, 'fiscal_code' => $this->fiscal_code, 'address' => $this->address, 'zip_code' => $this->zip_code, 'nation_id' => $this->nation_id > 0 ? $this->nation_id : null, 'province_id' => $this->province_id > 0 ? $this->province_id : null, 'city_id' => $this->city_id > 0 ? $this->city_id : null, 'phone' => $this->phone, 'phone2' => $this->phone2, 'phone3' => $this->phone3, 'email' => strtolower($this->email), 'image' => $name, 'to_complete' => $to_complete, 'enabled' => $this->enabled ]); session()->flash('success, Tesserato creato'); updateMemberData($member->id); $this->resetFields(); if ($close) { $this->add = false; } else { $this->edit($member->id); $this->emit('saved-and-continue', $this->type); $this->dispatchBrowserEvent('scroll-to-top'); if ($this->birth_nation_id != null) $this->isBirthItaly = \App\Models\Nation::findOrFail($this->birth_nation_id)->first()->is_italy;// $this->nation_id;//$this->checkIsItaly(); if ($this->nation_id != null) $this->isItaly = \App\Models\Nation::findOrFail($this->nation_id)->first()->is_italy;// $this->nation_id;//$this->checkIsItaly(); } $this->emit('setEdit', false); } catch (\Exception $ex) { session()->flash('error', 'Errore (' . $ex->getMessage() . ')'); } } public function duplicate($id) { $member = \App\Models\Member::findOrFail($id); $newMember = $member->replicate(); $newMember->save(); $this->edit($newMember->id); } public function edit($id) { if (!isset($_GET["from"]) && $this->from == '') $this->from = 'members'; $this->showDetail = false; $this->emit('setEdit', true); $this->emit('setEditCorso', false); $this->emit('hide-search'); try { $member = \App\Models\Member::findOrFail($id); if (!$member) { session()->flash('error', 'Tesserato non trovato'); } else { $this->first_name = $member->first_name; $this->last_name = $member->last_name; $this->status = $member->status; $this->birth_city_id = $member->birth_city_id; $this->birth_province_id = $member->birth_province_id; $this->birth_nation_id = $member->birth_nation_id; $this->birth_date = $member->birth_date; $this->birth_place = $member->birth_place; $this->father_name = $member->father_name; $this->mother_name = $member->mother_name; $this->father_email = strtolower($member->father_email); $this->mother_email = strtolower($member->mother_email); $this->father_phone = $member->father_phone; $this->mother_phone = $member->mother_phone; $this->father_fiscal_code = $member->father_fiscal_code; $this->mother_fiscal_code = $member->mother_fiscal_code; $this->father_doc_number = $member->father_doc_number; $this->mother_doc_number = $member->mother_doc_number; $this->father_doc_type = $member->father_doc_type; $this->mother_doc_type = $member->mother_doc_type; $this->father_document_files = explode("|", $member->father_document_files); $this->mother_document_files = explode("|", $member->mother_document_files); $this->document_type = $member->document_type; $this->document_number = $member->document_number; $this->document_from = $member->document_from; $this->document_expire_date = $member->document_expire_date; $this->document_files = explode("|", $member->document_files); $this->gender = $member->gender; $this->no_send_mail = $member->no_send_mail; $this->exclude_from_records = $member->exclude_from_records; $this->fiscal_code = $member->fiscal_code; $this->address = $member->address; $this->zip_code = $member->zip_code; $this->nation_id = $member->nation_id; $this->province_id = $member->province_id; $this->city_id = $member->city_id; $this->phone = $member->phone; $this->phone2 = $member->phone2; $this->phone3 = $member->phone3; $this->email = strtolower($member->email); $this->image_old = $member->image; $this->enabled = $member->enabled; $this->dataId = $member->id; $this->active = $member->getStatus(); $this->money = $member->getMoney(); $this->checkIsBirthItaly(); $date1 = new DateTime($this->birth_date); $date2 = new DateTime("now"); $interval = $date1->diff($date2); $this->age = $interval->y . " anni"; $this->under18 = $interval->y < 18; //$this->provinces = \App\Models\Province::where('nation_id', $this->nation_id)->get(); //$this->cities = \App\Models\City::where('province_id', $this->province_id)->get(); //$this->birthProvinces = \App\Models\Province::where('nation_id', $this->birth_nation_id)->get(); //$this->birthCities = \App\Models\City::where('province_id', $this->birth_province_id)->get(); $this->update = true; $this->add = false; //$this->loadMemberCards(); //$this->loadMemberCourses(); //$this->loadMemberPresences(); //$this->loadMemberCategories(); //$this->loadMemberCertificates(); $this->loadMemberPresences(); $this->emit('setIds', $this->nation_id, $this->birth_nation_id); $this->emit('load-select'); $this->emit('load-provinces', $this->nation_id, 'provinceClass'); $this->emit('load-provinces', $this->birth_nation_id, 'provinceBirthClass'); $this->emit('load-cities', $this->province_id, 'cityClass'); $this->emit('load-cities', $this->birth_province_id, 'cityBirthClass'); } } catch (\Exception $ex) { session()->flash('error', 'Errore (' . $ex->getMessage() . ')'); } } public function updateAAA($close) { $this->emit('goToTop'); $this->isSaving = true; $this->emit('load-select'); $rules = [ 'first_name' => 'required', 'last_name' => 'required', 'email' => 'required', 'phone' => 'required', 'birth_nation_id' => 'required', 'address' => 'required', 'zip_code' => 'required', 'nation_id' => 'required', 'birth_date' => 'before_or_equal:today' ]; if ($this->isBirthItaly) { $rules['birth_province_id'] = 'required'; $rules['birth_city_id'] = 'required'; } else { $rules['birth_place'] = 'required'; } Log::info('isItaly', ['isItaly' => $this->isItaly]); $this->isItaly = $this->checkIsItaly(); if ($this->isItaly) { $rules['province_id'] = 'required'; $rules['city_id'] = 'required'; } $zzz = []; if ($this->birth_nation_id == null) $zzz[] = 'birth_nation_id=' . $this->birth_nation_id; if ($this->isBirthItaly) { if ($this->birth_province_id == null) $zzz[] = 'birth_province_id=' . $this->birth_province_id; if ($this->birth_city_id == null) $zzz[] = 'birth_city_id=' . $this->birth_city_id; } if ($this->nation_id == null) $zzz[] = 'nation_id=' . $this->nation_id; if ($this->isItaly) { if ($this->province_id == null) $zzz[] = 'province_id=' . $this->province_id; if ($this->city_id == null) $zzz[] = 'city_id=' . $this->city_id; } $this->emit('setErrorMsg', $zzz); if ($this->under18) { $rules['father_name'] = 'required_without:mother_name'; $rules['father_email'] = 'required_without:mother_email|email'; $rules['father_fiscal_code'] = 'required_without:mother_fiscal_code'; $rules['mother_name'] = 'required_without:father_name'; $rules['mother_email'] = 'required_without:father_email|email'; $rules['mother_fiscal_code'] = 'required_without:father_fiscal_code'; } // override regole validazione utente $std_rules = $rules; $rules = [ 'first_name' => 'required', 'last_name' => 'required' ]; try { $this->validate($rules); } catch (\Illuminate\Validation\ValidationException $e) { $this->isSaving = false; $errorFields = array_keys($e->errors()); if (!empty($errorFields)) { $this->emit('focus-error-field', $errorFields[0]); } Log::error('Validation failed', ['errors' => $e->errors()]); return; } try { $name = ''; if ($this->image) { $name = md5($this->image . microtime()) . '.' . $this->image->extension(); $this->image->storeAs('public', $name); } $docs = implode("|", $this->document_files); $father_docs = implode("|", $this->father_document_files); $mother_docs = implode("|", $this->mother_document_files); $to_complete = false; try { $this->validate($std_rules); } catch(\Illuminate\Validation\ValidationException $e) { $to_complete = true; } \App\Models\Member::whereId($this->dataId)->update([ 'first_name' => strtoupper($this->first_name), 'last_name' => strtoupper($this->last_name), 'status' => $this->status, 'birth_city_id' => $this->birth_city_id > 0 ? $this->birth_city_id : null, 'birth_province_id' => $this->birth_province_id > 0 ? $this->birth_province_id : null, 'birth_nation_id' => $this->birth_nation_id > 0 ? $this->birth_nation_id : null, 'birth_date' => $this->birth_date, 'birth_place' => $this->birth_place, 'father_name' => $this->father_name, 'mother_name' => $this->mother_name, 'father_email' => strtolower($this->father_email), 'mother_email' => strtolower($this->mother_email), 'father_phone' => $this->father_phone, 'mother_phone' => $this->mother_phone, 'father_fiscal_code' => $this->father_fiscal_code, 'mother_fiscal_code' => $this->mother_fiscal_code, 'father_doc_number' => $this->father_doc_number, 'father_doc_type' => $this->father_doc_type, 'mother_doc_number' => $this->mother_doc_number, 'mother_doc_type' => $this->mother_doc_type, 'father_document_files' => $father_docs, 'mother_document_files' => $mother_docs, 'document_type' => $this->document_type, 'document_number' => $this->document_number, 'document_from' => $this->document_from, 'document_expire_date' => $this->document_expire_date, 'document_files' => $docs, 'gender' => $this->gender, 'no_send_mail' => $this->no_send_mail, 'exclude_from_records' => $this->exclude_from_records, 'fiscal_code' => $this->fiscal_code, 'address' => $this->address, 'zip_code' => $this->zip_code, 'nation_id' => $this->nation_id > 0 ? $this->nation_id : null, 'province_id' => $this->province_id > 0 ? $this->province_id : null, 'city_id' => $this->city_id > 0 ? $this->city_id : null, 'image' => $name != '' ? $name : $this->image_old, 'phone' => $this->phone, 'phone2' => $this->phone2, 'phone3' => $this->phone3, 'email' => strtolower($this->email), 'to_complete' => $to_complete, 'enabled' => $this->enabled ]); updateMemberData($this->dataId); session()->flash('success', 'Tesserato aggiornato'); if ($close) { $this->emit('saved-and-close'); //$this->resetFields(); //$this->update = false; } else { $this->emit('saved-and-continue', $this->type); $this->dispatchBrowserEvent('scroll-to-top'); if ($this->birth_nation_id != null) $this->isBirthItaly = \App\Models\Nation::findOrFail($this->birth_nation_id)->first()->is_italy;// $this->nation_id;//$this->checkIsItaly(); if ($this->nation_id != null) $this->isItaly = \App\Models\Nation::findOrFail($this->nation_id)->first()->is_italy;// $this->nation_id;//$this->checkIsItaly(); } $this->emit('setEdit', false); } catch (\Exception $ex) { session()->flash('error', 'Errore (' . $ex->getMessage() . ')'); } } public function cancel() { $this->add = false; $this->update = false; $this->showDetail = false; $this->resetFields(); $this->emit('setEdit', false); //$this->emit('setEditCorso', false); $this->emit('reload'); } public function delete($id) { try { \App\Models\Member::find($id)->delete(); session()->flash('success', "Tesserato eliminato"); $this->emit('reload'); } catch (\Exception $e) { session()->flash('error', 'Errore (' . $e->getMessage() . ')'); } } public function checkUncheckAll() { if (!$this->checkedAll) { $this->multipleIds = array(); } else { foreach ($this->records as $r) { $this->multipleIds[] = $r->id; } } } public function multipleDelete() { try { foreach ($this->multipleIds as $id) { \App\Models\Member::find($id)->delete(); } } catch (\Exception $e) { session()->flash('error', 'Errore (' . $e->getMessage() . ')'); } $this->multipleAction = ''; } // Card public function addCard() { $this->resetCardFields(); $this->addCard = true; $this->updateCard = false; } private function checkCourseAvailability() { $this->active = $this->getActiveStatus(); $this->emit('course-availability-updated'); } private function getActiveStatus() { if ($this->dataId > 0) { $member = \App\Models\Member::find($this->dataId); if ($member) { return $member->getStatus(); } } return ["status" => 0, "date" => null]; } public function storeCard() { $this->validate(['card_card_id' => 'required']); try { // in base alla card selezionata calcolo la scadenza $expire_date = null; if ($this->card_date != '') { $y = date("Y", strtotime($this->card_date)); $card = \App\Models\Card::findOrFail($this->card_card_id); if ($card->next_day_expire > 0 && $card->next_month_expire > 0) { $m = strlen($card->next_month_expire) == 1 ? ('0' . $card->next_month_expire) : $card->next_month_expire; if (date("md", strtotime($this->card_date)) > ($m . $card->next_day_expire)) $y += 1; $next_exp = date($y . "-" . $m . "-" . $card->next_day_expire); if ($next_exp > $this->card_date) { $expire_date = $next_exp; } else $expire_date = date($y . "-" . $card->next_month_expire . "-" . $card->next_day_expire, strtotime(' + 1 years')); } else { if ($card->one_year_expire) { $expire_date = date("Y-m-d", strtotime($this->card_date . ' + 1 years')); } } } \App\Models\MemberCard::create([ 'member_id' => $this->dataId, 'card_id' => $this->card_card_id, 'number' => $this->card_number, 'date' => $this->card_date, 'accept_date' => $this->card_accept_date != '' ? $this->card_accept_date : $this->card_date, 'expire_date' => $expire_date, 'status' => $this->card_status, 'discipline1_id' => $this->card_discipline1_id, 'discipline2_id' => $this->card_discipline2_id, 'discipline3_id' => $this->card_discipline3_id, ]); updateMemberData($this->dataId); session()->flash('success, Tesserato creato'); $this->resetCardFields(); $this->addCard = false; $this->loadMemberCards(); $this->checkCourseAvailability(); } catch (\Exception $ex) { session()->flash('error', 'Errore (' . $ex->getMessage() . ')'); } } public function editCard($id) { try { $memberCard = \App\Models\MemberCard::findOrFail($id); if (!$memberCard) { session()->flash('error', 'Tesserato non trovato'); } else { $this->card_card_id = $memberCard->card_id; $this->card_number = $memberCard->number; $this->card_date = $memberCard->date; $this->card_accept_date = $memberCard->accept_date; $this->card_status = $memberCard->status; $this->card_discipline1_id = $memberCard->discipline1_id; $this->card_discipline2_id = $memberCard->discipline2_id; $this->card_discipline3_id = $memberCard->discipline3_id; $this->cardDataId = $memberCard->id; $this->updateCard = true; $this->addCard = false; } } catch (\Exception $ex) { session()->flash('error', 'Errore (' . $ex->getMessage() . ')'); } } public function updateCard() { $this->validate(['card_card_id' => 'required']); try { Log::info('Starting card update', [ 'member_id' => $this->dataId, 'card_id' => $this->card_card_id, 'card_number' => $this->card_number ]); $expire_date = null; if ($this->card_date != '') { $card = \App\Models\Card::findOrFail($this->card_card_id); Log::info('Card details', [ 'card_id' => $card->id, 'next_day_expire' => $card->next_day_expire, 'next_month_expire' => $card->next_month_expire, 'one_year_expire' => $card->one_year_expire ]); if ($card->next_day_expire > 0 && $card->next_month_expire > 0) { $y = date("Y", strtotime($this->card_date)); $m = strlen($card->next_month_expire) == 1 ? ('0' . $card->next_month_expire) : $card->next_month_expire; $d = strlen($card->next_day_expire) == 1 ? ('0' . $card->next_day_expire) : $card->next_day_expire; $next_exp = $y . "-" . $m . "-" . $d; // Format dates for comparison $input_date_obj = new \DateTime($this->card_date); $next_exp_obj = new \DateTime($next_exp); if ($next_exp_obj > $input_date_obj) { $expire_date = $next_exp; } else { // Add 1 year to the expiration date if the input date is after the expiration date $next_exp_obj->modify('+1 year'); $expire_date = $next_exp_obj->format('Y-m-d'); } Log::info('Calculated expiration date (next_day_expire/next_month_expire rule)', [ 'input_date' => $this->card_date, 'next_exp' => $next_exp, 'expire_date' => $expire_date, 'comparison' => ($next_exp_obj > $input_date_obj) ? 'next_exp is after input_date' : 'next_exp is before or equal to input_date' ]); } else { if ($card->one_year_expire) { $expire_date = date("Y-m-d", strtotime($this->card_date . ' + 1 years')); Log::info('Calculated expiration date (one_year_expire rule)', [ 'input_date' => $this->card_date, 'expire_date' => $expire_date ]); } } } Log::info('Updating member card', [ 'card_id' => $this->cardDataId, 'member_id' => $this->dataId, 'card_number' => $this->card_number, 'date' => $this->card_date, 'expire_date' => $expire_date, 'status' => $this->card_status ]); \App\Models\MemberCard::whereId($this->cardDataId)->update([ 'member_id' => $this->dataId, 'card_id' => $this->card_card_id, 'number' => $this->card_number, 'date' => $this->card_date, 'accept_date' => $this->card_accept_date != '' ? $this->card_accept_date : $this->card_date, 'expire_date' => $expire_date, 'status' => $this->card_status, 'discipline1_id' => $this->card_discipline1_id, 'discipline2_id' => $this->card_discipline2_id, 'discipline3_id' => $this->card_discipline3_id, ]); updateMemberData($this->dataId); Log::info('Card updated successfully', [ 'card_id' => $this->cardDataId, 'member_id' => $this->dataId ]); session()->flash('success', 'Tesserato aggiornato'); $this->resetCardFields(); $this->updateCard = false; $this->loadMemberCards(); $this->checkCourseAvailability(); } catch (\Exception $ex) { Log::error('Error updating card', [ 'card_id' => $this->cardDataId, 'member_id' => $this->dataId, 'error_message' => $ex->getMessage(), 'error_trace' => $ex->getTraceAsString() ]); session()->flash('error', 'Errore (' . $ex->getMessage() . ')'); } } public function cancelCard() { $this->addCard = false; $this->updateCard = false; $this->resetCardFields(); } public function deleteCard($id) { try { \App\Models\MemberCard::find($id)->delete(); session()->flash('success', "Tesserato eliminato"); } catch (\Exception $e) { session()->flash('error', 'Errore (' . $e->getMessage() . ')'); } } // Courses public function addCourse() { $this->resetCourseFields(); $this->addCourse = true; $this->updateCourse = false; $this->emit('setEditCorso', true); } public function storeCourse() { $this->validate(['course_course_id' => 'required']); try { \App\Models\MemberCourse::create([ 'member_id' => $this->dataId, 'course_id' => $this->course_course_id, 'date_from' => $this->course_date_from, 'date_to' => $this->course_date_to, 'course_subscription_id' => $this->course_course_subscription_id, 'status' => $this->course_status, 'subscribed' => false, // default non iscritto 'price' => currencyToDouble($this->course_price), 'subscription_price' => currencyToDouble($this->course_subscription_price), 'notes' => $this->course_note, 'months' => json_encode($this->course_months), 'when' => json_encode($this->course_when) ]); $course_name = ''; // Se il corso ha associato una categoria iscrivo anche al gruppo $c = \App\Models\Course::findOrFail($this->course_course_id); if ($c) { if ($c->category_id > 0) { \App\Models\MemberCategory::create([ 'member_id' => $this->dataId, 'category_id' => $c->category_id, 'date' => \Carbon\Carbon::now() ]); } $course_name = $c->name; } $days = array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'); //foreach($this->course_months as $m) //{ $from = date("Y-m-d", strtotime($c->date_from)); $to = date("Y-m-d", strtotime($c->date_to)); $endDate = strtotime($to); foreach($this->course_when as $d) { foreach($d["day"] as $dd) { $day = ''; switch ($dd) { case 'lun': $day = $days[0]; break; case 'mar': $day = $days[1]; break; case 'mer': $day = $days[2]; break; case 'gio': $day = $days[3]; break; case 'ven': $day = $days[4]; break; case 'sab': $day = $days[5]; break; case 'dom': $day = $days[6]; break; default: $day = ''; break; } if ($day != '') { for($i = strtotime($day, strtotime($from)); $i <= $endDate; $i = strtotime('+1 week', $i)) { // Controllo che non esiste un corso così $exist = \App\Models\Calendar::where('from', date('Y-m-d ' . $d["from"] . ":00", $i))->where('to', date('Y-m-d ' . $d["to"] . ":00", $i))->where('name', $course_name)->first(); if (!$exist && !in_array(date('Y-m-d', $i), $this->festivita)) { // Creo il calendario del corso $calendar = new \App\Models\Calendar(); $calendar->course_id = $this->course_course_id; $calendar->court_id = null; $calendar->name = $course_name; $calendar->course_type_id = null; $calendar->course_duration_id = null; $calendar->course_frequency_id = null; $calendar->course_level_id = null; $calendar->instructor_id = null; $calendar->from = date('Y-m-d ' . $d["from"] . ":00", $i); $calendar->to = date('Y-m-d ' . $d["to"] . ":00", $i); $calendar->note = ''; $calendar->status = 0; $calendar->save(); } } } } } //} session()->flash('success, Corso creato'); $this->resetCourseFields(); $this->addCourse = false; $this->emit('setEditCorso', false); } catch (\Exception $ex) { session()->flash('error', 'Errore (' . $ex->getMessage() . ')'); } } public function editCourse($id) { try { $memberCourse = \App\Models\MemberCourse::findOrFail($id); if (!$memberCourse) { session()->flash('error', 'Corso non trovato'); } else { $this->course_course_id = $memberCourse->course_id; // Carico i dati relativi alla struttura ad albero $c = \App\Models\Course::findOrFail($this->course_course_id); $this->course_name = $c->name . " (" . $c->year . ")"; $this->course_level_id = $c->course_level_id; $this->course_type_id = $c->course_type_id; $this->course_frequency_id = $c->course_frequency_id; $all = \App\Models\Course::where('name', 'like', '%' . $c->name . "%")->where('enabled', true)->get(); foreach ($all as $a) { $levels_ids[] = $a->course_level_id; } $this->course_levels = \App\Models\CourseLevel::select('*')->where('enabled', true)->whereIn('id', $levels_ids)->get(); $all = \App\Models\Course::where('name', 'like', '%' . $c->name . "%")->where('enabled', true)->where('course_level_id', $this->course_level_id)->get(); foreach ($all as $a) { $types_ids[] = $a->course_type_id; } $this->course_types = \App\Models\CourseType::select('*')->where('enabled', true)->whereIn('id', $types_ids)->get(); $frequencies_ids = []; $all = \App\Models\Course::where('name', 'like', '%' . $c->name . "%")->where('enabled', true)->where('course_level_id', $this->course_level_id)->where('course_type_id', $this->course_type_id)->get(); foreach ($all as $a) { $frequencies_ids[] = $a->course_frequency_id; } $this->course_frequencies = \App\Models\CourseFrequency::select('*')->where('enabled', true)->whereIn('id', $frequencies_ids)->get(); $this->course_when = array(); $this->course_date_from = $memberCourse->date_from; $this->course_date_to = $memberCourse->date_to; foreach (json_decode($memberCourse->when) as $z) { $this->course_when[] = array("day" => $z->day, "from" => $z->from, "to" => $z->to); } //$this->course_when = json_decode($memberCourse->when); $this->course_course_subscription_id = $memberCourse->course_subscription_id; $this->course_status = $memberCourse->status; $this->course_subscribed = $memberCourse->subscribed == 1 ? true : false; $this->course_price = formatPrice($memberCourse->price); $this->course_subscription_price = formatPrice($memberCourse->subscription_price); $this->course_note = $memberCourse->notes; foreach (json_decode($memberCourse->months) as $z) { $this->course_months[] = array("m" => $z->m, "status" => $z->status); } $this->courseDataId = $memberCourse->id; $this->updateCourse = true; $this->addCourse = false; $this->emit('setEditCorso', true); } } catch (\Exception $ex) { session()->flash('error', 'Errore (' . $ex->getMessage() . ')'); } } public function updateCourse() { //$this->validate(); $this->validate(['course_course_id' => 'required']); try { \App\Models\MemberCourse::whereId($this->courseDataId)->update([ 'member_id' => $this->dataId, 'course_id' => $this->course_course_id, 'date_from' => $this->course_date_from, 'date_to' => $this->course_date_to, 'course_subscription_id' => $this->course_course_subscription_id, 'status' => $this->course_status, 'price' => currencyToDouble($this->course_price), 'subscription_price' => currencyToDouble($this->course_subscription_price), 'notes' => $this->course_note, 'months' => json_encode($this->course_months), 'when' => json_encode($this->course_when) ]); $course_name = ''; // Se il corso ha associato una categoria iscrivo anche al gruppo $c = \App\Models\Course::findOrFail($this->course_course_id); if ($c) { if ($c->category_id > 0) { \App\Models\MemberCategory::create([ 'member_id' => $this->dataId, 'category_id' => $c->category_id, 'date' => \Carbon\Carbon::now() ]); } $course_name = $c->name; } $days = array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'); //foreach($this->course_months as $m) //{ $from = date("Y-m-d", strtotime($c->date_from)); $to = date("Y-m-d", strtotime($c->date_to)); $endDate = strtotime($to); foreach($this->course_when as $d) { foreach($d["day"] as $dd) { $day = ''; switch ($dd) { case 'lun': $day = $days[0]; break; case 'mar': $day = $days[1]; break; case 'mer': $day = $days[2]; break; case 'gio': $day = $days[3]; break; case 'ven': $day = $days[4]; break; case 'sab': $day = $days[5]; break; case 'dom': $day = $days[6]; break; default: $day = ''; break; } if ($day != '') { for($i = strtotime($day, strtotime($from)); $i <= $endDate; $i = strtotime('+1 week', $i)) { // Controllo che non esiste un corso così $exist = \App\Models\Calendar::where('from', date('Y-m-d ' . $d["from"] . ":00", $i))->where('to', date('Y-m-d ' . $d["to"] . ":00", $i))->where('name', $course_name)->first(); if (!$exist && !in_array(date('Y-m-d', $i), $this->festivita)) { // Creo il calendario del corso $calendar = new \App\Models\Calendar(); $calendar->course_id = $this->course_course_id; $calendar->court_id = null; $calendar->name = $course_name; $calendar->course_type_id = null; $calendar->course_duration_id = null; $calendar->course_frequency_id = null; $calendar->course_level_id = null; $calendar->instructor_id = null; $calendar->from = date('Y-m-d ' . $d["from"] . ":00", $i); $calendar->to = date('Y-m-d ' . $d["to"] . ":00", $i); $calendar->note = ''; $calendar->status = 0; $calendar->save(); } } } } } session()->flash('success', 'Corso aggiornato'); $this->resetCourseFields(); $this->updateCourse = false; $this->emit('setEditCorso', false); } catch (\Exception $ex) { session()->flash('error', 'Errore (' . $ex->getMessage() . ')'); } } public function cancelCourse() { $this->addCourse = false; $this->updateCourse = false; $this->emit('setEditCorso', false); $this->resetCourseFields(); } public function deleteCourse($id) { try { \App\Models\MemberCourse::find($id)->delete(); session()->flash('success', "Corso eliminato"); } catch (\Exception $e) { session()->flash('error', 'Errore (' . $e->getMessage() . ')'); } } public function addRow() { $this->course_when[] = array('day' => array(), 'from' => '', 'to' => ''); } public function delRow($idx) { unset($this->course_when[$idx]); } // Certificates public function addCertificate() { $this->resetCertificateFields(); $this->addCertificate = true; $this->updateCertificate = false; } public function storeCertificate() { $this->validate(['certificate_expire_date' => 'required']); // $this->validate(); try { $name = ''; try { if ($this->certificate_filename) { $name = md5($this->certificate_filename . microtime()) . '.' . $this->certificate_filename->extension(); $this->certificate_filename->storeAs('public', $name); } } catch (\Exception $ex) { //session()->flash('error','Errore (' . $ex->getMessage() . ')'); } if ($this->dataId > -1) { \App\Models\MemberCertificate::create([ 'member_id' => $this->dataId, 'type' => $this->certificate_type, 'filename' => $name, 'expire_date' => $this->certificate_expire_date, 'status' => $this->certificate_status ]); updateMemberData($this->dataId); } /*else { $this->certificateTmp = new \App\Models\MemberCertificate(); $this->certificateTmp->type = $this->certificate_type; $this->certificateTmp->filename = $name; $this->certificateTmp->expire_date = $this->certificate_expire_date; $this->certificateTmp->status = $this->certificate_status; $this->certificateTmp->status = $this->certificate_status; // s $this->member_certificates[] = $certificateTmp; }*/ session()->flash('success, Tesserato creato'); $this->resetCertificateFields(); $this->addCertificate = false; } catch (\Exception $ex) { session()->flash('error', 'Errore (' . $ex->getMessage() . ')'); } } public function editCertificate($id) { try { $memberCertificate = \App\Models\MemberCertificate::findOrFail($id); if (!$memberCertificate) { session()->flash('error', 'Tesserato non trovato'); } else { $this->certificate_type = $memberCertificate->type; $this->certificate_filename_old = $memberCertificate->filename; $this->certificate_expire_date = $memberCertificate->expire_date; $this->certificate_status = $memberCertificate->status; $this->cardCertificateId = $memberCertificate->id; $this->updateCertificate = true; $this->addCertificate = false; } } catch (\Exception $ex) { session()->flash('error', 'Errore (' . $ex->getMessage() . ')'); } } public function updateCertificate() { $this->validate(['certificate_expire_date' => 'required']); try { $name = ''; try { if ($this->certificate_filename) { $name = md5($this->certificate_filename . microtime()) . '.' . $this->certificate_filename->extension(); $this->certificate_filename->storeAs('public', $name); } } catch (\Exception $ex) { //session()->flash('error','Errore (' . $ex->getMessage() . ')'); } \App\Models\MemberCertificate::whereId($this->cardCertificateId)->update([ 'member_id' => $this->dataId, 'type' => $this->certificate_type, 'filename' => $name != '' ? $name : $this->certificate_filename_old, 'expire_date' => $this->certificate_expire_date, 'status' => $this->certificate_status ]); updateMemberData($this->dataId); session()->flash('success', 'Tesserato aggiornato'); $this->resetCertificateFields(); $this->updateCertificate = false; } catch (\Exception $ex) { session()->flash('error', 'Errore (' . $ex->getMessage() . ')'); } } public function cancelCertificate() { $this->addCertificate = false; $this->updateCertificate = false; $this->resetCertificateFields(); } public function deleteCertificate($id) { try { \App\Models\MemberCertificate::find($id)->delete(); session()->flash('success', "Tesserato eliminato"); } catch (\Exception $e) { session()->flash('error', 'Errore (' . $e->getMessage() . ')'); } } // Gruppi di appartenenza public function storeCategory() { $this->validate(['category_category_id' => 'required']); try { \App\Models\MemberCategory::create([ 'member_id' => $this->dataId, 'category_id' => $this->category_category_id, 'date' => \Carbon\Carbon::now() ]); session()->flash('success, Associazione creato'); $this->resetCategoryFields(); $this->addCard = false; } catch (\Exception $ex) { session()->flash('error', 'Errore (' . $ex->getMessage() . ')'); } } public function hideMsg() { $this->groupMsg = ''; } public function storeCategoryWithID($id) { $this->groupMsg = ''; try { if (\App\Models\MemberCategory::where('member_id', $this->dataId)->where('category_id', $id)->first()) { $this->groupMsg = '
Attenzione, questo corso è stato già inserito'; } else { \App\Models\MemberCategory::create([ 'member_id' => $this->dataId, 'category_id' => $id, 'date' => \Carbon\Carbon::now() ]); session()->flash('success, Associazione creato'); $this->resetCategoryFields(); $this->addCard = false; } } catch (\Exception $ex) { session()->flash('error', 'Errore (' . $ex->getMessage() . ')'); } } public function deleteCategory($id) { try { \App\Models\MemberCategory::find($id)->delete(); session()->flash('success', "Associazione eliminata"); } catch (\Exception $e) { session()->flash('error', 'Errore (' . $e->getMessage() . ')'); } } public function setCourse($id) { $this->course_course_id = $id; } public function getNation($nation) { if ($nation > 0) { $ret = \App\Models\Nation::findOrFail($nation); return $ret->name; } return ""; } public function getProvince($province) { if ($province > 0) { $ret = \App\Models\Province::findOrFail($province); return $ret->name; } return ""; } public function getCity($city) { if ($city > 0) { $ret = \App\Models\City::findOrFail($city); return $ret->name; } return ""; } public function getFiscalCode() { $this->error_fc = false; $cf = new codicefiscale(); $cf->setDateSeparator('-'); if ($this->first_name != '' && $this->last_name != '' && $this->birth_date != '' && $this->gender != '' && $this->birth_city_id > 0) { $code = ''; if ($this->birth_city_id > 0) { $code = \App\Models\City::findOrFail($this->birth_city_id)->code; } $codice = $cf->calcola($this->first_name, $this->last_name, $this->birth_date, $this->gender, $code); $this->fiscal_code = $codice; } else $this->error_fc = true; } public function setMonth($m) { if ($m < 1 || $m > 12) return; $payed = false; $exist = -1; foreach ($this->course_months as $idx => $x) { if ($x["m"] == $m) { $payed = $x["status"] == 1; $exist = $idx; break; } } if ($exist > -1) { if (!$payed) array_splice($this->course_months, $exist, 1); } else { $this->course_months[] = array("m" => $m, "status" => ""); } $rank = function (int $mm) { return ($mm - 9 + 12) % 12; }; usort($this->course_months, function ($a, $b) use ($rank) { return $rank((int)$a['m']) <=> $rank((int)$b['m']); }); $this->course_months = array_values($this->course_months); if ($this->course_course_id && !empty($this->course_months)) { try { $course = \App\Models\Course::findOrFail($this->course_course_id); $year = (int)$course->year; $first_month = (int)$this->course_months[0]['m']; $last_month = (int)$this->course_months[count($this->course_months) - 1]['m']; $start_year = ($first_month >= 9) ? $year : $year + 1; $end_year = ($last_month >= 9) ? $year : $year + 1; $start = \Illuminate\Support\Carbon::create($start_year, $first_month, 1, 0, 0, 0, 'Europe/Rome')->startOfDay(); $end = \Illuminate\Support\Carbon::create($end_year, $last_month, 1, 0, 0, 0, 'Europe/Rome')->endOfMonth()->endOfDay(); $this->course_date_from = $start->format('Y-m-d'); $this->course_date_to = $end->format('Y-m-d'); } catch (\Throwable $e) {} } } public function newPayment($course) { $c = \App\Models\Course::findOrFail($course["course_id"]); $price = $course["price"]; if (sizeof($this->payMonths) == 1) { $month = $this->payMonths[0]; $records = \App\Models\Record::where('member_course_id', $this->selectedCourseMember)->where('deleted', 0)->get(); foreach ($records as $record) { if (in_array($month, json_decode($record->months))) { foreach ($record->rows as $row) { if ($row->causal_id == $c->causal_id && !str_contains(strtolower($row->note), 'iscrizione')) { $tot = sizeof(json_decode($row->when)); // foreach (json_decode($row->when) as $m) { $price -= $row->amount / $tot; // } } } } } } $this->emit('setEdit', false); $this->emit('setEditCorso', false); return redirect()->to('/in?new=1&memberId=' . $this->dataId . '&causalId=' . $c->causal_id . '&subCausalId=' . $c->sub_causal_id . '&createSubscription=' . $this->createSubscription . (sizeof($this->payMonths) > 0 ? '&months=' . implode("|", $this->payMonths) : "") . '&price=' . $price . '&subscription_price=' . $course["subscription_price"] . "&courseId=" . $course["id"]); } public function block($course) { $xxx = json_decode($course["months"]); foreach ($xxx as $idx => $mm) { if (in_array($mm->m, $this->payMonths)) { $xxx[$idx]->status = 2; } } $c = \App\Models\MemberCourse::findOrFail($course["id"]); $c->months = json_encode($xxx); $c->save(); $this->payMonths = array(); } public function reactivate($course) { $xxx = json_decode($course["months"]); foreach ($xxx as $idx => $mm) { if (in_array($mm->m, $this->suspendedMonths)) { $xxx[$idx]->status = ""; } } $c = \App\Models\MemberCourse::findOrFail($course["id"]); $c->months = json_encode($xxx); $c->save(); $this->suspendedMonths = array(); } public function setPayMonth($m, $months, $selectedCourseMember) { if ($this->selectedCourseMember != $selectedCourseMember) $this->payMonths = array(); $this->selectedCourseMember = $selectedCourseMember; if (in_array($m, $this->payMonths)) { $i = array_search($m, $this->payMonths); array_splice($this->payMonths, $i, 1); } else if (in_array($m, $this->suspendedMonths)) { $i = array_search($m, $this->suspendedMonths); array_splice($this->suspendedMonths, $i, 1); } else { foreach (json_decode($months) as $mm) { if ($mm->m == $m) { if ($mm->status == "") $this->payMonths[] = $m; if ($mm->status == "1") { $mc = \App\Models\MemberCourse::findOrFail($selectedCourseMember); $price = $mc->price; $payed = 0; $extraC = ''; $recordsPayed = \App\Models\Record::where('member_course_id', $selectedCourseMember)->where('deleted', 0)->get(); foreach ($recordsPayed as $record) { if (in_array($m, json_decode($record->months))) { foreach ($record->rows as $row) { if ($row->causal_id == $mc->course->causal_id && !str_contains(strtolower($row->note), 'iscrizione')) { $tot = sizeof(json_decode($row->when)); $payed += $row->amount / $tot; } } if ($payed < $price) $this->payMonths[] = $m; } } } if ($mm->status == "2") $this->suspendedMonths[] = $m; } } } if (sizeof($this->payMonths) > 0 && sizeof($this->suspendedMonths) > 0) { $this->payMonths = array(); $this->suspendedMonths = array(); } } public function setCreateSubscription($subscribed, $selectedCourseMember) { if ($this->selectedCourseMember != $selectedCourseMember) $this->payMonths = array(); $this->selectedCourseMember = $selectedCourseMember; if (!$subscribed) $this->createSubscription = !$this->createSubscription; } public function showHideCourse($id) { if (in_array($id, $this->showCourse)) { $i = array_search($id, $this->showCourse); array_splice($this->showCourse, $i, 1); } else { $this->showCourse[] = $id; } } public function getMonthStatus($m, $months, $selectedCourseMember) { $class = "grey"; foreach (json_decode($months) as $mm) { if ($mm->m == $m) { if ($mm->status == "") { if (in_array($m, $this->payMonths) && $this->selectedCourseMember == $selectedCourseMember) $class = "blue"; else $class = "orange"; } if ($mm->status == "1") { $class = "green"; } if ($mm->status == "2") { if (in_array($m, $this->suspendedMonths) && $this->selectedCourseMember == $selectedCourseMember) $class = "blue"; else $class = "yellow"; } if ($class == 'green') { $mc = \App\Models\MemberCourse::findOrFail($selectedCourseMember); $price = $mc->price; $payed = 0; $extraC = ''; $recordsPayed = \App\Models\Record::where('member_course_id', $selectedCourseMember)->where('deleted', 0)->get(); foreach ($recordsPayed as $record) { if (in_array($m, json_decode($record->months))) { foreach ($record->rows as $row) { if ($row->causal_id == $mc->course->causal_id && !str_contains(strtolower($row->note), 'iscrizione')) { $tot = sizeof(json_decode($row->when)); $payed += $row->amount / $tot; } } } } if ($payed < $price) $class = 'orange half'; //$class .= $extraC; } } } return $class; } public function getSubscriptionStatus($subscribed, $selectedCourseMember) { $class = "grey"; if ($this->createSubscription && $this->selectedCourseMember == $selectedCourseMember) $class = "blue"; else $class = "orange"; if ($subscribed) $class = "green"; return $class; } public function checkMonth($m) { $ret = false; foreach ($this->course_months as $idx => $x) { if ($x["m"] == $m) { $ret = true; break; } } return $ret; } public function setDay($idx, $d) { if (in_array($d, $this->course_when[$idx]["day"])) { $i = array_search($d, $this->course_when[$idx]["day"]); array_splice($this->course_when[$idx]["day"], $i, 1); } else { $this->course_when[$idx]["day"][] = $d; } } public function updateBorsellino($importoBorsellino, $s) { if ($importoBorsellino > 0) { $imp = $importoBorsellino; if ($s == "-") $imp = $imp * -1; $money = new \App\Models\Money(); $money->member_id = $this->currentMember->id; $money->record_id = null; $money->amount = $imp; $money->date = date("Y-m-d"); $money->note = 'Forzato ' . $imp; $money->save(); } $this->emit('saved'); } public function getMonth($m) { $ret = ''; switch ($m) { case 1: $ret = 'Gennaio'; break; case 2: $ret = 'Febbraio'; break; case 3: $ret = 'Marzo'; break; case 4: $ret = 'Aprile'; break; case 5: $ret = 'Maggio'; break; case 6: $ret = 'Giugno'; break; case 7: $ret = 'Luglio'; break; case 8: $ret = 'Agosto'; break; case 9: $ret = 'Settembre'; break; case 10: $ret = 'Ottobre'; break; case 11: $ret = 'Novembre'; break; case 12: $ret = 'Dicembre'; break; default: $ret = ''; break; } return $ret; } public function archiveMultiple($ids) { $success = true; foreach ($ids as $id) { $success = $this->archive($id, true); if (!$success) break; } if ($success) { session()->flash('success', 'Membri archiviati con successo'); $this->emit('reload'); } } public function archive($id, $bulk = false) { try { $member = \App\Models\Member::findOrFail($id); $member->update([ 'is_archived' => true, 'archived_date' => now(), 'status' => 'archived', 'enabled' => false ]); updateMemberData($id); if (!$bulk) { session()->flash('success', 'Membro archiviato con successo'); $this->emit('reload'); } } catch (\Exception $e) { session()->flash('error', 'Errore durante l\'archiviazione: ' . $e->getMessage()); Log::error('Archive member error', [ 'member_id' => $id, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); if ($bulk) { return false; } } return true; } } class codicefiscale { /** * Array delle consonanti */ protected $_consonanti = array( 'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z' ); /** * Array delle vocali */ protected $_vocali = array( 'A', 'E', 'I', 'O', 'U' ); /** * Array per il calcolo della lettera del mese * Al numero del mese corrisponde una lettera */ protected $_mesi = array( 1 => 'A', 2 => 'B', 3 => 'C', 4 => 'D', 5 => 'E', 6 => 'H', 7 => 'L', 8 => 'M', 9 => 'P', 10 => 'R', 11 => 'S', 12 => 'T' ); protected $_pari = array( '0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5, '6' => 6, '7' => 7, '8' => 8, '9' => 9, 'A' => 0, 'B' => 1, 'C' => 2, 'D' => 3, 'E' => 4, 'F' => 5, 'G' => 6, 'H' => 7, 'I' => 8, 'J' => 9, 'K' => 10, 'L' => 11, 'M' => 12, 'N' => 13, 'O' => 14, 'P' => 15, 'Q' => 16, 'R' => 17, 'S' => 18, 'T' => 19, 'U' => 20, 'V' => 21, 'W' => 22, 'X' => 23, 'Y' => 24, 'Z' => 25 ); protected $_dispari = array( '0' => 1, '1' => 0, '2' => 5, '3' => 7, '4' => 9, '5' => 13, '6' => 15, '7' => 17, '8' => 19, '9' => 21, 'A' => 1, 'B' => 0, 'C' => 5, 'D' => 7, 'E' => 9, 'F' => 13, 'G' => 15, 'H' => 17, 'I' => 19, 'J' => 21, 'K' => 2, 'L' => 4, 'M' => 18, 'N' => 20, 'O' => 11, 'P' => 3, 'Q' => 6, 'R' => 8, 'S' => 12, 'T' => 14, 'U' => 16, 'V' => 10, 'W' => 22, 'X' => 25, 'Y' => 24, 'Z' => 23 ); protected $_controllo = array( '0' => 'A', '1' => 'B', '2' => 'C', '3' => 'D', '4' => 'E', '5' => 'F', '6' => 'G', '7' => 'H', '8' => 'I', '9' => 'J', '10' => 'K', '11' => 'L', '12' => 'M', '13' => 'N', '14' => 'O', '15' => 'P', '16' => 'Q', '17' => 'R', '18' => 'S', '19' => 'T', '20' => 'U', '21' => 'V', '22' => 'W', '23' => 'X', '24' => 'Y', '25' => 'Z' ); /** * Stringa di errore */ protected $_error = null; /** * Separatore per la data di nascita */ protected $_dateSeparator = '/'; /** * Percorso del file del database SQLite * dei codici catastali */ protected $_dbCatastali = null; /** * Trasforma la stringa passata in un array di lettere * e lo incrocia con un ulteriore array */ protected function _getLettere($string, array $haystack) { $letters = array(); foreach (str_split($string) as $needle) { if (in_array($needle, $haystack)) { $letters[] = $needle; } } return $letters; } /** * Ritorna un array con le vocali di una data stringa */ protected function _getVocali($string) { return $this->_getLettere($string, $this->_vocali); } /** * Ritorna un array con le consonanti di una data stringa */ protected function _getConsonanti($string) { return $this->_getLettere($string, $this->_consonanti); } /** * Pulisce la stringa filtrando tutti i caratteri che * non sono lettere. Lo switch $toupper se impostato a TRUE * converte la stringa risultante in MAIUSCOLO. */ protected function _sanitize($string, $toupper = true) { $result = preg_replace('/[^A-Za-z]*/', '', $string); return ($toupper) ? strtoupper($result) : $result; } /** * Se la stringa passata a funzione e' costituita * da meno di 3 caratteri, rimpiazza le lettere * mancanti con la lettera X. */ protected function _addMissingX($string) { $code = $string; while (strlen($code) < 3) { $code .= 'X'; } return $code; } /** * Ottiene il codice identificativo del nome */ protected function _calcolaNome($string) { $nome = $this->_sanitize($string); $code = ''; // Se il nome inserito e' piu' corto di 3 lettere // si aggiungono tante X quanti sono i caratteri // mancanti. if (strlen($nome) < 3) { return $this->_addMissingX($nome); } $nome_cons = $this->_getConsonanti($nome); // Se le consonanti contenute nel nome sono minori // o uguali a 3 vengono considerate nell'ordine in cui // compaiono. if (count($nome_cons) <= 3) { $code = implode('', $nome_cons); } else { // Se invece abbiamo almeno 4 consonanti, prendiamo // la prima, la terza e la quarta. for ($i = 0; $i < 4; $i++) { if ($i == 1) continue; if (!empty($nome_cons[$i])) { $code .= $nome_cons[$i]; } } } // Se compaiono meno di 3 consonanti nel nome, si // utilizzano le vocali, nell'ordine in cui compaiono // nel nome. if (strlen($code) < 3) { $nome_voc = $this->_getVocali($nome); while (strlen($code) < 3) { $code .= array_shift($nome_voc); } } return $code; } protected function _calcolaCognome($string) { $cognome = $this->_sanitize($string); $code = ''; // Se il cognome inserito e' piu' corto di 3 lettere // si aggiungono tante X quanti sono i caratteri // mancanti. if (strlen($cognome) < 3) { return $this->_addMissingX($cognome); } $cognome_cons = $this->_getConsonanti($cognome); // Per il calcolo del cognome si prendono le prime // 3 consonanti. for ($i = 0; $i < 3; $i++) { if (array_key_exists($i, $cognome_cons)) { $code .= $cognome_cons[$i]; } } // Se le consonanti non bastano, vengono prese // le vocali nell'ordine in cui compaiono. if (strlen($code) < 3) { $cognome_voc = $this->_getVocali($cognome); while (strlen($code) < 3) { $code .= array_shift($cognome_voc); } } return $code; } /** * Imposta il separatore di data ( default: / ) */ public function setDateSeparator($char) { $this->_dateSeparator = $char; return $this; } /** * Ritorna la parte di codice fiscale corrispondente * alla data di nascita del soggetto (Forma: AAMGG) */ protected function _calcolaDataNascita($data, $sesso) { $dn = explode($this->_dateSeparator, $data); $giorno = (int) @$dn[2]; $mese = (int) @$dn[1]; $anno = (int) @$dn[0]; // Le ultime due cifre dell'anno di nascita $aa = substr($anno, -2); // La lettera corrispondente al mese di nascita $mm = $this->_mesi[$mese]; // Il giorno viene calcolato a seconda del sesso // del soggetto di cui si calcola il codice: // se e' Maschio si mette il giorno reale, se e' // Femmina viene aggiungo 40 a questo numero. $gg = (strtoupper($sesso) == 'M') ? $giorno : ($giorno + 40); // Bug #1: Thanks to Luca if (strlen($gg) < 2) $gg = '0' . $gg; return $aa . $mm . $gg; } /** * Ritorna la cifra di controllo sulla base dei * 15 caratteri del codice fiscale calcolati. */ protected function _calcolaCifraControllo($codice) { $code = str_split($codice); $sum = 0; for ($i = 1; $i <= count($code); $i++) { $cifra = $code[$i - 1]; $sum += ($i % 2) ? $this->_dispari[$cifra] : $this->_pari[$cifra]; } $sum %= 26; return $this->_controllo[$sum]; } /** * Imposta il messaggio di errore */ protected function _setError($string) { $this->_error = $string; } /** * Verifica la presenza di un errore. * Ritorna TRUE se presente, FALSE altrimenti. */ public function hasError() { return !is_null($this->_error); } /** * Ritorna la stringa di errore */ public function getError() { return $this->_error; } /** * Ritorna il codice fiscale utilizzando i parametri * passati a funzione. Se si verifica */ public function calcola($nome, $cognome, $data, $sesso, $comune) { $codice = $this->_calcolaCognome($cognome) . $this->_calcolaNome($nome) . $this->_calcolaDataNascita($data, $sesso) . $comune; if ($this->hasError()) { return false; } $codice .= $this->_calcolaCifraControllo($codice); if (strlen($codice) != 16) { //$this->_setError(self::ERR_GENERIC); return 'ERROR'; } return $codice; } }