Compare commits

...
Sign in to create a new pull request.

33 commits

Author SHA1 Message Date
ale
7e49633b2c Merge branch 'master' into funcion/manejo-de-barrios 2025-08-13 17:28:02 -03:00
ale
fdfba78d21 Moviendo logica 2025-08-13 01:49:07 -03:00
ale
544f54e95d Cambiando de titulo segun si se crea o modifica un barrio 2025-08-13 01:45:38 -03:00
ale
6fe4295577 Arreglada logica para crear y para modificar barrios 2025-08-13 01:45:23 -03:00
ale
cdbd1504b6 Agregada logica para crear barrios 2025-08-13 00:58:50 -03:00
ale
e4e4fe2fff Cambio de método según si se está modificando o creando un barrio 2025-08-13 00:58:24 -03:00
ale
6200ee234a Agregada lógica para crear barrios 2025-08-13 00:58:05 -03:00
ale
bf97f60e32 Agregada ruta para crear barrio 2025-08-13 00:57:35 -03:00
ale
408629a78d Agregado método para crear barrio 2025-08-13 00:57:25 -03:00
ale
105767dab7 Agregado boton para agregar barrio 2025-08-13 00:31:41 -03:00
ale
54fe1ff601 Cambio a dropdown generico 2025-08-13 00:30:57 -03:00
ale
228b1b63bc Agregada opcion de rutas 2025-08-13 00:02:22 -03:00
ale
d4a2735af5 Agregada ruta para notas y arreglados nomrbes 2025-08-13 00:02:11 -03:00
ale
1aeb917ecf Arreglado regex y agregado metodo para notas de barrio 2025-08-13 00:01:58 -03:00
ale
092e98a456 Agregado metodo para notas de barrio 2025-08-13 00:01:53 -03:00
ale
56e1a94ee7 Ruta para descargar pedidos barriales simplificada 2025-08-12 23:47:13 -03:00
ale
9d049200cb Cambio a pedido de ollas 2025-08-12 23:44:21 -03:00
ale
4a01b21307 Agregadas rutas para descargar pedidos barriales y de ollas 2025-08-12 23:43:53 -03:00
ale
2ef4d77e4f Agregado metodo para exportar pedido de ollas a csv 2025-08-12 23:42:43 -03:00
ale
59cefc8233 Agregada logica para modificar grupo de compra 2025-08-12 23:31:39 -03:00
ale
284cef2d7d Agregados métodos para modificar grupo de compra 2025-08-12 23:30:05 -03:00
ale
af4a697388 Cambio ruta a ComisionesController 2025-08-12 23:29:52 -03:00
ale
a9d26cc146 Agregada logica de modificar barrio a comisiones controller 2025-08-12 23:29:48 -03:00
ale
bdbf5939a1 Cambio estilo boton de modificar 2025-08-12 23:29:05 -03:00
ale
cc341462e5 Pedidos y saldos fusionadas en barrios 2025-08-12 22:29:20 -03:00
ale
70f5756988 Agregada barrios seccion 2025-08-12 22:29:05 -03:00
ale
207b6d91c3 Agregada tabla de barrios 2025-08-12 22:28:34 -03:00
ale
5b824ae7f8 Agregado modal para modificar barrio, faltan rutas 2025-08-12 22:28:19 -03:00
ale
2dba5ef3b4 Agregado componente para dropdown generico 2025-08-12 22:26:48 -03:00
ale
bdd44d72fb Agregada region a resource de comisiones 2025-08-12 22:03:20 -03:00
ale
708c153fe6 Cambio en z-index 2025-08-12 22:03:01 -03:00
ale
42445e216e Agregada ruta para cambiar contraseña desde comisiones, y agregados nombres faltantes a rutas 2025-08-12 16:02:57 -03:00
ale
12c187da13 Método para cambiar contraseña 2025-08-12 16:02:28 -03:00
18 changed files with 660 additions and 31 deletions

View file

@ -128,6 +128,31 @@ class PedidosExportHelper
);
}
/**
* @throws InvalidArgument
* @throws CannotInsertRecord
* @throws Exception
*/
static public function pedidoOllasDeBarrio(GrupoDeCompra $grupo)
{
$filePath = "csv/exports/" . $grupo->nombre . "-ollas-" . now()->format('Y-m-d') . ".csv";
$tipo_olla = self::getTipoId('olla');
$falsoBarrio = new GrupoDeCompra(['nombre' => 'Total']);
$falsoBarrio->id = $grupo->id;
$header = collect([$falsoBarrio]);
self::exportarCSV(
$filePath,
$header,
self::generarContenidoCSV(
$header,
fn($grupoId) => "subpedidos.grupo_de_compra_id = $grupoId
AND subpedidos.tipo_pedido_id = $tipo_olla"
),
);
}
/**
* @throws InvalidArgument
* @throws CannotInsertRecord

View file

@ -4,6 +4,7 @@ namespace App\Http\Controllers;
use App\GrupoDeCompra;
use App\Helpers\PedidosExportHelper;
use App\Producto;
use League\Csv\Exception;
use Mpdf\MpdfException;
@ -60,4 +61,38 @@ class AdminController extends Controller
return response()->download($files[0]);
}
public function exportarPedidoOllasACSV(GrupoDeCompra $gdc)
{
try {
PedidosExportHelper::pedidoOllasDeBarrio($gdc);
} catch (Exception $e) {
return response()->json(['message' => $e->getMessage()]);
}
$pattern = storage_path('csv/exports/'. $gdc->nombre . '-ollas-*.csv');
$files = glob($pattern);
usort($files, function ($a, $b) {
return filemtime($b) <=> filemtime($a);
});
return response()->download($files[0]);
}
public function exportarNotasACSV(GrupoDeCompra $gdc)
{
try {
Producto::planillaNotasBarrio($gdc);
} catch (Exception $e) {
return response()->json(['message' => $e->getMessage()]);
}
$pattern = storage_path('csv/exports/notas-de-'. $gdc->nombre . '-*.csv');
$files = glob($pattern);
usort($files, function ($a, $b) {
return filemtime($b) <=> filemtime($a);
});
return response()->download($files[0]);
}
}

View file

@ -7,16 +7,21 @@ use App\Helpers\CanastaHelper;
use App\Helpers\CsvHelper;
use App\Helpers\PedidosExportHelper;
use App\Helpers\TransporteHelper;
use App\Http\Resources\GrupoDeCompraComisionesResource;
use App\Http\Resources\GrupoDeCompraResource;
use App\Producto;
use App\User;
use App\UserRole;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use League\Csv\CannotInsertRecord;
use League\Csv\Exception;
use League\Csv\InvalidArgument;
use Mpdf\MpdfException;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpKernel\Exception\HttpException;
class ComisionesController
{
@ -183,4 +188,105 @@ class ComisionesController
$records = CsvHelper::getRecords(resource_path(self::PARAMETROS_PATH), "No se pudo leer el archivo.");
return iterator_to_array($records);
}
public static function modificarGrupoDeCompra(Request $request, $grupo_de_compra_id) {
$valid = $request->validate([
'nombre' => ['nullable','string','regex:/^([a-z]| )+$/i'],
'region' => ['nullable','string','regex:/^([a-z]| |\d)+$/i'],
'passBarrio' => ['nullable','string','alpha_num','min:3'],
'passAdmin' => ['nullable','string','alpha_num','min:3'],
'passOllas' => ['nullable','string','alpha_num','min:3'],
]);
$grupoDeCompra = GrupoDeCompra::find($grupo_de_compra_id);
foreach (array_keys($valid) as $key) {
switch ($key) {
case 'nombre':
$users = User::where([
'grupo_de_compra_id' => $grupoDeCompra->id,
])->first();
foreach ($users as $user) {
$user->name = str_replace($grupoDeCompra->nombre, $valid['nombre'], $user->name);
$user->save();
}
$grupoDeCompra->nombre = $valid['nombre'];
$grupoDeCompra->save();
break;
case 'region':
$grupoDeCompra->region = $valid['region'];
$grupoDeCompra->save();
break;
case 'passBarrio':
$user = User::where([
'grupo_de_compra_id' => $grupoDeCompra->id,
'role_id' => UserRole::where(['nombre' => 'barrio'])->first()->id,
])->first();
$user->password = Hash::make($valid['passBarrio']);
$user->save();
break;
case 'passAdmin':
$user = User::where([
'grupo_de_compra_id' => $grupoDeCompra->id,
'role_id' => UserRole::where(['nombre' => 'admin_barrio'])->first()->id,
])->first();
$user->password = Hash::make($valid['passAdmin']);
$user->save();
break;
case 'passOllas':
$user = User::where([
'grupo_de_compra_id' => $grupoDeCompra->id,
'role_id' => UserRole::where(['nombre' => 'ollas'])->first()->id,
])->first();
$user->password = Hash::make($valid['passOllas']);
$user->save();
break;
default:
break;
}
}
return response()->noContent();
}
public static function crearGrupoDeCompra(Request $request) {
$valid = $request->validate([
'nombre' => ['required','string','regex:/^([a-z]| )+$/i'],
'region' => ['required','string','regex:/^([a-z]| |\d)+$/i'],
'passBarrio' => ['required','string','alpha_num','min:3'],
'passAdmin' => ['required','string','alpha_num','min:3'],
'passOllas' => ['required','string','alpha_num','min:3'],
]);
if (GrupoDeCompra::where(["nombre" => $valid["nombre"]])->get()->count())
throw new HttpException(400, "Ya existe un barrio con este nombre.");
$gdc = GrupoDeCompra::create([
'nombre' => $valid['nombre'],
'region' => $valid['region'],
'saldo' => 0,
]);
User::create([
'grupo_de_compra_id' => $gdc->id,
'name' => $valid['nombre'],
'password' => Hash::make($valid['passBarrio']),
'role_id' => UserRole::where('nombre','barrio')->first()->id,
]);
User::create([
'grupo_de_compra_id' => $gdc->id,
'name' => $valid['nombre'] . '_admin',
'password' => Hash::make($valid['passAdmin']),
'role_id' => UserRole::where('nombre','admin_barrio')->first()->id,
]);
User::create([
'grupo_de_compra_id' => $gdc->id,
'name' => $valid['nombre'] . '_ollas',
'password' => Hash::make($valid['passOllas']),
'role_id' => UserRole::where('nombre','ollas')->first()->id,
]);
return new GrupoDeCompraComisionesResource($gdc);
}
}

View file

@ -5,9 +5,11 @@ namespace App\Http\Controllers;
use App\GrupoDeCompra;
use App\Http\Resources\GrupoDeCompraPedidoResource;
use App\Http\Resources\GrupoDeCompraResource;
use App\User;
use App\UserRole;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
class UserController extends Controller
{

View file

@ -16,6 +16,7 @@ class GrupoDeCompraComisionesResource extends JsonResource
return [
'id' => $this->id,
'nombre' => $this->nombre,
'region' => $this->region,
'saldo' => $this->saldo,
];
}

View file

@ -103,4 +103,32 @@ class Producto extends Model
$filePath = 'csv/exports/notas-por-barrio-' . $fecha . '.csv';
CsvHelper::generarCsv($filePath, $planilla, $headers);
}
/**
* @throws InvalidArgument
* @throws CannotInsertRecord
*/
static public function planillaNotasBarrio($gdc) {
$headers = ['Producto'];
$barrios = [$gdc->nombre];
$headers = array_merge($headers, $barrios);
$notasPorBarrio = self::notasPorBarrio();
$planilla = [];
foreach ($notasPorBarrio as $producto => $notasGrupo) {
$fila = [$producto];
foreach ($barrios as $barrio) {
$notas = $notasGrupo->where('barrio', $barrio)
->pluck('notas')
->implode('; ');
$fila[] = $notas ?: '';
}
$planilla[] = $fila;
}
$fecha = now()->format('Y-m-d');
$filePath = 'csv/exports/notas-de-' . $gdc->nombre . '-' . $fecha . '.csv';
CsvHelper::generarCsv($filePath, $planilla, $headers);
}
}

View file

@ -16,7 +16,7 @@ class User extends Authenticatable
* @var array
*/
protected $fillable = [
'name', 'email', 'password', 'role_id',
'grupo_de_compra_id', 'name', 'email', 'password', 'role_id',
];
/**

View file

@ -2,22 +2,15 @@
<div class="block ml-3 mr-3 is-max-widescreen is-max-desktop">
<tabs-secciones :tabs="tabs" :tabInicial="tabActiva"/>
<div class="block pb-6"
id="pedidos-comisiones-seccion"
:class="seccionActiva === 'pedidos-comisiones-seccion' ? 'is-active' : 'is-hidden'">
<div class="block" id="pedidos-comisiones-tabla-y-dropdown">
<dropdown-descargar/>
</div>
id="barrios-comisiones-seccion"
:class="seccionActiva === 'barrios-comisiones-seccion' ? 'is-active' : 'is-hidden'">
<barrios-seccion/>
</div>
<div class="block pb-6"
id="canasta-comisiones-seccion"
:class="seccionActiva === 'canasta-comisiones-seccion' ? 'is-active' : 'is-hidden'">
<canasta-seccion/>
</div>
<div class="block pb-6"
id="saldos-comisiones-seccion"
:class="seccionActiva === 'saldos-comisiones-seccion' ? 'is-active' : 'is-hidden'">
<saldos-seccion/>
</div>
<div class="block pb-6"
id="parametros-comisiones-seccion"
:class="seccionActiva === 'parametros-comisiones-seccion' ? 'is-active' : 'is-hidden'">
@ -33,13 +26,15 @@ import InputFileButton from "../comunes/InputFileButton.vue";
import CanastaSeccion from "./canasta/CanastaSeccion.vue";
import SaldosSeccion from "./saldos/SaldosSeccion.vue";
import ParametrosSeccion from "./parametros/ParametrosSeccion.vue";
import BarriosSeccion from "./barrios/BarriosSeccion.vue";
export default {
name: "ComisionesBody",
components: {
ParametrosSeccion,
SaldosSeccion,
BarriosSeccion,
CanastaSeccion,
ParametrosSeccion,
TabsSecciones,
DropdownDescargar,
InputFileButton,
@ -47,13 +42,12 @@ export default {
data() {
return {
tabs: [
{ id: "pedidos-comisiones", nombre: "Pedidos" },
{ id: "barrios-comisiones", nombre: "Barrios" },
{ id: "canasta-comisiones", nombre: "Canasta" },
{ id: "saldos-comisiones", nombre: "Saldos" },
{ id: "parametros-comisiones", nombre: "Parámetros" },
],
tabActiva: "pedidos-comisiones",
seccionActiva: "pedidos-comisiones-seccion",
tabActiva: "barrios-comisiones",
seccionActiva: "barrios-comisiones-seccion",
}
},
methods: {

View file

@ -14,7 +14,7 @@
</div>
<div class="dropdown-menu" id="dropdown-menu" role="menu">
<div class="dropdown-content">
<a href="/comisiones/pedidos/descargar" class="dropdown-item">
<a href="/comisiones/pedidos" class="dropdown-item">
Pedidos por barrio en csv
</a>
<a href="/comisiones/pedidos/notas" class="dropdown-item">

View file

@ -0,0 +1,113 @@
<script>
import { mapActions, mapGetters, mapMutations, mapState } from "vuex";
import Dropdown from "../../comunes/Dropdown.vue";
export default {
name: "BarrioRow",
components: { Dropdown },
props: {
grupo_de_compra: {
type: Object,
required: true,
}
},
data() {
return {
saldoControl: 0,
inputSaldoInteractuado: false,
opcionesDescarga: [
{
nombre: "Pedido barrial en csv",
href: `/comisiones/pedidos/${this.grupo_de_compra.id}/`
},
{
nombre: "Notas en csv",
href: `/comisiones/pedidos/${this.grupo_de_compra.id}/notas`
},
{
nombre: "Pedido de ollas en csv",
href: `/comisiones/pedidos/${this.grupo_de_compra.id}/ollas`
}
],
};
},
mounted() {
this.saldoControl = this.grupo_de_compra.saldo;
},
watch: {
lastFetch() {
this.saldoControl = this.grupo_de_compra.saldo;
},
},
methods: {
...mapMutations("ui", ["toggleModalBarrio"]),
...mapMutations("comisiones", ["seleccionarGrupoDeCompra"]),
...mapActions("ui", ["toast"]),
...mapActions("comisiones", ["setSaldo"]),
async confirmarSaldo() {
await this.setSaldo({
gdc_id: this.grupo_de_compra.id,
saldo: this.saldoControl,
});
this.inputSaldoInteractuado = false;
},
abrirModalBarrio() {
this.seleccionarGrupoDeCompra({ grupo_de_compra: this.grupo_de_compra });
this.toggleModalBarrio();
},
descargasBarrio() {
this.toast({
mensaje: `Esto debería ser un dropdown para descargar el pedido de ${this.grupo_de_compra.nombre}`
});
}
},
computed: {
...mapState("comisiones", ["lastFetch"]),
...mapGetters("comisiones", ["saldo"]),
saldoModificado() {
return Number.parseFloat(this.saldo(this.grupo_de_compra.id)) !== Number.parseFloat(this.saldoControl);
},
}
}
</script>
<template>
<tr>
<th>{{ grupo_de_compra.nombre }}</th>
<th>{{ grupo_de_compra.region }}</th>
<td>
<div class="field has-addons">
<div class="control is-expanded">
<input :id="`barrio-input-${grupo_de_compra.id}`"
v-model="saldoControl"
class="input is-small"
type="number"
style="text-align: center"
@input="inputSaldoInteractuado = true">
</div>
<div class="control">
<button :disabled="!(inputSaldoInteractuado && saldoModificado)"
class="button is-small is-success ml-1"
@click="confirmarSaldo">
<span class="icon"><i class="fas fa-check"/></span>
</button>
</div>
</div>
</td>
<td>
<dropdown :opciones="opcionesDescarga"
:placeholder="`Pedido de ${grupo_de_compra.nombre}`"
:is-right="false"/>
</td>
<td>
<button class="button"
@click="abrirModalBarrio">
<span>Modificar barrio</span>
<span class="icon"><i class="fas fa-edit"/></span>
</button>
</td>
</tr>
</template>
<style scoped>
</style>

View file

@ -0,0 +1,63 @@
<script>
import TablaBarrios from "./TablaBarrios.vue";
import DropdownDescargar from "../DropdownDescargar.vue";
import ModalBarrio from "./ModalBarrio.vue";
import { mapActions, mapMutations, mapState } from "vuex";
import Dropdown from "../../comunes/Dropdown.vue";
import comisiones from "../../../store/modules/comisiones";
export default {
name: "BarriosSeccion",
components: { Dropdown, DropdownDescargar, TablaBarrios, ModalBarrio },
data() {
return {
opcionesDescarga: [
{
nombre: "Pedidos por barrio en csv",
href: "/comisiones/pedidos"
},
{
nombre: "Notas por barrio en csv",
href: "/comisiones/pedidos/notas"
},
{
nombre: "Pedidos por barrio en pdf",
href: "/comisiones/pedidos/pdf"
},
{
nombre: "Pedidos de ollas en csv",
href: "/comisiones/pedidos/ollas"
},
],
};
},
computed: {
...mapState("comisiones", ["grupo_de_compra_actual", "grupo_de_compra_nuevo"])
},
methods: {
...mapMutations("ui", ["toggleModalBarrio"]),
...mapMutations("comisiones", ["grupoDeCompraNuevo"]),
modalNuevoBarrio() {
this.grupoDeCompraNuevo();
this.toggleModalBarrio();
}
}
}
</script>
<template>
<div>
<modal-barrio v-if="grupo_de_compra_actual || grupo_de_compra_nuevo"/>
<div class="is-flex is-justify-content-space-between mb-3">
<button class="button" @click="modalNuevoBarrio">
<span class="icon"><i class="fa fa-plus-circle"/></span>
<span>Agregar barrio</span>
</button>
<dropdown :opciones="opcionesDescarga" placeholder="Descargar planillas" :is-right="false"/>
</div>
<tabla-barrios/>
</div>
</template>
<style scoped>
</style>

View file

@ -0,0 +1,113 @@
<template>
<div :class="show_modal_barrio ? 'is-active modal' : 'modal'">
<div class="modal-background"></div>
<div class="modal-card">
<header class="modal-card-head">
<p class="modal-card-title">{{ titulo }}</p>
<button class="delete" aria-label="close" @click.capture="cerrar"></button>
</header>
<section class="modal-card-body">
<div class="field has-addons is-centered is-thin-centered">
<p class="control">
Nombre:
<input id="notasControl" class="input" type="text" v-model="nombreControl">
</p>
</div>
<div class="field has-addons is-centered is-thin-centered">
<p class="control">
Region:
<input id="notasControl" class="input" type="text" v-model="regionControl">
</p>
</div>
<div class="field has-addons is-centered is-thin-centered">
<p class="control">
Contraseña pedidos:
<input id="notasControl" class="input" type="text" v-model="passBarrio">
</p>
</div>
<div class="field has-addons is-centered is-thin-centered">
<p class="control">
Contraseña admin:
<input id="notasControl" class="input" type="text" v-model="passAdmin">
</p>
</div>
<div class="field has-addons is-centered is-thin-centered">
<p class="control">
Contraseña ollas:
<input id="notasControl" class="input" type="text" v-model="passOllas">
</p>
</div>
</section>
<footer class="modal-card-foot is-justify-content-right">
<button class="button" @click="cerrar">Cancelar</button>
<button class="button is-success" @click="confirmar">Aceptar</button>
</footer>
</div>
</div>
</template>
<script>
import { mapActions, mapMutations, mapState } from "vuex";
export default {
name: 'ModalBarrio',
data() {
return {
nombreControl: "",
regionControl: "",
passBarrio: "",
passAdmin: "",
passOllas: "",
}
},
computed: {
...mapState('ui', ["show_modal_barrio"]),
...mapState('comisiones', ["grupo_de_compra_actual", "grupo_de_compra_nuevo"]),
titulo() {
return this.grupo_de_compra_nuevo ? "Agregar barrio" : "Modificar barrio";
}
},
methods: {
...mapMutations("comisiones", ["seleccionarGrupoDeCompra"]),
...mapMutations('ui', ["toggleModalBarrio"]),
...mapActions("comisiones", ["modificarBarrio", "crearBarrio"]),
...mapActions('ui', ["toast", "error"]),
async confirmar() {
if (this.grupo_de_compra_nuevo)
await this.crear();
else
await this.modificar();
this.cerrar();
},
async crear() {
await this.crearBarrio({
nombre: this.nombreControl,
region: this.regionControl,
passBarrio: this.passBarrio,
passAdmin: this.passAdmin,
passOllas: this.passOllas
});
},
async modificar() {
const nombre = this.nombreControl !== this.grupo_de_compra_actual.nombre ? this.nombreControl : undefined;
const region = this.regionControl !== this.grupo_de_compra_actual.region ? this.regionControl : undefined;
await this.modificarBarrio({
gdc_id: this.grupo_de_compra_actual.id,
nombre: nombre,
region: region,
passBarrio: this.passBarrio,
passAdmin: this.passAdmin,
passOllas: this.passOllas,
})
},
cerrar() {
this.toggleModalBarrio();
this.seleccionarGrupoDeCompra({ grupoDeCompra: false });
},
},
mounted() {
this.nombreControl = this.grupo_de_compra_actual.nombre;
this.regionControl = this.grupo_de_compra_actual.region;
}
}
</script>

View file

@ -0,0 +1,41 @@
<script>
import { mapActions, mapState } from "vuex";
import BarrioRow from "./BarrioRow.vue";
export default {
name: "TablaBarrios",
components: { BarrioRow },
async mounted() {
await this.getGruposDeCompra();
},
methods: {
...mapActions("comisiones", ["getGruposDeCompra"]),
},
computed: {
...mapState("comisiones", ["grupos_de_compra"]),
}
}
</script>
<template>
<table class="table is-fullwidth is-striped is-bordered">
<thead>
<tr>
<th>Barrio</th>
<th>Region</th>
<th>Saldo</th>
<th>Pedido</th>
<th>Modificar</th>
</tr>
</thead>
<tbody>
<barrio-row v-for="(gdc,index) in grupos_de_compra"
:grupo_de_compra="gdc"
:key="index"/>
</tbody>
</table>
</template>
<style scoped>
</style>

View file

@ -0,0 +1,52 @@
<template>
<div class="buttons" :class="{'is-right': isRight}">
<div class="dropdown" :class="{'is-active': dropdownActivo}" @mouseleave="dropdownActivo = false">
<div class="dropdown-trigger">
<button class="button" aria-haspopup="true" aria-controls="dropdown-menu" @click="dropdownActivo = !dropdownActivo">
<span class="icon is-small"><i class="fas fa-download"/></span>
<span>{{ placeholder }}</span>
<span class="icon is-small"><i class="fas fa-angle-down" aria-hidden="true"/></span>
</button>
</div>
<div class="dropdown-menu" id="dropdown-menu" role="menu">
<div class="dropdown-content">
<a class="dropdown-item"
v-for="(opcion,i) in opciones"
:key="i"
:href="opcion.href">
{{ opcion.nombre }}
</a>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "Dropdown",
props: {
placeholder: {
type: String,
required: true,
},
opciones: {
type: Array,
required: true,
},
isRight: {
type: Boolean,
required: false,
default: true,
}
},
data() {
return {
dropdownActivo: false
}
},
}
</script>
<style>
</style>

View file

@ -59,7 +59,7 @@ export default {
position: fixed;
bottom: 1rem;
right: 1rem;
z-index: 50;
z-index: 25;
padding: 0.75rem 1rem;
border-radius: 0.5rem;
max-width: 90vw;

View file

@ -4,6 +4,8 @@ const state = {
lastFetch: undefined,
grupos_de_compra: [],
parametros: [],
grupo_de_compra_actual: undefined,
grupo_de_compra_nuevo: false,
};
const mutations = {
@ -25,6 +27,25 @@ const mutations = {
const i = state.grupos_de_compra.indexOf(barrio);
state.grupos_de_compra[i].saldo = saldo;
},
seleccionarGrupoDeCompra(state, { grupo_de_compra }) {
state.grupo_de_compra_actual = grupo_de_compra;
},
actualizarGrupoDeCompra(state, { gdc_id, nombre, region }) {
const barrio = state.grupos_de_compra.find(gdc => gdc.id === gdc_id);
const i = state.grupos_de_compra.indexOf(barrio);
if (nombre)
state.grupos_de_compra[i].nombre = nombre;
if (region)
state.grupos_de_compra[i].region = region;
},
grupoDeCompraNuevo(state) {
state.grupo_de_compra_actual = {};
state.grupo_de_compra_nuevo = true;
},
agregarGrupoDeCompra(state, grupo_de_compra) {
state.grupos_de_compra.push(grupo_de_compra);
state.grupo_de_compra_nuevo = false;
},
};
const actions = {
@ -74,6 +95,33 @@ const actions = {
dispatch("ui/error", { error: error }, { root: true });
}
},
async modificarBarrio({ commit, dispatch }, { gdc_id, nombre, region, passBarrio, passAdmin, passOllas }) {
try {
const data = {
nombre: nombre,
region: region,
passBarrio: passBarrio,
passAdmin: passAdmin,
passOllas: passOllas
};
await axios.put(`/comisiones/grupos-de-compra/${gdc_id}`, data);
commit('actualizarGrupoDeCompra', { gdc_id: gdc_id, nombre: nombre, region: region });
dispatch("ui/toast", { mensaje: 'Barrio modificado con éxito'}, { root: true });
} catch (error) {
console.log(error);
dispatch("ui/error", { error: error }, { root: true });
}
},
async crearBarrio({ commit, dispatch }, data) {
try {
const response = await axios.post(`/comisiones/grupos-de-compra/`, data);
commit('agregarGrupoDeCompra', response.data.data);
dispatch("ui/toast", { mensaje: 'Barrio agregado con éxito'}, { root: true });
} catch (error) {
console.log(error);
dispatch("ui/error", { error: error }, { root: true });
}
}
};
const getters = {

View file

@ -2,6 +2,7 @@ const state = {
show_chismosa: false,
show_devoluciones: false,
show_tags: true,
show_modal_barrio: false,
burger_activa: false,
tags_interactuada: false,
migas: [{ nombre: 'Pedidos', action: 'pedido/resetear' }],
@ -18,6 +19,9 @@ const mutations = {
toggleDevoluciones(state) {
state.show_devoluciones = !state.show_devoluciones;
},
toggleModalBarrio(state) {
state.show_modal_barrio = !state.show_modal_barrio;
},
toggleTags(state, manual) {
state.tags_interactuada = manual;
state.show_tags = !state.show_tags;

View file

@ -26,45 +26,49 @@ Route::get('/', 'RouteController@home')->name('home');
Route::middleware(['auth'])->group(function () {
Route::get('/user', 'UserController@user')->name('user');
Route::get('/user/rol', 'UserController@rol')->name('user.rol');
Route::get('/user/grupo_de_compra', 'UserController@grupoDeCompra');
Route::get('/user/grupo_de_compra', 'UserController@grupoDeCompra')->name('user.grupoDeCompra');
});
Route::middleware(['auth', 'role:barrio'])->group(function() {
Route::get('/pedido', 'RouteController@main')->name('pedido');
Route::get('/pedido/sesion', 'SessionController@fetch');
Route::post('/pedido/sesion', 'SessionController@store');
Route::delete('/pedido/sesion', 'SessionController@destroy');
Route::get('/pedido/sesion', 'SessionController@fetch')->name('pedido.sesion');
Route::post('/pedido/sesion', 'SessionController@store')->name('pedido.sesion.store');
Route::delete('/pedido/sesion', 'SessionController@destroy')->name('pedido.sesion.destroy');
});
Route::get('/admin/login', 'AdminController@show')->name('admin.login');
Route::middleware(['auth', 'role:admin_barrio'])->group(function () {
Route::get('/admin', 'RouteController@main')->name('admin');
Route::get('/admin/exportar-planillas-a-pdf/{gdc}', 'AdminController@exportarPedidosAPdf');
Route::get('/admin/exportar-pedido-a-csv/{gdc}', 'AdminController@exportarPedidoACSV');
Route::get('/admin/exportar-pedido-con-nucleos-a-csv/{gdc}', 'AdminController@exportarPedidoConNucleosACSV');
Route::get('/admin/exportar-planillas-a-pdf/{gdc}', 'AdminController@exportarPedidosAPdf')->name('admin.pedidos.pdf');
Route::get('/admin/exportar-pedido-a-csv/{gdc}', 'AdminController@exportarPedidoACSV')->name('admin.pedidoBarrial.csv');
Route::get('/admin/exportar-pedido-con-nucleos-a-csv/{gdc}', 'AdminController@exportarPedidoConNucleosACSV')->name('admin.pedidoPorNucleos.csv');
});
Route::get('/comisiones/login', 'ComisionesController@show')->name('comisiones.login');
Route::middleware(['auth', 'role:comision'])->group( function() {
Route::get('/comisiones', 'RouteController@main')->name('comisiones');
Route::get('/comisiones/pedidos/descargar', 'ComisionesController@descargarPedidos')->name('comisiones.pedidos.descargar');
Route::get('/comisiones/pedidos/notas', 'ComisionesController@descargarNotas')->name('comisiones.pedidos.descargar');
Route::get('/comisiones/pedidos', 'ComisionesController@descargarPedidos')->name('comisiones.pedidos');
Route::get('/comisiones/pedidos/notas', 'ComisionesController@descargarNotas')->name('comisiones.pedidos.notas');
Route::get('/comisiones/pedidos/pdf', 'ComisionesController@pdf')->name('comisiones.pedidos.pdf');
Route::get('/comisiones/pedidos/ollas', 'ComisionesController@descargarPedidosDeOllas')->name('comisiones.pedidos.ollas');
Route::get('/comisiones/canasta/ejemplo', 'ComisionesController@descargarCanastaEjemplo')->name('comisiones.canasta.ejemplo');
Route::post('/comisiones/canasta', 'ComisionesController@cargarCanasta')->name('comisiones.canasta');
Route::get('/comisiones/saldos/ejemplo', 'ComisionesController@descargarSaldosEjemplo')->name('comisiones.saldos.ejemplo');
Route::post('/comisiones/saldos', 'ComisionesController@cargarSaldos')->name('comisiones.saldos');
Route::put('/comisiones/parametros/{parametro_id}', 'ComisionesController@modificarParametros');
Route::put('/comisiones/parametros/{parametro_id}', 'ComisionesController@modificarParametros')->name('comisiones.parametros.modificar');
Route::post('/comisiones/grupos-de-compra/', 'ComisionesController@crearGrupoDeCompra')->name('comisiones.gruposDeComrpa.crear');
Route::put('/comisiones/grupos-de-compra/{grupo_de_compra_id}', 'ComisionesController@modificarGrupoDeCompra')->name('comisiones.gruposDeComrpa.modificar');
Route::get('/comisiones/pedidos/{gdc}', 'AdminController@exportarPedidoACSV')->name('comisiones.pedidos.descargar.grupoDeCompra');
Route::get('/comisiones/pedidos/{gdc}/ollas', 'AdminController@exportarPedidoOllasACSV')->name('comisiones.pedidos.ollas.grupoDeCompra');
Route::get('/comisiones/pedidos/{gdc}/notas', 'AdminController@exportarNotasACSV')->name('comisiones.pedidos.notas.grupoDeCompra');
});
Route::get('/ollas/login', 'OllasController@show')->name('ollas.login');
Route::middleware(['auth', 'role:ollas'])->prefix('ollas')->group( function() {
Route::get('/', 'RouteController@main')->name('ollas');
Route::get('/{gdc}','OllasController@pedido');
Route::put('/{gdc}/cantidad','OllasController@actualizarCantidadOllas');
Route::get('/{gdc}','OllasController@pedido')->name('ollas.pedido');
Route::put('/{gdc}/cantidad','OllasController@actualizarCantidadOllas')->name('ollas.actualizarCantidadOllas');
});