costCalculatorService = $costCalculatorService; } public function formatCostForStayType(CostCalculator $cost, string $stayTypeTitle) { $living = optional($cost->stayTypeLiving->firstWhere('title', $stayTypeTitle))->pivot; $accomodation = optional($cost->stayTypeAccomodation->firstWhere('title', $stayTypeTitle))->pivot; $onetime = optional($cost->stayTypeOnetime->firstWhere('title', $stayTypeTitle))->pivot; $service = optional($cost->stayTypeService->firstWhere('title', $stayTypeTitle))->pivot; $html = "
"; if ($living) { $html .= "
Living {$living->monthly} /mo | {$living->yearly} /yr
"; } if ($accomodation) { $html .= "
Accommodation {$accomodation->monthly} /mo | {$accomodation->yearly} /yr
"; } if ($onetime) { $html .= "
One-time Visa: {$onetime->visa}, Bio: {$onetime->biometrics}, Sevis: {$onetime->sevis}, App: {$onetime->application}
"; } if ($service) { $html .= "
Service Ticket: {$service->flight_ticket}, Ins: {$service->insurance}, Extra: {$service->extra}
"; } $html .= "
"; return trim($html) ?: '-'; } public function index(Request $request) { if ($request->ajax()) { $model = CostCalculator::with([ 'country', 'stayTypeLiving', 'stayTypeAccomodation', 'stayTypeOnetime', 'stayTypeService' ]); return DataTables::eloquent($model) ->addIndexColumn() ->setRowClass('tableRow') ->editColumn('country', function (CostCalculator $cost) { return "

{$cost->country?->title}

"; }) ->editColumn('alone', function (CostCalculator $cost) { return $this->formatCostForStayType($cost, 'Alone'); }) ->editColumn('with_spouse', function (CostCalculator $cost) { return $this->formatCostForStayType($cost, 'With Spouse'); }) ->editColumn('with_spouse_and_child', function (CostCalculator $cost) { return $this->formatCostForStayType($cost, 'With Spouse and Child'); }) ->editColumn('status', function (CostCalculator $cost) { $status = $cost->status ? 'Published' : 'Draft'; $color = $cost->status ? 'text-success' : 'text-danger'; return "

{$status}

"; }) ->addColumn('action', 'costcalculator::cost.datatable.action') ->rawColumns(['country', 'alone', 'with_spouse', 'with_spouse_and_child', 'status', 'action']) ->toJson(); } return view('costcalculator::cost.index', [ 'title' => 'Estimated Cost Calculation', ]); } /** * Show the form for creating a new resource. */ public function create() { $data['title'] = 'Create Estimated Cost Calculation'; $data['editable'] = false; $data['countryOptions'] = Country::where('status', 1)->where('parent_id', null)->pluck('title', 'id'); $data['livingStatusOptions'] = StayType::where('status', 1)->pluck('title', 'id'); return view('costcalculator::cost.create', $data); } /** * Store a newly created resource in storage. */ public function store(Request $request) { $request->validate([ 'country_id' => 'required', ]); $input = $request->except(['living_cost', 'accomodation_cost', 'onetime_cost', 'service_cost']); DB::transaction(function () use ($input, $request) { $costs = CostCalculator::create($input); $attachLivingData = []; $attachAccData = []; $attachOnetimeData = []; $attachServiceData = []; foreach ($request->living_cost as $item) { $attachLivingData[$item['stay_type_id']] = [ 'monthly' => $item['monthly'], 'yearly' => $item['yearly'], ]; } foreach ($request->accomodation_cost as $item) { $attachAccData[$item['stay_type_id']] = [ 'monthly' => $item['monthly'], 'yearly' => $item['yearly'], ]; } foreach ($request->onetime_cost as $item) { $attachOnetimeData[$item['stay_type_id']] = [ 'visa' => $item['visa'], 'biometrics' => $item['biometrics'], 'sevis' => $item['sevis'], 'application' => $item['application'], ]; } foreach ($request->service_cost as $item) { $attachServiceData[$item['stay_type_id']] = [ 'flight_ticket' => $item['flight_ticket'], 'insurance' => $item['insurance'], 'extra' => $item['extra'], ]; } $costs->stayTypeLiving()->sync($attachLivingData); $costs->stayTypeAccomodation()->sync($attachAccData); $costs->stayTypeOnetime()->sync($attachOnetimeData); $costs->stayTypeService()->sync($attachServiceData); flash()->success('Cost Calculation has been created!'); }); return redirect()->route('cost.index'); } /** * Show the specified resource. */ public function show($id) { $data['title'] = 'View Cost Calculation'; $data['program'] = CostCalculator::findOrFail($id); $data['intakeOptions'] = Program::INTAKE; return view('costcalculator::cost.show', $data); } /** * Show the form for editing the specified resource. */ public function edit($id) { $data['title'] = 'Edit Cost Calculator'; $data['editable'] = true; $data['cost'] = CostCalculator::findOrFail($id); $data['countryOptions'] = Country::where('status', 1)->where('parent_id', null)->pluck('title', 'id'); $data['livingStatusOptions'] = StayType::where('status', 1)->pluck('title', 'id'); return view('costcalculator::cost.edit', $data); } /** * Update the specified resource in storage. */ public function update(Request $request, $id) { $input = $request->all(); DB::transaction(function () use ($input, $request, $id) { $program = CostCalculator::findOrFail($id); $program->update($input); flash()->success('Cost Calculation has been updated!'); }); return redirect()->route('cost.index')->withSuccess('Program has been updated!'); } /** * Remove the specified resource from storage. */ public function destroy($id) { try { $program = CostCalculator::findOrFail($id); $program->delete(); flash()->success('Cost Calculator has been deleted!'); } catch (\Throwable $th) { flash()->error($th->getMessage()); } return response()->json(['status' => 200, 'message' => 'Cost Calculator has been deleted!'], 200); } }