Compare commits
No commits in common. "b752f9e8c5cd90200f755774328d76954d86c1d7" and "02aba80fc94c7514591969ef5718a7adb7053037" have entirely different histories.
b752f9e8c5
...
02aba80fc9
10 changed files with 10 additions and 243 deletions
|
@ -286,9 +286,4 @@ class GrupoDeCompra extends Model
|
||||||
->get()
|
->get()
|
||||||
->keyBy('producto_id');
|
->keyBy('producto_id');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setSaldo(float $saldo) {
|
|
||||||
$this->saldo = $saldo;
|
|
||||||
$this->save();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,13 +32,4 @@ class GrupoDeCompraController extends Controller
|
||||||
GrupoDeCompra::find($gdc)->toggleDevoluciones();
|
GrupoDeCompra::find($gdc)->toggleDevoluciones();
|
||||||
return response()->noContent();
|
return response()->noContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setSaldo(int $gdc) {
|
|
||||||
$valid = request()->validate([
|
|
||||||
'saldo' => ['required', 'min:0'],
|
|
||||||
]);
|
|
||||||
$grupoDeCompra = GrupoDeCompra::find($gdc);
|
|
||||||
$grupoDeCompra->setSaldo($valid['saldo']);
|
|
||||||
return new GrupoDeCompraResource($grupoDeCompra);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,14 +8,10 @@ use App\Producto;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Symfony\Component\HttpFoundation\BinaryFileResponse;
|
use Symfony\Component\HttpFoundation\BinaryFileResponse;
|
||||||
use League\Csv\Reader;
|
|
||||||
use DatabaseSeeder;
|
|
||||||
|
|
||||||
class ComprasController
|
class ComprasController
|
||||||
{
|
{
|
||||||
const CANASTAS_PATH = 'csv/canastas/';
|
const CANASTAS_PATH = 'csv/canastas/';
|
||||||
const BARRIO = "Barrio";
|
|
||||||
const SALDO = "Saldo";
|
|
||||||
|
|
||||||
public function indexPedidos() {
|
public function indexPedidos() {
|
||||||
return view('compras_pedidos');
|
return view('compras_pedidos');
|
||||||
|
@ -63,36 +59,4 @@ class ComprasController
|
||||||
$file = resource_path('csv/productos.csv');
|
$file = resource_path('csv/productos.csv');
|
||||||
return response()->download($file);
|
return response()->download($file);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function cargarSaldos(Request $request): JsonResponse
|
|
||||||
{
|
|
||||||
$request->validate([
|
|
||||||
'data' => 'required|file|mimes:csv,txt|max:2048',
|
|
||||||
]);
|
|
||||||
|
|
||||||
$file = $request->file('data')->getPathname();
|
|
||||||
$csv = Reader::createFromPath($file, 'r');
|
|
||||||
try {
|
|
||||||
$csv->setDelimiter("|");
|
|
||||||
$csv->setEnclosure("'");
|
|
||||||
$csv->setHeaderOffset(0);
|
|
||||||
$records = $csv->getRecords();
|
|
||||||
} catch (InvalidArgument|Exception $e) {
|
|
||||||
Log::error($e->getMessage());
|
|
||||||
return response()->json([
|
|
||||||
'message' => 'No se pudo leer el csv',
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($records as $record) {
|
|
||||||
$barrio = $record[self::BARRIO];
|
|
||||||
$saldo = $record[self::SALDO];
|
|
||||||
GrupoDeCompra::where('nombre', $barrio)
|
|
||||||
->update(['saldo' => $saldo]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return response()->json([
|
|
||||||
'message' => 'Saldos cargados exitosamente',
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,14 +21,14 @@ class GrupoDeCompraResource extends JsonResource
|
||||||
'devoluciones_habilitadas' => $this->devoluciones_habilitadas,
|
'devoluciones_habilitadas' => $this->devoluciones_habilitadas,
|
||||||
'pedidos' => SubpedidoResource::collection($this->subpedidos),
|
'pedidos' => SubpedidoResource::collection($this->subpedidos),
|
||||||
'total_a_recaudar' => number_format($this->totalARecaudar(),2),
|
'total_a_recaudar' => number_format($this->totalARecaudar(),2),
|
||||||
'saldo' => number_format($this->saldo, 2, ".", ""),
|
'saldo' => number_format($this->saldo,2),
|
||||||
'total_sin_devoluciones' => number_format($this->totalSinDevoluciones(),2),
|
'total_sin_devoluciones' => number_format($this->totalSinDevoluciones(),2),
|
||||||
'total_barrial' => number_format($this->totalBarrial(),2),
|
'total_barrial' => number_format($this->totalBarrial(),2),
|
||||||
'total_devoluciones' => number_format($this->totalDevoluciones(),2),
|
'total_devoluciones' => number_format($this->totalDevoluciones(),2),
|
||||||
'total_de_pedido' => number_format($this->totalDePedido(),2),
|
'total_de_pedido' => number_format($this->totalDePedido(),2),
|
||||||
'total_a_transferir' => number_format($this->totalATransferir(),2),
|
'total_a_transferir' => number_format($this->totalATransferir(),2),
|
||||||
'total_transporte' => number_format($this->totalTransporte()),
|
'total_transporte' => number_format($this->totalTransporte()),
|
||||||
'cantidad_transnumber_formatporte' => number_format($this->cantidadTransporte()),
|
'cantidad_transporte' => number_format($this->cantidadTransporte()),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Saldo a favor:</th>
|
<th>Saldo a favor:</th>
|
||||||
<td class="has-text-right">- $ {{ saldo }}</td>
|
<td class="has-text-right">$ {{ saldo }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Total a transferir:</th>
|
<th>Total a transferir:</th>
|
||||||
|
|
|
@ -47,62 +47,11 @@
|
||||||
:class="seccionActiva === 'saldos-compras-seccion' ? 'is-active' : 'is-hidden'"
|
:class="seccionActiva === 'saldos-compras-seccion' ? 'is-active' : 'is-hidden'"
|
||||||
>
|
>
|
||||||
<div class="block" id="saldos-compras-seccion">
|
<div class="block" id="saldos-compras-seccion">
|
||||||
<article class="message is-warning">
|
<table>
|
||||||
<div class="message-header">
|
|
||||||
<p>
|
|
||||||
<button class="icon" aria-label="foldout" @click="toggleSaldosFileDialog">
|
|
||||||
<i class="fa" :class="show_saldos_file_dialog ? 'fa-arrow-up' : 'fa-arrow-down'"></i>
|
|
||||||
</button>
|
|
||||||
Cargar saldos
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="message-body" v-if="show_saldos_file_dialog">
|
|
||||||
<div class="content">
|
|
||||||
La planilla de saldos tiene que tener el siguiente formato para que la aplicación la lea correctamente:
|
|
||||||
<ul>
|
|
||||||
<li>Los valores deben usar punto y no coma decimal</li>
|
|
||||||
<li>El nombre de las columnas deben ser "Barrio" y "Saldo"</li>
|
|
||||||
<li>Las celdas deben separarse con '|'</li>
|
|
||||||
<li>No puede haber "enters" en ninguna celda</li>
|
|
||||||
<li>El nombre de los barrios debe estar exactamente igual que como están configurados en esta aplicacaión</li>
|
|
||||||
</ul>
|
|
||||||
<article class="message is-danger mt-2">
|
|
||||||
<div class="message-body">
|
|
||||||
<div class="content">
|
|
||||||
Cargar un archivo de saldos sólo reemplazará los saldos de los barrios presentes en la tabla.
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</article>
|
|
||||||
</div>
|
|
||||||
<input-file-button text="Subir archivo" @archivo-subido="saldosSubido" />
|
|
||||||
</div>
|
|
||||||
</article>
|
|
||||||
|
|
||||||
<table class="table container">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Barrio</th>
|
|
||||||
<th>Saldo</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr v-for="gdc in grupos_de_compra">
|
<tr v-for="gdc in grupos_de_compra">
|
||||||
<th>{{ gdc.nombre }}</th>
|
<th>{{ gdc.nombre }}</th>
|
||||||
<td>
|
<td>{{ gdc.saldo }}</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>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
@ -115,7 +64,6 @@
|
||||||
import TabsSecciones from "../comunes/TabsSecciones.vue";
|
import TabsSecciones from "../comunes/TabsSecciones.vue";
|
||||||
import DropdownDescargar from "./DropdownDescargar.vue";
|
import DropdownDescargar from "./DropdownDescargar.vue";
|
||||||
import CanastaInput from "./CanastaInput.vue";
|
import CanastaInput from "./CanastaInput.vue";
|
||||||
import InputFileButton from "../comunes/InputFileButton.vue";
|
|
||||||
import { mapActions, mapState } from "vuex";
|
import { mapActions, mapState } from "vuex";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
@ -123,7 +71,6 @@ export default {
|
||||||
TabsSecciones,
|
TabsSecciones,
|
||||||
DropdownDescargar,
|
DropdownDescargar,
|
||||||
CanastaInput,
|
CanastaInput,
|
||||||
InputFileButton,
|
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
@ -135,8 +82,6 @@ export default {
|
||||||
tabActiva: "pedidos-compras",
|
tabActiva: "pedidos-compras",
|
||||||
seccionActiva: "pedidos-compras-seccion",
|
seccionActiva: "pedidos-compras-seccion",
|
||||||
archivo: undefined,
|
archivo: undefined,
|
||||||
saldo_modificado: {},
|
|
||||||
show_saldos_file_dialog: false,
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
@ -144,57 +89,7 @@ export default {
|
||||||
this.tabActiva = tabId;
|
this.tabActiva = tabId;
|
||||||
this.seccionActiva = tabId + "-seccion";
|
this.seccionActiva = tabId + "-seccion";
|
||||||
},
|
},
|
||||||
...mapActions('comisiones', ['getGruposDeCompra', 'setSaldo']),
|
...mapActions('comisiones', ['getGruposDeCompra']),
|
||||||
...mapActions('ui',["toast"]),
|
|
||||||
async confirmar_saldo(gdc_id) {
|
|
||||||
var saldo = this.getSaldo(gdc_id);
|
|
||||||
await this.setSaldo({
|
|
||||||
gdc_id: gdc_id,
|
|
||||||
saldo: saldo,
|
|
||||||
});
|
|
||||||
this.saldo_modificado[gdc_id] = false;
|
|
||||||
await this.getGruposDeCompra();
|
|
||||||
},
|
|
||||||
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) {
|
|
||||||
for (var i = 0; i < this.grupos_de_compra.length; i++) {
|
|
||||||
if (this.grupos_de_compra[i].id == gdc_id) {
|
|
||||||
return this.grupos_de_compra[i].saldo;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
},
|
|
||||||
async saldosSubido(event) {
|
|
||||||
var archivo = event.archivo;
|
|
||||||
if (archivo.type === "text/csv") {
|
|
||||||
const formData = new FormData();
|
|
||||||
formData.append("data", archivo);
|
|
||||||
try {
|
|
||||||
const response = await axios.post("/compras/saldos", formData, {
|
|
||||||
headers: {
|
|
||||||
"Content-Type": "multipart/form-data",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
this.getGruposDeCompra();
|
|
||||||
this.toast({ mensaje: (response.data.message || "Canasta cargada exitosamente") });
|
|
||||||
} catch (error) {
|
|
||||||
console.log(error);
|
|
||||||
this.toast({ mensaje: (error.response?.data?.message || "Hubo errores.") });
|
|
||||||
}
|
|
||||||
event.component.cargando = false;
|
|
||||||
} else {
|
|
||||||
this.toast("El archivo debe ser .CSV");
|
|
||||||
event.component.cargando = false;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
toggleSaldosFileDialog() {
|
|
||||||
this.show_saldos_file_dialog = !this.show_saldos_file_dialog;
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapState('comisiones', [
|
...mapState('comisiones', [
|
||||||
|
|
|
@ -1,56 +0,0 @@
|
||||||
<template>
|
|
||||||
<div class="file has-name">
|
|
||||||
<label class="file-label">
|
|
||||||
<input
|
|
||||||
class="file-input"
|
|
||||||
type="file"
|
|
||||||
name="canasta"
|
|
||||||
@change="archivoSubido"
|
|
||||||
/>
|
|
||||||
<span class="file-cta">
|
|
||||||
<span class="file-icon">
|
|
||||||
<i class="fas fa-cloud-upload-alt"></i>
|
|
||||||
</span>
|
|
||||||
<span class="file-label">{{ text }}</span>
|
|
||||||
</span>
|
|
||||||
<span class="file-name" v-if="cargando">
|
|
||||||
{{ 'Cargando ' + archivo.nombre }}
|
|
||||||
</span>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: "InputFileButton",
|
|
||||||
props: {
|
|
||||||
text: {
|
|
||||||
type: String,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
archivo: null,
|
|
||||||
cargando: false,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
archivoSubido(event) {
|
|
||||||
const archivo = event.target.files[0];
|
|
||||||
if (archivo) {
|
|
||||||
this.archivo = { data: archivo, nombre: archivo.name };
|
|
||||||
this.$emit("archivo-subido", {
|
|
||||||
component: this,
|
|
||||||
archivo: archivo
|
|
||||||
});
|
|
||||||
this.cargando = true;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
|
|
||||||
</style>
|
|
28
resources/js/store/modules/comisiones.js
vendored
28
resources/js/store/modules/comisiones.js
vendored
|
@ -1,21 +1,12 @@
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
|
|
||||||
const state = {
|
const state = {
|
||||||
grupos_de_compra: [],
|
grupos_de_compra: null,
|
||||||
};
|
};
|
||||||
|
|
||||||
const mutations = {
|
const mutations = {
|
||||||
setGruposDeCompra(state, { data }) {
|
setGruposDeCompra(state, { grupos_de_compra }) {
|
||||||
state.grupos_de_compra = data;
|
state.grupos_de_compra = grupos_de_compra;
|
||||||
},
|
|
||||||
setGrupoDeCompra(state, gdc) {
|
|
||||||
for (var i = 0; i < state.grupos_de_compra.length; i++) {
|
|
||||||
if (state.grupos_de_compra[i].id == gdc.id) {
|
|
||||||
state.grupos_de_compra[i] = gdc;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
state.grupos_de_compra.push(gdc);
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -24,20 +15,9 @@ const actions = {
|
||||||
const response = await axios.get('/api/grupos-de-compra');
|
const response = await axios.get('/api/grupos-de-compra');
|
||||||
commit('setGruposDeCompra', response.data);
|
commit('setGruposDeCompra', response.data);
|
||||||
},
|
},
|
||||||
async setSaldo({ commit }, { gdc_id, saldo }) {
|
|
||||||
const response = await axios.post(
|
|
||||||
"api/grupos-de-compra/" + gdc_id + "/saldo",
|
|
||||||
{ saldo: saldo }
|
|
||||||
);
|
|
||||||
commit('setGrupoDeCompra', response.data.data);
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const getters = {
|
const getters = {};
|
||||||
getSaldo() {
|
|
||||||
return (gdc_id) => state.grupos_de_compra.find(gdc => gdc.id === gdc_id)?.saldo ?? 0;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
namespaced: true,
|
namespaced: true,
|
||||||
|
|
|
@ -21,7 +21,6 @@ Route::middleware('api')->group(function() {
|
||||||
Route::get('/', 'Api\GrupoDeCompraController@index');
|
Route::get('/', 'Api\GrupoDeCompraController@index');
|
||||||
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::prefix('subpedidos')->group(function () {
|
Route::prefix('subpedidos')->group(function () {
|
||||||
|
|
|
@ -54,5 +54,4 @@ Route::middleware(['auth', 'role:comision'])->group( function() {
|
||||||
Route::get('/compras/pedidos/pdf', 'ComprasController@pdf')->name('compras.pedidos.pdf');
|
Route::get('/compras/pedidos/pdf', 'ComprasController@pdf')->name('compras.pedidos.pdf');
|
||||||
Route::get('/compras/canasta/ejemplo', 'ComprasController@descargarCanastaEjemplo')->name('compras.canasta.ejemplo');
|
Route::get('/compras/canasta/ejemplo', 'ComprasController@descargarCanastaEjemplo')->name('compras.canasta.ejemplo');
|
||||||
Route::post('/compras/canasta', 'ComprasController@cargarCanasta')->name('compras.canasta');
|
Route::post('/compras/canasta', 'ComprasController@cargarCanasta')->name('compras.canasta');
|
||||||
Route::post('/compras/saldos', 'ComprasController@cargarSaldos')->name('compras.canasta');
|
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Reference in a new issue