From 679a06750611fd7162e476751f37bd6fea4646bd Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 10 Dec 2024 21:09:12 +0100 Subject: [PATCH] Create routes and views for customers and their addresses. --- .../Controllers/Api/AddressController.php | 66 ++++ .../Controllers/Api/CustomerController.php | 69 +++++ app/Http/Controllers/CustomerController.php | 34 +++ app/Models/Address.php | 16 + app/Models/Customer.php | 68 +++++ ...24_11_25_161729_create_addresses_table.php | 2 +- ...34803_add_information_to_address_table.php | 29 ++ lang/de.json | 4 + lang/de/common.php | 4 + lang/de/customer.php | 15 +- .../views/components/address-card.blade.php | 16 + resources/views/customer/create.blade.php | 82 +++++ resources/views/customer/edit.blade.php | 286 ++++++++++++++++++ resources/views/customer/index.blade.php | 102 +++++++ routes/api.php | 4 + routes/web.php | 3 + 16 files changed, 797 insertions(+), 3 deletions(-) create mode 100644 app/Http/Controllers/Api/AddressController.php create mode 100644 app/Http/Controllers/Api/CustomerController.php create mode 100644 app/Http/Controllers/CustomerController.php create mode 100644 database/migrations/2024_12_07_134803_add_information_to_address_table.php create mode 100644 lang/de.json create mode 100644 resources/views/components/address-card.blade.php create mode 100644 resources/views/customer/create.blade.php create mode 100644 resources/views/customer/edit.blade.php create mode 100644 resources/views/customer/index.blade.php diff --git a/app/Http/Controllers/Api/AddressController.php b/app/Http/Controllers/Api/AddressController.php new file mode 100644 index 0000000..b66b45e --- /dev/null +++ b/app/Http/Controllers/Api/AddressController.php @@ -0,0 +1,66 @@ +json($customer->addresses); + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request, Customer $customer): JsonResponse + { + $addressData = $request->validate([ + 'name' => 'required|string', + 'email' => 'required|string|email', + 'phone' => 'string', + 'address' => 'string', + 'city' => 'string', + 'zip' => 'numeric', + 'is_address' => 'boolean', + 'is_delivery' => 'boolean', + ]); + + if (isset($addressData['is_address']) && $addressData['is_address'] == 1) { + $customer->addresses()->where('is_address', true)->update(['is_address' => false]); + } + + if (isset($addressData['is_delivery']) && $addressData['is_delivery'] == 1) { + $customer->addresses()->where('is_delivery', true)->update(['is_delivery' => false]); + } + + $address = $customer->addresses()->create($addressData); + return response()->json($address); + } + + /** + * Display the specified resource. + */ + public function show(Address $address): JsonResponse + { + return response()->json($address); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(Address $address): JsonResponse + { + $address->delete(); + + return response()->json(null, 204); + } +} diff --git a/app/Http/Controllers/Api/CustomerController.php b/app/Http/Controllers/Api/CustomerController.php new file mode 100644 index 0000000..f4ce89c --- /dev/null +++ b/app/Http/Controllers/Api/CustomerController.php @@ -0,0 +1,69 @@ +json(Customer::with(['address', 'delivery'])->orderBy('name')->get()); + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request): JsonResponse + { + $customerData = $request->validate([ + 'name' => 'required|string', + 'email' => 'required|string|email|unique:customers' + ]); + + $customer = new Customer($customerData); + $customer->save(); + + return response()->json($customer); + } + + /** + * Display the specified resource. + */ + public function show(Customer $customer): JsonResponse + { + return response()->json($customer); + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, Customer $customer): JsonResponse + { + $customerData = $request->validate([ + 'name' => 'required|string', + 'email' => ['required', 'string', 'email', Rule::unique('customers')->ignore($customer->id)], + ]); + + $customer->update($customerData); + + return response()->json($customer); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(Customer $customer): JsonResponse + { + $customer->delete(); + + return response()->json(null, 204); + } +} diff --git a/app/Http/Controllers/CustomerController.php b/app/Http/Controllers/CustomerController.php new file mode 100644 index 0000000..c40b56a --- /dev/null +++ b/app/Http/Controllers/CustomerController.php @@ -0,0 +1,34 @@ + $customer->load(['addresses'])]); + } +} diff --git a/app/Models/Address.php b/app/Models/Address.php index 7e4ccfe..1914346 100644 --- a/app/Models/Address.php +++ b/app/Models/Address.php @@ -8,4 +8,20 @@ use Illuminate\Database\Eloquent\SoftDeletes; class Address extends Model { use SoftDeletes; + + protected $fillable = [ + 'is_address', + 'is_delivery', + 'name', + 'email', + 'phone', + 'address', + 'city', + 'state', + 'country', + 'zip', + + ]; + + } diff --git a/app/Models/Customer.php b/app/Models/Customer.php index 453c830..ccbcac7 100644 --- a/app/Models/Customer.php +++ b/app/Models/Customer.php @@ -3,9 +3,77 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Database\Eloquent\Builder; class Customer extends Model { use SoftDeletes; + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = [ + 'name', + 'email', + ]; + + /** + * The attributes that are appended with attribute getters. + * + * @var string[] + */ + protected $appends = [ + 'created', + ]; + + /** + * Get the created_at attribute in local time format. + * + * @return string + */ + public function getCreatedAttribute(): string + { + return $this->created_at->format('d.m.Y'); + } + + /** + * Get the invoice address. + * + * @return HasOne + */ + public function address(): HasOne + { + return $this->hasOne(Address::class)->ofMany([], + function (Builder $query) { + $query->where('is_address', '=', true); + }); + } + + /** + * Get the delivery address. + * + * @return HasOne + */ + public function delivery(): HasOne + { + return $this->hasOne(Address::class)->ofMany([], + function (Builder $query) { + $query->where('is_delivery', '=', true); + }); + } + + /** + * Get all customer's addresses. + * + * @return HasMany + */ + public function addresses(): HasMany + { + return $this->hasMany(Address::class); + } } diff --git a/database/migrations/2024_11_25_161729_create_addresses_table.php b/database/migrations/2024_11_25_161729_create_addresses_table.php index c14419f..aabab2b 100644 --- a/database/migrations/2024_11_25_161729_create_addresses_table.php +++ b/database/migrations/2024_11_25_161729_create_addresses_table.php @@ -12,7 +12,7 @@ return new class extends Migration { { Schema::create('addresses', function (Blueprint $table) { $table->id(); - $table->foreignId('user_id')->constrained(); + $table->foreignId('customer_id')->constrained(); $table->string('name'); $table->string('email')->nullable(); diff --git a/database/migrations/2024_12_07_134803_add_information_to_address_table.php b/database/migrations/2024_12_07_134803_add_information_to_address_table.php new file mode 100644 index 0000000..a7750f4 --- /dev/null +++ b/database/migrations/2024_12_07_134803_add_information_to_address_table.php @@ -0,0 +1,29 @@ +boolean('is_address')->default(false)->after('customer_id'); + $table->boolean('is_delivery')->default(false)->after('is_address'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('addresses', function (Blueprint $table) { + $table->dropColumn('is_address'); + $table->dropColumn('is_delivery'); + }); + } +}; diff --git a/lang/de.json b/lang/de.json new file mode 100644 index 0000000..a6bc744 --- /dev/null +++ b/lang/de.json @@ -0,0 +1,4 @@ +{ + "(and :count more error)": "(und :count weiterer Fehler)", + "(and :count more errors)": "(und :count weitere Fehler)" +} diff --git a/lang/de/common.php b/lang/de/common.php index ab78bc4..00d5a59 100644 --- a/lang/de/common.php +++ b/lang/de/common.php @@ -16,6 +16,10 @@ return [ 'Name' => 'Name', 'Email' => 'Email', 'Password' => 'Passwort', + 'Phone' => 'Telefon', + 'Address' => 'Adresse', + 'Zip Code' => 'Postleitzahl', + 'City' => 'Stadt', 'You\'re logged in!' => 'Du bist angemeldet!', 'Confirm' => 'Bestätigen', 'Email Password Reset Link' => 'Email Passwort-Reset Link', diff --git a/lang/de/customer.php b/lang/de/customer.php index 133bd84..139c7c1 100644 --- a/lang/de/customer.php +++ b/lang/de/customer.php @@ -13,10 +13,21 @@ return [ 'Customers' => 'Kunden', 'Add new customer' => 'Neuer Kunde', - 'Add new customer by clicking add' => 'Neuen Kunde erstellen', + 'Edit existing customer' => 'Bestehenden Kunden bearbeiten', + 'Add new customer by clicking add' => 'Durch Klick auf "Anlegen" neuen Kunden erstellen', 'Existing customers' => 'Bestehende Kunden', 'Create new customer' => 'Neuen Kunden anlegen', 'New customer' => 'Neuer Kunde', - 'Enter your customer\'s information and email address.' => 'Gib die Informationen und die E-Mail-Adresse des Kunden ein.' + 'Enter your customer\'s information and email address.' => 'Gib die Informationen und die E-Mail-Adresse des Kunden ein.', + 'Invoice Address' => 'Rechnungsadresse', + 'Delivery Address' => 'Versandadresse', + 'Other Address' => 'Sonstige Adresse', + 'Invoice and Delivery Address' => 'Rechnungs- und Versandadresse', + 'Existing addresses' => 'Bestehende Adressen', + 'New address' => 'Neue Adresse', + 'Delete Address' => 'Adresse löschen', + 'Are you sure you want to delete the address?' => 'Sicher, dass die Adresse gelöscht werden soll?', + 'Once the address is deleted, all the ressources and data will be permanently deleted.' => 'Sobald die Adresse gelöscht wird, werden alle Ressourcen und Daten dauerhaft gelöscht.', + 'Enter your customer\'s address.' => 'Gib die Addresse des Kunden ein.', ]; diff --git a/resources/views/components/address-card.blade.php b/resources/views/components/address-card.blade.php new file mode 100644 index 0000000..04b8d53 --- /dev/null +++ b/resources/views/components/address-card.blade.php @@ -0,0 +1,16 @@ +
{{ __('customer.Invoice and Delivery Address') }}
+
{{ __('customer.Invoice Address') }}
+
{{ __('customer.Delivery Address') }}
+
{{ __('customer.Other Address') }}
+
+
+
+
+
+
+
+
diff --git a/resources/views/customer/create.blade.php b/resources/views/customer/create.blade.php new file mode 100644 index 0000000..543edc6 --- /dev/null +++ b/resources/views/customer/create.blade.php @@ -0,0 +1,82 @@ + + +

+ {{ __('customer.Create new customer') }} +

+
+ +
+
+ +
+
+
+
+

+ {{ __('customer.New customer') }} +

+

+ {{ __("customer.Enter your customer's information and email address.") }} +

+
+ +
+

+ +
+ + +
+ +
+ + +
+ +
+ {{ __('form.Save') }} +
+ +
+
+
+
+
+
+ +
+ + + diff --git a/resources/views/customer/edit.blade.php b/resources/views/customer/edit.blade.php new file mode 100644 index 0000000..0517649 --- /dev/null +++ b/resources/views/customer/edit.blade.php @@ -0,0 +1,286 @@ + + +

+ {{ __('customer.Create new customer') }} +

+
+ +
+
+ +
+
+
+
+

+ {{ __('customer.New customer') }} +

+

+ {{ __("customer.Enter your customer's information and email address.") }} +

+
+ +
+ +

+

{{ __('form.Saved') }}

+ +
+ + +
+ +
+ + +
+ +
+ {{ __('form.Save') }} +
+ +
+
+
+
+ + + +
+
+
+
+

+ {{ __('customer.Existing addresses') }} +

+
+
+ +
+
+
+
+ + +
+ +
+
+
+

+ {{ __('customer.New address') }} +

+

+ {{ __("customer.Enter your customer's address.") }} +

+
+ +
+ +

+

{{ __('form.Saved') }}

+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+
+ + +
+
+ + +
+
+ +
+ + + +
+ +
+ + + +
+ +
+ {{ __('form.Save') }} +
+ +
+
+
+
+ + + +
+

+ {{ __('customer.Are you sure you want to delete the address?') }} +

+ +

+ {{ __('customer.Once the address is deleted, all the ressources and data will be permanently deleted.') }} +

+ +
+ + {{ __('form.Cancel') }} + + + + {{ __('customer.Delete Address') }} + +
+
+
+ + +
+
+ +
+ + diff --git a/resources/views/customer/index.blade.php b/resources/views/customer/index.blade.php new file mode 100644 index 0000000..9549fa7 --- /dev/null +++ b/resources/views/customer/index.blade.php @@ -0,0 +1,102 @@ + + +

+ {{ __('customer.Customers') }} +

+
+ +
+
+
+
+
+
+

+ {{ __('customer.Add new customer') }} +

+ +

+ {{ __("customer.Add new customer by clicking add") }} +

+ +
+ {{ __('form.Add') }} +
+
+
+ +
+
+
+
+

+ {{ __('customer.Existing customers') }} +

+
+ + +
Name
+
Email
+
Erstellt am
+
+ + +
+
+
+ +
+
+ +
+ + diff --git a/routes/api.php b/routes/api.php index 80fa779..d8404b3 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,6 +1,8 @@ 'api.'], function () { return $request->user(); }); + Route::apiResource('/customer', CustomerController::class); + Route::apiResource('/customer.address', AddressController::class)->shallow()->except(['update']); }); }); diff --git a/routes/web.php b/routes/web.php index 74bb7ca..cf86889 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,5 +1,6 @@ group(function () { Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit'); Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update'); Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy'); + + Route::resource('/customer', CustomerController::class)->only(['index', 'create', 'edit']); }); require __DIR__.'/auth.php';