Compare commits

...

4 commits

7 changed files with 171 additions and 22 deletions

View file

@ -16,6 +16,28 @@ class GrupoDeCompra extends Model
protected $table = 'grupos_de_compra';
protected $hidden = ['password'];
public function faltantes()
{
return Subpedido::firstOrCreate([
'nombre' => 'Faltantes de ' . $this->nombre,
'grupo_de_compra_id' => $this->id
],
[
'es_faltantes' => true
])->id;
}
public function sobrantes()
{
return Subpedido::firstOrCreate([
'nombre' => 'Sobrantes de ' . $this->nombre,
'grupo_de_compra_id' => $this->id
],
[
'es_sobrantes' => true
])->id;
}
public function toggleDevoluciones()
{
$this->devoluciones_habilitadas = !$this->devoluciones_habilitadas;

View file

@ -11,7 +11,7 @@ use App\Filtros\FiltroDeSubpedido;
class Subpedido extends Model
{
public $timestamps = false;
protected $fillable = ['grupo_de_compra_id', 'aprobado', 'nombre', 'devoluciones_total', 'devoluciones_notas'];
protected $fillable = ['grupo_de_compra_id', 'aprobado', 'nombre', 'devoluciones_total', 'devoluciones_notas', 'es_faltantes', 'es_sobrantes'];
public function productos()
{

View file

@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class PedidosFaltantesYSobrantes extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('subpedidos', function (Blueprint $table) {
$table->boolean('es_faltantes')->default(false);
$table->boolean('es_sobrantes')->default(false);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('subpedidos', function (Blueprint $table) {
$table->dropColumn('es_faltantes');
$table->dropColumn('es_sobrantes');
});
}
}

View file

@ -1,33 +1,28 @@
<template>
<div class="block ml-3 mr-3 is-max-widescreen is-max-desktop">
<comunes-tabs-secciones :tabs="tabs" :tabInicial="tabActiva"></comunes-tabs-secciones>
<tabs-secciones :tabs="tabs" :tabInicial="tabActiva"></tabs-secciones>
<div class="block" id="pedidos-seccion"
:class="seccionActiva === 'pedidos-seccion' ? 'is-active' : 'is-hidden'">
<div class="block pb-6" id="pedidos-tabla-y-dropdown" v-show="hayPedidos">
<admin-dropdown-descargar
<dropdown-descargar
:gdc="gdc">
</admin-dropdown-descargar>
<admin-tabla-pedidos
</dropdown-descargar>
<tabla-pedidos
:pedidos="pedidos" :bonosDeTransporte="bonosDeTransporte" :totalBonosBarriales="totalBonosBarriales">
</admin-tabla-pedidos>
</tabla-pedidos>
</div>
<p class="has-text-centered" v-show="!hayPedidos">
Todavía no hay ningún pedido para administrar.
</p>
</div>
<div class="block pb-6" id="bonos-seccion"
:class="seccionActiva === 'bonos-seccion' ? 'is-active' : 'is-hidden'">
<admin-tabla-bonos v-show="hayAprobados"
:pedidos="pedidos">
</admin-tabla-bonos>
<p class="has-text-centered" v-show="!hayAprobados">
Todavía no hay pedidos aprobados.
</p>
<div class="block pb-6" id="faltantes-y-sobrantes-seccion"
:class="seccionActiva === 'faltantes-y-sobrantes-seccion' ? 'is-active' : 'is-hidden'">
<faltantes-y-sobrantes></faltantes-y-sobrantes>
</div>
<div class="block pb-6" id="caracteristicas-seccion"
:class="seccionActiva === 'caracteristicas-seccion' ? 'is-active' : 'is-hidden'">
<admin-caracteristicas-opcionales>
</admin-caracteristicas-opcionales>
<caracteristicas-opcionales>
</caracteristicas-opcionales>
</div>
</div>
</template>
@ -37,14 +32,14 @@ import CaracteristicasOpcionales from "./CaracteristicasOpcionales.vue";
import TabsSecciones from "../comunes/TabsSecciones.vue";
import DropdownDescargar from "./DropdownDescargar.vue";
import TablaPedidos from "./TablaPedidos.vue";
import TablaBonos from "./TablaBonos.vue";
import FaltantesYSobrantes from "./FaltantesYSobrantes.vue";
export default {
components: {
CaracteristicasOpcionales,
TabsSecciones,
DropdownDescargar,
TablaPedidos,
TablaBonos,
FaltantesYSobrantes,
},
data() {
return {
@ -53,7 +48,7 @@ export default {
bonosDeTransporte: 0,
totalBonosBarriales: 0,
tabs: [{ id: "pedidos", nombre: "Pedidos" },
{ id: "bonos", nombre: "Bonos" },
{ id: "faltantes-y-sobrantes", nombre: "Faltantes y Sobrantes" },
{ id: "caracteristicas", nombre: "Caracteristicas opcionales" }],
tabActiva: "pedidos",
seccionActiva: "pedidos-seccion",

View file

@ -0,0 +1,79 @@
<template>
<div class="columns is-mobile is-centered">
<div class="column is-half">
<div class="block">
<tabs-secciones
:tabs="tabs"
:tabInicial="tabActiva"
:clases="['is-centered', 'is-fullwidth']">
</tabs-secciones>
<div class="block pb-6" id="faltantes-seccion"
:class="seccionActiva === 'faltantes-seccion' ? 'is-active' : 'is-hidden'">
<p>{{faltantes ?? 'nada aún'}}</p>
</div>
<div class="block pb-6" id="sobrantes-seccion"
:class="seccionActiva === 'sobrantes-seccion' ? 'is-active' : 'is-hidden'">
<p>{{sobrantes ?? 'nada aún'}}</p>
</div>
</div>
</div>
</div>
</template>
<script>
import axios from "axios";
import TabsSecciones from "../comunes/TabsSecciones.vue";
import Chismosa from "../pedidos/Chismosa.vue";
export default {
name: "FaltantesYSobrantes",
components: {
TabsSecciones,
Chismosa,
},
data() {
return {
gdc: undefined,
tabs: [{ id: "faltantes", nombre: "Faltantes" },
{ id: "sobrantes", nombre: "Sobrantes" }],
tabActiva: "faltantes",
seccionActiva: "faltantes-seccion",
faltantes: undefined,
sobrantes: undefined,
};
},
watch: {
'$root.gdc' : {
handler(newValue) {
if (newValue) {
this.gdc = newValue;
this.actualizarFaltantes();
this.actualizarSobrantes();
}
}
},
},
methods: {
setSeccionActiva(tabId) {
this.tabActiva = tabId;
this.seccionActiva = tabId + "-seccion";
},
actualizarFaltantes() {
axios.get(`/api/grupos-de-compra/${this.gdc}/faltantes`)
.then(response => {
this.faltantes = response.data['faltantes'];
})
},
actualizarSobrantes() {
axios.get(`/api/grupos-de-compra/${this.gdc}/sobrantes`)
.then(response => {
this.sobrantes = response.data['sobrantes'];
})
},
}
}
</script>
<style scoped>
</style>

View file

@ -1,6 +1,7 @@
<template>
<div class="block">
<div class="tabs is-boxed" id="tabs">
<div class="tabs"
:class="clases">
<ul class="has-bottom-line">
<li v-for="(tab, index) in tabs" class="is-size-6"
:key="index"
@ -20,8 +21,18 @@
<script>
export default {
props: {
tabs: Array,
tabInicial: String,
tabs: {
type: Array,
required: true
},
tabInicial: {
type: String,
required: true
},
clases: {
type: Array,
default: () => ['is-boxed']
}
},
data() {
return {

View file

@ -44,6 +44,14 @@ Route::middleware('api')->group(function () {
$habilitadas = GrupoDeCompra::find($gdc)->toggleDevoluciones();
return ['devoluciones' => $habilitadas];
});
Route::get('/{gdc}/faltantes', function($gdc) {
$faltantes = GrupoDeCompra::find($gdc)->faltantes();
return ['faltantes' => $faltantes];
});
Route::get('/{gdc}/sobrantes', function($gdc) {
$sobrantes = GrupoDeCompra::find($gdc)->sobrantes();
return ['sobrantes' => $sobrantes];
});
});
Route::prefix('subpedidos')->group(function () {