Compare commits

..

No commits in common. "896baf18dd8266fb476fda642ca2a916f445f322" and "0d5551406a958e42cbcae60500a9ff92999d4d66" have entirely different histories.

49 changed files with 1260 additions and 17931 deletions

Binary file not shown.

2
.gitignore vendored
View file

@ -10,5 +10,3 @@ 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,11 +78,6 @@
<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,13 +75,6 @@
<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,8 +12,7 @@ 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,11 +61,6 @@ 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,17 +3,11 @@
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","fila"]; protected $fillable = [ "nombre","region","telefono","correo","referente_finanzas","cantidad_de_nucleos"];
protected $table = 'grupos_de_compra'; protected $table = 'grupos_de_compra';
protected $hidden = ['password']; protected $hidden = ['password'];
@ -21,91 +15,4 @@ class GrupoDeCompra extends Model
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,9 +2,7 @@
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
{ {
@ -16,14 +14,4 @@ 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,33 +6,15 @@ use Illuminate\Support\Facades\DB;
class PedidoController extends Controller class PedidoController extends Controller
{ {
public static function generarTablas() public 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_aprobados; FROM pedidos;
SET @sql = CONCAT('CREATE VIEW productos_por_grupo_de_compra AS SELECT producto_nombre, ', @barrios, ' FROM pedidos_aprobados GROUP BY producto_nombre'); SET @sql = CONCAT('CREATE VIEW productos_por_grupo_de_compra AS SELECT producto_nombre, ', @barrios, ' FROM pedidos 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,7 +56,6 @@ 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

@ -1,26 +0,0 @@
<?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->totalSinBDT(),0), 'subtotal_productos' => number_format($this->getSubtotalProductos(),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

@ -33,16 +33,4 @@ 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);
} }
public function productosSinBonos() private 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 totalSinBDT() public function getSubtotalProductos()
{ {
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->totalSinBDT() / 500); return ceil($this->getSubtotalProductos() / 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->totalSinBDT() + $this->getSubtotalBDT() + $this->getSubtotalBonos(); return $this->getSubtotalProductos() + $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,9 +90,4 @@ class Subpedido extends Model
$this->save(); $this->save();
} }
public function generarHTML() {
$view = view("pdfgen.subpedido_tabla", ["subpedido" => $this]);
return $view->render();
}
} }

View file

@ -16,9 +16,7 @@
"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": "55c5266672a741b618c9da8a6e272450", "content-hash": "8389a7c37eb75068185ce61fe4270621",
"packages": [ "packages": [
{ {
"name": "asm89/stack-cors", "name": "asm89/stack-cors",
@ -1666,142 +1666,6 @@
], ],
"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",
@ -2019,110 +1883,6 @@
}, },
"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",
@ -2194,40 +1954,6 @@
], ],
"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",
@ -2883,138 +2609,6 @@
], ],
"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

@ -1,32 +0,0 @@
<?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(ImportarProductoSeeder::class); $this->call(ProductoSeeder::class);
} }
} }

View file

@ -1,97 +0,0 @@
<?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;
}
}

View file

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

View file

@ -34,8 +34,6 @@ 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": "www", "name": "pedi2",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
@ -7,7 +7,6 @@
"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": {
@ -3007,11 +3006,6 @@
"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",
@ -15948,11 +15942,6 @@
"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,7 +26,6 @@
"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

2581
public/js/app.js vendored

File diff suppressed because one or more lines are too long

View file

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

1 barrio region referente telefono correo
2 ENTREVERO BUCEO SUR ESTE
3 MALVIN NORTE ESTE
4 PINAR ESTE
5 UNION ESTE
6 SANTO DOMINGO NORTE
7 21 DE FEBRERO NORTE
8 PIEDRAS BLANCAS NORTE
9 BELLA ITALIA NORTE
10 JARDINES NORTE
11 LA SOCIALISTA NORTE
12 VILLA GARCIA NORTE
13 LAS ACACIAS NORTE
14 MANGA NORTE
15 CERRITO OESTE
16 LEZICA OESTE
17 PEÑAROL OESTE
18 LAS PIEDRAS OESTE
19 A.C.T.E.O OESTE
20 NUEVO PARIS OESTE
21 SANTA CATALINA OESTE
22 BELVEDERE OESTE
23 BATLLE BERRES OESTE
24 CERRO PTI OESTE
25 COLECTIVO UTU LAVALLEJA OESTE
26 FOGONES OESTE
27 LAVALLEJA OESTE
28 REJUNTE OESTE
29 CAPURRO OESTE
30 PARQUE RODO SUR
31 REDUCTO SUR
32 AGUADA SUR
33 CASA DEL VECINO SUR
34 CIUDAD VIEJA SUR
35 COOP EJIDO SUR
36 COVIREUS SUR
37 LA BLANQUEADA SUR
38 NITEP SUR
39 LA CURVA SUR
40 PANADERIA VIDAL SUR
41 SUA SUR
42 TRES CRUCES SUR
43 PRUEBA VILLA ESPAÑOLA SIN REGION SUR
44 AUDA OTRA
45 SINTEP OTRA

View file

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

View file

@ -0,0 +1,42 @@
<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,16 +2,9 @@
<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>
<div class="field has-addons"> <p class="control">
<div class="control"> <input required class="input" type="password" name="password" placeholder="Contraseña del barrio">
<input required class="input" :type="this.passwordType" name="password" placeholder="Contraseña del barrio"> </p>
</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">
@ -24,13 +17,10 @@
<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() {
@ -38,13 +28,6 @@
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,16 +2,9 @@
<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>
<div class="field has-addons"> <p class="control">
<div class="control"> <input required class="input" type="password" name="password" placeholder="Contraseña de admin del barrio">
<input required class="input" :type="this.passwordType" name="password" placeholder="Contraseña de admin del barrio"> </p>
</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">
@ -24,13 +17,11 @@
<script> <script>
export default { export default {
name: "LoginAdmin", name: "LoginAdmin.vue",
data() { data() {
return { return {
visible: false, visible: false,
gdc: null, gdc: null
passwordVisible: false,
passwordType: "password",
} }
}, },
mounted() { mounted() {
@ -38,13 +29,6 @@
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

@ -1,97 +0,0 @@
<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

@ -1,54 +0,0 @@
<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

@ -1,22 +0,0 @@
<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

@ -1,35 +0,0 @@
<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

@ -1,47 +0,0 @@
<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

@ -1,126 +0,0 @@
<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

@ -1,53 +0,0 @@
<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

@ -1,62 +0,0 @@
<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, index) in regiones" :key="index" v-text="region" :name="region"></option> <option v-for="region in regiones" v-text="region" :name="region"></option>
</select> </select>
</div> </div>
</div> </div>

View file

@ -0,0 +1,35 @@
<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}" :key="index"> <div class="columns is-mobile" v-for="(subpedidoExistente, index) in subpedidosExistentes" :class="{'has-background-grey-lighter': index % 2}">
<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

@ -0,0 +1,76 @@
<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,9 +4,6 @@
// 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;
} }
@ -28,36 +25,3 @@ 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 v-bind:admin="true"></region-select> <region-select admin="true"></region-select>
<form method="post" action="login"> <form method="post" action="login">
@csrf @csrf
<barrio-select v-bind:admin="true"></barrio-select> <barrio-select admin="true"></barrio-select>
<login-admin></login-admin> <login-admin></login-admin>
</form> </form>
</div> </div>

View file

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

View file

@ -12,6 +12,7 @@
<!-- 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

@ -1,52 +0,0 @@
<!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,6 +25,8 @@ 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")
@ -33,11 +35,7 @@ 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() {