-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
219 lines (192 loc) · 6.27 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
/*
@autor: Jorge Pérez Rodríguez
@fecha: 05/12/2024
@descripcion: registro y listado de productos con menú interactivo, métodos encapsulados y manejo de errores.
*/
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
// estructura producto: representa un producto del inventario (componente principal)
type Producto struct {
ID int
Nombre string
Precio float64
Stock int
CategoriaID string
}
// metodo para actualizar el stock de un producto
func (prod *Producto) ActualizarStock(cantidad int) {
if cantidad < 0 {
fmt.Println("error: la cantidad no puede ser negativa.")
return
}
prod.Stock += cantidad
fmt.Printf("stock actualizado a %d unidades.\n", prod.Stock)
}
// estructura para gestionar el inventario de productos (componente principal)
type Inventario struct {
Productos []Producto
}
// metodo para agregar un nuevo producto al inventario
func (inv *Inventario) AgregarProducto(producto Producto) {
inv.Productos = append(inv.Productos, producto)
fmt.Println("producto registrado con exito:")
fmt.Printf("id: %d, nombre: %s, precio: %.2f, stock: %d, categoria: %s\n", producto.ID, producto.Nombre, producto.Precio, producto.Stock, producto.CategoriaID)
}
// metodo para buscar un producto por id
func (inv *Inventario) BuscarProductoPorID(id int) *Producto {
for i, producto := range inv.Productos {
if producto.ID == id {
return &inv.Productos[i]
}
}
return nil
}
// metodo para eliminar un producto por id
func (inv *Inventario) EliminarProducto(id int) {
for i, producto := range inv.Productos {
if producto.ID == id {
inv.Productos = append(inv.Productos[:i], inv.Productos[i+1:]...)
fmt.Println("producto eliminado con exito.")
return
}
}
fmt.Println("error: producto no encontrado.")
}
// metodo para mostrar el menu de opciones
func MostrarMenu() {
fmt.Println("\n................. Menu .................")
fmt.Println("1. Registrar un nuevo producto")
fmt.Println("2. Buscar un producto por id")
fmt.Println("3. Actualizar informacion de un producto")
fmt.Println("4. Actualizar stock de un producto")
fmt.Println("5. Eliminar un producto")
fmt.Println("6. Salir")
}
// funcion para leer entradas del usuario
func LeerEntrada(prompt string) string {
reader := bufio.NewReader(os.Stdin)
fmt.Print(prompt)
entrada, _ := reader.ReadString('\n')
return strings.TrimSpace(entrada)
}
// funcion principal
func main() {
inventario := Inventario{}
idActual := 1 // contador para asignar ids unicos
for {
MostrarMenu()
opcionStr := LeerEntrada("seleccione una opcion: ")
opcion, err := strconv.Atoi(opcionStr)
if err != nil {
fmt.Println("error: opcion invalida.")
continue
}
switch opcion {
case 1: // registrar un nuevo producto
nombre := LeerEntrada("ingrese el nombre del producto: ")
precioStr := LeerEntrada("ingrese el precio del producto: ")
precio, err := strconv.ParseFloat(precioStr, 64)
if err != nil {
fmt.Println("error: el precio debe ser un numero.")
continue
}
stockStr := LeerEntrada("ingrese el stock del producto: ")
stock, err := strconv.Atoi(stockStr)
if err != nil {
fmt.Println("error: el stock debe ser un numero entero.")
continue
}
categoria := LeerEntrada("ingrese la categoria del producto: ")
producto := Producto{
ID: idActual,
Nombre: nombre,
Precio: precio,
Stock: stock,
CategoriaID: categoria,
}
inventario.AgregarProducto(producto)
idActual++
case 2: // buscar un producto por id
idStr := LeerEntrada("ingrese el id del producto: ")
id, err := strconv.Atoi(idStr)
if err != nil {
fmt.Println("error: el id debe ser un numero entero.")
continue
}
producto := inventario.BuscarProductoPorID(id)
if producto != nil {
fmt.Printf("producto encontrado: id: %d, nombre: %s, precio: %.2f, stock: %d, categoria: %s\n", producto.ID, producto.Nombre, producto.Precio, producto.Stock, producto.CategoriaID)
} else {
fmt.Println("error: producto no encontrado.")
}
case 3: // actualizar informacion de un producto
idStr := LeerEntrada("ingrese el id del producto a actualizar: ")
id, err := strconv.Atoi(idStr)
if err != nil {
fmt.Println("error: el id debe ser un numero entero.")
continue
}
producto := inventario.BuscarProductoPorID(id)
if producto != nil {
producto.Nombre = LeerEntrada("ingrese el nuevo nombre del producto: ")
precioStr := LeerEntrada("ingrese el nuevo precio del producto: ")
precio, err := strconv.ParseFloat(precioStr, 64)
if err != nil {
fmt.Println("error: el precio debe ser un numero.")
continue
}
producto.Precio = precio
stockStr := LeerEntrada("ingrese el nuevo stock del producto: ")
stock, err := strconv.Atoi(stockStr)
if err != nil {
fmt.Println("error: el stock debe ser un numero entero.")
continue
}
producto.Stock = stock
producto.CategoriaID = LeerEntrada("ingrese la nueva categoria del producto: ")
fmt.Println("producto actualizado con exito:")
fmt.Printf("id: %d, nombre: %s, precio: %.2f, stock: %d, categoria: %s\n", producto.ID, producto.Nombre, producto.Precio, producto.Stock, producto.CategoriaID)
} else {
fmt.Println("error: producto no encontrado.")
}
case 4: // actualizar stock de un producto
idStr := LeerEntrada("ingrese el id del producto para actualizar el stock: ")
id, err := strconv.Atoi(idStr)
if err != nil {
fmt.Println("error: el id debe ser un numero entero.")
continue
}
producto := inventario.BuscarProductoPorID(id)
if producto != nil {
cantidadStr := LeerEntrada("ingrese la cantidad para actualizar el stock: ")
cantidad, err := strconv.Atoi(cantidadStr)
if err != nil {
fmt.Println("error: la cantidad debe ser un numero entero.")
continue
}
producto.ActualizarStock(cantidad)
} else {
fmt.Println("error: producto no encontrado.")
}
case 5: // eliminar un producto
idStr := LeerEntrada("ingrese el id del producto a eliminar: ")
id, err := strconv.Atoi(idStr)
if err != nil {
fmt.Println("error: el id debe ser un numero entero.")
continue
}
inventario.EliminarProducto(id)
case 6: // salir
fmt.Println("saliendo del sistema...")
return
default:
fmt.Println("error: opcion no valida.")
}
}
}