diff --git a/.gitignore b/.gitignore
index 8fbf93d..4240ebb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -135,3 +135,6 @@ dmypy.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/.devcontainer/
+
+# tosca_src
+/tosca_src
diff --git a/src/crud.py b/src/crud.py
index 737a63e..638e600 100644
--- a/src/crud.py
+++ b/src/crud.py
@@ -48,6 +48,14 @@ def update_bin_content(db: Session, bin_id: str, content_code: int):
db.refresh(db_bin)
return db_bin
+def get_next_empty_bin(db: Session):
+ """
+ Get the next available empty bin (content_code = 0 or None).
+ """
+ return db.query(models.Bin).filter(
+ (models.Bin.content_code == 0) | (models.Bin.content_code == None)
+ ).first()
+
# --- Port CRUD ---
def get_port(db: Session, port_id: str):
diff --git a/src/main.py b/src/main.py
index af50026..e7af20e 100644
--- a/src/main.py
+++ b/src/main.py
@@ -80,12 +80,17 @@ app = FastAPI(
- Port management (INBOUND, OUTBOUND, OFF modes)
- Task and TaskGroup management
- Background simulation engine
+ - Automatic empty bin allocation for warehouse inbound processes
**XML Commands Supported (case-insensitive):**
- CreateTaskgroup, GetTaskInfo, DeleteTaskgroup, GetNextTask
- - GetBinInfo, OpenBin, CloseBin, SetBinContentCode
+ - GetBinInfo, OpenBin (by Bin ID or Port ID), CloseBin, SetBinContentCode
- SetPortMode
+ **Wareneingang (Inbound) Support:**
+ - OpenBin with Port ID automatically returns next available empty bin
+ - Compatible with PL/SQL packages expecting /response/params/bin_id format
+
**Admin Endpoints:**
- Bin CRUD operations and bulk generation
- Port management
@@ -120,14 +125,14 @@ async def handle_xml_request(request: Request, db: Session = Depends(get_db)):
**Bin Management:**
- GetBinInfo / getbininfo: Get information about a specific bin
- - OpenBin / openbin: Open a bin (logs the action)
+ - OpenBin / openbin: Open a bin by Bin ID OR request next empty bin for a port
- CloseBin / closebin: Close a bin (logs the action)
- SetBinContentCode / setbincontentcode: Set the content code of a bin
**Port Management:**
- SetPortMode / setportmode: Set the mode of a port (INBOUND, OUTBOUND, OFF)
- **Example XML Request for OpenBin (case-insensitive):**
+ **Example XML Request for OpenBin by Bin ID:**
```xml
@@ -136,11 +141,20 @@ async def handle_xml_request(request: Request, db: Session = Depends(get_db)):
```
+ **Example XML Request for OpenBin by Port (gets next empty bin):**
+ ```xml
+
+
+ 1
+
+
+ ```
+
**Alternative (lowercase):**
```xml
- A100000
+ 1
```
@@ -385,29 +399,57 @@ async def handle_xml_request(request: Request, db: Session = Depends(get_db)):
open_bin_data = autostore_data[command_key]
if not open_bin_data or not isinstance(open_bin_data, dict):
- raise HTTPException(status_code=400, detail="Bin ID is required for OpenBin.")
+ raise HTTPException(status_code=400, detail="Port ID or Bin ID is required for OpenBin.")
+ port_id = open_bin_data.get("Port")
bin_id = open_bin_data.get("Bin")
- if not bin_id:
- raise HTTPException(status_code=400, detail="Bin ID is required for OpenBin.")
-
- # Check if bin exists
- bin_obj = crud.get_bin(db, bin_id=bin_id)
- if not bin_obj:
- raise ValueError(f"Bin not found: {bin_id}")
-
- # Log the open bin action
- logger.info(f"OpenBin command received for bin: {bin_id}")
-
- response_dict = {
- "AutoStore": {
- "OpenBin": {
- "Bin": bin_id,
- "Success": True
+ if port_id:
+ # Port-basierter Zugriff: Hole nächste verfügbare Bin für Port
+ logger.info(f"OpenBin command received for port: {port_id}")
+
+ # Prüfe ob Port existiert
+ port = crud.get_port(db, port_id=port_id)
+ if not port:
+ raise ValueError(f"Port not found: {port_id}")
+
+ # Hole nächste verfügbare leere Bin (content_code = 0 oder None)
+ next_bin = crud.get_next_empty_bin(db)
+ if not next_bin:
+ raise ValueError("No empty bins available")
+
+ # TODO: Bin zum Port zuweisen in der Datenbank
+
+ # Antwort im erwarteten Format für PL/SQL
+ response_dict = {
+ "response": {
+ "params": {
+ "bin_id": next_bin.id,
+ "port_id": port_id,
+ "success": True
+ }
}
}
- }
+
+ elif bin_id:
+ # Bin-basierter Zugriff (wie bisher)
+ logger.info(f"OpenBin command received for bin: {bin_id}")
+
+ bin_obj = crud.get_bin(db, bin_id=bin_id)
+ if not bin_obj:
+ raise ValueError(f"Bin not found: {bin_id}")
+
+ response_dict = {
+ "response": {
+ "params": {
+ "bin_id": bin_id,
+ "success": True
+ }
+ }
+ }
+
+ else:
+ raise HTTPException(status_code=400, detail="Either Port ID or Bin ID is required for OpenBin.")
elif command == "closebin":
close_bin_data = autostore_data[command_key]