Compare commits

...

10 commits

13 changed files with 158 additions and 69 deletions

View file

@ -26,7 +26,8 @@ class CanastaHelper
$log = CanastaLog::where('descripcion', self::CANASTA_CARGADA) $log = CanastaLog::where('descripcion', self::CANASTA_CARGADA)
->orderBy('created_at', 'desc') ->orderBy('created_at', 'desc')
->first(); ->first();
$nombre = str_replace("csv/canastas/", "", $log->path); $nombre = str_replace(storage_path(), "", $log->path);
$nombre = str_replace("/csv/canastas/", "", $nombre);
$result["nombre"] = str_replace(".csv", "", $nombre); $result["nombre"] = str_replace(".csv", "", $nombre);
$result["fecha"] = $log->created_at; $result["fecha"] = $log->created_at;
return $result; return $result;
@ -39,9 +40,10 @@ class CanastaHelper
$nombre = $data->getClientOriginalName(); $nombre = $data->getClientOriginalName();
$data->move(storage_path($path), $nombre); $storage_path = storage_path($path);
$data->move($storage_path, $nombre);
self::log($path . $nombre, self::ARCHIVO_SUBIDO); self::log($storage_path . $nombre, self::ARCHIVO_SUBIDO);
return $nombre; return $nombre;
} }

View file

@ -31,7 +31,7 @@ class TransporteHelper
->pluck('path') ->pluck('path')
->first(); ->first();
$registros = CsvHelper::getRecords(storage_path($ultimaCanasta), "No se encontró la ultima canasta."); $registros = CsvHelper::getRecords($ultimaCanasta, "No se encontró la ultima canasta.");
$error = 'No hay fila de tipo T en la planilla: ' . $ultimaCanasta; $error = 'No hay fila de tipo T en la planilla: ' . $ultimaCanasta;
foreach ($registros as $key => $registro) foreach ($registros as $key => $registro)

View file

@ -4,9 +4,8 @@ namespace App\Http\Controllers\Api;
use App\GrupoDeCompra; use App\GrupoDeCompra;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Resources\GrupoDeCompraReducido; use App\Http\Resources\GrupoDeCompraComisionesResource;
use App\Http\Resources\GrupoDeCompraResource; use App\Http\Resources\GrupoDeCompraResource;
use http\Env\Request;
class GrupoDeCompraController extends Controller class GrupoDeCompraController extends Controller
{ {
@ -41,4 +40,9 @@ class GrupoDeCompraController extends Controller
$grupoDeCompra->setSaldo($valid['saldo']); $grupoDeCompra->setSaldo($valid['saldo']);
return response()->noContent(); return response()->noContent();
} }
public function saldos()
{
return GrupoDeCompraComisionesResource::collection(GrupoDeCompra::all());
}
} }

View file

@ -77,7 +77,7 @@ class ComisionesController
public function descargarCanastaEjemplo(): BinaryFileResponse public function descargarCanastaEjemplo(): BinaryFileResponse
{ {
$file = storage_path('csv/productos.csv'); $file = resource_path('csv/productos.csv');
return response()->download($file); return response()->download($file);
} }

View file

@ -3,7 +3,7 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\GrupoDeCompra; use App\GrupoDeCompra;
use App\Http\Resources\GrupoDeCompraReducido; use App\Http\Resources\GrupoDeCompraPedidoResource;
use App\Http\Resources\GrupoDeCompraResource; use App\Http\Resources\GrupoDeCompraResource;
use App\UserRole; use App\UserRole;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@ -22,7 +22,7 @@ class UserController extends Controller
$grupo_de_compra = GrupoDeCompra::find($user->grupo_de_compra_id); $grupo_de_compra = GrupoDeCompra::find($user->grupo_de_compra_id);
switch (UserRole::findOrFail($user->role_id)->nombre) { switch (UserRole::findOrFail($user->role_id)->nombre) {
case 'barrio': case 'barrio':
$result['grupo_de_compra'] = new GrupoDeCompraReducido($grupo_de_compra); $result['grupo_de_compra'] = new GrupoDeCompraPedidoResource($grupo_de_compra);
break; break;
case 'admin_barrio': case 'admin_barrio':
$result['grupo_de_compra'] = new GrupoDeCompraResource($grupo_de_compra); $result['grupo_de_compra'] = new GrupoDeCompraResource($grupo_de_compra);

View file

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

View file

@ -4,7 +4,7 @@ namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Resources\Json\JsonResource;
class GrupoDeCompraReducido extends JsonResource class GrupoDeCompraPedidoResource extends JsonResource
{ {
/** /**
* Transform the resource into an array. * Transform the resource into an array.

View file

@ -50,14 +50,10 @@ export default {
} }
}, },
methods: { methods: {
...mapActions('comisiones', ['getGruposDeCompra']),
setSeccionActiva(tabId) { setSeccionActiva(tabId) {
this.tabActiva = tabId; this.tabActiva = tabId;
this.seccionActiva = tabId + "-seccion"; this.seccionActiva = tabId + "-seccion";
}, },
}, },
async mounted() {
await this.getGruposDeCompra();
},
} }
</script> </script>

View file

@ -0,0 +1,71 @@
<script>
import { mapActions, mapGetters, mapState } from "vuex";
export default {
name: "SaldoRow",
props: {
grupo_de_compra: {
type: Object,
required: true,
}
},
data() {
return {
saldoControl: 0,
inputSaldoInteractuado: false,
};
},
mounted() {
this.saldoControl = this.grupo_de_compra.saldo;
},
watch: {
lastFetch() {
this.saldoControl = this.grupo_de_compra.saldo;
},
},
methods: {
...mapActions("comisiones", ["setSaldo"]),
async confirmarSaldo() {
await this.setSaldo({
gdc_id: this.grupo_de_compra.id,
saldo: this.saldoControl,
});
this.inputSaldoInteractuado = false;
},
},
computed: {
...mapState("comisiones", ["lastFetch"]),
...mapGetters("comisiones", ["saldo"]),
saldoModificado() {
return Number.parseFloat(this.saldo(this.grupo_de_compra.id)) !== Number.parseFloat(this.saldoControl);
}
}
}
</script>
<template>
<tr>
<th>{{ grupo_de_compra.nombre }}</th>
<td>
<input :id="`saldo-input-${grupo_de_compra.id}`"
v-model="saldoControl"
class="input is-small"
type="number"
style="text-align: center"
@input="inputSaldoInteractuado = true">
</td>
<td>
<button :disabled="!(inputSaldoInteractuado && saldoModificado)"
class="button is-small is-success ml-1"
@click="confirmarSaldo">
<span class="icon">
<i class="fas fa-check"/>
</span>
</button>
</td>
</tr>
</template>
<style scoped>
</style>

View file

@ -1,27 +1,20 @@
<script> <script>
import InputFileButton from "../../comunes/InputFileButton.vue"; import InputFileButton from "../../comunes/InputFileButton.vue";
import { mapActions, mapState } from "vuex"; import { mapActions } from "vuex";
import TablaSaldos from "./TablaSaldos.vue";
export default { export default {
name: "SaldosSeccion", name: "SaldosSeccion",
components: { InputFileButton }, components: { TablaSaldos, InputFileButton },
data() { data() {
return { return {
archivo: undefined, archivo: undefined,
saldo_modificado: {},
show_saldos_file_dialog: true, show_saldos_file_dialog: true,
}; };
}, },
methods: { methods: {
...mapActions('ui',["toast"]), ...mapActions('ui',["toast"]),
...mapActions('comisiones', ['setSaldo', 'cargarSaldos']), ...mapActions('comisiones', ['cargarSaldos']),
async confirmar_saldo(gdc_id) {
await this.setSaldo({
gdc_id: gdc_id,
saldo: this.getSaldo(gdc_id),
});
this.saldo_modificado[gdc_id] = false;
},
async archivoSubido(event) { async archivoSubido(event) {
event.component.cargando = true; event.component.cargando = true;
const formData = new FormData(); const formData = new FormData();
@ -29,23 +22,10 @@ export default {
await this.cargarSaldos(formData); await this.cargarSaldos(formData);
event.component.cargando = false; event.component.cargando = false;
}, },
saldoModificado(gdc_id) {
this.saldo_modificado[gdc_id] = true;
},
isSaldoModificado(gdc_id) {
return gdc_id in this.saldo_modificado && this.saldo_modificado[gdc_id];
},
getSaldo(gdc_id) {
const barrio = this.grupos_de_compra.find(gdc => gdc.id === gdc_id);
return barrio.saldo;
},
toggleSaldosFileDialog() { toggleSaldosFileDialog() {
this.show_saldos_file_dialog = !this.show_saldos_file_dialog; this.show_saldos_file_dialog = !this.show_saldos_file_dialog;
}, },
}, },
computed: {
...mapState('comisiones', ['grupos_de_compra']),
},
} }
</script> </script>
@ -86,39 +66,11 @@ export default {
</article> </article>
</div> </div>
<div class="column"> <div class="column">
<table class="table container"> <tabla-saldos/>
<thead>
<tr>
<th>Barrio</th>
<th>Saldo</th>
</tr>
</thead>
<tbody>
<tr v-for="gdc in grupos_de_compra">
<th>{{ gdc.nombre }}</th>
<td>
<input id="cantidad"
v-model="gdc.saldo"
class="input is-small"
type="number"
style="text-align: center"
@input="saldoModificado(gdc.id)">
</td>
<td>
<button :disabled="!isSaldoModificado(gdc.id)" class="button is-small is-success ml-1" @click="confirmar_saldo(gdc.id)">
<span class="icon">
<i class="fas fa-check"></i>
</span>
</button>
</td>
</tr>
</tbody>
</table>
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<style scoped> <style scoped>
</style> </style>

View file

@ -0,0 +1,38 @@
<script>
import { mapActions, mapState } from "vuex";
import SaldoRow from "./SaldoRow.vue";
export default {
name: "TablaSaldos",
components: { SaldoRow },
async mounted() {
await this.getGruposDeCompra();
},
methods: {
...mapActions("comisiones", ["getGruposDeCompra"]),
},
computed: {
...mapState("comisiones", ["grupos_de_compra"]),
}
}
</script>
<template>
<table class="table container">
<thead>
<tr>
<th>Barrio</th>
<th>Saldo</th>
</tr>
</thead>
<tbody>
<saldo-row v-for="(gdc,index) in grupos_de_compra"
:grupo_de_compra="gdc"
:key="index"/>
</tbody>
</table>
</template>
<style scoped>
</style>

View file

@ -1,12 +1,14 @@
import axios from "axios"; import axios from "axios";
const state = { const state = {
lastFetch: undefined,
grupos_de_compra: [], grupos_de_compra: [],
}; };
const mutations = { const mutations = {
setGruposDeCompra(state, { data }) { setGruposDeCompra(state, { data }) {
state.grupos_de_compra = data; state.grupos_de_compra = data;
state.lastFetch = new Date();
}, },
setSaldo(state, { gdc_id, saldo }) { setSaldo(state, { gdc_id, saldo }) {
const barrio = state.grupos_de_compra.find(gdc => gdc.id === gdc_id); const barrio = state.grupos_de_compra.find(gdc => gdc.id === gdc_id);
@ -17,7 +19,7 @@ const mutations = {
const actions = { const actions = {
async getGruposDeCompra({ commit }) { async getGruposDeCompra({ commit }) {
const response = await axios.get('/api/grupos-de-compra'); const response = await axios.get('/api/grupos-de-compra/saldos');
commit('setGruposDeCompra', response.data); commit('setGruposDeCompra', response.data);
}, },
async setSaldo({ commit, dispatch }, { gdc_id, saldo }) { async setSaldo({ commit, dispatch }, { gdc_id, saldo }) {
@ -29,6 +31,7 @@ const actions = {
commit('setSaldo', { gdc_id: gdc_id, saldo: saldo }); commit('setSaldo', { gdc_id: gdc_id, saldo: saldo });
dispatch("ui/toast", { mensaje: 'Saldo modificado con éxito' }, { root: true }); dispatch("ui/toast", { mensaje: 'Saldo modificado con éxito' }, { root: true });
} catch (error) { } catch (error) {
dispatch("ui/error", { error: error }, { root: true });
} }
}, },
async cargarSaldos({ commit, dispatch }, formData) { async cargarSaldos({ commit, dispatch }, formData) {
@ -48,7 +51,7 @@ const actions = {
}; };
const getters = { const getters = {
getSaldo() { saldo() {
return (gdc_id) => state.grupos_de_compra.find(gdc => gdc.id === gdc_id)?.saldo ?? 0; return (gdc_id) => state.grupos_de_compra.find(gdc => gdc.id === gdc_id)?.saldo ?? 0;
}, },
}; };

View file

@ -21,6 +21,7 @@ Route::middleware('api')->group(function() {
Route::prefix('grupos-de-compra')->group(function() { Route::prefix('grupos-de-compra')->group(function() {
Route::get('/', 'Api\GrupoDeCompraController@index'); Route::get('/', 'Api\GrupoDeCompraController@index');
Route::get('/saldos','Api\GrupoDeCompraController@saldos');
Route::get('/{grupoDeCompra}', 'Api\GrupoDeCompraController@show'); Route::get('/{grupoDeCompra}', 'Api\GrupoDeCompraController@show');
Route::post('/{gdc}/devoluciones', 'Api\GrupoDeCompraController@toggleDevoluciones'); Route::post('/{gdc}/devoluciones', 'Api\GrupoDeCompraController@toggleDevoluciones');
Route::post('/{gdc}/saldo', 'Api\GrupoDeCompraController@setSaldo'); Route::post('/{gdc}/saldo', 'Api\GrupoDeCompraController@setSaldo');