Compare commits

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

834 commits

Author SHA1 Message Date
0f8e58841e Merge pull request 'funcion/actualizaciones' (#48) from funcion/actualizaciones into master
Reviewed-on: nathalie/pedi2#48
2025-08-27 19:09:03 -03:00
ale
63ce45f903 Merge branch 'master' into funcion/actualizaciones
# Conflicts:
#	package-lock.json
#	package.json
2025-08-12 15:29:33 -03:00
965a9c7cfc Merge pull request 'Usando v-if y v-else en vez de v-show' (#51) from funcion/arreglos-ollas into master
Reviewed-on: nathalie/pedi2#51
2025-08-12 15:14:58 -03:00
ale
d343be346e Usando v-if y v-else en vez de v-show 2025-08-12 15:13:27 -03:00
c1bff4e8a9 Merge pull request 'funcion/arreglos-ollas' (#50) from funcion/arreglos-ollas into master
Reviewed-on: nathalie/pedi2#50
2025-08-12 15:06:40 -03:00
ale
6258853ec4 Arreglado pedido de ollas a lista de pedidos en pdf 2025-08-12 15:05:53 -03:00
ale
595c0893c5 Arreglado modal de devoluciones 2025-08-12 14:57:41 -03:00
ale
7ade1b18f1 Arreglada nav bar de ollas 2025-08-12 14:54:17 -03:00
ale
5aadfe6753 Cambio a lang="es" 2025-08-05 19:06:59 -03:00
ale
5711c28f56 Arreglo chismosa en celular 2025-08-04 21:56:44 -03:00
ale
786ab8cb98 Estilo 2025-08-03 13:02:50 -03:00
ale
6c49a4dca0 Log de error 2025-08-03 12:34:01 -03:00
ale
9cc82a9171 Mejor manejo de errores 2025-08-03 12:30:55 -03:00
nathalie
e61c3f6d4b Agregado webpack 2025-08-03 12:07:34 -03:00
bb07289bcc Merge pull request 'funcion/saldos' (#49) from funcion/saldos into master
Reviewed-on: nathalie/pedi2#49
2025-08-03 11:40:14 -03:00
ale
e0f55661a4 Agregada planilla de ejemplo para saldos 2025-08-03 11:38:32 -03:00
ale
76239ee7dd Cambio texto de saldo para casos positivo y negativo 2025-08-03 11:31:55 -03:00
ale
53e75ae357 Arreglo lógica para no generar muchas veces el pedido de ollas 2025-08-03 11:01:39 -03:00
ale
bcc4f4a28a Metodo para obtener id de tipo_pedido y arreglada query de pedidos de ollas para levantar solo los barrios con pedidos de ollas 2025-08-03 11:01:15 -03:00
ale
66298228e3 Parámetro de ollas actualizado 2025-08-03 10:57:04 -03:00
ale
9ee6de7877 Sacado calculo del front 2025-07-31 20:14:09 -03:00
ale
8362cacc84 Arreglada vulenarbilidad critica 2025-07-31 20:11:14 -03:00
ale
e029c42c0a Cambio nombres de opciones 2025-07-31 19:58:40 -03:00
ale
596ac50e60 .env.example actualizado 2025-07-31 19:47:22 -03:00
ale
f6de37a1eb Readme actualizado 2025-07-31 19:44:25 -03:00
ale
9d98a5cd5b Readme actualizado 2025-07-31 19:41:27 -03:00
ale
4062f4b786 Cambio de nombre de usuario de comisiones a 'comision' 2025-07-31 19:36:28 -03:00
ale
bd92c26b0a Cambio de estilos 2025-07-31 19:36:11 -03:00
ale
6ea534932f Agregado rol de ollas 2025-07-31 19:36:06 -03:00
ale
96516a5083 Centralizada logica para mostrar categorias o productos 2025-07-20 11:47:25 -03:00
ale
9c07a91914 Quitada '/' al final de la ruta 2025-07-20 11:18:31 -03:00
ale
d5e70dc291 Merge branch 'master' into funcion/actualizaciones
# Conflicts:
#	package-lock.json
#	resources/js/components/comisiones/Body.vue
#	resources/js/store/modules/comisiones/index.ts
#	resources/js/store/modules/pedido/index.ts
2025-07-20 11:08:48 -03:00
45a7688fbd Merge pull request 'funcion/pedido-ollas' (#47) from funcion/pedido-ollas into master
Reviewed-on: nathalie/pedi2#47
Reviewed-by: Rodrigo <rodrigopdm@protonmail.com>
2025-07-15 11:27:29 -03:00
ale
4d05edd9c3 Merge branch 'master' into funcion/pedido-ollas 2025-07-08 22:47:29 -03:00
ale
cc6fe6878a Agregada cantidad de ollas a planilla de ollas 2025-07-08 22:46:09 -03:00
ale
7f59b9a2ff Borrada variable no usada 2025-07-08 21:42:45 -03:00
ale
148e54356c Contraseña hardcodeada 2025-07-08 21:38:20 -03:00
ale
87c3bb207f Inicializando pedido de ollas con 0 ollas 2025-07-08 21:21:02 -03:00
ale
d7c3ed857c Import 2025-07-08 21:20:41 -03:00
ale
b0ac8f538c Quitado codigo para settear en 0 la cantidad de ollas al crear la columna 2025-07-08 21:20:34 -03:00
ale
7a7cd678ad Creando tipo pedido ollas en la migracion 2025-07-08 21:20:11 -03:00
ale
e9a6def7c1 Arreglado seeder 2025-07-08 21:08:19 -03:00
ale
53dc4d735e npm install 2025-07-08 21:05:20 -03:00
ale
a74f89f684 Agregado seeder de usuarios de ollas 2025-07-08 21:05:12 -03:00
ale
dd463a6a79 Aplanados productos en admin y pedido + movidos tipos y logica compartida a comunes.ts 2025-07-08 20:45:59 -03:00
ale
35e1d6455e Eliminado comunes 2025-07-08 20:24:34 -03:00
ale
572a8cf3be Arreglados tipos e imports 2025-07-08 20:24:23 -03:00
ale
b976826bf5 Extendida interfaz de window 2025-07-08 20:23:50 -03:00
ale
da4fd472ae Quitado import no usado 2025-07-08 20:23:38 -03:00
ale
89f886e32c Eliminado archivo ya no usado 2025-07-08 20:23:23 -03:00
ale
92d6bc2035 Agregado tipo para productos sin pivot 2025-07-08 20:01:18 -03:00
ale
fee23f389c Arreglos de tipos 2025-07-08 19:45:41 -03:00
ale
7619196179 Tipos para modulos de vuex 2025-07-08 19:31:09 -03:00
ale
537bfd52ff Cambio a typescript 2025-07-08 19:26:19 -03:00
ale
3a313d033d Agregados archivos para typescript 2025-07-08 19:25:59 -03:00
ale
cee049c545 Cambio de orden 2025-07-08 17:55:57 -03:00
ale
0207fca0cc Instalado typesxcript 2025-07-08 17:50:54 -03:00
ale
ed89065faf npm update 2025-07-08 17:43:23 -03:00
ale
502aefd7a8 Movida lógica para registrar componentes a app.js y cambios para vite 2025-07-08 16:18:37 -03:00
ale
44f0d8c66b Cambio imports 2025-07-08 16:17:53 -03:00
ale
03475daa99 Usando vite 2025-07-08 16:17:39 -03:00
ale
aa75e3de79 Agregado contenedor y configuracion de rutas para vite 2025-07-08 16:17:27 -03:00
ale
21b16e0243 Instalado vite 2025-07-08 16:17:08 -03:00
ale
e0d17e052b Quitado import 2025-07-08 16:16:45 -03:00
ale
e3b17eea4a Cambio nombre y arreglo import 2025-07-08 16:15:32 -03:00
ale
5e54d2afea Actualizado axios, laravel-mix, vue, vue-loader, vue-template-compiler 2025-07-08 13:59:28 -03:00
ale
9a57a826dc Arreglado error de herencia de Model 2025-07-08 13:58:53 -03:00
ale
a1aa381052 Arreglado nombre 2025-07-08 13:35:42 -03:00
ale
ea9a9e2195 composer dump-autoload, install and update 2025-07-08 13:35:37 -03:00
ale
251dbd1120 Estilo 2025-07-08 13:29:38 -03:00
ale
98120f1ce9 Actualizado a laravel 12 (con nunomaduro/collision) 2025-07-08 13:27:55 -03:00
ale
71c4b166be Actualizado a laravel 11 (sin nunomaduro) 2025-07-08 13:25:39 -03:00
ale
c35eb49001 Actualizado a laravel 10 2025-07-07 18:15:07 -03:00
ale
0cdb491246 Usando cors nativo 2025-07-07 18:09:43 -03:00
ale
01cf18b540 Arreglo de constante deprecada 2025-07-07 18:04:21 -03:00
ale
8dba92e8c1 Re-agregados paquetes sacados para el update 2025-07-07 18:00:16 -03:00
ale
c602742e33 Actualizado a laravel 9 2025-07-07 17:59:28 -03:00
ale
a4951bfdfd Actualizado a laravel 8 2025-07-07 17:29:56 -03:00
ale
88c82d9439 PHP actualizado 2025-07-04 15:25:07 -03:00
ale
929191f173 Agregados mensajes para exito y error al cambiar la cantidad de ollas 2025-07-02 00:33:27 -03:00
ale
08bdbe0ee1 Usando parametros para transporte 2025-07-01 19:30:36 -03:00
ale
9f4afd1bac Agregado monto transporte 2025-06-29 23:07:21 -03:00
ale
c7834fa9d2 Eliminados métodos no usados 2025-06-29 22:40:36 -03:00
ale
21d28c6a5b Agregado pedidos de ollas 2025-06-29 22:33:59 -03:00
ale
546eceaefd Metodo y ruta para pedidos de ollas 2025-06-29 22:32:37 -03:00
ale
bc70e28127 Agregado método para pedidos de ollas 2025-06-29 22:29:21 -03:00
ale
f6f565b6bd Agregado helper para exportar pedidos en csv 2025-06-29 22:26:53 -03:00
ale
eaae5d02ea Cambio de timezone 2025-06-29 22:26:05 -03:00
ale
f961601184 Cambio nombre 2025-06-29 20:05:10 -03:00
ale
e521b4521f Removido whereHas porque rompe el metodo 2025-06-29 17:50:08 -03:00
ale
11d8bd1920 Arreglo nombre de campo 2025-06-29 17:34:49 -03:00
ale
3a6face6ba Cerrando error al mandar version corregida 2025-06-29 17:34:09 -03:00
ale
20c7d33ace Formato 2025-06-29 17:28:25 -03:00
ale
9c234107e8 Solo mostrar input the cantidad de ollas para pedidos de ollas 2025-06-29 17:28:10 -03:00
ale
6d55b77a95 Cambio estilo comisiones 2025-06-29 16:36:11 -03:00
ale
e7a8d89a29 Cambio cantidad ollas, ahora es una solapa toggleable que baja desde las migas 2025-06-25 14:53:55 -03:00
ale
b1fb744684 Simplificado 2025-06-23 23:47:15 -03:00
ale
c84ab5f475 Estilo 2025-06-23 23:36:41 -03:00
ale
86bf66ebcd Cambiada información de total a chismosa 2025-06-23 23:15:57 -03:00
ale
7c2f592072 Estilo 2025-06-23 23:00:42 -03:00
ale
7c8c5ad60d Estilo 2025-06-23 22:53:32 -03:00
ale
e49c043231 Estilo 2025-06-23 22:49:49 -03:00
ale
a0ee4131c8 Agregada lógica de cantidad de ollas 2025-06-23 22:49:28 -03:00
ale
5a1d95c636 Api de ollas movido a web 2025-06-23 22:49:02 -03:00
ale
d261506775 Arreglada columna 2025-06-23 22:48:51 -03:00
ale
e58e19bfe1 Adaptada logica para usar PedidoOllasResource 2025-06-23 21:16:00 -03:00
ale
d86d52a478 Creado PedidoOllasResource 2025-06-23 21:15:30 -03:00
ale
0e42cf2c14 Agregado drop 2025-06-23 20:49:57 -03:00
ale
200c38cb29 Agregada columna y campo cantidad_ollas 2025-06-23 20:45:00 -03:00
ale
60c327f74b Agregado aviso de monto superado 2025-06-23 20:44:40 -03:00
ale
309ce637c8 Tipado de totales 2025-06-23 20:13:45 -03:00
ale
5c059057b9 formato 2025-06-23 20:12:44 -03:00
ale
8fa3f78280 Agregado modulo de ollas y logica para calcular monto total 2025-06-23 19:45:23 -03:00
ale
b6cd844ffd Cambio null por [] en productos 2025-06-23 19:36:03 -03:00
ale
3c14055006 Manejo de errores 2025-06-23 19:12:29 -03:00
ale
e37aa25b3d Agregados seccion, fila, y logica para obtener y modificar parametros desde comisiones 2025-06-23 19:12:19 -03:00
ale
d87091846d Agregados metodos, ruta, y csv para parametros de la aplicacion 2025-06-23 19:11:49 -03:00
ale
f520578525 Solo barrios con pedidos aprobados 2025-06-23 16:55:20 -03:00
ale
aaeee70c9e eliminada carpeta no uasda 2025-06-23 16:37:44 -03:00
ale
05dc58710d estilos 2025-06-23 16:34:07 -03:00
ale
5020d406bf formato 2025-06-23 16:20:15 -03:00
ale
6d6d8d4387 Cambio de nombre y movida burger 2025-06-23 16:18:28 -03:00
Rodrigo
116875b769 Ajuste visual al login 2025-06-21 16:23:48 -03:00
ale
ee96d89e55 Limpieza 2025-06-20 17:42:41 -03:00
ale
5d7d533083 Agregado input para cantidad de ollas 2025-06-20 17:34:46 -03:00
ale
b1b764fd7c Agregado slot a PedidosMain en vez de cartel aprobado fijo 2025-06-20 17:33:29 -03:00
ale
cc6b0f5a6e Formato + omitiendo pedidos de ollas de metodos que trabajan con pedidos 2025-06-20 17:04:23 -03:00
ale
db87c38e3b Devolviendo solamente pedidos de hogares 2025-06-20 17:03:52 -03:00
ale
8fb810c73f Omitiendo pedido de ollas de métodos que trabajan con pedidos 2025-06-20 17:03:35 -03:00
ale
208cb31b53 Manejo de erroes 2025-06-20 17:03:00 -03:00
ale
db056e7d34 Migas para ollas 2025-06-20 02:00:48 -03:00
ale
8649ff5bbd Cambio nombre 2025-06-20 01:50:17 -03:00
ale
09fce4e96a Agregado filtro de tipo pedido 2025-06-20 01:48:42 -03:00
ale
0ce7b00e90 Formato 2025-06-20 01:37:36 -03:00
ale
0009d4b123 Agregado OllasBody que carga pedido de ollas 2025-06-20 01:37:26 -03:00
ale
9062faf24e Arreglado rol 2025-06-20 01:32:46 -03:00
ale
54d1e6ab36 Agregados casos de ollas 2025-06-20 01:32:38 -03:00
ale
5e69a04d35 Simplificada 2025-06-20 01:32:23 -03:00
ale
b61fdb1fff Agregado has many users 2025-06-20 01:20:46 -03:00
ale
8b86cddb33 Agregado rol de ollas y usuarios para cada barrio 2025-06-20 01:20:29 -03:00
ale
4bbab3a8f9 Usando componentes extraidos + estilos generalizados 2025-06-20 01:06:45 -03:00
ale
2356fe597a Componentes para items de NavBar 2025-06-20 01:05:44 -03:00
ale
bb27698e80 Contenidos de NavBar 2025-06-20 01:05:29 -03:00
ale
5a9d7cb54b Getter de barrio 2025-06-20 01:05:15 -03:00
ale
cdbe38e41b Ruta y control para nombre de user 2025-06-20 00:27:35 -03:00
ale
0397810260 Movida logica de burger a modulo ui 2025-06-20 00:27:23 -03:00
ale
53414643a6 Ruta, controlador y método para pedido de ollas 2025-06-19 23:52:29 -03:00
ale
639f6cff77 Formato 2025-06-19 23:37:44 -03:00
ale
6627118dce Formato 2025-06-19 23:29:38 -03:00
ale
d890d405bd Cambiada validación para chequear nombre solamente en pedidos del mismo tipo 2025-06-19 23:28:15 -03:00
ale
db714a209c quitado parametro tipo_id 2025-06-19 23:16:57 -03:00
ale
eddf2776d0 parametro para tipo de sesion en guardar_sesion 2025-06-19 23:11:35 -03:00
ale
07a71098f4 Definido pedidos main con containers de categorias, productos, chismosa, etc 2025-06-19 22:51:47 -03:00
ale
6501e76507 Formato 2025-06-19 22:49:49 -03:00
ale
06d80eed5a Agregado tipo_id a store subpedido 2025-06-19 22:48:24 -03:00
ale
b68d22380e Logica de tipo simplificada 2025-06-19 22:47:52 -03:00
ale
c56f67ca85 Rutas de login de ollas 2025-06-19 22:32:39 -03:00
ale
7526ab300c Mejoras de estilo y logica de login de ollas 2025-06-19 22:32:16 -03:00
ale
bcadd1f1ae Agregado estilo faltante 2025-06-19 22:25:50 -03:00
ale
2a2ea06875 Agregada información de tipo en SubpedidoResource.php 2025-06-19 21:30:00 -03:00
ale
441007e66b Agregado modelo, tabla, y columna en subpedidos para tipo pedido 2025-06-19 21:29:48 -03:00
78b9d682cc Merge pull request 'funcion/refactor-general' (#45) from funcion/refactor-general into master
Reviewed-on: nathalie/pedi2#45
2025-06-19 21:10:18 -03:00
1115764d81 Merge pull request 'Saldos' (#46) from funcion/saldos into funcion/refactor-general
Reviewed-on: nathalie/pedi2#46
2025-06-19 21:09:26 -03:00
ale
5be87b5c26 Quitado storage_path ya incluido en ruta obtenida de db 2025-06-19 21:02:20 -03:00
ale
670bb39e75 Actualizado nombre de canasta actual con los nuevos path 2025-06-19 18:45:27 -03:00
ale
1498b67200 Usando resource path para canasta ejemplo 2025-06-19 18:45:12 -03:00
ale
a7096e7dc0 Quitado import no usado 2025-06-19 18:36:58 -03:00
ale
422be13c51 Componentes aparte para tabla y fila de saldos 2025-06-19 18:36:49 -03:00
ale
0e63e795e4 Actualizada ruta para saldos 2025-06-19 18:07:56 -03:00
ale
37cdbe5480 Método y modelo para ruta de saldos 2025-06-19 18:07:36 -03:00
ale
de635d1a82 Cambio de ruta a /saldos 2025-06-19 18:07:11 -03:00
ale
9f0319fe48 Quitados imports no usados 2025-06-19 17:17:14 -03:00
ale
8928fb2842 Cambio nombre 2025-06-19 17:17:07 -03:00
ale
c514569acd Movida logica de cargar planilla a comisiones.js, quitados casos en los que el barrio no está en la lista pues son imposibles 2025-06-19 17:04:09 -03:00
ale
0fc370e9d1 Devuelve los barrios al cargar saldos 2025-06-19 16:56:09 -03:00
ale
9332aa33c1 Devuelve no-content al settear saldo 2025-06-19 16:55:48 -03:00
ale
c11331695a Agregado storage_path a ruta de canasta 2025-06-19 16:55:19 -03:00
ale
688abf406d Quitado storage_path por default 2025-06-19 16:29:19 -03:00
ale
ceaddcabc3 Arreglado path 2025-06-19 16:29:07 -03:00
ale
f9a0ee5146 Agregado default a nueva columna 2025-06-19 16:28:21 -03:00
ale
e879daa73e Arreglado field 2025-06-19 16:06:56 -03:00
ale
91225d7796 Usando CsvHelper 2025-06-19 15:32:48 -03:00
ale
a3b6d686d3 Agregado mensaje de error a getRegistros 2025-06-19 15:29:48 -03:00
ale
612abc4378 Eliminado controlador no usado 2025-06-19 15:12:46 -03:00
ale
ac559770c0 Componente aparte para seccion saldos 2025-06-18 19:56:05 -03:00
ale
5c3d68a4e9 Componente aparte para seccion canastas 2025-06-18 19:47:56 -03:00
ale
a497ae134e Agregado espacio abajo 2025-06-18 19:28:28 -03:00
ale
f16b18c8b1 Merge remote-tracking branch 'origin/funcion/saldos' into funcion/saldos
# Conflicts:
#	resources/js/components/comisiones/Body.vue
#	routes/web.php
2025-06-18 19:04:59 -03:00
Rodrigo
665ab517fb Subir saldos como csv 2025-06-18 19:03:32 -03:00
Rodrigo
eee23082db Editor de saldos en compras 2025-06-18 19:02:09 -03:00
Rodrigo
eb1b5bbc2e Comisiones store 2025-06-18 19:01:26 -03:00
Rodrigo
46675f9acf Agregado saldo a grupo de compra 2025-06-18 18:59:16 -03:00
ale
c58824ff52 Cambio de 'pagado' a 'aprobado' 2025-06-18 18:57:20 -03:00
ale
fcb2d2c5bc No se muestra control de devoluciones en pedido aprobado 2025-06-18 18:56:56 -03:00
ale
686fcf3bd5 Muestra producto-cantidad cuando aprobado, quitado mensaje de 'n en chismosa' 2025-06-18 18:43:56 -03:00
ale
c064e80116 Quitado argumento 'undefined' para crear pedidos 2025-06-16 18:21:14 -03:00
ale
f26234c3bf Tags de componentes simplificadas 2025-06-16 18:20:58 -03:00
ale
0173d7bd36 Info tags cerradas en pedido select si no fueron interactuadas 2025-06-16 18:04:28 -03:00
ale
a16487cc3f Logica de infoTags movida a modulo ui 2025-06-16 17:05:18 -03:00
Rodrigo
d9747c9280 Arreglo migas 2025-06-15 16:59:18 -03:00
ale
dbaff75734 Agregada infoTags y sacados datos de canasta de la nav bar 2025-06-15 15:27:54 -03:00
ale
a96adedb82 Formato 2025-06-15 15:27:32 -03:00
Rodrigo
8d50a29355 Merge remote-tracking branch 'origin/funcion/refactor-general' into funcion/saldos
# Conflicts:
#    app/Http/Controllers/ComprasController.php
#    resources/js/components/compras/Body.vue
#    routes/web.php
2025-06-15 13:48:54 -03:00
ale
5b8f9cb694 Arreglo mensaje password comisiones 2025-06-15 13:13:24 -03:00
ale
214292bc8f Arreglo: precio total en vez de cantidad en chismosa 2025-06-15 13:04:53 -03:00
Rodrigo
b752f9e8c5 Subir saldos como csv 2025-06-15 00:19:30 -03:00
Rodrigo
6787dde711 Editor de saldos en compras 2025-06-14 22:46:47 -03:00
Rodrigo
02aba80fc9 Comisiones store 2025-06-14 17:40:40 -03:00
Rodrigo
afddeadeac Agregado saldo a grupo de compra 2025-06-14 17:39:51 -03:00
ale
17148d73f8 Agregada fecha a nombre de archivos exportados (csv y pdf) 2025-06-14 15:55:56 -03:00
ale
a38bceab82 Usando storage_path en vez de resource_path 2025-06-14 15:35:41 -03:00
ale
ff96c104a2 Agregados datos de canasta actual a nav-bar 2025-06-14 13:57:52 -03:00
ale
854278bc99 Agregado método, controller y ruta para obtener datos de canasta actual 2025-06-14 13:36:24 -03:00
ale
197b087097 Todo lo que era 'compras' cambiado a 'comisiones' 2025-06-14 12:58:21 -03:00
ale
5c51653037 Nombres para componentes 2025-06-14 12:58:01 -03:00
ale
a5be67df2e Borrados middleware viejos 2025-06-14 12:57:22 -03:00
ale
d8c8865d13 Merge branch 'master' into funcion/refactor-general 2025-06-14 12:33:01 -03:00
ale
9a310484d6 Cambio de ancho de input de usuario 2025-06-14 12:32:11 -03:00
ale
80b5dc60ac Agregado LoginDropdown a pantalla de login 2025-06-14 12:11:05 -03:00
ale
517e5203c9 Agregado LoginDropdown.vue con opciones de login según urlRol 2025-06-14 12:10:41 -03:00
ale
dbdb97a78e Eliminados métodos no usados y agregado método para opciones de login segun urlRol 2025-06-14 12:10:20 -03:00
ale
79bdb04ce2 Espacios 2025-06-14 12:09:54 -03:00
ale
3503be8e56 Eliminados componentes no usados 2025-06-14 12:09:38 -03:00
ale
faa947e6a7 Eliminadas admin_login y compras_login, usando login genérico 2025-06-13 19:33:17 -03:00
ale
fdd3232345 Usando componente genérico de login en las tres views de auth 2025-06-13 19:28:15 -03:00
ale
b72fc57b8d Componente genérico para login 2025-06-13 19:28:02 -03:00
ale
3cb27c5c30 Cambios de estilo para compras 2025-06-13 19:27:47 -03:00
ale
b4458862f4 Renombrado 2025-06-13 19:27:15 -03:00
ale
7a4aa6d7a0 Agregado height:100% a form 2025-06-13 19:26:59 -03:00
ale
0637b7a208 Agregado getter para nombre 2025-06-13 19:12:36 -03:00
ale
af8879eadd Agregados métodos para obtener textos y estilos de las diferentes pantallas de login 2025-06-13 18:33:55 -03:00
ale
9e93b914ac Agregada altura 100% a html, body y #root 2025-06-13 18:33:34 -03:00
Rodrigo
687768d860 Dockerfile: Descargar última versión de node 2025-06-11 21:42:34 -03:00
ale
1b920093c4 Arreglo alineacion 2025-06-10 19:19:15 -03:00
ale
210c91f3a8 Mejoras estéticas y cambios cuando el pedido está aprobado 2025-06-10 19:09:21 -03:00
ale
2ee7fca584 Cambio por null check 2025-06-10 18:06:43 -03:00
ale
258bccf59b Reseteando ui 2025-05-29 16:51:08 -03:00
ale
ca42526a62 Hover dedito 2025-05-29 16:44:25 -03:00
ale
f484bfff79 Mejoras de estilo de chismosa para tablet y celular 2025-05-29 15:26:55 -03:00
ale
9384d09ff6 Arreglado scroll horizontal en celular y tablet 2025-05-29 15:24:39 -03:00
ale
f460cdd6ce Mejoras de estilo 2025-05-27 23:54:01 -03:00
ale
4b4a284914 Cambio en layout de productos 2025-05-27 23:38:37 -03:00
ale
a641247748 Cambio dinámico de tamaño y alineación 2025-05-27 23:32:27 -03:00
ale
82a518fa1d Mejoras de estilo 2025-05-27 22:28:40 -03:00
ale
deaa65d857 Ya no usa lodash 2025-05-27 20:42:45 -03:00
ale
4af9e53a50 Quitadas dependencias inncesarias y eliminadio bootstrap.js que no se usaba para nada 2025-05-27 20:42:24 -03:00
ale
8d64d85b8b Impidiendo cantidades invalidas 2025-05-27 20:38:12 -03:00
ale
2c720faca7 Cambiado margen derecho 2025-05-27 19:27:19 -03:00
ale
85fa9f1e9b formato 2025-05-27 19:21:43 -03:00
ale
c8d1969352 Migas simplificadas por renderizarse solo despues de que el pedido se defina 2025-05-27 19:21:20 -03:00
ale
1eb77be1d0 Columna definida afuera 2025-05-27 19:19:53 -03:00
ale
3949cf3400 Quitada chismosa 2025-05-27 19:19:33 -03:00
ale
973d099bf1 Layout de columnas para que el cartel de pedido aprobado no desplace la chismosa 2025-05-27 19:19:23 -03:00
ale
802d4d0c0b No se stackean las busquedas 2025-05-27 18:29:44 -03:00
ale
134ed0cd22 Agregadas acciones con argumentos a migas + accion para miga de categoria 2025-05-27 18:21:19 -03:00
ale
2bfcf59f3e Eliminada store de barrio, logica de pedidos existentes pasada a pedido select y datos de grupo de compra pasados a store de pedido 2025-05-27 18:14:00 -03:00
ale
4e197204a9 Agregado nombre 2025-05-27 15:49:24 -03:00
ale
2075bcab0f Usando titulo genérico para login 2025-05-27 15:25:56 -03:00
ale
c0d8392f6e Agregado metodo para titulo genérico de login 2025-05-27 15:25:47 -03:00
ale
ef9a296f5c Simplificado v-if 2025-05-26 18:50:18 -03:00
ale
bc55b4c34f Mejores imports 2025-05-26 18:05:48 -03:00
ale
e779111856 Formato 2025-05-26 18:05:38 -03:00
ale
d6990f8c88 Eliminada tabla bonos 2025-05-26 18:05:17 -03:00
ale
8eb385c67e Formato 2025-05-26 18:00:01 -03:00
ale
2970982c77 SubpedidoSelect mergeado con PedidoSelectSection en PedidoSelect y Pedido renombrado a Canasta 2025-05-26 17:59:57 -03:00
ale
9e63c83126 Quitados comentarios 2025-05-26 17:58:25 -03:00
ale
439f69a30c Agregado total sin devoluciones a resource de grupo de compra 2025-05-26 17:25:35 -03:00
ale
d0ce8e8e23 Navmigas movida a pedidos-body 2025-05-26 17:03:49 -03:00
ale
3b858f5b2b Quitada navbar de app blade, logout form escondida 2025-05-26 17:02:34 -03:00
ale
0512ea9ab2 Agregada miga para volver al select de pedidos 2025-05-26 16:46:39 -03:00
ale
8488d9d6c5 Movida logica de obtener sesion a subpedido select + simplificado elegir pedido + mejores responses de session controller 2025-05-26 16:37:19 -03:00
ale
354045c5df Borrada linea no usada 2025-05-24 14:47:19 -03:00
ale
ae1f8673e7 Metodo para resetear pedido 2025-05-24 14:46:46 -03:00
ale
4f74bf38f9 Metodo y ruta para borrar sesion 2025-05-24 14:46:15 -03:00
ale
8a2539f207 Quitada import no usado 2025-05-24 14:18:05 -03:00
ale
04673b1754 Quitada ruta y metodo no usados 2025-05-24 13:52:19 -03:00
ale
88af33d998 Agregado metodo y ruta para obtener categorias 2025-05-24 13:47:56 -03:00
ale
23af6ccd61 Borrada ruta no usada 2025-05-23 18:30:54 -03:00
ale
777f442118 Metodo toggleDevoluciones en controller 2025-05-23 18:28:09 -03:00
ale
7cae00e613 Quitado import no usado 2025-05-23 18:27:51 -03:00
ale
5a61ca46c5 Quitado password de grupo de compra 2025-05-23 18:27:33 -03:00
ale
e379825fd9 Usando ruta nueva 2025-05-23 18:14:51 -03:00
ale
6b2da42160 v-if simplificado 2025-05-23 18:14:11 -03:00
ale
48cf57a6d8 Agregada ruta y metodo para obtener barrios de una region 2025-05-23 17:56:46 -03:00
ale
aa545ff82a Eliminadas views no usadas 2025-05-23 17:40:05 -03:00
ale
b29d63ed4d Quitado import no usado 2025-05-23 17:32:38 -03:00
ale
1e91f443a7 Rutas de sesion movidas a /pedido 2025-05-23 17:16:19 -03:00
ale
6782b7f675 Limpiadas rutas no usadas 2025-05-23 17:12:48 -03:00
ale
85b3f1dd0f Agregados fillable faltantes + productos no barriales en metodos para armar planillas 2025-05-23 17:05:13 -03:00
ale
a006fc15fa Excluyendo productos barriales de productosPedidos 2025-05-23 17:04:29 -03:00
ale
37fd0fb4d3 Fila nullable 2025-05-23 16:53:54 -03:00
ale
d794dbd2b0 Usando vuex 2025-05-23 16:53:37 -03:00
ale
7140796ccd Usando sesion para recordar el pedido 2025-05-23 02:33:21 -03:00
ale
5b9908e0b5 Agregados toast 2025-05-23 02:18:12 -03:00
ale
f837b7f066 Tirando error cuando se intenta modificar un pedido aprobado 2025-05-23 02:13:09 -03:00
ale
0dba210a6a Funciones para toast y mostrar errores 2025-05-23 02:12:55 -03:00
ale
571b02382e app limpiada 2025-05-23 01:44:39 -03:00
ale
2f071e631d Pseudo routing con migas y dispatch en vez de href 2025-05-23 01:41:16 -03:00
ale
1e830e3cfd Logica de migas movida a ui.js 2025-05-23 01:27:34 -03:00
ale
0381bb0567 Cartel aprobado movido a pedidos body 2025-05-23 01:12:12 -03:00
ale
adabd09ea7 Cambio id 2025-05-23 01:11:31 -03:00
ale
a9ca04811e Usando vuex 2025-05-23 01:02:11 -03:00
ale
5458fae6d9 Renombrado 2025-05-23 01:02:01 -03:00
ale
5023032ac2 Usando vuex para el modal de devoluciones 2025-05-23 00:58:02 -03:00
ale
fb0e13089f Agregado devoluciones-modal 2025-05-23 00:56:27 -03:00
ale
21aa36e3d1 Cambios de nombres, y movida logica de chismosa a store de vuex 2025-05-23 00:37:12 -03:00
ale
f81141d18b Quitado codigo no usado 2025-05-23 00:36:22 -03:00
ale
8f0d715f8c Usando vuex 2025-05-23 00:01:55 -03:00
ale
45dcf643bf Formato 2025-05-22 23:07:07 -03:00
ale
5468b79562 Agregados getters para datos de productos 2025-05-22 23:06:51 -03:00
ale
08a731673b Quitado codigo no usado 2025-05-22 22:12:42 -03:00
ale
94e384c83c Crear pedido setea state, quitado todo lo relativo a sesion, y quitado codigo comentado 2025-05-22 21:46:15 -03:00
ale
a594e8a049 Arreglado parametro 2025-05-22 21:45:34 -03:00
ale
fd055cd7c6 Devolviendo resource tras crear pedido 2025-05-22 21:45:22 -03:00
ale
d4df72afe2 Titulo simplificado 2025-05-22 21:26:08 -03:00
ale
442d35eac8 Agregado main.blade.php con respectiva ruta y web usa main 2025-05-22 21:26:01 -03:00
ale
154e21fae6 Agregados componentes para ordenar el flujo de la aplicación + usandolo en la view + cambios en la store pedido por evitar redireccion 2025-05-22 21:08:06 -03:00
ale
1a8f9eda18 Cambio en nombre de getter 2025-05-22 21:06:14 -03:00
ale
128dd05b9a Agregado metodo, ruta, logica de vuex para obtener rol del usuario logeado 2025-05-22 21:04:17 -03:00
ale
181fbf924f Agregado nombre 2025-05-22 20:25:00 -03:00
ale
8d1eb03ffc Cambio formato y mostrando solo para pedidos 2025-05-22 00:26:08 -03:00
ale
baeff66aaf usando vuex para el resto de los datos 2025-05-22 00:12:34 -03:00
ale
1709468f1f total, productos, y devoluciones_habilitadas tomadas de vuex 2025-05-22 00:05:07 -03:00
ale
b46b56159b formato 2025-05-22 00:01:36 -03:00
ale
b8390c4ac6 Usando pedido de vuex 2025-05-21 23:41:23 -03:00
ale
36af26a647 Agregada logica de sesion 2025-05-21 22:40:53 -03:00
ale
cdf5663b16 Redirección movida a vuex 2025-05-21 22:40:23 -03:00
ale
8fbfa75144 Esperando a que pedido esté definido 2025-05-21 22:33:02 -03:00
ale
5a0cf73218 Crear pedido movido a vuex 2025-05-21 21:49:04 -03:00
ale
44bd8045b8 Cambios en obtener sesion 2025-05-21 21:31:46 -03:00
ale
8a32841f9d Agregadas rutas nuevas con session controller 2025-05-21 21:30:59 -03:00
ale
e0bb8127f4 Quitada ruta no usada 2025-05-21 21:30:38 -03:00
ale
1610acfbe7 formato 2025-05-21 21:30:10 -03:00
ale
fff9b5b65f Borradas cosas de admin ya no usadas 2025-05-21 20:48:06 -03:00
ale
d64659d653 template simplificada 2025-05-21 20:46:08 -03:00
ale
f92084d399 usando pedido definido 2025-05-21 20:45:50 -03:00
ale
f4560c0be5 arreglos en comparacion 2025-05-21 20:45:35 -03:00
ale
fe529c2242 esperar 2025-05-21 20:44:58 -03:00
ale
3509b9348f Transición a store 2025-05-21 19:28:41 -03:00
ale
83027245e8 Parámetros simplificados 2025-05-21 19:28:06 -03:00
ale
248b346f78 Usando store para pedidos 2025-05-21 19:10:47 -03:00
ale
191f01a398 Agregado 'pedidos' al state con metodos para traer y settear + separada logica de state en grupo de compra y pedidos 2025-05-21 19:10:00 -03:00
ale
408531bec3 Nombres de campos y simplificación de deshabilitar 2025-05-21 18:57:03 -03:00
ale
be24daf998 Usando store para grupo de compra id en lugar de prop 2025-05-21 18:50:32 -03:00
ale
020d554019 Formato 2025-05-21 18:44:22 -03:00
ale
dd30726d10 Formato 2025-05-21 18:41:10 -03:00
ale
59b6c29508 Solo se muestra en pedido 2025-05-21 18:40:01 -03:00
ale
2f7ee48930 Formato 2025-05-21 18:27:08 -03:00
ale
caebf1b53b Simplificado seleccionarCategoria 2025-05-21 18:24:31 -03:00
ale
b76ecf57dc Busqueda funcionando con productos.js 2025-05-21 18:23:35 -03:00
ale
0dc8f39f07 Cambio logica para usar modulo pedidos + cambios en migas 2025-05-21 18:19:39 -03:00
ale
e82dd59c34 Body espera a cargar productos y categorias 2025-05-21 18:19:22 -03:00
ale
0836584192 Quitados logs e if innecesario 2025-05-21 18:18:55 -03:00
ale
b490cd8b25 Trae todos los productos por defecto 2025-05-21 18:17:58 -03:00
ale
a512f8e162 Agregado modulo productos + cambios de nombre 2025-05-21 18:17:36 -03:00
ale
7bfbbd9309 Cambio de nombre de modulos + info de devoluciones habilitadas movida de pedido a barrio 2025-05-21 16:23:47 -03:00
ale
6c7e62bcb0 Agregadas acciones para crear y obtener pedido 2025-05-20 00:16:22 -03:00
ale
f4138510cd Agregado un enter 2025-05-20 00:15:47 -03:00
ale
ac9b0a00e8 Agregado modulo para info de barrio loggeado 2025-05-20 00:15:32 -03:00
ale
db5262d655 Simplifcado resource 2025-05-20 00:15:05 -03:00
ale
ff07551762 Simplifcado index 2025-05-19 23:35:27 -03:00
ale
40e466aa82 Primeras cosas de chismosa 2025-05-19 15:01:54 -03:00
ale
5b65bc5d9f Cambio en referencias 2025-05-19 15:01:30 -03:00
ale
4b3ab56565 Cambio a LoginForm 2025-05-19 15:00:57 -03:00
ale
eee3f53672 Agregado modulo a la store 2025-05-19 03:05:23 -03:00
ale
fe57e8c6b3 BarrioSelect y RegionSelect usan la store 2025-05-19 03:05:06 -03:00
ale
fe292802cd Clase login genérica para barrio y admin 2025-05-19 03:04:29 -03:00
ale
da5f0051c8 Agregado modulo de login para regiones y barrios 2025-05-19 03:02:51 -03:00
ale
47ce7e3bd8 Cambio de lógica para usar el modulo admin de la store 2025-05-19 00:17:50 -03:00
ale
e6770172ac Grupo de compra explícito en estado + metodos, acciones, y getters necesarios 2025-05-19 00:17:25 -03:00
ale
fbbb400892 /{gdc}/devoluciones devuelve no content 2025-05-19 00:13:28 -03:00
ale
85746f2d4d toggleAprobacion devuelve no content 2025-05-19 00:13:04 -03:00
ale
09bc8e7670 Cambio logica 2025-05-18 22:44:25 -03:00
ale
8a1334bae5 Cambio nombre 2025-05-18 21:46:24 -03:00
ale
63b51fd92c Reemplazo modulo sesión por modulo admin 2025-05-18 21:46:06 -03:00
ale
e2c716f576 Ruta 'sesion' cambiada por ruta para obtener grupo de compra de usuario logeado 2025-05-18 21:44:33 -03:00
ale
61e4c341f3 Quitado auth middleware de la ruta, ahora devuelve booleano con dato sobre estado de auth + actualizado para guardar el grupo de compra entero y no solo la id 2025-05-18 17:48:38 -03:00
ale
a485994a72 Agregada store de vuex para guardar información de la sesión tras login + ruta y controller + resource reducido de grupo de compra para pedidos 2025-05-18 17:34:14 -03:00
ale
6d3173cd1f Mejor referencia 2025-05-18 16:36:34 -03:00
ale
e047b0a23c Agregado vuex 2025-05-16 17:24:08 -03:00
ale
60a6f3e781 Quitados metodos no usados 2025-05-16 16:36:29 -03:00
ale
6bcb22ea00 Eliminados middlewares no usados + reorden 2025-05-16 16:17:21 -03:00
ale
1e7afc034e Quitadas dependencias no usadas 2025-05-16 16:11:49 -03:00
ale
ea8611771b Agregadas timestamps 2025-05-16 16:00:03 -03:00
ale
6e0238eef7 Quitados is_compras, is_admin de seeders 2025-05-16 15:12:37 -03:00
ale
ac6fc6bc0e Cambio referencia 2025-05-16 15:04:00 -03:00
ale
025b9239c3 Quitado redondeo 2025-05-16 15:03:51 -03:00
ale
8799446e57 Calculando total por producto 2025-05-16 15:03:40 -03:00
ale
44465c2783 Quitado total de pivot y de sync subpedido 2025-05-16 14:53:35 -03:00
ale
0b445ee1c5 Cambio en referencia 2025-05-16 14:53:23 -03:00
ale
8ad179c61c Quitadas import no usado 2025-05-16 14:53:02 -03:00
ale
f0f046d3cb Quitadas referencias a proveedor 2025-05-16 14:46:14 -03:00
ale
a9e9966c93 Refactor de login y home para que dependan del UserRole 2025-05-15 20:19:07 -03:00
ale
2e78d39f12 Reemplazo de logica de proovedor por es_solidario 2025-05-15 19:45:30 -03:00
ale
de1bae8620 Simplificado ProductoResource 2025-05-15 19:39:17 -03:00
ale
b330d991c6 Agregado y registrado middleware para usar UserRole 2025-05-15 19:38:47 -03:00
ale
2245eb4939 Eliminado admin 2025-05-15 01:16:54 -03:00
ale
eb3e4730bf Agregado es solidaio y eliminado proveedor 2025-05-15 01:13:38 -03:00
ale
2faea3b007 Modelos simplificados 2025-05-15 01:13:09 -03:00
ale
50d77b0108 Asignacion simplificada 2025-05-15 01:12:49 -03:00
ale
f8b487cebd Tablas simplificadas 2025-05-15 00:52:12 -03:00
ale
fc367c05a3 Agregado role_id a User 2025-05-15 00:32:08 -03:00
ale
bed975e944 Agregada tabla y modelo para roles de usuario 2025-05-14 23:24:36 -03:00
e508e71b81 Merge pull request 'funcion/arreglar-planillas' (#44) from funcion/arreglar-planillas into master
Reviewed-on: nathalie/pedi2#44
2025-05-13 17:17:19 -03:00
ale
498ecd5ec1 Merge remote-tracking branch 'origin/funcion/arreglar-planillas' into funcion/arreglar-planillas 2025-05-13 17:12:27 -03:00
ale
01dbb9667a Productos ordenados por id en el pdf (en el orden de la planilla cargada) 2025-05-13 17:12:19 -03:00
ale
f85a8b777f Agregadas constantes y cambiada logica de bono usando regex 2025-05-13 17:12:19 -03:00
ale
3bd7219ca2 Productos ordenados por id en el pdf (en el orden de la planilla cargada) 2025-05-13 17:10:56 -03:00
ale
087f9c84bf Agregadas constantes y cambiada logica de bono usando regex 2025-05-13 17:01:21 -03:00
nathalie
0c322400c2 Agregada version de nuevo, si no no funciona en prod 2025-05-12 19:53:33 -03:00
b0ae4abc4d Merge pull request 'funcion/arreglar-planillas' (#43) from funcion/arreglar-planillas into master
Reviewed-on: nathalie/pedi2#43
2025-05-12 19:42:27 -03:00
ale
751b89c01d Cambio en aviso 2025-05-12 19:17:02 -03:00
ale
58211913f4 Quitados imports no usados 2025-05-12 19:13:44 -03:00
ale
250bfd8a33 Agregado PdfHelper para centralizar lógica de generación de pdfs 2025-05-12 19:10:16 -03:00
ale
b8d1520c54 Seteando producto como bono para tipos 'F' y 'BE' 2025-05-12 18:59:05 -03:00
ale
9aa5b390f8 Bonos excluídos de pdf de pedidos barriales 2025-05-12 18:55:59 -03:00
ale
2df7f6fc4b Agregado producto_es_bono a PedidosAprobados 2025-05-12 18:48:23 -03:00
ale
d526b944bd Agregados tipos e imports faltantes, quitados imports innecesarios, quitados valores default, quitados metodos y campos no usados, quitados phpdocs redundantes, returns simplificados 2025-05-11 16:06:51 -03:00
ale
916f963e7b Agregado botón para descargar pedidos barriales en pdf 2025-05-09 18:10:05 -03:00
ale
8887a1970c Agregado método y ruta para bajar pedidos barriales en pdf 2025-05-09 18:08:14 -03:00
ale
b04e7e8f45 Sintaxis de array 2025-05-09 18:07:54 -03:00
ale
b1caed8b15 Cambio de nombre de archivo y de parámetro 2025-05-09 17:14:21 -03:00
ale
ff0a17c776 Método renombrado 2025-05-09 17:13:53 -03:00
ale
9c3b328de0 Usando CsvHelper en vez de League\Csv\Writer 2025-05-09 17:08:49 -03:00
ale
d02505a70b Quitado todo lo referente a planilla de cantidades de transporte 2025-05-09 16:59:30 -03:00
ale
9fcdc5a52a Agregada cantidad de bonos de transporte a planilla de totales 2025-05-09 16:57:46 -03:00
ale
b1b424897c Usando CsvHelper en vez de Reader + metodo para fila de transporte movideo a TransporteHelper 2025-05-09 15:49:25 -03:00
ale
ead7483e19 Formato 2025-05-09 15:48:54 -03:00
ale
f909a78e74 Eliminada dependencia 2025-05-09 15:48:26 -03:00
ale
e3f2e63435 Usando CsvHelper 2025-05-09 15:47:59 -03:00
ale
eb05a7de6a Refactor: usando CsvHelper, cambio de nombre en constantes, eliminado metodo innecesario, extraido predicado 'noTieneTipo' y cosas de formato 2025-05-09 15:47:28 -03:00
ale
7c7149c5a1 Agregado CsvHelper 2025-05-09 15:45:46 -03:00
ale
94760279e7 Arreglada planilla de barrio 2025-05-09 14:06:18 -03:00
70bbaad3c7 Merge pull request 'funcion/migracion-de-usuarios' (#42) from funcion/migracion-de-usuarios into master
Reviewed-on: nathalie/pedi2#42
2025-05-08 20:44:56 -03:00
ale
eed099245b Cambia contraseña default a "123" 2025-05-08 20:33:39 -03:00
ale
31bc076989 Agregado UserSeeder para usuario de compras 2025-05-08 20:33:03 -03:00
ale
b5f37c9de9 Actualizado 2025-05-08 20:32:47 -03:00
Ale
b9e964435d Agregada carpeta exports 2025-04-22 20:53:20 -03:00
Ale
c492876c06 Eliminada linea obsoleta 2025-04-22 20:18:29 -03:00
7eb7dd04d7 Merge pull request 'refactor/totales' (#41) from refactor/totales into master
Reviewed-on: nathalie/pedi2#41
2025-04-13 23:22:08 -03:00
ale
45757f0ae1 Agregado redondeo 2025-03-18 23:01:03 -03:00
ale
45e8a189cf Cambios para usar nuevos resources (pedidos, gdc) 2025-03-18 19:58:49 -03:00
ale
fd2c1b2970 Cambios para usar nuevo resource de gdc + arreglo plancha con timeout para sincornizar datos 2025-03-18 19:58:19 -03:00
ale
2587c759fb Reestablecida ruta para devoluciones 2025-03-18 19:55:54 -03:00
ale
2a1394a5c4 Cambio por nuevo resource de pedido 2025-03-18 19:45:16 -03:00
ale
56eb59ddeb Arreglos en resource 2025-03-18 19:45:06 -03:00
ale
354079519a Quitado argumento innecesario 2025-03-18 19:39:06 -03:00
ale
2ca91addb0 Agregado total devoluciones y devoluciones habilitadas a resource + metodo para total devoluciones 2025-03-18 19:34:02 -03:00
ale
c46073ed06 Cambio de endpoints individuales a resource 2025-03-17 18:35:12 -03:00
ale
df0b66bf65 Agregados resource y controller en api 2025-03-17 18:11:50 -03:00
ale
641eb6a4d3 Nuevos metodos de totales 2025-03-17 18:11:36 -03:00
ale
e598e1496b Agregado helper para transporte + limpieza 2025-03-17 17:28:54 -03:00
ale
085d72b4f8 Actualizado a nuevo resource 2025-03-17 17:15:08 -03:00
ale
c54a0b361f Cambios en totales 2025-03-17 17:02:49 -03:00
ale
2a5c215f40 Restando devoluciones al total 2025-03-17 17:01:59 -03:00
ale
584cebb902 Agregadas nuevas funciones para calcular total de pedidos 2025-03-17 16:49:43 -03:00
d4bffd1df8 Merge pull request 'funcion/actualizar-canasta-desde-compras' (#39) from funcion/actualizar-canasta-desde-compras into master
Reviewed-on: nathalie/pedi2#39
2024-12-27 19:32:15 -03:00
ale
94c2baff07 Arreglado nombre de campo 2024-12-24 15:02:46 -03:00
ale
7b36aa0b0c Arreglado error en FilaCaracteristica.vue 2024-12-23 18:54:49 -03:00
ale
5feb2ff22f Cambios nombre columna 2024-12-23 15:58:33 -03:00
ale
d0ffcda226 Cambios nombre columna 2024-12-23 15:58:14 -03:00
ale
1f2ab91bd3 Cambios nombre columna 2024-12-23 15:57:18 -03:00
ale
184b53cfc8 Cambios minimos 2024-12-23 00:09:39 -03:00
ale
345be9c688 Cambio mensaje 2024-12-22 23:41:25 -03:00
ale
30eb822201 Limpieza de tablas previa a cargar + bono barrial 2024-12-22 10:28:05 -03:00
ale
76f2af2ef9 Cambio mensaje 2024-12-22 09:43:57 -03:00
ale
9f93a17053 Cambio mensaje 2024-12-22 01:54:04 -03:00
ale
83016d38b0 Agregado instructivo para planilla de canasta 2024-12-22 01:51:53 -03:00
ale
cc734866c5 Agregada logica para logs de carga de canastas 2024-12-21 15:48:06 -03:00
ale
c31b808f05 Agregada tabla para log de carga de canastas 2024-12-21 15:16:10 -03:00
ale
95a9a404d2 Manejo de archivos movido a helper y limpieza 2024-12-21 15:08:35 -03:00
ale
57b8d6bcce Agregada logica para cargar canasta 2024-12-21 14:57:03 -03:00
ale
ac4d5895be Logica de trabajo con CSV y carga movida a CanastaHelper.php 2024-12-21 14:56:53 -03:00
ale
131bf33a73 Agregada ruta y logica para cargar canastas 2024-12-21 14:37:38 -03:00
ale
5a4b933f11 Agregado csv input para canasta 2024-12-21 14:17:47 -03:00
ale
bea8de2c8c Siempre habilitado 2024-12-21 13:56:45 -03:00
ale
92782be7f6 Descargas movidas a dropdown 2024-12-21 13:48:40 -03:00
ale
22cbac14f1 Pestañas para body de compras 2024-12-21 13:29:14 -03:00
ale
bddaf223e4 tab-secciones movida a comunes 2024-12-21 13:21:39 -03:00
ale
4b2ed9f90e Generalizacion de tab-secciones 2024-12-21 13:20:34 -03:00
cad8dffbcf Merge pull request 'funcion/arreglar-planilla-totales' (#38) from funcion/arreglar-planilla-totales into master
Reviewed-on: nathalie/pedi2#38
2024-12-21 11:06:23 -03:00
ale
c4eb4563d5 Arreglado nombre de archivo 2024-12-09 21:13:51 -03:00
ale
cef38cf69c Borrada funcion innecesaria 2024-12-09 20:59:34 -03:00
ale
8a0f8fbe13 Hueco para transporte 2024-12-09 20:58:56 -03:00
ale
9abeb98239 Cambiado a left join para tener todos los productos 2024-12-09 20:52:51 -03:00
ale
fab7695e6c Agregado boton para planilla de transporte 2024-12-09 13:03:32 -03:00
ale
2486826dba Agregada ruta y método de controlador para planilla de transporte 2024-12-09 12:59:59 -03:00
ale
1b82700db3 Limpieza 2024-12-09 12:57:53 -03:00
ale
635cecedb7 Quitados comentarios 2024-12-09 12:56:47 -03:00
ale
5c97fc9e70 Cambiado para tener todos los barrios, incluso los que tienen 0 bonos de transporte 2024-12-09 12:52:41 -03:00
ale
8e885c18d8 Planilla de transporte 2024-12-09 12:35:32 -03:00
ale
b5d23c6740 Formato 2024-12-09 12:35:11 -03:00
ale
f778a4f24e Planilla de notas + ignorar barrio PRUEBA 2024-12-09 12:33:42 -03:00
ale
acc21091f9 Merge remote-tracking branch 'origin/funcion/arreglar-planilla-totales' into funcion/arreglar-planilla-totales
# Conflicts:
#	app/Producto.php
2024-12-09 07:20:56 -03:00
ale
ec10bdca92 Cambio en controller para usar metodo de producto 2024-12-09 07:20:28 -03:00
ale
f84e1f2954 Nueva logica para planilla de notas, a partir de producto 2024-12-09 07:18:02 -03:00
ale
df05b31b86 Eliminado método viejo 2024-12-09 07:01:37 -03:00
ale
1b16669512 Cambio de método en ruta de descarga de pedidos 2024-12-09 07:01:37 -03:00
ale
d170f9e46e Agregada funcion que genera planilla de totales por barrio 2024-12-09 07:01:37 -03:00
ale
f5f9838fc3 Agregada funcion que genera tabla de totales por producto 2024-12-09 07:01:37 -03:00
ale
c58f24d2d0 Hotfix: arreglada validacion de cantidad + cartelito de 'en chismosa' 2024-12-06 20:15:57 -03:00
Nat
e75fcc562a canasta diciembre 2024 2024-12-02 14:47:49 -03:00
ale
6dae6afe95 Eliminado método viejo 2024-11-25 21:46:40 -03:00
ale
1c5b8ecb29 Cambio de método en ruta de descarga de pedidos 2024-11-25 21:45:09 -03:00
ale
00b41afa5a Agregada funcion que genera planilla de totales por barrio 2024-11-25 21:44:03 -03:00
ale
1324898483 Agregada funcion que genera tabla de totales por producto 2024-11-25 17:20:04 -03:00
ba22988026 Merge pull request 'funcion: notas de producto' (#36) from funcion/notas-producto into master
Reviewed-on: nathalie/pedi2#36
2024-11-12 22:08:36 -03:00
ale
9c9b1dc6cb Merge branch 'refs/heads/master' into funcion/notas-producto 2024-11-12 21:48:48 -03:00
ale
73f02dfff0 Canasta 107 - fix2 2024-11-05 12:07:45 -03:00
ale
bbb57e1d7f Canasta 107 - fix 2024-11-05 11:07:23 -03:00
ale
2996cf4100 Merge remote-tracking branch 'origin/master' 2024-11-05 10:48:39 -03:00
ale
97ec11331b Canasta 107 2024-11-05 10:48:22 -03:00
ale
8c9a0ee4c1 Actualizado package-lock.json 2024-11-05 10:46:38 -03:00
ale
01d5abdd99 Arreglado error en migración 2024-11-05 10:45:50 -03:00
Rodrigo
f9e55b38a5 Merge branch 'master' into funcion/notas-producto 2024-10-18 19:10:20 -03:00
Rodrigo
3ad9500f23 Alerta de notas sale sólo después de intentar de confirmar 2024-10-16 22:32:16 -03:00
Rodrigo
538cc84e10 Desactivar agregar producto si requiere notas y están vacías 2024-10-16 21:56:05 -03:00
4e7e46f92d Merge pull request 'Filtrado de barrios para usar solo los que tienen pedidos aprobados + agregada cantidad de bonos de transporte a planilla de totales de barrios' (#37) from funcion/planilla-pedidos-total into master
Reviewed-on: nathalie/pedi2#37
Reviewed-by: Rodrigo <rodrigopdm@protonmail.com>
2024-10-15 21:46:42 -03:00
ale
61e756f9e5 Filtrado de barrios para usar solo los que tienen pedidos aprobados + agregada cantidad de bonos de transporte a planilla de totales de barrios 2024-10-15 21:37:22 -03:00
Rodrigo
be945b0eee Agregué las notas al PDF para el armado del barrio 2024-10-15 20:56:37 -03:00
Rodrigo
b5f4443836 Boton para descargar notas en pag de compras 2024-10-15 20:44:28 -03:00
ale
c53e342f54 Hotfix: quitado animate de bulma-toast 2024-10-08 21:08:50 -03:00
ale
ff213bd90d Canasta 106 2024-10-08 20:45:01 -03:00
Rodrigo
1e443ea2ca Merge branch 'master' into funcion/notas-producto 2024-10-08 20:36:16 -03:00
Rodrigo
c1af6909c4 No habilitar sync producto si cantidad es 0 2024-10-08 20:33:20 -03:00
Rodrigo
e31c375867 Ajuste visual de notas 2024-10-08 20:28:58 -03:00
Rodrigo
6d10fbc0bf Sincronizar notas de producto 2024-10-08 20:16:25 -03:00
96eea84997 Merge pull request 'funcion/planilla-pedidos-total' (#33) from funcion/planilla-pedidos-total into master
Reviewed-on: nathalie/pedi2#33
2024-10-08 20:07:56 -03:00
ale
10273e2159 Arreglos post-merge 2024-10-08 20:07:03 -03:00
ale
0b55fa8109 Merge branch 'refs/heads/master' into funcion/planilla-pedidos-total
# Conflicts:
#	resources/js/components/pedidos/Chismosa.vue
#	resources/js/components/pedidos/ChismosaDropdown.vue
#	resources/views/productos.blade.php
2024-10-08 19:43:04 -03:00
Rodrigo
9fc47513c2 Arreglo para usuarios por defecto 2024-09-19 22:31:58 -03:00
Rodrigo
ff332fadc1 Merge branch 'master' into funcion/notas-producto 2024-09-19 21:47:09 -03:00
e106faceda Merge pull request 'nueva-chismosa' (#35) from nueva-chismosa into master
Reviewed-on: nathalie/pedi2#35
2024-09-19 21:42:43 -03:00
Rodrigo
5ef5e93543 Merge remote-tracking branch 'origin/master' into nueva-chismosa 2024-09-19 21:22:24 -03:00
Rodrigo
177ba193de Agregado "requiere notas" a productos con 'PTC' 2024-09-19 20:58:44 -03:00
ale
88e3532418 Arreglado metodo para generar csv con totales de todos los barrios 2024-09-17 21:48:44 -03:00
ale
07289b01e9 Arreglado metodo que al final sí era usado 2024-09-17 21:45:28 -03:00
ale
5c1fa931eb Arreglo tags 2024-09-17 21:42:55 -03:00
Rodrigo
82f5862063 Mostrar notas en pedido 2024-09-17 21:28:08 -03:00
Rodrigo
7eeeae6a1e Agregar notas a la base de datos 2024-09-17 21:27:58 -03:00
ale
744b867af3 Agregado body de compras y cambios en rutas 2024-09-17 20:41:50 -03:00
Rodrigo
52bea8f9b6 Ajustes de medidas en chismosa 2024-09-17 20:13:34 -03:00
Rodrigo
d2fde9df83 Revert "Auto sincronziar producto después de 3 segundos"
This reverts commit 80a28f4162.
2024-09-17 19:14:30 -03:00
Rodrigo
80a28f4162 Auto sincronziar producto después de 3 segundos 2024-09-16 20:56:15 -03:00
Rodrigo
1586a1190a Arreglo y ajuste a devoluciones en chismosa 2024-09-16 09:25:37 -03:00
Rodrigo
a998f76d44 Arreglo a ProductoCantidad 2024-09-16 09:25:26 -03:00
Rodrigo
b845637064 Arreglé todos los errores al inicio 2024-09-15 18:09:23 -03:00
Rodrigo
6fc7021317 ProductoCantidad template WIP 2024-09-15 12:48:34 -03:00
Rodrigo
728c54b3f3 Agregado margen a la chismosa 2024-09-15 11:53:14 -03:00
ale
917e3e1df3 Ajustes de refactor 2024-09-14 16:25:57 -03:00
ale
517b95f14f Merge branch 'refs/heads/refactor/componentes-vue' into funcion/planilla-pedidos-total
# Conflicts:
#	resources/js/components/admin/Body.vue
#	resources/js/components/pedidos/ProductoModal.vue
2024-09-14 16:12:09 -03:00
ale
2337ad9a37 Login de compras funcionando 2024-09-14 13:37:06 -03:00
ale
99f327445e Merge branch 'refs/heads/master' into funcion/planilla-pedidos-total 2024-09-14 12:45:14 -03:00
b4ca119f9a Merge pull request 'hotfix/negativos-chismosa' (#34) from hotfix/negativos-chismosa into master
Reviewed-on: nathalie/pedi2#34
2024-09-14 11:17:13 -03:00
ale
9d9ebd75b5 Borrado boton inutil de chismosa 2024-09-14 11:06:09 -03:00
ale
b79548624f Botón '-' no baja de 0 + no se puede confirmar con cantidad menor a 0 2024-09-14 11:03:55 -03:00
Rodrigo
fbae6770df Cismosa: Ajustes visuales 2024-09-10 22:07:16 -03:00
ale
5f565a3f5a Pantalla de login con textfields + agregado caso de usuario de compras a LoginController.php 2024-09-10 22:07:11 -03:00
Rodrigo
69cd306263 Moví la chismosa a la derecha de los productos 2024-09-10 21:31:49 -03:00
ale
bf3f697299 Agregadas rutas con middleware y pantalla de login vacia 2024-09-10 21:11:22 -03:00
ale
53691f6a30 Arreglado middleware compras 2024-09-10 21:03:01 -03:00
ale
9259248caf Middleware de compras andando 2024-09-10 20:23:49 -03:00
ale
9f6f36e2e6 Merge branch 'refs/heads/master' into funcion/planilla-pedidos-total 2024-09-10 19:50:42 -03:00
ale
1204a80b3c Canasta 105: fix provisorio castañas con precio anterior 2024-09-09 01:43:08 -03:00
ale
b9702a736e Canasta 105 2024-09-09 01:33:20 -03:00
ale
4283eae3be hotfix: margenes en admin body 2024-09-09 01:28:13 -03:00
28f2b3b498 Merge pull request 'funcion/nueva-lista-de-productos' (#32) from funcion/nueva-lista-de-productos into master
Reviewed-on: nathalie/pedi2#32
2024-09-09 01:18:58 -03:00
ale
079b21af04 Cambio margenes 2024-09-09 01:17:08 -03:00
ale
ffd4570d44 Cambio lugar de iconos y mensaje de chismosa 2024-09-09 01:09:23 -03:00
ale
82ad4dd910 Arreglado ancho de columnas 2024-09-09 00:14:29 -03:00
e334234c9f Merge pull request 'funcion/producto-paga-transporte' (#31) from funcion/producto-paga-transporte into master
Reviewed-on: nathalie/pedi2#31
Reviewed-by: Rodrigo <rodrigopdm@protonmail.com>
2024-09-07 10:53:01 -03:00
ale
3340de941b Revert "Mejoras en cálculo de cantidad de bonos de transporte"
This reverts commit 3770d728c3.
2024-09-05 17:11:53 -03:00
ale
3770d728c3 Mejoras en cálculo de cantidad de bonos de transporte 2024-09-05 13:52:31 -03:00
ale
c86eb97cb9 Cambio lógica de pago de transporte 2024-09-05 13:34:33 -03:00
ale
d91d46c589 Seeding simplificado 2024-09-04 15:41:35 -03:00
ale
449579a768 Merge branch 'refs/heads/master' into funcion/planilla-pedidos-total
# Conflicts:
#	app/GrupoDeCompra.php
2024-09-01 13:11:53 -03:00
bb29e34b1b Merge pull request 'funcion/nueva-lista-de-productos' (#29) from funcion/nueva-lista-de-productos into master
Reviewed-on: nathalie/pedi2#29
2024-09-01 12:58:37 -03:00
Rodrigo
078e29a01f Desactivar botones de producto cuando no hacen nada 2024-08-31 23:03:09 -03:00
ale
189342d785 Refactor de componentes de pantalla de pedidos 2024-08-30 01:34:03 -03:00
ale
003cb86ec0 Refactor de componentes de pantalla de admin 2024-08-30 01:33:47 -03:00
ale
12b77de018 Refactor de componentes de pantallas de login 2024-08-30 01:14:30 -03:00
ale
5453b1158f Cambio en logica de registro automatico de componentes 2024-08-30 01:13:06 -03:00
ale
18ede25c16 Cambios de estilo 2024-08-30 00:10:50 -03:00
ale
6d58524823 Arreglado problema de márgenes 2024-08-29 23:01:31 -03:00
ale
2a57fdc1e9 Solo actualiza el producto que cambia 2024-08-29 22:54:05 -03:00
ale
ddd8d57d2b ProductosContainer.vue usa ProductoCard.vue 2024-08-29 22:51:46 -03:00
ale
781ef8a7a1 ProductoModal.vue reemplazado por ProductoCard.vue 2024-08-29 22:51:13 -03:00
ale
43f2a1e928 eliminados parametros innecesarios y evento vacío que tiraba error 2024-08-29 22:50:53 -03:00
ale
97139905cc actualizado gitignore 2024-08-29 21:46:07 -03:00
ale
438071eea3 formato 2024-08-29 21:43:24 -03:00
ale
937e7ec16c Agregado input para cantidad con botones, todavia sin logica 2024-08-29 21:43:13 -03:00
ale
9d96010752 package-lock.json 2024-08-29 21:16:09 -03:00
ale
4e7c1232b0 Agregada public/mix-manifest.json 2024-08-29 21:15:22 -03:00
ale
9b06839798 Cambio public por public/js y public/css 2024-08-29 20:54:06 -03:00
ale
4a59b8e146 Cambio public por public/js y public/css 2024-08-29 20:53:59 -03:00
Rodrigo
39e1eaddcf Poner cantidad 0 saca el producto de la chismosa 2024-08-27 23:32:38 -03:00
Rodrigo
5ca11324a0 Modal de producto ajustado 2024-08-27 23:27:18 -03:00
Rodrigo
758c425f91 Las cards de productos ahora son boxes en lista 2024-08-27 22:51:31 -03:00
ale
2d7a90f6b2 Agregado middleware para comision compras + columna en tabla users 2024-08-27 21:21:10 -03:00
11d18ad4a5 Merge pull request 'funcion/devoluciones' (#28) from funcion/devoluciones into master
Reviewed-on: nathalie/pedi2#28
Reviewed-by: Rodrigo <rodrigopdm@protonmail.com>
2024-08-27 21:18:15 -03:00
ale
2beda0bf5b ComprasController + hice estáticos algunos métodos + primeros pasos hacia total de pedidos de los barrios 2024-08-27 20:57:11 -03:00
ale
48e1a04bae Borrado método no usado 2024-08-27 20:56:27 -03:00
ale
f0f05f8361 Borrado controller no usado 2024-08-27 20:56:20 -03:00
ale
800fed2097 Agregada ruta para obtener total de pedidos 2024-08-27 19:53:57 -03:00
Rodrigo
203b70e2ef Agregar paso de instalar dependencias de npm a README 2024-08-20 21:17:29 -03:00
Rodrigo
bf703489fd Actualizar total bonos barriales en admin 2024-08-20 21:15:22 -03:00
ale
c57fd0436d canasta 104 arreglo 2024-08-06 22:57:12 -03:00
ale
d04650facf debugeo 2024-08-06 22:53:28 -03:00
ale
4ee91ed5a0 canasta 104 2024-08-06 22:36:45 -03:00
ale
32d84879c7 cambio visual notas de devoluciones 2024-07-17 17:25:41 -03:00
ale
6f1b4581ce cambio en cuenta de bonos barriales 2024-07-17 17:25:19 -03:00
ale
0659f67e84 cambio en validacion 2024-07-17 17:25:08 -03:00
ale
42f0cc11d4 cambios de visibilidad en la tabla de totales en funcion de si devoluciones está activada o no 2024-07-17 16:46:31 -03:00
ale
05d13008fb cambio validacion de devoluciones 2024-07-17 16:26:16 -03:00
ale
5921767654 arreglos en las cuentas 2024-07-11 19:55:14 -03:00
ale
475d2a6cd9 cambio a pagado 2024-07-11 19:54:56 -03:00
ale
9781d63a60 agregado id de grupo de compra a la cookie para poder (des)habilitar devoluciones 2024-07-11 19:00:31 -03:00
ale
057170118d cambio segun si devoluciones esta activa 2024-07-11 18:59:47 -03:00
ale
0c79d3b002 agregada tabla de caracteristicas con switch para togglearlas 2024-07-11 18:34:45 -03:00
ale
105335a773 no renderiza si no estan habilitadas las devoluciones 2024-07-11 18:34:20 -03:00
ale
749940233d cambio nombre seccion 2024-07-11 18:33:56 -03:00
ale
d9e8264cd0 cambio nombre seccion 2024-07-11 18:33:45 -03:00
ale
9babf1975f borrado log viejo 2024-07-11 18:32:52 -03:00
ale
716d1ca6fa Cambio de logica de obtener sesion + variable para habilitar devoluciones 2024-07-11 18:32:42 -03:00
ale
388beba5cc Cambio de where a find para obtener directamente por id + arreglo acceso a propiedad 2024-07-11 18:31:59 -03:00
ale
75b7507bbe Agregada metodo para togglear devoluciones + ruta de api 2024-07-11 17:03:19 -03:00
ale
9e7eb89014 Agregada pestaña para caracteristicas 2024-07-11 16:32:25 -03:00
ale
808980d77e Ignorando public 2024-07-11 16:25:38 -03:00
ale
66984043bc Merge branch 'master' into funcion/devoluciones 2024-07-10 19:05:28 -03:00
ale
05f2777a49 fix version php 2024-07-10 19:03:05 -03:00
ale
725a599b6a Canasta 103 2024-07-08 21:01:30 -03:00
ale
1c5cabb253 Canasta 103 2024-06-03 15:12:45 -03:00
ale
31dadcc10b Canasta 101 - 2do intento 2024-05-06 20:46:44 -03:00
ale
70755ba0a2 Canasta 101 2024-05-06 20:27:36 -03:00
ale
8fc1a3b256 Cambios de tipo para parseo 2024-04-08 21:00:33 -03:00
ale
814295e8ee Cambio por el csv correcto 2024-04-08 20:58:38 -03:00
nathalie
fefd052a8e Revert "Cambio en cuenta de bonos de transporte"
This reverts commit 43b0b04859.
2024-04-08 15:31:13 -03:00
nathalie
ab7e44fd85 Revert "cambio logica bdt"
This reverts commit e9321678e2.
2024-04-08 15:31:00 -03:00
ale
b66c2fe19d Agregado nombre de columna 2024-04-08 15:15:35 -03:00
ale
9cf4a117df Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2024-04-08 15:06:26 -03:00
ale
0b427e4796 Canasta 100 2024-04-08 15:05:18 -03:00
85238695c7 Merge pull request 'Cambio en cuenta de bonos de transporte' (#27) from funcion/fix-bonos-de-transporte into master
Reviewed-on: nathalie/pedi2#27
2024-04-06 16:48:06 -03:00
ale
e9321678e2 cambio logica bdt 2024-03-18 20:12:08 -03:00
ale
43b0b04859 Cambio en cuenta de bonos de transporte 2024-03-17 17:12:21 -03:00
5036c2baa9 Actualizar 'README.md' 2024-03-17 16:46:20 -03:00
ale
b19556fd39 Cambio seeder bonos 2024-03-11 15:34:25 -03:00
ale
35b0533664 Canasta 99 2024-03-11 15:34:09 -03:00
ale
16e5075825 canasta 98 2024-02-12 21:42:43 -03:00
Ale
0665770972 canasta 96 2023-12-06 08:44:08 -03:00
1ccfbe11a7 Merge pull request 'Sacado total de bonos de chismosa' (#26) from funcion/sacar-total-bonos-de-chismosa into funcion/devoluciones
Reviewed-on: nathalie/pedi2#26
2023-11-25 13:40:28 -03:00
Ale
4376586a23 agregado campo y ruta para togglear devoluciones 2023-11-12 20:13:17 -03:00
Ale
d16a8de5ac Sacado total de bonos de chismosa 2023-11-12 11:48:47 -03:00
Ale
10f4fefb0c Total sin devoluciones en la barra 2023-11-12 11:47:01 -03:00
Ale
f3ee5ea7d9 Agregado mouseover con notas de la devolucion 2023-11-12 11:46:16 -03:00
Ale
5b2c489f2d Columnas a su propia migracion 2023-11-12 11:26:29 -03:00
Ale
e7100121d4 Merge branch 'master' into funcion/devoluciones 2023-11-12 09:54:56 -03:00
Ale
e0a64d3653 Canasta 95 2023-11-06 16:14:51 -03:00
Ale
fe2d8608cb Pequeños ajustes 2023-11-06 14:03:43 -03:00
Ale
e7c90a4899 Cambio de nombre para hacer compatible con docker-compose.yml 2023-11-06 14:00:43 -03:00
Ale
0a51ccba2a USERID agregada 2023-11-06 13:58:48 -03:00
Ale
988bf266e8 canasta 94 2023-10-10 19:49:17 -03:00
Rodrigo
3941dc0fd2 Mostrar devoluciones en admin 2023-10-05 12:58:03 -03:00
Rodrigo
1a8448ca45 Merge branch 'master' into funcion/devoluciones 2023-10-05 12:00:02 -03:00
9954dbd66a Merge pull request 'Mejoras varias a la pantalla de admini' (#24) from funcion/mejoras-admin into master
Reviewed-on: nathalie/pedi2#24
2023-10-05 11:59:15 -03:00
Rodrigo
14361a858e Devoluciones: modelo y sync
Lo agregué a la base de datos y se sincroniza con un modal
que se abre desde la chismosa
2023-10-04 23:36:03 -03:00
Ale
8f8733cb7b Mejoras varias a la pantalla de admini 2023-10-04 22:37:59 -03:00
aab05541b2 Merge pull request 'Exportar tabla de compras con todos los nucleos a CSV' (#20) from exportar-tabla-compras into master
Reviewed-on: nathalie/pedi2#20
2023-09-18 19:07:34 -03:00
Rodrigo
5b6fd933e3 Agregado botón de descarga de planilla completa
Modificado orden y textos para claridad
2023-09-17 17:22:50 -03:00
Ale
9634f51054 Alineación de texto en tabla de bonos 2023-09-10 17:07:41 -03:00
Ale
80fbbd510d Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2023-09-09 13:33:12 -03:00
Ale
c278e0a7a5 Cambios de formato de numeros 2023-09-09 13:32:49 -03:00
f55ac3a4ff Merge pull request 'Agregado versionado al build' (#23) from funcion/versionado into master
Reviewed-on: nathalie/pedi2#23
2023-09-05 19:00:33 -03:00
Rodrigo
e1aa6e2f68 Agregado versionado al build 2023-09-05 18:47:09 -03:00
Ale
71b4c1c38d Canasta 93: faltaban precios de copas solidarias 2023-09-05 13:12:55 -03:00
Ale
a7a1f69c5a Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2023-09-05 13:02:50 -03:00
Ale
3a894f2965 Canasta 93 2023-09-05 13:02:27 -03:00
381909fb7e Merge pull request 'Refactor del cartel pera que aparezca en todas las pantallas' (#22) from funcion/cartelito-pedido-aprobado into master
Reviewed-on: nathalie/pedi2#22
2023-09-05 12:35:55 -03:00
Ale
17cc127f2e Refactor del cartel pera que aparezca en todas las pantallas 2023-09-05 10:08:36 -03:00
9991337b87 Merge pull request 'Modal de producto muestra cantidad pedida' (#19) from refactor/cantidades-producto into master
Reviewed-on: nathalie/pedi2#19
2023-09-04 21:22:25 -03:00
b58261bbf0 Merge pull request 'No sincronizar subpedidos aprobados' (#21) from funcion/congelar-pedidos-aprobados into master
Reviewed-on: nathalie/pedi2#21
2023-09-04 20:33:09 -03:00
Rodrigo
b09d284a1d Agregado notificación de pedido aprobado 2023-09-04 20:32:16 -03:00
Ale
5a4a1ff391 El toast ahora dura 2s 2023-09-04 18:20:31 -03:00
Ale
72b3d1e4af Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2023-08-07 17:23:03 -03:00
Ale
ca3af75b5a Canasta 92 2023-08-07 17:22:38 -03:00
Rodrigo
f50d4b975d Agregado toast que avisa si el pedido fue aprobado 2023-07-11 21:33:33 -03:00
Rodrigo
bf3b888e71 No sincronizar subpedidos aprobados 2023-07-10 21:29:25 -03:00
Ale
cadd9de7a0 dependencia cross-env 2023-07-06 23:25:05 -03:00
Rodrigo
ccdba6efd4 Merge branch 'master' of ssh://git.mps.org.uy:4422/nathalie/pedi2 2023-07-06 10:39:42 -03:00
dc339fb025 Merge branch 'master' into exportar-tabla-compras 2023-07-06 10:35:30 -03:00
Rodrigo
962d6ec58a Exportar pedido con nucleos a CSV 2023-07-06 00:18:52 -03:00
Rodrigo
8d3f686fa1 Crear view 'pedidos_aprobados' en migraciones 2023-07-05 23:30:38 -03:00
Rodrigo
148f0e5244 Crear view 'pedidos_aprobados' en migraciones 2023-07-05 23:25:36 -03:00
Ale
129d52d6d6 canasta 91 2023-07-04 20:12:36 -03:00
Ale
22e4253ea9 Ahora si, cantidad en modal y en tarjeta 2023-06-17 15:54:18 -03:00
Ale
121dfa4c49 Modal de producto muestra cantidad pedida 2023-06-10 19:20:25 -03:00
nathalie
9bf68050a7 merged from server 2023-06-07 22:21:21 -03:00
nathalie
615c9427b9 merge from server 2023-06-07 22:20:36 -03:00
023cef2bf3 Merge pull request 'refactor/chismosa' (#18) from refactor/chismosa into master
Reviewed-on: nathalie/pedi2#18
2023-06-07 22:04:36 -03:00
2426638414 Merge pull request 'funcion/buscar-productos' (#17) from funcion/buscar-productos into master
Reviewed-on: nathalie/pedi2#17
2023-06-07 22:03:48 -03:00
d18de9e4c0 Merge pull request 'Rework de la tabla de bonos y cambios en total de tabla de pedidos' (#16) from funcion/cambio-admin-bonos into master
Reviewed-on: nathalie/pedi2#16
2023-06-07 22:03:18 -03:00
Ale
6f2721a0f2 canasta 90 2023-06-07 20:41:47 -03:00
Ale
70aaadd901 refactor de chismosa 2023-05-27 20:08:55 -03:00
Ale
daa998c89e cambio de nombre de evento 2023-05-27 15:38:56 -03:00
Ale
c2ce43d295 buscar productos funcionando 2023-05-27 15:33:08 -03:00
Ale
d19c83289d busqueda funcionando, migas rotas 2023-05-27 14:23:52 -03:00
Ale
2eac2a9554 refactors varios para sacar responsabilidades a la nav bar 2023-05-27 11:20:38 -03:00
Ale
599d55b684 cambios en la nav bar y barra de búsqueda 2023-05-24 22:00:04 -03:00
Ale
ea6596a5b4 Rework de la tabla de bonos y cambios en total de tabla de pedidos 2023-05-24 15:01:31 -03:00
nathalie
3203f48f76 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2023-05-10 12:15:04 -03:00
Ale
4acc2b0605 Canasta 89 2023-05-10 11:35:24 -03:00
nathalie
55a94cb05b Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2023-04-10 16:16:10 -03:00
Ale
ddb09d56e7 Arreglo de | que deberian ser , 2023-04-10 16:13:29 -03:00
nathalie
835cb14042 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2023-04-10 16:07:35 -03:00
Ale
474e6871e3 Canasta 88 2023-04-10 15:53:42 -03:00
nathalie
13a445ef64 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2
Arreglado bug de bonos de ollas
2023-03-20 21:29:12 -03:00
nathalie
ee7cdc8d10 Config 2023-03-20 21:27:25 -03:00
Ale
e712d3265f deshecho cambio en docker-compose.yml 2023-03-20 21:11:13 -03:00
Ale
11ec71cd7e Merge branch 'fix/csv-bonos-ollas' 2023-03-20 21:06:42 -03:00
7b94e05d0a Merge pull request 'Sacados bonos de pdfs por estar la tabla de bonos en admin' (#15) from adminUI into master
Reviewed-on: nathalie/pedi2#15
2023-03-20 21:06:15 -03:00
Ale
bc8e6cad10 Arreglado error por el que no aparecia el bono de ollas en la template 2023-03-20 20:59:59 -03:00
nathalie
9e55955970 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2023-03-08 15:35:57 -03:00
Ale
334da613fa Canasta 87 2023-03-07 17:07:44 -03:00
Ale
1593a84b34 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2023-03-07 16:25:20 -03:00
nathalie
a340647df4 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2023-01-11 08:15:28 -03:00
nat
c8054a5272 canasta 85 - fix 2023-01-11 08:14:35 -03:00
nathalie
b56d82fff1 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2023-01-11 07:55:08 -03:00
nat
9e1ea6299d canasta 85 2023-01-11 07:46:24 -03:00
nathalie
78a5e8ad61 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2022-12-07 06:26:08 -03:00
nat
e61ad02dc2 Canasta 84 dic 2022 2022-12-06 20:51:45 -03:00
Ale
bb122c5e39 Sacados bonos de pdds por estar la tabla de bonos en admin 2022-11-14 11:51:03 -03:00
Ale
2b68c2ea8d Revert "Planillas en pdf sin bonos por haber agregado la pantalla de bonos"
This reverts commit d52382c1dc.
2022-11-14 11:49:34 -03:00
Ale
d52382c1dc Planillas en pdf sin bonos por haber agregado la pantalla de bonos 2022-11-14 11:48:46 -03:00
nathalie
f9f72cf830 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2022-11-13 21:40:47 -03:00
eea1f2c3a2 Merge pull request 'adminUI' (#14) from adminUI into master
Reviewed-on: nathalie/pedi2#14
2022-11-13 21:22:13 -03:00
aa70fa1c8d Merge pull request 'Fix-ExportarPedido' (#13) from Fix-ExportarPedido into master
Reviewed-on: nathalie/pedi2#13
2022-11-13 21:22:01 -03:00
Ale
896baf18dd Agregados bonos de transporte y cambio de estilo 2022-11-13 18:01:01 -03:00
Ale
1a961c0732 pestaña de pedidos y de bonos en la pantalla de admin 2022-11-13 17:34:33 -03:00
Ale
6005cc01b7 Agregada tabla de bonos a la pantalla de admin 2022-11-13 17:00:24 -03:00
Ale
323b77f6dc Pequeño refactor y cambio de nombre de componentes de admin pedidos 2022-11-12 21:16:35 -03:00
Ale
f572b5a6bc Merge branch 'Fix-ExportarPedido' into adminUI 2022-11-12 20:23:28 -03:00
Ale
733e13ff66 Agregado dropdown con opciones para descargar pedido y renombre de componentes 2022-11-12 20:20:13 -03:00
Ale
f8484959d6 Las planillas se descargan automáticamente y tienen el nombre del barrio 2022-11-12 18:53:06 -03:00
Ale
cf82e1e21e Solo se generan pdfs de pedidos aprobados. Los pdfs ahora incluyen bonos 2022-11-12 18:44:22 -03:00
Ale
b76f114ab0 Merge branch 'master' into adminUI 2022-11-10 22:12:29 -03:00
nathalie
1b519ca440 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2022-11-08 15:56:50 -03:00
nat
f67232f55c Deshabilita botones de eportar pedido barrial e imprimir planillas cuando no hay subpedidos aprobados 2022-11-08 15:55:49 -03:00
nathalie
426052ba09 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2022-11-08 14:34:17 -03:00
nat
85f0a5a06b Canasta 83 2022-11-08 14:28:44 -03:00
cf77fc5e61 Merge pull request 'mostrar-password' (#12) from mostrar-password into master
Reviewed-on: nathalie/pedi2#12
2022-11-04 16:16:08 -03:00
Ale
3e426d088d Agregado boton para mostrar contraseña en login de admin 2022-10-24 22:40:30 -03:00
Ale
4da7ff2431 Agregado nombre a Login.vue 2022-10-24 22:39:55 -03:00
Ale
4906d2bb4d Arreglado error de booleanos pasados como string y warning de keys 2022-10-24 22:39:23 -03:00
Ale
69b244d074 Agregado botón para mostrar la contraseña en el login del barrio 2022-10-24 22:22:20 -03:00
Ale
155a86975c Cambio de boton a switch y estilos 2022-10-21 19:17:52 -03:00
Ale
5c134989d2 El csv del pedido incluye los bonos de transporte 2022-10-14 19:14:24 -03:00
Ale
3f34483fd5 Agregado middleware autorizacion admin 2022-10-14 17:36:49 -03:00
nathalie
e0d5bc5739 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2022-10-04 12:51:08 -03:00
nat
f4d269721a productos y barrios canasta 82 2022-10-04 12:49:36 -03:00
a88e7ffb87 Merge pull request 'exportar csv de pedidos' (#11) from exportar-planilla-de-pedido into master
Reviewed-on: nathalie/pedi2#11
2022-10-04 12:25:49 -03:00
nat
60e8725ac3 exportar csv de pedidos 2022-10-01 15:29:31 -03:00
Ale
c0dd9c1124 Merge branch 'master' into adminUI 2022-09-21 10:06:15 -03:00
Ale
8284b793d3 bash script de comandos para levantar la pagina al desarrollar 2022-09-21 10:02:44 -03:00
be4ea4906a Merge pull request 'Import de productos a partir de la planilla de compras con numero de filas' (#10) from importar-productos into master
Reviewed-on: nathalie/pedi2#10
2022-09-19 02:21:07 -03:00
nat
f0a1a68144 exportar todas las planillas en un formato apto para copiar y pegar a la planilla de compras 2022-09-19 02:18:39 -03:00
nat
098b23b864 Import de productos a partir de la planilla de compras con numero de filas 2022-09-11 02:51:38 -03:00
nathalie
cdb8522f65 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2022-09-07 08:15:47 -03:00
b1f1444a0c Merge pull request 'exportar-planillas' (#9) from exportar-planillas into master
Reviewed-on: nathalie/pedi2#9
2022-09-06 21:48:10 -03:00
Ale
4939dbbd83 Se pueden exportar las planillas de un barrio a pdf 2022-09-06 21:43:56 -03:00
Ale
25d5830462 esto debería estar en gitignore jeje 2022-09-06 21:39:09 -03:00
Ale
ac13e0a3f2 agregado mpdf 2022-09-06 21:38:52 -03:00
Ale
1aa112aac2 funciones para exportar planillas 2022-09-06 21:38:01 -03:00
nathalie
7468ca9086 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2022-09-05 23:21:12 -03:00
nat
11cd073a51 canasta 81 2022-09-05 23:20:21 -03:00
nathalie
50cdbe57e8 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2022-09-05 23:12:50 -03:00
nat
a3a4ecdd33 canasta 81 2022-09-05 23:06:19 -03:00
nathalie
6a00c6db22 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2022-08-09 23:15:07 -03:00
nat
401c0e888f canasta 80 2022-08-09 23:13:46 -03:00
nathalie
75401556aa Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2022-07-06 18:39:34 -03:00
nat
53a203b067 Productos canasta 79 2022-07-06 18:39:05 -03:00
nathalie
33d59073e3 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2022-07-06 17:30:54 -03:00
c06a3ed38c Merge pull request 'ajuste-tabla-admin' (#7) from ajuste-tabla-admin into master
Reviewed-on: nathalie/pedi2#7
2022-07-06 17:17:53 -03:00
eda9d5ce6c Merge pull request 'adminUI' (#6) from adminUI into master
Reviewed-on: nathalie/pedi2#6
2022-07-06 17:16:47 -03:00
rodrigo
4160f72615 Cambios de estilo 2022-06-28 19:24:15 -03:00
rodrigo
498c550a15 Ajuste para arreglar layout de admin
Saqué dos clases que estaban haciendo conflicto
2022-06-28 19:16:07 -03:00
nathalie
b733100269 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2022-06-11 11:09:06 -03:00
nat
8502fb72d9 Endpoint regenera vistas 2022-06-11 10:49:39 -03:00
Ale
0d5551406a Arreglado bug de totales con coma 2022-06-09 20:09:18 -03:00
nat
72bbaac9a6 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2022-06-09 15:48:16 -03:00
nat
ee916afdfd Readme 2022-06-09 15:47:29 -03:00
Ale
ece866a3ec Arreglado bug que mostraba los pedidos de todos los barrios en la pantalla de admin de cualquier barrio 2022-06-09 10:34:28 -03:00
Ale
77bdccdf86 Suma el total de los pedidos aprobados 2022-06-08 23:33:33 -03:00
nathalie
c8768665e0 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2022-06-08 22:39:47 -03:00
f2dee0359f Merge pull request 'adminUI' (#5) from adminUI into master
Reviewed-on: nathalie/pedi2#5
2022-06-08 22:29:28 -03:00
Ale
5b18461bd9 la pantalla de admin se comunica correctamente con la bd 2022-06-08 22:19:44 -03:00
Ale
b0f25de000 lista de subpedidos del barrio loggeado 2022-06-08 20:32:50 -03:00
nathalie
509ceaeefe Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2022-06-08 20:15:09 -03:00
nat
bcb1e1b2c8 productos canasta 78 2022-06-08 20:14:20 -03:00
nat
aa416b7ee4 install npm through dockerfile 2022-06-08 19:32:20 -03:00
nathalie
9e554b0a65 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 2022-06-08 18:31:42 -03:00
nat
b2e84204ce puerto db expuesto 2022-06-08 18:26:38 -03:00
Ale
dd1b66bd06 pantalla de login de admin de barrio y botoncito pa acceder 2022-06-08 15:18:14 -03:00
nat
8d5e780f94 refactor 2022-05-25 19:03:29 -03:00
dce0620365 Merge pull request 'Actualizar docker-compose.yml para optimizarlo para puesta en produccion.' (#4) from felix/pedi2:master into master
Reviewed-on: nathalie/pedi2#4
2022-05-21 19:34:17 -03:00
323ab09238 Modifico web.php para que sirva todo el contenido en https cuando esta en produccion 2022-05-19 15:30:11 -03:00
3a2ffde0ab Actualizar docker-compose.yml para optimizarlo para puesta en produccion. 2022-05-19 14:53:42 -03:00
Felix
a9bb6df711 arreglos del docker-compose.yml referentes al deploy en prod 2022-05-19 14:46:30 -03:00
nat
0410e844b1 Docker version 2022-05-18 18:25:51 -03:00
nat
2d302d0116 Arreglado bug de chismosa 2022-05-18 18:17:38 -03:00
nat
e4a08f5aed Chismosa scrollablre 2022-05-18 17:46:47 -03:00
nat
70235970ab comenzamos 2022-05-04 16:50:22 -03:00
nat
67aadf157f Merge branch 'lista-chismosa' 2022-05-04 16:24:43 -03:00
nat
54e515cb7a toast muestra que el pedido fue actualizado 2022-05-04 16:20:27 -03:00
nat
c82fdeee96 el boton de crear solo se muestra si es posible crear un pedido con ese nombre. en lugar de desabilitar el boton, se oculta 2022-05-04 15:46:43 -03:00
nat
34e4fd6bb5 texto de chismosa vacia 2022-05-04 15:37:32 -03:00
nat
9fb5275007 Barra de navegacion y de migas se mantienen fijas 2022-05-04 15:19:41 -03:00
nat
667d7dbddb Endpoint crea vista transpuesta en la que los productos son las filas y los barrios son las columnas 2022-04-19 17:24:59 -03:00
nat
f7f06cfa3a Mostrar apto para veganes y celiques. Reacomodar iconos de nacional y ecosolidaria 2022-04-11 23:40:41 -03:00
nat
1779f573ec Borrar producto de chismosa 2022-04-11 23:02:54 -03:00
nat
fba73636de Editar producto en chismossa 2022-04-11 22:53:26 -03:00
nat
3814022411 favicon 2022-04-11 22:17:10 -03:00
nat
53b998f1e5 Estilos de botones de editar y borrar en la chismosa 2022-04-07 16:56:58 -03:00
Ale
86d2c0e9f6 Se ven los productos en una tabla al clickear en la chismosa 2022-03-31 17:48:08 -03:00
Ale
8b4e07d66e Cantidades no validas ahora incluyen números no enteros además de negativos 2022-03-31 15:03:39 -03:00
Ale
420387cdb7 Boton de agregar a la chismosa desabilitado para cantidades no validas 2022-03-31 14:43:15 -03:00
763fd3f646 Merge pull request 'endpoint devuelve lista de productos en el subpedido, con su cantidad y subtotal' (#3) from lista-chismosa into master
Reviewed-on: nathalie/pedi2#3
2022-03-24 16:30:07 -03:00
Ale
7975528317 Actualiza subpedido al agregar/quitar productos 2022-03-24 16:26:38 -03:00
nat
89c9a85204 endpoint devuelve lista de productos en el subpedido, con su cantidad y subtotal 2022-03-16 23:56:51 -03:00
Ale
2f397c88d4 Agregados botones para cantidad en el modal de agregar producto 2022-02-28 13:08:03 -03:00
nat
3bf776b6f7 Merge branch 'master' of https://git.mps.org.uy/nathalie/pedi2 into precio-total-subpedido 2022-02-24 19:12:10 -03:00
nat
0ec99a8cf5 ver dinero total del pedido en la barra de navegacion (total de chismosa) 2022-02-24 19:10:06 -03:00
nat
6f532eaf05 ver dinero total del pedido en la barra de navegacion (total de chismosa) 2022-02-24 19:07:58 -03:00
bc7b7e2f22 Merge pull request 'Endpoint devuelve subpedido con totales' (#2) from precio-total-subpedido into master
Reviewed-on: nathalie/pedi2#2
2022-02-23 19:54:47 -03:00
nat
b700239e18 Endpoint devuelve subpedido con totales 2022-02-23 19:52:52 -03:00
0200160aa8 Merge pull request 'seleccionar-subpedido-existente' (#1) from seleccionar-subpedido-existente into master
Reviewed-on: nathalie/pedi2#1
2022-02-22 19:20:18 -03:00
190 changed files with 14274 additions and 3152 deletions

9
.directory Normal file
View file

@ -0,0 +1,9 @@
[Dolphin]
HeaderColumnWidths=372,72,103
SortRole=modificationtime
Timestamp=2022,6,1,16,36,48
Version=4
ViewMode=1
[Settings]
HiddenFilesShown=true

BIN
.docker-compose.yml.swp Normal file

Binary file not shown.

View file

@ -4,11 +4,15 @@ APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
VITE_DEV_SERVER_URL=http://vite:5173
LOG_CHANNEL=stack
USERID=1000
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_PORT_EXPOSED=3306
DB_DATABASE=pedi2
DB_USERNAME=pedi2
DB_PASSWORD=pedi2
@ -47,4 +51,5 @@ MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
WEB_CLIENT_EMAIL=informaticamps@buzon.uy
WEB_CLIENT_NAME=web
WEB_CLIENT_PASS=pass
WEB_CLIENT_PASS=pass
NGINX_PORT=8000

8
.gitignore vendored
View file

@ -10,3 +10,11 @@ Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
.idea
/resources/csv/exports/*.csv
/resources/csv/canastas/*.csv
/storage/csv/exports/*.csv
/storage/csv/canastas/*.csv
/public/css/
/public/js/
/public/mix-manifest.json

View file

@ -1,4 +1,4 @@
FROM php:7.4-fpm
FROM php:8.3-fpm
# Arguments defined in docker-compose.yml
ARG user
@ -12,13 +12,18 @@ RUN apt-get update && apt-get install -y \
libonig-dev \
libxml2-dev \
zip \
unzip
unzip \
libzip-dev
# Install node
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \
apt-get install -y nodejs
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip
# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

100
README.md
View file

@ -1,14 +1,15 @@
# Pedi2
Aplicación de compras del Mercado Popular de Subsistencia.
Aplicación de pedidos del Mercado Popular de Subsistencia.
Pedi2 está hecha en Laravel 7 y utiliza laravel7-docker de dyarleniber.
Pedi2 está hecha en Laravel 12 y Vue 2 con Vite y Vuex.
Se utilizan los siguientes servicios, separadamente:
- `app`, un servicio que corre PHP7.4-FPM.
- `app`, un servicio que corre PHP8.3-FPM.
- `db`, un servicio que corre MySQL 5.7.
- `nginx`, un servicio que usa el servicio app para parsear código PHP antes de servir la aplicación de Laravel al usuario final.
- `vite`, un servicio que corre el frontend de la aplicación.
## Pre-requisitos
- docker
@ -17,107 +18,50 @@ Se utilizan los siguientes servicios, separadamente:
## Instalación
1. Una vez descargado el proyecto, hacé una copia del archivo `.env.example` que se encuentra en la raíz del proyecto y nombrala `.env`. Seteá los valores correctos - específicamente, para las variables, `APP_URL`, `DB_USERNAME` y `DB_PASSWORD`. Prestá atención a que `DB_HOST` sea el nombre del servicio que corre MySQL (por defecto `DB_HOST=db`).
2. Construí la imagen de la app
2. Levantá los contenedores, construyendo la imagen de la app primero:
```bash
docker-compose build app
docker-compose up --build
```
3. Cuando termine, levantá los contenedores:
El ambiente ahora está andando, deberías ver los logs de cada servicio en la terminal. Falta ejecutar un par de comandos para terminar la instalación de Laravel. Podemos usar `docker-compose exec [nombre-del-servicio]` previo a un comando para ejecutarlo dentro del contenedor.
```bash
docker-compose up -d
```
El ambiente ahora está andando, pero necesitamos ejecutar un par de comandos para terminar la instalación de Laravel. Podemos usar `docker-compose exec [nombre-del-servicio]` previo a un comando para ejecutarlo dentro del contenedor.
4. Terminá de instalar las dependencias de la app, según fueron definidas en `composer.json`.
3. Abrí una nueva terminal, y terminá de instalar las dependencias de la app, según fueron definidas en `composer.json`:
```bash
docker-compose exec app composer update
docker-compose exec app composer install
```
5. Generá una clave de aplicación. Esta clave se usa para encriptar datos sensibles.
4. Generá una clave de aplicación. Esta clave se usa para encriptar datos sensibles:
```bash
docker-compose exec app php artisan key:generate
```
6. Corré las migraciones y seeders de Laravel
5. Corré las migraciones y seeders de Laravel:
```bash
docker-compose exec app php artisan migrate --seed
docker-compose exec app php artisan migrate:fresh --seed
```
7. Copia el token que se imprime al correr los seeders. Lo necesitamos para autenticar las llamadas que hagamos desde nuestro cliente web
6. Copia el token que se imprime al correr los seeders. Lo necesitamos para autenticar las llamadas que hagamos desde nuestro cliente web
7. Instala las dependencias de npm:
```bash
docker-compose exec app npm install
```
Ahora la aplicación está corriendo y la podés ver en el puerto 8000 de tu dominio o IP. En caso de que estés en tu máquina local, la vas a ver accediendo a `http://localhost:8000` desde tu navegador.
Podés usar el comando `logs` para ver los logs generados por tus servicios:
```bash
docker-compose logs nginx
```
---
## Services description
### Dockerfile
Although both `db` service and `nginx` service, will be based on default images obtained from the Docker Hub, the `app` service will be based on a custom image created by the `Dockerfile`.
The `Dockerfile` starts by defining the base image `php:7.4-fpm`.
After installing system packages and PHP extensions, the Composer will be installed by copying the composer executable from its latest official image.
A new system user is then created and set up using the `user` and `uid` arguments that were declared at the beginning of the `Dockerfile`. These values will be injected by Docker Compose at build time.
> This new system user is necessary to execute Laravel Artisan and Composer commands while developing the application. The `uid` setting ensures that the user inside the container has the same `uid` as your system user on your host machine. This way, any files created by these commands are replicated in the host with the correct permissions. This also means that youll be able to use your code editor of choice in the host machine to develop the application that is running inside containers.
Finally, the default working dir as `/var/www` and the newly created user are set. This will make sure youre connecting as a regular user, and that youre on the right directory, when running Laravel Artisan and Composer commands on the application container.
### PHP service
The `app` service will build an image called `laravel-image`, based on the `Dockerfile` previously created. The container defined by this service will run a php-fpm server to parse PHP code and send the results back to the nginx service, which will be running on a separate container. The mysql service defines a container running a MySQL 5.7 server. All these services will share a bridge network named `app-network`.
The application files will be synchronized on both the `app` and the `nginx` services via bind mounts. Bind mounts are useful in development environments because they allow for a performant two-way sync between host machine and containers.
Inside the `app` container you will be able to execute command line tasks with the Laravel Artisan and Composer.
The `app` service will set up a container named `laravel-app`. It builds a new Docker image based on a `Dockerfile` located in the same path as the `docker-compose.yml` file. The new image will be saved locally under the name `laravel-image`.
The `volumes` setting creates a shared volume that will synchronize contents from the current directory to `/var/www` inside the container. Notice that this is not your document root, since that will live in the nginx container.
Another file which will be synchronized is the `local.ini` file from the directory `./php/local.ini` to `/usr/local/etc/php/conf.d/local.ini` inside the container.
The `local.ini` is the configuration file (php.ini) that is read when PHP starts up.
### Nginx service
The `nginx` service uses a pre-built Nginx image on top of Alpine, a lightweight Linux distribution. It creates a container named `laravel-nginx`, and it uses the ports definition to create a redirection from port `8000` on the host system to port `80` inside the container.
The `volumes` setting creates two shared volumes. The first one will synchronize contents from the current directory to `/var/www` inside the container. This way, when you make local changes to the application files, they will be quickly reflected in the application being served by Nginx inside the container. The second volume will make sure the Nginx configuration file, located at `./nginx/conf.d/app.conf`, is copied to the containers Nginx configuration folder. This configuration file will configure Nginx to listen on port `80` and use `index.php` as default index page. It will set the document root to `/var/www/public`, and then configure Nginx to use the `app` service on port `9000` to process all the php files.
### MySQL service
The `db` service uses a pre-built MySQL 5.7 image from Docker Hub. Because Docker Compose automatically loads `.env` variable files located in the same directory as the `docker-compose.yml` file, you can obtain the database settings from the Laravel `.env` file.
The `volumes` setting creates two shared volumes. The first one will make sure the MySQL configuration file, located at `./mysql/my.cnf`, is copied to the containers MySQL configuration folder. The second volume will share a `.sql` database dump that will be used to initialize the application database. The MySQL image will automatically import `.sql` files placed in the `/docker-entrypoint-initdb.d` directory inside the container.
The `environment` setting defines environment variables in the new container. You can use values obtained from the Laravel `.env` file to set up the MySQL service, which will automatically create a new database and user based on the provided environment variables:
```bash
DB_HOST=db
DB_DATABASE=laravelapp
DB_USERNAME=laravelapp_user
DB_PASSWORD=password
Si estás actualizando o no te anda, probá limpiar los caches:
```
docker-compose exec app php artisan optimize:clear
docker-compose exec app composer dump-autoload
```
## References
- https://www.digitalocean.com/community/tutorials/how-to-install-and-set-up-laravel-with-docker-compose-on-ubuntu-20-04
- https://docs.docker.com/
- https://docs.docker.com/compose/
- https://github.com/dyarleniber/laravel7-docker
- https://laravel.com/docs/7.x/installation

11
app/CanastaLog.php Normal file
View file

@ -0,0 +1,11 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class CanastaLog extends Model
{
protected $fillable = ["path", "descripcion"];
protected $table = "carga_de_canastas";
}

View file

@ -0,0 +1,72 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
class AgregarEsBonoAPedidosAprobados extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'command:AgregarEsBonoAPedidosAprobados';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Agrega "producto_bono" a la view PedidosAprobados';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle(): int
{
DB::statement("
ALTER VIEW pedidos_aprobados(
grupo_de_compra_id,
grupo_de_compra_nombre,
grupo_de_compra_region,
producto_id,
producto_nombre,
producto_precio,
cantidad_pedida,
total_por_producto,
producto_es_bono
) AS
SELECT
g.id as grupo_de_compra_id,
g.nombre as grupo_de_compra_nombre,
g.region as grupo_de_compra_region,
pr.id AS producto_id,
pr.nombre as producto_nombre,
pr.precio as producto_precio,
SUM(ps.cantidad) as cantidad_pedida,
pr.precio*SUM(ps.cantidad) as total_por_producto,
pr.bono
FROM grupos_de_compra g
JOIN subpedidos s ON (s.grupo_de_compra_id = g.id AND s.aprobado=1)
JOIN producto_subpedido ps ON (ps.subpedido_id = s.id)
JOIN productos pr ON (pr.id = ps.producto_id)
GROUP BY
g.id, g.nombre, pr.id, pr.nombre
;");
return 0;
}
}

View file

@ -0,0 +1,62 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
class CrearPedidosAprobadosViewCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'view:CrearPedidosAprobadosView';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Crea view "pedidos_aprobados"';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle(): int
{
DB::statement("
CREATE OR REPLACE VIEW pedidos_aprobados
AS
SELECT
g.id as grupo_de_compra_id,
g.nombre as grupo_de_compra_nombre,
g.region as grupo_de_compra_region,
pr.id AS producto_id,
pr.nombre as producto_nombre,
pr.precio as producto_precio,
SUM(ps.cantidad) as cantidad_pedida,
pr.precio*SUM(ps.cantidad) as total_por_producto
FROM grupos_de_compra g
JOIN subpedidos s ON (s.grupo_de_compra_id = g.id AND s.aprobado=1)
JOIN producto_subpedido ps ON (ps.subpedido_id = s.id)
JOIN productos pr ON (pr.id = ps.producto_id)
GROUP BY
g.id, g.nombre, pr.id, pr.nombre
;");
return 0;
}
}

View file

@ -5,12 +5,14 @@ namespace App\Filtros;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Database\Eloquent\Builder;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Throwable;
use TypeError;
class Filtro extends Model
{
protected $request;
protected $builder;
protected $MENSAJES_ERROR = [
protected Request $request;
protected array $MENSAJES_ERROR = [
'ARGUMENTO' => 'Argumento inválido para el parámetro %s. Revise la documentación.'
];
@ -22,10 +24,10 @@ class Filtro extends Model
/**
* Apply all existing filters, if available.
*
* @param \Illuminate\Database\Eloquent\Builder $builder
* @return \Illuminate\Database\Eloquent\Builder
* @param Builder $builder
* @return Builder
*/
public function aplicar(Builder $builder)
public function aplicar(Builder $builder): Builder
{
$this->builder = $builder;
@ -43,17 +45,24 @@ class Filtro extends Model
//Obtener nombre del método (snake_case a camelCase)
$metodo = str_replace('_', '', lcfirst(ucwords($filtro, '_')));
if(!method_exists($this, $metodo)) { continue; }
if (!method_exists($this, $metodo))
continue;
//Llamar métodos sin argumentos
if ($valor === null|| (is_a($valor,'String') && trim($valor)=='')){ $this->$metodo(); continue; }
if ($valor === null || (is_a($valor,'String') && trim($valor)=='')) {
$this->$metodo();
continue;
}
//Llamar métodos con argumentos
try {
$this->$metodo($valor);
} catch (\Throwable $th) {
if (is_a($th,'TypeError') ) { throw new HttpException(400, sprintf($this->MENSAJES_ERROR['ARGUMENTO'],$filtro)); }
throw $th;
} catch (Throwable $error) {
if (is_a($error,'TypeError')) {
$mensaje = sprintf($this->MENSAJES_ERROR['ARGUMENTO'], $filtro);
throw new HttpException(400, $mensaje);
}
throw $error;
}
}
@ -63,12 +72,16 @@ class Filtro extends Model
//Buscar un término en el nombre
public function nombre(String $valor)
{
$this->builder->where('nombre', "LIKE", "%" . $valor . "%")->orderByRaw("IF(nombre = '{$valor}',2,IF(nombre LIKE '{$valor}%',1,0)) DESC");
$this->builder
->where('nombre', "LIKE", "%" . $valor . "%")
->orderByRaw("IF(nombre = '$valor',2,IF(nombre LIKE '$valor%',1,0)) DESC");
}
public function alfabetico(String $order = 'asc')
{
if(!in_array($order,['asc','desc'])) { throw new TypeError(); }
if (!in_array($order,['asc','desc']))
throw new TypeError();
$this->builder->orderBy('nombre', $order);
}
}

View file

@ -1,7 +1,6 @@
<?php
namespace App\Filtros;
use Illuminate\Database\Eloquent\Builder;
class FiltroDeProducto extends Filtro {
@ -10,4 +9,4 @@ class FiltroDeProducto extends Filtro {
$this->builder->where('categoria', $valor);
}
}
}

View file

@ -2,13 +2,23 @@
namespace App\Filtros;
use Illuminate\Database\Eloquent\Model;
use TypeError;
class FiltroDeSubpedido extends Filtro
{
public function grupoDeCompra(String $valor)
{
if (!is_numeric($valor)) { throw new TypeError();}
if (!is_numeric($valor))
throw new TypeError();
$this->builder->where('grupo_de_compra_id', intval($valor));
}
public function tipoPedido(String $valor)
{
if (!is_numeric($valor))
throw new TypeError();
$this->builder->where('tipo_pedido_id', intval($valor));
}
}

View file

@ -2,17 +2,207 @@
namespace App;
use App\Helpers\CsvHelper;
use App\Helpers\PdfHelper;
use App\Helpers\TransporteHelper;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use League\Csv\Exception;
use Mpdf\MpdfException;
class GrupoDeCompra extends Model
{
public $timestamps = false;
protected $fillable = [ "nombre","region","telefono","correo","referente_finanzas","cantidad_de_nucleos"];
protected $table = 'grupos_de_compra';
protected $hidden = ['password'];
protected $fillable = ["nombre", "region", "devoluciones_habilitadas", "saldo"];
protected $table = 'grupos_de_compra';
public function subpedidos() {
return $this->hasMany('App\Subpedido');
}
public function subpedidos(): HasMany
{
return $this->hasMany(Subpedido::class);
}
public function users(): HasMany
{
return $this->hasMany(User::class);
}
public function toggleDevoluciones(): bool
{
$this->devoluciones_habilitadas = !$this->devoluciones_habilitadas;
$this->save();
return $this->devoluciones_habilitadas;
}
public function pedidosAprobados()
{
return $this->pedidosHogares()
->where('aprobado', 1);
}
public function pedidosHogares()
{
return $this->subpedidos
->where('tipo_pedido_id', '=', 1);
}
public function totalARecaudar()
{
$total = 0;
foreach ($this->pedidosAprobados() as $subpedido) {
$total = $total + $subpedido->total();
}
return $total;
}
public function totalSinDevoluciones() {
$total = 0;
foreach ($this->pedidosAprobados() as $subpedido) {
$total = $total + $subpedido->totalSinDevoluciones();
}
return $total;
}
public function totalBarrial()
{
$total = 0;
foreach ($this->pedidosAprobados() as $subpedido) {
$total = $total + $subpedido->totalBarrial();
}
return $total;
}
public function totalDevoluciones()
{
$total = 0;
foreach ($this->pedidosAprobados() as $subpedido) {
$total = $total + $subpedido->devoluciones_total;
}
return $total;
}
public function totalDePedido()
{
return $this->totalCentralesQueNoPaganTransporte()
+ $this->totalCentralesQuePaganTransporte()
+ $this->totalTransporte()
;
}
public function totalATransferir()
{
return $this->totalDePedido() - $this->saldo;
}
public function totalCentralesQueNoPaganTransporte()
{
$total = 0;
foreach ($this->pedidosAprobados() as $subpedido) {
$total = $total + $subpedido->totalCentralesQueNoPaganTransporte();
}
return $total;
}
public function totalCentralesQuePaganTransporte()
{
$total = 0;
foreach ($this->pedidosAprobados() as $subpedido) {
$total = $total + $subpedido->totalCentralesQuePaganTransporte();
}
return $total;
}
public function totalTransporte()
{
return TransporteHelper::totalTransporte($this->totalCentralesQuePaganTransporte());
}
/**
* @return int
* Calcula la cantidad de bonos de transporte del barrio
*/
public function cantidadTransporte(): int
{
return TransporteHelper::cantidadTransporte($this->totalCentralesQuePaganTransporte());
}
/**
* @throws MpdfException
*/
public function exportarPedidosAPdf()
{
$fecha = now()->format('Y-m-d');
$filepath = $this->nombre . '-' . $fecha . '.pdf';
$pedidoOllas = $this->subpedidos
->where('tipo_pedido_id', '=', TipoPedido::firstOrCreate(['nombre' => 'olla'])->id);
$pedidos = $this->pedidosAprobados()->concat($pedidoOllas);
PdfHelper::exportarPedidos($filepath, $pedidos);
}
function pedidoParaPdf(): array
{
$productos = $this->productosPedidos(true, 'producto_id');
$pedido = [];
$pedido['productos'] = [];
$pedido['nombre'] = $this->nombre;
foreach ($productos as $producto) {
$productoParaPdf = [];
$productoParaPdf['pivot'] = [];
$productoParaPdf['nombre'] = $producto->producto_nombre;
$productoParaPdf['pivot']['cantidad'] = $producto->cantidad_pedida;
$productoParaPdf['pivot']['notas'] = false;
$productoParaPdf['bono'] = $producto->producto_es_bono;
$pedido['productos'][] = $productoParaPdf;
}
return $pedido;
}
public function generarHTML()
{
$view = view("pdfgen.pedido_tabla", ["pedido" => $this->pedidoParaPdf()]);
return $view->render();
}
/**
* @throws MpdfException
*/
public static function exportarPedidosBarrialesAPdf()
{
$barrios = GrupoDeCompra::barriosMenosPrueba()->get();
$fecha = now()->format('Y-m-d');
$filepath = 'pedidos_por_barrio-' . $fecha . '.pdf';
PdfHelper::exportarPedidos($filepath, $barrios);
}
public static function barriosMenosPrueba(): Builder
{
return self::where('nombre', '<>', 'PRUEBA')
->orderBy('region')
->orderBy('nombre');
}
public function productosPedidos($excluirBonos = false, $orderBy = 'producto_nombre'): Collection
{
$query = DB::table('pedidos_aprobados')
->where('grupo_de_compra_id', $this->id)
->where('producto_nombre','NOT LIKE','%barrial%');
if ($excluirBonos)
$query = $query->where('producto_es_bono',false);
return $query
->orderBy($orderBy)
->get()
->keyBy('producto_id');
}
public function setSaldo(float $saldo) {
$this->saldo = $saldo;
$this->save();
}
}

View file

@ -0,0 +1,144 @@
<?php
namespace App\Helpers;
use App\Producto;
use App\CanastaLog;
use DatabaseSeeder;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Str;
use League\Csv\Exception;
class CanastaHelper
{
const TIPO = "Tipo";
const PRODUCTO = 'Producto';
const PRECIO = 'Precio';
const REGEX_BONO = "/^[BF]/i";
const ARCHIVO_SUBIDO = 'Archivo subido';
const CANASTA_CARGADA = 'Canasta cargada';
const PRODUCTO_TALLE_COLOR = "PTC";
public static function canastaActual() {
$result = [];
$log = CanastaLog::where('descripcion', self::CANASTA_CARGADA)
->orderBy('created_at', 'desc')
->first();
$nombre = str_replace(storage_path(), "", $log->path);
$nombre = str_replace("/csv/canastas/", "", $nombre);
$result["nombre"] = str_replace(".csv", "", $nombre);
$result["fecha"] = $log->created_at;
return $result;
}
public static function guardarCanasta($data, $path): string {
if (!File::exists(storage_path('csv/canastas'))) {
File::makeDirectory(storage_path('csv/canastas'), 0755, true);
}
$nombre = $data->getClientOriginalName();
$storage_path = storage_path($path);
$data->move($storage_path, $nombre);
self::log($storage_path . $nombre, self::ARCHIVO_SUBIDO);
return $nombre;
}
/**
* @throws Exception
*/
public static function cargarCanasta($archivo) {
self::limpiarTablas();
$registros = CsvHelper::getRecords($archivo, "No se pudo leer el archivo.");
$toInsert = [];
$categoria = '';
foreach($registros as $i => $registro) {
// saltear bono de transporte y filas que no tienen tipo
if (self::noTieneTipo($registro) || $registro[self::TIPO] == "T")
continue;
// obtener categoria si no hay producto
if ($registro[self::PRODUCTO] == '') {
// no es la pregunta de la copa?
if (!Str::contains($registro[self::TIPO],"¿"))
$categoria = $registro[self::TIPO];
continue; // saltear si es la pregunta de la copa
}
// completar producto
$toInsert[] = DatabaseSeeder::addTimestamps([
'fila' => $i,
'categoria' => $categoria,
'nombre' => trim(str_replace('*', '',$registro[self::PRODUCTO])),
'precio' => $registro[self::PRECIO],
'es_solidario' => Str::contains($registro[self::PRODUCTO],"*"),
'bono' => preg_match(self::REGEX_BONO, $registro[self::TIPO]),
'requiere_notas'=> $registro[self::TIPO] == self::PRODUCTO_TALLE_COLOR,
]);
}
foreach (array_chunk($toInsert,DatabaseSeeder::CHUNK_SIZE) as $chunk)
Producto::insert($chunk);
self::agregarBonoBarrial();
self::log($archivo, self::CANASTA_CARGADA);
}
/**
* @param $path
* @param $descripcion
* @return void
*/
private static function log($path, $descripcion): void
{
$log = new CanastaLog([
'path' => $path,
'descripcion' => $descripcion,
]);
$log->save();
}
private static function limpiarTablas()
{
DB::delete('delete from producto_subpedido');
DB::delete('delete from productos');
DB::delete('delete from subpedidos');
}
private static function agregarBonoBarrial()
{
$categoria = Producto::all()
->pluck('categoria')
->unique()
->flatten()
->first(function ($c) {
return Str::contains($c, 'BONO');
});
Producto::create([
'nombre' => "Bono barrial",
'precio' => 20,
'categoria' => $categoria,
'bono' => 1,
'es_solidario' => 0,
'requiere_notas'=> false,
]);
}
/**
* @param $registro
* @return bool
*/
public static function noTieneTipo($registro): bool
{
return !Arr::has($registro, self::TIPO) || trim($registro[self::TIPO]) == '';
}
}

101
app/Helpers/CsvHelper.php Normal file
View file

@ -0,0 +1,101 @@
<?php
namespace App\Helpers;
use App\Http\Controllers\ComisionesController;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Log;
use Iterator;
use League\Csv\CannotInsertRecord;
use League\Csv\Exception;
use League\Csv\InvalidArgument;
use League\Csv\Reader;
use League\Csv\Writer;
class CsvHelper
{
/**
* @throws Exception
*/
public static function getRecords($filePath, $message): Iterator {
try {
$csv = self::getReader($filePath);
return $csv->getRecords();
} catch (InvalidArgument|Exception $e) {
Log::error($e->getMessage());
throw new Exception($message, $e);
}
}
/**
* @throws Exception
*/
public static function cambiarParametro(string $id, string $valor): void
{
try {
$updated = false;
$filePath = resource_path(ComisionesController::PARAMETROS_PATH);
$csv = self::getReader($filePath);
$headers = $csv->getHeader();
$records = array_map(fn($r) => (array) $r, iterator_to_array($csv->getRecords()));
foreach ($records as &$record) {
if ($record['id'] === $id) {
$record['valor'] = $valor;
$updated = true;
break;
}
}
unset($record);
if (!$updated)
throw new Exception("Parametro '{$id}' no encontrado.");
self::generarCsv($filePath, $records, $headers, "|", "'", false);
} catch (CannotInsertRecord | InvalidArgument $e) {
Log::error("Error al actualizar csv: " . $e->getMessage());
throw new Exception("Error al actualizar csv", $e);
}
}
/**
* @throws InvalidArgument
* @throws CannotInsertRecord
*/
public static function generarCsv($filePath, $contenido, $headers = null, $delimiter = null, $enclosure = null, $export = true): void
{
$path = $filePath;
if ($export) {
if (!File::exists(storage_path('csv/exports')))
File::makeDirectory(storage_path('csv/exports'), 0755, true);
$path = storage_path($filePath);
}
$writer = Writer::createFromPath($path, 'w');
if ($delimiter)
$writer->setDelimiter($delimiter);
if ($enclosure)
$writer->setEnclosure($enclosure);
if ($headers)
$writer->insertOne($headers);
$writer->insertAll($contenido);
}
/**
* @param string $filePath
* @return Reader
* @throws InvalidArgument
* @throws Exception
*/
private static function getReader(string $filePath): Reader
{
$csv = Reader::createFromPath($filePath);
$csv->setDelimiter("|");
$csv->setEnclosure("'");
$csv->setHeaderOffset(0);
return $csv;
}
}

29
app/Helpers/PdfHelper.php Normal file
View file

@ -0,0 +1,29 @@
<?php
namespace App\Helpers;
use Mpdf\Mpdf;
use Mpdf\MpdfException;
class PdfHelper
{
/**
* Requiere que el segundo argumento tenga definida la función generarHTML()
* para crear la tabla con los datos del pedido que se inserta en el pdf.
*
* @return void
* @throws MpdfException
*/
public static function exportarPedidos($filepath, $pedidos)
{
$mpdf = new Mpdf();
foreach ($pedidos as $pedido) {
$html = $pedido->generarHTML();
$mpdf->WriteHTML($html);
$mpdf->AddPage();
}
$mpdf->Output($filepath, 'D');
}
}

View file

@ -0,0 +1,258 @@
<?php
namespace App\Helpers;
use App\GrupoDeCompra;
use App\TipoPedido;
use Closure;
use Illuminate\Database\Query\Expression;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use League\Csv\CannotInsertRecord;
use League\Csv\Exception;
use League\Csv\InvalidArgument;
class PedidosExportHelper
{
/**
* @throws InvalidArgument
* @throws CannotInsertRecord
* @throws Exception
*/
static public function pedidosBarriales()
{
$filePath = "csv/exports/pedidos-por-barrio-" . now()->format('Y-m-d') . ".csv";
$barrios = GrupoDeCompra::barriosMenosPrueba()->get();
self::exportarCSV(
$filePath,
$barrios,
self::generarContenidoCSV(
$barrios,
fn ($grupoId) =>
"subpedidos.grupo_de_compra_id = $grupoId
AND subpedidos.aprobado = 1
AND subpedidos.tipo_pedido_id = 1"
)
);
}
/**
* @throws InvalidArgument
* @throws CannotInsertRecord
* @throws Exception
*/
static public function pedidosDeOllas()
{
$filePath = "csv/exports/pedidos-de-ollas-" . now()->format('Y-m-d') . ".csv";
$barrios = GrupoDeCompra::barriosMenosPrueba()
->whereHas('subpedidos', function ($query) {
$tipo_olla = self::getTipoId('olla');
$query->where('tipo_pedido_id', $tipo_olla);
})
->get();
$contenido = self::generarContenidoCSV($barrios,
fn($grupoId) => "subpedidos.grupo_de_compra_id = $grupoId
AND subpedidos.tipo_pedido_id = 2");
$ollas = self::cantidadDeOllasParaCSV($barrios, $contenido);
self::exportarCSV(
$filePath,
$barrios,
$contenido->concat([$ollas])
);
}
/**
* @throws Exception
*/
public static function cantidadDeOllasParaCSV(Collection $barrios, Collection $contenido)
{
$tipo_olla = self::getTipoId('olla');
$parametros = collect(CsvHelper::getRecords(resource_path("csv/parametros.csv"), "No se pudo leer el archivo."));
$fila = [
"producto" => "Cantidad de ollas",
"precio" => $parametros->where('id','monto-olla')->pluck('valor')->first(),
"paga_transporte" => false,
"fila" => $contenido->last()->fila + 1,
];
foreach ($barrios as $barrio) {
$pedido = $barrio->subpedidos()->where('tipo_pedido_id', $tipo_olla)->first();
$fila[$barrio->nombre] = $pedido->cantidad_ollas;
}
return (object) $fila;
}
/**
* @throws InvalidArgument
* @throws CannotInsertRecord
* @throws Exception
*/
static public function pedidoTotalDeBarrio(GrupoDeCompra $grupo)
{
$filePath = "csv/exports/" . $grupo->nombre . "-" . now()->format('Y-m-d') . ".csv";
$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.aprobado = 1"
),
);
}
/**
* @throws InvalidArgument
* @throws CannotInsertRecord
* @throws Exception
*/
static public function pedidosDeBarrio(GrupoDeCompra $grupo)
{
$filePath = "csv/exports/" . $grupo->nombre . "-completo-" . now()->format('Y-m-d') . ".csv";
$subpedidos = $grupo->subpedidos()->where('aprobado', true)->get();
self::exportarCSV(
$filePath,
$subpedidos,
self::generarContenidoCSV(
$subpedidos,
fn ($subpedidoId) => "subpedidos.id = $subpedidoId",
)
);
}
/**
* @throws InvalidArgument
* @throws CannotInsertRecord
* @throws Exception
*/
private static function exportarCSV(
string $filename,
Collection $headers,
Collection $contenido
): void {
$nombresColumnas = $headers->pluck('nombre')->toArray();
$columnas = array_merge(['Producto'], $nombresColumnas);
$filaTransporte = TransporteHelper::filaTransporte();
$planilla = [];
$ultimaFila = 1;
foreach ($contenido as $fila) {
$filaActual = $fila->fila;
while ($filaActual - $ultimaFila > 1) {
$ultimaFila++;
$planilla[$ultimaFila] = [$ultimaFila === $filaTransporte ? 'Bono de transporte' : '---'];
}
$planilla[$filaActual] = [$fila->producto];
foreach ($nombresColumnas as $nombre)
$planilla[$filaActual][] = $fila->$nombre ?? 0;
$ultimaFila = $filaActual;
}
$planilla[$filaTransporte] = array_merge(['Bono de transporte'], self::cantidadesTransporte($nombresColumnas, $contenido));
ksort($planilla);
CsvHelper::generarCsv($filename, $planilla, $columnas);
}
/**
* @param Collection $headers
* @param Closure $filtroCallback
* <br>
* Ejemplo de uso:
* ``
* PedidosExportHelper::generarContenidoCSV(GrupoDeCompra::barriosMenosPrueba(),
* fn($gdc_id) => "subpedidos.grupo_de_compra_id = $gdc_id");
* ``
* @return Collection
* Los elementos son de la forma
* {
* fila: int (fila del producto),
* producto: string (nombre del producto),
* precio: float (precio del producto),
* paga_transporte: bool (1 o 0, calculado a partir de bono y categoria),
* barrio_1: string (cantidad pedida por barrio_1),
* ...
* barrio_n: string (cantidad pedida por barrio_n)
* }
*/
public static function generarContenidoCSV(
Collection $headers,
Closure $filtroCallback
): Collection {
$expresionesColumnas = $headers->map(function ($header) use ($filtroCallback) {
$id = $header['id'];
$nombre = $header['nombre'];
$filtro = $filtroCallback($id);
return DB::raw("
SUM(CASE WHEN $filtro THEN producto_subpedido.cantidad ELSE 0 END) as `$nombre`
");
})->toArray();
$query = DB::table('productos')
->where('productos.nombre', 'not like', '%barrial%')
->leftJoin('producto_subpedido', 'productos.id', '=', 'producto_subpedido.producto_id')
->leftJoin('subpedidos', 'subpedidos.id', '=', 'producto_subpedido.subpedido_id');
$columnasProducto = [
'productos.fila as fila',
'productos.nombre as producto',
'productos.precio as precio',
self::pagaTransporte(),
];
return $query->select(array_merge(
$columnasProducto,
$expresionesColumnas
))->groupBy('productos.fila', 'productos.id', 'productos.nombre')
->orderBy('productos.fila')
->get();
}
/**
* @return Expression
*/
public static function pagaTransporte(): Expression
{
return DB::raw('CASE WHEN productos.bono OR productos.categoria LIKE "%SUBSIDIADO%" THEN 0 ELSE 1 END as paga_transporte');
}
/**
* @param array $nombresColumnas
* @param Collection $contenido
* @return array
*/
public static function cantidadesTransporte(array $nombresColumnas, Collection $contenido): array
{
$transporte = [];
foreach ($nombresColumnas as $nombre) {
$suma = 0;
foreach ($contenido as $fila) {
if ($fila->paga_transporte) {
$cantidad = $fila->$nombre ?? 0;
$precio = $fila->precio ?? 0;
$suma += $cantidad * $precio;
}
}
$transporte[] = TransporteHelper::cantidadTransporte($suma);
}
return $transporte;
}
/**
* @return mixed
*/
public static function getTipoId(string $tipo)
{
$tipo_olla = TipoPedido::where('nombre', $tipo)->first()->id;
return $tipo_olla;
}
}

View file

@ -0,0 +1,76 @@
<?php
namespace App\Helpers;
use App\CanastaLog;
use Illuminate\Support\Facades\Log;
use InvalidArgumentException;
use League\Csv\Exception;
class TransporteHelper
{
private const COSTO_TRANSPORTE = "bono-transporte";
private const MONTO_TRANSPORTE = "monto-transporte";
private static ?array $parametros = null;
/**
* @throws Exception
*/
public static function cantidadTransporte($monto)
{
return ceil($monto / self::getParametro(self::MONTO_TRANSPORTE));
}
/**
* @throws Exception
*/
public static function totalTransporte($monto)
{
return self::cantidadTransporte($monto) * self::getParametro(self::COSTO_TRANSPORTE);
}
/**
* @throws Exception
*/
public static function filaTransporte()
{
$ultimaCanasta = CanastaLog::where('descripcion', CanastaHelper::CANASTA_CARGADA)
->orderBy('created_at', 'desc')
->pluck('path')
->first();
$registros = CsvHelper::getRecords($ultimaCanasta, "No se encontró la ultima canasta.");
$error = 'No hay fila de tipo T en la planilla: ' . $ultimaCanasta;
foreach ($registros as $key => $registro)
if ($registro[CanastaHelper::TIPO] == 'T')
return $key;
Log::error($error);
throw new Exception($error);
}
/**
* @throws Exception
*/
public static function getParametro(string $id): int
{
if (self::$parametros === null) {
$records = CsvHelper::getRecords(resource_path('csv/parametros.csv'), "No se pudo leer el archivo.");
self::$parametros = [];
foreach ($records as $row) {
self::$parametros[$row['id']] = $row;
}
}
if (!isset(self::$parametros[$id])) {
throw new InvalidArgumentException("Parámetro '$id' no encontrado.");
}
return (int) self::$parametros[$id]['valor'];
}
public static function resetParametros(): void {
self::$parametros = null;
}
}

View file

@ -2,9 +2,62 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\GrupoDeCompra;
use App\Helpers\PedidosExportHelper;
use League\Csv\Exception;
use Mpdf\MpdfException;
class AdminController extends Controller
{
//
public function show()
{
return view('auth/login');
}
public function index() {
return view('auth/admin_subpedidos');
}
public function exportarPedidosAPdf(GrupoDeCompra $gdc) {
try {
$gdc->exportarPedidosAPdf();
return response();
} catch (MpdfException $e) {
return response()->json(['message' => $e->getMessage()], 500);
}
}
public function exportarPedidoACSV(GrupoDeCompra $gdc)
{
try {
PedidosExportHelper::pedidoTotalDeBarrio($gdc);
} catch (Exception $e) {
return response()->json(['message' => $e->getMessage()]);
}
$pattern = storage_path('csv/exports/'. $gdc->nombre . '-*.csv');
$files = glob($pattern);
usort($files, function ($a, $b) {
return filemtime($b) <=> filemtime($a);
});
return response()->download($files[0]);
}
public function exportarPedidoConNucleosACSV(GrupoDeCompra $gdc)
{
try {
PedidosExportHelper::pedidosDeBarrio($gdc);
} catch (Exception $e) {
return response()->json(['message' => $e->getMessage()]);
}
$pattern = storage_path('csv/exports/'.$gdc->nombre.'-completo-*.csv');
$files = glob($pattern);
usort($files, function ($a, $b) {
return filemtime($b) <=> filemtime($a);
});
return response()->download($files[0]);
}
}

View file

@ -0,0 +1,13 @@
<?php
namespace App\Http\Controllers\Api;
use App\Helpers\CanastaHelper;
use App\Http\Controllers\Controller;
class CanastaController extends Controller
{
public function canastaActual() {
return response()->json(CanastaHelper::canastaActual());
}
}

View file

@ -0,0 +1,48 @@
<?php
namespace App\Http\Controllers\Api;
use App\GrupoDeCompra;
use App\Http\Controllers\Controller;
use App\Http\Resources\GrupoDeCompraComisionesResource;
use App\Http\Resources\GrupoDeCompraResource;
class GrupoDeCompraController extends Controller
{
public function index()
{
return GrupoDeCompraResource::collection(GrupoDeCompra::all());
}
public function show(GrupoDeCompra $grupoDeCompra)
{
return new GrupoDeCompraResource($grupoDeCompra);
}
public function regiones()
{
return GrupoDeCompra::all()->pluck('region')->unique()->flatten();
}
public function region(string $region)
{
return GrupoDeCompra::where('region', $region)->get();
}
public function toggleDevoluciones(int $gdc) {
GrupoDeCompra::find($gdc)->toggleDevoluciones();
return response()->noContent();
}
public function setSaldo(int $gdc) {
$valid = request()->validate([
'saldo' => ['required', 'min:0'],
]);
$grupoDeCompra = GrupoDeCompra::find($gdc);
$grupoDeCompra->setSaldo($valid['saldo']);
return response()->noContent();
}
public function saldos()
{
return GrupoDeCompraComisionesResource::collection(GrupoDeCompra::all());
}
}

View file

@ -2,35 +2,21 @@
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Filtros\FiltroDeProducto;
use App\Http\Resources\ProductoResource;
use App\Producto;
class ProductoController extends Controller
{
/**
* Mostrar una lista de productos.
*
* @param App\Filtros\FiltroDeProducto $filtros
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function index(FiltroDeProducto $filtros, Request $request)
{
return ProductoResource::collection(Producto::filtrar($filtros)->paginate(Producto::getPaginar($request)));
}
/**
* Display the specified resource.
*
* @param \App\Producto $producto
* @return \Illuminate\Http\Response
*/
public function show(Producto $producto)
public function categorias()
{
return new ProductoResource($producto);
return Producto::all()->pluck('categoria')->unique()->flatten();
}
}

View file

@ -3,54 +3,108 @@
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Producto;
use App\TipoPedido;
use Illuminate\Http\Request;
use App\Filtros\FiltroDeSubpedido;
use App\Subpedido;
use App\GrupoDeCompra;
use App\Http\Resources\SubpedidoResource;
use Illuminate\Validation\Rule;
use Symfony\Component\HttpKernel\Exception\HttpException;
class SubpedidoController extends Controller
{
/**
* Mostrar una lista de productos.
*
* @param App\Filtros\FiltroDeSubpedido $filtros
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function index(FiltroDeSubpedido $filtros, Request $request)
{
return Subpedido::filtrar($filtros)->get();
return Subpedido::filtrar($filtros)->select('id','nombre')->get();
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
public function indexResources(FiltroDeSubpedido $filtros, Request $request)
{
return SubpedidoResource::collection(Subpedido::filtrar($filtros)->get());
}
public function store(Request $request)
{
$validado = $this->validateSubpedido();
if (Subpedido::where("nombre",$validado["nombre"])->where("grupo_de_compra_id",$validado["grupo_de_compra_id"])->get()->count()) {
throw new HttpException(400, "Ya existe un subpedido con este nombre");
}
$s = new Subpedido();
$s->nombre = $validado["nombre"];
$s->grupo_de_compra_id = $validado["grupo_de_compra_id"];
$s->save();
return $s;
if (Subpedido::where([
"nombre" => $validado["nombre"],
"tipo_pedido_id" => $validado["tipo_id"],
"grupo_de_compra_id" => $validado["grupo_de_compra_id"]])
->get()
->count())
throw new HttpException(400, "Ya existe un pedido con este nombre");
$pedido = new Subpedido();
$pedido->nombre = $validado["nombre"];
$pedido->grupo_de_compra_id = $validado["grupo_de_compra_id"];
$pedido->tipo_pedido_id = $validado["tipo_id"];
$pedido->save();
return $this->show($pedido);
}
protected function validateSubpedido(){
protected function validateSubpedido(): array
{
return request()->validate([
'nombre' => 'required|max:255',
'grupo_de_compra_id' => [
'required',
Rule::in(GrupoDeCompra::all()->pluck('id')),
]
],
'tipo_id' => [
'required',
Rule::in(TipoPedido::all()->pluck('id')),
],
]);
}
public function show(Subpedido $subpedido)
{
return new SubpedidoResource($subpedido);
}
// recibe request, saca producto y cantidad, valida, y pasa a syncProducto en Subpedido
public function syncProductos(Subpedido $subpedido) {
if ($subpedido->aprobado)
abort(400, "No se puede modificar un pedido aprobado.");
$valid = request()->validate([
'cantidad' => ['integer','required','min:0'],
'notas' => 'nullable',
'producto_id' => [
'required',
Rule::in(Producto::all()->pluck('id')),
]
]);
$producto = Producto::find($valid['producto_id']);
$notas = $valid['notas'];
$cantidad = $valid['cantidad'];
$subpedido->syncProducto($producto, $cantidad, $notas ?? "");
return new SubpedidoResource($subpedido);
}
public function toggleAprobacion(Subpedido $subpedido) {
$valid = request()->validate([
'aprobacion' => 'required | boolean'
]);
$subpedido->toggleAprobacion($valid['aprobacion']);
return response()->noContent();
}
public function syncDevoluciones(Subpedido $subpedido) {
if ($subpedido->aprobado)
abort(400, "No se puede modificar un pedido aprobado.");
$valid = request()->validate([
'total' => 'required|min:0',
'notas' => 'min:0'
]);
$subpedido->syncDevoluciones($valid['total'], $valid['notas'] ?? "");
return new SubpedidoResource($subpedido);
}
}

View file

@ -5,7 +5,7 @@ namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
class LoginController extends Controller
{
@ -28,6 +28,11 @@ class LoginController extends Controller
*/
protected $redirectTo = RouteServiceProvider::HOME;
protected function authenticated(Request $request, $user)
{
return redirect('/');
}
/**
* Create a new controller instance.
*

View file

@ -0,0 +1,186 @@
<?php
namespace App\Http\Controllers;
use App\GrupoDeCompra;
use App\Helpers\CanastaHelper;
use App\Helpers\CsvHelper;
use App\Helpers\PedidosExportHelper;
use App\Helpers\TransporteHelper;
use App\Http\Resources\GrupoDeCompraResource;
use App\Producto;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
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;
class ComisionesController
{
const PARAMETROS_PATH = 'csv/parametros.csv';
const CANASTAS_PATH = 'csv/canastas/';
const BARRIO = "Barrio";
const SALDO = "Saldo";
public function show()
{
return view('auth/login');
}
public function descargarPedidos()
{
try {
PedidosExportHelper::pedidosBarriales();
} catch (CannotInsertRecord|InvalidArgument|Exception $e) {
Log::error($e->getMessage());
return response()->json(['message' => $e->getMessage()], 500);
}
$pattern = storage_path('csv/exports/pedidos-por-barrio-*.csv');
$files = glob($pattern);
usort($files, function ($a, $b) {
return filemtime($b) <=> filemtime($a);
});
return response()->download($files[0]);
}
public function descargarPedidosDeOllas()
{
try {
PedidosExportHelper::pedidosDeOllas();
} catch (CannotInsertRecord|InvalidArgument|Exception $e) {
return response()->json(['message' => $e->getMessage()], 500);
}
$pattern = storage_path('csv/exports/pedidos-de-ollas-*.csv');
$files = glob($pattern);
usort($files, function ($a, $b) {
return filemtime($b) <=> filemtime($a);
});
return response()->download($files[0]);
}
public function descargarNotas()
{
try {
Producto::planillaNotas();
} catch (CannotInsertRecord|InvalidArgument $e) {
return response()->json(['message' => $e->getMessage()], 500);
}
$pattern = storage_path('csv/exports/notas-por-barrio-*.csv');
$files = glob($pattern);
usort($files, function ($a, $b) {
return filemtime($b) <=> filemtime($a);
});
return response()->download($files[0]);
}
public function pdf() {
try {
GrupoDeCompra::exportarPedidosBarrialesAPdf();
return response();
} catch (MpdfException $e) {
return response()->json(['message' => $e->getMessage()], 500);
}
}
public function cargarCanasta(Request $request): JsonResponse
{
$request->validate([
'data' => 'required|file|mimes:csv,txt|max:2048',
]);
$nombre = CanastaHelper::guardarCanasta($request->file('data'), self::CANASTAS_PATH);
try {
CanastaHelper::cargarCanasta(storage_path(self::CANASTAS_PATH . $nombre));
} catch (Exception $e) {
return response()->json(['message' => $e->getMessage()], 500);
}
return response()->json([
'message' => 'Canasta cargada exitosamente',
]);
}
public function descargarCanastaEjemplo(): BinaryFileResponse
{
$file = resource_path('csv/productos.csv');
return response()->download($file);
}
public function cargarSaldos(Request $request): JsonResponse
{
$request->validate([
'data' => 'required|file|mimes:csv,txt|max:2048',
]);
$file = $request->file('data')->getPathname();
try {
$records = CsvHelper::getRecords($file, "No se pudo leer el archivo.");
} catch (Exception $e) {
return response()->json(['message' => $e->getMessage()], 500);
}
foreach ($records as $record) {
$barrio = $record[self::BARRIO];
$saldo = $record[self::SALDO];
GrupoDeCompra::where('nombre', $barrio)
->update(['saldo' => $saldo]);
}
return response()->json(GrupoDeCompraResource::collection(GrupoDeCompra::all()));
}
public function descargarSaldosEjemplo(): BinaryFileResponse
{
$file = resource_path('csv/saldos.csv');
return response()->download($file);
}
public function obtenerParametros(): JsonResponse
{
try {
$records = self::parametrosRecords();
$result = [];
foreach ($records as $record)
$result[] = $record;
return response()->json($result);
} catch (Exception $e) {
return response()->json(['message' => $e->getMessage()], 500);
}
}
public function modificarParametros(string $parametro_id, Request $request) {
try {
if (collect(self::parametrosRecords())
->contains('id', $parametro_id)) {
$valid = $request->validate([
'valor' => ['required', 'numeric', 'gte:0'],
]);
CsvHelper::cambiarParametro($parametro_id, $valid['valor']);
TransporteHelper::resetParametros();
return response()->noContent();
}
return response()->json(['message' => 'Parametro no encontrado.'], 404);
} catch (Exception $e) {
return response()->json(['message' => $e->getMessage()], 500);
}
}
/**
* @throws Exception
*/
private static function parametrosRecords(): array
{
$records = CsvHelper::getRecords(resource_path(self::PARAMETROS_PATH), "No se pudo leer el archivo.");
return iterator_to_array($records);
}
}

View file

@ -0,0 +1,43 @@
<?php
namespace App\Http\Controllers;
use App\GrupoDeCompra;
use App\Http\Resources\PedidoOllasResource;
use App\TipoPedido;
use Illuminate\Http\Request;
class OllasController extends Controller
{
public function show()
{
return view('auth/login');
}
public function pedido(GrupoDeCompra $gdc)
{
$tipoOlla = TipoPedido::firstOrCreate(['nombre' => 'olla']);
$pedido = $gdc->subpedidos()->firstOrCreate([
'nombre' => 'Pedido de Ollas de ' . $gdc->nombre,
'tipo_pedido_id' => $tipoOlla->id,
]);
if (!$pedido->cantidad_ollas) {
$pedido->cantidad_ollas = 0;
$pedido->save();
}
return response()->json(new PedidoOllasResource($pedido));
}
public function actualizarCantidadOllas(GrupoDeCompra $gdc, Request $request)
{
$valid = $request->validate([
'cantidad' => 'required|numeric|min:0',
]);
$pedido = $gdc->subpedidos()->where([
'nombre' => 'Pedido de Ollas de ' . $gdc->nombre
])->first();
$pedido->cantidad_ollas = $valid['cantidad'];
$pedido->save();
return response()->noContent();
}
}

View file

@ -2,8 +2,6 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProductoController extends Controller
{
/**
@ -16,11 +14,6 @@ class ProductoController extends Controller
$this->middleware(['auth','subpedido']);
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Contracts\Support\Renderable
*/
public function index()
{
return view('productos');

View file

@ -0,0 +1,37 @@
<?php
namespace App\Http\Controllers;
use App\UserRole;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class RouteController extends Controller
{
function home(Request $request) {
if (!Auth::check())
return redirect('/login');
$barrio = UserRole::where('nombre', 'barrio')->first();
$admin = UserRole::where('nombre', 'admin_barrio')->first();
$comision = UserRole::where('nombre', 'comision')->first();
$ollas = UserRole::where('nombre', 'ollas')->first();
switch ($request->user()->role_id) {
case $barrio->id:
return redirect('/pedido');
case $admin->id:
return redirect('/admin');
case $comision->id:
return redirect('/comisiones');
case $ollas->id:
return redirect('/ollas');
default:
abort(400, 'Rol de usuario invalido');
}
}
function main(Request $request) {
return view('main');
}
}

View file

@ -0,0 +1,35 @@
<?php
namespace App\Http\Controllers;
use App\Subpedido;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\Rule;
class SessionController extends Controller
{
public function store(Request $request): Response
{
$grupo_de_compra_id = Auth::user()->grupo_de_compra_id;
$validated = $request->validate([
'id' => 'required',
Rule::in(Subpedido::where('grupo_de_compra_id', $grupo_de_compra_id)->pluck('id')),
]);
session()->put('pedido_id', $validated["id"]);
return response()->noContent();
}
public function fetch(): JsonResponse
{
return response()->json(['id' => session('pedido_id')]);
}
public function destroy(): Response
{
session()->forget('pedido_id');
return response()->noContent();
}
}

View file

@ -0,0 +1,43 @@
<?php
namespace App\Http\Controllers;
use App\GrupoDeCompra;
use App\Http\Resources\GrupoDeCompraPedidoResource;
use App\Http\Resources\GrupoDeCompraResource;
use App\UserRole;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class UserController extends Controller
{
public function user(Request $request)
{
return ['user' => $request->user()->name];
}
public function rol(Request $request) {
return ["rol" => UserRole::find($request->user()->role_id)->nombre];
}
public function grupoDeCompra(Request $request)
{
$user = Auth::user();
$result = [ 'grupo_de_compra' => null, ];
$grupo_de_compra = GrupoDeCompra::find($user->grupo_de_compra_id);
switch (UserRole::findOrFail($user->role_id)->nombre) {
case 'ollas':
case 'barrio':
$result['grupo_de_compra'] = new GrupoDeCompraPedidoResource($grupo_de_compra);
break;
case 'admin_barrio':
$result['grupo_de_compra'] = new GrupoDeCompraResource($grupo_de_compra);
break;
case 'comision':
break;
default:
abort(400, 'Rol invalido.');
}
return $result;
}
}

View file

@ -2,6 +2,7 @@
namespace App\Http;
use App\Http\Middleware\CheckRole;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;
@ -17,7 +18,7 @@ class Kernel extends HttpKernel
protected $middleware = [
// \App\Http\Middleware\TrustHosts::class,
\App\Http\Middleware\TrustProxies::class,
\Fruitcake\Cors\HandleCors::class,
\Illuminate\Http\Middleware\HandleCors::class,
\App\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
@ -56,6 +57,7 @@ class Kernel extends HttpKernel
*/
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'role' => \App\Http\Middleware\CheckRole::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,

View file

@ -3,19 +3,28 @@
namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
use Illuminate\Http\Request;
class Authenticate extends Middleware
{
/**
* Get the path the user should be redirected to when they are not authenticated.
*
* @param \Illuminate\Http\Request $request
* @param Request $request
* @return string|null
*/
protected function redirectTo($request)
protected function redirectTo($request): string
{
if (! $request->expectsJson()) {
if (!$request->expectsJson()) {
$path = $request->path();
if (preg_match('~^admin.*~i', $path))
return route('admin.login');
if (preg_match('~^comisiones.*~i', $path))
return route('comisiones.login');
if (preg_match('~^ollas.*~i', $path))
return route('ollas.login');
return route('login');
}
return '';
}
}

View file

@ -0,0 +1,25 @@
<?php
namespace App\Http\Middleware;
use App\UserRole;
use Closure;
use Illuminate\Http\Request;
class CheckRole
{
/**
* Handle the incoming request.
*
* @param Request $request
* @param Closure $next
* @param string $role
* @return mixed
*/
public function handle($request, Closure $next, $role)
{
$role_id = UserRole::where('nombre', $role)->first()->id;
return $request->user()->role_id == $role_id ? $next($request)
: response('No tenés permiso para esto.', 403);
}
}

View file

@ -3,17 +3,18 @@
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class Subpedido
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param Request $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
public function handle(Request $request, Closure $next)
{
if (!session('subpedido_nombre') || !session('subpedido_id')) {
return redirect()->route('subpedidos.create');

View file

@ -2,8 +2,8 @@
namespace App\Http\Middleware;
use Fideloper\Proxy\TrustProxies as Middleware;
use Illuminate\Http\Request;
use Illuminate\Http\Middleware\TrustProxies as Middleware;
use Symfony\Component\HttpFoundation\Request;
class TrustProxies extends Middleware
{
@ -19,5 +19,8 @@ class TrustProxies extends Middleware
*
* @var int
*/
protected $headers = Request::HEADER_X_FORWARDED_ALL;
protected $headers = Request::HEADER_X_FORWARDED_FOR |
Request::HEADER_X_FORWARDED_HOST |
Request::HEADER_X_FORWARDED_PORT |
Request::HEADER_X_FORWARDED_PROTO;
}

View file

@ -0,0 +1,22 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class GrupoDeCompraComisionesResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request): array {
return [
'id' => $this->id,
'nombre' => $this->nombre,
'saldo' => $this->saldo,
];
}
}

View file

@ -0,0 +1,23 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class GrupoDeCompraPedidoResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param Request $request
* @return array
*/
public function toArray($request): array {
return [
'id' => $this->id,
'nombre' => $this->nombre,
'devoluciones_habilitadas' => $this->devoluciones_habilitadas,
];
}
}

View file

@ -0,0 +1,34 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class GrupoDeCompraResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param Request $request
* @return array
*/
public function toArray($request): array
{
return [
'id' => $this->id,
'nombre' => $this->nombre,
'devoluciones_habilitadas' => $this->devoluciones_habilitadas,
'pedidos' => SubpedidoResource::collection($this->pedidosHogares()),
'total_a_recaudar' => number_format($this->totalARecaudar(),2),
'saldo' => number_format($this->saldo, 2, ".", ""),
'total_sin_devoluciones' => number_format($this->totalSinDevoluciones(),2),
'total_barrial' => number_format($this->totalBarrial(),2),
'total_devoluciones' => number_format($this->totalDevoluciones(),2),
'total_de_pedido' => number_format($this->totalDePedido(),2),
'total_a_transferir' => number_format($this->totalATransferir(),2),
'total_transporte' => number_format($this->totalTransporte()),
'cantidad_transporte' => number_format($this->cantidadTransporte()),
];
}
}

View file

@ -0,0 +1,30 @@
<?php
namespace App\Http\Resources;
use App\TipoPedido;
use Illuminate\Http\Resources\Json\JsonResource;
class PedidoOllasResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request): array
{
$productos = $this->productos;
foreach ($productos as $producto) {
$producto['pivot']['total'] = number_format($producto->pivot->cantidad * $producto->precio, 2);
}
return [
'id' => $this->id,
'nombre' => $this->nombre,
'productos' => $productos,
'total' => number_format($this->totalCentralesSinTransporte(),2),
'cantidad_de_ollas' => $this->cantidad_ollas,
];
}
}

View file

@ -2,6 +2,7 @@
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ProductoResource extends JsonResource
@ -9,23 +10,19 @@ class ProductoResource extends JsonResource
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @param Request $request
* @return array
*/
public function toArray($request)
public function toArray($request): array
{
return [
'id' => $this->id,
'nombre' => $this->nombre,
'precio' => $this->precio,
'categoria' => $this->categoria,
'proveedor' => optional($this->proveedor)->nombre,
'economia_solidaria' => optional($this->proveedor)->economia_solidaria,
'nacional' => optional($this->proveedor)->nacional,
'imagen' => optional($this->poster)->url(),
'descripcion' => $this->descripcion,
'apto_veganxs' => $this->apto_veganxs,
'apto_celiacxs' => $this->apto_celiacxs
'economia_solidaria' => $this->es_solidario,
'nacional' => $this->es_solidario,
'requiere_notas' => $this->requiere_notas,
];
}
}

View file

@ -0,0 +1,40 @@
<?php
namespace App\Http\Resources;
use App\TipoPedido;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class SubpedidoResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param Request $request
* @return array
*/
public function toArray($request): array
{
$productos = $this->productos;
foreach ($productos as $producto) {
$producto['pivot']['total'] = number_format($producto->pivot->cantidad * $producto->precio, 2);
}
return [
'id' => $this->id,
'nombre' => $this->nombre,
'productos' => $productos,
'aprobado' => (bool) $this->aprobado,
'total' => number_format($this->total(),2),
'total_transporte' => number_format($this->totalTransporte()),
'cantidad_transporte' => number_format($this->cantidadTransporte()),
'total_sin_devoluciones' => number_format($this->totalSinDevoluciones(),2),
'devoluciones_total' => number_format($this->devoluciones_total,2),
'devoluciones_notas' => $this->devoluciones_notas,
'tipo' => [
'id' => $this->tipo_pedido_id,
'nombre' => TipoPedido::find($this->tipo_pedido_id)->nombre
],
];
}
}

View file

@ -2,35 +2,105 @@
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use App\Filtros\FiltroDeProducto;
use App\Helpers\CsvHelper;
use App\Helpers\TransporteHelper;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use League\Csv\CannotInsertRecord;
use League\Csv\Exception;
use League\Csv\InvalidArgument;
class Producto extends Model
{
public $timestamps = false;
protected $fillable = [ "nombre", "precio", "presentacion", "stock", "categoria" ];
static $paginarPorDefecto = 10;
protected $fillable = ["nombre", "precio", "categoria", "bono", "es_solidario", "requiere_notas"];
public function subpedidos()
{
return $this->belongsToMany('App\Subpedido','productos_subpedidos')->withPivot(["cantidad"]);
}
public function proveedor()
{
return $this->belongsTo('App\Proveedor');
}
public function subpedidos(): BelongsToMany
{
return $this->belongsToMany(Subpedido::class, 'productos_subpedidos')
->withPivot(["cantidad", "notas"]);
}
//Este método permite que se apliquen los filtros al hacer una request (por ejemplo, de búsqueda)
public function scopeFiltrar($query, FiltroDeProducto $filtros)
{
return $filtros->aplicar($query);
}
public function scopeFiltrar($query, FiltroDeProducto $filtros): Builder
{
return $filtros->aplicar($query);
}
public static function getPaginar(Request $request)
{
return $request->has('paginar') && intval($request->input('paginar')) ? intval($request->input('paginar')) : self::$paginarPorDefecto;
}
public static function getPaginar(Request $request): int
{
return $request->has('paginar') && intval($request->input('paginar')) ?
intval($request->input('paginar')) :
self::all()->count();
}
public static function productosFilaID()
{
return self::noBarriales()->pluck('id', 'fila')->all();
}
public static function productosIDFila()
{
return self::noBarriales()->pluck('fila', 'id')->all();
}
public static function productosIDNombre()
{
return self::noBarriales()->pluck('nombre', 'id')->all();
}
public static function noBarriales()
{
return self::where('nombre', 'not like', '%barrial%');
}
public static function notasPorBarrio(): Collection
{
return DB::table('productos')
->where('productos.nombre', 'not like', '%barrial%')
->join('producto_subpedido', 'productos.id', '=', 'producto_subpedido.producto_id')
->join('subpedidos', 'producto_subpedido.subpedido_id', '=', 'subpedidos.id')
->join('grupos_de_compra', 'subpedidos.grupo_de_compra_id', '=', 'grupos_de_compra.id')
->where('productos.requiere_notas', 1)
->where('subpedidos.tipo_pedido_id', '=', 1)
->select(
'productos.nombre as producto',
'grupos_de_compra.nombre as barrio',
'producto_subpedido.notas'
)
->get()
->groupBy('producto');
}
/**
* @throws InvalidArgument
* @throws CannotInsertRecord
*/
static public function planillaNotas() {
$headers = ['Producto'];
$barrios = GrupoDeCompra::barriosMenosPrueba()
->pluck('nombre')->toArray();
$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-por-barrio-' . $fecha . '.csv';
CsvHelper::generarCsv($filePath, $planilla, $headers);
}
}

View file

@ -1,17 +0,0 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Proveedor extends Model
{
public $timestamps = false;
protected $fillable = [ "nombre","direccion","telefono","correo","comentario" ];
protected $table = 'proveedores';
public function productos()
{
return $this->hasMany('App\Producto');
}
}

View file

@ -2,31 +2,149 @@
namespace App;
use League\Csv\Reader;
use App\Helpers\TransporteHelper;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Support\Facades\DB;
use Log;
use App\Filtros\FiltroDeSubpedido;
class Subpedido extends Model
{
public $timestamps = false;
protected $fillable = ['grupo_de_compra_id', 'aprobado', 'nombre'];
protected $fillable = [
'grupo_de_compra_id',
'aprobado',
'nombre',
'devoluciones_total',
'devoluciones_notas',
'tipo_pedido_id',
'cantidad_ollas'
];
public function productos()
{
return $this->belongsToMany('App\Producto','pedidos_productos')->withPivot(["cantidad"]);
}
public function productos(): BelongsToMany
{
return $this->belongsToMany(Producto::class)->withPivot(["cantidad", "notas"]);
}
public function grupoDeCompra()
{
return $this->belongsTo('App\GrupoDeCompra');
}
public function grupoDeCompra(): BelongsTo
{
return $this->belongsTo(GrupoDeCompra::class);
}
//Este método permite que se apliquen los filtros al hacer una request (por ejemplo, de búsqueda)
public function scopeFiltrar($query, FiltroDeSubpedido $filtros)
{
return $filtros->aplicar($query);
}
public function tipoPedido(): BelongsTo
{
return $this->belongsTo(TipoPedido::class);
}
// Permite que se apliquen los filtros al hacer una request (por ejemplo, de búsqueda)
public function scopeFiltrar($query, FiltroDeSubpedido $filtros): Builder
{
return $filtros->aplicar($query);
}
public function total()
{
return $this->totalSinDevoluciones() - $this->devoluciones_total;
}
public function totalSinDevoluciones()
{
return $this->totalBarrial() + $this->totalCentral();
}
public function totalBarrial()
{
return DB::table('producto_subpedido')
->join('productos', 'producto_subpedido.producto_id', '=', 'productos.id')
->where('producto_subpedido.subpedido_id', $this->id)
->where('productos.nombre', 'like', '%barrial%')
->selectRaw('SUM(productos.precio * producto_subpedido.cantidad) as total')
->value('total');
}
public function totalCentral()
{
return $this->totalCentralesSinTransporte() + $this->totalTransporte();
}
public function totalCentralesSinTransporte() {
return $this->totalCentralesQueNoPaganTransporte() + $this->totalCentralesQuePaganTransporte();
}
public function totalCentralesQueNoPaganTransporte()
{
return DB::table('producto_subpedido')
->join('productos', 'producto_subpedido.producto_id', '=', 'productos.id')
->where('producto_subpedido.subpedido_id', $this->id)
->where('productos.nombre', 'not like', '%barrial%')
->where(function ($query) {
$query->where('productos.categoria', 'like', '%SUBSIDIADO%')
->orWhere('productos.bono', true);
})
->selectRaw('SUM(productos.precio * producto_subpedido.cantidad) as total')
->value('total');
}
public function totalCentralesQuePaganTransporte()
{
return DB::table('producto_subpedido')
->join('productos', 'producto_subpedido.producto_id', '=', 'productos.id')
->where('producto_subpedido.subpedido_id', $this->id)
->where('productos.nombre', 'not like', '%barrial%')
->where('productos.bono', false)
->where('productos.categoria', 'not like', '%SUBSIDIADO%')
->selectRaw('SUM(productos.precio * producto_subpedido.cantidad) as total')
->value('total');
}
public function totalTransporte()
{
return TransporteHelper::totalTransporte($this->totalCentralesQuePaganTransporte());
}
public function cantidadTransporte()
{
return TransporteHelper::cantidadTransporte($this->totalCentralesQuePaganTransporte());
}
// Actualiza el pedido, agregando o quitando del subpedido según sea necesario. Debe ser llamado desde el controlador de subpedidos, luego de validar que los parámetros $producto y $cantidad son correctos. También calcula el subtotal por producto.
public function syncProducto(Producto $producto, int $cantidad, string $notas)
{
if ($cantidad) {
//si la cantidad es 1 o más se agrega el producto o actualiza la cantidad
$this->productos()->syncWithoutDetaching([
$producto->id => [
'cantidad' => $cantidad,
'notas' => $notas,
]
]);
} else {
//si la cantidad es 0, se elimina el producto del subpedido
$this->productos()->detach($producto->id);
}
$this->updated_at = now();
$this->save();
}
public function toggleAprobacion(bool $aprobacion)
{
$this->aprobado = $aprobacion;
$this->update(['aprobado' => $aprobacion]);
$this->save();
}
public function generarHTML()
{
$view = view("pdfgen.pedido_tabla", ["pedido" => $this]);
return $view->render();
}
public function syncDevoluciones(float $total, string $notas)
{
$this->devoluciones_total = $total;
$this->devoluciones_notas = $notas;
$this->save();
}
}

10
app/TipoPedido.php Normal file
View file

@ -0,0 +1,10 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class TipoPedido extends Model
{
protected $fillable = ["nombre"];
}

View file

@ -2,7 +2,7 @@
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
@ -16,7 +16,7 @@ class User extends Authenticatable
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
'name', 'email', 'password', 'role_id',
];
/**
@ -38,8 +38,8 @@ class User extends Authenticatable
];
public function grupoDeCompra()
public function grupoDeCompra(): BelongsTo
{
return $this->belongsTo('App\GrupoDeCompra');
return $this->belongsTo(GrupoDeCompra::class);
}
}

View file

@ -4,7 +4,7 @@ namespace App;
use Illuminate\Database\Eloquent\Model;
class Admin extends Model
class UserRole extends Model
{
//
protected $fillable = ["nombre"];
}

View file

@ -8,20 +8,20 @@
],
"license": "MIT",
"require": {
"php": "^7.2.5|^8.0",
"fideloper/proxy": "^4.4",
"fruitcake/laravel-cors": "^2.0",
"guzzlehttp/guzzle": "^6.3.1|^7.0.1",
"laravel/framework": "^7.29",
"laravel/sanctum": "^2.13",
"laravel/tinker": "^2.5",
"laravel/ui": "*",
"league/csv": "^9.8"
"php": "^8.3",
"doctrine/dbal": "^3.0",
"guzzlehttp/guzzle": "^7.0.1",
"laravel/framework": "^12.0",
"laravel/sanctum": "^4.0",
"laravel/tinker": "^2.8",
"laravel/ui": "^4.3",
"league/csv": "^9.8",
"mpdf/mpdf": "^8.2",
"prexview/prexview": "^1.1"
},
"require-dev": {
"facade/ignition": "^2.0",
"fakerphp/faker": "^1.9.1",
"nunomaduro/collision": "^4.3"
"nunomaduro/collision": "^8.0"
},
"config": {
"optimize-autoloader": true,

4988
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -67,7 +67,7 @@ return [
|
*/
'timezone' => 'UTC',
'timezone' => 'America/Montevideo',
/*
|--------------------------------------------------------------------------

View file

@ -1,9 +1,10 @@
<?php
/** @var \Illuminate\Database\Eloquent\Factory $factory */
/** @var Factory $factory */
use App\User;
use Faker\Generator as Faker;
use Illuminate\Database\Eloquent\Factory;
use Illuminate\Support\Str;
/*

View file

@ -19,6 +19,8 @@ class CreateUsersTable extends Migration
$table->string('email')->unique()->nullable();
$table->timestamp('email_verified_at')->nullable();
$table->foreignId('grupo_de_compra_id')->nullable();
$table->boolean('is_admin');
$table->unique(['name', 'is_admin']);
$table->string('password');
$table->rememberToken();
$table->timestamps();

View file

@ -17,7 +17,7 @@ class CreateSubpedidosTable extends Migration
$table->id();
$table->string('nombre');
$table->foreignId('grupo_de_compra_id');
$table->boolean('aprobado')->nullable();
$table->boolean('aprobado')->default(false);
$table->timestamps();
});

View file

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

View file

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

View file

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AgregarColumnaFilaEnPlanillaATablaDeProductos extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('productos', function (Blueprint $table) {
$table->integer('fila')->after('id');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('productos', function (Blueprint $table) {
$table->dropColumn('fila');
});
}
}

View file

@ -0,0 +1,26 @@
<?php
use Illuminate\Database\Migrations\Migration;
class CallCrearPedidosAprobados extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Artisan::call("view:CrearPedidosAprobadosView");
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}

View file

@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class DevolucionesPedido extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('subpedidos', function (Blueprint $table) {
$table->double('devoluciones_total', 10, 2)->default(0);
$table->string('devoluciones_notas')->default("");
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('subpedidos', function (Blueprint $table) {
$table->dropColumn('devoluciones_total');
$table->dropColumn('devoluciones_notas');
});
}
}

View file

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

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('users', function (Blueprint $table) {
$table->dropColumn('is_compras');
});
}
}

View file

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

View file

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

View file

@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CrearCargaDeCanastas extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('carga_de_canastas', function (Blueprint $table) {
$table->id();
$table->string('path');
$table->string('descripcion');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('carga_de_canastas');
}
}

View file

@ -0,0 +1,27 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\Artisan;
class CallAgregarEsBonoAPedidosAprobados extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Artisan::call("command:AgregarEsBonoAPedidosAprobados");
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}

View file

@ -0,0 +1,41 @@
<?php
use App\UserRole;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
class CreateUserRolesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('user_roles', function (Blueprint $table) {
$table->id();
$table->string('nombre');
$table->timestamps();
});
$tipos = ["barrio", "admin_barrio", "comision"];
foreach ($tipos as $tipo) {
UserRole::create([
"nombre" => $tipo,
]);
}
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('user_roles');
}
}

View file

@ -0,0 +1,43 @@
<?php
use App\User;
use App\UserRole;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AgregarRolAUser extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->foreignId('role_id');
});
$barrio = UserRole::where('nombre', 'barrio')->first();
$admin_barrio = UserRole::where('nombre', 'admin_barrio')->first();
$comision = UserRole::where('nombre', 'comision')->first();
User::all()->each(function($user) use ($barrio, $comision, $admin_barrio) {
$user->role_id = $user->is_admin ? $admin_barrio->id :
($user->is_compras ? $comision->id : $barrio->id);
$user->save();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('user', function (Blueprint $table) {
$table->dropForeign('role_id');
});
}
}

View file

@ -0,0 +1,43 @@
<?php
use App\User;
use App\UserRole;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class SimplificarUsers extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn(['is_admin', 'is_compras']);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->boolean('is_admin')->default(false);
$table->boolean('is_compras')->default(false);
});
$admin_barrio = UserRole::where('nombre', 'admin_barrio')->first();
$comision = UserRole::where('nombre', 'comision')->first();
foreach (User::all() as $user) {
$user->is_admin = $user->role_id == $admin_barrio->id;
$user->is_compras = $user->role_id == $comision->id;
$user->save();
}
}
}

View file

@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class SimplificarBarrios extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('grupos_de_compra', function (Blueprint $table) {
$table->dropColumn([
'cantidad_de_nucleos',
'telefono',
'correo',
'referente_finanzas',
]);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('grupos_de_compra', function (Blueprint $table) {
$table->double('cantidad_de_nucleos');
$table->string('telefono');
$table->string('correo');
$table->string('referente_finanzas');
});
}
}

View file

@ -0,0 +1,44 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class SimplificarProductos extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('productos', function (Blueprint $table) {
$table->dropColumn([
'presentacion',
'stock',
'imagen_id',
'descripcion',
'apto_veganxs',
'apto_celiacxs',
]);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('productos', function (Blueprint $table) {
$table->integer('presentacion')->nullable();
$table->integer('stock')->nullable();
$table->foreignId('imagen_id')->nullable();
$table->string('descripcion')->nullable();
$table->boolean('apto_veganxs')->nullable();
$table->boolean('apto_celiacxs')->nullable();
});
}
}

View file

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

View file

@ -0,0 +1,38 @@
<?php
use App\Producto;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AgregarEsSolidario extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('productos', function (Blueprint $table) {
$table->boolean('es_solidario')->default(false);
});
foreach (Producto::all() as $producto) {
$producto->es_solidario = $producto->proveedor_id != null;
$producto->save();
}
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('productos', function (Blueprint $table) {
$table->dropColumn('es_solidario');
});
}
}

View file

@ -0,0 +1,59 @@
<?php
use App\Producto;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
class EliminarProveedor extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('productos', function (Blueprint $table) {
$table->dropColumn('proveedor_id');
});
Schema::dropIfExists('proveedores');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::create('proveedores', function (Blueprint $table) {
$table->id();
$table->string('nombre');
$table->string('direccion')->nullable();
$table->string('telefono')->nullable();
$table->string('correo')->nullable();
$table->boolean('economia_solidaria')->nullable();
$table->boolean('nacional')->nullable();
$table->text('detalles_de_pago')->nullable();
$table->text('comentario')->nullable();
$table->timestamps();
});
Schema::table('productos', function (Blueprint $table) {
$table->foreignId('proveedor_id')->nullable();
});
$proveedor_id = DB::table('proveedores')->insertGetId([
['nombre' => 'Proveedor de economía solidaria',
'economia_solidaria' => 1,
'nacional' => 1]
]);
foreach (Producto::all() as $producto) {
$producto->proveedor_id = $producto->es_solidario ? $proveedor_id : null;
$producto->save();
}
}
}

View file

@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class EliminarAdmin extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::dropIfExists('admins');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::create('admins', function (Blueprint $table) {
$table->id();
$table->string('nombre');
$table->foreignId('grupo_de_compra_id');
$table->string('email');
$table->string('contrasena');
$table->timestamps();
});
}
}

View file

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class HacerFilaNullable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('productos', function (Blueprint $table) {
$table->integer('fila')->nullable()->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('productos', function (Blueprint $table) {
$table->integer('fila')->nullable(false)->change();
});
}
}

View file

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class QuitarPasswordDeGrupoDeCompra extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('grupos_de_compra', function (Blueprint $table) {
$table->dropColumn('password');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('grupos_de_compra', function (Blueprint $table) {
$table->string('password')->nullable();
});
}
}

View file

@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AgregarSaldosABarrios extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
// Agregar columna 'saldo' a la tabla 'grupos_de_compra'
Schema::table('grupos_de_compra', function (Blueprint $table) {
$table->double('saldo', 10, 2)->default(0);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
// Remover columna 'saldo' de la tabla 'grupos_de_compra'
Schema::table('grupos_de_compra', function (Blueprint $table) {
$table->dropColumn('saldo');
});
}
}

View file

@ -0,0 +1,43 @@
<?php
use App\TipoPedido;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateTipoPedidosTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('tipo_pedidos', function (Blueprint $table) {
$table->id();
$table->string("nombre");
$table->timestamps();
});
$hogar = TipoPedido::firstOrCreate(['nombre' => 'hogar']);
TipoPedido::firstOrCreate(['nombre' => 'olla']);
Schema::table('subpedidos', function (Blueprint $table) use ($hogar) {
$table->foreignId('tipo_pedido_id')->default($hogar->id);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('tipo_pedidos');
Schema::table('subpedidos', function (Blueprint $table) {
$table->dropColumn('tipo_pedido_id');
});
}
}

View file

@ -0,0 +1,40 @@
<?php
use App\GrupoDeCompra;
use App\User;
use App\UserRole;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\Hash;
class UserRoleOllas extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
$ollasRol = UserRole::firstOrCreate(['nombre' => 'ollas']);
$barrios = GrupoDeCompra::all();
foreach ($barrios as $barrio) {
$barrio->users()->firstOrCreate([
'name' => $barrio->nombre . '_ollas',
'password' => Hash::make('123'),
'role_id' => $ollasRol->id
]);
}
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
$ollasRol = UserRole::where('nombre', 'ollas')->firstOrFail();
User::where('role_id', $ollasRol->id)->delete();
$ollasRol->delete();
}
}

View file

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CantidadOllasPedidos extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('subpedidos', function (Blueprint $table) {
$table->integer('cantidad_ollas')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('subpedidos', function (Blueprint $table) {
$table->dropColumn('cantidad_ollas');
});
}
}

View file

@ -0,0 +1,20 @@
<?php
use App\Helpers\CanastaHelper;
use Illuminate\Database\Seeder;
class CanastaSeeder extends Seeder
{
const ARCHIVO_DEFAULT = 'csv/productos.csv';
/**
* Run the database seeds.
*
* @return void
* @throws \League\Csv\Exception
*/
public function run()
{
CanastaHelper::cargarCanasta(resource_path(self::ARCHIVO_DEFAULT));
}
}

View file

@ -1,10 +1,19 @@
<?php
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class DatabaseSeeder extends Seeder
{
const CHUNK_SIZE = 100;
static function addTimestamps($object) {
$now = DB::raw('CURRENT_TIMESTAMP');
$object['created_at'] = $now;
$object['updated_at'] = $now;
return $object;
}
/**
* Seed the application's database.
*
@ -12,7 +21,9 @@ class DatabaseSeeder extends Seeder
*/
public function run()
{
$this->call(CanastaSeeder::class);
$this->call(GrupoDeCompraSeeder::class);
$this->call(ProductoSeeder::class);
$this->call(UserSeeder::class);
$this->call(UsuarioOllasSeeder::class);
}
}

View file

@ -1,7 +1,11 @@
<?php
use App\Helpers\CsvHelper;
use App\GrupoDeCompra;
use App\User;
use App\UserRole;
use Illuminate\Database\Seeder;
use League\Csv\Reader;
use Illuminate\Support\Facades\Hash;
class GrupoDeCompraSeeder extends Seeder
{
@ -9,41 +13,36 @@ class GrupoDeCompraSeeder extends Seeder
* Run the database seeds.
*
* @return void
* @throws \League\Csv\Exception
*/
public function run()
{
$csv = Reader::createFromPath(resource_path('csv/barrios.csv'), 'r');
$csv->setDelimiter("|");
$csv->setEnclosure("'");
$csv->setHeaderOffset(0);
$registros = $csv->getRecords();
$registros = CsvHelper::getRecords(resource_path('csv/barrios.csv'), 'No se pudo leer la planilla de barrios.');
$gdcToInsert = [];
$usersToInsert = [];
$roles = UserRole::where('nombre', 'barrio')->orWhere('nombre', 'admin_barrio')->get();
foreach($registros as $key => $registro){
$gdcToInsert[] = [
$gdcToInsert[] = DatabaseSeeder::addTimestamps([
'nombre' => $registro['barrio'],
'region' => $registro['region'],
'telefono' => $registro['telefono'],
'correo' => $registro['correo'],
'referente_finanzas' => $registro['referente']
];
]);
$usersToInsert[] = [
'name' => $registro['barrio'],
'password' => Hash::make($registro['barrio']),
'grupo_de_compra_id' => $key
];
foreach($roles as $role) {
$nombre = $registro['barrio'] . ($role->nombre == 'barrio' ? '' : '_admin');
$usersToInsert[] = DatabaseSeeder::addTimestamps([
'name' => $nombre,
'password' => Hash::make("123"),
'role_id' => $role->id,
'grupo_de_compra_id' => $key,
]);
}
}
foreach (array_chunk($gdcToInsert,DatabaseSeeder::CHUNK_SIZE) as $chunk)
{
DB::table('grupos_de_compra')->insert($chunk);
}
foreach (array_chunk($gdcToInsert,DatabaseSeeder::CHUNK_SIZE) as $chunk)
GrupoDeCompra::insert($chunk);
foreach (array_chunk($usersToInsert,DatabaseSeeder::CHUNK_SIZE) as $chunk)
{
DB::table('users')->insert($chunk);
}
foreach (array_chunk($usersToInsert,DatabaseSeeder::CHUNK_SIZE) as $chunk)
User::insert($chunk);
}
}

View file

@ -1,39 +0,0 @@
<?php
use Illuminate\Database\Seeder;
use League\Csv\Reader;
use App\Proveedor;
class ProductoSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$csv = Reader::createFromPath(resource_path('csv/productos.csv'), 'r');
$csv->setDelimiter("|");
$csv->setEnclosure("'");
$csv->setHeaderOffset(0);
$registros = $csv->getRecords();
$toInsert = [];
foreach($registros as $registro){
$toInsert[] = [
'categoria' => $registro['categoria'],
'nombre' => $registro['producto'],
'precio' => $registro['precio'],
'proveedor_id' => isset($registro['proveedor']) ? Proveedor::firstOrCreate([
'nombre' => $registro['proveedor']
])->id : null
];
}
foreach (array_chunk($toInsert,DatabaseSeeder::CHUNK_SIZE) as $chunk)
{
DB::table('productos')->insert($chunk);
}
}
}

View file

@ -0,0 +1,29 @@
<?php
use App\User;
use App\UserRole;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
class UserSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$usersToInsert = [];
$usersToInsert[] = DatabaseSeeder::addTimestamps([
'name' => 'comision',
'password' => Hash::make("123"),
'role_id' => UserRole::where('nombre', 'comision')->first()->id,
]);
foreach (array_chunk($usersToInsert,DatabaseSeeder::CHUNK_SIZE) as $chunk)
User::insert($chunk);
}
}

View file

@ -0,0 +1,34 @@
<?php
use App\GrupoDeCompra;
use App\User;
use App\UserRole;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
class UsuarioOllasSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$barrios = GrupoDeCompra::all();
$usersToInsert = [];
$ollas_id = UserRole::where('nombre', 'ollas')->first()->id;
foreach ($barrios as $barrio) {
$usersToInsert[] = DatabaseSeeder::addTimestamps([
'name' => $barrio->nombre . '_ollas',
'password' => Hash::make('123'),
'role_id' => $ollas_id,
'grupo_de_compra_id' => $barrio->id,
]);
}
foreach (array_chunk($usersToInsert,DatabaseSeeder::CHUNK_SIZE) as $chunk)
User::insert($chunk);
}
}

2
dev-start Executable file
View file

@ -0,0 +1,2 @@
#!/usr/bin/bash
docker-compose up -d && docker-compose exec app npm run watch

View file

@ -1,14 +1,15 @@
version: "3.7"
version: '3.2'
services:
app:
build:
args:
user: www
uid: 1000
uid: ${USERID}
context: ./
dockerfile: Dockerfile
image: laravel-image
container_name: laravel-app
container_name: pedi2-app
restart: unless-stopped
working_dir: /var/www/
volumes:
@ -17,12 +18,26 @@ services:
networks:
- app-network
vite:
build:
args:
user: www
uid: ${USERID}
context: ./
container_name: vite
working_dir: /var/www
command: npm run dev
volumes:
- ./:/var/www
ports:
- "5173:5173"
networks:
- app-network
db:
image: mysql:5.7
container_name: laravel-db
container_name: pedi2-db
restart: unless-stopped
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
@ -36,13 +51,15 @@ services:
- dbdata:/var/lib/mysql
networks:
- app-network
ports:
- ${DB_PORT_EXPOSED}:3306
nginx:
image: nginx:alpine
container_name: laravel-nginx
container_name: pedi2-nginx
restart: unless-stopped
ports:
- 8000:80
- ${NGINX_PORT}:80
volumes:
- ./:/var/www
- ./nginx/conf.d/:/etc/nginx/conf.d/
@ -56,4 +73,4 @@ networks:
#Volumes
volumes:
dbdata:
driver: local
driver: local

View file

@ -13,6 +13,22 @@ server {
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location ^~ /@vite/ {
proxy_pass http://vite:5173;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location ^~ /resources/ {
proxy_pass http://vite:5173;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;

3315
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,8 @@
{
"private": true,
"scripts": {
"dev": "npm run development",
"dev": "vite",
"build": "vite build",
"development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch": "npm run development -- --watch",
"watch-poll": "npm run watch -- --watch-poll",
@ -10,17 +11,24 @@
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --config=node_modules/laravel-mix/setup/webpack.config.js"
},
"devDependencies": {
"axios": "^0.19",
"bootstrap": "^4.0.0",
"cross-env": "^7.0",
"jquery": "^3.2",
"laravel-mix": "^5.0.1",
"lodash": "^4.17.19",
"popper.js": "^1.12",
"resolve-url-loader": "^2.3.1",
"@types/axios": "^0.9.36",
"@vitejs/plugin-vue2": "^2.3.3",
"axios": "^0.27.2",
"cross-env": "^7.0.3",
"laravel-vite-plugin": "^1.3.0",
"sass": "^1.20.1",
"sass-loader": "^8.0.0",
"vue": "^2.5.17",
"vue-template-compiler": "^2.6.10"
"typescript": "^5.4.5",
"vite": "^5.2.8"
},
"dependencies": {
"vue": "^2.7.16",
"vue-template-compiler": "^2.7.16",
"animate.css": "^4.1.1",
"bulma": "^0.9.4",
"bulma-switch": "^2.0.4",
"bulma-toast": "^2.4.1",
"vue-router": "^3.5.4",
"vuex": "^3.6.2"
}
}

BIN
public/assets/chismosa.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
public/assets/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

8
public/css/app.css vendored
View file

@ -1,8 +0,0 @@
p.navbar-item:empty {
display: none;
}
.breadcrumb a {
color: #cc0f35;
}

View file

@ -1,4 +0,0 @@
figure.image.icono {
float: right;
margin: 4px;
}

73
public/js/app.js vendored
View file

@ -1,73 +0,0 @@
window.Event = new Vue();
Vue.component('nav-bar', {
template: `
<nav class="navbar is-danger" role="navigation" aria-label="main navigation">
<div class="navbar-brand">
<a class="navbar-item" href="https://mps.org.uy">
<img src="/assets/logoMPS.png" height="28">
</a>
<p style="margin:0 auto" class="navbar-item"><slot name="subpedido"></slot></p>
<a role="button" class="navbar-burger" :class="{'is-active':isActive}" aria-label="menu" aria-expanded="false" data-target="navbarBasicExample" @click="toggleState">
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
</a>
</div>
<div id="navbarBasicExample" class="navbar-menu" :class="{'is-active':isActive}">
<div class="navbar-start has-text-right-mobile">
<!-- Styles nombre del barrio-->
<p class="navbar-item"><slot name="gdc"></slot></p>
<a class="navbar-item"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
Cerrar sesión
</a>
<slot name="logout-form"></slot>
</div>
</div>
</nav>`,
data() {
return {
isActive: false
}
},
methods: {
toggleState() {
this.isActive = !this.isActive;
}
}
});
Vue.component('nav-migas', {
data() {
return {
migas: []
}
},
computed: {
visible: function() {
return this.migas.length > 0
}
},
mounted() {
Event.$on('migas-setear-como-inicio', (miga) => {
this.migas = [];
this.migas.push(miga);
});
Event.$on('migas-agregar', (miga) => {
this.migas.push(miga);
});
Event.$on('migas-reset', () => {
this.migas = [];
});
Event.$on('migas-pop', () => {
this.migas.pop();
});
}
});
new Vue({
el: '#app'
});

114
public/js/login.js vendored
View file

@ -1,114 +0,0 @@
window.Event = new Vue();
Vue.component('region-select', {
template: `
<div class="block">
<div class="field">
<label class="label">Seleccioná tu región</label>
<div class="control">
<div class="select">
<select @change="onRegionSelected" v-model="region">
<option :disabled="isDefaultDisabled==1" value=null>Seleccionar</option>
<option v-for="region in regiones" v-text="region" :name="region"></option>
</select>
</div>
</div>
</div>
</div>`,
data() {
return {
regiones: [],
isDefaultDisabled: 0,
region: null
}
},
mounted() {
axios.get("/api/regiones").then(response => this.regiones = response.data);
},
methods: {
onRegionSelected() {
this.isDefaultDisabled = 1;
Event.$emit("region-seleccionada",this.region);
}
}
});
Vue.component('barrio-select', {
template: `
<div v-show="visible" class="block">
<div class="field">
<label class="label">Seleccioná tu barrio o grupo de compra</label>
<div class="control">
<div class="select">
<select @change="onGDCSelected" v-model="gdc" name="name">
<option :disabled="isDefaultDisabled==1" value=null>Seleccionar</option>
<option v-for="gdc in gdcs" v-text="gdc.nombre" :name="gdc.nombre"></option>
</select>
</div>
</div>
</div>
</div>`,
data() {
return {
visible: false,
region: null,
gdcs: [],
isDefaultDisabled: 0,
gdc: null
}
},
mounted() {
Event.$on('region-seleccionada', (region)=> {
this.region = region;
this.fillGDC(region);
this.visible = true;
});
},
methods : {
fillGDC(region) {
axios.get("/api/grupos-de-compra").then(response => {
this.gdcs = response.data[this.region];
});
},
onGDCSelected() {
this.isDefaultDisabled = 1;
Event.$emit("gdc-seleccionado",this.gdc);
}
}
});
Vue.component('login', {
template: `
<div v-show="visible" class="block">
<div class="field">
<label class="label">Contraseña del barrio</label>
<p class="control">
<input required class="input" type="password" name="password" placeholder="Contraseña del barrio">
</p>
<p class="help">Si no la sabés, consultá a tus compañerxs.</p>
</div>
<div class="field">
<div class="control">
<input type="submit" class="button is-success" value="Ingresar">
</input>
</div>
</div>
</div>`,
data() {
return {
visible: false,
gdc: null
}
},
mounted() {
Event.$on('gdc-seleccionado', (gdc) => {
this.gdc = gdc;
this.visible = true;
});
}
});
new Vue({
el: '#root'
});

171
public/js/productos.js vendored
View file

@ -1,171 +0,0 @@
Vue.component('categorias-container', {
template: `
<div v-show="visible" class="container">
<div class="columns is-multiline is-mobile">
<div v-for="catego in categorias" class="block column is-one-quarter-desktop is-one-third-tablet is-half-mobile">
<div @click.capture="seleccionarCategoria(catego)" class="card" style="height:100%" >
<div class="card-content">
<div class="media">
<div class="media-content" style="overflow:hidden">
<p class="title is-6" v-text="catego"></p>
</div>
</div>
</div>
</div><!-- END CARD -->
</div><!-- END BLOCK COLUMN -->
</div><!-- END COLUMNS -->
</div><!-- END CONTAINER -->`,
data() {
return {
categorias: null,
visible: true,
miga: {
nombre: "Categorías",
href: "/productos"
}
}
},
mounted() {
axios.get("/api/categorias").then(response => {
this.categorias = response.data;
});
Event.$emit("migas-setear-como-inicio",this.miga);
},
methods: {
seleccionarCategoria(categoria) {
this.visible = false;
Event.$emit("categoria-seleccionada",categoria);
}
}
});
Vue.component('productos-container', {
template: `
<div v-show="visible" class="container">
<div class="columns is-multiline is-mobile">
<div v-for="producto in productos" class="block column is-one-quarter-desktop is-one-third-tablet is-half-mobile">
<div @click.capture="seleccionarProducto(producto)" class="card" style="height:100%">
<div class="card-image">
<figure class="image is-4by3">
<img v-bind:src="producto.imagen ? producto.imagen : 'https://bulma.io/images/placeholders/1280x960.png'">
</figure>
<figure v-show="producto.nacional" class="image icono is-32x32">
<img src="/assets/uruguay.png">
</figure>
<figure v-show="producto.economia_solidaria" class="image icono is-32x32">
<img src="/assets/solidaria.png">
</figure>
</div>
<div class="card-content">
<div class="media">
<div class="media-content">
<p class="title is-6" v-text="producto.nombre"></p>
<p class="subtitle is-7" v-text="producto.proveedor"></p>
<p class="subtitle is-7">$<span v-text="producto.precio"></span></p>
</div>
</div>
</div>
</div><!-- END CARD -->
</div><!-- END BLOCK COLUMN -->
</div><!-- END COLUMNS -->
</div><!-- END CONTAINER -->`,
data() {
return {
productos: [],
visible: false,
categoria: null,
paginar: 150
}
},
computed: {
miga: function(){
return {
nombre: this.categoria,
href: "#" + this.categoria
}
}
},
mounted() {
Event.$on('categoria-seleccionada', (categoria) => {
this.categoria = categoria;
axios.get("/api/productos", {
params: {
categoria: this.categoria,
paginar: this.paginar
}
}).then(response => {
this.productos = response.data.data;
});
this.visible = true;
Event.$emit("migas-agregar",this.miga);
});
},
methods: {
seleccionarProducto(producto) {
Event.$emit("producto-seleccionado",producto);
}
}
});
Vue.component('producto-container', {
template: `
<div v-bind:class="visible ? 'is-active modal' : 'modal'">
<div class="modal-background"></div>
<div class="modal-card">
<header class="modal-card-head">
<p class="modal-card-title" v-text="producto.nombre"></p>
<button class="delete" aria-label="close" @click.capture="cerrar"></button>
</header>
<section class="modal-card-body">
<div class="card-image">
<figure class="image is-4by3">
<img v-bind:src="producto.imagen ? producto.imagen : 'https://bulma.io/images/placeholders/1280x960.png'">
</figure>
<figure v-show="producto.nacional" class="image icono is-32x32">
<img src="/assets/uruguay.png">
</figure>
<figure v-show="producto.economia_solidaria" class="image icono is-32x32">
<img src="/assets/solidaria.png">
</figure>
</div>
<div class="media-content">
<p class="title is-4" v-text="producto.proveedor"></p>
<p class="subtitle is-4">$<span v-text="producto.precio"></span></p>
<p class="subtitle is-5"><span v-text="producto.descripcion"></span></p>
</div>
</section>
<footer class="modal-card-foot">
<button class="button is-success">Agregar a la chismosa</button>
<button class="button" @click.capture="cerrar">Cancelar</button>
</footer>
</div>
</div>`,
data() {
return {
producto: null,
visible: false
}
},
computed: {
miga: function(){
return {
nombre: this.producto.nombre,
href: "#" + this.producto.nombre
}
}
},
methods: {
cerrar() {
this.visible = false;
Event.$emit("migas-pop");
}
},
mounted() {
Event.$on('producto-seleccionado', (producto) => {
this.producto = producto;
this.visible = true;
Event.$emit("migas-agregar",this.miga);
});
}
});

View file

@ -1,52 +0,0 @@
Vue.component('subpedido-select', {
data() {
return {
subpedido: null,
subpedidosExistentes: []
}
},
computed: {
nombresDeSubpedidos: function() {
return this.subpedidosExistentes.map(a => a.nombre.toLowerCase())
},
botonCrearDesabilitado : function() {
return !this.subpedido || this.nombresDeSubpedidos.includes(this.subpedido.toLowerCase())
}
},
props: ["gdcid"],
mounted() {
console.log("ready");
},
methods: {
onType() {
if (!this.subpedido){
this.subpedidosExistentes = [];
return;
}
axios.get("/api/subpedidos", {
params: {
nombre: this.subpedido,
grupo_de_compra: this.gdcid
}
}).then(response => {
this.subpedidosExistentes = response.data
});
},
submit() {
axios.post("/api/subpedidos", {
nombre: this.subpedido,
grupo_de_compra_id: this.gdcid
}).then(response => {
//se creo el subpedido, guardamos el subpedido en sesion
this.guardarSubpedidoEnSesion(response.data);
});
},
guardarSubpedidoEnSesion(subpedido) {
axios.post("/subpedidos/guardar_sesion", {
subpedido: subpedido
}).then(response => {
window.location.href = 'productos';
});
}
}
});

View file

@ -1,45 +1,4 @@
barrio|region|referente|telefono|correo
BUCEO|ESTE|||
MALVIN NORTE|ESTE|||
PINAR|ESTE|||
UNION|ESTE|||
SANTO DOMINGO|NORTE|||
21 DE FEBRERO|NORTE|||
PIEDRAS BLANCAS|NORTE|||
BELLA ITALIA|NORTE|||
JARDINES|NORTE|||
LA SOCIALISTA|NORTE|||
VILLA GARCIA|NORTE|||
LAS ACACIAS|NORTE|||
MANGA|NORTE|||
CERRITO|OESTE|||
LEZICA|OESTE|||
PEÑAROL|OESTE|||
LAS PIEDRAS|OESTE|||
A.C.T.E.O|OESTE|||
NUEVO PARIS|OESTE|||
SANTA CATALINA|OESTE|||
BELVEDERE|OESTE|||
BATLLE BERRES|OESTE|||
CERRO PTI|OESTE|||
COLECTIVO UTU LAVALLEJA|OESTE|||
FOGONES|OESTE|||
LAVALLEJA|OESTE|||
REJUNTE|OESTE|||
CAPURRO|OESTE|||
PARQUE RODO|SUR|||
REDUCTO|SUR|||
AGUADA|SUR|||
CASA DEL VECINO|SUR|||
CIUDAD VIEJA|SUR|||
COOP EJIDO|SUR|||
COVIREUS|SUR|||
LA BLANQUEADA|SUR|||
NITEP|SUR|||
LA CURVA|SUR|||
PANADERIA VIDAL|SUR|||
SUA|SUR|||
ENTREVERO|SUR|||
TRES CRUCES|SUR|||
VILLA ESPAÑOLA|SUR|||
AUDA|OTRA|||
SINTEP|OTRA|||
PRUEBA|SIN REGION|||
1 barrio region referente telefono correo
2 BUCEO ENTREVERO ESTE SUR
MALVIN NORTE ESTE
PINAR ESTE
UNION ESTE
SANTO DOMINGO NORTE
21 DE FEBRERO NORTE
PIEDRAS BLANCAS NORTE
BELLA ITALIA NORTE
JARDINES NORTE
LA SOCIALISTA NORTE
VILLA GARCIA NORTE
LAS ACACIAS NORTE
MANGA NORTE
CERRITO OESTE
LEZICA OESTE
PEÑAROL OESTE
LAS PIEDRAS OESTE
A.C.T.E.O OESTE
NUEVO PARIS OESTE
SANTA CATALINA OESTE
BELVEDERE OESTE
BATLLE BERRES OESTE
CERRO PTI OESTE
COLECTIVO UTU LAVALLEJA OESTE
FOGONES OESTE
LAVALLEJA OESTE
REJUNTE OESTE
CAPURRO OESTE
PARQUE RODO SUR
REDUCTO SUR
AGUADA SUR
CASA DEL VECINO SUR
CIUDAD VIEJA SUR
COOP EJIDO SUR
COVIREUS SUR
LA BLANQUEADA SUR
NITEP SUR
LA CURVA SUR
PANADERIA VIDAL SUR
SUA SUR
3 TRES CRUCES SUR
4 VILLA ESPAÑOLA PRUEBA SUR SIN REGION
AUDA OTRA
SINTEP OTRA

View file

@ -0,0 +1,4 @@
id|nombre|valor
bono-transporte|'Bono de transporte'|15
monto-transporte|'Monto para bono de transporte'|500
monto-olla|'Monto por olla'|800
1 id nombre valor
2 bono-transporte 'Bono de transporte' 15
3 monto-transporte 'Monto para bono de transporte' 500
4 monto-olla 'Monto por olla' 800

Some files were not shown because too many files have changed in this diff Show more