diff --git a/app/Http/Controllers/ServiceController.php b/app/Http/Controllers/ServiceController.php index 3f89f6f..69ed5c5 100644 --- a/app/Http/Controllers/ServiceController.php +++ b/app/Http/Controllers/ServiceController.php @@ -12,13 +12,14 @@ use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\Validator; +use Illuminate\Validation\Rule; use Illuminate\Validation\ValidationException; use Illuminate\View\View; use Symfony\Component\HttpKernel\Exception\HttpException; use App\Http\Requests\ServiceChangeRequest; use App\Mail\{CancelRequest,ChangeRequest}; -use App\Models\{Charge,Product,Service}; +use App\Models\{Charge,Invoice,Product,Service}; class ServiceController extends Controller { @@ -415,39 +416,74 @@ class ServiceController extends Controller */ public function update(Request $request,Service $o) { - if ($o->type->validation()) { - Session::put('service_update',true); - $validator = Validator::make($x=$request->post($o->category),$o->type->validation()); + Session::put('service_update',true); - if ($validator->fails()) { - return redirect() - ->back() - ->withErrors($validator) - ->withInput(); - } + // We dynamically create our validation + $validator = Validator::make( + $request->post(), + $x=collect($o->type->validation()) + ->keys() + ->transform(fn($item)=>sprintf('%s.%s',$o->category,$item)) + ->combine(array_values($o->type->validation())) + ->transform(fn($item)=>is_string($item) + ? preg_replace('/^exclude_without:/',sprintf('exclude_without:%s.',$o->category),$item) + : $item) + ->merge( + [ + 'external_billing' => 'nullable|in:on', + 'suspend_billing' => 'nullable|in:on', + 'recur_schedule' => ['required',Rule::in(collect(Invoice::billing_periods)->keys())], + 'invoice_next_at' => 'nullable|date', + 'price' => 'nullable|numeric', + $o->category => 'array|min:1', + ] + ) + ->toArray() + ); - $o->type->forceFill($validator->validated()); + if ($validator->fails()) { + return redirect() + ->back() + ->withErrors($validator) + ->withInput(); + } - } elseif ($request->post($o->product->category)) { - $o->type->forceFill($request->post($o->product->category)); + $validated = collect($validator->validated()); + + // Store our service type values + $o->type->forceFill($validated->get($o->category)); + + // Some special handling + switch ($o->category) { + case 'broadband': + // If pppoe is not set, then we dont need username/password + $o->type->pppoe = ($x=data_get($validated,$o->category.'.pppoe',FALSE)); + + if (! $x) { + $o->type->service_username = NULL; + $o->type->service_password = NULL; + } + + break; } $o->type->save(); - if ($request->post('invoice_next_at')) - $o->invoice_next_at = $request->invoice_next_at; + if ($validated->has('invoice_next_at')) + $o->invoice_next_at = $validated->get('invoice_next_at'); - if ($request->post('recur_schedule')) - $o->recur_schedule = $request->recur_schedule; + if ($validated->has('recur_schedule')) + $o->recur_schedule = $validated->get('recur_schedule'); - $o->suspend_billing = ($request->suspend_billing == 'on'); - $o->external_billing = ($request->external_billing == 'on'); - $o->price = $request->price ?: NULL; + $o->suspend_billing = ($validated->get('suspend_billing') == 'on'); + $o->external_billing = ($validated->get('external_billing') == 'on'); + $o->price = $validated->get('price'); // Also update our service start_at date. // @todo We may want to make start_at/stop_at dynamic values calculated by the type records - if ($request->post('start_at')) - $o->start_at = $request->start_at; + if ($validated->has('start_at')) + $o->start_at = $validated->get('start_at'); + else { // For broadband, start_at is connect_at in the type record switch ($o->category) { @@ -459,6 +495,8 @@ class ServiceController extends Controller $o->save(); - return redirect()->back()->with('success','Record Updated'); + return redirect() + ->back() + ->with('success','Record Updated'); } } \ No newline at end of file diff --git a/app/Models/Service/Broadband.php b/app/Models/Service/Broadband.php index 936016a..3874c03 100644 --- a/app/Models/Service/Broadband.php +++ b/app/Models/Service/Broadband.php @@ -88,10 +88,11 @@ class Broadband extends Type implements ServiceUsage public function validation(): array { return [ - 'service_number' => 'nullable|string|min:10|max:10', - 'service_address' => 'nullable|string|min:3', - 'service_username' => 'nullable|string', - 'service_password' => 'nullable|string', + 'service_number' => 'nullable|string|min:10|max:11', + 'service_address' => 'nullable|string|min:5', + 'service_username' => 'exclude_without:pppoe|nullable|string|min:3', + 'service_password' => 'exclude_without:pppoe|nullable|string|min:8', + 'pppoe' => 'nullable|in:on', 'connect_at' => 'nullable|date', 'start_at' => 'nullable|date', 'expire_at' => 'nullable|date|after:start_at', diff --git a/composer.lock b/composer.lock index 61afdf7..4c28a9a 100644 --- a/composer.lock +++ b/composer.lock @@ -1534,16 +1534,16 @@ }, { "name": "laravel/framework", - "version": "v11.16.0", + "version": "v11.17.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "bd4808aaf103ccb5cb4b00bcee46140c070c0ec4" + "reference": "42f505a0c8afc0743f73e70bec08e641e2870bd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/bd4808aaf103ccb5cb4b00bcee46140c070c0ec4", - "reference": "bd4808aaf103ccb5cb4b00bcee46140c070c0ec4", + "url": "https://api.github.com/repos/laravel/framework/zipball/42f505a0c8afc0743f73e70bec08e641e2870bd6", + "reference": "42f505a0c8afc0743f73e70bec08e641e2870bd6", "shasum": "" }, "require": { @@ -1736,7 +1736,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-07-16T14:33:07+00:00" + "time": "2024-07-23T16:33:27+00:00" }, { "name": "laravel/intuit", @@ -1777,16 +1777,16 @@ }, { "name": "laravel/passport", - "version": "v12.2.0", + "version": "v12.2.1", "source": { "type": "git", "url": "https://github.com/laravel/passport.git", - "reference": "b24c6462835a16163141fbe588533d16603212b7" + "reference": "795bbb406c8f10167df6062032de803bd7d686f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/passport/zipball/b24c6462835a16163141fbe588533d16603212b7", - "reference": "b24c6462835a16163141fbe588533d16603212b7", + "url": "https://api.github.com/repos/laravel/passport/zipball/795bbb406c8f10167df6062032de803bd7d686f2", + "reference": "795bbb406c8f10167df6062032de803bd7d686f2", "shasum": "" }, "require": { @@ -1849,7 +1849,7 @@ "issues": "https://github.com/laravel/passport/issues", "source": "https://github.com/laravel/passport" }, - "time": "2024-04-17T17:56:14+00:00" + "time": "2024-07-10T19:25:36+00:00" }, { "name": "laravel/prompts", @@ -3056,11 +3056,11 @@ }, { "name": "leenooks/laravel", - "version": "11.1.2", + "version": "11.1.4", "source": { "type": "git", "url": "https://gitea.dege.au/laravel/leenooks.git", - "reference": "f32c29fa8c4b189add48bde26b7b7115be49355f" + "reference": "f393813311b912f77e4a7082498ed7511482b531" }, "type": "library", "extra": { @@ -3093,7 +3093,7 @@ "laravel", "leenooks" ], - "time": "2024-07-23T08:47:36+00:00" + "time": "2024-07-24T04:08:04+00:00" }, { "name": "leenooks/passkey", diff --git a/database/migrations/2024_07_24_112743_service_broadband_pppoe.php b/database/migrations/2024_07_24_112743_service_broadband_pppoe.php new file mode 100644 index 0000000..cda606a --- /dev/null +++ b/database/migrations/2024_07_24_112743_service_broadband_pppoe.php @@ -0,0 +1,30 @@ +boolean('pppoe')->default(FALSE); + }); + + DB::table('service_broadband')->update(['pppoe'=>TRUE]); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('service_broadband', function (Blueprint $table) { + $table->dropColumn('pppoe'); + }); + } +}; diff --git a/resources/views/theme/backend/adminlte/home.blade.php b/resources/views/theme/backend/adminlte/home.blade.php index 52c80ca..85e321d 100644 --- a/resources/views/theme/backend/adminlte/home.blade.php +++ b/resources/views/theme/backend/adminlte/home.blade.php @@ -43,7 +43,7 @@
IP Address