feat(cli): implement removal logic and cli support, handles different expiry duplicates
This commit is contained in:
parent
33d0c7d073
commit
4e4904cede
|
|
@ -21,7 +21,7 @@ type Inventory struct {
|
|||
|
||||
func (p *Inventory) AddItem(item InventoryItem) {
|
||||
for i, existing := range p.Items {
|
||||
if existing.Name == item.Name {
|
||||
if existing.Name == item.Name && existing.Expiry.Equal(*item.Expiry) {
|
||||
p.Items[i].Quantity += item.Quantity
|
||||
fmt.Printf("Updated %s, new quantity: %.2f %s\n", item.Name, p.Items[i].Quantity, item.Unit)
|
||||
return
|
||||
|
|
@ -31,6 +31,65 @@ func (p *Inventory) AddItem(item InventoryItem) {
|
|||
fmt.Printf("Added %s, quantity: %.2f %s\n", item.Name, item.Quantity, item.Unit)
|
||||
}
|
||||
|
||||
func (p *Inventory) RemoveItem(name string, quantity float64, expiry *time.Time) {
|
||||
for i := 0; i < len(p.Items); {
|
||||
item := p.Items[i]
|
||||
|
||||
itemExpiry := "nil"
|
||||
if item.Expiry != nil {
|
||||
itemExpiry = item.Expiry.Format("2006-01-02")
|
||||
}
|
||||
inputExpiry := "nil"
|
||||
if expiry != nil {
|
||||
inputExpiry = expiry.Format("2006-01-02")
|
||||
}
|
||||
|
||||
fmt.Printf("Checking: item.Name=%s | item.Expiry=%s\n", item.Name, itemExpiry)
|
||||
fmt.Printf("Against: name=%s | expiry=%s\n", name, inputExpiry)
|
||||
|
||||
if item.Name != name {
|
||||
i++
|
||||
continue
|
||||
}
|
||||
|
||||
if expiry != nil {
|
||||
if item.Expiry == nil || item.Expiry.Format("2006-01-02") != expiry.Format("2006-01-02") {
|
||||
i++
|
||||
continue
|
||||
}
|
||||
} else {
|
||||
var bestIndex = i
|
||||
for j := i + 1; j < len(p.Items); j++ {
|
||||
next := p.Items[j]
|
||||
if next.Name != name {
|
||||
continue
|
||||
}
|
||||
if next.Expiry == nil {
|
||||
continue
|
||||
}
|
||||
if item.Expiry == nil || next.Expiry.Before(*item.Expiry) {
|
||||
item = next
|
||||
bestIndex = j
|
||||
}
|
||||
}
|
||||
i = bestIndex
|
||||
}
|
||||
|
||||
if quantity <= 0 || quantity >= item.Quantity {
|
||||
p.Items = append(p.Items[:i], p.Items[i+1:]...)
|
||||
fmt.Printf("Removed all of %s (expiry: %s)\n", item.Name, item.Expiry.Format("2006-01-02"))
|
||||
} else {
|
||||
p.Items[i].Quantity -= quantity
|
||||
fmt.Printf("Removed %.2f %s from %s (expiry: %s)\n", quantity, item.Unit, item.Name, item.Expiry.Format("2006-01-02"))
|
||||
i++
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Printf("Item not found or no matching expiry.\n")
|
||||
}
|
||||
|
||||
func (p *Inventory) ListItems() {
|
||||
if len(p.Items) == 0 {
|
||||
fmt.Printf("Pantry is empty\n")
|
||||
|
|
|
|||
|
|
@ -73,6 +73,35 @@ func main() {
|
|||
return
|
||||
}
|
||||
|
||||
case "remove":
|
||||
if len(os.Args) < 4 {
|
||||
fmt.Println("Usage: inventory remove [name] [quantity] [expiry:YYYY-MM-DD]")
|
||||
return
|
||||
}
|
||||
name := os.Args[2]
|
||||
quantity, err := strconv.ParseFloat(os.Args[3], 64)
|
||||
if err != nil {
|
||||
fmt.Println("Invalid quantity")
|
||||
return
|
||||
}
|
||||
|
||||
var expiry *time.Time
|
||||
if len(os.Args) >= 5 {
|
||||
parsed, err := time.Parse("2006-01-02", os.Args[4])
|
||||
if err != nil {
|
||||
fmt.Println("Invalid expiry date format. Expected YYYY-MM-DD")
|
||||
return
|
||||
}
|
||||
expiry = &parsed
|
||||
}
|
||||
|
||||
inventory.RemoveItem(name, quantity, expiry)
|
||||
|
||||
err = core.SaveInventory(dataFile, inventory)
|
||||
if err != nil {
|
||||
fmt.Println("Failed to save inventory:", err)
|
||||
}
|
||||
|
||||
case "list":
|
||||
inventory.ListItems()
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue