funcion/planilla-pedidos-total #33

Merged
atasistro merged 25 commits from funcion/planilla-pedidos-total into master 2024-10-08 20:07:57 -03:00
49 changed files with 407 additions and 188 deletions

View File

@ -7,7 +7,7 @@ use Mpdf\Mpdf;
use League\Csv\CannotInsertRecord;
use League\Csv\Writer;
use App\Producto;
use DB;
use Illuminate\Support\Facades\DB;
use League\Csv\Reader;
class GrupoDeCompra extends Model
@ -17,7 +17,34 @@ class GrupoDeCompra extends Model
protected $table = 'grupos_de_compra';
protected $hidden = ['password'];
public function toggleDevoluciones()
/**
* @param $gdcs
* @param array $planilla
* @return array
*/
public static function getPlanilla($gdcs, array $planilla): array
{
$barrios = [""];
foreach ($gdcs as $i => $gdc) {
$barrios[] = $gdc->nombre;
$productos_en_pedido = DB::table('pedidos_aprobados')->where('grupo_de_compra_id', $gdc->id)->get()->keyBy('producto_id');
$pedidos = $gdc->pedidosAprobados();
foreach ($productos_en_pedido as $id => $producto_pedido) {
$total = 0;
// Poner cantidad de cada producto para cada núcleo
foreach ($pedidos as $pedido) {
list($_, $_, $cantidad) = $gdc->agregarCantidad($pedido, $id, [], 0, 0);
$total = $total + $cantidad;
}
$fila = Producto::productosIdFila()[$id];
$planilla[$fila][$i+1] = $total;
}
}
array_splice($planilla, 0, 0, array($barrios));
return $planilla;
}
public function toggleDevoluciones()
{
$this->devoluciones_habilitadas = !$this->devoluciones_habilitadas;
$this->save();
@ -47,7 +74,8 @@ class GrupoDeCompra extends Model
$mpdf->Output($filename, "D");
}
function filaVacia(string $product, int $columns) {
static function filaVacia(string $product, int $columns): array
{
$fila = [$product];
for ($i = 1; $i <= $columns; $i++) {
$fila[$i] = "0";
@ -56,23 +84,23 @@ class GrupoDeCompra extends Model
}
//Asume que los productos están gruadados en orden de fila
public function obtenerTemplateDeFilasVacias(int $columns){
public static function obtenerTemplateDeFilasVacias(int $columns){
$productosFilaID = Producto::productosFilaID();
$productosIDNombre = Producto::productosIDNombre();
$num_fila = 1;
$template = [];
foreach ($productosFilaID as $fila => $id) {
for ($i = $num_fila; $i < $fila; $i++) {
$template[$i] = $this->filaVacia("", $columns);
$template[$i] = GrupoDeCompra::filaVacia("", $columns);
}
$template[$fila] = $this->filaVacia($productosIDNombre[$id], $columns);
$template[$fila] = GrupoDeCompra::filaVacia($productosIDNombre[$id], $columns);
$num_fila = $fila+1;
}
$template[$this->obtenerFilaDeBonoTransporte()] = $this->filaVacia("Bonos de transporte", $columns);
$template[GrupoDeCompra::obtenerFilaDeBonoTransporte()] = GrupoDeCompra::filaVacia("Bonos de transporte", $columns);
return $template;
}
private function obtenerFilaDeBonoTransporte() {
private static function obtenerFilaDeBonoTransporte() {
$csv = Reader::createFromPath(resource_path('csv/productos.csv'), 'r');
$csv->setDelimiter("|");
$csv->setEnclosure("'");
@ -84,7 +112,7 @@ class GrupoDeCompra extends Model
throw new Exception('No hay bono de transporte');
}
private function totalPedidosSinBonos() {
private function totalPedidosSinBonos() {
$total = 0;
foreach ($this->pedidosAprobados() as $pedido) {
$total += ceil($pedido->totalSinBonos());
@ -116,19 +144,7 @@ class GrupoDeCompra extends Model
}
public function exportarPedidoEnCSV(){
$productos_en_pedido = DB::table('pedidos_aprobados')->where('grupo_de_compra_id',$this->id)->get()->keyBy('producto_id');
//si no hay pedidos aprobados, salir
if ($productos_en_pedido->count() == 0) { \Log::debug("El grupo de compra ". $this->nombre . " no tiene pedidos aprobados."); return; }
$records = $this->obtenerTemplateDeFilasVacias(1);
$productos_id_fila = Producto::productosIdFila();
foreach ($productos_en_pedido as $id => $producto_pedido){
$fila = $productos_id_fila[$id];
$records[$fila][1] = $producto_pedido->cantidad_pedida;
}
$records[$this->obtenerFilaDeBonoTransporte()][1] = $this->calcularCantidadBDT();
$records = $this->generarColumnaCantidades();
try {
$writer = Writer::createFromPath(resource_path('csv/exports/'.$this->nombre.'.csv'), 'w');
$writer->insertAll($records);
@ -137,11 +153,35 @@ class GrupoDeCompra extends Model
}
}
public function generarColumnaCantidades() {
$productos_en_pedido = DB::table('pedidos_aprobados')->where('grupo_de_compra_id',$this->id)->get()->keyBy('producto_id');
//si no hay pedidos aprobados, salir
if ($productos_en_pedido->count() == 0) {
\Log::debug("El grupo de compra ". $this->nombre . " no tiene pedidos aprobados.");
return [];
}
$records = $this->obtenerTemplateDeFilasVacias(1);
$productos_id_fila = Producto::productosIdFila();
foreach ($productos_en_pedido as $id => $producto_pedido){
$fila = $productos_id_fila[$id];
$records[$fila][1] = $producto_pedido->cantidad_pedida;
}
$records[$this->obtenerFilaDeBonoTransporte()][1] = $this->calcularCantidadBDT();
return $records;
}
public function exportarPedidoConNucleosEnCSV() {
$productos_en_pedido = DB::table('pedidos_aprobados')->where('grupo_de_compra_id',$this->id)->get()->keyBy('producto_id');
// si no hay pedidos aprobados, salir
if ($productos_en_pedido->count() == 0) { \Log::debug("El grupo de compra ". $this->nombre . " no tiene pedidos aprobados."); return; }
if ($productos_en_pedido->count() == 0) {
\Log::debug("El grupo de compra ". $this->nombre . " no tiene pedidos aprobados.");
return;
}
$pedidos = $this->pedidosAprobados();
// Generar tabla vacía con una columna por núcleo
@ -153,9 +193,7 @@ class GrupoDeCompra extends Model
$i = 1;
// Poner cantidad de cada producto para cada núcleo
foreach ($pedidos as $pedido) {
$producto = $pedido->productos()->find($id);
$records[$fila][$i] = $producto == NULL ? 0 : $producto["pivot"]["cantidad"];
$i++;
list($records, $i, $_) = $this->agregarCantidad($pedido, $id, $records, $fila, $i);
}
}
// Insertar lista de núcleos en la primera fila
@ -176,8 +214,26 @@ class GrupoDeCompra extends Model
}
}
public function agregarCantidad($pedido, $id, array $records, $fila, int $i): array
{
$producto = $pedido->productos()->find($id);
$cantidad = $producto == NULL ? 0 : $producto->pivot->cantidad;
$records[$fila][$i] = $cantidad;
$i++;
return array($records, $i, $cantidad);
}
public static function exportarTodosLosPedidosEnCSV(){
$gdcs=GrupoDeCompra::all();
foreach ($gdcs as $gdc){ $gdc->exportarPedidoEnCSV(); }
$gdcs = GrupoDeCompra::all();
$planilla = GrupoDeCompra::obtenerTemplateDeFilasVacias($gdcs->count());
$planilla = self::getPlanilla($gdcs, $planilla);
// Guardar en un archivo .csv
try {
$writer = Writer::createFromPath(resource_path('csv/exports/total-pedidos.csv'), 'w');
$writer->insertAll($planilla);
} catch (CannotInsertRecord $e) {
var_export($e->getRecords());
}
}
}

View File

@ -1,9 +0,0 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class PedidoController extends Controller
{
}

View File

@ -31,7 +31,9 @@ class LoginController extends Controller
protected function authenticated(Request $request, $user)
{
if ($user->is_admin) {
if ($user->is_compras) {
return redirect('compras/pedidos');
} else if ($user->is_admin) {
session(['admin_gdc' => $user->grupo_de_compra_id]);
return redirect('admin/pedidos');
} else {

View File

@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers;
use App\GrupoDeCompra;
class ComprasController
{
public function indexPedidos() {
return view('compras_pedidos');
}
public function descargarPedidos() {
GrupoDeCompra::exportarTodosLosPedidosEnCSV();
$file = resource_path('csv/exports/total-pedidos.csv');
return response()->download($file);
}
public function show()
{
return view('auth/compras_login');
}
}

View File

@ -57,6 +57,7 @@ class Kernel extends HttpKernel
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'admin' => \App\Http\Middleware\Admin::class,
'compras' => \App\Http\Middleware\Compras::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,

View File

@ -0,0 +1,29 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class Compras
{
/**
* Handle an incoming request.
*
* @param Request $request
* @param Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
if (!Auth::check())
return redirect()->route('compras_login.show');
if (Auth::user()->is_compras) {
return $next($request);
} else {
return response('Necesitás ser de comisión compras para hacer esto', 403);
}
}
}

View File

@ -38,14 +38,14 @@ class Producto extends Model
return $request->has('paginar') && intval($request->input('paginar')) ? intval($request->input('paginar')) : self::$paginarPorDefecto;
}
public static function productosIDFila() {
return Producto::pluck('fila', 'id',)->all();
}
public static function productosFilaID() {
return Producto::pluck('id', 'fila',)->all();
}
public static function productosIDFila() {
return Producto::pluck('fila', 'id',)->all();
}
public static function productosIDNombre() {
return Producto::pluck('nombre', 'id',)->all();
}

View File

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AgregarIsComprasAUser extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->boolean('is_compras')->after('is_admin')->default(0);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('producto_subpedido', function (Blueprint $table) {
$table->dropColumn('is_compras');
});
}
}

5
resources/js/app.js vendored
View File

@ -4,7 +4,6 @@
* building robust, powerful web applications using Vue and Laravel.
*/
import axios from 'axios';
import animate from 'animate.css';
import Vue from 'vue';
window.Vue = require('vue');
window.Event = new Vue();
@ -18,8 +17,8 @@ window.bulmaToast = require('bulma-toast');
*
* Eg. ./components/ExampleComponent.vue -> <example-component></example-component>
*/
const files = require.context('./', true, /\.vue$/i)
files.keys().map(key => Vue.component(key.split('/').pop().split('.')[0], files(key).default))
import './components';
/**
* Constants
*/

25
resources/js/components.js vendored Normal file
View File

@ -0,0 +1,25 @@
import Vue from 'vue';
const requireComponent = require.context('./components', true, /\.vue$/);
// Registro automático de componentes:
// e.g. components/foo/bar/UnComponente.vue
// se registra como 'foo-bar-un-componente'
requireComponent.keys().forEach(fileName => {
// Get the component config
const componentConfig = requireComponent(fileName);
// Get the PascalCase name of the component
const componentName = fileName
.replace(/^\.\/(.*)\.\w+$/, '$1') // Remove "./" from the beginning and the file extension from the end
.replace(/\//g, '-') // Replace directories with hyphens
.replace(/([a-z])([A-Z])/g, '$1-$2') // Insert hyphen between camelCase words
.toLowerCase() // Convert to lowercase
// Globally register the component
Vue.component(
componentName,
// Look for the component options on `.default`, which will
// exist if the component was exported with `export default`,
// otherwise fall back to module's root.
componentConfig.default || componentConfig
);
});

View File

@ -1,31 +0,0 @@
<template>
<div class="columns ml-3 mr-3">
<categorias-container :class="chismosaActiva ? 'hide-below-1024' : ''"></categorias-container>
<productos-container :class="chismosaActiva ? 'hide-below-1024' : ''"></productos-container>
<chismosa v-show="chismosaActiva"></chismosa>
</div>
</template>
<script>
import Chismosa from './Chismosa.vue';
import ProductosContainer from './ProductosContainer.vue';
import CategoriasContainer from './CategoriasContainer.vue';
export default {
componets: {
Chismosa,
ProductosContainer,
CategoriasContainer,
},
data() {
return {
chismosaActiva: false,
}
},
mounted() {
Event.$on('toggle-chismosa', (activa) => {
this.chismosaActiva = activa;
});
},
}
</script>

View File

@ -1,15 +1,15 @@
<template>
<div class="block ml-3 mr-3 is-max-widescreen is-max-desktop">
<pedidos-admin-tabs-secciones></pedidos-admin-tabs-secciones>
<admin-tabs-secciones></admin-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">
<pedidos-admin-dropdown-descargar
<admin-dropdown-descargar
:gdc="gdc">
</pedidos-admin-dropdown-descargar>
<pedidos-admin-tabla-pedidos
</admin-dropdown-descargar>
<admin-tabla-pedidos
:pedidos="pedidos" :bonosDeTransporte="bonosDeTransporte" :totalBonosBarriales="totalBonosBarriales">
</pedidos-admin-tabla-pedidos>
</admin-tabla-pedidos>
</div>
<p class="has-text-centered" v-show="!hayPedidos">
Todavía no hay ningún pedido para administrar.
@ -17,35 +17,34 @@
</div>
<div class="block pb-6" id="bonos-seccion"
:class="seccionActiva === 'bonos-seccion' ? 'is-active' : 'is-hidden'">
<pedidos-admin-tabla-bonos v-show="hayAprobados"
<admin-tabla-bonos v-show="hayAprobados"
:pedidos="pedidos">
</pedidos-admin-tabla-bonos>
</admin-tabla-bonos>
<p class="has-text-centered" v-show="!hayAprobados">
Todavía no hay pedidos aprobados.
</p>
</div>
<div class="block pb-6" id="caracteristicas-seccion"
:class="seccionActiva === 'caracteristicas-seccion' ? 'is-active' : 'is-hidden'">
<pedidos-admin-caracteristicas-opcionales>
</pedidos-admin-caracteristicas-opcionales>
<admin-caracteristicas-opcionales>
</admin-caracteristicas-opcionales>
</div>
</div>
</template>
<script>
import PedidosAdminTabsSecciones from './PedidosAdminTabsSecciones.vue';
import PedidosAdminDropdownDescargar from "./PedidosAdminDropdownDescargar.vue";
import PedidosAdminTablaBonos from './PedidosAdminTablaBonos.vue';
import PedidosAdminTablaPedidos from "./PedidosAdminTablaPedidos.vue";
import PedidosAdminCaracteristicasOpcionales from "./PedidosAdminCaracteristicasOpcionales.vue";
import CaracteristicasOpcionales from "./CaracteristicasOpcionales.vue";
import TabsSecciones from "./TabsSecciones.vue";
import DropdownDescargar from "./DropdownDescargar.vue";
import TablaPedidos from "./TablaPedidos.vue";
import TablaBonos from "./TablaBonos.vue";
export default {
name: "PedidosAdminBody",
components: {
PedidosAdminCaracteristicasOpcionales,
PedidosAdminTabsSecciones,
PedidosAdminDropdownDescargar,
PedidosAdminTablaPedidos,
PedidosAdminTablaBonos,
CaracteristicasOpcionales,
TabsSecciones,
DropdownDescargar,
TablaPedidos,
TablaBonos,
},
data() {
return {

View File

@ -10,13 +10,3 @@
</a>
</div>
</template>
<script>
export default {
name: "BotonAdminLogin"
}
</script>
<style scoped>
</style>

View File

@ -1,10 +1,8 @@
<script>
import axios from "axios";
import PedidosAdminFilaCaracteristica from "./PedidosAdminFilaCaracteristica.vue";
import FilaCaracteristica from "./FilaCaracteristica.vue";
export default {
name: "PedidosAdminCaracteristicasOpcionales",
components: {PedidosAdminFilaCaracteristica},
components: { FilaCaracteristica },
data() {
return {
caracteristicas: [
@ -21,7 +19,6 @@ export default {
<template>
<div class="block">
<table class="table is-fullwidth is-striped is-bordered">
<thead>
<tr>
@ -30,11 +27,11 @@ export default {
</tr>
</thead>
<tbody>
<pedidos-admin-fila-caracteristica
<admin-fila-caracteristica
v-for="(c,i) in caracteristicas"
:key="i"
:caracteristica="c">
</pedidos-admin-fila-caracteristica>
</admin-fila-caracteristica>
</tbody>
</table>
</div>

View File

@ -31,7 +31,6 @@
<script>
export default {
name: "PedidosAdminDropdownDescargar",
props: {
gdc: {
type: Number,
@ -54,4 +53,4 @@ export default {
<style>
</style>
</style>

View File

@ -2,11 +2,10 @@
import axios from "axios";
export default {
name: "PedidosAdminFilaCaracteristica",
props: {
caracteristica: Object
},
data: {
data() {
gdc: undefined
},
watch: {

View File

@ -5,19 +5,18 @@
<td v-if="$root.devoluciones" class="has-text-right" ><abbr :title="pedido.devoluciones_notas">-{{ pedido.devoluciones_total }}</abbr></td>
<td class="has-text-right" >{{ $root.devoluciones ? pedido.total_menos_devoluciones : pedido.total }}</td>
<td>
<pedidos-admin-switch-aprobacion
<admin-switch-aprobacion
:pedido="pedido">
</pedidos-admin-switch-aprobacion>
</admin-switch-aprobacion>
</td>
</tr>
</template>
<script>
import PedidosAdminSwitchAprobacion from './PedidosAdminSwitchAprobacion.vue';
import SwitchAprobacion from "./SwitchAprobacion.vue";
export default {
name: "PedidosAdminFilaPedido",
components: {
PedidosAdminSwitchAprobacion
SwitchAprobacion
},
props: {
pedido: Object

View File

@ -24,7 +24,6 @@
<script>
export default {
name: "LoginAdmin",
data() {
return {
visible: false,

View File

@ -12,7 +12,6 @@
<script>
export default {
name: "PedidosAdminSwitchAprobacion",
props: {
pedido: Object
},

View File

@ -39,7 +39,6 @@
<script>
export default {
name: "PedidosAdminTablaBonos",
props: {
pedidos: {
type: Array,
@ -95,4 +94,4 @@ export default {
<style>
</style>
</style>

View File

@ -11,10 +11,10 @@
</tr>
</thead>
<tbody>
<pedidos-admin-fila-pedido
<admin-fila-pedido
v-for="pedido in this.pedidos"
:pedido="pedido" :key="pedido.id">
</pedidos-admin-fila-pedido>
</admin-fila-pedido>
</tbody>
</table>
<table class="table is-striped is-bordered">
@ -46,11 +46,10 @@
</template>
<script>
import PedidosAdminFilaPedidoVue from './PedidosAdminFilaPedido.vue';
import FilaPedido from "./FilaPedido.vue";
export default {
name: "PedidosAdminTablaPedidos",
components: {
PedidosAdminFilaPedidoVue
FilaPedido
},
props: {
pedidos: {

View File

@ -19,7 +19,6 @@
<script>
export default {
name: "PedidosAdminTabsSecciones",
data() {
return {
tabActiva: "pedidos",
@ -49,7 +48,7 @@ export default {
</script>
<style lang="scss" scoped>
@import 'bulma';
@import '../../../../node_modules/bulma';
hr {
border: none;
height: 1px;

View File

@ -0,0 +1,22 @@
<template>
<div class="container is-fluid has-text-centered">
<div class="block">
<div class="field">
<p class="control">
<a href="/compras/pedidos/descargar" class="button">
<span class="icon is-small">
<i class="fas fa-download"></i>
</span>
<span>Descargar planilla de totales</span>
</a>
</p>
</div>
</div>
</div>
</template>
<script>
export default {
}
</script>

View File

@ -0,0 +1,52 @@
<template>
<div class="block">
<div class="field">
<label class="label">Usuario</label>
<div class="field">
<div class="control">
<input required class="input" type="text" name="name" placeholder="Usuario">
</div>
</div>
</div>
<div class="field">
<label class="label">Contraseña</label>
<div class="field has-addons">
<div class="control">
<input required class="input" :type="this.passwordType" name="password" placeholder="Contraseña">
</div>
<div class="control">
<a class="button is-dark" @click="togglePassword">
{{ (passwordVisible ? 'Ocultar' : 'Mostrar') + ' contraseña'}}
</a>
</div>
</div>
</div>
<div class="field">
<div class="control">
<input type="submit" class="button is-dark" value="Ingresar"/>
</div>
</div>
</div>
</template>
<script>
export default {
name: "LoginAdmin",
data() {
return {
passwordVisible: false,
passwordType: "password",
}
},
methods: {
togglePassword() {
if (this.passwordVisible) this.passwordType = "password";
else this.passwordType = "text"
this.passwordVisible = !this.passwordVisible
}
}
}
</script>
<style>
</style>

View File

@ -11,7 +11,7 @@
<p class="navbar-item">
<slot name="subpedido"></slot>
</p>
<chismosa-dropdown v-if="this.$root.pedido != null" class="hide-above-1023" id="mobile"></chismosa-dropdown>
<pedidos-chismosa-dropdown v-if="this.$root.pedido != null" class="hide-above-1023" id="mobile"></pedidos-chismosa-dropdown>
<a role="button" class="navbar-burger" :class="{'is-active':burgerActiva}" aria-label="menu" aria-expanded="false" data-target="nav-bar" @click="toggleBurger">
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
@ -28,7 +28,7 @@
</a>
<input class="input is-small" type="text" placeholder="Harina" v-model="searchString" @keyup.enter="buscar" >
</div>
<chismosa-dropdown v-if="this.$root.pedido != null" class="hide-below-1024" id="wide"></chismosa-dropdown>
<pedidos-chismosa-dropdown v-if="this.$root.pedido != null" class="hide-below-1024" id="wide"></pedidos-chismosa-dropdown>
<div class="block navbar-item">
<a onclick="event.preventDefault(); document.getElementById('logout-form').submit();" class="text-a">
Cerrar sesión
@ -41,7 +41,7 @@
</template>
<script>
import ChismosaDropdown from './ChismosaDropdown.vue';
import ChismosaDropdown from '../pedidos/ChismosaDropdown.vue';
export default {
components: { ChismosaDropdown },
data() {

View File

@ -0,0 +1,22 @@
<template>
<div class="columns ml-3 mr-3">
<pedidos-categorias-container :class="chismosaActiva ? 'hide-below-1024' : ''"></pedidos-categorias-container>
<pedidos-productos-container :class="chismosaActiva ? 'hide-below-1024' : ''"></pedidos-productos-container>
<pedidos-chismosa v-show="chismosaActiva"></pedidos-chismosa>
</div>
</template>
<script>
export default {
data() {
return {
chismosaActiva: false,
}
},
mounted() {
Event.$on('toggle-chismosa', (activa) => {
this.chismosaActiva = activa;
});
},
}
</script>

View File

@ -34,7 +34,7 @@
</tr>
</tfoot>
<tbody>
<producto-row v-for="producto in productos" :producto="producto" :key="producto.id"></producto-row>
<pedidos-producto-row v-for="producto in productos" :producto="producto" :key="producto.id"></pedidos-producto-row>
</tbody>
</table>
<p class="has-text-centered" v-show="!mostrar_tabla">
@ -99,4 +99,4 @@
max-height: 81vh;
margin-right: 20px;
}
</style>
</style>

View File

@ -8,7 +8,7 @@
</div>
<div class="control">
<a class="button is-info" @click="togglePassword">
{{ (passwordVisible ? 'Ocultar' : 'Mostrar') + ' contraseña'}}
{{ (passwordVisible ? 'Ocultar' : 'Mostrar') + ' contraseña'}}
</a>
</div>
</div>
@ -24,7 +24,6 @@
<script>
export default {
name: 'Login',
data() {
return {
visible: false,

View File

@ -1,11 +1,6 @@
<script>
import ProductoCantidad from './Producto/ProductoCantidad.vue';
export default {
name: "ProductoCard",
components: {
ProductoCantidad,
},
props: {
producto: Object
},
@ -73,7 +68,7 @@ export default {
</div>
<footer class="columns">
<div class="column is-three-quarters">
<producto-cantidad :producto="producto"></producto-cantidad>
<pedidos-producto-cantidad :producto="producto"></pedidos-producto-cantidad>
</div>
<div class="column">
<p class="subtitle is-7 is-hidden-mobile" v-if="enChismosa !== 0">{{ enChismosa }} en chismosa</p>
@ -84,7 +79,7 @@ export default {
</template>
<style lang="scss" scoped>
@use "bulma/sass/utilities/mixins";
@use "../../../../node_modules/bulma/sass/utilities/mixins";
@include mixins.until(mixins.$desktop) {
.hidden-until-desktop {

View File

@ -2,18 +2,13 @@
<tr>
<td>{{ this.producto.nombre }}</td>
<td class="has-text-right">
<producto-cantidad :producto="producto"></producto-cantidad>
<pedidos-producto-cantidad :producto="producto"></pedidos-producto-cantidad>
</td>
<td class="has-text-right">{{ Math.ceil(this.producto.pivot.total) }}</td>
</tr>
</template>
<script>
import ProductoCantidad from './Producto/ProductoCantidad.vue';
export default {
components: {
ProductoCantidad,
},
props: {
producto: Object
},

View File

@ -1,17 +1,14 @@
<template>
<div v-show="visible" class="column">
<div class="columns is-multiline is-mobile">
<producto-card v-for="(producto,i) in productos" :key="i" :producto="producto">
</producto-card><!-- END BLOCK COLUMN -->
<pedidos-producto-card v-for="(producto,i) in productos" :key="i" :producto="producto">
</pedidos-producto-card><!-- END BLOCK COLUMN -->
</div><!-- END COLUMNS -->
</div><!-- END CONTAINER -->
</template>
<script>
import ProductoCard from "./ProductoCard.vue";
export default {
components: {ProductoCard},
data() {
return {
productos: [],
@ -50,4 +47,5 @@ export default {
return params
},
}
}</script>
}
</script>

View File

@ -21,11 +21,11 @@
Contraseña incorrecta, intentalo nuevamente.
</div>
@enderror
<region-select v-bind:admin="true"></region-select>
<comunes-region-select v-bind:admin="true"></comunes-region-select>
<form method="post" action="login">
@csrf
<barrio-select v-bind:admin="true"></barrio-select>
<login-admin></login-admin>
<comunes-barrio-select v-bind:admin="true"></comunes-barrio-select>
<admin-login></admin-login>
</form>
</div>
</section>

View File

@ -1,13 +1,5 @@
@extends('layouts.app')
@section('content')
<pedidos-admin-body></pedidos-admin-body>
<admin-body></admin-body>
@endsection
<script>
import PedidosAdminBody from "../../js/components/PedidosAdminBody.vue";
export default {
components: {
PedidosAdminBody
}
}
</script>

View File

@ -0,0 +1,33 @@
<!DOCTYPE html>
<html class="has-background-warning" lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ config('app.name', 'Pedidos del MPS') }}</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.3/css/bulma.min.css">
<link rel="stylesheet" href="{{ mix('css/app.css') }}">
<script src="https://kit.fontawesome.com/9235d1c676.js" crossorigin="anonymous"></script>
</head>
<body>
<section class="section">
<div id="root" class="container">
<h1 class="title">
Pedidos MPS
</h1>
<p class="subtitle">
Bienvenidx a la sección de compras de la aplicación del <strong>Mercado Popular de Subsistencia</strong>
</p>
@error('name')
<div class="notification is-danger">
Contraseña incorrecta, intentalo nuevamente.
</div>
@enderror
<form method="post" action="login">
@csrf
<compras-login></compras-login>
</form>
</div>
</section>
<script src="{{ mix('js/app.js') }}" defer></script>
</body>
</html>

View File

@ -11,7 +11,7 @@
<body>
<section class="section">
<div id="root" class="container">
<boton-admin-login></boton-admin-login>
<admin-boton-login></admin-boton-login>
<h1 class="title">
Pedidos MPS
</h1>
@ -23,20 +23,14 @@
Contraseña incorrecta, intentalo nuevamente.
</div>
@enderror
<region-select></region-select>
<comunes-region-select></comunes-region-select>
<form method="post" action="login">
@csrf
<barrio-select></barrio-select>
<login></login>
<comunes-barrio-select></comunes-barrio-select>
<pedidos-login></pedidos-login>
</form>
</div>
</section>
<script src="{{ mix('js/app.js') }}" defer></script>
</body>
</html>
<script>
import BotonAdminLogin from "../../js/components/BotonAdminLogin";
export default {
components: {BotonAdminLogin}
}
</script>

View File

@ -0,0 +1,5 @@
@extends('layouts.app')
@section('content')
<compras-body></compras-body>
@endsection

View File

@ -19,7 +19,7 @@
</head>
<body class="has-navbar-fixed-top">
<div id="root">
<nav-bar>
<comunes-nav-bar>
<template slot="subpedido">{{ session('subpedido_nombre') ? 'Pedido de '. session('subpedido_nombre') : Auth::user()->name }}</template>
<template slot="gdc">{{ session('subpedido_nombre') ? Auth::user()->name : "" }}</template>
<template slot="logout-form">
@ -27,11 +27,11 @@
@csrf
</form>
</template>
</nav-bar>
<nav-migas></nav-migas>
</comunes-nav-bar>
<pedidos-nav-migas></pedidos-nav-migas>
<main id="main" class="py-4 has-top-padding">
<cartel-pedido-aprobado></cartel-pedido-aprobado>
<pedidos-cartel-pedido-aprobado></pedidos-cartel-pedido-aprobado>
@yield('content')
</main>
</div>

View File

@ -1,6 +1,6 @@
@extends('layouts.app')
@section('content')
<pedido-body></pedido-body>
<devoluciones-modal></devoluciones-modal>
<pedidos-body></pedidos-body>
<pedidos-devoluciones-modal></pedidos-devoluciones-modal>
@endsection

View File

@ -9,7 +9,7 @@
<p class="subtitle">
Bienvenidx a la aplicación de pedidos del <strong>Mercado Popular de Subsistencia</strong>
</p>
<subpedido-select gdcid="{{Auth::user()->grupoDeCompra->id}}"></subpedido-select>
<pedidos-subpedido-select gdcid="{{Auth::user()->grupoDeCompra->id}}"></pedidos-subpedido-select>
</div>
</section>
@endsection

View File

@ -75,3 +75,10 @@ Route::middleware('auth')->group( function() {
})->name('obtenerSesion');
});
});
Route::get('/compras', 'ComprasController@show')->name('compras_login.show');
Route::middleware(['compras'])->group( function() {
Route::get('/compras/pedidos', 'ComprasController@indexPedidos')->name('compras.pedidos');
Route::get('/compras/pedidos/descargar', 'ComprasController@descargarPedidos')->name('compras.pedidos.descargar');
});