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) {
|
func (p *Inventory) AddItem(item InventoryItem) {
|
||||||
for i, existing := range p.Items {
|
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
|
p.Items[i].Quantity += item.Quantity
|
||||||
fmt.Printf("Updated %s, new quantity: %.2f %s\n", item.Name, p.Items[i].Quantity, item.Unit)
|
fmt.Printf("Updated %s, new quantity: %.2f %s\n", item.Name, p.Items[i].Quantity, item.Unit)
|
||||||
return
|
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)
|
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() {
|
func (p *Inventory) ListItems() {
|
||||||
if len(p.Items) == 0 {
|
if len(p.Items) == 0 {
|
||||||
fmt.Printf("Pantry is empty\n")
|
fmt.Printf("Pantry is empty\n")
|
||||||
|
|
|
||||||
|
|
@ -73,6 +73,35 @@ func main() {
|
||||||
return
|
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":
|
case "list":
|
||||||
inventory.ListItems()
|
inventory.ListItems()
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue