diff --git a/app/GrupoDeCompra.php b/app/GrupoDeCompra.php index 39e8376..3e960c2 100644 --- a/app/GrupoDeCompra.php +++ b/app/GrupoDeCompra.php @@ -17,6 +17,12 @@ class GrupoDeCompra extends Model protected $table = 'grupos_de_compra'; protected $hidden = ['password']; + // devuelve una colección con los productos que este grupo de compra puede comprar + public function productos() + { + return $this->belongsToMany('App\Producto'); + } + public function subpedidos() { return $this->hasMany('App\Subpedido'); } @@ -77,7 +83,7 @@ class GrupoDeCompra extends Model return $total; } - private function calcularCantidadBDT() { + private function calcularCantidadBDT() { return ceil($this->totalPedidoSinBDT() / 500); } diff --git a/app/Http/Resources/SubpedidoResource.php b/app/Http/Resources/SubpedidoResource.php index 6567ee0..45e111d 100644 --- a/app/Http/Resources/SubpedidoResource.php +++ b/app/Http/Resources/SubpedidoResource.php @@ -16,14 +16,12 @@ class SubpedidoResource extends JsonResource { return [ 'id' => $this->id, - 'nombre' => $this->nombre, - 'subtotal_productos' => number_format($this->totalSinBDT(),0), - 'subtotal_bonos' => number_format($this->getSubtotalBonos(),0), - 'bonos_de_transporte' => $this->cantidadBDT(), - 'subtotal_bonos_de_transporte' => number_format($this->getSubtotalBDT(),0), - 'total' => number_format($this->getTotal(),0), 'grupo_de_compra' => $this->grupoDeCompra, + 'nombre' => $this->nombre, 'productos' => $this->productos, + 'cantidad_bonos_de_transporte' => $this->cantidadBDT(), + 'subtotal_bonos_de_transporte' => number_format($this->subtotalBDT(),0), + 'total' => number_format($this->getTotal(),0), 'aprobado' => (bool) $this->aprobado ]; } diff --git a/app/Subpedido.php b/app/Subpedido.php index ea9d779..0c39544 100644 --- a/app/Subpedido.php +++ b/app/Subpedido.php @@ -13,25 +13,47 @@ class Subpedido extends Model public $timestamps = false; protected $fillable = ['grupo_de_compra_id', 'aprobado', 'nombre']; + public function grupoDeCompra() + { + return $this->belongsTo('App\GrupoDeCompra'); + } + public function productos() { return $this->belongsToMany('App\Producto')->withPivot(["cantidad","total"]); } - //Bonos del MPS, Sororo, etc. NO devuelve bonos de transporte - private function bonos() + private function subtotalSinBDT() { - return $this->productos()->where('bono',1); + return $this->productos()->sum('total'); } - public function productosSinBonos() + private function productosQuePaganBDT() { - return $this->productos()->where('bono',false); + return $this->productos()->where('paga_bono_de_transporte', true); } - public function grupoDeCompra() + //Subtotal de dinero de productos del pedido, sin bonos ni transporte + private function subtotalProductosQuePaganBDT() { - return $this->belongsTo('App\GrupoDeCompra'); + return $this->productosQuePaganBDT()->sum('total'); + } + + //Cantidad de bonos de transporte + public function cantidadBDT() + { + return ceil($this->subtotalProductosQuePaganBDT() / 500); + } + + //Subtotal de dinero de bonos de transporte + public function subtotalBDT() + { + return $this->cantidadBDT() * 15; + } + + public function getTotal() + { + return $this->subtotalSinBDT() + $this->subtotalBDT(); } //Permite que se apliquen los filtros al hacer una request (por ejemplo, de búsqueda) @@ -40,35 +62,6 @@ class Subpedido extends Model return $filtros->aplicar($query); } - //Subtotal de dinero de productos del pedido, sin bonos ni transporte - public function totalSinBDT() - { - return $this->productosSinBonos()->sum('total'); - } - - //Cantidad de bonos de transporte - public function cantidadBDT() - { - return ceil($this->totalSinBDT() / 500); - } - - //Subtotal de dinero de bonos de transporte - public function getSubtotalBDT() - { - return $this->cantidadBDT() * 15; - } - - //Subtotal de dinero de bonos (MPS, Sororo, etc) - public function getSubtotalBonos() - { - return $this->bonos()->sum('total'); - } - - public function getTotal() - { - return $this->totalSinBDT() + $this->getSubtotalBDT() + $this->getSubtotalBonos(); - } - //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) { if ($cantidad){ diff --git a/app/User.php b/app/User.php index 9d9c786..cb8f67f 100644 --- a/app/User.php +++ b/app/User.php @@ -42,4 +42,10 @@ class User extends Authenticatable { return $this->belongsTo('App\GrupoDeCompra'); } + + // devuelve una colección con los productos que este usario puede editar + public function productosGestionados() + { + return $this->belongsToMany('App\Producto'); + } } diff --git a/database/migrations/2022_11_25_234913_productos.php b/database/migrations/2022_11_25_234913_productos.php new file mode 100644 index 0000000..96089e3 --- /dev/null +++ b/database/migrations/2022_11_25_234913_productos.php @@ -0,0 +1,50 @@ +boolean('paga_bono_de_transporte')->after('bono')->default(true); + }); + + Schema::create('grupo_de_compra_producto', function (Blueprint $table) { + $table->id(); + $table->foreignId('grupo_de_compra_id'); + $table->foreignId('producto_id'); + $table->timestamps(); + }); + + Schema::create('producto_user', function (Blueprint $table) { + $table->id(); + $table->foreignId('user_id'); + $table->foreignId('producto_id'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('productos', function (Blueprint $table) { + $table->dropColumn('paga_bono_de_transporte'); + }); + + Schema::dropIfExists('producto_user'); + + Schema::dropIfExists('grupo_de_compra_producto'); + } +} diff --git a/database/seeds/ImportarProductoSeeder.php b/database/seeds/ImportarProductoSeeder.php index 43c9e84..f21126b 100644 --- a/database/seeds/ImportarProductoSeeder.php +++ b/database/seeds/ImportarProductoSeeder.php @@ -61,7 +61,8 @@ class ImportarProductoSeeder extends Seeder 'nombre' => trim(str_replace('*', ' ',$registro['Producto'])), 'precio' => $registro['Precio'], 'proveedor_id' => $this->obtenerProveedor($registro['Producto']), - 'bono' => ($categoria == 'TRANSPORTE, BONOS Y FINANCIAMIENTO SORORO') + 'bono' => ($categoria == 'TRANSPORTE, BONOS Y FINANCIAMIENTO SORORO'), + 'paga_bono_de_transporte' => !($categoria == 'TRANSPORTE, BONOS Y FINANCIAMIENTO SORORO' || $categoria == 'PRODUCTOS DE GESTIÓN MENSTRUAL') ]; } diff --git a/database/seeds/ProductoSeeder.php b/database/seeds/ProductoSeeder.php deleted file mode 100644 index 95cab3e..0000000 --- a/database/seeds/ProductoSeeder.php +++ /dev/null @@ -1,40 +0,0 @@ -setDelimiter("|"); - $csv->setEnclosure("'"); - $csv->setHeaderOffset(0); - $registros = $csv->getRecords(); - $toInsert = []; - - foreach($registros as $registro){ - $toInsert[] = [ - 'categoria' => $registro['categoria'], - 'nombre' => $registro['producto'], - 'precio' => $registro['precio'], - 'proveedor_id' => isset($registro['proveedor']) ? Proveedor::firstOrCreate([ - 'nombre' => $registro['proveedor'] - ])->id : null, - 'bono' => $registro['categoria'] == 'BONOS Y FINANCIAMIENTO SORORO' - ]; - } - - foreach (array_chunk($toInsert,DatabaseSeeder::CHUNK_SIZE) as $chunk) - { - DB::table('productos')->insert($chunk); - } - } -} diff --git a/public/js/app.js b/public/js/app.js index 94a6f43..1efedb4 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -2809,11 +2809,6 @@ __webpack_require__.r(__webpack_exports__); // // // -// -// -// -// -// /* harmony default export */ __webpack_exports__["default"] = ({ name: "PedidosAdminTablaBonos", @@ -2838,16 +2833,6 @@ __webpack_require__.r(__webpack_exports__); return p.aprobado; }); }, - bonosDeTransporteAprobados: function bonosDeTransporteAprobados() { - var bonosTransportePorPedido = this.pedidosAprobados.map(function (p) { - return p.bonos_de_transporte; - }); - var cant = 0; - bonosTransportePorPedido.forEach(function (bt) { - return cant += bt; - }); - return cant; - }, bonosCantidadesTotales: function bonosCantidadesTotales() { var nombres = []; var cantidades = []; @@ -5152,7 +5137,9 @@ var render = function () { _c("tr", [ _vm._m(1), _vm._v(" "), - _c("th", [_vm._v(_vm._s(this.subpedido.bonos_de_transporte))]), + _c("th", [ + _vm._v(_vm._s(this.subpedido.cantidad_bonos_de_transporte)), + ]), _vm._v(" "), _c("th", [ _vm._v(_vm._s(this.subpedido.subtotal_bonos_de_transporte)), @@ -5987,96 +5974,49 @@ var render = function () { var _h = _vm.$createElement var _c = _vm._self._c || _h return _c("div", { staticClass: "block" }, [ - _c( - "div", - { - directives: [ - { - name: "show", - rawName: "v-show", - value: !_vm.hayBonos, - expression: "!hayBonos", - }, - ], - staticClass: "block", - }, - [ - _c("p", { staticClass: "has-text-centered" }, [ - _vm._v("\n Todavía no hay bonos pedidos.\n "), - ]), - ] - ), + !_vm.hayBonos + ? _c("div", { staticClass: "block" }, [ + _c("p", { staticClass: "has-text-centered" }, [ + _vm._v("\n Todavía no hay bonos pedidos.\n "), + ]), + ]) + : _vm._e(), _vm._v(" "), _c("div", { staticClass: "block" }, [ - _c( - "table", - { staticClass: "table is-fullwidth is-striped is-bordered" }, - [ - _vm._m(0), - _vm._v(" "), - _c("tfoot", [ - _c( - "tr", - { - directives: [ - { - name: "show", - rawName: "v-show", - value: _vm.hayBonos, - expression: "hayBonos", - }, - ], - }, - [ - _c("th"), - _vm._v(" "), - _c("th", [_vm._v("Total bonos")]), - _vm._v(" "), - _c("th", [_vm._v("$ " + _vm._s(_vm.totalBonos))]), - ] - ), - _vm._v(" "), - _c("tr", [ - _c("td", [_vm._v(" Bonos de Transporte ")]), + _vm.hayBonos + ? _c( + "table", + { staticClass: "table is-fullwidth is-striped is-bordered" }, + [ + _vm._m(0), _vm._v(" "), - _c("td", [ - _vm._v(" " + _vm._s(_vm.bonosDeTransporteAprobados) + " "), + _c("tfoot", [ + _c("tr", [ + _c("th"), + _vm._v(" "), + _c("th", [_vm._v("Total bonos")]), + _vm._v(" "), + _c("th", [_vm._v("$ " + _vm._s(_vm.totalBonos))]), + ]), ]), _vm._v(" "), - _c("td", [ - _vm._v( - " $ " + _vm._s(_vm.bonosDeTransporteAprobados * 15) + " " - ), - ]), - ]), - ]), - _vm._v(" "), - _c( - "tbody", - { - directives: [ - { - name: "show", - rawName: "v-show", - value: _vm.hayBonos, - expression: "hayBonos", - }, - ], - }, - _vm._l(_vm.bonosCantidadesTotales, function (bono, i) { - return _c("pedidos-admin-fila-bono", { - key: i, - attrs: { - nombre: bono.nombre, - cantidad: bono.cantidad, - total: bono.total, - }, - }) - }), - 1 - ), - ] - ), + _c( + "tbody", + _vm._l(_vm.bonosCantidadesTotales, function (bono, i) { + return _c("pedidos-admin-fila-bono", { + key: i, + attrs: { + nombre: bono.nombre, + cantidad: bono.cantidad, + total: bono.total, + }, + }) + }), + 1 + ), + ] + ) + : _vm._e(), ]), ]) } diff --git a/resources/csv/barrios.csv b/resources/csv/barrios.csv index 781c8d7..204d37a 100644 --- a/resources/csv/barrios.csv +++ b/resources/csv/barrios.csv @@ -1,4 +1,6 @@ barrio|region|referente|telefono|correo ENTREVERO|SUR||| TRES CRUCES|SUR||| +PANADERIA VIDAL|SUR||| +UNION|NORTE||| PRUEBA|SIN REGION||| \ No newline at end of file diff --git a/resources/js/components/Chismosa.vue b/resources/js/components/Chismosa.vue index aa6ebe1..c99c282 100644 --- a/resources/js/components/Chismosa.vue +++ b/resources/js/components/Chismosa.vue @@ -13,7 +13,7 @@ B. Transporte - {{ this.subpedido.bonos_de_transporte }} + {{ this.subpedido.cantidad_bonos_de_transporte }} {{ this.subpedido.subtotal_bonos_de_transporte }} diff --git a/resources/js/components/PedidosAdminTablaBonos.vue b/resources/js/components/PedidosAdminTablaBonos.vue index 98b6b96..3568ff8 100644 --- a/resources/js/components/PedidosAdminTablaBonos.vue +++ b/resources/js/components/PedidosAdminTablaBonos.vue @@ -1,12 +1,12 @@