Upload files
This commit is contained in:
@ -3,19 +3,47 @@ namespace Contabilidad\Common\Controller;
|
|||||||
|
|
||||||
use Psr\Http\Message\ServerRequestInterface as Request;
|
use Psr\Http\Message\ServerRequestInterface as Request;
|
||||||
use Psr\Http\Message\ResponseInterface as Response;
|
use Psr\Http\Message\ResponseInterface as Response;
|
||||||
|
use Psr\Container\ContainerInterface as Container;
|
||||||
use ProVM\Common\Define\Controller\Json;
|
use ProVM\Common\Define\Controller\Json;
|
||||||
use ProVM\Common\Factory\Model as Factory;
|
use ProVM\Common\Factory\Model as Factory;
|
||||||
use Contabilidad\Common\Service\DocumentHandler as Handler;
|
use Contabilidad\Common\Service\DocumentHandler as Handler;
|
||||||
|
use Contabilidad\Cuenta;
|
||||||
|
|
||||||
class Import {
|
class Import {
|
||||||
use Json;
|
use Json;
|
||||||
|
|
||||||
public function __invoke(Request $request, Response $response, Factory $factory): Response {
|
public function __invoke(Request $request, Response $response, Factory $factory, Container $container): Response {
|
||||||
$post = $request->getParsedBody();
|
$post =$request->getParsedBody();
|
||||||
return $this->withJson($response, $post);
|
$cuenta = $factory->find(Cuenta::class)->one($post['cuenta']);
|
||||||
|
$file = $request->getUploadedFiles()['archivo'];
|
||||||
|
$valid_media = [
|
||||||
|
'text/csv' => 'csvs',
|
||||||
|
'application/pdf' => 'pdfs',
|
||||||
|
'application/vnd.ms-excel' => 'xlss',
|
||||||
|
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'xlss',
|
||||||
|
'application/json' => 'jsons'
|
||||||
|
];
|
||||||
|
if ($file->getError() === 0 and in_array($file->getClientMediaType(), array_keys($valid_media))) {
|
||||||
|
$filenfo = new \SplFileInfo($file->getClientFilename());
|
||||||
|
$new_name = implode('.', [implode(' - ', [$cuenta->nombre, $cuenta->categoria()->nombre, $post['fecha']]), $filenfo->getExtension()]);
|
||||||
|
$to = implode(DIRECTORY_SEPARATOR, [$container->get('folders')->uploads, $valid_media[$file->getClientMediaType()], $new_name]);
|
||||||
|
$file->moveTo($to);
|
||||||
|
$status = file_exists($to);
|
||||||
|
}
|
||||||
|
$output = [
|
||||||
|
'input' => [
|
||||||
|
'name' => $file->getClientFilename(),
|
||||||
|
'type' => $file->getClientMediaType(),
|
||||||
|
'size' => $file->getSize(),
|
||||||
|
'error' => $file->getError()
|
||||||
|
],
|
||||||
|
'new_name' => $new_name,
|
||||||
|
'uploaded' => $status
|
||||||
|
];
|
||||||
|
return $this->withJson($response, $output);
|
||||||
}
|
}
|
||||||
public function uploads(Request $request, Response $response, Handler $handler): Response {
|
public function uploads(Request $request, Response $response, Handler $handler): Response {
|
||||||
$output = $handler->handle();
|
$output = $handler->handle();
|
||||||
return $this->withJson($response, $output);
|
return $this->withJson($response, $output);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,8 @@ server {
|
|||||||
access_log /var/log/nginx/access.log;
|
access_log /var/log/nginx/access.log;
|
||||||
root /app/public;
|
root /app/public;
|
||||||
|
|
||||||
|
client_max_body_size 50M;
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
try_files $uri $uri/ /index.php?$query_string;
|
try_files $uri $uri/ /index.php?$query_string;
|
||||||
}
|
}
|
||||||
|
@ -1,2 +1,4 @@
|
|||||||
log_errors = true
|
log_errors = true
|
||||||
error_log = /var/log/php/error.log
|
error_log = /var/log/php/error.log
|
||||||
|
upload_max_filesize = 50M
|
||||||
|
max_input_vars = 5000
|
||||||
|
12
ui/common/Controller/Importar.php
Normal file
12
ui/common/Controller/Importar.php
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
namespace Contabilidad\Common\Controller;
|
||||||
|
|
||||||
|
use Psr\Http\Message\ServerRequestInterface as Request;
|
||||||
|
use Psr\Http\Message\ResponseInterface as Response;
|
||||||
|
use Slim\Views\Blade as View;
|
||||||
|
|
||||||
|
class Importar {
|
||||||
|
public function __invoke(Request $request, Response $response, View $view): Response {
|
||||||
|
return $view->render($response, 'importar');
|
||||||
|
}
|
||||||
|
}
|
4
ui/resources/routes/importar.php
Normal file
4
ui/resources/routes/importar.php
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?php
|
||||||
|
use Contabilidad\Common\Controller\Importar;
|
||||||
|
|
||||||
|
$app->get('/importar[/]', Importar::class);
|
92
ui/resources/views/importar.blade.php
Normal file
92
ui/resources/views/importar.blade.php
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
@extends('layout.base')
|
||||||
|
|
||||||
|
@section('page_title')
|
||||||
|
Importar
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('page_content')
|
||||||
|
<h1>Importar</h1>
|
||||||
|
<form class="ui form" action="#" method="post" id="importar_form" enctype="multipart/form-data">
|
||||||
|
<div class="two wide field">
|
||||||
|
<label>Fecha</label>
|
||||||
|
<div class="ui date calendar">
|
||||||
|
<div class="ui icon input">
|
||||||
|
<input type="text" name="fecha" />
|
||||||
|
<i class="calendar outline icon"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="six wide field">
|
||||||
|
<label>Cuenta</label>
|
||||||
|
<select name="cuenta"></select>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<input type="file" name="archivo" style="display: none;" />
|
||||||
|
<div class="ui labeled icon input" id="archivo_btn">
|
||||||
|
<div class="ui label">Archivo</div>
|
||||||
|
<input type="text" readonly="" />
|
||||||
|
<i class="search icon"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button class="ui button">Importar</button>
|
||||||
|
</form>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<script type="text/javascript">
|
||||||
|
function getCuentas() {
|
||||||
|
sendGet(_urls.api + '/cuentas').then((data) => {
|
||||||
|
if (data.cuentas === null || data.cuentas.length === 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const select = $("select[name='cuenta']")
|
||||||
|
let values = []
|
||||||
|
$.each(data.cuentas, (i, el) => {
|
||||||
|
const nombre = [el.nombre, el.categoria.nombre].join(' - ')
|
||||||
|
values.push({
|
||||||
|
name: nombre,
|
||||||
|
value: el.id,
|
||||||
|
text: nombre
|
||||||
|
})
|
||||||
|
})
|
||||||
|
select.dropdown({values})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
$(document).ready(() => {
|
||||||
|
getCuentas()
|
||||||
|
const today = new Date()
|
||||||
|
const start = new Date(today.getFullYear(), today.getMonth() - 1)
|
||||||
|
$('.ui.calendar').calendar({
|
||||||
|
type: 'month',
|
||||||
|
initialDate: start,
|
||||||
|
maxDate: start,
|
||||||
|
months: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'],
|
||||||
|
monthsShort: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'],
|
||||||
|
formatter: {
|
||||||
|
date: function(date, settings) {
|
||||||
|
if (!date) return ''
|
||||||
|
const year = date.getFullYear()
|
||||||
|
const month = date.getMonth() + 1
|
||||||
|
return [year, month].join('-')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
$('#archivo_btn').css('cursor', 'pointer').click(() => {
|
||||||
|
$("[name='archivo']").trigger('click')
|
||||||
|
})
|
||||||
|
$("[name='archivo']").change((e) => {
|
||||||
|
const arch = $(e.currentTarget)
|
||||||
|
const filename = arch[0].files[0].name
|
||||||
|
$('#archivo_btn').find('input').val(filename)
|
||||||
|
})
|
||||||
|
$('#importar_form').submit((e) => {
|
||||||
|
e.preventDefault()
|
||||||
|
const data = new FormData(e.currentTarget)
|
||||||
|
sendPost(_urls.api + '/import', data, true).then((resp) => {
|
||||||
|
console.debug(resp)
|
||||||
|
})
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
@endpush
|
@ -2,6 +2,7 @@
|
|||||||
<a class="item" href="{{$urls->base}}">Inicio</a>
|
<a class="item" href="{{$urls->base}}">Inicio</a>
|
||||||
@include('layout.body.menu.cuentas')
|
@include('layout.body.menu.cuentas')
|
||||||
@include('layout.body.menu.categorias')
|
@include('layout.body.menu.categorias')
|
||||||
|
<a class="item" href="{{$urls->base}}/importar">Importar</a>
|
||||||
<div class="right menu">
|
<div class="right menu">
|
||||||
<a class="item" href="{{$urls->base}}config">Config</a>
|
<a class="item" href="{{$urls->base}}config">Config</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -7,7 +7,18 @@
|
|||||||
base: '{{$urls->base}}',
|
base: '{{$urls->base}}',
|
||||||
api: '{{$urls->api}}'
|
api: '{{$urls->api}}'
|
||||||
}
|
}
|
||||||
function buildAjax(url, method) {
|
function buildAjax(url, method, files=false) {
|
||||||
|
if (files) {
|
||||||
|
return {
|
||||||
|
url: url,
|
||||||
|
headers: {
|
||||||
|
'Authorization': 'Bearer ' + API_KEY
|
||||||
|
},
|
||||||
|
method: method,
|
||||||
|
processData: false,
|
||||||
|
contentType: false
|
||||||
|
}
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
url: url,
|
url: url,
|
||||||
headers: {
|
headers: {
|
||||||
@ -21,8 +32,8 @@
|
|||||||
let ajax_obj = buildAjax(url, 'GET')
|
let ajax_obj = buildAjax(url, 'GET')
|
||||||
return $.ajax(ajax_obj)
|
return $.ajax(ajax_obj)
|
||||||
}
|
}
|
||||||
function sendPost(url, data) {
|
function sendPost(url, data, files=false) {
|
||||||
let ajax_obj = buildAjax(url, 'POST')
|
let ajax_obj = buildAjax(url, 'POST', files)
|
||||||
ajax_obj['data'] = data
|
ajax_obj['data'] = data
|
||||||
return $.ajax(ajax_obj)
|
return $.ajax(ajax_obj)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user