Lo que hicimos la vez pasada

This commit is contained in:
Ale 2022-12-02 18:44:29 -03:00
parent bb122c5e39
commit f6fa4f9523
11 changed files with 146 additions and 201 deletions

View File

@ -17,6 +17,12 @@ class GrupoDeCompra extends Model
protected $table = 'grupos_de_compra'; protected $table = 'grupos_de_compra';
protected $hidden = ['password']; 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() { public function subpedidos() {
return $this->hasMany('App\Subpedido'); return $this->hasMany('App\Subpedido');
} }

View File

@ -16,14 +16,12 @@ class SubpedidoResource extends JsonResource
{ {
return [ return [
'id' => $this->id, '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, 'grupo_de_compra' => $this->grupoDeCompra,
'nombre' => $this->nombre,
'productos' => $this->productos, '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 'aprobado' => (bool) $this->aprobado
]; ];
} }

View File

@ -13,25 +13,47 @@ class Subpedido extends Model
public $timestamps = false; public $timestamps = false;
protected $fillable = ['grupo_de_compra_id', 'aprobado', 'nombre']; protected $fillable = ['grupo_de_compra_id', 'aprobado', 'nombre'];
public function grupoDeCompra()
{
return $this->belongsTo('App\GrupoDeCompra');
}
public function productos() public function productos()
{ {
return $this->belongsToMany('App\Producto')->withPivot(["cantidad","total"]); return $this->belongsToMany('App\Producto')->withPivot(["cantidad","total"]);
} }
//Bonos del MPS, Sororo, etc. NO devuelve bonos de transporte private function subtotalSinBDT()
private function bonos()
{ {
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) //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); 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. //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) {
if ($cantidad){ if ($cantidad){

View File

@ -42,4 +42,10 @@ class User extends Authenticatable
{ {
return $this->belongsTo('App\GrupoDeCompra'); 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');
}
} }

View File

@ -0,0 +1,50 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class Productos extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('productos', function (Blueprint $table) {
$table->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');
}
}

View File

@ -61,7 +61,8 @@ class ImportarProductoSeeder extends Seeder
'nombre' => trim(str_replace('*', ' ',$registro['Producto'])), 'nombre' => trim(str_replace('*', ' ',$registro['Producto'])),
'precio' => $registro['Precio'], 'precio' => $registro['Precio'],
'proveedor_id' => $this->obtenerProveedor($registro['Producto']), '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')
]; ];
} }

View File

@ -1,40 +0,0 @@
<?php
use Illuminate\Database\Seeder;
use League\Csv\Reader;
use App\Proveedor;
class ProductoSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$csv = Reader::createFromPath(resource_path('csv/productos.csv'), 'r');
$csv->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);
}
}
}

84
public/js/app.js vendored
View File

