Compare commits
33 commits
master
...
funcion/ma
Author | SHA1 | Date | |
---|---|---|---|
7e49633b2c | |||
fdfba78d21 | |||
544f54e95d | |||
6fe4295577 | |||
cdbd1504b6 | |||
e4e4fe2fff | |||
6200ee234a | |||
bf97f60e32 | |||
408629a78d | |||
105767dab7 | |||
54fe1ff601 | |||
228b1b63bc | |||
d4a2735af5 | |||
1aeb917ecf | |||
092e98a456 | |||
56e1a94ee7 | |||
9d049200cb | |||
4a01b21307 | |||
2ef4d77e4f | |||
59cefc8233 | |||
284cef2d7d | |||
af4a697388 | |||
a9d26cc146 | |||
bdbf5939a1 | |||
cc341462e5 | |||
70f5756988 | |||
207b6d91c3 | |||
5b824ae7f8 | |||
2dba5ef3b4 | |||
bdd44d72fb | |||
708c153fe6 | |||
42445e216e | |||
12c187da13 |
18 changed files with 660 additions and 31 deletions
|
@ -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
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -16,6 +16,7 @@ class GrupoDeCompraComisionesResource extends JsonResource
|
|||
return [
|
||||
'id' => $this->id,
|
||||
'nombre' => $this->nombre,
|
||||
'region' => $this->region,
|
||||
'saldo' => $this->saldo,
|
||||
];
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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',
|
||||
];
|
||||
|
||||
/**
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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">
|
||||
|
|
113
resources/js/components/comisiones/barrios/BarrioRow.vue
Normal file
113
resources/js/components/comisiones/barrios/BarrioRow.vue
Normal 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>
|
|
@ -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>
|
113
resources/js/components/comisiones/barrios/ModalBarrio.vue
Normal file
113
resources/js/components/comisiones/barrios/ModalBarrio.vue
Normal 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>
|
41
resources/js/components/comisiones/barrios/TablaBarrios.vue
Normal file
41
resources/js/components/comisiones/barrios/TablaBarrios.vue
Normal 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>
|
52
resources/js/components/comunes/Dropdown.vue
Normal file
52
resources/js/components/comunes/Dropdown.vue
Normal 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>
|
|
@ -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;
|
||||
|
|
48
resources/js/store/modules/comisiones.js
vendored
48
resources/js/store/modules/comisiones.js
vendored
|
@ -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 = {
|
||||
|
|
4
resources/js/store/modules/ui.js
vendored
4
resources/js/store/modules/ui.js
vendored
|
@ -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;
|
||||
|
|
|
@ -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');
|
||||
});
|
||||
|
|
Loading…
Add table
Reference in a new issue