Rework de la tabla de bonos y cambios en total de tabla de pedidos
This commit is contained in:
parent
4acc2b0605
commit
ea6596a5b4
|
@ -69,16 +69,16 @@ class GrupoDeCompra extends Model
|
||||||
throw new Exception('No hay bono de transporte');
|
throw new Exception('No hay bono de transporte');
|
||||||
}
|
}
|
||||||
|
|
||||||
private function totalPedidoSinBDT() {
|
private function totalPedidosSinBonos() {
|
||||||
$total = 0;
|
$total = 0;
|
||||||
foreach ($this->subpedidos as $subpedido) {
|
foreach ($this->pedidosAprobados() as $pedido) {
|
||||||
$total += $subpedido->totalSinBDT();
|
$total += ceil($pedido->totalSinBonos());
|
||||||
}
|
}
|
||||||
return $total;
|
return $total;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function calcularCantidadBDT() {
|
public function calcularCantidadBDT() {
|
||||||
return ceil($this->totalPedidoSinBDT() / 500);
|
return ceil($this->totalPedidosSinBonos() / 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function exportarPedidoEnCSV(){
|
public function exportarPedidoEnCSV(){
|
||||||
|
|
|
@ -17,7 +17,7 @@ class SubpedidoResource extends JsonResource
|
||||||
return [
|
return [
|
||||||
'id' => $this->id,
|
'id' => $this->id,
|
||||||
'nombre' => $this->nombre,
|
'nombre' => $this->nombre,
|
||||||
'subtotal_productos' => number_format($this->totalSinBDT(),0),
|
'subtotal_productos' => number_format($this->totalSinBonos(),0),
|
||||||
'subtotal_bonos' => number_format($this->getSubtotalBonos(),0),
|
'subtotal_bonos' => number_format($this->getSubtotalBonos(),0),
|
||||||
'bonos_de_transporte' => $this->cantidadBDT(),
|
'bonos_de_transporte' => $this->cantidadBDT(),
|
||||||
'subtotal_bonos_de_transporte' => number_format($this->getSubtotalBDT(),0),
|
'subtotal_bonos_de_transporte' => number_format($this->getSubtotalBDT(),0),
|
||||||
|
|
|
@ -41,7 +41,7 @@ class Subpedido extends Model
|
||||||
}
|
}
|
||||||
|
|
||||||
//Subtotal de dinero de productos del pedido, sin bonos ni transporte
|
//Subtotal de dinero de productos del pedido, sin bonos ni transporte
|
||||||
public function totalSinBDT()
|
public function totalSinBonos()
|
||||||
{
|
{
|
||||||
return $this->productosSinBonos()->sum('total');
|
return $this->productosSinBonos()->sum('total');
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ class Subpedido extends Model
|
||||||
//Cantidad de bonos de transporte
|
//Cantidad de bonos de transporte
|
||||||
public function cantidadBDT()
|
public function cantidadBDT()
|
||||||
{
|
{
|
||||||
return ceil($this->totalSinBDT() / 500);
|
return ceil($this->totalSinBonos() / 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Subtotal de dinero de bonos de transporte
|
//Subtotal de dinero de bonos de transporte
|
||||||
|
@ -66,7 +66,7 @@ class Subpedido extends Model
|
||||||
|
|
||||||
public function getTotal()
|
public function getTotal()
|
||||||
{
|
{
|
||||||
return $this->totalSinBDT() + $this->getSubtotalBDT() + $this->getSubtotalBonos();
|
return $this->totalSinBonos() + $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.
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"axios": "^0.19.2",
|
"axios": "^0.19.2",
|
||||||
"bootstrap": "^4.0.0",
|
"bootstrap": "^4.0.0",
|
||||||
"cross-env": "^7.0",
|
"cross-env": "^7.0.3",
|
||||||
"jquery": "^3.2",
|
"jquery": "^3.2",
|
||||||
"laravel-mix": "^5.0.1",
|
"laravel-mix": "^5.0.1",
|
||||||
"lodash": "^4.17.19",
|
"lodash": "^4.17.19",
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
:gdc="gdc">
|
:gdc="gdc">
|
||||||
</pedidos-admin-dropdown-descargar>
|
</pedidos-admin-dropdown-descargar>
|
||||||
<pedidos-admin-tabla-pedidos
|
<pedidos-admin-tabla-pedidos
|
||||||
:pedidos="pedidos">
|
:pedidos="pedidos" :bonosDeTransporte="bonosDeTransporte">
|
||||||
</pedidos-admin-tabla-pedidos>
|
</pedidos-admin-tabla-pedidos>
|
||||||
</div>
|
</div>
|
||||||
<p class="has-text-centered" v-show="!hayPedidos">
|
<p class="has-text-centered" v-show="!hayPedidos">
|
||||||
|
@ -44,6 +44,7 @@ export default {
|
||||||
return {
|
return {
|
||||||
gdc: 0,
|
gdc: 0,
|
||||||
pedidos: [],
|
pedidos: [],
|
||||||
|
bonosDeTransporte: 0,
|
||||||
tabActiva: "pedidos",
|
tabActiva: "pedidos",
|
||||||
seccionActiva: "pedidos-seccion"
|
seccionActiva: "pedidos-seccion"
|
||||||
}
|
}
|
||||||
|
@ -58,21 +59,15 @@ export default {
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
fetchPedidos() {
|
fetchPedidos() {
|
||||||
|
axios.get("/api/grupos-de-compra/"+this.gdc+"/bonos-de-transporte", {})
|
||||||
|
.then(response => this.bonosDeTransporte = response.data.bdt);
|
||||||
axios.get("/api/subpedidos/resources", {
|
axios.get("/api/subpedidos/resources", {
|
||||||
params: {
|
params: {
|
||||||
grupo_de_compra: this.gdc
|
grupo_de_compra: this.gdc
|
||||||
}})
|
}})
|
||||||
.then(response => {
|
.then(response => {
|
||||||
this.pedidos = response.data.data
|
this.pedidos = response.data.data
|
||||||
});
|
}).get;
|
||||||
},
|
|
||||||
totalAprobados() {
|
|
||||||
let suma = 0;
|
|
||||||
let aprobados = this.pedidos.filter(p => p.aprobado);
|
|
||||||
for (let i = 0; i < aprobados.length; i++) {
|
|
||||||
suma += parseFloat(aprobados[i].total.replace(/,/g, ''));
|
|
||||||
}
|
|
||||||
return suma;
|
|
||||||
},
|
},
|
||||||
setSeccionActiva(tabId) {
|
setSeccionActiva(tabId) {
|
||||||
this.tabActiva = tabId;
|
this.tabActiva = tabId;
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
<template>
|
|
||||||
<tr>
|
|
||||||
<td>{{ nombre }}</td>
|
|
||||||
<td>{{ cantidad }}</td>
|
|
||||||
<td>${{ total }}</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: "PedidosAdminFilaBono",
|
|
||||||
props: {
|
|
||||||
nombre: String,
|
|
||||||
cantidad: Number,
|
|
||||||
total: Number
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
|
|
||||||
</style>
|
|
|
@ -5,119 +5,91 @@
|
||||||
Todavía no hay bonos pedidos.
|
Todavía no hay bonos pedidos.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="block">
|
<div class="block" v-show="hayBonos">
|
||||||
<table class="table is-fullwidth is-striped is-bordered">
|
<table class="table is-bordered is-striped is-hoverable is-fullwidth">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th><abbr title="Bono">Bono</abbr></th>
|
<th><abbr title="Núcleo">Núcleo</abbr></th>
|
||||||
<th class="is-1"><abbr title="Cantidad">Cantidad</abbr></th>
|
<td v-for="(bono,i) in bonos" :key="i" class="is-1">
|
||||||
|
{{ bono.nombre }}
|
||||||
|
</td>
|
||||||
<th><abbr title="Total a Pagar">Total $</abbr></th>
|
<th><abbr title="Total a Pagar">Total $</abbr></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr v-for="(bp, i) in bonosPorPedido" :key="i">
|
||||||
|
<td> {{ bp.nucleo }} </td>
|
||||||
|
<td v-for="(bono,j) in bp.bonos" :key="j">
|
||||||
|
{{ bono.cantidad }}
|
||||||
|
</td>
|
||||||
|
<td> {{ bp.total }} </td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
<tfoot>
|
<tfoot>
|
||||||
<tr v-show="hayBonos">
|
<tr>
|
||||||
<th></th>
|
<th></th>
|
||||||
<th>Total bonos</th>
|
<th :colspan="bonos.length">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">
|
|
||||||
<pedidos-admin-fila-bono v-for="(bono, i) in bonosCantidadesTotales" :key="i"
|
|
||||||
:nombre="bono.nombre"
|
|
||||||
:cantidad="bono.cantidad"
|
|
||||||
:total="bono.total">
|
|
||||||
</pedidos-admin-fila-bono>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import PedidosAdminFilaBonoVue from './PedidosAdminFilaBono.vue'
|
|
||||||
export default {
|
export default {
|
||||||
name: "PedidosAdminTablaBonos",
|
name: "PedidosAdminTablaBonos",
|
||||||
components: {
|
|
||||||
PedidosAdminFilaBonoVue
|
|
||||||
},
|
|
||||||
props: {
|
props: {
|
||||||
pedidos: {
|
pedidos: {
|
||||||
type: Array,
|
type: Array,
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
data() {
|
||||||
hayPedidos: function() {
|
return {
|
||||||
return this.pedidos.length !== 0
|
bonos: []
|
||||||
},
|
|
||||||
hayAprobados: function() {
|
|
||||||
return this.pedidosAprobados.length > 0
|
|
||||||
},
|
|
||||||
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 = [];
|
|
||||||
let precios = [];
|
|
||||||
|
|
||||||
let bonosAprobadosPorPedido = this.bonosPorPedido(this.pedidosAprobados);
|
|
||||||
bonosAprobadosPorPedido.forEach(bs => {
|
|
||||||
bs.forEach(b => {
|
|
||||||
if (!nombres.includes(b.nombre)) {
|
|
||||||
nombres.push(b.nombre);
|
|
||||||
cantidades.push(b.pivot.cantidad);
|
|
||||||
precios.push(b.precio);
|
|
||||||
} else {
|
|
||||||
for (let i = 0; i < nombres.length; i++) {
|
|
||||||
if (b.nombre === nombres[i]) {
|
|
||||||
cantidades[i] += b.pivot.cantidad;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
let bonosAprobados = [];
|
|
||||||
for (let i = 0; i < nombres.length; i++) {
|
|
||||||
let bono = {
|
|
||||||
nombre: nombres[i],
|
|
||||||
cantidad: cantidades[i],
|
|
||||||
total: cantidades[i] * precios[i]
|
|
||||||
};
|
|
||||||
bonosAprobados.push(bono);
|
|
||||||
}
|
|
||||||
|
|
||||||
return bonosAprobados;
|
|
||||||
},
|
|
||||||
totalBonos: function() {
|
|
||||||
let total = 0;
|
|
||||||
let bonos = this.bonosCantidadesTotales;
|
|
||||||
bonos.forEach(b => {
|
|
||||||
total += b.total;
|
|
||||||
});
|
|
||||||
return total;
|
|
||||||
},
|
|
||||||
hayBonos: function() {
|
|
||||||
return this.totalBonos !== 0;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
pedidosAprobados: function() {
|
||||||
|
return this.pedidos.filter(p => p.aprobado)
|
||||||
|
},
|
||||||
|
hayBonos: function() {
|
||||||
|
return this.pedidosAprobados.filter(p => p.subtotal_bonos != 0).length !== 0
|
||||||
|
},
|
||||||
|
bonosPorPedido: function() {
|
||||||
|
let bonosPorPedido = this.pedidosAprobados.map(p => p = {"nucleo":p.nombre, "bonos":p.productos.filter(x => x.bono), "total":p.subtotal_bonos});
|
||||||
|
bonosPorPedido.forEach(bp => {
|
||||||
|
bp.bonos = bp.bonos.map(b => b = {"bono":b.nombre, "cantidad":b.pivot.cantidad, "total":b.pivot.total, "id":b.id})
|
||||||
|
})
|
||||||
|
return bonosPorPedido.map(bp => this.completarBonos(bp));
|
||||||
|
},
|
||||||
|
totalBonos: function() {
|
||||||
|
let total = 0
|
||||||
|
this.bonosPorPedido.map(bp => total += parseInt(bp.total))
|
||||||
|
return total
|
||||||
|
},
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
bonosPorPedido(pedidosArray) {
|
completarBonos(bonosPedido) {
|
||||||
return pedidosArray.map(p => p.productos.filter(pr => pr.bono))
|
this.bonos.map(b => {
|
||||||
|
if (!bonosPedido.bonos.map(x => x.id).includes(b.id))
|
||||||
|
bonosPedido.bonos.push({"bono":b.nombre, "cantidad":0, "total":0, "id":b.id})
|
||||||
|
})
|
||||||
|
bonosPedido.bonos = bonosPedido.bonos.sort((b1,b2) => b1.id - b2.id)
|
||||||
|
return bonosPedido
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
beforeMount() {
|
||||||
|
axios.get("../api/productos", {
|
||||||
|
params: {
|
||||||
|
categoria:'TRANSPORTE, BONOS Y FINANCIAMIENTO SORORO',
|
||||||
|
}
|
||||||
|
}).then(response => {
|
||||||
|
this.bonos = response.data.data;
|
||||||
|
});
|
||||||
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -33,18 +33,24 @@ export default {
|
||||||
pedidos: {
|
pedidos: {
|
||||||
type: Array,
|
type: Array,
|
||||||
required: true
|
required: true
|
||||||
}
|
},
|
||||||
|
bonosDeTransporte: {
|
||||||
|
type: Number,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
totalAprobados() {
|
totalAprobados() {
|
||||||
let suma = 0;
|
let suma = 0;
|
||||||
let aprobados = this.pedidos.filter(p => p.aprobado);
|
let aprobados = this.pedidos.filter(p => p.aprobado);
|
||||||
for (let i = 0; i < aprobados.length; i++) {
|
for (let i = 0; i < aprobados.length; i++) {
|
||||||
suma += parseFloat(aprobados[i].total.replace(/,/g, ''));
|
suma += parseFloat(aprobados[i].subtotal_bonos.replace(/,/g, ''));
|
||||||
|
suma += parseFloat(aprobados[i].subtotal_productos.replace(/,/g, ''));
|
||||||
}
|
}
|
||||||
|
suma += parseInt(this.bonosDeTransporte)*15
|
||||||
return suma;
|
return suma;
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use App\Filtros\FiltroDeProducto;
|
||||||
|
use App\Filtros\FiltroDeSubpedido;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
use App\GrupoDeCompra;
|
use App\GrupoDeCompra;
|
||||||
|
@ -26,6 +28,10 @@ Route::middleware('api')->group(function () {
|
||||||
$atributos_a_ocultar = ['telefono', 'cantidad_de_nucleos', 'correo', 'referente_finanzas', 'created_at', 'updated_at'];
|
$atributos_a_ocultar = ['telefono', 'cantidad_de_nucleos', 'correo', 'referente_finanzas', 'created_at', 'updated_at'];
|
||||||
return GrupoDeCompra::all()->makeHidden($atributos_a_ocultar)->sortBy('nombre')->groupBy('region');
|
return GrupoDeCompra::all()->makeHidden($atributos_a_ocultar)->sortBy('nombre')->groupBy('region');
|
||||||
});
|
});
|
||||||
|
Route::get('/{gdc}/bonos-de-transporte', function($gdc) {
|
||||||
|
$grupo = GrupoDeCompra::where('id',$gdc)->first();
|
||||||
|
return ['bdt' => $grupo->calcularCantidadBDT()];
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
Route::prefix('pedidos')->group(function () {
|
Route::prefix('pedidos')->group(function () {
|
||||||
|
|
Loading…
Reference in New Issue