Anpassung mit Lager-Location
All checks were successful
release-tag / release-image (push) Successful in 2m6s

This commit is contained in:
2026-05-29 11:12:07 +02:00
parent ba1019728d
commit 72a12ff960
3 changed files with 30 additions and 3 deletions

View File

@@ -21,4 +21,4 @@ DISCORD_ADMIN_ROLE_IDS=123456789012345678,234567890123456789 # 15098193051880039
# Comma-separated role IDs. Team role can see internal orders, accept/decline, check warehouse.
DISCORD_TEAM_ROLE_IDS=345678901234567890 # 1509819434330755233
DATABASE_PATH=orders.db
DATABASE_PATH=/data/orders.db

View File

@@ -114,6 +114,14 @@ Fügt Bestand hinzu oder setzt ihn absolut.
/lager_add ware:Gold qualitaet:900 menge:100 einheit:SCU ort:Orison modus:setzen
```
`ort` ist der interne Lagerort. Er wird nur in Team-/Admin-Ausgaben, der internen Lagerprüfung und im Auditlog angezeigt. Öffentliche Auftragsposts und Endnutzer-DMs enthalten keine Lagerorte.
Das Auditlog zeigt Bestandsänderungen mit altem und neuem Wert, z. B.:
```text
Lager geändert durch b1tk1ll3r: P4-AR Q725 Stück @ Baijini Point: 0 → 2
```
### `/lager_remove`
Reduziert Bestand. Der Bot verhindert negative Bestände.
@@ -122,6 +130,8 @@ Reduziert Bestand. Der Bot verhindert negative Bestände.
/lager_remove ware:Gold qualitaet:900 menge:10 einheit:SCU ort:Orison
```
Auch hier bezieht sich `ort` auf genau diese Lagerposition. Wird kein Ort angegeben, wird der Bestand ohne Lagerort geführt.
### `/lager_liste`
Zeigt interne Lagerbestände ephemeral an.

View File

@@ -23,7 +23,7 @@ func NewBot(cfg Config, store *Store) (*Bot, error) {
if err != nil {
return nil, err
}
dg.Identify.Intents = discordgo.IntentsGuilds | discordgo.IntentsGuildMessages | discordgo.IntentsGuildMembers | discordgo.IntentsDirectMessages
dg.Identify.Intents = discordgo.IntentsGuilds | discordgo.IntentsDirectMessages
b := &Bot{cfg: cfg, store: store, dg: dg}
dg.AddHandler(b.onReady)
dg.AddHandler(b.onInteraction)
@@ -358,12 +358,29 @@ func (b *Bot) cmdInventoryAdd(s *discordgo.Session, i *discordgo.InteractionCrea
b.replyEphemeral(s, i, "Ware darf nicht leer sein.")
return
}
oldAmount := 0.0
if existing, err := b.store.GetInventoryByKey(normalizeName(item.Name), item.Quality, item.QuantityUnit, item.Location); err == nil {
oldAmount = existing.QuantityAmount
} else if !errors.Is(err, sql.ErrNoRows) {
b.replyEphemeral(s, i, "Lager konnte vor Änderung nicht gelesen werden: "+err.Error())
return
}
updated, err := b.store.UpsertInventory(item, mode != "set" || remove)
if err != nil {
b.replyEphemeral(s, i, "Lager konnte nicht aktualisiert werden: "+err.Error())
return
}
b.audit(fmt.Sprintf("Lager geändert durch %s: %s Q%d = %s %s @ %s", userString(i), updated.Name, updated.Quality, formatAmount(updated.QuantityAmount), updated.QuantityUnit, updated.Location))
b.audit(fmt.Sprintf(
"Lager geändert durch %s: %s Q%d %s%s: %s → %s",
userString(i),
updated.Name,
updated.Quality,
updated.QuantityUnit,
locationSuffix(updated.Location),
formatAmount(oldAmount),
formatAmount(updated.QuantityAmount),
))
b.replyEphemeral(s, i, fmt.Sprintf("Lager aktualisiert: %s Q%d — %s %s%s", updated.Name, updated.Quality, formatAmount(updated.QuantityAmount), updated.QuantityUnit, locationSuffix(updated.Location)))
}