From 7eeeae6a1e52ea5b9e7743bd16a510131af18c9b Mon Sep 17 00:00:00 2001 From: Rodrigo Date: Tue, 17 Sep 2024 21:27:58 -0300 Subject: [PATCH 01/11] Agregar notas a la base de datos --- .../Controllers/Api/SubpedidoController.php | 3 +- app/Producto.php | 2 +- app/Subpedido.php | 7 ++-- .../2024_09_17_234635_notas_producto.php | 34 +++++++++++++++++++ 4 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 database/migrations/2024_09_17_234635_notas_producto.php diff --git a/app/Http/Controllers/Api/SubpedidoController.php b/app/Http/Controllers/Api/SubpedidoController.php index 00c9302..1d375cf 100644 --- a/app/Http/Controllers/Api/SubpedidoController.php +++ b/app/Http/Controllers/Api/SubpedidoController.php @@ -79,6 +79,7 @@ class SubpedidoController extends Controller $valid = request()->validate([ 'cantidad' => 'required|min:0', + 'notas' => 'required', 'producto_id' => [ 'required', Rule::in(Producto::all()->pluck('id')), @@ -86,7 +87,7 @@ class SubpedidoController extends Controller ]); $producto = Producto::find($valid['producto_id']); - $subpedido->syncProducto($producto, $valid['cantidad']); + $subpedido->syncProducto($producto, $valid['cantidad'], $valid['notas']); return new SubpedidoResource($subpedido); } diff --git a/app/Producto.php b/app/Producto.php index d075724..624230e 100644 --- a/app/Producto.php +++ b/app/Producto.php @@ -15,7 +15,7 @@ class Producto extends Model public function subpedidos() { - return $this->belongsToMany('App\Subpedido','productos_subpedidos')->withPivot(["cantidad"]); + return $this->belongsToMany('App\Subpedido','productos_subpedidos')->withPivot(["cantidad", "notas"]); } public function proveedor() diff --git a/app/Subpedido.php b/app/Subpedido.php index 136716f..62eccb1 100644 --- a/app/Subpedido.php +++ b/app/Subpedido.php @@ -15,7 +15,7 @@ class Subpedido extends Model public function productos() { - return $this->belongsToMany('App\Producto')->withPivot(["cantidad","total"]); + return $this->belongsToMany('App\Producto')->withPivot(["cantidad","total", "notas"]); } //Bonos del MPS, Sororo, etc. NO devuelve bonos de transporte @@ -84,13 +84,14 @@ class Subpedido extends Model } //Actualiza el pedido, agregando o quitando del subpedido según sea necesario. Debe ser llamado desde el controlador de subpedidos, luego de validar que los parámetros $producto y $cantidad son correctos. También calcula el subtotal por producto. - public function syncProducto(Producto $producto, Int $cantidad) { + public function syncProducto(Producto $producto, Int $cantidad, string $notas) { if ($cantidad){ //si la cantidad es 1 o más se agrega el producto o actualiza la cantidad $this->productos()->syncWithoutDetaching([ $producto->id => [ 'cantidad' => $cantidad, - 'total' => $cantidad * $producto->precio + 'total' => $cantidad * $producto->precio, + 'notas' => $notas, ] ]); } else { diff --git a/database/migrations/2024_09_17_234635_notas_producto.php b/database/migrations/2024_09_17_234635_notas_producto.php new file mode 100644 index 0000000..8b42c65 --- /dev/null +++ b/database/migrations/2024_09_17_234635_notas_producto.php @@ -0,0 +1,34 @@ +string('notas'); + $table->boolean('requiere-notas'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('producto_subpedido', function (Blueprint $table) { + $table->dropColumn('notas'); + $table->dropColumn('requiere-notas'); + }); + } +} -- 2.44.0 From 82f58620635eb2e0971ce19746d736308d96cb42 Mon Sep 17 00:00:00 2001 From: Rodrigo Date: Tue, 17 Sep 2024 21:28:08 -0300 Subject: [PATCH 02/11] Mostrar notas en pedido --- resources/js/app.js | 9 +++++++-- resources/js/components/ProductoCard.vue | 14 +++++++++----- resources/js/components/ProductosContainer.vue | 5 ++++- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/resources/js/app.js b/resources/js/app.js index 026177f..068e9a6 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -72,6 +72,10 @@ const app = new Vue({ cantidad(producto) { let pedido = this.productos.some(p => p.id == producto.id) return pedido ? this.productos.find(p => p.id == producto.id).pivot.cantidad : 0 + }, + notas(producto) { + let pedido = this.productos.some(p => p.id == producto.id); + return pedido ? this.productos.find(p => p.id == producto.id).pivot.notas : ""; }, settearDevoluciones() { axios.get(`/api/grupos-de-compra/${this.gdc}/devoluciones`) @@ -100,14 +104,15 @@ const app = new Vue({ } }) }) - Event.$on('sync-subpedido', (cantidad, id) => { + Event.$on('sync-subpedido', (cantidad, id, notas) => { if (this.pedido.aprobado) { this.$toast('No se puede modificar un pedido ya aprobado', 2000); return; } axios.post("/api/subpedidos/" + this.pedido.id + "/sync", { cantidad: cantidad, - producto_id: id + producto_id: id, + notas: notas, }).then((response) => { this.pedido = response.data.data this.$toast('Pedido actualizado exitosamente') diff --git a/resources/js/components/ProductoCard.vue b/resources/js/components/ProductoCard.vue index 0790be0..1d5cc0d 100644 --- a/resources/js/components/ProductoCard.vue +++ b/resources/js/components/ProductoCard.vue @@ -8,12 +8,13 @@ export default { return { cantidad: this.producto.cantidad, enChismosa: this.producto.cantidad, + notas: this.producto.notas, } }, mounted() { - Event.$on('sync-subpedido', (cantidad,productoId) => { + Event.$on('sync-subpedido', (cantidad, productoId, notas) => { if (this.producto.id === productoId) - this.sincronizar(cantidad); + this.sincronizar(cantidad, notas); }); }, methods: { @@ -24,19 +25,21 @@ export default { this.cantidad += 1; }, confirmar() { - Event.$emit('sync-subpedido', this.cantidad, this.producto.id); + Event.$emit('sync-subpedido', this.cantidad, this.producto.id, this.notas); }, borrar() { this.cantidad = 0; this.confirmar(); }, - sincronizar(cantidad) { + sincronizar(cantidad, notas) { this.cantidad = cantidad; this.producto.cantidad = cantidad; this.enChismosa = cantidad; + this.notas = notas; + this.producto.notas = notas; }, hayCambios() { - return this.cantidad != this.enChismosa; + return this.cantidad != this.enChismosa || this.notas != this.producto.notas; }, puedeBorrar() { return this.enChismosa > 0; @@ -93,6 +96,7 @@ export default { + Notas:

