diff --git a/app/controllers/items_controller.rb b/app/controllers/items_controller.rb
index ac9c618..98241e8 100644
--- a/app/controllers/items_controller.rb
+++ b/app/controllers/items_controller.rb
@@ -27,16 +27,23 @@ class ItemsController < ApplicationController
# GET /items/new
def new
@item = Item.new
+ # Falls wir uns im Turbo-Frame befinden, rendern wir nur das Formular-Teilstück
+ render partial: "form", locals: { item: @item } if turbo_frame_request?
end
# GET /items/1/edit
def edit
+ # @item wird bereits über vorab gesetztes set_item geladen
+ render partial: "form", locals: { item: @item } if turbo_frame_request?
end
# POST /items or /items.json
def create
@item = Item.new(item_params)
+ # Text-Eingaben in echte IDs auflösen
+ resolve_assignment_names
+
respond_to do |format|
if @item.save
format.html { redirect_to @item, notice: "Artikel '#{@item.name}' wurde erfolgreich im System registriert." }
@@ -50,8 +57,13 @@ class ItemsController < ApplicationController
# PATCH/PUT /items/1 or /items/1.json
def update
+ @item.assign_attributes(item_params)
+
+ # Text-Eingaben in echte IDs auflösen
+ resolve_assignment_names
+
respond_to do |format|
- if @item.update(item_params)
+ if @item.save
format.html { redirect_to @item, notice: "Artikel '#{@item.name} wurde erfolgreich aktualisiert.", status: :see_other }
format.json { render :show, status: :ok, location: @item }
else
@@ -73,22 +85,37 @@ class ItemsController < ApplicationController
private
- def set_item
- @item = Item.find(params.expect(:id))
- end
+ def set_item
+ @item = Item.find(params.expect(:id))
+ end
- # Strong Parameters: Schützt vor Mass-Assignment-Injections
- def item_params
- params.require(:item).permit(
- :name,
- :sku,
- :sticker_id,
- :serial_number,
- :price,
- :notes,
- :category_id,
- :user_id, # Für die flexible Zuweisung an Mitarbeiter
- :room_id # Für die flexible Zuweisung an Räume
- )
+ # Sucht anhand des eingetippten Namens den passenden Datenbank-Eintrag
+ def resolve_assignment_names
+ if params[:item][:user_name].present?
+ # Wir splitten den Namen in Vor- und Nachname auf
+ parts = params[:item][:user_name].split(" ")
+ user = User.find_by(first_name: parts[0], last_name: parts[1])
+
+ if user
+ @item.user_id = user.id
+ @item.room_id = nil # Sicherstellen, dass der Raum geleert wird
+ else
+ @item.errors.add(:base, "Der eingegebene Mitarbeiter existiert nicht im System.")
+ end
+ elsif params[:item][:room_name].present?
+ room = Room.find_by(name: params[:item][:room_name])
+
+ if room
+ @item.room_id = room.id
+ @item.user_id = nil # Sicherstellen, dass der User geleert wird
+ else
+ @item.errors.add(:base, "Der eingegebene Raum existiert nicht im System.")
+ end
end
+ end
+
+ def item_params
+ # 'user_name' und 'room_name' müssen in die Strong Parameters aufgenommen werden!
+ params.require(:item).permit(:name, :sku, :sticker_id, :serial_number, :price, :notes, :category_id, :user_id, :room_id, :user_name, :room_name)
+ end
end
diff --git a/app/models/item.rb b/app/models/item.rb
index c0e7a96..09c6909 100644
--- a/app/models/item.rb
+++ b/app/models/item.rb
@@ -2,6 +2,10 @@ require "rqrcode"
require "csv"
class Item < ApplicationRecord
+ # NEU: Erlaubt es Rails, diese Formularfelder temporär im Speicher zu halten,
+ # ohne dass dafür Spalten in der Datenbank existieren müssen.
+ attr_accessor :user_name, :room_name
+
belongs_to :category
belongs_to :user, optional: true # Optional, falls im Raum oder Lager
belongs_to :room, optional: true # Optional, falls beim User oder Lager
@@ -76,15 +80,19 @@ class Item < ApplicationRecord
end
def track_assignment_changes
- # 1. Altes Log-Buch schließen, falls es eine vorherige Zuweisung gab
- if user_id_was.present? || room_id_was.present?
- last_log = assignment_logs.find_by(user_id: user_id_was, room_id: room_id_was, returned_at: nil)
- last_log&.update(returned_at: Time.current)
- end
+ # 1. Altes Log-Buch schließen (Egal ob es bei einem User oder in einem Raum war)
+ # Wir suchen nach dem Log, das noch kein Rückgabedatum hat (returned_at: nil)
+ active_log = assignment_logs.find_by(returned_at: nil)
+ active_log&.update(returned_at: Time.current)
- # 2. Neues Log-Buch öffnen für den neuen Inhaber oder den neuen Raum
+ # 2. Neues Log-Buch öffnen
if user_id.present? || room_id.present?
+ # Zustand A: Zuweisung an Mitarbeiter oder Raum
assignment_logs.build(user_id: user_id, room_id: room_id, assigned_at: Time.current)
+ else
+ # Zustand B: Weder User noch Raum hinterlegt -> Das Gerät wandert ins Hauptlager!
+ # Wir lassen user_id und room_id auf nil, was im Logbuch "Hauptlager" bedeutet
+ assignment_logs.build(assigned_at: Time.current)
end
end
end
diff --git a/app/views/items/_form.html.erb b/app/views/items/_form.html.erb
index 8968858..af902c3 100644
--- a/app/views/items/_form.html.erb
+++ b/app/views/items/_form.html.erb
@@ -1,22 +1,3 @@
-
-
<%= form_with(model: item, class: "space-y-6 max-w-2xl mx-auto bg-white border border-gray-200 rounded-xl shadow-sm p-6 md:p-8") do |form| %>
<% if item.errors.any? %>
@@ -30,16 +11,14 @@
<% end %>
-
- <%= item.new_record? ? "Trage hier die Unikat-Daten wie Seriennummer und Sticker-ID ein." : "Aktualisiere die Daten oder verändere den aktuellen Standort des Geräts." %>
-
+ <%= item.new_record? ? "Trage hier die Unikat-Daten wie Seriennummer und Sticker-ID ein." : "Aktualisiere die Daten oder verändere den aktuellen Standort des Geräts." %>
+