*/ public function computeForSubmission(Submission $submission): array { $template = $submission->checklistTemplate ?: ($submission->checklist_template_id ? ChecklistTemplate::find($submission->checklist_template_id) : ChecklistTemplate::activeTemplate()); if (! $template) { return []; } // Bina peta token => nilai daripada jawapan item. $variables = []; $answers = $submission->relationLoaded('answers') ? $submission->answers : $submission->answers()->with('item')->get(); foreach ($answers as $answer) { $item = $answer->item; if ($item && $item->formula_token) { $variables[$item->formula_token] = is_numeric($answer->value) ? (float) $answer->value : 0.0; } } return $this->compute($template, $variables); } /** * Kira hasil formula daripada peta pemboleh ubah mentah (berguna untuk ujian). * * @param array $variables * @return array */ public function compute(ChecklistTemplate $template, array $variables): array { $formulas = $template->relationLoaded('formulas') ? $template->formulas->sortBy('order') : $template->formulas()->orderBy('order')->get(); $results = []; foreach ($formulas as $formula) { $value = $this->evaluator->evaluate($formula->expression, $variables, $formula->guard_div_zero); // Hasil ini menjadi token yang boleh dirujuk oleh formula seterusnya. $variables[$formula->result_token] = $value ?? 0.0; $results[] = [ 'result_token' => $formula->result_token, 'label' => $formula->label, 'value' => $value, 'unit' => $formula->unit, ]; } return $results; } /** * Kira semula dan simpan hasil ke dalam jadual submission_results. */ public function recalculateAndStore(Submission $submission): void { $results = $this->computeForSubmission($submission); foreach ($results as $r) { $submission->results()->updateOrCreate( ['result_token' => $r['result_token']], [ 'label' => $r['label'], 'value' => $r['value'], 'unit' => $r['unit'], ] ); } } }