@ -2809,11 +2809,6 @@ __webpack_require__.r(__webpack_exports__);
// //
// //
// //
//
//
//
//
//
/* harmony default export */ __webpack_exports__["default"] = ({ /* harmony default export */ __webpack_exports__["default"] = ({
name: "PedidosAdminTablaBonos", name: "PedidosAdminTablaBonos",
@ -2838,16 +2833,6 @@ __webpack_require__.r(__webpack_exports__);
return p.aprobado; 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() { bonosCantidadesTotales: function bonosCantidadesTotales() {
var nombres = []; var nombres = [];
var cantidades = []; var cantidades = [];
@ -5152,7 +5137,9 @@ var render = function () {
_c("tr", [ _c("tr", [
_vm._m(1), _vm._m(1),
_vm._v(" "), _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(" "), _vm._v(" "),
_c("th", [ _c("th", [
_vm._v(_vm._s(this.subpedido.subtotal_bonos_de_transporte)), _vm._v(_vm._s(this.subpedido.subtotal_bonos_de_transporte)),
@ -5987,82 +5974,34 @@ var render = function () {
var _h = _vm.$createElement var _h = _vm.$createElement
var _c = _vm._self._c || _h var _c = _vm._self._c || _h
return _c("div", { staticClass: "block" }, [ return _c("div", { staticClass: "block" }, [
_c( !_vm.hayBonos
"div", ? _c("div", { staticClass: "block" }, [
{
directives: [
{
name: "show",
rawName: "v-show",
value: !_vm.hayBonos,
expression: "!hayBonos",
},
],
staticClass: "block",
},
[
_c("p", { staticClass: "has-text-centered" }, [ _c("p", { staticClass: "has-text-centered" }, [
_vm._v("\n Todavía no hay bonos pedidos.\n "), _vm._v("\n Todavía no hay bonos pedidos.\n "),
]), ]),
] ])
), : _vm._e(),
_vm._v(" "), _vm._v(" "),
_c("div", { staticClass: "block" }, [ _c("div", { staticClass: "block" }, [
_c( _vm.hayBonos
? _c(
"table", "table",
{ staticClass: "table is-fullwidth is-striped is-bordered" }, { staticClass: "table is-fullwidth is-striped is-bordered" },
[ [
_vm._m(0), _vm._m(0),
_vm._v(" "), _vm._v(" "),
_c("tfoot", [ _c("tfoot", [
_c( _c("tr", [
"tr",
{
directives: [
{
name: "show",
rawName: "v-show",
value: _vm.hayBonos,
expression: "hayBonos",
},
],
},
[
_c("th"), _c("th"),
_vm._v(" "), _vm._v(" "),
_c("th", [_vm._v("Total bonos")]), _c("th", [_vm._v("Total bonos")]),
_vm._v(" "), _vm._v(" "),
_c("th", [_vm._v("$ " + _vm._s(_vm.totalBonos))]), _c("th", [_vm._v("$ " + _vm._s(_vm.totalBonos))]),
]
),
_vm._v(" "),
_c("tr", [
_c("td", [_vm._v(" Bonos de Transporte ")]),
_vm._v(" "),
_c("td", [
_vm._v(" " + _vm._s(_vm.bonosDeTransporteAprobados) + " "),
]),
_vm._v(" "),
_c("td", [
_vm._v(
" $ " + _vm._s(_vm.bonosDeTransporteAprobados * 15) + " "
),
]),
]), ]),
]), ]),
_vm._v(" "), _vm._v(" "),
_c( _c(
"tbody", "tbody",
{
directives: [
{
name: "show",
rawName: "v-show",
value: _vm.hayBonos,
expression: "hayBonos",
},
],
},
_vm._l(_vm.bonosCantidadesTotales, function (bono, i) { _vm._l(_vm.bonosCantidadesTotales, function (bono, i) {
return _c("pedidos-admin-fila-bono", { return _c("pedidos-admin-fila-bono", {
key: i, key: i,
@ -6076,7 +6015,8 @@ var render = function () {
1 1
), ),
] ]
), )
: _vm._e(),
]), ]),
]) ])
} }

View File

@ -1,4 +1,6 @@
barrio|region|referente|telefono|correo barrio|region|referente|telefono|correo
ENTREVERO|SUR||| ENTREVERO|SUR|||
TRES CRUCES|SUR||| TRES CRUCES|SUR|||
PANADERIA VIDAL|SUR|||
UNION|NORTE|||
PRUEBA|SIN REGION||| PRUEBA|SIN REGION|||
1 barrio region referente telefono correo
2 ENTREVERO SUR
3 TRES CRUCES SUR
4 PANADERIA VIDAL SUR
5 UNION NORTE
6 PRUEBA SIN REGION

View File

@ -13,7 +13,7 @@
<tfoot> <tfoot>
<tr> <tr>
<th><abbr title="Bonos de Transporte">B. Transporte</abbr></th> <th><abbr title="Bonos de Transporte">B. Transporte</abbr></th>
<th>{{ this.subpedido.bonos_de_transporte }}</th> <th>{{ this.subpedido.cantidad_bonos_de_transporte }}</th>
<th>{{ this.subpedido.subtotal_bonos_de_transporte }}</th> <th>{{ this.subpedido.subtotal_bonos_de_transporte }}</th>
<th></th> <th></th>
<th></th> <th></th>

View File

@ -1,12 +1,12 @@
<template> <template>
<div class="block"> <div class="block">
<div class="block" v-show="!hayBonos"> <div class="block" v-if="!hayBonos">
<p class="has-text-centered"> <p class="has-text-centered">
Todavía no hay bonos pedidos. Todavía no hay bonos pedidos.
</p> </p>
</div> </div>
<div class="block"> <div class="block">
<table class="table is-fullwidth is-striped is-bordered"> <table class="table is-fullwidth is-striped is-bordered" v-if="hayBonos">
<thead> <thead>
<tr> <tr>
<th><abbr title="Bono">Bono</abbr></th> <th><abbr title="Bono">Bono</abbr></th>
@ -15,18 +15,13 @@
</tr> </tr>
</thead> </thead>
<tfoot> <tfoot>
<tr v-show="hayBonos"> <tr>
<th></th> <th></th>
<th>Total bonos</th> <th>Total bonos</th>
<th>$ {{ totalBonos }}</th> <th>$ {{ totalBonos }}</th>
</tr> </tr>
<tr>
<td> Bonos de Transporte </td>
<td> {{ bonosDeTransporteAprobados }} </td>
<td> $ {{ bonosDeTransporteAprobados * 15 }} </td>
</tr>
</tfoot> </tfoot>
<tbody v-show="hayBonos"> <tbody>
<pedidos-admin-fila-bono v-for="(bono, i) in bonosCantidadesTotales" :key="i" <pedidos-admin-fila-bono v-for="(bono, i) in bonosCantidadesTotales" :key="i"
:nombre="bono.nombre" :nombre="bono.nombre"
:cantidad="bono.cantidad" :cantidad="bono.cantidad"
@ -61,12 +56,6 @@ export default {
pedidosAprobados: function() { pedidosAprobados: function() {
return this.pedidos.filter(p => p.aprobado); return this.pedidos.filter(p => p.aprobado);
}, },
bonosDeTransporteAprobados: function() {
let bonosTransportePorPedido = this.pedidosAprobados.map(p => p.bonos_de_transporte);
let cant = 0;
bonosTransportePorPedido.forEach(bt => cant += bt);
return cant
},
bonosCantidadesTotales: function() { bonosCantidadesTotales: function() {
let nombres = []; let nombres = [];
let cantidades = []; let cantidades = [];