Compare commits

...

47 commits

Author SHA1 Message Date
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
nat
f67232f55c Deshabilita botones de eportar pedido barrial e imprimir planillas cuando no hay subpedidos aprobados 2022-11-08 15:55:49 -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: #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
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: #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: #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
b1f1444a0c Merge pull request 'exportar-planillas' (#9) from exportar-planillas into master
Reviewed-on: #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
nat
11cd073a51 canasta 81 2022-09-05 23:20:21 -03:00
nat
a3a4ecdd33 canasta 81 2022-09-05 23:06:19 -03:00
nat
401c0e888f canasta 80 2022-08-09 23:13:46 -03:00
nat
53a203b067 Productos canasta 79 2022-07-06 18:39:05 -03:00
c06a3ed38c Merge pull request 'ajuste-tabla-admin' (#7) from ajuste-tabla-admin into master
Reviewed-on: #7
2022-07-06 17:17:53 -03:00
eda9d5ce6c Merge pull request 'adminUI' (#6) from adminUI into master
Reviewed-on: #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
nat
8502fb72d9 Endpoint regenera vistas 2022-06-11 10:49:39 -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
f2dee0359f Merge pull request 'adminUI' (#5) from adminUI into master
Reviewed-on: #5
2022-06-08 22:29:28 -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
nat
b2e84204ce puerto db expuesto 2022-06-08 18:26:38 -03:00
49 changed files with 17931 additions and 1260 deletions

BIN
.docker-compose.yml.swp Normal file

Binary file not shown.

2
.gitignore vendored
View file

@ -10,3 +10,5 @@ Homestead.json
Homestead.yaml Homestead.yaml
npm-debug.log npm-debug.log
yarn-error.log yarn-error.log
.idea
/resources/csv/exports/*.csv

5
.idea/pedi2.iml generated
View file

@ -78,6 +78,11 @@
<excludeFolder url="file://$MODULE_DIR$/vendor/dragonmantank/cron-expression" /> <excludeFolder url="file://$MODULE_DIR$/vendor/dragonmantank/cron-expression" />
<excludeFolder url="file://$MODULE_DIR$/vendor/psr/http-message" /> <excludeFolder url="file://$MODULE_DIR$/vendor/psr/http-message" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-php80" /> <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-php80" />
<excludeFolder url="file://$MODULE_DIR$/vendor/setasign/fpdi" />
<excludeFolder url="file://$MODULE_DIR$/vendor/paragonie/random_compat" />
<excludeFolder url="file://$MODULE_DIR$/vendor/mpdf/mpdf" />
<excludeFolder url="file://$MODULE_DIR$/vendor/php-http/message-factory" />
<excludeFolder url="file://$MODULE_DIR$/vendor/myclabs/deep-copy" />
</content> </content>
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />

7
.idea/php.xml generated
View file

@ -75,6 +75,13 @@
<path value="$PROJECT_DIR$/vendor/dragonmantank/cron-expression" /> <path value="$PROJECT_DIR$/vendor/dragonmantank/cron-expression" />
<path value="$PROJECT_DIR$/vendor/psr/http-message" /> <path value="$PROJECT_DIR$/vendor/psr/http-message" />
<path value="$PROJECT_DIR$/vendor/symfony/polyfill-php80" /> <path value="$PROJECT_DIR$/vendor/symfony/polyfill-php80" />
<path value="$PROJECT_DIR$/vendor/rmccue/requests" />
<path value="$PROJECT_DIR$/vendor/prexview/prexview" />
<path value="$PROJECT_DIR$/vendor/setasign/fpdi" />
<path value="$PROJECT_DIR$/vendor/paragonie/random_compat" />
<path value="$PROJECT_DIR$/vendor/mpdf/mpdf" />
<path value="$PROJECT_DIR$/vendor/php-http/message-factory" />
<path value="$PROJECT_DIR$/vendor/myclabs/deep-copy" />
</include_path> </include_path>
</component> </component>
<component name="PhpProjectSharedConfiguration" php_language_level="7.2"> <component name="PhpProjectSharedConfiguration" php_language_level="7.2">

View file

@ -12,7 +12,8 @@ RUN apt-get update && apt-get install -y \
libonig-dev \ libonig-dev \
libxml2-dev \ libxml2-dev \
zip \ zip \
unzip unzip \
npm
# Clear cache # Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/* RUN apt-get clean && rm -rf /var/lib/apt/lists/*

View file

@ -61,6 +61,11 @@ Podés usar el comando `logs` para ver los logs generados por tus servicios:
docker-compose logs nginx docker-compose logs nginx
``` ```
8. Ejecuta npm para compilar el js y css
```bash
docker-compose exec app npm run prod
```
## Services description ## Services description
### Dockerfile ### Dockerfile

View file

@ -3,16 +3,109 @@
namespace App; namespace App;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Mpdf\Mpdf;
use League\Csv\CannotInsertRecord;
use League\Csv\Writer;
use App\Producto;
use DB;
use League\Csv\Reader;
class GrupoDeCompra extends Model class GrupoDeCompra extends Model
{ {
public $timestamps = false; public $timestamps = false;
protected $fillable = [ "nombre","region","telefono","correo","referente_finanzas","cantidad_de_nucleos"]; protected $fillable = [ "nombre","region","telefono","correo","referente_finanzas","cantidad_de_nucleos","fila"];
protected $table = 'grupos_de_compra'; protected $table = 'grupos_de_compra';
protected $hidden = ['password']; protected $hidden = ['password'];
public function subpedidos() { public function subpedidos() {
return $this->hasMany('App\Subpedido'); return $this->hasMany('App\Subpedido');
} }
public function pedidosAprobados() {
return $this->subpedidos->where('aprobado',1);
}
public function exportarPlanillasAPdf() {
$subpedidos = $this->pedidosAprobados();
//generar pdf
$mpdf = new Mpdf();
foreach ($subpedidos as $subpedido) {
$tabla = $subpedido->generarHTML();
// agregar la tabla al pdf en una nueva página
$mpdf->WriteHTML($tabla);
$mpdf->AddPage();
}
$filename = $this->nombre . '.pdf';
// imprimir el pdf
$mpdf->Output($filename, "D");
}
//Asume que los productos están gruadados en orden de fila
private function obtenerTemplateDeFilasVacias(){
$productosFilaID = Producto::productosFilaID();
$productosIDNombre = Producto::productosIDNombre();
$num_fila = 1;
$template = [];
foreach ($productosFilaID as $fila => $id) {
for ($i = $num_fila; $i < $fila; $i++) {
$template[$i] = ["", "0"];
}
$template[$fila] = [$productosIDNombre[$id], "0"];
$num_fila = $fila+1;
}
$template[$this->obtenerFilaDeBonoTransporte()] = ["Bonos de transporte", 0];
return $template;
}
private function obtenerFilaDeBonoTransporte() {
$csv = Reader::createFromPath(resource_path('csv/productos.csv'), 'r');
$csv->setDelimiter("|");
$csv->setEnclosure("'");
$registros = $csv->getRecords();
foreach($registros as $key => $registro)
if ($registro[0] == 'T') return $key+1;
throw new Exception('No hay bono de transporte');
}
private function totalPedidoSinBDT() {
$total = 0;
foreach ($this->subpedidos as $subpedido) {
$total += $subpedido->totalSinBDT();
}
return $total;
}
private function calcularCantidadBDT() {
return ceil($this->totalPedidoSinBDT() / 500);
}
public function exportarPedidoEnCSV(){
$productos_en_pedido = DB::table('pedidos_aprobados')->where('grupo_de_compra_id',$this->id)->get()->keyBy('producto_id');
//si no hay pedidos aprobados, salir
if ($productos_en_pedido->count() == 0) { \Log::debug("El grupo de compra ". $this->nombre . " no tiene pedidos aprobados."); return; }
$records = $this->obtenerTemplateDeFilasVacias();
$productos_id_fila = Producto::productosIdFila();
foreach ($productos_en_pedido as $id => $producto_pedido){
$fila = $productos_id_fila[$id];
$records[$fila][1] = $producto_pedido->cantidad_pedida;
}
$records[$this->obtenerFilaDeBonoTransporte()][1] = $this->calcularCantidadBDT();
try {
$writer = Writer::createFromPath(resource_path('csv/exports/'.$this->nombre.'.csv'), 'w');
$writer->insertAll($records);
} catch (CannotInsertRecord $e) {
var_export($e->getRecords());
}
}
public static function exportarTodosLosPedidosEnCSV(){
$gdcs=GrupoDeCompra::all();
foreach ($gdcs as $gdc){ $gdc->exportarPedidoEnCSV(); }
}
} }

View file

@ -2,7 +2,9 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\GrupoDeCompra;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Response;
class AdminController extends Controller class AdminController extends Controller
{ {
@ -14,4 +16,14 @@ class AdminController extends Controller
public function index() { public function index() {
return view('auth/admin_subpedidos'); return view('auth/admin_subpedidos');
} }
public function exportarPlanillasAPdf(GrupoDeCompra $gdc) {
return $gdc->exportarPlanillasAPdf();
}
public function exportarPedidoACSV(GrupoDeCompra $gdc) {
$gdc->exportarPedidoEnCSV();
$file = resource_path('csv/exports/'.$gdc->nombre.'.csv');
return response()->download($file);
}
} }

View file

@ -6,15 +6,33 @@ use Illuminate\Support\Facades\DB;
class PedidoController extends Controller class PedidoController extends Controller
{ {
public function generarTablas() public static function generarTablas()
{ {
//GENERAR TABLA DE PEDIDOS APROBADOS
DB::unprepared("DROP VIEW if exists pedidos_aprobados;
CREATE 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;");
//GENERAR TABLA GENERAL //GENERAR TABLA GENERAL
DB::unprepared("DROP VIEW if exists productos_por_grupo_de_compra; DB::unprepared("DROP VIEW if exists productos_por_grupo_de_compra;
SET @barrios = NULL; SET @barrios = NULL;
SELECT SELECT
GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(`grupo_de_compra_nombre` = \"', `grupo_de_compra_nombre`,'\", `cantidad_pedida`,NULL)) AS \"',`grupo_de_compra_nombre`,'\"')) INTO @barrios GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(`grupo_de_compra_nombre` = \"', `grupo_de_compra_nombre`,'\", `cantidad_pedida`,NULL)) AS \"',`grupo_de_compra_nombre`,'\"')) INTO @barrios
FROM pedidos; FROM pedidos_aprobados;
SET @sql = CONCAT('CREATE VIEW productos_por_grupo_de_compra AS SELECT producto_nombre, ', @barrios, ' FROM pedidos GROUP BY producto_nombre'); SET @sql = CONCAT('CREATE VIEW productos_por_grupo_de_compra AS SELECT producto_nombre, ', @barrios, ' FROM pedidos_aprobados GROUP BY producto_nombre');
PREPARE stmt FROM @sql; PREPARE stmt FROM @sql;
EXECUTE stmt;"); EXECUTE stmt;");
return "Tabla productos_por_grupo_de_compra generada. " . date('l jS \of F Y h:i:s A'); return "Tabla productos_por_grupo_de_compra generada. " . date('l jS \of F Y h:i:s A');

View file

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

View file

@ -0,0 +1,26 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Auth;
class Admin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$user = Auth::user();
if ($user->is_admin) {
return $next($request);
} else {
return response('Necesitás ser admin para hacer esto', 403);
}
}
}

View file

@ -17,7 +17,7 @@ class SubpedidoResource extends JsonResource
return [ return [
'id' => $this->id, 'id' => $this->id,
'nombre' => $this->nombre, 'nombre' => $this->nombre,
'subtotal_productos' => number_format($this->getSubtotalProductos(),0), 'subtotal_productos' => number_format($this->totalSinBDT(),0),
'subtotal_bonos' => number_format($this->getSubtotalBonos(),0), 'subtotal_bonos' => number_format($this->getSubtotalBonos(),0),
'bonos_de_transporte' => $this->cantidadBDT(), 'bonos_de_transporte' => $this->cantidadBDT(),
'subtotal_bonos_de_transporte' => number_format($this->getSubtotalBDT(),0), 'subtotal_bonos_de_transporte' => number_format($this->getSubtotalBDT(),0),

View file

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

View file

@ -24,7 +24,7 @@ class Subpedido extends Model
return $this->productos()->where('bono',1); return $this->productos()->where('bono',1);
} }
private function productosSinBonos() public function productosSinBonos()
{ {
return $this->productos()->where('bono',false); return $this->productos()->where('bono',false);
} }
@ -41,7 +41,7 @@ class Subpedido extends Model
} }
//Subtotal de dinero de productos del pedido, sin bonos ni transporte //Subtotal de dinero de productos del pedido, sin bonos ni transporte
public function getSubtotalProductos() public function totalSinBDT()
{ {
return $this->productosSinBonos()->sum('total'); return $this->productosSinBonos()->sum('total');
} }
@ -49,7 +49,7 @@ class Subpedido extends Model
//Cantidad de bonos de transporte //Cantidad de bonos de transporte
public function cantidadBDT() public function cantidadBDT()
{ {
return ceil($this->getSubtotalProductos() / 500); return ceil($this->totalSinBDT() / 500);
} }
//Subtotal de dinero de bonos de transporte //Subtotal de dinero de bonos de transporte
@ -66,7 +66,7 @@ class Subpedido extends Model
public function getTotal() public function getTotal()
{ {
return $this->getSubtotalProductos() + $this->getSubtotalBDT() + $this->getSubtotalBonos(); return $this->totalSinBDT() + $this->getSubtotalBDT() + $this->getSubtotalBonos();
} }
//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. //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.
@ -90,4 +90,9 @@ class Subpedido extends Model
$this->save(); $this->save();
} }
public function generarHTML() {
$view = view("pdfgen.subpedido_tabla", ["subpedido" => $this]);
return $view->render();
}
} }

View file

@ -16,7 +16,9 @@
"laravel/sanctum": "^2.13", "laravel/sanctum": "^2.13",
"laravel/tinker": "^2.5", "laravel/tinker": "^2.5",
"laravel/ui": "*", "laravel/ui": "*",
"league/csv": "^9.8" "league/csv": "^9.8",
"mpdf/mpdf": "^8.1",
"prexview/prexview": "^1.1"
}, },
"require-dev": { "require-dev": {
"facade/ignition": "^2.0", "facade/ignition": "^2.0",

408
composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "8389a7c37eb75068185ce61fe4270621", "content-hash": "55c5266672a741b618c9da8a6e272450",
"packages": [ "packages": [
{ {
"name": "asm89/stack-cors", "name": "asm89/stack-cors",
@ -1666,6 +1666,142 @@
], ],
"time": "2021-10-01T21:08:31+00:00" "time": "2021-10-01T21:08:31+00:00"
}, },
{
"name": "mpdf/mpdf",
"version": "v8.1.2",
"source": {
"type": "git",
"url": "https://github.com/mpdf/mpdf.git",
"reference": "a8a22f4874157e490d41b486053a20bec42e182c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/mpdf/mpdf/zipball/a8a22f4874157e490d41b486053a20bec42e182c",
"reference": "a8a22f4874157e490d41b486053a20bec42e182c",
"shasum": ""
},
"require": {
"ext-gd": "*",
"ext-mbstring": "*",
"myclabs/deep-copy": "^1.7",
"paragonie/random_compat": "^1.4|^2.0|^9.99.99",
"php": "^5.6 || ^7.0 || ~8.0.0 || ~8.1.0",
"php-http/message-factory": "^1.0",
"psr/http-message": "^1.0",
"psr/log": "^1.0 || ^2.0",
"setasign/fpdi": "^2.1"
},
"require-dev": {
"mockery/mockery": "^1.3.0",
"mpdf/qrcode": "^1.1.0",
"squizlabs/php_codesniffer": "^3.5.0",
"tracy/tracy": "^2.4",
"yoast/phpunit-polyfills": "^1.0"
},
"suggest": {
"ext-bcmath": "Needed for generation of some types of barcodes",
"ext-xml": "Needed mainly for SVG manipulation",
"ext-zlib": "Needed for compression of embedded resources, such as fonts"
},
"type": "library",
"autoload": {
"psr-4": {
"Mpdf\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"GPL-2.0-only"
],
"authors": [
{
"name": "Matěj Humpál",
"role": "Developer, maintainer"
},
{
"name": "Ian Back",
"role": "Developer (retired)"
}
],
"description": "PHP library generating PDF files from UTF-8 encoded HTML",
"homepage": "https://mpdf.github.io",
"keywords": [
"pdf",
"php",
"utf-8"
],
"support": {
"docs": "http://mpdf.github.io",
"issues": "https://github.com/mpdf/mpdf/issues",
"source": "https://github.com/mpdf/mpdf"
},
"funding": [
{
"url": "https://www.paypal.me/mpdf",
"type": "custom"
}
],
"time": "2022-08-15T08:15:09+00:00"
},
{
"name": "myclabs/deep-copy",
"version": "1.11.0",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
"reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614",
"reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"conflict": {
"doctrine/collections": "<1.6.8",
"doctrine/common": "<2.13.3 || >=3,<3.2.2"
},
"require-dev": {
"doctrine/collections": "^1.6.8",
"doctrine/common": "^2.13.3 || ^3.2.2",
"phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
},
"type": "library",
"autoload": {
"files": [
"src/DeepCopy/deep_copy.php"
],
"psr-4": {
"DeepCopy\\": "src/DeepCopy/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Create deep copies (clones) of your objects",
"keywords": [
"clone",
"copy",
"duplicate",
"object",
"object graph"
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
"source": "https://github.com/myclabs/DeepCopy/tree/1.11.0"
},
"funding": [
{
"url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
"type": "tidelift"
}
],
"time": "2022-03-03T13:19:32+00:00"
},
{ {
"name": "nesbot/carbon", "name": "nesbot/carbon",
"version": "2.55.2", "version": "2.55.2",
@ -1883,6 +2019,110 @@
}, },
"time": "2021-04-09T13:42:10+00:00" "time": "2021-04-09T13:42:10+00:00"
}, },
{
"name": "paragonie/random_compat",
"version": "v9.99.100",
"source": {
"type": "git",
"url": "https://github.com/paragonie/random_compat.git",
"reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
"reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
"shasum": ""
},
"require": {
"php": ">= 7"
},
"require-dev": {
"phpunit/phpunit": "4.*|5.*",
"vimeo/psalm": "^1"
},
"suggest": {
"ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
},
"type": "library",
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Paragon Initiative Enterprises",
"email": "security@paragonie.com",
"homepage": "https://paragonie.com"
}
],
"description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
"keywords": [
"csprng",
"polyfill",
"pseudorandom",
"random"
],
"support": {
"email": "info@paragonie.com",
"issues": "https://github.com/paragonie/random_compat/issues",
"source": "https://github.com/paragonie/random_compat"
},
"time": "2020-10-15T08:29:30+00:00"
},
{
"name": "php-http/message-factory",
"version": "v1.0.2",
"source": {
"type": "git",
"url": "https://github.com/php-http/message-factory.git",
"reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1",
"reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1",
"shasum": ""
},
"require": {
"php": ">=5.4",
"psr/http-message": "^1.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"psr-4": {
"Http\\Message\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Márk Sági-Kazár",
"email": "mark.sagikazar@gmail.com"
}
],
"description": "Factory interfaces for PSR-7 HTTP Message",
"homepage": "http://php-http.org",
"keywords": [
"factory",
"http",
"message",
"stream",
"uri"
],
"support": {
"issues": "https://github.com/php-http/message-factory/issues",
"source": "https://github.com/php-http/message-factory/tree/master"
},
"time": "2015-12-19T14:08:53+00:00"
},
{ {
"name": "phpoption/phpoption", "name": "phpoption/phpoption",
"version": "1.8.1", "version": "1.8.1",
@ -1954,6 +2194,40 @@
], ],
"time": "2021-12-04T23:24:31+00:00" "time": "2021-12-04T23:24:31+00:00"
}, },
{
"name": "prexview/prexview",
"version": "v1.1.0",
"source": {
"type": "git",
"url": "https://github.com/prexview/prexview-php.git",
"reference": "d5f44d7aa49ce1cb507a613427d0184e1952f1b7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/prexview/prexview-php/zipball/d5f44d7aa49ce1cb507a613427d0184e1952f1b7",
"reference": "d5f44d7aa49ce1cb507a613427d0184e1952f1b7",
"shasum": ""
},
"require": {
"rmccue/requests": "^1.7"
},
"type": "library",
"autoload": {
"psr-4": {
"PrexView\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "A composer library to use PrexView, a fast, scalable and friendly service for programatic HTML, PDF, PNG or JPG generation using JSON or XML data.",
"support": {
"issues": "https://github.com/prexview/prexview-php/issues",
"source": "https://github.com/prexview/prexview-php/tree/master"
},
"time": "2017-07-28T00:29:38+00:00"
},
{ {
"name": "psr/container", "name": "psr/container",
"version": "1.1.2", "version": "1.1.2",
@ -2609,6 +2883,138 @@
], ],
"time": "2021-09-25T23:10:38+00:00" "time": "2021-09-25T23:10:38+00:00"
}, },
{
"name": "rmccue/requests",
"version": "v1.8.1",
"source": {
"type": "git",
"url": "https://github.com/WordPress/Requests.git",
"reference": "82e6936366eac3af4d836c18b9d8c31028fe4cd5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/WordPress/Requests/zipball/82e6936366eac3af4d836c18b9d8c31028fe4cd5",
"reference": "82e6936366eac3af4d836c18b9d8c31028fe4cd5",
"shasum": ""
},
"require": {
"php": ">=5.2"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "^0.7",
"php-parallel-lint/php-console-highlighter": "^0.5.0",
"php-parallel-lint/php-parallel-lint": "^1.3",
"phpcompatibility/php-compatibility": "^9.0",
"phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5",
"requests/test-server": "dev-master",
"squizlabs/php_codesniffer": "^3.5",
"wp-coding-standards/wpcs": "^2.0"
},
"type": "library",
"autoload": {
"psr-0": {
"Requests": "library/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"ISC"
],
"authors": [
{
"name": "Ryan McCue",
"homepage": "http://ryanmccue.info"
}
],
"description": "A HTTP library written in PHP, for human beings.",
"homepage": "http://github.com/WordPress/Requests",
"keywords": [
"curl",
"fsockopen",
"http",
"idna",
"ipv6",
"iri",
"sockets"
],
"support": {
"issues": "https://github.com/WordPress/Requests/issues",
"source": "https://github.com/WordPress/Requests/tree/v1.8.1"
},
"time": "2021-06-04T09:56:25+00:00"
},
{
"name": "setasign/fpdi",
"version": "v2.3.6",
"source": {
"type": "git",
"url": "https://github.com/Setasign/FPDI.git",
"reference": "6231e315f73e4f62d72b73f3d6d78ff0eed93c31"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Setasign/FPDI/zipball/6231e315f73e4f62d72b73f3d6d78ff0eed93c31",
"reference": "6231e315f73e4f62d72b73f3d6d78ff0eed93c31",
"shasum": ""
},
"require": {
"ext-zlib": "*",
"php": "^5.6 || ^7.0 || ^8.0"
},
"conflict": {
"setasign/tfpdf": "<1.31"
},
"require-dev": {
"phpunit/phpunit": "~5.7",
"setasign/fpdf": "~1.8",
"setasign/tfpdf": "1.31",
"squizlabs/php_codesniffer": "^3.5",
"tecnickcom/tcpdf": "~6.2"
},
"suggest": {
"setasign/fpdf": "FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured."
},
"type": "library",
"autoload": {
"psr-4": {
"setasign\\Fpdi\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jan Slabon",
"email": "jan.slabon@setasign.com",
"homepage": "https://www.setasign.com"
},
{
"name": "Maximilian Kresse",
"email": "maximilian.kresse@setasign.com",
"homepage": "https://www.setasign.com"
}
],
"description": "FPDI is a collection of PHP classes facilitating developers to read pages from existing PDF documents and use them as templates in FPDF. Because it is also possible to use FPDI with TCPDF, there are no fixed dependencies defined. Please see suggestions for packages which evaluates the dependencies automatically.",
"homepage": "https://www.setasign.com/fpdi",
"keywords": [
"fpdf",
"fpdi",
"pdf"
],
"support": {
"issues": "https://github.com/Setasign/FPDI/issues",
"source": "https://github.com/Setasign/FPDI/tree/v2.3.6"
},
"funding": [
{
"url": "https://tidelift.com/funding/github/packagist/setasign/fpdi",
"type": "tidelift"
}
],
"time": "2021-02-11T11:37:01+00:00"
},
{ {
"name": "swiftmailer/swiftmailer", "name": "swiftmailer/swiftmailer",
"version": "v6.3.0", "version": "v6.3.0",

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

@ -13,6 +13,6 @@ class DatabaseSeeder extends Seeder
public function run() public function run()
{ {
$this->call(GrupoDeCompraSeeder::class); $this->call(GrupoDeCompraSeeder::class);
$this->call(ProductoSeeder::class); $this->call(ImportarProductoSeeder::class);
} }
} }

View file

@ -0,0 +1,97 @@
<?php
use Illuminate\Database\Seeder;
use League\Csv\Reader;
use App\Proveedor;
class ImportarProductoSeeder extends Seeder
{
const FILA_HEADER = "Tipo";
const ULTIMA_FILA = "TOTAL";
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$csv = Reader::createFromPath(resource_path('csv/productos.csv'), 'r');
$csv->setDelimiter("|");
$iHeader = $this->obtenerIndiceDeHeader($csv);
$csv->setHeaderOffset($iHeader);
$registros = $csv->getRecords();
$toInsert = [];
$categoria = '';
foreach($registros as $i => $registro){
//filas que están arriba del header
if ($i <= $iHeader){
continue;
}
//finalizar
if ($registro[$this::FILA_HEADER] == $this::ULTIMA_FILA){
break;
}
//filas que no tienen tipo
if (!Arr::has($registro,$this::FILA_HEADER)|| trim($registro[$this::FILA_HEADER]) == ''){
var_dump("no hay tipo en la fila " . $i);
continue;
}
//saltear bono de transporte
if ($registro[$this::FILA_HEADER] == "T"){
continue;
}
//obtener categoria
if ($registro['Producto'] == '') {
//es la pregunta de la copa?
if (Str::contains($registro[$this::FILA_HEADER],"¿")) { continue; }
$categoria = $registro[$this::FILA_HEADER];
continue;
}
//completar producto
$toInsert[] = [
'fila' => $i,
'categoria' => $categoria,
'nombre' => trim(str_replace('*', ' ',$registro['Producto'])),
'precio' => $registro['Precio'],
'proveedor_id' => $this->obtenerProveedor($registro['Producto']),
'bono' => ($categoria == 'TRANSPORTE, BONOS Y FINANCIAMIENTO SORORO')
];
}
foreach (array_chunk($toInsert,DatabaseSeeder::CHUNK_SIZE) as $chunk)
{
DB::table('productos')->insert($chunk);
}
}
private function obtenerIndiceDeHeader($csv){
$registros = $csv->getRecords();
$iheader = 0;
foreach ($registros as $i => $registro){
if (strtolower($registro[0]) == strtolower($this::FILA_HEADER)) {
$iheader = $i;
break;
}
}
return $iheader;
}
private function obtenerProveedor($nombre) {
$result = null;
if (Str::contains($nombre,"*")){
$result = Proveedor::firstOrCreate([
'nombre' => 'Proveedor de economía solidaria',
'economia_solidaria' => 1,
'nacional' => 1
])->id;
}
return $result;
}
}

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

@ -34,6 +34,8 @@ services:
- dbdata:/var/lib/mysql - dbdata:/var/lib/mysql
networks: networks:
- app-network - app-network
ports:
- ${DB_PORT_EXPOSED}:3306
nginx: nginx:
image: nginx:alpine image: nginx:alpine

13
package-lock.json generated
View file

@ -1,5 +1,5 @@
{ {
"name": "pedi2", "name": "www",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
@ -7,6 +7,7 @@
"dependencies": { "dependencies": {
"animate.css": "^4.1.1", "animate.css": "^4.1.1",
"bulma": "^0.9.4", "bulma": "^0.9.4",
"bulma-switch": "^2.0.4",
"bulma-toast": "^2.4.1" "bulma-toast": "^2.4.1"
}, },
"devDependencies": { "devDependencies": {
@ -3006,6 +3007,11 @@
"resolved": "https://registry.npmjs.org/bulma/-/bulma-0.9.4.tgz", "resolved": "https://registry.npmjs.org/bulma/-/bulma-0.9.4.tgz",
"integrity": "sha512-86FlT5+1GrsgKbPLRRY7cGDg8fsJiP/jzTqXXVqiUZZ2aZT8uemEOHlU1CDU+TxklPEZ11HZNNWclRBBecP4CQ==" "integrity": "sha512-86FlT5+1GrsgKbPLRRY7cGDg8fsJiP/jzTqXXVqiUZZ2aZT8uemEOHlU1CDU+TxklPEZ11HZNNWclRBBecP4CQ=="
}, },
"node_modules/bulma-switch": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/bulma-switch/-/bulma-switch-2.0.4.tgz",
"integrity": "sha512-kMu4H0Pr0VjvfsnT6viRDCgptUq0Rvy7y7PX6q+IHg1xUynsjszPjhAdal5ysAlCG5HNO+5YXxeiu92qYGQolw=="
},
"node_modules/bulma-toast": { "node_modules/bulma-toast": {
"version": "2.4.1", "version": "2.4.1",
"resolved": "https://registry.npmjs.org/bulma-toast/-/bulma-toast-2.4.1.tgz", "resolved": "https://registry.npmjs.org/bulma-toast/-/bulma-toast-2.4.1.tgz",
@ -15942,6 +15948,11 @@
"resolved": "https://registry.npmjs.org/bulma/-/bulma-0.9.4.tgz", "resolved": "https://registry.npmjs.org/bulma/-/bulma-0.9.4.tgz",
"integrity": "sha512-86FlT5+1GrsgKbPLRRY7cGDg8fsJiP/jzTqXXVqiUZZ2aZT8uemEOHlU1CDU+TxklPEZ11HZNNWclRBBecP4CQ==" "integrity": "sha512-86FlT5+1GrsgKbPLRRY7cGDg8fsJiP/jzTqXXVqiUZZ2aZT8uemEOHlU1CDU+TxklPEZ11HZNNWclRBBecP4CQ=="
}, },
"bulma-switch": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/bulma-switch/-/bulma-switch-2.0.4.tgz",
"integrity": "sha512-kMu4H0Pr0VjvfsnT6viRDCgptUq0Rvy7y7PX6q+IHg1xUynsjszPjhAdal5ysAlCG5HNO+5YXxeiu92qYGQolw=="
},
"bulma-toast": { "bulma-toast": {
"version": "2.4.1", "version": "2.4.1",
"resolved": "https://registry.npmjs.org/bulma-toast/-/bulma-toast-2.4.1.tgz", "resolved": "https://registry.npmjs.org/bulma-toast/-/bulma-toast-2.4.1.tgz",

View file

@ -26,6 +26,7 @@
"dependencies": { "dependencies": {
"animate.css": "^4.1.1", "animate.css": "^4.1.1",
"bulma": "^0.9.4", "bulma": "^0.9.4",
"bulma-switch": "^2.0.4",
"bulma-toast": "^2.4.1" "bulma-toast": "^2.4.1"
} }
} }

14164
public/css/app.css vendored

File diff suppressed because it is too large Load diff

2631
public/js/app.js vendored

File diff suppressed because one or more lines are too long

View file

@ -1,45 +1,4 @@
barrio|region|referente|telefono|correo barrio|region|referente|telefono|correo
BUCEO|ESTE||| ENTREVERO|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|||
TRES CRUCES|SUR||| TRES CRUCES|SUR|||
VILLA ESPAÑOLA|SUR||| PRUEBA|SIN REGION|||
AUDA|OTRA|||
SINTEP|OTRA|||
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

@ -1,359 +1,403 @@
categoria|producto|precio|proveedor CANASTA 83 - Noviembre 2022|||||REFERENCIAS:
ALIMENTOS NO PERECEDEROS|Yerba Compuesta La Herboristería 1kg |140.3| S-G (SIN GLUTEN)
ALIMENTOS NO PERECEDEROS|Yerba Yusa tradicional 1kg |121.8| S-S (SIN SAL AGREGADA)
ALIMENTOS NO PERECEDEROS|Yerba Yusa tradicional 500grs|65| S-A (SIN AZUCAR AGREGADA)
ALIMENTOS NO PERECEDEROS|Yerba Sara tradicional 1kg|129.7| S-P-A (SIN PRODUCTOS DE ORIGEN ANIMAL)
ALIMENTOS NO PERECEDEROS|Yerba Sara suave 1kg|132.2| |||||||||Esta columna (sin el total) es la que hay que pegar en la columna Pedido de la planilla enviada por Compras|
ALIMENTOS NO PERECEDEROS|Yerba Kiero mate 500grs|72.5| |||||||||||||||
ALIMENTOS NO PERECEDEROS|*Harina Santa Unión 000 1kg|27.3|Santa Unión |Nombre del barrio|Total|0||||||||||||
ALIMENTOS NO PERECEDEROS|*Harina Santa Unión 0000 1kg|34.8|Santa Unión Tipo|Producto|Precio|flia 1|flia 2|flia 3|flia 4|flia 5|flia 6|flia 7|flia 8|flia 9|flia 10|flia 11|Cantidad total de productos|Monto total por producto ($)
ALIMENTOS NO PERECEDEROS|*Harina de trigo integral Pasaná 1 kg|65|Pasaná ALIMENTOS NO PERECEDEROS||||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Harina de arroz Pasaná 1 kg |65|Pasaná P|Yerba Compuesta La Herboristería 1kg|147.32||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Harina de Garbanzos Pasaná 1 kg |140|Pasaná P|Yerba Yusa tradicional 1kg|121.8||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Mezcla para faina Pasaná 1 kg |150|Pasaná P|Yerba Yusa tradicional 500grs|65||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Fécula de Mandioca Pasaná 1 kg |85|Pasaná P|Yerba Sara tradicional 1kg (Sin TACC)|135.64||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Tres Harinas 500grs. |85| P|Yerba Sara suave 1kg (Sin TACC)|137.86||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Harina Santa Unión 000 Bolsa 25kg|560.6|Santa Unión P|*Harina Santa Unión 000 1kg|37.7||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Polenta Santa Unión 450gr|15.4|Santa Unión P|*Harina Santa Unión 0000 1kg|43.6||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Mezcla de Fainá Santa Unión 5kg|294.8|Santa Unión P|*Harina de trigo integral Pasaná 1 kg|65.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Fideos Caorsi Tirabuzón 1kg|59|Caorsi P|*Harina de arroz Pasaná 1 kg (Puede contener gluten)|65.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Fideos Caorsi Tallarín 1kg|69|Caorsi P|*Harina de Garbanzos Pasaná 1 kg (Puede contener gluten)|140.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Fideos Caorsi Moñita 1kg|69|Caorsi P|*Mezcla para faina Pasaná 1 kg (Puede contener gluten)|150.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Fideos Caorsi para sopa 1kg|59|Caorsi P|*Fécula de Mandioca Pasaná 1 kg (Puede contener gluten)|90.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Fideos Caorsi para sopa 5kg|268|Caorsi P|Tres Harinas 500grs (Sin TAAC)|89||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Fideos Caorsi Tirabuzón 5kg|268|Caorsi P|*Harina Santa Unión 000 Bolsa 25kg|816.72||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Arroz Blue Patna 1kg|40.2| P|*Polenta Santa Unión 450gr|19.51||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Arroz Shiva 1kg|27| P|*Mezcla de Fainá Santa Unión 5kg|477.25||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Arroz integral 1kg |55| P|*Fideos Caorsi Tirabuzón 1kg|68||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Arroz integral 3kg|155| P|*Fideos Caorsi Tallarín 1kg|76||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Aceite Condesa de Soja 900 cc.|84| P|*Fideos Caorsi Moñita 1kg|76||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Aceite Uruguay de Girasol 900 cc.|108| P|*Fideos Caorsi para sopa 1kg|68||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Aceite Optimo canola 900 cc.|82.4| P|*Fideos Caorsi para sopa 5kg|333||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Aceite de oliva 500 ml. |195| P|*Fideos Caorsi Tirabuzón 5kg|333||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Vinagre Uruguay 900ml|77.9| P|Arroz Blue Patna 1kg|42.23||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Aceite de Oliva Cuatro Piedras 3 lt|1090| P|Arroz Shiva 1kg|25.65||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Salsa de soja La Posta 250 ml. |95| P|*Arroz integral 1kg|55||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Aceitunas verdes sin carozo en frasco La Posta 500 gr. |180|La Posta P|*Arroz integral 3kg|155||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Aceitunas negras sin carozo en frasco frasco La Posta 500 gr. |180|La Posta P|Aceite Condesa de Soja 900 cc.|93.3||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Lata atún Golden Fish desmenuzado al aceite 170g|31.1| P|Aceite Uruguay de Girasol 900 cc.|115.2||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Lata de arvejas Campero 300g|18.3| P|Aceite Optimo canola 900 cc.|102||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Lata de choclo Cosecha 300g|22| P|*Aceite de oliva 500 ml.|210||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Lata de jardinera Cosecha|25| P|Vinagre Uruguay 900ml|81.7||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Lata de porotos negros Cosecha|31.1| P|Aceite de Oliva Cuatro Piedras 3 lt|1190||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Lata de porotos de frutilla Cosecha|31.1| P|*Salsa de soja La Posta 250 ml.|100||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Lata de duraznos en almíbar Campero |66.6| P|*Aceitunas verdes sin carozo en frasco La Posta 500 gr.|195||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Mayonesa Uruguay 500g|77.9| P|*Aceitunas negras sin carozo en frasco frasco La Posta 500 gr.|195||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Azúcar Azucarlito 25kg|1007.5| P|Lata atún Golden Fish desmenuzado al aceite 170g|38.55||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Azúcar Bella Unión 1kg|39.8| P|Lata de arvejas Campero 300g|19||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Azúcar impalpable Hornex 200 gr|31| P|Lata de choclo Cosecha 300g|27.14||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Azúcar impalpable Hornex 1kg|104| P|Lata de jardinera Cosecha|30.94||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Almidón de maíz Hornex 1Kg|64.5| P|Lata de porotos negros Cosecha|34.75||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Polvo de Hornear Hornex 1 kg|122| P|Lata de porotos de frutilla Cosecha|34.75||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Polvo de Hornear Hornex 100 g + 20 g|27.9| P|Lata de duraznos en almíbar Campero|72||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Esencia de vainilla La Posta 100ml|80| P|Mayonesa Uruguay 500g|85.7||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Grasa Uruguay 400grs|50| P|Azúcar Bella Unión 1kg|44.3||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Levadura seca Hornex 125g|85.5| P|Azúcar rubia Mascabo 500g|95||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Café Sorocabana glaseado p/máquina 500 grs|232.8| P|Azúcar impalpable Hornex 200 gr|37||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Café Sorocabana natural p/máquina 500 grs |315.8| P|Azúcar impalpable Hornex 1kg|121||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Café Saint 170 gr Instantaneo|185.3| P|Almidón de maíz Hornex 1Kg|76||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Té Negro en hebras 90gr hornimans|30.7| P|Polvo de Hornear Hornex 1 kg|141||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Galletas de arroz comunes Natural Rice 120 gr|34| P|Polvo de Hornear Hornex 100 g + 20 g|36.5||||||||||||0|0
ALIMENTOS NO PERECEDEROS|* Leche en polvo 250grs|65| P|*Esencia de vainilla La Posta 100ml|90.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|* Leche en polvo 1kg|220| P|*Bicarbonato de sodio La Posta 250 gr|50||||||||||||0|0
ALIMENTOS NO PERECEDEROS|* Coco rallado 200gr|70| P|Grasa Uruguay 400grs|62||||||||||||0|0
ALIMENTOS NO PERECEDEROS|* Coco rallado 1kg|275| P|Levadura seca Hornex 125g|118||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Cocoa Hornex 200gr|43| P|Café Sorocabana glaseado p/máquina 500 grs|356.51||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Postre de chocolate Hornex 8 porciones|36.5| P|Café Sorocabana natural p/máquina 500 grs|483.64||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Prostre LIGHT de vainilla Hornex 8 porciones (aprobado por ADU)|57| P|Café soluble Saint bollón 170 gr|192.7||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Flan de vainilla Hornex 8 porciones|36.5| P|Té Negro en hebras 90gr hornimans|35.85||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Gelatina de frutilla Hornex 8 porciones|36.5| P|Galletas de arroz SIN SAL Natural Rice 120 gr.|36.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Bizcochuelo de vainilla SIN GLUTEN 500gr Hornex|142| P|Galletas de arroz comunes Natural Rice 120 gr|36.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Pizza SIN GLUTEN 320gr Hornex|137| P|Leche en polvo entera 200 gr|100.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Pulpa de Tomate De Ley 1lt|43.5| P|Leche en polvo entera 1kg|382.22||||||||||||0|0
ALIMENTOS NO PERECEDEROS|Pure de papa instantaneo De Ley 125g|21.3| P|* Coco rallado 200gr|65||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Sal fina sin fluor Polenteados 500g|27| P|* Coco rallado 1kg|255.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Sal gruesa sin fluor Polenteados 500g|27| P|Cocoa Hornex 200gr|49.5||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Salsa de tomate casera (puro tomate) 1 lt|65| P|Postre de chocolate Hornex 8 porciones|41.5||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Barras de cereales (maní, sésamo, lino, girasol, avena, copos de arroz, copos de máiz, azúcar rubia y miel) - Pack x2 |65| P|Postre LIGHT de vainilla Hornex 8 porciones (aprobado por ADU)|66.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Barras de cereales bañadas en chocolate (maní, sésamo, lino, girasol, avena, copos de arroz, copos de máiz, azúcar rubia y miel) - Pack x2|75| P|Flan de vainilla Hornex 8 porciones|41.5||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Granola artesanal 500 gr Ing: copos ,avena,miel, vainilla,coco rallado, chia,girasol,sésamo, lino,maní, almendras, castañas de caju, nueces, chips de chocolate.|210| P|Gelatina de frutilla Hornex 8 porciones|41.5||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Granola simple (avena+ girasol+ pasaUva) 1kg|160| P|Bizcochuelo de vainilla SIN GLUTEN 500gr Hornex|158||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Copos de maíz azucarados 500g|89| P|Pizza SIN GLUTEN 320gr Hornex|150||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Copos de maíz naturales 500g|89| P|Pulpa de Tomate De Ley 1lt (S-G)|52.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Crema untable de maní 250gr|89| P|Pure de papa instantaneo De Ley 125g|25.2||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Galletas de coco, avena y maní 400gr|100| P|*Sal fina sin fluor Polenteados 500g|28||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Budin Panitep con cobertura de chocolate con almendras, maní, nueces y pasas 250grs|160| P|*Sal gruesa sin fluor Polenteados 500g|28.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Budin Panitep con cobertura de almíbar y coco con almendras, maní, nueces y pasas 250grs|140| P |*Salsa de tomate casera (puro tomate) 1 lt - (S-G) - azucar agregada: 1g/L - sal agregada: 0,25g/L|75.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Budin Panitep de naranja 250grs|140| P|*Barras de cereales (maní, sésamo, lino, girasol, avena, copos de arroz, copos de máiz, azúcar rubia y miel) - Pack x2|75.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Chia 1/4 kg |65| P|*Barras de cereales bañadas en chocolate (maní, sésamo, lino, girasol, avena, copos de arroz, copos de máiz, azúcar rubia y miel) - Pack x2|85.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Girasol 1/2 kg |85| P|*Granola artesanal 500 gr Ing: copos ,avena,miel, vainilla,coco rallado, chia,girasol,sésamo, lino,maní, almendras, castañas de caju, nueces, chips de chocolate.|235.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Lino 1/4 kg |30| P|*Granola simple (avena+ girasol+ pasaUva) 1kg|175.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Sésamo 1/4 kg |55| P|*Copos de maíz azucarados 500g|92.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Quinoa 1 kg |200| P|*Copos de maíz naturales 500g|92.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Dátiles con carozo 500 gr|180| P|*Crema untable de maní 250gr|92.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Cacao en polvo 250 grs |100| P|Alfajor de coco 80 g (S-G) |44.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Almendra pelada (sin tostar) Polenteados 100g|80|Polenteados P|Galletitas dulces sabor cacao, nueces, avena y sésamo 150 g (S-G, S-A)|108.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Pasas de Uva Polenteados 250 gr|69|Polenteados P|Crackers saladas de remolacha y chía 180 g (S-G)|108.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Nueces Polenteados 100g|79|Polenteados P|*Lino 1/4 kg|30.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Castañas tostadas SIN sal 100grs|76|Polenteados P|*Chía 1/4 kg|65.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Avena laminada instantánea Polenteados 500g|49|Polenteados P|*Girasol 1/2 kg|85.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Pan de molde Gigor Lacteado 550g|55|Gigor P|*Sésamo 1/4 kg|55.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Pan de molde Gigor Integral 550g|55|Gigor P|*Quinoa 1 kg|200.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Galleta Malteada La Socialista 350g|56|La Socialista P|*Dátiles con carozo 500 gr|185.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Galleta Malteada c/semillas (sésamo, chia, lino) La Socialista 380gr |74|La Socialista P|*Cacao en polvo 250 grs (S-A)|100.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Galleta Cara Sucia La Socialista 350g|63|La Socialista P|*Almendra pelada (sin tostar) Polenteados 100g|80.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Grisines La Socialista 350g|67|La Socialista P|*Pasas de Uva Polenteados 250 gr|69.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Mezcla para panqueques La Socialista 2 x 250g|56|La Socialista P|*Nueces Polenteados 100g|81.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Mezcla para salsa blanca La Socialista 2 x 50g|46|La Socialista P|*Castañas tostadas SIN sal 100grs|75.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Maní pelado frito y salado Polenteados 500g|89|Polenteados P|*Avena laminada instantánea Polenteados 500g|49.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Maní pelado sin sal Polenteados 500g|89|Polenteados P|*Pan de molde Gory Lacteado 550g|59.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Garbanzo Polenteados 1kg|79|Polenteados P|*Pan de molde Integral Doña Erika 550g|59.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Lentejas Polenteados 1kg|96|Polenteados P|*Galleta Malteada La Socialista 350g|69.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Porotos negros Polenteados 1kg|86|Polenteados P|*Galleta Malteada c/semillas (sésamo, chia, lino) La Socialista 380gr|88.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Porotos de manteca Polenteados 1kg |105|Polenteados P|*Galleta Cara Sucia La Socialista 350g|77.0||||||||||||0|0
ALIMENTOS NO PERECEDEROS|*Proteína de SOJA texturizada 1kg |125| P|*Grisines La Socialista 350g|81.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Tallarines frescos de yema Pastas Colon 1kg|155|Pastas Colón P|*Maní pelado frito y salado Polenteados 500g|93.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Tallarines frescos de espinaca Pastas Colon 1kg|165|Pastas Colón P|*Maní pelado sin sal Polenteados 500g|93.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Tallarines frescos de morrón Pastas Colon 1kg|165|Pastas Colón P|*Garbanzo Polenteados 1kg|95.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Salsa pomarola 300gr ex trabajadores de La Spezia|90| P|* Maiz para pop 500grs|54.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Fetuccine integral de zanahoria, apto veganos 1kg|190| P|*Lentejas Polenteados 1kg|96.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Romanitos rellenos jamón y queso ex trabajadores de La Spezia 1kg|490| P|*Porotos negros Polenteados 1kg|102.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Romanitos vegetarianos ex trabajadores de La Spezia 1kg|490| P|*Porotos de manteca Polenteados 1kg|115.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Sorrentinos jamón y queso 1Kg ex trabajadores de La Spezia|450| P|*Proteína de SOJA texturizada 1kg|135||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Sorrentinos Ricota y Nuez 1kg ex Trabajadores de La Spezia|450| CONDIMENTOS, PERECEDEROS Y BEBIDAS||||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Raviolón vegetariano 1Kg ex trabajadores de La Spezia|450| P|*Tallarines frescos de yema Pastas Colon 1kg|175||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Raviolón Caprese 1kg ex Trabajadores de La Spezia|450| P|*Tallarines frescos de espinaca Pastas Colon 1kg|185||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Prepizza de 28cm ex trabajadores de La Spezia|85| P|*Tallarines frescos de morrón Pastas Colon 1kg|190.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Milanesas de carne empanadas 1kg|365| P|*Salsa pomarola 300gr ex trabajadores de La Spezia|90||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Milanesas de pollo empanadas 1kg|365| P|*Fetuccine integral de zanahoria, apto veganos 1kg|190.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Milanesas de seitan x6 |300| P|*Romanitos rellenos jamón y queso ex trabajadores de La Spezia 1kg|510||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Hamburguesas parrilleras de soja no transgénica, sal, harina de avena y adobo sin picante x6|300| P|*Romanitos vegetarianos ex trabajadores de La Spezia 1kg|510.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Jamón vegano (gluten de trigo, salsa de tomate, sabor ahumado, sal) horma 250 g|200| P|*Sorrentinos jamón y queso 1Kg ex trabajadores de La Spezia|470.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Hummus 200cc |140| P|*Sorrentinos Ricota y Nuez 1kg ex Trabajadores de La Spezia|470.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Pate de zanahoria 200cc |140| P|*Raviolón vegetariano 1Kg ex trabajadores de La Spezia|450.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Pan rallado 1kg|55| P|*Raviolón Caprese 1kg ex Trabajadores de La Spezia|450.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Pan rallado saborizado 1Kg|75| P|*Prepizza de 28cm ex trabajadores de La Spezia|90.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Pimienta blanca 30g|20| P|*Milanesas de carne empanadas 1kg|375.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Orégano 25g|20| P|*Milanesas de pollo empanadas 1kg|365.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Pimentón 30g|20| P|*Empanada de pollo x 6|250.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Adobo 30g|20| P|*Empanada de carne x 6|250.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Ajo y Perejil 30g|20| P|*Milanesas de seitan x6|350.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*PACK "A" Curry, nuez moscada, ajo polvo, condimento verde, comino|80| P|*Hamburguesas parrilleras de soja no transgénica, sal, harina de avena y adobo sin picante x6 - (S-A)|320.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*PACK "B" Pimienta Negra polvo / sal de ajo, aji molido, canela polvo y chimichurry|80| P|*Jamón vegano (gluten de trigo, salsa de tomate, sabor ahumado, sal) horma 250 g - (S-A)|215.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*PACK "C" Cebolla en escamas, tomillo, clavo de olor, pimienta blanca en grano, ajo en escamas|80| P|*Hummus 200cc|140.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Pimentón 250grs |75| P|*Pate de zanahoria 200cc|140.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Orégano 250g|85| P|*Pan rallado 1kg|65.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Nuez moscada entera 2 unidades |21| P|*Pan rallado saborizado 1Kg|85.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Canela en rama 10g|21| P|*Pimienta blanca 30g|20.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Cúrcuma 20g |21| P|*Orégano 25g|20.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Pack "Sabores exoticos" - Paprika, fenogreco y cardamomo|57| P|*Pimentón 30g|20.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|'''''''*Pack "Pa''''''''l mate" - Manzanilla, cedrón y carqueja'''''''|105| P|*Adobo 30g|20.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|Pack "Medicinas de monte" - Tilo, malva y marcela|105| P|*Ajo y Perejil 30g|20.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Pack "Té helado light" - Té rojo, stevia y lemon grass|105| P|*PACK "A" Curry, nuez moscada, ajo polvo, condimento verde, comino|100.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|Vino Santero Marselán 1 lt.|198| P|*PACK "B" Pimienta Negra polvo / sal de ajo, aji molido, canela polvo y chimichurry|100.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|Vino Tannat-Cabernet Paso del Roble 1 lt.|90| P|*PACK "C" Cebolla en escamas, tomillo, clavo de olor, pimienta blanca en grano, ajo en escamas|100.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|Vino Rosado dulce Paso del Roble 1 lt.|90| P|*Pimentón 250grs|95.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|Frizzante de Maracuyá|205| P|*Orégano 250g|105.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|Frizzante de Frutos del bosque|205| P|*Nuez moscada entera 2 unidades|23.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Cerveza artesanal Sudaka Blonde 500cc|100| P|*Canela en rama 10g|23.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Cerveza artesanal Sudaka Scottish 500cc|100| P|*Cúrcuma 20g|23.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Cerveza artesanal Punto Rojo Red Ipa 500cc|100| P|*Pack "Sabores exoticos" - Paprika, Espinaca en polvo, Mostaza en polvo.|62.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Cerveza artesanal Punto Rojo Negra 500cc|100| P|*Pack "Mate Uruguayo" - Marcela, Cedrón, Boldo.|115.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Cerveza artesanal APA Guillotina 1L|180| P|*Pack "Delicias del campo" Té rojo, Manzanilla, Pétalos de rosa.|115.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|Fernet artesanal 780 ml|370| P|*Pack "Té de las 5hs-Light" - Té verde, Lemon Grass, Hojas de Stevia.|115.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|Jugo en polvo "Juguito" sabores surtidos|8.06| P|Vino Santero Marselán 1 lt.|220.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|Jugo Big C 200ml sabores surtidos|13.14| P|Vino Tannat-Cabernet Paso del Roble 1 lt.|98.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Refresco U Naranja 2lt|82| P|Vino Rosado dulce Paso del Roble 1 lt.|98.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Refresco U Mandarina 2lt|82| P|Frizzante de Maracuyá|230.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Refresco U Pomelo 2lt|82| P|Frizzante de Frutos del bosque|230.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Refresco U Limonada 2lt|82| P|*Cerveza artesanal Punto Rojo Red Ipa 500cc|100.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Agua 6 lts|84| P|*Cerveza artesanal APA Guillotina 1L|190.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Queso Muzzarella 1/2 kg Unidad Cooperaria|130| P|Fernet artesanal 780 ml|380.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Queso Magro s/sal 1/2 kg Unidad Cooperaria|147.5| P|Jugo en polvo "Juguito" sabores surtidos|8.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Queso Magro c/sal 1/2 kg Uniddad Cooperaria|147.5| P|Jugo Big C 200ml sabores surtidos|15.5||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Queso Danbo 1/2 kg Unidad Cooperaria|137.5| P|*Refresco U Naranja 2lt|84.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Queso Sbrinz 1/2 kg Unidad Cooperaria|170| P|*Refresco U Mandarina 2lt|84.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Queso Colonia 1/2 Kg Unidad Cooperaria|160| P|*Refresco U Pomelo 2lt|84.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Queso parrillero 350g Unidad Cooperaria|165| P|*Refresco U Limonada 2lt|84.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Queso de mandioca en horma 400 gr|200| P|*Agua 6 lts|85.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Queso saborizado con ciboulette 600grs (envasado al vacío)|230| P|*Queso Muzzarella 1/2 kg Unidad Cooperaria|150.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Queso saborizado con albahaca 600grs (envasado al vacío)|230| P|*Queso Magro s/sal 1/2 kg Unidad Cooperaria|167.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Queso saborizado con orégano 500grs (envasado al vacío)|250| P|*Queso Magro c/sal 1/2 kg Uniddad Cooperaria|167.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Queso semiduro 500grs (envasado al vacío) Productores Ismael Cortinas|195| P|*Queso Danbo 1/2 kg Unidad Cooperaria|163.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Queso cuartirolo horma 1kg envasado al vacío|270| P|*Queso Sbrinz 1/2 kg Unidad Cooperaria|250.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Queso rallado 100grs|63| P|*Queso Colonia 1/2 Kg Unidad Cooperaria|172.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Queso rallado 200grs|120| P|*Queso parrillero 350g Unidad Cooperaria|175.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Dulce de Leche 1 Kg Unidad Cooperaria|165| P|*Queso de mandioca en horma 400 gr|230.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Dulce de leche de coco 360 gr|300| P|*Queso saborizado con ciboulette 600grs (envasado al vacío)|254.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Morrones en vinagre 330 gr|140| P|*Queso saborizado con albahaca 600grs (envasado al vacío)|254.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Berenjenas en vinagre 330 gr|140| P|*Queso saborizado con orégano 500grs (envasado al vacío)|276.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Mermelada de morrones 250 gr|140| P|*Queso semiduro 500grs (envasado al vacío) Productores Ismael Cortinas|215.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Mermelada de frutilla, 450 grs. |123| P|*Queso cuartirolo horma 1kg envasado al vacío|297.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Mermelada de durazno, 450 grs.|110| P|*Queso rallado 200grs|132.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Mermelada de ciruela, 450 grs. |115| P|*Dulce de Leche 1 Kg Unidad Cooperaria|250.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Mermelada de higo, 450 grs. |110| P|*Dulce de leche de coco 360 gr|330.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Mermelada de zapallo, 450 grs.|110| P|*Morrones en vinagre 330 gr|180.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Mermelada de naranja, 450 grs. |115| P|*Berenjenas en vinagre 330 gr|180.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Mermelada de arándanos, 450 grs. |145| P|*Mermelada de morrones 250 gr|180.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Dulce de membrillo, 900grs |105| P|*Mermelada de frutilla, 450 grs.|134.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Dulce de batata con chocolate 1kg|115| P|*Mermelada de durazno, 450 grs.|120.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Dulce de zapallo 1kg|115| P|*Mermelada de ciruela, 450 grs.|134.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|'''''''*Dulce de higo 1kg'''|115| P|*Mermelada de higo, 450 grs.|120.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|Miel artesanal 1 kg|210| P|*Mermelada de zapallo, 450 grs.|115.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Canasta de frutas y verduras "34 Sur Productos Orgánicos"|630| P|*Mermelada de naranja, 450 grs.|128.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Romero 25grs, El Ombú PTIc|45| P|*Mermelada de arándanos, 450 grs.|155.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Apio 25grs, El Ombú PTIc|45| P|*Dulce de membrillo, 900grs|114.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Menta 25grs, El Ombú PTIc|45| P|*Dulce de batata con chocolate 1kg|128.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Melissa 25grs, El Ombú Ptic|45| P|*Dulce de zapallo 1kg|119.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Albahaca limón, El Ombú Ptic|45| P|*Dulce de higo 1kg|128.0||||||||||||0|0
CONDIMENTOS, PERECEDEROS Y BEBIDAS|*Llanten 25grs, El Ombú PTIc|45| P|*Miel artesanal 1 kg|230.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Preservativos Prudence clasico x3|59.09| P|*Canasta de frutas y verduras "34 Sur Productos Orgánicos"|630.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Tabaco Cerrito|99| ARTÍCULOS PERSONALES Y DE LIMPIEZA||||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Hojilla JOB x30 |22| P|Preservativos Prime ultrafinos x3|85.7||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Shampoo Ainé Cuidado Total 500cc|230| P|Tabaco Cerrito|107.7||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Shampoo Ainé Brillo Extremo 500cc|230| P|Hojilla JOB x30|24.34||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Acondicionador Ainé Cuidado Total 500cc |230| P|Shampoo Plusbelle 930ml|156.5||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Acondicionador Ainé Brillo Extremo 500cc |230| P|Acondicionador Plusbelle 930ml|156.5||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Acondicionador Ainé Dos Minutos 500cc |230| P|Jabón de tocador IO, 80gs|13.7||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Shampoo Suave 930ml |144.09| P|Cepillo dental Introdento (medio)|32.79||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Acondicionador Suave 930ml |144.09| P|Pasta Dental Introdento menta 102 grs.|40.5||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Jabón de tocador IO, 80gs |12| P|*Pack x3 jabones glicerina vegetal Natura|330.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Cepillo dental Introdento (medio)|29.74| P|*Desodorante ecológico apto veganos Natura|165.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Pasta Dental Introdento menta 102 grs. |36.72| P|*Pasta Dental Libre de Flúor Natura|170.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Loción repelente de mosquitos, 200 ml|210| P|* Repelente 125 ml Natura|215.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Pack x3 jabones glicerina vegetal Natura|330| P|*Shampoo artesanal pelo seco 250 ml Natura|230.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Desodorante ecológico apto veganos Natura|160| P|*Shampoo sólido cabello seco y normal 50 gr Natura|340.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Pasta Dental Libre de Flúor Natura|165| P|*Shampoo sólido cabello graso 50gr|355.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Shampoo artesanal pelo graso 250ml Natura|235| P|*Acondicionador sólido 50gr Natura|350.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Shampoo artesanal pelo seco 250ml Natura|230| P|*Cepillo dental de bambú 97% biodegradable (niños y adultos)|165.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Shampoo sólido cabello seco y normal 50gr |340| P|*Barrita quita manchas 75 gr Natura|100.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Protector solar factor 65, 200 ml. NUEVO!!|550| P|*Talco pédico 200gr|205.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Shampoo sólido cabello graso 50gr |355| P|*Jabón en polvo Bonsai 800g|70.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Acondicionador sólido 50gr |350| P|*Jabón en polvo Bonsai 5kg|380.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Cepillo dental de bambú 97% biodegradable (niños y adultos)|165| P|*Suavizante Bonsai 1lt|70.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Talco pédico 200gr |205| P|*Jabon liquido para lavarropas 900 cc Bonsai|80.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Bálsamo labial Herencias de aquelarre (protege y repara) |180| P|*Jabon liquido para lavarropas 3 lts Bonsai|240.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Detergente ecológico grupo Flores Silvestres 500 grs|90| P|*Jabon liquido de Manos 500 cc Bonsai|50.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Jabón en polvo Bonsai 800g|70|Bonsai P|*Perfumador de telas 250 cc Bonsai|110.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Jabón en polvo Bonsai 5kg|350|Bonsai P|*Limpiador desengarsante para cocinas y baños aroma cítrico 1 litro (no es para cañerías)|100.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Suavizante Bonsai 1lt|70|Bonsai P|*Entrebichitos - MEN 2lts. (graseras, pozos, cañerías, plantas)|180.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Jabon liquido para lavarropas 900 cc Bonsai|80|Bonsai P|*Entrebichitos - MEN Limpieza 1lt (suelos, mesadas, paredes, combate hongos, bacterias y virus)|100.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Jabon liquido para lavarropas 3 lts Bonsai|220|Bonsai P|*Entrebichitos - Pastilla grasera|80.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Jabon liquido de Manos 500 cc Bonsai|50|Bonsai P|*Hipoclorito El Resistente 1800cc|72.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Perfumador de telas 250 cc Bonsai|100|Bonsai P|*Limpiador perfumado El Resistente (perfumol) 1800cc|72.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Limpiador desengarsante para cocinas y baños aroma cítrico 1 litro (no es para cañerías)|90|Bonsai P|*Detergente El Resistente 500ml|48.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Entrebichitos - MEN 2lts. (graseras, pozos, cañerías, plantas)|180|Entrebichitos P|*KIT El Resistente (Hip./Perf./Det.)|176.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Entrebichitos - MEN Limpieza 1lt (suelos, mesadas, paredes, combate hongos, bacterias y virus)|100|Entrebichitos P|Jabon en barra Primor x1|29.4||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Entrebichitos - Pastilla grasera|80|Entrebichitos P|Rejilla de cocina 40 x 27.5 Tacuabé (ex Paylana) cm|29.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Hipoclorito El Resistente 1800cc|66|El Resistente P|Trapo de piso 53 x 53 Tacuabé (ex Paylana)|37.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Limpiador perfumado El Resistente (perfumol) 1800cc|66|El Resistente P|Esponja de cocina|26.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Detergente El Resistente 500ml|43|El Resistente P|Esponja de acero inoxidable|29.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*KIT El Resistente (Hip./Perf./Det.)|161|El Resistente P|Repasador de algodón 43 x 65 cm|53.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Jabon bulldog packx2|66.24| P|Franela 34 x 34|37.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Rejilla de cocina 40 x 27.5 Tacuabé (ex Paylana) cm|22| P|Escoba|116.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Trapo de piso 55 x 55 Tacuabé (ex Paylana)|35| P|Pala con mango|99.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Esponja de cocina|22| P|Balde 9 Lts|109.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Esponja de acero inoxidable|23| P|Bolsa de residuos 50x55 30 unidades|63.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Repasador de algodón 43 x 65 cm|39| P|Lampazo|119.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Franela 34 x 34|30| P|Guantes de latex talle L|88.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Escoba|97| P|Rollitos de alumnio x6|30.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Pala con mango|89| P|*Vela de apagón|8.4||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Balde 9 Lts |99| P|*Vela de citronela 1 mecha|122.2||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Bolsa de residuos 50x55 30 unidades |49| P|Pañales Babysec ULTRA XXG 24 unidades|327.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Lampazo |99| P|Pañales Babysec ULTRA XG 24 unidades|327.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Guantes de latex talle M|80.1| P|Pañales Babysec ULTRA G 30 unidades|327.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Rollitos de alumnio x6 |27.3| P|Pañales Babysec ULTRA M 36 unidades|327.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Vela de apagón|8.37| P|Pañales Babysec ULTRA P 36 unidades|327.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|*Vela de citronela 1 mecha|122.2| P|Toallita de bebé BabySec ultra 50un|72.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Pastillas para mosquitos Sapolio 12 unidades |52.61| P|Papel Higienico: Higienol Texturado x4|42.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Pañales Babysec ULTRA XXG 24 unidades|312| P|Papel de Cocina Sussex extra x 2 -120 paños-|62.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Pañales Babysec ULTRA XG 24 unidades|312| TEXTIL||||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Pañales Babysec ULTRA G 30 unidades|312| P|*Calza licra de algodon talle S|900.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Pañales Babysec ULTRA M 36 unidades|312| P|*Calza licra de algodon talle M|900||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Pañales Babysec ULTRA P 36 unidades|312| P|*Calza licra de algodon talle L|900||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Toallita de bebé BabySec ultra 50un|67| P|*Calza licra de algodon talle XL|900.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Papel Higienico: Higienol Texturado x4|47| P|*Conjunto primera muda 100% algodón color blanco liso (pack de pelele, bata y gorrito en bolsa de lienzo)|600.0||||||||||||0|0
ARTÍCULOS PERSONALES Y DE LIMPIEZA|Papel de Cocina Sussex extra x 2 -120 paños-|57| P|*Conjunto primera muda 100% algodón rayado azul, naranja, verde, amarillo, blanco (pack de pelele, bata y gorrito en bolsa de lienzo)|600.0||||||||||||0|0
TEXTIL|*Calza licra de algodon talle S|750| P|*Conjunto primera muda 100% algodón color rayado rojo, verde pálido, rosa pálido, blanco (pack de pelele, bata y gorrito en bolsa de lienzo)|600.0||||||||||||0|0
TEXTIL|*Calza licra de algodon talle M|750| P|*Calza licra de algodon talle 0|350||||||||||||0|0
TEXTIL|*Calza licra de algodon talle L|750| P|*Calza licra de algodon talle 2|350.0||||||||||||0|0
TEXTIL|*Calza licra de algodon talle XL|750| P|*Calza licra de algodon talle 4|350.0||||||||||||0|0
TEXTIL|*Calza licra de algodon talle 0|300| P|*Calza licra de algodon talle 6|450.0||||||||||||0|0
TEXTIL|*Calza licra de algodon talle 2 |300| P|*Calza licra de algodon talle 8|450.0||||||||||||0|0
TEXTIL|*Calza licra de algodon talle 4|300| P|*Calza licra de algodon talle 10|450.0||||||||||||0|0
TEXTIL|*Calza licra de algodon talle 6 |300| P|*Calza licra de algodon talle 12|550.0||||||||||||0|0
TEXTIL|*Calza licra de algodon talle 8 |300| P|*Calza licra de algodon talle 14|550.0||||||||||||0|0
TEXTIL|*Calza licra de algodon talle 10|300| P|*Calza licra de algodon talle 16|550.0||||||||||||0|0
TEXTIL|*Calza licra de algodon talle 12|300| P|*Campera deportiva - Talle 0|350.0||||||||||||0|0
TEXTIL|*Calza licra de algodon talle 14 |350| P|*Campera deportiva - Talle 2|350.0||||||||||||0|0
TEXTIL|*Calza licra de algodon talle 16 |350| P|*Campera deportiva - Talle 4|350.0||||||||||||0|0
TEXTIL|*Campera deportiva - Talle 0|350| P|*Campera deportiva - Talle 6|400.0||||||||||||0|0
TEXTIL|*Campera deportiva - Talle 2|350| P|*Campera deportiva - Talle 8|400.0||||||||||||0|0
TEXTIL|*Campera deportiva - Talle 4|350| P|*Campera deportiva - Talle 10|400.0||||||||||||0|0
TEXTIL|*Campera deportiva - Talle 6|400| P|*Campera deportiva - Talle 12|450.0||||||||||||0|0
TEXTIL|*Campera deportiva - Talle 8|400| P|*Campera deportiva - Talle 14|450.0||||||||||||0|0
TEXTIL|*Campera deportiva - Talle 10|400| P|*Campera deportiva - Talle 16|450.0||||||||||||0|0
TEXTIL|*Campera deportiva - Talle 12|450| P|*Pantalón deportivo - Talle 0|250.0||||||||||||0|0
TEXTIL|*Campera deportiva - Talle 14|450| P|*Pantalón deportivo - Talle 2|250.0||||||||||||0|0
TEXTIL|*Campera deportiva - Talle 16|450| P|*Pantalón deportivo - Talle 4|250.0||||||||||||0|0
TEXTIL|*Pantalón deportivo - Talle 0|250| P|*Pantalón deportivo - Talle 6|300.0||||||||||||0|0
TEXTIL|*Pantalón deportivo - Talle 2|250| P|*Pantalón deportivo - Talle 8|300.0||||||||||||0|0
TEXTIL|*Pantalón deportivo - Talle 4|250| P|*Pantalón deportivo - Talle 10|300.0||||||||||||0|0
TEXTIL|*Pantalón deportivo - Talle 6|300| P|*Pantalón deportivo - Talle 12|350.0||||||||||||0|0
TEXTIL|*Pantalón deportivo - Talle 8|300| P|*Pantalón deportivo - Talle 14|350.0||||||||||||0|0
TEXTIL|*Pantalón deportivo - Talle 10|300| P|*Pantalón deportivo - Talle 16|350.0||||||||||||0|0
TEXTIL|*Pantalón deportivo - Talle 12|350| P|*Bikers licra de algodón - Talle S. |650.0||||||||||||0|0
TEXTIL|*Pantalón deportivo - Talle 14|350| P|*Bikers licra de algodón - Talle M.|650.0||||||||||||0|0
TEXTIL|*Pantalón deportivo - Talle 16|350| P|*Bikers licra de algodón - Talle L.|650.0||||||||||||0|0
TEXTIL|*Babucha deportiva en algodón - Talle 4|500| P|*Bikers licra de algodón - Talle XL. |650.0||||||||||||0|0
TEXTIL|*Babucha deportiva en algodón - Talle 6|500| P|* Bolsa estampada con logo MPS. Acción Solidaria. NUEVO!|155.0||||||||||||0|0
TEXTIL|*Babucha deportiva en algodón - Talle 8 |500| P|*Túnica niñe con cinto en espalda y tajo detrás- talles 6 a 16|650.0||||||||||||0|0
TEXTIL|*Babucha deportiva en algodón - Talle 10 |600| P|*Túnica niñe con martingala, festón y pinzas talles 6 a 16|650.0||||||||||||0|0
TEXTIL|*Babucha deportiva en algodón - Talle 12 |600| P|*Pintor verde - talles 2 a 8|350.0||||||||||||0|0
TEXTIL|*Babucha deportiva en algodón - Talle 14 |600| P|*Pintor azul - talles 2 a 8|350.0||||||||||||0|0
TEXTIL|*Babucha deportiva en algodón - Talle 16 |600| P|*Pintor rojo - talles 2 a 8|350.0||||||||||||0|0
TEXTIL|*Babucha deportiva en algodón - Talle 18 |600| P|*Pintor amarillo - talles 2 a 8|350.0||||||||||||0|0
TEXTIL|*Pantalón deportivo liso de algodón - Talle S|850| P|*Túnicas adulto - talles 1 a 5|1200.0||||||||||||0|0
TEXTIL|*Pantalón deportivo liso de algodón - Talle M|850| P|*Moña escolar satinada|70.0||||||||||||0|0
TEXTIL|*Pantalón deportivo liso de algodón - Talle L|850| P|*Juego de sábanas de algodón 1 plaza|1100.0||||||||||||0|0
TEXTIL|*Pantalón deportivo liso de algodón - Talle XL |850| P|*Juego de sábanas de algodón 2 plazas (para sommier)|1300.0||||||||||||0|0
TEXTIL|*Canguro deportivo liso con capucha de algodón - TalleS |1000| P|*Sábana sola sin elástico, 2 plazas (para sommier)|750.0||||||||||||0|0
TEXTIL|*Canguro deportivo liso con capucha de algodón - Talle M |1000| P|*Sábana sola con elástico, 2 plazas (para sommier)|750.0||||||||||||0|0
TEXTIL|*Canguro deportivo liso con capucha de algodón - Talle L |1000| P|*Juego de toallón y toalla de algodón|700.0||||||||||||0|0
TEXTIL|*Canguro deportivo liso con capucha de algodón - Talle XL|1000| P|*Toallón|550.0||||||||||||0|0
TEXTIL|*Túnica niñe con cinto en espalda y tajo detrás- talles 6 a 16|480| P|*Toalla de mano|300.0||||||||||||0|0
TEXTIL|*Túnica niñe con martingala, festón y pinzas talles 6 a 16|480| P|*Turbante toalla|400.0||||||||||||0|0
TEXTIL|*Pintor verde - talles 2 a 8|300| P|*Delantal corto Colectiva en la Olla|450.0||||||||||||0|0
TEXTIL|*Pintor azul - talles 2 a 8|300| P|*Delantal largo Colectiva en la Olla|600.0||||||||||||0|0
TEXTIL|*Pintor rojo - talles 2 a 8|300| ARTÍCULOS DE MADRES Y FAMILIARES||||||||||||||0|0
TEXTIL|*Pintor amarillo - talles 2 a 8|300| P|Pañuelo Madres y Familiares de Detenidos Desaparecidos|50.0||||||||||||0|0
TEXTIL|*Túnicas adulto - talles 1 a 5|1100| P|Balconera Madres y Familiares de Detenidos Desaparecidos|100||||||||||||0|0
TEXTIL|*Moña escolar satinada|50| P|Pack 5: 1 pin redondo + 1 libro La Sal de la Tierra|100.0||||||||||||0|0
TEXTIL|*Juego de sábanas de algodón 1 plaza|1000| P|Pack 6: 1 gorro blanco + 1 pin redondo + pegotines y marcalibros|200.0||||||||||||0|0
TEXTIL|*Juego de sábanas de algodón 2 plazas (para sommier) |1200| P|pacl 7: 1 gorro blanco + 1 libro la sal de la tierra + pegotines y marcalibros|200||||||||||||0|0
TEXTIL|*Sábana sola sin elástico, 2 plazas (para sommier) |700| P|pack 8: 1 gorro blanco + 1 lapicera + pegotines y marcalibros|200.0||||||||||||0|0
TEXTIL|*Sábana sola con elástico, 2 plazas (para sommier) |700| LIBROS||||||||||||||0|0
TEXTIL|*Juego de toallón y toalla de algodón |650| P|Libro "Raspando la Olla" |250.0||||||||||||0|0
TEXTIL|*Toallón|500| TRANSPORTE, BONOS Y FINANCIAMIENTO SORORO||||||||||||||0|0
TEXTIL|*Toalla de mano|250| T|Por cada $ 500 de consumo, abonar $ 15 para transporte y gastos operativos, ej:$520 son $30|15.0|0|0|0|0|0|0|0|0|0|0|0|0|0
TEXTIL|*Turbante toalla|350| B|Campaña solidaria MPS - apoyo a ollas y merenderos|20.0||||||||||||0|0
TEXTIL|*Tapaboca de tela|50| F|Financiamiento sororo para copa menstrual|20.0||||||||||||0|0
ARTÍCULOS DE MADRES Y FAMILIARES|Pañuelo Madres y Familiares de Detenidos Desaparecidos|50|Madres y familiares PRODUCTOS DE GESTIÓN MENSTRUAL||||||||||||||0|0
ARTÍCULOS DE MADRES Y FAMILIARES|Balconera Madres y Familiares de Detenidos Desaparecidos|100|Madres y familiares ¿Cuántas copas quieren y pueden comprar en el grupo?||||||||||||||0|0
ARTÍCULOS DE MADRES Y FAMILIARES|Pack 2 - 1 Pin redondo + Lapicera + Pegotines y Marcalibros|100|Madres y familiares P|Copa menstrual de silicona, ecológica|750||||||||||||0|0
PRODUCTOS DEL MPS|Pack de 5 pegotines del MPS (2 logos y 3 consignas, todo a color).|40|Madres y familiares ¿Cuántas copas quieren adquirir a través del financiamiento sororo?||0||||||||||||0|0
BONOS Y FINANCIAMIENTO SORORO|Campaña solidaria MPS - apoyo a ollas y merenderos|20|MPS P|Copa menstrual de silicona, ecológica|0.0||||||||||||0|0
BONOS Y FINANCIAMIENTO SORORO|Financiamiento sororo para copa menstrual|20| P|*Toallita de tela Nocturna "Chúlin"|168||||||||||||0|0
BONOS Y FINANCIAMIENTO SORORO|Galpón de corrales|20| P|*Toallita de tela para Colaless "Chúlin"|133.0||||||||||||0|0
PRODUCTOS DE GESTIÓN MENSTRUAL|Copa menstrual de silicona, ecológica |750| P|*Toallitas de tela para Bombacha "Chúlin"|147.0||||||||||||0|0
PRODUCTOS DE GESTIÓN MENSTRUAL|Copa menstrual de silicona, ecológica (financiamiento sororo)|0| P|*Protector Diario de tela "Chúlin"|112.0||||||||||||0|0
PRODUCTOS DE GESTIÓN MENSTRUAL|Vaso esterilizador para copa menstrual|290| P|*Pack 1: 2 protectores diarios + 2 toallitas para bombacha "Chúlin"|462||||||||||||0|0
PRODUCTOS DE GESTIÓN MENSTRUAL|*Toallita de tela Nocturna "Chúlin"|170|Chúlin P|*Pack 2: 3 protectores diarios "Chúlin"|301.0||||||||||||0|0
PRODUCTOS DE GESTIÓN MENSTRUAL|*Toallita de tela para Colaless "Chúlin"|170|Chúlin P|Ladysoft Clasicas 8un|21.0||||||||||||0|0
PRODUCTOS DE GESTIÓN MENSTRUAL|*Toallitas de tela para Bombacha "Chúlin"|200|Chúlin |TOTAL||0|0|0|0|0|0|0|0|0|0|0||0
PRODUCTOS DE GESTIÓN MENSTRUAL|*Protector Diario de tela "Chúlin"|160|Chúlin |||||||||||||||
PRODUCTOS DE GESTIÓN MENSTRUAL|*Pack 1: 2 protectores diarios + 2 toallitas para bombacha "Chúlin"|610|Chúlin |||||||||||||||
PRODUCTOS DE GESTIÓN MENSTRUAL|*Pack 2: 3 protectores diarios "Chúlin" |410|Chúlin |||||||||||||||
PRODUCTOS DE GESTIÓN MENSTRUAL|Ladysoft Clasicas 8un|20.3| |||||||||||||||
PRODUCTOS DE GESTIÓN MENSTRUAL|Tampones Medianos Ladysoft 10un|84.7| |||||||||||||||
PRODUCTOS DE GESTIÓN MENSTRUAL|Tampones Grandes Ladysoft 10un|84.7| |||||||||||||||
|||||||||||||||
|||nombre|nombre|nombre||||||||||
|*Calza licra de algodon talle S||||||||||||||
|*Calza licra de algodon talle M||||||||||||||
|*Calza licra de algodon talle L||||||||||||||
|*Calza licra de algodon talle XL||||||||||||||
|*Calza licra de algodon talle 0||||||||||||||
|*Calza licra de algodon talle 2||||||||||||||
|*Calza licra de algodon talle 4||||||||||||||
|*Calza licra de algodon talle 6||||||||||||||
|*Calza licra de algodon talle 8||||||||||||||
|*Calza licra de algodon talle 10||||||||||||||
|*Calza licra de algodon talle 12||||||||||||||
|*Calza licra de algodon talle 14||||||||||||||
|*Calza licra de algodon talle 16||||||||||||||
|*Campera deportiva - Talle 0||||||||||||||
|*Campera deportiva - Talle 2||||||||||||||
|*Campera deportiva - Talle 4||||||||||||||
|*Campera deportiva - Talle 6||||||||||||||
|*Campera deportiva - Talle 8||||||||||||||
|*Campera deportiva - Talle 10||||||||||||||
|*Campera deportiva - Talle 12||||||||||||||
|*Campera deportiva - Talle 14||||||||||||||
|*Campera deportiva - Talle 16||||||||||||||
|*Pantalón deportivo - Talle 0||||||||||||||
|*Pantalón deportivo - Talle 2||||||||||||||
|*Pantalón deportivo - Talle 4||||||||||||||
|*Pantalón deportivo - Talle 6||||||||||||||
|*Pantalón deportivo - Talle 8||||||||||||||
|*Pantalón deportivo - Talle 10||||||||||||||
|*Pantalón deportivo - Talle 12||||||||||||||
|*Pantalón deportivo - Talle 14||||||||||||||
|*Pantalón deportivo - Talle 16||||||||||||||
|*Bikers licra de algodón - Talle S. ||||||||||||||
|*Bikers licra de algodón - Talle M.||||||||||||||
|*Bikers licra de algodón - Talle L.||||||||||||||
|*Bikers licra de algodón - Talle XL. ||||||||||||||
|*Túnica niñe con cinto en espalda y tajo detrás- talles 6 a 16||||||||||||||
|*Túnica niñe con martingala, festón y pinzas talles 6 a 16||||||||||||||
|*Pintor verde - talles 2 a 8||||||||||||||
|*Pintor azul - talles 2 a 8||||||||||||||
|*Pintor rojo - talles 2 a 8||||||||||||||
|*Pintor amarillo - talles 2 a 8||||||||||||||
|*Túnicas adulto - talles 1 a 5||||||||||||||

Can't render this file because it has a wrong number of fields in line 86.

View file

@ -6,7 +6,7 @@
<div class="select"> <div class="select">
<select @change="onGDCSelected" v-model="gdc" name="name"> <select @change="onGDCSelected" v-model="gdc" name="name">
<option :disabled="isDefaultDisabled==1" value=null>Seleccionar</option> <option :disabled="isDefaultDisabled==1" value=null>Seleccionar</option>
<option v-for="gdc in gdcs" v-text="gdc.nombre + (isAdmin ? '_admin' : '')" <option v-for="(gdc, index) in gdcs" :key="index" v-text="gdc.nombre + (isAdmin ? '_admin' : '')"
:name="gdc.nombre + (isAdmin ? '_admin' : '')"> :name="gdc.nombre + (isAdmin ? '_admin' : '')">
</option> </option>
</select> </select>

View file

@ -1,42 +0,0 @@
<template>
<button class="button" :class="pedido.aprobado ? 'is-danger' : 'is-success'" @click="toggleAprobacion">
<span class="icon is-small">
<i class="fas" :class="pedido.aprobado ? 'fa-times' : 'fa-check'"></i>
</span>
<span>{{ mensaje }}</span>
</button>
</template>
<script>
export default {
name: "BotonAdminSubpedidoRow",
props: {'subpedido': Object},
data() {
return {
pedido: this.subpedido
}
},
computed: {
mensaje: function () {
return this.pedido.aprobado ? "Desaprobar" : "Aprobar"
}
},
methods: {
toggleAprobacion() {
this.aprobado = !this.aprobado;
Event.$emit('aprobacion-subpedido', this.pedido.id, this.aprobado);
}
},
mounted() {
Event.$on('sync-aprobacion', (unSubpedido) => {
if (this.pedido.id === unSubpedido.id) {
this.pedido = unSubpedido
}
})
}
}
</script>
<style scoped>
</style>

View file

@ -2,9 +2,16 @@
<div v-show="visible" class="block"> <div v-show="visible" class="block">
<div class="field"> <div class="field">
<label class="label">Contraseña del barrio</label> <label class="label">Contraseña del barrio</label>
<p class="control"> <div class="field has-addons">
<input required class="input" type="password" name="password" placeholder="Contraseña del barrio"> <div class="control">
</p> <input required class="input" :type="this.passwordType" name="password" placeholder="Contraseña del barrio">
</div>
<div class="control">
<a class="button is-info" @click="togglePassword">
{{ (passwordVisible ? 'Ocultar' : 'Mostrar') + ' contraseña'}}
</a>
</div>
</div>
<p class="help">Si no la sabés, consultá a tus compañerxs.</p> <p class="help">Si no la sabés, consultá a tus compañerxs.</p>
</div> </div>
<div class="field"> <div class="field">
@ -17,10 +24,13 @@
<script> <script>
export default { export default {
name: 'Login',
data() { data() {
return { return {
visible: false, visible: false,
gdc: null gdc: null,
passwordVisible: false,
passwordType: "password",
} }
}, },
mounted() { mounted() {
@ -28,6 +38,13 @@
this.gdc = gdc; this.gdc = gdc;
this.visible = true; this.visible = true;
}); });
},
methods: {
togglePassword() {
if (this.passwordVisible) this.passwordType = "password";
else this.passwordType = "text"
this.passwordVisible = !this.passwordVisible
}
} }
} }
</script> </script>

View file

@ -2,9 +2,16 @@
<div v-show="visible" class="block"> <div v-show="visible" class="block">
<div class="field"> <div class="field">
<label class="label has-text-white">Contraseña de administración del barrio</label> <label class="label has-text-white">Contraseña de administración del barrio</label>
<p class="control"> <div class="field has-addons">
<input required class="input" type="password" name="password" placeholder="Contraseña de admin del barrio"> <div class="control">
</p> <input required class="input" :type="this.passwordType" name="password" placeholder="Contraseña de admin del barrio">
</div>
<div class="control">
<a class="button is-warning" @click="togglePassword">
{{ (passwordVisible ? 'Ocultar' : 'Mostrar') + ' contraseña'}}
</a>
</div>
</div>
<p class="help has-text-white">Si no la sabés, consultá a la comisión informática.</p> <p class="help has-text-white">Si no la sabés, consultá a la comisión informática.</p>
</div> </div>
<div class="field"> <div class="field">
@ -17,11 +24,13 @@
<script> <script>
export default { export default {
name: "LoginAdmin.vue", name: "LoginAdmin",
data() { data() {
return { return {
visible: false, visible: false,
gdc: null gdc: null,
passwordVisible: false,
passwordType: "password",
} }
}, },
mounted() { mounted() {
@ -29,7 +38,14 @@
this.gdc = gdc; this.gdc = gdc;
this.visible = true; this.visible = true;
}); });
} },
methods: {
togglePassword() {
if (this.passwordVisible) this.passwordType = "password";
else this.passwordType = "text"
this.passwordVisible = !this.passwordVisible
}
}
} }
</script> </script>

View file

@ -0,0 +1,97 @@
<template>
<div class="container is-max-widescreen is-max-desktop animate__animated" :class="animation">
<pedidos-admin-tabs-secciones></pedidos-admin-tabs-secciones>
<div class="block" id="pedidos-seccion"
:class="seccionActiva === 'pedidos-seccion' ? 'is-active' : 'is-hidden'">
<div class="block" id="pedidos-tabla-y-dropdown" v-show="hayPedidos">
<pedidos-admin-dropdown-descargar
:gdc="gdc">
</pedidos-admin-dropdown-descargar>
<pedidos-admin-tabla-pedidos
:pedidos="pedidos">
</pedidos-admin-tabla-pedidos>
</div>
<p class="has-text-centered" v-show="!hayPedidos">
Todavía no hay ningún pedido para administrar.
</p>
</div>
<div class="block" id="bonos-seccion"
:class="seccionActiva === 'bonos-seccion' ? 'is-active' : 'is-hidden'">
<pedidos-admin-tabla-bonos v-show="hayAprobados"
:pedidos="pedidos">
</pedidos-admin-tabla-bonos>
<p class="has-text-centered" v-show="!hayAprobados">
Todavía no hay pedidos aprobados.
</p>
</div>
</div>
</template>
<script>
import PedidosAdminTabsSecciones from './PedidosAdminTabsSecciones.vue';
import PedidosAdminDropdownDescargar from "./PedidosAdminDropdownDescargar.vue";
import PedidosAdminTablaBonos from './PedidosAdminTablaBonos.vue';
import PedidosAdminTablaPedidos from "./PedidosAdminTablaPedidos.vue";
export default {
name: "PedidosAdminBody",
components: {
PedidosAdminTabsSecciones,
PedidosAdminDropdownDescargar,
PedidosAdminTablaPedidos,
PedidosAdminTablaBonos,
},
data() {
return {
gdc: 0,
pedidos: [],
tabActiva: "pedidos",
seccionActiva: "pedidos-seccion"
}
},
computed: {
hayPedidos: function() {
return this.pedidos.length !== 0
},
hayAprobados: function() {
return this.pedidos.filter(p => p.aprobado).length > 0
}
},
methods: {
fetchPedidos() {
axios.get("/api/subpedidos/resources", {
params: {
grupo_de_compra: this.gdc
}})
.then(response => {
this.pedidos = response.data.data
});
},
totalAprobados() {
let suma = 0;
let aprobados = this.pedidos.filter(p => p.aprobado);
for (let i = 0; i < aprobados.length; i++) {
suma += parseFloat(aprobados[i].total.replace(/,/g, ''));
}
return suma;
},
setSeccionActiva(tabId) {
this.tabActiva = tabId;
this.seccionActiva = tabId + "-seccion";
}
},
mounted() {
Event.$on('sync-aprobacion', (_) => {
this.fetchPedidos();
});
axios.get("/admin/obtener_sesion").then(response => {
this.gdc = response.data.gdc;
this.fetchPedidos();
});
}
}
</script>
<style>
</style>

View file

@ -0,0 +1,54 @@
<template>
<div class="buttons is-right">
<div class="dropdown" :class="{'is-active': dropdownActivo}" @mouseleave="dropdownActivo = false">
<div class="dropdown-trigger">
<button class="button" aria-haspopup="true" aria-controls="dropdown-menu" :disabled="!hayAprobados" @click="dropdownActivo = !dropdownActivo">
<span class="icon is-small">
<i class="fas fa-download"></i>
</span>
<span>Descargar pedido</span>
<span class="icon is-small">
<i class="fas fa-angle-down" aria-hidden="true"></i>
</span>
</button>
</div>
<div class="dropdown-menu" id="dropdown-menu" role="menu">
<div class="dropdown-content">
<a :href="'/admin/exportar-planillas-a-pdf/' + gdc" class="dropdown-item">
Exportar planillas a pdf
</a>
<a :href="'/admin/exportar-pedido-a-csv/' + gdc" class="dropdown-item">
Exportar pedido a csv
</a>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "PedidosAdminDropdownDescargar",
props: {
gdc: {
type: Number,
required: true
},
},
data() {
return {
dropdownActivo: false
}
},
computed: {
hayAprobados: function() {
return this.$parent.hayAprobados;
}
},
}
</script>
<style>
</style>

View file

@ -0,0 +1,22 @@
<template>
<tr>
<td>{{ nombre }}</td>
<td>{{ cantidad }}</td>
<td>${{ total }}</td>
</tr>
</template>
<script>
export default {
name: "PedidosAdminFilaBono",
props: {
nombre: String,
cantidad: Number,
total: Number
}
}
</script>
<style scoped>
</style>

View file

@ -0,0 +1,35 @@
<template>
<tr>
<td>{{ pedido.nombre }}</td>
<td>{{ pedido.total }}</td>
<td>
<pedidos-admin-switch-aprobacion
:pedido="pedido">
</pedidos-admin-switch-aprobacion>
</td>
</tr>
</template>
<script>
import PedidosAdminSwitchAprobacion from './PedidosAdminSwitchAprobacion.vue';
export default {
name: "PedidosAdminFilaPedido",
components: {
PedidosAdminSwitchAprobacion
},
props: {
pedido: Object
},
mounted() {
Event.$on('sync-aprobacion', (unPedido) => {
if (this.pedido.id === unPedido.id) {
this.pedido = unPedido
}
})
}
}
</script>
<style scoped>
</style>

View file

@ -0,0 +1,47 @@
<template>
<div class="field">
<input type="checkbox" name="switchRoundedSuccess" class="switch is-rounded is-success"
:id="'switch'+this.pedido.id"
:checked="pedido.aprobado"
@change="toggleAprobacion">
<label :for="'switch'+this.pedido.id">
<span class="is-hidden-mobile">{{ mensaje }}</span>
</label>
</div>
</template>
<script>
export default {
name: "PedidosAdminSwitchAprobacion",
props: {
pedido: Object
},
data() {
return {
aprobado: this.pedido.aprobado
}
},
computed: {
mensaje: function () {
return this.aprobado ? "Aprobado" : "No aprobado"
}
},
methods: {
toggleAprobacion() {
Event.$emit('aprobacion-subpedido', this.pedido.id, !this.aprobado);
this.aprobado = !this.aprobado
}
},
mounted() {
Event.$on('sync-aprobacion', (unPedido) => {
if (this.pedido.id === unPedido.id) {
this.pedido = unPedido
}
})
}
}
</script>
<style scoped>
</style>

View file

@ -0,0 +1,126 @@
<template>
<div class="block">
<div class="block" v-show="!hayBonos">
<p class="has-text-centered">
Todavía no hay bonos pedidos.
</p>
</div>
<div class="block">
<table class="table is-fullwidth is-striped is-bordered">
<thead>
<tr>
<th><abbr title="Bono">Bono</abbr></th>
<th class="is-1"><abbr title="Cantidad">Cantidad</abbr></th>
<th><abbr title="Total a Pagar">Total $</abbr></th>
</tr>
</thead>
<tfoot>
<tr v-show="hayBonos">
<th></th>
<th>Total bonos</th>
<th>$ {{ totalBonos }}</th>
</tr>
<tr>
<td> Bonos de Transporte </td>
<td> {{ bonosDeTransporteAprobados }} </td>
<td> $ {{ bonosDeTransporteAprobados * 15 }} </td>
</tr>
</tfoot>
<tbody v-show="hayBonos">
<pedidos-admin-fila-bono v-for="(bono, i) in bonosCantidadesTotales" :key="i"
:nombre="bono.nombre"
:cantidad="bono.cantidad"
:total="bono.total">
</pedidos-admin-fila-bono>
</tbody>
</table>
</div>
</div>
</template>
<script>
import PedidosAdminFilaBonoVue from './PedidosAdminFilaBono.vue'
export default {
name: "PedidosAdminTablaBonos",
components: {
PedidosAdminFilaBonoVue
},
props: {
pedidos: {
type: Array,
required: true
}
},
computed: {
hayPedidos: function() {
return this.pedidos.length !== 0
},
hayAprobados: function() {
return this.pedidosAprobados.length > 0
},
pedidosAprobados: function() {
return this.pedidos.filter(p => p.aprobado);
},
bonosDeTransporteAprobados: function() {
let bonosTransportePorPedido = this.pedidosAprobados.map(p => p.bonos_de_transporte);
let cant = 0;
bonosTransportePorPedido.forEach(bt => cant += bt);
return cant
},
bonosCantidadesTotales: function() {
let nombres = [];
let cantidades = [];
let precios = [];
let bonosAprobadosPorPedido = this.bonosPorPedido(this.pedidosAprobados);
bonosAprobadosPorPedido.forEach(bs => {
bs.forEach(b => {
if (!nombres.includes(b.nombre)) {
nombres.push(b.nombre);
cantidades.push(b.pivot.cantidad);
precios.push(b.precio);
} else {
for (let i = 0; i < nombres.length; i++) {
if (b.nombre === nombres[i]) {
cantidades[i] += b.pivot.cantidad;
}
}
}
});
});
let bonosAprobados = [];
for (let i = 0; i < nombres.length; i++) {
let bono = {
nombre: nombres[i],
cantidad: cantidades[i],
total: cantidades[i] * precios[i]
};
bonosAprobados.push(bono);
}
return bonosAprobados;
},
totalBonos: function() {
let total = 0;
let bonos = this.bonosCantidadesTotales;
bonos.forEach(b => {
total += b.total;
});
return total;
},
hayBonos: function() {
return this.totalBonos !== 0;
}
},
methods: {
bonosPorPedido(pedidosArray) {
return pedidosArray.map(p => p.productos.filter(pr => pr.bono))
}
},
}
</script>
<style>
</style>

View file

@ -0,0 +1,53 @@
<template>
<table class="table is-fullwidth is-striped is-bordered">
<thead>
<tr>
<th>Núcleo</th>
<th><abbr title="Total a Pagar">Total $</abbr></th>
<th class="is-1"><abbr title="Aprobacion">Aprobación</abbr></th>
</tr>
</thead>
<tfoot>
<tr>
<th></th>
<th>Total de los aprobados</th>
<th>$ {{ totalAprobados() }}</th>
</tr>
</tfoot>
<tbody>
<pedidos-admin-fila-pedido v-for="pedido in this.pedidos"
:pedido="pedido" :key="pedido.id">
</pedidos-admin-fila-pedido>
</tbody>
</table>
</template>
<script>
import PedidosAdminFilaPedidoVue from './PedidosAdminFilaPedido.vue';
export default {
name: "PedidosAdminTablaPedidos",
components: {
PedidosAdminFilaPedidoVue
},
props: {
pedidos: {
type: Array,
required: true
}
},
methods: {
totalAprobados() {
let suma = 0;
let aprobados = this.pedidos.filter(p => p.aprobado);
for (let i = 0; i < aprobados.length; i++) {
suma += parseFloat(aprobados[i].total.replace(/,/g, ''));
}
return suma;
}
}
}
</script>
<style>
</style>

View file

@ -0,0 +1,62 @@
<template>
<div class="block">
<div class="tabs is-boxed" id="tabs">
<ul class="has-bottom-line">
<li v-for="(tab, index) in tabs" class="is-size-6"
:key="index"
:id="tab.id + '-tab'"
:class="{'is-active': tab.id === tabActiva}">
<a @click="setTabActiva(tab.id)">
<span>
{{ tab.nombre }}
</span>
</a>
</li>
</ul>
</div>
</div>
</template>
<script>
export default {
name: "PedidosAdminTabsSecciones",
data() {
return {
tabActiva: "pedidos",
tabs: [
{
id: "pedidos",
nombre: "Pedidos"
},
{
id: "bonos",
nombre: "Bonos"
}
]
}
},
methods: {
setTabActiva(tabId) {
this.$parent.setSeccionActiva(tabId);
this.tabActiva = tabId
}
}
}
</script>
<style lang="scss" scoped>
@import 'bulma';
hr {
border: none;
height: 1px;
}
.has-bottom-line {
border-bottom-color: #dbdbdb !important;
border-bottom-style: solid !important;
border-bottom-width: 1px !important;
}
.tabs li.is-active a {
border-bottom-color: #e3342f;
color: #e3342f;
}
</style>

View file

@ -6,7 +6,7 @@
<div class="select"> <div class="select">
<select @change="onRegionSelected" v-model="region"> <select @change="onRegionSelected" v-model="region">
<option :disabled="isDefaultDisabled===1" value=null>Seleccionar</option> <option :disabled="isDefaultDisabled===1" value=null>Seleccionar</option>
<option v-for="region in regiones" v-text="region" :name="region"></option> <option v-for="(region, index) in regiones" :key="index" v-text="region" :name="region"></option>
</select> </select>
</div> </div>
</div> </div>

View file

@ -1,35 +0,0 @@
<template>
<tr>
<td>{{ subpedido.nombre }}</td>
<td>{{ subpedido.total }}</td>
<td><boton-admin-subpedido-row :subpedido="subpedido"></boton-admin-subpedido-row></td>
</tr>
</template>
<script>
import BotonAdminSubpedidoRow from "./BotonAdminSubpedidoRow";
export default {
name: "SubpedidoRow",
components: {BotonAdminSubpedidoRow},
props: {
subpedido: Object
},
data() {
return {
pedido: this.subpedido
}
},
mounted() {
Event.$on('sync-aprobacion', (unSubpedido) => {
console.log(unSubpedido);
if (this.pedido.id === unSubpedido.id) {
this.pedido = unSubpedido
}
})
}
}
</script>
<style scoped>
</style>

View file

@ -17,7 +17,7 @@
<div v-if="subpedidosExistentes.length" class="block"> <div v-if="subpedidosExistentes.length" class="block">
<label class="label">Si ya comenzaste a hacer tu pedido este mes, elegilo en esta lista:</label> <label class="label">Si ya comenzaste a hacer tu pedido este mes, elegilo en esta lista:</label>
<p class="help">Podés seguir escribiendo en el campo de arriba para refinar la búsqueda.</p> <p class="help">Podés seguir escribiendo en el campo de arriba para refinar la búsqueda.</p>
<div class="columns is-mobile" v-for="(subpedidoExistente, index) in subpedidosExistentes" :class="{'has-background-grey-lighter': index % 2}"> <div class="columns is-mobile" v-for="(subpedidoExistente, index) in subpedidosExistentes" :class="{'has-background-grey-lighter': index % 2}" :key="index">
<div class="column is-half-mobile is-two-thirds-desktop is-two-thirds-tablet"> <div class="column is-half-mobile is-two-thirds-desktop is-two-thirds-tablet">
<p style="padding-top: calc(.5em - 1px); margin-bottom: .5rem" v-text="subpedidoExistente.nombre"></p> <p style="padding-top: calc(.5em - 1px); margin-bottom: .5rem" v-text="subpedidoExistente.nombre"></p>
</div> </div>

View file

@ -1,76 +0,0 @@
<template>
<div class="container table-container chismosa-container is-max-widescreen is-max-desktop animate__animated" :class="animation" v-show="!init">
<table v-show="this.subpedidos.length !== 0" class="table is-fullwidth is-striped is-bordered">
<thead>
<tr>
<th>Núcleo</th>
<th><abbr title="Total a Pagar">Total $</abbr></th>
<th><abbr title="Aprobacion">Aprobación</abbr></th>
</tr>
</thead>
<tfoot>
<tr>
<th></th>
<th>Total de los aprobados</th>
<th>$ {{ totalAprobados() }}</th>
</tr>
</tfoot>
<tbody>
<subpedido-row v-for="subpedido in this.subpedidos"
:subpedido="subpedido" :key="subpedido.id">
</subpedido-row>
</tbody>
</table>
<p class="has-text-centered" v-show="this.subpedidos.length === 0">
Todavía no hay ningún pedido para administrar.
</p>
</div>
</template>
<script>
import SubpedidoRow from "./SubpedidoRow";
export default {
name: "SubpedidosGdc",
components: {SubpedidoRow},
data() {
return {
gdc: null,
subpedidos: []
}
},
beforeCreate() {
axios.get("/admin/obtener_sesion").then(response => {
this.gdc = response.data.gdc;
this.fetchSubpedidos();
});
},
methods: {
fetchSubpedidos() {
axios.get("/api/subpedidos/resources", {
params: {
grupo_de_compra: this.gdc
}
}).then(response => {
this.subpedidos = response.data.data
});
},
totalAprobados() {
let suma = 0;
let aprobados = this.subpedidos.filter(sp => sp.aprobado);
for (let i = 0; i < aprobados.length; i++) {
suma += parseFloat(aprobados[i].total.replace(/,/g, ''));
}
return suma;
}
},
mounted() {
Event.$on('sync-aprobacion', (_) => {
this.fetchSubpedidos();
})
}
}
</script>
<style scoped>
</style>

View file

@ -4,6 +4,9 @@
// Variables // Variables
@import 'variables'; @import 'variables';
@import 'bulma';
@import '~bulma-switch';
main.has-top-padding { main.has-top-padding {
padding-top: 4.5rem !important; padding-top: 4.5rem !important;
} }
@ -24,4 +27,37 @@ table.table td {
main.chisma-abierta { main.chisma-abierta {
padding-top: 25.5rem !important; padding-top: 25.5rem !important;
} }
#main {
height: 100%;
}
.container {
max-height: 100% !important;
}
/*
Author: Aseem Lalfakawma <alalfakawma.github.io>
This SCSS mixin will allow sizing of table columns in Bulma CSS Framework.
The Bulma framework does not support this yet, this small code snippet fixes this.
USAGE:
* Should be applied on TH element, it controls all the columns under it *
The class should be "is-#",
is-1 will give the first widthamount, is-2 will give the second.
Eg. The code below shows the widthAmounts as (1, 2.5, 3, 4 , 5, 6, 7)
When typing <th class="is-2">, the width will be 2.5em, as the second value in widthAmounts array is 2.5
*/
$widthAmounts: (15); // Just add the numbers here, you can use points too.
$widthUnit: "em"; // Add the unit here (rem|em|px|%)
@each $width in $widthAmounts {
$i: index($widthAmounts, $width);
@media only screen and (min-width: 768px) {
.table thead th.is-#{$i} {
width: #{$width}#{$widthUnit} !important;
}
}
}

View file

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

View file

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

View file

@ -12,7 +12,6 @@
<!-- Fonts --> <!-- Fonts -->
<script src="https://kit.fontawesome.com/9235d1c676.js" crossorigin="anonymous"></script> <script src="https://kit.fontawesome.com/9235d1c676.js" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.3/css/bulma.min.css">
<link rel="stylesheet" href="{{ asset('css/app.css') }}"> <link rel="stylesheet" href="{{ asset('css/app.css') }}">
@yield('stylesheets') @yield('stylesheets')

View file

@ -0,0 +1,52 @@
<!doctype html>
<style>
tr:nth-child(even) {
background: #CCC
}
</style>
<h3>{{$subpedido->nombre}}</h3>
<table style="width: 100%">
<tr>
<th>
Producto
</th>
<th>
Cantidad
</th>
<th>
Control 1
</th>
<th>
Control 2
</th>
<th>
Control 3
</th>
</tr>
@foreach($subpedido->productos as $producto)
@if(!$producto->bono)
<tr>
<td>
{{ $producto->nombre }}
</td>
<td style="text-align: center">
{{ $producto->pivot->cantidad }}
</td>
</tr>
@endif
@endforeach
@foreach($subpedido->productos as $producto)
@if($producto->bono)
<tr>
<td>
{{ $producto->nombre }}
</td>
<td style="text-align: center">
{{ $producto->pivot->cantidad }}
</td>
</tr>
@endif
@endforeach
</table>

View file

@ -25,8 +25,6 @@ Route::get('/productos', 'ProductoController@index')->name('productos.index');
Route::get('/admin', 'AdminController@show')->name('admin_login.show'); Route::get('/admin', 'AdminController@show')->name('admin_login.show');
Route::get('/admin/pedidos', 'AdminController@index')->name('admin_login.index');
Route::get('/admin/obtener_sesion', function() { Route::get('/admin/obtener_sesion', function() {
$sesion = [ $sesion = [
'gdc' => session("admin_gdc") 'gdc' => session("admin_gdc")
@ -35,7 +33,11 @@ Route::get('/admin/obtener_sesion', function() {
})->name('admin_obtener_sesion'); })->name('admin_obtener_sesion');
Route::middleware(['auth', 'admin'])->group( function () { Route::middleware(['auth', 'admin'])->group( function () {
Route::get('/admin/pedidos', 'AdminController@index')->name('admin_login.index');
Route::get('/admin/exportar-planillas-a-pdf/{gdc}', 'AdminController@exportarPlanillasAPdf');
Route::get('/admin/exportar-pedido-a-csv/{gdc}', 'AdminController@exportarPedidoACSV');
}); });
Route::middleware('auth')->group( function() { Route::middleware('auth')->group( function() {