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 $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);
}

View File

@ -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
];
}

View File

@ -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){

View File

@ -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');
}
}

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'])),
'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')
];
}

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);
}
}
}

142
public/js/app.js vendored
View File

@ -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(),
]),
])
}

View File

@ -1,4 +1,6 @@
barrio|region|referente|telefono|correo
ENTREVERO|SUR|||
TRES CRUCES|SUR|||
PANADERIA VIDAL|SUR|||
UNION|NORTE|||
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>
<tr>
<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></th>
<th></th>

View File

@ -1,12 +1,12 @@
<template>
<div class="block">
<div class="block" v-show="!hayBonos">
<div class="block" v-if="!hayBonos">
<p class="has-text-centered">
Todavía no hay bonos pedidos.
</p>
</div>
<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>
<tr>
<th><abbr title="Bono">Bono</abbr></th>
@ -15,18 +15,13 @@
</tr>
</thead>
<tfoot>
<tr v-show="hayBonos">
<tr>
<th></th>
<th>Total bonos</th>
<th>$ {{ totalBonos }}</th>
</tr>
<tr>
<td> Bonos de Transporte </td>
<td> {{ bonosDeTransporteAprobados }} </td>
<td> $ {{ bonosDeTransporteAprobados * 15 }} </td>
</tr>
</tfoot>
<tbody v-show="hayBonos">
<tbody>
<pedidos-admin-fila-bono v-for="(bono, i) in bonosCantidadesTotales" :key="i"
:nombre="bono.nombre"
:cantidad="bono.cantidad"
@ -61,12 +56,6 @@ export default {
pedidosAprobados: function() {
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() {
let nombres = [];
let cantidades = [];