{{ enChismosa }} en chismosa

diff --git a/resources/js/components/ProductosContainer.vue b/resources/js/components/ProductosContainer.vue index 99c29e4..6c22916 100644 --- a/resources/js/components/ProductosContainer.vue +++ b/resources/js/components/ProductosContainer.vue @@ -37,7 +37,10 @@ export default { params: this.params(filtro,valor) }).then(response => { this.productos = response.data.data; - this.productos.forEach(p => p.cantidad = this.$root.cantidad(p)) + this.productos.forEach(p => { + p.cantidad = this.$root.cantidad(p); + p.notas = this.$root.notas(p); + }); }); this.visible = true; Event.$emit("migas-agregar",this.miga); -- 2.44.0 From 177ba193de4b7e417016e219370a744d7f4de7a8 Mon Sep 17 00:00:00 2001 From: Rodrigo Date: Thu, 19 Sep 2024 20:58:44 -0300 Subject: [PATCH 03/11] Agregado "requiere notas" a productos con 'PTC' --- app/Http/Resources/ProductoResource.php | 3 +- .../2024_09_17_234635_notas_producto.php | 2 -- ...4_09_19_230732_producto_requiere_notas.php | 32 +++++++++++++++++++ database/seeds/CanastaSeeder.php | 3 +- 4 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 database/migrations/2024_09_19_230732_producto_requiere_notas.php diff --git a/app/Http/Resources/ProductoResource.php b/app/Http/Resources/ProductoResource.php index 5177696..4040989 100644 --- a/app/Http/Resources/ProductoResource.php +++ b/app/Http/Resources/ProductoResource.php @@ -25,7 +25,8 @@ class ProductoResource extends JsonResource 'imagen' => optional($this->poster)->url(), 'descripcion' => $this->descripcion, 'apto_veganxs' => $this->apto_veganxs, - 'apto_celiacxs' => $this->apto_celiacxs + 'apto_celiacxs' => $this->apto_celiacxs, + 'requiere_notas' => $this->requiere_notas, ]; } } diff --git a/database/migrations/2024_09_17_234635_notas_producto.php b/database/migrations/2024_09_17_234635_notas_producto.php index 8b42c65..56b6ff4 100644 --- a/database/migrations/2024_09_17_234635_notas_producto.php +++ b/database/migrations/2024_09_17_234635_notas_producto.php @@ -15,7 +15,6 @@ class NotasProducto extends Migration { Schema::table('producto_subpedido', function (Blueprint $table) { $table->string('notas'); - $table->boolean('requiere-notas'); }); } @@ -28,7 +27,6 @@ class NotasProducto extends Migration { Schema::table('producto_subpedido', function (Blueprint $table) { $table->dropColumn('notas'); - $table->dropColumn('requiere-notas'); }); } } diff --git a/database/migrations/2024_09_19_230732_producto_requiere_notas.php b/database/migrations/2024_09_19_230732_producto_requiere_notas.php new file mode 100644 index 0000000..065fff4 --- /dev/null +++ b/database/migrations/2024_09_19_230732_producto_requiere_notas.php @@ -0,0 +1,32 @@ +boolean('requiere_notas')->default(false); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('productos', function (Blueprint $table) { + $table->dropColumn('requiere_notas'); + }); + } +} diff --git a/database/seeds/CanastaSeeder.php b/database/seeds/CanastaSeeder.php index f9a5756..0edc5b5 100644 --- a/database/seeds/CanastaSeeder.php +++ b/database/seeds/CanastaSeeder.php @@ -61,7 +61,8 @@ class CanastaSeeder extends Seeder 'nombre' => trim(str_replace('*', ' ',$registro['Producto'])), 'precio' => $registro['Precio'], 'proveedor_id' => $this->obtenerProveedor($registro['Producto']), - 'bono' => $registro[$this::FILA_HEADER] == "B" + 'bono' => $registro[$this::FILA_HEADER] == "B", + 'requiere_notas'=> $registro[$this::FILA_HEADER] =="PTC", ]; } -- 2.44.0 From 9fc47513c25ad534a68efeded968f7760575de01 Mon Sep 17 00:00:00 2001 From: Rodrigo Date: Thu, 19 Sep 2024 22:31:58 -0300 Subject: [PATCH 04/11] Arreglo para usuarios por defecto --- database/seeds/DatabaseSeeder.php | 1 + database/seeds/GrupoDeCompraSeeder.php | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php index b71ca5a..abc15ac 100644 --- a/database/seeds/DatabaseSeeder.php +++ b/database/seeds/DatabaseSeeder.php @@ -13,5 +13,6 @@ class DatabaseSeeder extends Seeder public function run() { $this->call(CanastaSeeder::class); + $this->call(GrupoDeCompraSeeder::class); } } diff --git a/database/seeds/GrupoDeCompraSeeder.php b/database/seeds/GrupoDeCompraSeeder.php index 89a0982..6c634da 100644 --- a/database/seeds/GrupoDeCompraSeeder.php +++ b/database/seeds/GrupoDeCompraSeeder.php @@ -31,14 +31,14 @@ class GrupoDeCompraSeeder extends Seeder $usersToInsert[] = [ 'name' => $registro['barrio'], - 'password' => Hash::make($registro['barrio']), + 'password' => Hash::make("asd"), "is_admin" => 0, 'grupo_de_compra_id' => $key ]; $usersToInsert[] = [ 'name' => $registro['barrio'] . "_admin", - 'password' => Hash::make($registro['barrio'] . "admin"), + 'password' => Hash::make("asd"), "is_admin" => 1, 'grupo_de_compra_id' => $key ]; -- 2.44.0 From 6d10fbc0bf5bd04ba082b03c2c9ff71042dab993 Mon Sep 17 00:00:00 2001 From: Rodrigo Date: Tue, 8 Oct 2024 20:16:25 -0300 Subject: [PATCH 05/11] Sincronizar notas de producto --- .../Controllers/Api/SubpedidoController.php | 8 +++- .../2024_09_17_234635_notas_producto.php | 2 +- .../components/Producto/ProductoCantidad.vue | 41 +++++++++++-------- .../js/components/ProductosContainer.vue | 5 ++- 4 files changed, 34 insertions(+), 22 deletions(-) diff --git a/app/Http/Controllers/Api/SubpedidoController.php b/app/Http/Controllers/Api/SubpedidoController.php index 1d375cf..7f57cab 100644 --- a/app/Http/Controllers/Api/SubpedidoController.php +++ b/app/Http/Controllers/Api/SubpedidoController.php @@ -79,7 +79,7 @@ class SubpedidoController extends Controller $valid = request()->validate([ 'cantidad' => 'required|min:0', - 'notas' => 'required', + 'notas' => 'nullable', 'producto_id' => [ 'required', Rule::in(Producto::all()->pluck('id')), @@ -87,7 +87,11 @@ class SubpedidoController extends Controller ]); $producto = Producto::find($valid['producto_id']); - $subpedido->syncProducto($producto, $valid['cantidad'], $valid['notas']); + $notas = $valid['notas']; + if ($notas == null) { + $notas = ""; + } + $subpedido->syncProducto($producto, $valid['cantidad'], $notas); return new SubpedidoResource($subpedido); } diff --git a/database/migrations/2024_09_17_234635_notas_producto.php b/database/migrations/2024_09_17_234635_notas_producto.php index 56b6ff4..898db8d 100644 --- a/database/migrations/2024_09_17_234635_notas_producto.php +++ b/database/migrations/2024_09_17_234635_notas_producto.php @@ -14,7 +14,7 @@ class NotasProducto extends Migration public function up() { Schema::table('producto_subpedido', function (Blueprint $table) { - $table->string('notas'); + $table->string('notas')->nullable(); }); } diff --git a/resources/js/components/Producto/ProductoCantidad.vue b/resources/js/components/Producto/ProductoCantidad.vue index 93ec5cd..e141e12 100644 --- a/resources/js/components/Producto/ProductoCantidad.vue +++ b/resources/js/components/Producto/ProductoCantidad.vue @@ -23,6 +23,11 @@ +
+ + +
+
@@ -33,21 +38,23 @@ }, data() { return { - cantidad: this.producto.cantidad, - enChismosa: this.producto.cantidad, + cantidad: this.cantidadEnChismosa(), + notas: this.notasEnChismosa(), } }, mounted() { - if (this.producto.pivot !== undefined) { - this.cantidad = this.producto.pivot.cantidad; - this.enChismosa = this.cantidad; - } - Event.$on('sync-subpedido', (cantidad,productoId) => { - if (this.producto.id === productoId) - this.sincronizar(cantidad); + Event.$on('sync-subpedido', (cantidad, productoId, notas) => { + if (this.producto.id === productoId) + this.sincronizar(cantidad, notas); }); }, methods: { + notasEnChismosa() { + return this.producto.pivot !== undefined ? this.producto.pivot.notas : ""; + }, + cantidadEnChismosa() { + return this.producto.pivot !== undefined ? this.producto.pivot.cantidad : 0; + }, decrementar() { this.cantidad -= 1; }, @@ -55,26 +62,26 @@ this.cantidad += 1; }, confirmar() { - Event.$emit('sync-subpedido', this.cantidad, this.producto.id); + console.log("Emit sync " + this.cantidad + " " + this.notas); + Event.$emit('sync-subpedido', this.cantidad, this.producto.id, this.notas); }, borrar() { this.cantidad = 0; this.confirmar(); }, - sincronizar(cantidad) { + sincronizar(cantidad, notas) { + this.notas = notas; this.cantidad = cantidad; - if (this.producto.pivot != null) { + if (this.producto.pivot !== undefined) { this.producto.pivot.cantidad = cantidad; - } else { - this.producto.cantidad = cantidad; + this.producto.pivot.notas = notas; } - this.enChismosa = cantidad; }, hayCambios() { - return this.cantidad != this.enChismosa; + return this.cantidad != this.cantidadEnChismosa() || this.notas != this.notasEnChismosa(); }, puedeBorrar() { - return this.enChismosa > 0; + return this.cantidadEnChismosa() > 0; }, } } diff --git a/resources/js/components/ProductosContainer.vue b/resources/js/components/ProductosContainer.vue index 3f34f15..5c32f51 100644 --- a/resources/js/components/ProductosContainer.vue +++ b/resources/js/components/ProductosContainer.vue @@ -38,8 +38,9 @@ export default { }).then(response => { this.productos = response.data.data; this.productos.forEach(p => { - p.cantidad = this.$root.cantidad(p); - p.notas = this.$root.notas(p); + p.pivot = {}; + p.pivot.cantidad = this.$root.cantidad(p); + p.pivot.notas = this.$root.notas(p); }); }); this.visible = true; -- 2.44.0 From e31c375867a4169022cba4199456d6c43c64ed40 Mon Sep 17 00:00:00 2001 From: Rodrigo Date: Tue, 8 Oct 2024 20:28:58 -0300 Subject: [PATCH 06/11] Ajuste visual de notas --- .../components/Producto/ProductoCantidad.vue | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/resources/js/components/Producto/ProductoCantidad.vue b/resources/js/components/Producto/ProductoCantidad.vue index e141e12..8a4992b 100644 --- a/resources/js/components/Producto/ProductoCantidad.vue +++ b/resources/js/components/Producto/ProductoCantidad.vue @@ -1,31 +1,32 @@ diff --git a/routes/web.php b/routes/web.php index c2b0ea0..baaa801 100644 --- a/routes/web.php +++ b/routes/web.php @@ -81,4 +81,5 @@ Route::get('/compras', 'ComprasController@show')->name('compras_login.show'); Route::middleware(['compras'])->group( function() { Route::get('/compras/pedidos', 'ComprasController@indexPedidos')->name('compras.pedidos'); Route::get('/compras/pedidos/descargar', 'ComprasController@descargarPedidos')->name('compras.pedidos.descargar'); + Route::get('/compras/pedidos/notas', 'ComprasController@descargarNotas')->name('compras.pedidos.descargar'); }); -- 2.44.0 From be945b0eee99e03274617ffa2041b5bf8e435356 Mon Sep 17 00:00:00 2001 From: Rodrigo Date: Tue, 15 Oct 2024 20:56:37 -0300 Subject: [PATCH 09/11] =?UTF-8?q?Agregu=C3=A9=20las=20notas=20al=20PDF=20p?= =?UTF-8?q?ara=20el=20armado=20del=20barrio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/views/pdfgen/subpedido_tabla.blade.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/resources/views/pdfgen/subpedido_tabla.blade.php b/resources/views/pdfgen/subpedido_tabla.blade.php index 41e1173..981d0ba 100644 --- a/resources/views/pdfgen/subpedido_tabla.blade.php +++ b/resources/views/pdfgen/subpedido_tabla.blade.php @@ -27,9 +27,13 @@ @foreach($subpedido->productos as $producto) @if(!$producto->bono) + {{ $producto->nombre }} + @if($producto->pivot->notas) +
Talle/Color: {{ $producto->pivot->notas }} + @endif {{ $producto->pivot->cantidad }} -- 2.44.0 From 538cc84e109729d6b7aadac2386f495f67ae7529 Mon Sep 17 00:00:00 2001 From: Rodrigo Date: Wed, 16 Oct 2024 21:56:05 -0300 Subject: [PATCH 10/11] =?UTF-8?q?Desactivar=20agregar=20producto=20si=20re?= =?UTF-8?q?quiere=20notas=20y=20est=C3=A1n=20vac=C3=ADas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/pedidos/ProductoCantidad.vue | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/resources/js/components/pedidos/ProductoCantidad.vue b/resources/js/components/pedidos/ProductoCantidad.vue index 7acd421..dbc18e4 100644 --- a/resources/js/components/pedidos/ProductoCantidad.vue +++ b/resources/js/components/pedidos/ProductoCantidad.vue @@ -14,7 +14,7 @@ - -
- +
+ + + + + + + +
+
+ No se puede dejar este campo vacío +
+
-
@@ -86,6 +96,13 @@ puedeBorrar() { return this.cantidadEnChismosa() > 0; }, + warningNotas() { + return this.producto.requiere_notas && this.cantidad > 0 && !this.notas; + }, + disableConfirm() { + if (!this.hayCambios() || this.warningNotas()) return true; + return false; + }, } } @@ -107,4 +124,12 @@ .contador { min-width: 178px; } + + .is-danger { + background-color: #fca697; + } + .is-danger::placeholder { + color: #fff; + opacity: 1; /* Firefox */ + } \ No newline at end of file -- 2.44.0 From 3ad9500f23a895495d8aba3acfe87ecce93f33c2 Mon Sep 17 00:00:00 2001 From: Rodrigo Date: Wed, 16 Oct 2024 22:32:16 -0300 Subject: [PATCH 11/11] =?UTF-8?q?Alerta=20de=20notas=20sale=20s=C3=B3lo=20?= =?UTF-8?q?despu=C3=A9s=20de=20intentar=20de=20confirmar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../js/components/pedidos/ProductoCantidad.vue | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/resources/js/components/pedidos/ProductoCantidad.vue b/resources/js/components/pedidos/ProductoCantidad.vue index dbc18e4..49d5799 100644 --- a/resources/js/components/pedidos/ProductoCantidad.vue +++ b/resources/js/components/pedidos/ProductoCantidad.vue @@ -25,15 +25,15 @@ -
+
- - + + -
+
No se puede dejar este campo vacío
@@ -51,6 +51,7 @@ return { cantidad: this.cantidadEnChismosa(), notas: this.notasEnChismosa(), + notas_warning_visible: false, } }, mounted() { @@ -73,6 +74,10 @@ this.cantidad += 1; }, confirmar() { + if (this.warningNotas()) { + this.notas_warning_visible = true; + return; + } console.log("Emit sync " + this.cantidad + " " + this.notas); Event.$emit('sync-subpedido', this.cantidad, this.producto.id, this.notas); }, @@ -81,6 +86,7 @@ this.confirmar(); }, sincronizar(cantidad, notas) { + this.notas_warning_visible = false; this.notas = notas; this.cantidad = cantidad; if (this.producto.pivot !== undefined) { @@ -100,8 +106,7 @@ return this.producto.requiere_notas && this.cantidad > 0 && !this.notas; }, disableConfirm() { - if (!this.hayCambios() || this.warningNotas()) return true; - return false; + return !this.hayCambios(); }, } } -- 2.44.0