From 34b429530fc99e72e3f3dea359e14c649cddef49 Mon Sep 17 00:00:00 2001 From: Aldarien Date: Mon, 6 Dec 2021 22:13:06 -0300 Subject: [PATCH 01/25] Python --- python/data/EECCvirtual-Visa.pdf | Bin 0 -> 146822 bytes python/src/ai/dictionary.py | 285 +++++++++++++++++++++++++++++++ python/src/ai/models.py | 243 ++++++++++++++++++++++++++ python/src/ai/network.py | 123 +++++++++++++ python/src/ai/phrase.py | 102 +++++++++++ python/src/ai/word.py | 84 +++++++++ 6 files changed, 837 insertions(+) create mode 100644 python/data/EECCvirtual-Visa.pdf create mode 100644 python/src/ai/dictionary.py create mode 100644 python/src/ai/models.py create mode 100644 python/src/ai/network.py create mode 100644 python/src/ai/phrase.py create mode 100644 python/src/ai/word.py diff --git a/python/data/EECCvirtual-Visa.pdf b/python/data/EECCvirtual-Visa.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7ea5ef83eb3f28d55d88f4cdb01f6c97353a08ed GIT binary patch literal 146822 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%0AU`(L@ z?w7?z!L9Jc6Wb`s$Jc~=EGLJd6Swy3h#zFP8C`4hY-4iIrOn;J?=Lz*V-xh0m<#F9 z37U0&veQegr@c>4=!QRKd=dRA{9(iSOS$KfPV+w}t5(XlaaJ~Fv>(JGs!}|xesN~kLhuM7K^7!jY&W9HLx>-9 zEh8QV`<$NdMK8+|dA-HdLe`8w%I{{=@T(xOXmos_c+#G91+W4V{R?_=Dj7$j_BvQD z>*7#tp@#PSIsMzIOWQ*dXR54wM_2qU0~w3bZ*i=gLZJ!HPQ<)Pdd3L9&&edc=4Q_j zko!b!C_&YAxIsNazCY(C{DNoj=L6huJhvsMCflHS@X1=@7jv2uFF{0sijSpSkLMa zvYlDKxTcpsp5ok&UlWO&32UE8#dW!cP2{PqfAB>-mdKu`f*$=cs5$fO_8MO>a(KT% znXIs9mwKkkQBB&!6~_T8xkeVGDHau^=8`wisq#IYid7}vCa>V&9Zs*55l{ZEkUy^e z_>4s11q>{M6VMSbPZ||;P{)9-QKI*F779>@5jQ+=k%?^^hcqZ1kB?xAKW&Q@^+9RpqzBSHtR|)`CAvt! zsG2^VOA`Kivy~0X`;FN$07S$S&Z*eD!fYN|o82tMRYy{kJ`~U!Ol67(Wg)`Z;E@o& z4AB_4M@qVR3qPNU+snJirtf1y6x`14Avx)7YN;a7zT*T(sCrNQoUqA&LGem-f3Q@68MCu{BZu9g$|3UebxKer}nAZ`Q%Ir3f{H3G;v60 zm69$wxYlAqLcu17ZdyQ4p1`e@bF#U2KQlo4Y(lMMWRTa2aZp~3P_^YB2MB!AnNfK- z_to7;s8_bE-I<fm(ehby%tLD5c7@)cy0|;! z&y9q{``*TG3AW*dB55U|b9W^_54|gyk}WDvEsP22K%WH}ybFciR_UcR-)$88LMLa{ zAjETxTJ~Gr5V=O}y!Izv2HEOSR$o2R+7hMrJ-=&3t2~xXy!k#Cs8^}No+GQ+X{UqV zcb;L4r;8^Uv~2Ixl(&?!r@T<|;fX$}a2pl0$bMokdGK>2(d|rjr_#IDLY!_ueW# diff --git a/ui/resources/views/config/menu/files.blade.php b/ui/resources/views/config/menu/files.blade.php new file mode 100644 index 0000000..daf9486 --- /dev/null +++ b/ui/resources/views/config/menu/files.blade.php @@ -0,0 +1,4 @@ + + Archivos + + diff --git a/ui/resources/views/layout/body/menu.blade.php b/ui/resources/views/layout/body/menu.blade.php index fb6e1c3..80944d6 100644 --- a/ui/resources/views/layout/body/menu.blade.php +++ b/ui/resources/views/layout/body/menu.blade.php @@ -2,7 +2,6 @@ Inicio @include('layout.body.menu.cuentas') @include('layout.body.menu.categorias') - Importar diff --git a/ui/setup/setups/03_web.php b/ui/setup/setups/03_web.php index 7ef8df1..0f5847a 100644 --- a/ui/setup/setups/03_web.php +++ b/ui/setup/setups/03_web.php @@ -2,15 +2,23 @@ use Psr\Container\ContainerInterface as Container; return [ - Slim\Views\Blade::class => function(Container $c) { - return new Slim\Views\Blade( - $c->get('folders')->templates, - $c->get('folders')->cache, - null, - [ - 'api_key' => $c->get('API_KEY'), - 'urls' => $c->get('urls') - ] - ); - } + Slim\Views\Blade::class => function(Container $c) { + return new Slim\Views\Blade( + $c->get('folders')->templates, + $c->get('folders')->cache, + null, + [ + 'api_key' => $c->get('API_KEY'), + 'urls' => $c->get('urls') + ] + ); + }, + GuzzleHttp\Client::class => function(Container $c) { + return new GuzzleHttp\Client([ + 'base_uri' => 'http://api-proxy', + 'headers' => [ + 'Authorization' => 'Bearer ' . $c->get('API_KEY') + ] + ]); + } ]; From 605c905f5d8c2c0c64510e1b2c00bb37c598c4d0 Mon Sep 17 00:00:00 2001 From: Aldarien Date: Wed, 22 Dec 2021 21:53:30 -0300 Subject: [PATCH 06/25] Python --- python/src/ai/network.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/python/src/ai/network.py b/python/src/ai/network.py index 928ecac..ae0345a 100644 --- a/python/src/ai/network.py +++ b/python/src/ai/network.py @@ -1,5 +1,8 @@ import json import os +import time +import timeit + import tensorflow as tf import sklearn import numpy as np @@ -83,6 +86,7 @@ class AI: self.__dict = None self.__network = None self.__sources = None + self._phrases = None self.filename = '' def add_source(self, text): @@ -116,7 +120,7 @@ class AI: np.zeros([len(word_list) - len(phrase)])) phrases.append(phrase) phrases = np.array(phrases) - print(phrases.shape) + self._phrases = phrases def active_train(self): pass From a5428b252e522b847489043de9054f4fa3ff0f8d Mon Sep 17 00:00:00 2001 From: Aldarien Date: Wed, 22 Dec 2021 23:11:51 -0300 Subject: [PATCH 07/25] FIX: Ignoring upload resources from ui --- .gitignore | 2 - api/.gitignore | 1 + ui/resources/views/uploads/base.blade.php | 14 +++++ ui/resources/views/uploads/list.blade.php | 70 +++++++++++++++++++++++ 4 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 api/.gitignore create mode 100644 ui/resources/views/uploads/base.blade.php create mode 100644 ui/resources/views/uploads/list.blade.php diff --git a/.gitignore b/.gitignore index b1cd869..f703fb2 100644 --- a/.gitignore +++ b/.gitignore @@ -13,5 +13,3 @@ # Python **/.idea/ - -**/uploads/ diff --git a/api/.gitignore b/api/.gitignore new file mode 100644 index 0000000..3b6c4bf --- /dev/null +++ b/api/.gitignore @@ -0,0 +1 @@ +**/uploads/ diff --git a/ui/resources/views/uploads/base.blade.php b/ui/resources/views/uploads/base.blade.php new file mode 100644 index 0000000..731187e --- /dev/null +++ b/ui/resources/views/uploads/base.blade.php @@ -0,0 +1,14 @@ +@extends('config.base') + +@section('config_content') +

+ @hasSection('uploads_title') + Archivo @yield('uploads_title') + @else + Archivos + @endif +

+
+ @yield('uploads_content') +
+@endsection diff --git a/ui/resources/views/uploads/list.blade.php b/ui/resources/views/uploads/list.blade.php new file mode 100644 index 0000000..6addb02 --- /dev/null +++ b/ui/resources/views/uploads/list.blade.php @@ -0,0 +1,70 @@ +@extends('uploads.base') + +@section('uploads_content') +
+ + +@endsection + +@push('scripts') + + +@endpush From 1a0c83fb2b9878962be232f99137671f5432bdda Mon Sep 17 00:00:00 2001 From: Aldarien Date: Wed, 22 Dec 2021 23:20:23 -0300 Subject: [PATCH 08/25] FIX: check if upload subfolder exists when loading files --- api/common/Service/FileHandler.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/common/Service/FileHandler.php b/api/common/Service/FileHandler.php index 5d06b1b..7041ed2 100644 --- a/api/common/Service/FileHandler.php +++ b/api/common/Service/FileHandler.php @@ -60,6 +60,9 @@ class FileHandler { $output = []; foreach ($this->folders as $f) { $folder = implode(DIRECTORY_SEPARATOR, [$this->base_folder, $f]); + if (!file_exists($folder)) { + continue; + } $files = new \DirectoryIterator($folder); foreach ($files as $file) { if ($file->isDir()) { From 66882d9f856312162992f1cec891cb192e249b86 Mon Sep 17 00:00:00 2001 From: Aldarien Date: Thu, 23 Dec 2021 00:08:28 -0300 Subject: [PATCH 09/25] FIX: Upload valid file check --- api/common/Service/FileHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/common/Service/FileHandler.php b/api/common/Service/FileHandler.php index 7041ed2..79ee9e7 100644 --- a/api/common/Service/FileHandler.php +++ b/api/common/Service/FileHandler.php @@ -42,7 +42,7 @@ class FileHandler { if ($file->getError() !== UPLOAD_ERR_OK) { return false; } - if (!in_array($file->getClientMediaType(), array_keys($this->valid_types))) { + if (!in_array($file->getClientMediaType(), $this->valid_types)) { return false; } if ($new_name === null) { From 572a9dc87c6b3ec07537f5c439c301444d1d9b8e Mon Sep 17 00:00:00 2001 From: Aldarien Date: Thu, 23 Dec 2021 00:08:49 -0300 Subject: [PATCH 10/25] FIX: Renaming with correct extension --- api/common/Controller/Files.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/api/common/Controller/Files.php b/api/common/Controller/Files.php index 6441a24..e227dc5 100644 --- a/api/common/Controller/Files.php +++ b/api/common/Controller/Files.php @@ -52,8 +52,7 @@ class Files { public function edit(Request $request, Response $response, Handler $handler, Factory $factory, $folder, $filename): Response { $post = json_decode($request->getBody()); $cuenta = $factory->find(Cuenta::class)->one($post->cuenta); - $filenfo = $handler->getInfo($folder, $filename); - $new_name = implode('.', [implode(' - ', [$cuenta->nombre, $cuenta->categoria()->nombre, $post->fecha]), $filenfo->getExtension()]); + $new_name = implode(' - ', [$cuenta->nombre, $cuenta->categoria()->nombre, $post->fecha]); $output = [ 'input' => [ 'folder' => $folder, From 52443c2226767f794bb9f513cb4d67e52d3f4060 Mon Sep 17 00:00:00 2001 From: Aldarien Date: Thu, 23 Dec 2021 00:09:09 -0300 Subject: [PATCH 11/25] FIX: Clear form and table --- ui/public/assets/scripts/uploads.list.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/ui/public/assets/scripts/uploads.list.js b/ui/public/assets/scripts/uploads.list.js index 24094c3..012618d 100644 --- a/ui/public/assets/scripts/uploads.list.js +++ b/ui/public/assets/scripts/uploads.list.js @@ -90,6 +90,7 @@ const archivos = { if (data.files === null || data.files.length === 0) { return } + this.archivos = [] $.each(data.files, (i, el) => { const arch = new Archivo(el) arch.setModal(this.modals.edit) @@ -106,20 +107,21 @@ const archivos = { }, draw: function() { const tbody = this.get().parent() - tbody.html('') + tbody.empty() $.each(this.archivos, (i, el) => { tbody.append(el.draw()) }) }, add: function() { this.modals.add.find('form').trigger('reset') + this.modals.add.find("[name='cuenta']").dropdown('clear') this.modals.add.modal('show') }, doAdd: function() { - const data = new FormData(this.modals.add.find('form')) - return sendPost(_urls.api + '/categorias/add', data, true).then((resp) => { + const data = new FormData(this.modals.add.find('form')[0]) + return sendPost(_urls.api + '/uploads/add', data, true).then((resp) => { this.modals.add.modal('hide') - this.getCategorias() + this.get().archivos() }) }, doEdit: function() { @@ -149,7 +151,7 @@ const archivos = { date: function(date, settings) { if (!date) return '' const year = date.getFullYear() - const month = date.getMonth() + 1 + const month = (date.getMonth() + 1).toString().padStart(2, '0') return [year, month].join('-') } } From 9e29dd09b79e66aa82aaa331ebbf0f374bb553d6 Mon Sep 17 00:00:00 2001 From: Aldarien Date: Thu, 23 Dec 2021 00:09:23 -0300 Subject: [PATCH 12/25] Remove ignored files --- .idea/.gitignore | 8 -------- .idea/codeStyles/codeStyleConfig.xml | 5 ----- .idea/modules.xml | 8 -------- 3 files changed, 21 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/codeStyles/codeStyleConfig.xml delete mode 100644 .idea/modules.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 73f69e0..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml -# Editor-based HTTP Client requests -/httpRequests/ diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index a55e7a1..0000000 --- a/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 2081fb2..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file From 4abe3448c00edcb0d3864dea82d98da2f69bc7cd Mon Sep 17 00:00:00 2001 From: Aldarien Date: Thu, 23 Dec 2021 00:46:56 -0300 Subject: [PATCH 13/25] Upgrades to the UI --- ui/public/assets/scripts/home.js | 41 +++++++++------ .../assets/scripts/tipos_categorias.list.js | 49 ++++++++++-------- .../assets/scripts/tipos_cuentas.list.js | 1 + ui/public/assets/scripts/uploads.list.js | 51 +++++++++++-------- ui/resources/views/categorias/base.blade.php | 2 +- .../views/categorias/tipos/base.blade.php | 2 +- ui/resources/views/config/list.blade.php | 7 +++ ui/resources/views/cuentas/base.blade.php | 2 +- ui/resources/views/home.blade.php | 1 + ui/resources/views/uploads/base.blade.php | 2 +- ui/resources/views/uploads/list.blade.php | 1 + 11 files changed, 96 insertions(+), 63 deletions(-) diff --git a/ui/public/assets/scripts/home.js b/ui/public/assets/scripts/home.js index 8cbe3d2..382b948 100644 --- a/ui/public/assets/scripts/home.js +++ b/ui/public/assets/scripts/home.js @@ -210,29 +210,38 @@ class TipoCategoria { } } const cuentas = { - id: 'cuentas', + id: '#cuentas', balance: 0, tipos: [], tipos_categorias: [], + build: function() { + return { + parent: (segment) => { + const tr = $('').append( + $('').attr('colspan', 3).html('Cuenta') + ) + $.each(this.tipos, (i, el) => { + tr.append( + $('').attr('class', 'right aligned').css('color', '#' + el.color).html(el.descripcion) + ) + }) + const table = $('
').attr('class', 'ui striped table').append( + $('').append(tr) + ) + const parent = $('') + table.append(parent) + segment.append(table) + return parent + } + } + }, get: function() { return { parent: () => { - let parent = $('#' + this.id) + const segment = $(this.id) + let parent = segment.find('tbody') if (parent.length === 0) { - const tr = $('').append( - $('').attr('colspan', 3).html('Cuenta') - ) - $.each(this.tipos, (i, el) => { - tr.append( - $('').attr('class', 'right aligned').css('color', '#' + el.color).html(el.descripcion) - ) - }) - const table = $('
').attr('class', 'ui striped table').append( - $('').append(tr) - ) - parent = $('').attr('id', this.id) - table.append(parent) - $('h1.header').after(table) + parent = this.build().parent(segment) } return parent }, diff --git a/ui/public/assets/scripts/tipos_categorias.list.js b/ui/public/assets/scripts/tipos_categorias.list.js index 51c72fd..815a194 100644 --- a/ui/public/assets/scripts/tipos_categorias.list.js +++ b/ui/public/assets/scripts/tipos_categorias.list.js @@ -90,32 +90,37 @@ const tipos_categorias = { this.draw() }) }, - getParent: function() { - let parent = $(this.id).find('tbody') - if (parent.length === 0) { - const table = $('
').attr('class', 'ui table').append( - $('').append( - $('').append( - $('').attr('class', 'twelve wide').html('Tipo Categoría') - ).append( - $('').attr('class', 'two wide').html('Activo') - ).append( - $('').attr('class', 'two wide right aligned').append( - $('').attr('class', 'ui tiny green circular icon button').append( - $('').attr('class', 'plus icon') - ) + buildParent: function(segment) { + const table = $('
').attr('class', 'ui table').append( + $('').append( + $('').append( + $('').attr('class', 'twelve wide').html('Tipo Categoría') + ).append( + $('').attr('class', 'two wide').html('Activo') + ).append( + $('').attr('class', 'two wide right aligned').append( + $('').attr('class', 'ui tiny green circular icon button').append( + $('').attr('class', 'plus icon') ) ) ) ) - table.find('.ui.button').click((e) => { - e.preventDefault() - this.add() - return false - }) - parent = $('') - table.append(parent) - $(this.id).append(table) + ) + table.find('.ui.button').click((e) => { + e.preventDefault() + this.add() + return false + }) + parent = $('') + table.append(parent) + segment.append(table) + return parent + }, + getParent: function() { + const segment = $(this.id) + let parent = segment.find('tbody') + if (parent.length === 0) { + parent = this.buildParent(segment) } return parent }, diff --git a/ui/public/assets/scripts/tipos_cuentas.list.js b/ui/public/assets/scripts/tipos_cuentas.list.js index ea739e9..40d33cd 100644 --- a/ui/public/assets/scripts/tipos_cuentas.list.js +++ b/ui/public/assets/scripts/tipos_cuentas.list.js @@ -55,6 +55,7 @@ class TipoCuenta { const tipos_cuentas = { id: '#tipos_cuentas', tipos: [], + modal: null, getTipos: function() { this.tipos = [] return sendGet(_urls.api + '/tipos/cuentas').then((data) => { diff --git a/ui/public/assets/scripts/uploads.list.js b/ui/public/assets/scripts/uploads.list.js index 012618d..5251968 100644 --- a/ui/public/assets/scripts/uploads.list.js +++ b/ui/public/assets/scripts/uploads.list.js @@ -57,31 +57,40 @@ const archivos = { add: null, edit: null }, - get: function() { + build: function() { return { - parent: () => { - let parent = $(this.id).find('tbody') - if (parent.length === 0) { - const table = $('
').attr('class', 'ui striped table').append( - $('').append( - $('').append( - $('').html('Archivo') - ).append( - $('').attr('class', 'right aligned').append( - $('').attr('class', 'ui tiny green circular icon button').append( - $('').attr('class', 'plus icon') - ).click((e) => { - e.preventDefault() - this.add() - return false - }) - ) + parent: (segment) => { + const table = $('
').attr('class', 'ui striped table').append( + $('').append( + $('').append( + $('').html('Archivo') + ).append( + $('').attr('class', 'right aligned').append( + $('').attr('class', 'ui tiny green circular icon button').append( + $('').attr('class', 'plus icon') + ).click((e) => { + e.preventDefault() + this.add() + return false + }) ) ) ) - parent = $('') - table.append(parent) - $(this.id).append(table) + ) + const parent = $('') + table.append(parent) + segment.append(table) + return parent + } + } + }, + get: function() { + return { + parent: () => { + const segment = $(this.id) + let parent = segment.find('tbody') + if (parent.length === 0) { + parent = this.build().parent(segment) } return parent }, diff --git a/ui/resources/views/categorias/base.blade.php b/ui/resources/views/categorias/base.blade.php index 4b14c94..2146949 100644 --- a/ui/resources/views/categorias/base.blade.php +++ b/ui/resources/views/categorias/base.blade.php @@ -8,7 +8,7 @@ Categorías @endif -
+
@yield('categorias_content')
@endsection diff --git a/ui/resources/views/categorias/tipos/base.blade.php b/ui/resources/views/categorias/tipos/base.blade.php index a1a0944..49d6c00 100644 --- a/ui/resources/views/categorias/tipos/base.blade.php +++ b/ui/resources/views/categorias/tipos/base.blade.php @@ -8,7 +8,7 @@ Tipos Categoría @endif -
+
@yield('tipos_categorias_content')
@endsection diff --git a/ui/resources/views/config/list.blade.php b/ui/resources/views/config/list.blade.php index 4499e0f..408f8df 100644 --- a/ui/resources/views/config/list.blade.php +++ b/ui/resources/views/config/list.blade.php @@ -1 +1,8 @@ @extends('config.base') + +@section('config_content') +

Configuraciones Generales

+
+ +
+@endsection diff --git a/ui/resources/views/cuentas/base.blade.php b/ui/resources/views/cuentas/base.blade.php index c8d6d8d..6d20fd5 100644 --- a/ui/resources/views/cuentas/base.blade.php +++ b/ui/resources/views/cuentas/base.blade.php @@ -8,7 +8,7 @@ Cuentas @endif -
+
@yield('cuentas_content')
@endsection diff --git a/ui/resources/views/home.blade.php b/ui/resources/views/home.blade.php index a96590e..9690e6a 100644 --- a/ui/resources/views/home.blade.php +++ b/ui/resources/views/home.blade.php @@ -4,6 +4,7 @@

Contabilidad

+
@endsection @push('scripts') diff --git a/ui/resources/views/uploads/base.blade.php b/ui/resources/views/uploads/base.blade.php index 731187e..9c0a995 100644 --- a/ui/resources/views/uploads/base.blade.php +++ b/ui/resources/views/uploads/base.blade.php @@ -8,7 +8,7 @@ Archivos @endif -
+
@yield('uploads_content')
@endsection diff --git a/ui/resources/views/uploads/list.blade.php b/ui/resources/views/uploads/list.blade.php index 6addb02..675f3f7 100644 --- a/ui/resources/views/uploads/list.blade.php +++ b/ui/resources/views/uploads/list.blade.php @@ -1,6 +1,7 @@ @extends('uploads.base') @section('uploads_content') +

cUhf&CKF@F5_j{_KojM7(){ zJu`zqoxKT{QoASla>K9PXi9D^JKM%Afg=19RzNh741QJ&k)BoX0cTEmZY@k=XRp-J zWJ9>_Iw|4QXKlG|(Q1R#;iP}1`C!hG0Y(bACNG#^l;C&x6>hgSWOhq9#D_>&Vl!JO zf#k0qr(2sBTrm_%w=BFNipoh7Jr25e4>J9ZI0EX_5uHKKCy~X5?RQ$kA_~d-#x6pYf_lZq>o`HxtzXqudC??ySvH@Nm#buzYaRti8Lsjw z#vsq=?Tta#2UkTu#LfWygEn@phP_dew`qQLA1%u5O4H%_N1}RnGra2KTtAp|i)DSI znBdJ4p+dn5*%<5NS?8kwT##*($pJ*gWnFa3MB8%pa9xTZeeCqG+jJ?&EJcs?VfGcFEs1BZ`Z9idNb{aaY`W@@<$_D!Lg^e`I zO!L@v!p`RhX1iahwmYk+xU{SrTd8wa7fE=QNG&={#bQ;CG9>cd7d}+o>;4tm;uLt- z=EYSi&G-?i2Z53xk!#~1q~lKd(MyrB6pP$C0~(n?TBnM^?y)@rc7=+TK02JTyL#YL0;RZq z<4v$y{m3`mz3Bhs(ZSGvcyw}--$Xix3`!a(D5Iz%D~zGcwQO9US^&6JwpMsBEloF5 zTMIK+0Qc{Pq?@a?qw_z{N*10Tj?U&T|FonrJiV)pqk{~Fd}c+0hN0`ZMdMPgH*q${%&!9gVrmTl2vef~+)?HMGVGj8zMxRFuDbbCp{$@a zxq6d%(q)zp050MlpWl$Q0o;xR2Myqq2($R%KlP~O2NnKS zQv<-D5IF3=@H}_6up}oD0)XL|`riek2*tSechCP8Ol0EkCxFAhWk5J4i1EApTLy-M z5y%@dAt*%X=2$Qo1`)cU2SUP;@S8F?1T*`8uK|R?AUD?lBfucw4LvXdiohI>|H21E zLclk%U;--0n|1)9;6Jc{5kR4v^T8l6#7)dV2xi6`>w@9PKgJ?KLVscbAwf6sf#EPD z=*D~)S0Vnu41^2al!4(8%kP$~gPF6Z6Q=w3)&09$=7}g=5)4NG zk+Lu-2nIqx5C|az9OFbe1QddR%gBPo|9=gGe}(Z(oL&F9h8VC2BqqAY!6A#1BPaPE DDf5U@ literal 0 HcmV?d00001 diff --git a/python/src/ai/dictionary.py b/python/src/ai/dictionary.py new file mode 100644 index 0000000..c42caef --- /dev/null +++ b/python/src/ai/dictionary.py @@ -0,0 +1,285 @@ +import json +import os + +import numpy as np +import sklearn +import enlighten +from sklearn.preprocessing import LabelEncoder + +import src.contabilidad.pdf as pdf +import src.contabilidad.text_handler as th +from src.ai.models import Phrase, phrase_factory, Word, word_factory +from src.contabilidad.log import LOG_LEVEL + + +class Dictionary: + def __init__(self, filename, logger): + self.filename = filename + self._logger = logger + self.__processed = [] + self.__phrases = None + self.__words = None + self.load() + + def load(self): + if not os.path.isfile(self.filename): + return + with open(self.filename, 'r') as file: + data = json.load(file) + if 'words' in data.keys(): + self.__words = [] + [self.__words.append(word_factory(w)) for w in data['words']] + if 'phrases' in data.keys(): + self.__phrases = [] + [self.__phrases.append(phrase_factory(ph)) for ph in data['phrases']] + if 'processed' in data.keys(): + self.__processed = [] + self.__processed = data['processed'] + + def save(self): + self.sort_words() + self.sort_phrases() + with open(self.filename, 'w') as file: + json.dump(self.to_json(), file, indent=2) + + def to_data(self): + encoder = LabelEncoder() + data = encoder.fit_transform([w.get_word() for w in self.get_words()]) + [self.__words[i].set_fit(f) for i, f in enumerate(data)] + print(data) + # return [ph.to_data() for ph in self.get_phrases()] + + def to_json(self): + output = { + 'processed': [], + 'words': [], + 'phrases': [] + } + if self.__processed is not None and len(self.__processed) > 0: + output['processed'] = self.__processed + if self.__words is not None and len(self.__words) > 0: + output['words'] = [w.to_json() for w in self.__words] + if self.__phrases is not None and len(self.__phrases) > 0: + output['phrases'] = [p.to_json() for p in self.__phrases] + return output + + def find_phrase(self, phrase: Phrase = None, phrase_dict: dict = None, phrase_list: list = None): + if not self.__phrases: + return -1 + if phrase is not None: + phrase_list = [w.get_word() for w in phrase.get_words()] + elif phrase_dict is not None: + phrase_list = phrase_dict['words'] + elif phrase_list is not None: + pass + else: + return -1 + return find_phrase(self.__phrases, phrase_list) + + def add_phrase(self, phrase: Phrase = None, phrase_dict: dict = None, phrase_list: list = None): + if self.__phrases is None: + self.__phrases = [] + if phrase is not None: + pass + elif phrase_dict is not None: + phrase = phrase_factory(phrase_dict) + elif phrase_list is not None: + phrase = phrase_factory({'words': phrase_list}) + else: + return self + i = self.find_phrase(phrase) + if i > -1: + self.__phrases[i].add_freq() + return self + self.__phrases.append(phrase) + return self + + def add_phrases(self, phrase_list: list): + if self.__phrases is None: + self.__phrases = [] + phs = [sorted(w.get_word() for w in p) for p in self.__phrases] + with enlighten.get_manager() as manager: + with manager.counter(total=len(phrase_list), desc='Phrases', unit='phrases', color='green') as bar1: + for i, phrase in enumerate(phrase_list): + # print(f'Adding phrase {i}.') + p2 = sorted([w.get_word() for w in phrase]) + if p2 in phs: + k = phs.index(p2) + self.__phrases[k].add_freq() + continue + ph = phrase_factory({'words': phrase}) + self.__phrases.append(ph) + phs.append(p2) + bar1.update() + + def get_phrases(self): + return self.__phrases + + def sort_phrases(self): + if self.__phrases is None: + return + try: + def sort_phrase(p): + if p is None: + return 0 + if isinstance(p, Phrase): + return p.get_freq(), p.get_type().get_desc(), len(p.get_words()) + return p['frequency'], p['type']['description'], len(p['words']) + self.__phrases = sorted(self.__phrases, + key=sort_phrase) + except Exception as e: + self._logger.log(repr(self.__phrases), LOG_LEVEL.ERROR) + self._logger.log(e) + return self + + def sort_words(self): + if self.__words is None: + return + try: + def sort_word(w): + if w is None: + return 0 + if isinstance(w, Word): + return w.get_freq(), w.get_type().get_desc(), w.get_word() + return w['frequency'], w['type']['description'], w['word'] + self.__words = sorted(self.__words, key=sort_word, reverse=True) + except Exception as e: + self._logger.log(repr(self.__words)) + self._logger.log(e) + return self + + def find_word(self, word: Word = None, word_dict: dict = None, word_str: str = None): + if not self.__words: + return -1 + if word is not None: + word_str = word.get_word() + elif word_dict is not None: + word_str = word_dict['word'] + elif word_str is not None: + pass + else: + return -1 + + return find_word(self.__words, word_str) + + def add_word(self, word: Word = None, word_dict: dict = None, word_str: str = None): + if self.__words is None: + self.__words = [] + if word is not None: + pass + elif word_dict is not None: + word = word_factory(word_dict) + elif word_str is not None: + word = word_factory({'word': word_str}) + else: + return self + i = self.find_word(word) + if i > -1: + self.__words[i].add_freq() + return self + self.__words.append(word) + return self + + def add_words(self, words: list): + [self.add_word(word=w) for w in words if isinstance(w, Word)] + [self.add_word(word_dict=w) for w in words if isinstance(w, dict)] + [self.add_word(word_str=w) for w in words if isinstance(w, str)] + return self + + def get_words(self): + return filter_unique_words(self.__words) + + def match_words(self, word_list: list): + new_list = [] + for w in word_list: + wi = self.find_word(word_str=w) + new_list.append(self.__words[wi]) + return new_list + + def append_to_phrase(self, seed: list = None, length: int = 1): + if seed is None: + return [self.__words[0]] + max_index = max(seed) + length + if max_index > len(self.__words): + if length == 1: + return False + return self.append_to_phrase(seed, length - 1) + return seed + self.__words[max_index] + + def get_possible_phrases(self, word_list): + print('Adding words.') + self.add_words(word_list) + + print('Creating phrases.') + with enlighten.get_manager() as manager: + with manager.counter(total=len(word_list)**2, desc='Phrases', unit='words', color='red') as bar1: + phrases = [] + for length in range(1, len(word_list) + 1): + bar2 = bar1.add_subcounter(color='green') + for start in range(0, len(word_list)): + phrase = build_phrase(word_list, start, start + length) + phrase = self.match_words(phrase) + phrases.append(phrase) + start += length + bar2.update() + bar1.update() + + print(f'Created {len(phrases)} phrases.') + phrases = sorted(phrases, key=lambda e: len(e)) + + print('Adding phrases.') + # Really slow (~115000 phrases in one pdf) + self.add_phrases(phrases) + return self.__phrases + + def is_processed(self, filename: str): + return os.path.basename(filename) in self.__processed + + def process(self, filename: str, password: str = None): + if self.is_processed(filename): + print('Already processed.') + return + t = filename.split('.') + temp = os.path.realpath(os.path.join(os.path.dirname(filename), t[0] + '-temp.pdf')) + print('Removing PDF encryption.') + pdf.remove_encryption(filename, password, temp) + print('Getting text') + obj = pdf.get_text(temp) + os.remove(temp) + print('Getting possible phrases.') + phrases = self.get_possible_phrases(th.split_words(obj)) + self.__processed.append(os.path.basename(filename)) + return phrases + + +def build_phrase(word_list, start: int, end: int = None): + if end is None: + return word_list[start:] + return word_list[start:end] + + +def filter_unique_words(words): + new_list = [] + for w in words: + if w not in new_list: + new_list.append(w) + return new_list + + +def validate_phrase(phrase): + return True + + +def find_phrase(phrases: list, phrase: list): + phrase_list = [sorted([w.get_word() for w in p.get_words()]) for p in phrases] + sphrase = sorted(phrase) + if sphrase in phrase_list: + return phrase_list.index(sphrase) + return -1 + + +def find_word(words: list, word: str): + word_list = [w.get_word() for w in words] + if word in word_list: + return word_list.index(word) + return -1 diff --git a/python/src/ai/models.py b/python/src/ai/models.py new file mode 100644 index 0000000..184a0ba --- /dev/null +++ b/python/src/ai/models.py @@ -0,0 +1,243 @@ +import json + + +class Type: + def __init__(self, _id, _description): + self.__id = _id + self.__description = _description + + def get_id(self): + return self.__id + + def get_desc(self): + return self.__description + + def to_json(self): + return self.get_id() + + def __repr__(self): + return json.dumps({ + 'id': self.get_id(), + 'description': self.get_desc() + }) + + +def type_factory(_type: str, _id: int): + if _type == 'Word' or _type == 'WordType': + t = WordType() + elif _type == 'Phrase' or _type == 'PhraseType': + t = PhraseType() + else: + return None + t.load(_id) + return t + + +class WordType(Type): + STRING = 0 + NUMERIC = 1 + CURRENCY = 2 + DATE = 4 + + def __init__(self): + super().__init__(0, 'string') + + def load(self, word_type: int): + if word_type == self.STRING: + self.__description = 'string' + elif word_type == self.NUMERIC: + self.__description = 'numeric' + elif word_type == self.CURRENCY: + self.__description = 'currency' + elif word_type == self.DATE: + self.__description = 'date' + return self + + +class PhraseType(Type): + TEXT = 0 + TITLE = 1 + HEADER = 2 + MOVEMENT = 4 + INVALID = 99 + + def __init__(self): + super(PhraseType, self).__init__(0, 'text') + + def load(self, phrase_type: int): + if phrase_type == self.TEXT: + self.__description = 'text' + elif phrase_type == self.TITLE: + self.__description = 'title' + elif phrase_type == self.HEADER: + self.__description = 'header' + + +class Word: + def __init__(self): + self.__id = 0 + self.__word = None + self.__type_id = 0 + self.__type = None + self.__frequency = 1 + + def set_id(self, idx: int): + self.__id = idx + return self + + def set_word(self, word: str): + self.__word = word + return self + + def set_type(self, word_type): + if isinstance(word_type, WordType): + self.__type_id = word_type.get_id() + # self.__type = word_type + if isinstance(word_type, int): + self.__type_id = word_type + # self.__type = type_factory('Word', word_type) + return self + + def add_freq(self, amount: int = 1): + self.__frequency += amount + return self + + def get_id(self) -> int: + return self.__id + + def get_word(self) -> str: + return self.__word + + def get_type_id(self) -> int: + return self.__type_id + + def get_type(self) -> WordType: + if self.__type is None: + self.__type = type_factory('Word', self.__type_id) + return self.__type + + def get_freq(self) -> int: + return self.__frequency + + def to_json(self) -> dict: + output = { + 'id': self.get_id(), + 'word': self.get_word(), + 'type': self.get_type_id(), + 'freq': self.get_freq() + } + return output + + def __repr__(self): + return json.dumps(self.to_json()) + + +def word_factory(word: dict) -> Word: + w = Word() + w.set_id(word['id']) + w.set_word(word['word']) + if 'type' in word: + w.set_type(word['type']) + if 'freq' in word: + w.add_freq(word['freq'] - 1) + return w + + +class Phrase: + def __init__(self): + self.__id = 0 + self.__words = None + self.__type_id = 0 + self.__type = None + self.__frequency = 1 + + def set_id(self, idx: int): + self.__id = idx + return self + + def add_word(self, word): + if isinstance(word, Word): + self.__words.append(word.get_id()) + if isinstance(word, dict): + if 'id' in word: + self.__words.append(word['id']) + if isinstance(word, int): + self.__words.append(word) + return self + + def set_words(self, words: list): + if self.__words is None: + self.__words = [] + for w in words: + if isinstance(w, Word): + self.add_word(w) + if isinstance(w, dict): + self.add_word(w) + if isinstance(w, int): + self.add_word(w) + return self + + def set_type(self, phrase_type): + if isinstance(phrase_type, PhraseType): + self.__type_id = phrase_type.get_id() + # self.__type = phrase_type + if isinstance(phrase_type, int): + self.__type_id = phrase_type + # self.__type = type_factory('Phrase', phrase_type) + return self + + def add_freq(self, amount: int = 1): + self.__frequency += amount + return self + + def get_id(self) -> int: + return self.__id + + def get_words(self) -> list: + return self.__words + + def get_type_id(self) -> int: + return self.__type_id + + def get_type(self) -> PhraseType: + if self.__type is None: + self.__type = type_factory('Phrase', self.__type_id) + return self.__type + + def get_freq(self) -> int: + return self.__frequency + + def match(self, word_list: list): + if len(word_list) != len(self.__words): + return False + new_words = sorted(self.__words) + new_list = sorted(word_list) + if new_words == new_list: + return True + return False + + def to_json(self): + output = { + 'id': self.get_id(), + 'words': self.get_words(), + 'type': self.get_type_id(), + 'freq': self.get_freq() + } + return output + + def __repr__(self): + return json.dumps(self.to_json()) + + def __len__(self): + return len(self.get_words()) + + +def phrase_factory(phrase: dict) -> Phrase: + ph = Phrase() + ph.set_id(phrase['id']) + ph.set_words(phrase['words']) + if 'type' in phrase: + ph.set_type(phrase['type']) + if 'freq' in phrase: + ph.add_freq(phrase['freq'] - 1) + return ph diff --git a/python/src/ai/network.py b/python/src/ai/network.py new file mode 100644 index 0000000..10d2d31 --- /dev/null +++ b/python/src/ai/network.py @@ -0,0 +1,123 @@ +import json +import os +import tensorflow as tf +import sklearn +import numpy as np +from sklearn.preprocessing import LabelEncoder + +import src.contabilidad.pdf as pdf +import src.contabilidad.text_handler as th + + +class Layer: + def __init__(self): + self.__weights = None + self.__bias = None + + def set_size(self, inputs: int, size: int): + self.__weights = [[0 for j in range(0, inputs)] for i in range(0, size)] + self.__bias = [0 for i in range(0, size)] + + def add_weight(self, vector: list, idx: int = None): + if idx is None: + self.__weights.append(vector) + return self + self.__weights = self.__weights[:idx] + [vector] + self.__weights[idx:] + return self + + def set_weight(self, value: float, weight_index: int, input_index: int): + self.__weights[weight_index][input_index] = value + + def set_bias(self, value: list): + self.__bias = value + + def train(self, input_values: list, output_values: list): + output = self.get_output(input_values) + errors = [] + for i, v in enumerate(output): + error = (output_values[i] - v) / output_values[i] + new_value = v * error + + def to_json(self): + return { + 'bias': self.__bias, + 'weights': self.__weights + } + + def get_output(self, vector: list): + output = [] + for i, weight in enumerate(self.__weights): + val = 0 + for j, v in enumerate(weight): + val += v * vector[j] + output[i] = val + self.__bias[i] + return output + + +def layer_factory(layer_dict: dict): + layer = Layer() + layer.set_bias(layer_dict['bias']) + [layer.add_weight(w) for w in layer_dict['weights']] + return layer + + +class Network: + def __init__(self, filename: str): + self._filename = filename + self.__layers = None + + def load(self): + with open(self._filename) as f: + data = json.load(f) + if 'layers' in data.keys(): + self.add_layers(data['layers']) + + def add_layers(self, layers: list): + for lr in layers: + layer = layer_factory(lr) + self.__layers.append(layer) + + +class AI: + def __init__(self, dictionary_filename, logger): + self.__dict = None + self.__network = None + self.__sources = None + self.filename = '' + + def add_source(self, text): + if self.__sources is None: + self.__sources = [] + self.__sources.append(text) + return self + + def set_filename(self, filename: str): + self.filename = filename + return self + + def process_sources(self): + for source in self.__sources: + self.process(**source) + + def process(self, filename, password): + encoder = LabelEncoder() + t = filename.split('.') + temp = os.path.realpath(os.path.join(os.path.dirname(filename), t[0] + '-temp.pdf')) + pdf.remove_encryption(filename, password, temp) + obj = pdf.get_text(temp) + os.remove(temp) + word_list = th.split_words(obj) + fits = encoder.fit_transform(word_list) + print(fits) + phrases = [] + for length in range(1, len(word_list) + 1): + for start in range(0, len(word_list)): + phrase = word_list[start:(start + length)] + phrase = np.append(np.array([fits[word_list.index(w)] for w in phrase]), + np.zeros([len(word_list) - len(phrase)])) + phrases.append(phrase) + phrases = np.array(phrases) + print(phrases.shape) + + def active_train(self): + pass diff --git a/python/src/ai/phrase.py b/python/src/ai/phrase.py new file mode 100644 index 0000000..a80a325 --- /dev/null +++ b/python/src/ai/phrase.py @@ -0,0 +1,102 @@ +import json +from src.ai.word import Word, WordType + + +class PhraseType: + TEXT = 0 + TITLE = 1 + HEADER = 2 + MOVEMENT = 3 + INVALID = 99 + + def __init__(self): + self.__id = 0 + self.__description = 'text' + + def get_id(self): + return self.__id + + def get_desc(self): + return self.__description + + def to_json(self): + return self.__id + + def load(self, phrase_id: int): + self.__id = phrase_id + if phrase_id == self.TITLE: + self.__description = 'title' + elif phrase_id == self.HEADER: + self.__description = 'header' + elif phrase_id == self.MOVEMENT: + self.__description = 'movement' + elif phrase_id == self.INVALID: + self.__description = 'invalid' + return self + + +def phrase_factory(phrase: list, phrase_type: int = None, frec: int = 1): + pt = PhraseType() + if phrase_type is not None: + pt.load(phrase_type) + ph = Phrase() + ph.set_phrase(phrase).set_type(pt).add_frec(frec - 1) + return ph + + +class Phrase: + def __init__(self): + self.__phrase = None + self.__type = None + self.__frec = 1 + + def to_json(self): + return { + 'phrase': [w.to_json() for w in self.__phrase], + 'type': self.__type.to_json(), + 'frec': self.__frec + } + + def set_phrase(self, phrase: list): + [self.add_word(w) for w in phrase] + return self + + def get_phrase(self): + return self.__phrase + + def set_type(self, phrase_type: PhraseType): + self.__type = phrase_type + return self + + def get_type(self): + return self.__type + + def add_word(self, word: Word, pos: int = None): + if self.__phrase is None: + self.__phrase = [] + if pos is None: + self.__phrase.append(word) + return self + self.__phrase = self.__phrase[:pos] + [word] + self.__phrase[pos:] + return self + + def add_frec(self, amount: int = 1): + self.__frec += amount + + def match(self, words: list): + if len(words) != len(self.__phrase): + return False + for w in self.__phrase: + if w not in words: + return False + return True + + def __repr__(self): + print(self.__phrase) + return json.dumps({ + 'phrase': [w.to_json() for w in self.get_phrase()], + 'type': self.get_type().get_desc() + }) + + def __len__(self): + return len(self.__phrase) diff --git a/python/src/ai/word.py b/python/src/ai/word.py new file mode 100644 index 0000000..274670a --- /dev/null +++ b/python/src/ai/word.py @@ -0,0 +1,84 @@ +import json + + +class WordType: + STRING = 0 + NUMERIC = 1 + CURRENCY = 2 + DATE = 3 + + def __init__(self): + self.__id = 0 + self.__description = 'string' + + def to_json(self): + return self.__id + + def load(self, word_id: int): + self.__id = word_id + if word_id == self.NUMERIC: + self.__description = 'numeric' + elif word_id == self.CURRENCY: + self.__description = 'currency' + elif word_id == self.DATE: + self.__description = 'data' + return self + + def get_id(self): + return self.__id + + def get_desc(self): + return self.__description + + def __repr__(self): + return { + 'id': self.get_id(), + 'description': self.get_desc() + } + + +def word_factory(word: str, word_type: int = None, frec: int = 1): + wt = WordType() + if word_type is not None: + wt.load(word_type) + w = Word() + w.set_word(word).set_type(wt).add_frec(frec - 1) + return w + + +class Word: + def __init__(self): + self.__word = None + self.__type = None + self.__frec = 1 + + def to_json(self): + return { + 'word': self.__word, + 'type': self.__type.to_json(), + 'frec': self.__frec + } + + def set_word(self, word: str): + self.__word = word + return self + + def get_word(self): + return self.__word + + def set_type(self, word_type: WordType): + self.__type = word_type + return self + + def get_type(self): + return self.__type + + def add_frec(self, amount: int = 1): + self.__frec += amount + return self + + def __repr__(self): + return json.dumps({ + 'word': self.get_word(), + 'type': self.get_type().get_desc() + }) From 25f873c4530f69530cbd5407cc770217bb177737 Mon Sep 17 00:00:00 2001 From: Aldarien Date: Mon, 6 Dec 2021 22:13:57 -0300 Subject: [PATCH 02/25] Python --- python/Dockerfile | 5 +- python/config/.passwords.yml | 1 + python/src/app.py | 62 +++++++++- python/src/contabilidad/log.py | 72 +++++++++-- python/src/contabilidad/text_handler.py | 156 ++++++++++++++++++------ python/src/main.py | 45 +++++-- 6 files changed, 275 insertions(+), 66 deletions(-) diff --git a/python/Dockerfile b/python/Dockerfile index 1eedf44..96ee6c3 100644 --- a/python/Dockerfile +++ b/python/Dockerfile @@ -2,7 +2,7 @@ FROM python RUN apt-get update -y && apt-get install -y ghostscript python3-tk libgl-dev -RUN pip install flask pyyaml pypdf4 gunicorn camelot-py[cv] pikepdf +RUN pip install flask pyyaml pypdf4 gunicorn camelot-py[cv] pikepdf httpx WORKDIR /app @@ -12,4 +12,5 @@ EXPOSE 5000 WORKDIR /app/src -CMD ["gunicorn", "-b 0.0.0.0:5000", "app:app"] +CMD ["python", "app.py"] +#CMD ["gunicorn", "-b 0.0.0.0:5000", "app:app"] diff --git a/python/config/.passwords.yml b/python/config/.passwords.yml index f44e275..1acd267 100644 --- a/python/config/.passwords.yml +++ b/python/config/.passwords.yml @@ -1,3 +1,4 @@ passwords: - 0839 - 159608395 + - 15960839 diff --git a/python/src/app.py b/python/src/app.py index 5722eb2..a372365 100644 --- a/python/src/app.py +++ b/python/src/app.py @@ -1,22 +1,40 @@ -import io import json import os import sys -from flask import Flask, request +import httpx +from flask import Flask, request, jsonify import contabilidad.pdf as pdf import contabilidad.passwords as passwords -import contabilidad.log as log import contabilidad.text_handler as th +from contabilidad.log import Log app = Flask(__name__) -log.logging['filename'] = '/var/log/python/contabilidad.log' +log = Log('/var/log/python/contabilidad.log') +api_key = os.environ.get('PYTHON_KEY') + + +def validate_key(request_obj): + if 'Authorization' in request_obj.headers: + auth = request_obj.headers.get('Authorization') + if isinstance(auth, list): + auth = auth[0] + if 'Bearer' in auth: + auth = auth.split(' ')[1] + return auth == api_key + if 'API_KEY' in request_obj.values: + return request_obj.values.get('API_KEY') == api_key + if 'api_key' in request_obj.values: + return request_obj.values.get('api_key') == api_key + return False @app.route('/pdf/parse', methods=['POST']) def pdf_parse(): + if not validate_key(request): + return jsonify({'message': 'Not Authorized'}) data = request.get_json() if not isinstance(data['files'], list): data['files'] = [data['files']] @@ -32,6 +50,11 @@ def pdf_parse(): continue pdf.remove_encryption(filename, p, temp) obj = pdf.get_data(temp) + try: + text = th.text_cleanup(pdf.get_text(temp)) + except IndexError as ie: + print(ie, file=sys.stderr) + continue outputs = [] for o in obj: out = json.loads(o.df.to_json(orient='records')) @@ -48,8 +71,35 @@ def pdf_parse(): out[i] = line outputs.append(out) os.remove(temp) - output.append({'filename': file['filename'], 'text': outputs}) - return json.dumps(output) + output.append({'bank': text['bank'], 'filename': file['filename'], 'tables': outputs, 'text': text['text']}) + return jsonify(output) + + +@app.route('/cambio/get', methods=['POST']) +def cambios(): + if not validate_key(request): + return jsonify({'message': 'Not Authorized'}) + data = request.get_json() + valid = { + "CLF": "uf", + "IVP": "ivp", + "USD": "dolar", + "USDo": "dolar_intercambio", + "EUR": "euro", + "IPC": "ipc", + "UTM": "utm", + "IMACEC": "imacec", + "TPM": "tpm", + "CUP": "libra_cobre", + "TZD": "tasa_desempleo", + "BTC": "bitcoin" + } + base_url = 'https://mindicador.cl/api/' + url = f"{base_url}{valid[data['desde']]}/{'-'.join(list(reversed(data['fecha'].split('-'))))}" + res = httpx.get(url) + if res.status_code != httpx.codes.OK: + return jsonify({'error': 'Valor no encontrado.'}) + return jsonify(res.json()) if __name__ == '__main__': diff --git a/python/src/contabilidad/log.py b/python/src/contabilidad/log.py index c16024d..a1d908b 100644 --- a/python/src/contabilidad/log.py +++ b/python/src/contabilidad/log.py @@ -1,19 +1,65 @@ +import os.path import time - - -logging = { - 'filename': '/var/log/python/error.log' -} +import traceback class LOG_LEVEL: - INFO = 'INFO' - WARNING = 'WARNING' - DEBUG = 'DEBUG' - ERROR = 'ERROR' + INFO = 0 + WARNING = 1 + DEBUG = 2 + ERROR = 4 + + @staticmethod + def desc(level): + mapping = { + LOG_LEVEL.INFO: 'INFO', + LOG_LEVEL.WARNING: 'WARNING', + LOG_LEVEL.DEBUG: 'DEBUG', + LOG_LEVEL.ERROR: 'ERROR' + } + return mapping[level] -def log(message, level=LOG_LEVEL.INFO): - filename = logging['filename'] - with open(filename, 'a') as f: - f.write(time.strftime('[%Y-%m-%d %H:%M:%S] ') + ' - ' + level + ': ' + message) +class Logger: + def __init__(self): + self._logs = [] + + def add_log(self, filename: str, min_level: int = LOG_LEVEL.INFO): + self._logs.append({'log': Log(filename), 'level': min_level}) + self._logs.sort(key=lambda e: e['level']) + return self + + def log(self, message, level: int = LOG_LEVEL.INFO): + for log in self._logs: + if log['level'] >= level: + log['log'].log(message, level) + + +class Log: + MAX_SIZE = 10 * 1024 * 1024 + + def __init__(self, filename: str = '/var/log/python/error.log'): + self._filename = filename + + def log(self, message, level: int = LOG_LEVEL.INFO): + if isinstance(message, Exception): + message = traceback.format_exc() + if level < LOG_LEVEL.ERROR: + level = LOG_LEVEL.ERROR + self.rotate_file() + with open(self._filename, 'a') as f: + f.write(time.strftime('[%Y-%m-%d %H:%M:%S] ') + ' - ' + LOG_LEVEL.desc(level=level) + ': ' + message + "\n") + + def rotate_file(self): + if not os.path.isfile(self._filename): + return + file_size = os.path.getsize(self._filename) + if file_size > self.MAX_SIZE: + self.next_file() + + def next_file(self): + name = self._filename.split('.') + n = 1 + if name[-2].isnumeric(): + n = int(name[-2]) + 1 + self._filename = '.'.join([name[0], str(n), name[-1]]) diff --git a/python/src/contabilidad/text_handler.py b/python/src/contabilidad/text_handler.py index 27690ad..6d5240c 100644 --- a/python/src/contabilidad/text_handler.py +++ b/python/src/contabilidad/text_handler.py @@ -1,48 +1,112 @@ -def text_cleanup(text, filename: str = None): +def text_cleanup(text: str): if isinstance(text, list): - output = [] - for t in text: - output.append(text_cleanup(t, filename=filename)) - return output - if filename is None: - return text - if 'bice' in filename.lower(): - return bice(text) - if 'scotiabank' in filename.lower(): - return scotiabank(text) - return text + text = "\n\n\n".join(text) + if 'bice' in text.lower(): + return {'bank': 'BICE', 'text': bice(text)} + if 'scotiabank' in text.lower(): + return {'bank': 'Scotiabank', 'text': scotiabank(text)} + if 'TARJETA' in text: + return {'bank': 'Scotiabank', 'text': tarjeta(text)} + return {'bank': 'unknown', 'text': basic(text)} def bice(text): - lines = text.split("\n\n\n") - print(lines) - return text + lines = [t2.strip() for t in text.split("\n\n\n") + for t1 in t.split("\n\n") for t2 in t1.split("\n") if t2.strip() != ''] + output = [] + output += extract_from_to(lines, 'NOMBRE DEL CLIENTE', end='LAS CONDES', line_length=3) + ti = [t for t in lines if 'MOVIMIENTOS DE LA CUENTA CORRIENTE' in t][0] + output += extract_from_to(lines, 'LAS CONDES', end=ti, line_length=3) + output += [ti] + ti = [i for i, t in enumerate(lines) if 'FECHA' in t] + output += extract_from_to(lines, ti[0], end=ti[1], line_length=4) + output += extract_from_to(lines, 'RESUMEN DEL PERIODO', end='SALDO INICIAL', line_length=1) + output += extract_from_to(lines, 'SALDO INICIAL', end='LINEA SOBREGIRO AUTORIZADA', line_length=4) + output += extract_from_to(lines, 'LINEA SOBREGIRO AUTORIZADA', end='OBSERVACIONES', line_length=3) + output += extract_from_to(lines, 'OBSERVACIONES', line_length=1) + return output def scotiabank(text): - words = text.split("\n") + words = split_words(text) output = [words[0]] - output = output + extract_from_to(words, 'No. CTA.', end='VENCIMIENTO LINEA DE CREDITO', line_length=3) - output = output + extract_from_to(words, 'VENCIMIENTO LINEA DE CREDITO', - end='NOMBRE EJECUTIVO: LILIAN AVILA MANRIQUEZ', line_length=2) - output = output + extract_from_to(words, 'NOMBRE EJECUTIVO: LILIAN AVILA MANRIQUEZ', end='SALDO ANTERIOR', - line_length=1) - output = output + extract_from_to(words, 'SALDO ANTERIOR', end='FECHA', line_length=4) - output = output + extract_data(words, 'FECHA', end='ACTUALICE SIEMPRE ANTECEDENTES LEGALES, ', line_length=6, - merge_list=[['DOCTO', 'No.'], ['SALDO', 'DIARIO']]) - [print(li) for li in output] - return text + output += extract_from_to(words, 'No. CTA.', end='VENCIMIENTO LINEA DE CREDITO', line_length=3) + output += extract_from_to(words, 'VENCIMIENTO LINEA DE CREDITO', + end='NOMBRE EJECUTIVO: LILIAN AVILA MANRIQUEZ', line_length=2) + output += extract_from_to(words, 'NOMBRE EJECUTIVO: LILIAN AVILA MANRIQUEZ', end='SALDO ANTERIOR', + line_length=1) + output += extract_from_to(words, 'SALDO ANTERIOR', end='FECHA', line_length=4) + output += extract_data(words, 'FECHA', end='ACTUALICE SIEMPRE ANTECEDENTES LEGALES, ', line_length=6, + merge_list=[['DOCTO', 'No.'], ['SALDO', 'DIARIO']]) + output += extract_from_to(words, 'ACTUALICE SIEMPRE ANTECEDENTES LEGALES, ', 1) + return output -def extract_from_to(word_list, start, line_length, end: str = None, merge_list=None): +def tarjeta(text): + words = split_words(text) + output = ['ESTADO DE CUENTA NACIONAL DE TARJETA DE CRÉDITO'] + i = [i for i, w in enumerate(words) if 'FECHA ESTADO DE CUENTA' in w][0] + 2 + output += extract_from_to(words, 'NOMBRE DEL TITULAR', end=i, line_length=2) + output += ['I. INFORMACIóN GENERAL'] + i = [i for i, w in enumerate(words) if 'CUPO TOTAL' in w][1] + output += extract_from_to(words, 'CUPO TOTAL', end=i, line_length=3) + output += extract_from_to(words, i, end='ROTATIVO', line_length=4) + output += extract_from_to(words, 'ROTATIVO', end='TASA INTERÉS VIGENTE', line_length=3) + output += extract_from_to(words, 'TASA INTERÉS VIGENTE', + end='CAE se calcula sobre un supuesto de gasto mensual de UF 20 y pagadero en 12 cuotas.', + line_length=4) + output += extract_from_to(words, 'DESDE', end='PERÍODO FACTURADO', line_length=2) + output += extract_from_to(words, 'PERÍODO FACTURADO', end='II.', line_length=3) + output += ['II. DETALLE'] + output += extract_from_to(words, '1. PERÍODO ANTERIOR', end='SALDO ADEUDADO INICIO PERÍODO ANTERIOR', line_length=3) + i = words.index('2. PERÍODO ACTUAL') + output += extract_from_to(words, 'SALDO ADEUDADO INICIO PERÍODO ANTERIOR', end=i - 1, line_length=2, + merge_list=[['MONTO FACTURADO A PAGAR (PERÍODO ANTERIOR)', '(A)']], merge_character=" ") + output += ['2. PERÍODO ACTUAL'] + output += extract_from_to(words, 'LUGAR DE', end='1.TOTAL OPERACIONES', line_length=7, + merge_list=[['OPERACIÓN', 'O COBRO'], ['TOTAL A', 'PAGAR'], ['VALOR CUOTA', 'MENSUAL']]) + i = words.index('1.TOTAL OPERACIONES') + 3 + output += extract_from_to(words, '1.TOTAL OPERACIONES', end=i, line_length=3) + output += extract_from_to(words, i, end='TOTAL PAGOS A LA CUENTA', line_length=7) + i = words.index('TOTAL PAGOS A LA CUENTA') + 2 + output += extract_from_to(words, 'TOTAL PAGOS A LA CUENTA', end=i, line_length=2) + output += extract_from_to(words, i, end='TOTAL PAT A LA CUENTA', line_length=8) + i = words.index('TOTAL PAT A LA CUENTA') + 2 + output += extract_from_to(words, 'TOTAL PAT A LA CUENTA', end=i, line_length=2) + output += extract_from_to(words, i, end=i + 3, line_length=2, + merge_list=[ + ['2.PRODUCTOS O SERVICIOS VOLUNTARIAMENTE CONTRATADOS SIN MOVIMIENTOS', '(C)']], + merge_character=" ") + if '3.CARGOS, COMISIONES, IMPUESTOS Y ABONOS' in words: + i = words.index('3.CARGOS, COMISIONES, IMPUESTOS Y ABONOS') + 3 + output += extract_from_to(words, '3.CARGOS, COMISIONES, IMPUESTOS Y ABONOS', end=i, line_length=3) + return output + + +def basic(text): + return split_words(text) + + +def split_words(text): + if isinstance(text, list): + text = "\n\n\n".join(text) + words = [t.strip() for t in text.split("\n") if t.strip() != ''] + return words + + +def extract_from_to(word_list, start, line_length, end=None, merge_list=None, merge_character="\n"): + if not isinstance(start, int): + start = word_list.index(start) if end is not None: - return extract_by_line(word_list[word_list.index(start):word_list.index(end)], line_length, merge_list) - return extract_by_line(word_list[word_list.index(start):], line_length, merge_list) + if not isinstance(end, int): + end = word_list.index(end) + return extract_by_line(word_list[start:end], line_length, merge_list, merge_character) + return extract_by_line(word_list[start:], line_length, merge_list, merge_character) -def extract_by_line(word_list, line_length, merge_list=None): +def extract_by_line(word_list, line_length, merge_list=None, merge_character="\n"): if merge_list is not None: - word_list = merge_words(word_list, merge_list) + word_list = merge_words(word_list, merge_list, merge_character) output = [] line = [] for k, w in enumerate(word_list): @@ -54,22 +118,39 @@ def extract_by_line(word_list, line_length, merge_list=None): return output -def merge_words(word_list, merge_list): +def merge_words(word_list, merge_list, merge_character): for m in merge_list: - i = word_list.index(m[0]) - word_list = word_list[:i] + ["\n".join(m)] + word_list[i+len(m):] + ixs = find_words(word_list, m) + if ixs is None: + continue + for i in ixs: + word_list = word_list[:i] + [merge_character.join(m)] + word_list[i + len(m):] return word_list -def extract_data(word_list, start, line_length, end=None, merge_list=None, date_sep='/'): +def find_words(word_list, find_list): + ixs = [i for i, w in enumerate(word_list) if find_list[0] == w] + output = [] + for i in ixs: + mistake = False + for k, m in enumerate(find_list): + if m != word_list[i + k]: + mistake = True + break + if mistake: + continue + output.append(i) + return output + + +def extract_data(word_list, start, line_length, end=None, merge_list=None, merge_character="\n", date_sep='/'): word_list = word_list[word_list.index(start):] if end is not None: word_list = word_list[:word_list.index(end)] if merge_list is not None: - word_list = merge_words(word_list, merge_list) + word_list = merge_words(word_list, merge_list, merge_character) output = [] line = [] - line_num = 0 col = 0 for k, w in enumerate(word_list): if col > 0 and col % line_length == 0: @@ -87,4 +168,5 @@ def extract_data(word_list, start, line_length, end=None, merge_list=None, date_ continue line.append(w) col += 1 + output.append(line) return output diff --git a/python/src/main.py b/python/src/main.py index 229b132..bcbd999 100644 --- a/python/src/main.py +++ b/python/src/main.py @@ -3,22 +3,51 @@ import os import contabilidad.pdf as pdf import contabilidad.text_handler as th +from contabilidad.log import Logger, LOG_LEVEL +import ai.dictionary as dictionary +from ai.network import AI + + +def parse_settings(args): + output = {'filename': args.filename} + if not os.path.isfile(output['filename']): + output['filename'] = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', 'data', args.filename)) + t = args.filename.split('.') + output['temp'] = os.path.realpath(os.path.join(os.path.dirname(output['filename']), t[0] + '-temp.pdf')) + output['dictionary'] = os.path.join(os.path.dirname(output['filename']), 'dictionary.json') + output['network'] = os.path.join(os.path.dirname(output['filename']), 'network.json') + output['log_file'] = args.log_file + if not os.path.isfile(output['log_file']): + output['log_file'] = os.path.join(os.path.dirname(os.path.dirname(output['filename'])), output['log_file']) + output['error_log_file'] = os.path.join(os.path.dirname(output['log_file']), 'error.log') + output['logger'] = Logger() + output['logger'].add_log(output['log_file']).add_log(output['error_log_file'], LOG_LEVEL.ERROR) + return output def main(args): - filename = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', 'data', args.filename)) - temp = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', 'data', args.temp_filename)) - pdf.remove_encryption(filename, args.password, temp) - obj = pdf.get_data(temp) - obj = pdf.get_text(filename, args.password) - text = th.text_cleanup(obj, filename=str(args.filename)) - os.remove(temp) + settings = parse_settings(args) + + print('Loading AI') + network = AI(settings['dictionary'], settings['logger']) + network.set_filename(settings['network']) + network.add_source({'filename': settings['filename'], 'password': args.password}) + network.process_sources() + exit() + + print('Loading dictionary.') + dictio = dictionary.Dictionary(settings['dictionary'], settings['logger']) + print('Getting possible phrases.') + dictio.process(settings['filename'], args.password) + dictio.to_data() + # print('Saving dictionary.') + # dictio.save() if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('-f', '--filename', type=str) parser.add_argument('-p', '--password', type=str, default='') - parser.add_argument('-t', '--temp_filename', type=str) + parser.add_argument('-l', '--log_file', type=str, default=None) _args = parser.parse_args() main(_args) From 960c4188488a4dae6b3bea719af76d8e5e83b88c Mon Sep 17 00:00:00 2001 From: Aldarien Date: Thu, 9 Dec 2021 21:14:28 -0300 Subject: [PATCH 03/25] Python --- python/src/ai/network.py | 1 - python/src/ai/phrase.py | 102 ------------------ python/src/ai/word.py | 84 --------------- .../__pycache__/log.cpython-39.pyc | Bin 758 -> 0 bytes 4 files changed, 187 deletions(-) delete mode 100644 python/src/ai/phrase.py delete mode 100644 python/src/ai/word.py delete mode 100644 python/src/contabilidad/__pycache__/log.cpython-39.pyc diff --git a/python/src/ai/network.py b/python/src/ai/network.py index 10d2d31..928ecac 100644 --- a/python/src/ai/network.py +++ b/python/src/ai/network.py @@ -108,7 +108,6 @@ class AI: os.remove(temp) word_list = th.split_words(obj) fits = encoder.fit_transform(word_list) - print(fits) phrases = [] for length in range(1, len(word_list) + 1): for start in range(0, len(word_list)): diff --git a/python/src/ai/phrase.py b/python/src/ai/phrase.py deleted file mode 100644 index a80a325..0000000 --- a/python/src/ai/phrase.py +++ /dev/null @@ -1,102 +0,0 @@ -import json -from src.ai.word import Word, WordType - - -class PhraseType: - TEXT = 0 - TITLE = 1 - HEADER = 2 - MOVEMENT = 3 - INVALID = 99 - - def __init__(self): - self.__id = 0 - self.__description = 'text' - - def get_id(self): - return self.__id - - def get_desc(self): - return self.__description - - def to_json(self): - return self.__id - - def load(self, phrase_id: int): - self.__id = phrase_id - if phrase_id == self.TITLE: - self.__description = 'title' - elif phrase_id == self.HEADER: - self.__description = 'header' - elif phrase_id == self.MOVEMENT: - self.__description = 'movement' - elif phrase_id == self.INVALID: - self.__description = 'invalid' - return self - - -def phrase_factory(phrase: list, phrase_type: int = None, frec: int = 1): - pt = PhraseType() - if phrase_type is not None: - pt.load(phrase_type) - ph = Phrase() - ph.set_phrase(phrase).set_type(pt).add_frec(frec - 1) - return ph - - -class Phrase: - def __init__(self): - self.__phrase = None - self.__type = None - self.__frec = 1 - - def to_json(self): - return { - 'phrase': [w.to_json() for w in self.__phrase], - 'type': self.__type.to_json(), - 'frec': self.__frec - } - - def set_phrase(self, phrase: list): - [self.add_word(w) for w in phrase] - return self - - def get_phrase(self): - return self.__phrase - - def set_type(self, phrase_type: PhraseType): - self.__type = phrase_type - return self - - def get_type(self): - return self.__type - - def add_word(self, word: Word, pos: int = None): - if self.__phrase is None: - self.__phrase = [] - if pos is None: - self.__phrase.append(word) - return self - self.__phrase = self.__phrase[:pos] + [word] + self.__phrase[pos:] - return self - - def add_frec(self, amount: int = 1): - self.__frec += amount - - def match(self, words: list): - if len(words) != len(self.__phrase): - return False - for w in self.__phrase: - if w not in words: - return False - return True - - def __repr__(self): - print(self.__phrase) - return json.dumps({ - 'phrase': [w.to_json() for w in self.get_phrase()], - 'type': self.get_type().get_desc() - }) - - def __len__(self): - return len(self.__phrase) diff --git a/python/src/ai/word.py b/python/src/ai/word.py deleted file mode 100644 index 274670a..0000000 --- a/python/src/ai/word.py +++ /dev/null @@ -1,84 +0,0 @@ -import json - - -class WordType: - STRING = 0 - NUMERIC = 1 - CURRENCY = 2 - DATE = 3 - - def __init__(self): - self.__id = 0 - self.__description = 'string' - - def to_json(self): - return self.__id - - def load(self, word_id: int): - self.__id = word_id - if word_id == self.NUMERIC: - self.__description = 'numeric' - elif word_id == self.CURRENCY: - self.__description = 'currency' - elif word_id == self.DATE: - self.__description = 'data' - return self - - def get_id(self): - return self.__id - - def get_desc(self): - return self.__description - - def __repr__(self): - return { - 'id': self.get_id(), - 'description': self.get_desc() - } - - -def word_factory(word: str, word_type: int = None, frec: int = 1): - wt = WordType() - if word_type is not None: - wt.load(word_type) - w = Word() - w.set_word(word).set_type(wt).add_frec(frec - 1) - return w - - -class Word: - def __init__(self): - self.__word = None - self.__type = None - self.__frec = 1 - - def to_json(self): - return { - 'word': self.__word, - 'type': self.__type.to_json(), - 'frec': self.__frec - } - - def set_word(self, word: str): - self.__word = word - return self - - def get_word(self): - return self.__word - - def set_type(self, word_type: WordType): - self.__type = word_type - return self - - def get_type(self): - return self.__type - - def add_frec(self, amount: int = 1): - self.__frec += amount - return self - - def __repr__(self): - return json.dumps({ - 'word': self.get_word(), - 'type': self.get_type().get_desc() - }) diff --git a/python/src/contabilidad/__pycache__/log.cpython-39.pyc b/python/src/contabilidad/__pycache__/log.cpython-39.pyc deleted file mode 100644 index 36d64f1f2c4da416fd3cdd2a4b97b8f45513b3fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 758 zcmY*X!EVz)5S?AGW4EMLkq}WO4!QV{Lz-}n5TekKRtkiak#Uy4JcoKF2hd*;G5oTih-LaxUwb! z2To$}fKzTn#3LQxjGNcM%@y^ipzn+k;U#We6OVCn3N`yXeg&?wM^P-2a3bdWjaeug zaXM~HukyEP(hyRn@&E%veRWgtIYsFQ=m_u#2aj^%8JuEz!!tSaO5DUUCAHPK%UJv6Aoy?@#>I(b zSW%i9N*XMLFCgz|U&D`=M=k#>6EgD;V;;&#B>o_k@3Uz*6#h8M{i#f66MvW{dH5!Z zBOY?U=-1EW@c%frelWd~n&>TDnT=o*w$^oYNHOwP^vm>(XSlL+gdAtG4@;Vp1?6-_ zKR1`g!nmQiaf2k?63!~HAQhYuTByJ+Auzy6GSrnpAlZ8e*>MxdS}zbeXi8nF%PJDi z@4a#^>dvI@@Tzm%a$dBY)7RCxQLR_!v{kK{%EA`LQ8HF6or*-6A7zva#qww(l%3^r zq`ewb)idzyP7HYpQ%AHA9>@1l{r8Z=$SnDo&` ZiuI7zdF)5UbRX* Date: Wed, 22 Dec 2021 01:38:23 -0300 Subject: [PATCH 04/25] Manage uploaded files --- .idea/contabilidad.iml | 81 ------------- .idea/php.xml | 87 -------------- api/common/Controller/Files.php | 77 +++++++++++++ api/common/Service/FileHandler.php | 109 ++++++++++++++++++ api/nginx.conf | 6 +- api/public/uploads/pdfs/BICE-CC-2021-09.pdf | Bin 74452 -> 0 bytes .../uploads/pdfs/Scotiabank-CC-2021-10.pdf | Bin 12951 -> 0 bytes api/resources/routes/uploads.php | 12 ++ api/setup/settings/02_common.php | 2 +- api/setup/setups/02_common.php | 54 +++++---- 10 files changed, 234 insertions(+), 194 deletions(-) delete mode 100644 .idea/contabilidad.iml delete mode 100644 .idea/php.xml create mode 100644 api/common/Controller/Files.php create mode 100644 api/common/Service/FileHandler.php delete mode 100644 api/public/uploads/pdfs/BICE-CC-2021-09.pdf delete mode 100644 api/public/uploads/pdfs/Scotiabank-CC-2021-10.pdf create mode 100644 api/resources/routes/uploads.php diff --git a/.idea/contabilidad.iml b/.idea/contabilidad.iml deleted file mode 100644 index 8558fe5..0000000 --- a/.idea/contabilidad.iml +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml deleted file mode 100644 index e783343..0000000 --- a/.idea/php.xml +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/api/common/Controller/Files.php b/api/common/Controller/Files.php new file mode 100644 index 0000000..6441a24 --- /dev/null +++ b/api/common/Controller/Files.php @@ -0,0 +1,77 @@ +listFiles(); + usort($files, function($a, $b) { + $f = strcmp($a->folder, $b->folder); + if ($f == 0) { + return strcmp($a->filename, $b->filename); + } + return $f; + }); + return $this->withJson($response, compact('files')); + } + public function upload(Request $request, Response $response, Handler $handler, Factory $factory): Response { + $post = $request->getParsedBody(); + $cuenta = $factory->find(Cuenta::class)->one($post['cuenta']); + $file = $request->getUploadedFiles()['archivo']; + $new_name = implode(' - ', [$cuenta->nombre, $cuenta->categoria()->nombre, $post['fecha']]); + $output = [ + 'input' => [ + 'name' => $file->getClientFilename(), + 'type' => $file->getClientMediaType(), + 'size' => $file->getSize(), + 'error' => $file->getError() + ], + 'new_name' => $new_name, + 'uploaded' => $handler->uploadFile($file, $new_name) + ]; + return $this->withJson($response, $output); + } + public function get(Request $request, Response $response, Handler $handler, $folder, $filename): Response { + $file = $handler->getFile($folder, $filename); + return $response + ->withHeader('Content-Type', $handler->getType($folder)) + ->withHeader('Content-Disposition', 'attachment; filename=' . $filename) + ->withAddedHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') + ->withHeader('Cache-Control', 'post-check=0, pre-check=0') + ->withHeader('Pragma', 'no-cache') + ->withBody($file); + } + public function edit(Request $request, Response $response, Handler $handler, Factory $factory, $folder, $filename): Response { + $post = json_decode($request->getBody()); + $cuenta = $factory->find(Cuenta::class)->one($post->cuenta); + $filenfo = $handler->getInfo($folder, $filename); + $new_name = implode('.', [implode(' - ', [$cuenta->nombre, $cuenta->categoria()->nombre, $post->fecha]), $filenfo->getExtension()]); + $output = [ + 'input' => [ + 'folder' => $folder, + 'filename' => $filename, + 'post' => $post + ], + 'edited' => $handler->editFilename($folder, $filename, $new_name) + ]; + return $this->withJson($response, $output); + } + public function delete(Request $request, Response $response, Handler $handler, $folder, $filename): Response { + $output = [ + 'input' => [ + 'folder' => $folder, + 'filename' => $filename + ], + 'deleted' => $handler->deleteFile($folder, $filename) + ]; + return $this->withJson($response, $output); + } +} diff --git a/api/common/Service/FileHandler.php b/api/common/Service/FileHandler.php new file mode 100644 index 0000000..5d06b1b --- /dev/null +++ b/api/common/Service/FileHandler.php @@ -0,0 +1,109 @@ +base_folder = $params->folder; + $this->addValidTypes(array_keys($params->types)); + $this->addFolders($params->types); + } + public function addFolders(array $folders): FileHandler { + foreach ($folders as $type => $folder) { + $this->addFolder($type, $folder); + } + return $this; + } + public function addFolder(string $type, string $folder): FileHandler { + $this->folders[$type] = $folder; + return $this; + } + public function addValidTypes(array $valid_types): FileHandler { + foreach ($valid_types as $type) { + $this->addValidType($type); + } + return $this; + } + public function addValidType(string $type): FileHandler { + $this->valid_types []= $type; + return $this; + } + public function getType(string $folder): string { + return array_search($folder, $this->folders); + } + + public function uploadFile(UploadedFileInterface $file, string $new_name = null): bool { + if ($file->getError() !== UPLOAD_ERR_OK) { + return false; + } + if (!in_array($file->getClientMediaType(), array_keys($this->valid_types))) { + return false; + } + if ($new_name === null) { + $new_name = $file->getClientFilename(); + } + $filenfo = new \SplFileInfo($file->getClientFilename()); + if (!str_contains($new_name, $filenfo->getExtension())) { + $new_name .= '.' . $filenfo->getExtension(); + } + $to = implode(DIRECTORY_SEPARATOR, [$this->base_folder, $this->folders[$file->getClientMediaType()], $new_name]); + $file->moveTo($to); + return file_exists($to); + } + public function listFiles(): array { + $output = []; + foreach ($this->folders as $f) { + $folder = implode(DIRECTORY_SEPARATOR, [$this->base_folder, $f]); + $files = new \DirectoryIterator($folder); + foreach ($files as $file) { + if ($file->isDir()) { + continue; + } + $output []= (object) ['folder' => $f, 'filename' => $file->getBasename()]; + } + } + return $output; + } + protected function validateFilename(string $folder, string $filename): bool|string { + if (!in_array($folder, $this->folders)) { + return false; + } + $f = implode(DIRECTORY_SEPARATOR, [$this->base_folder, $folder, $filename]); + if (!file_exists($f)) { + return false; + } + return $f; + } + public function getInfo(string $folder, string $filename): \SplFileInfo|bool { + if (!$f = $this->validateFilename($folder, $filename)) { + return false; + } + return new \SplFileInfo($f); + } + public function getFile(string $folder, string $filename): StreamInterface|bool { + if (!$f = $this->validateFilename($folder, $filename)) { + return false; + } + return Stream::create(file_get_contents($f)); + } + public function editFilename(string $folder, string $filename, string $new_name): bool { + if (!$f = $this->validateFilename($folder, $filename)) { + return false; + } + $info = new \SplFileInfo($f); + $new = implode(DIRECTORY_SEPARATOR, [$this->base_folder, $folder, $new_name . '.' . $info->getExtension()]); + return rename($f, $new); + } + public function deleteFile(string $folder, string $filename): bool { + if (!$f = $this->validateFilename($folder, $filename)) { + return false; + } + return unlink($f); + } +} diff --git a/api/nginx.conf b/api/nginx.conf index 5d96382..069343f 100644 --- a/api/nginx.conf +++ b/api/nginx.conf @@ -15,8 +15,7 @@ server { if ($request_method = 'OPTIONS') { add_header 'Access-Control-Max-Age' 1728000; add_header 'Access-Control-Allow-Origin' '*'; - add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent, - X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range'; + add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range'; add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH'; add_header 'Content-Type' 'application/json'; add_header 'Content-Length' 0; @@ -24,8 +23,7 @@ server { } add_header 'Access-Control-Allow-Origin' '*'; - add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent, - X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range'; + add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range'; add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH'; try_files $uri =404; diff --git a/api/public/uploads/pdfs/BICE-CC-2021-09.pdf b/api/public/uploads/pdfs/BICE-CC-2021-09.pdf deleted file mode 100644 index d5216552447bf125dc177f8aab6ea6cb4bcc047c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74452 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 diff --git a/api/public/uploads/pdfs/Scotiabank-CC-2021-10.pdf b/api/public/uploads/pdfs/Scotiabank-CC-2021-10.pdf deleted file mode 100644 index 8fef2f32e600ad50f0002d6079eacf11c96a65a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12951 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 diff --git a/api/resources/routes/uploads.php b/api/resources/routes/uploads.php new file mode 100644 index 0000000..6138be8 --- /dev/null +++ b/api/resources/routes/uploads.php @@ -0,0 +1,12 @@ +group('/uploads', function($app) { + $app->post('/add[/]', [Files::class, 'upload']); + $app->get('[/]', Files::class); +}); +$app->group('/upload/{folder}/{filename}', function($app) { + $app->put('[/]', [Files::class, 'edit']); + $app->delete('[/]', [Files::class, 'delete']); + $app->get('[/]', [Files::class, 'get']); +}); diff --git a/api/setup/settings/02_common.php b/api/setup/settings/02_common.php index 1185ad3..eeb2bd9 100644 --- a/api/setup/settings/02_common.php +++ b/api/setup/settings/02_common.php @@ -19,7 +19,7 @@ return [ 'public' ]); $arr['uploads'] = implode(DIRECTORY_SEPARATOR, [ - $arr['public'], + $arr['base'], 'uploads' ]); $arr['pdfs'] = implode(DIRECTORY_SEPARATOR, [ diff --git a/api/setup/setups/02_common.php b/api/setup/setups/02_common.php index 27836d5..56eabc2 100644 --- a/api/setup/setups/02_common.php +++ b/api/setup/setups/02_common.php @@ -14,27 +14,27 @@ return [ $c->get(Contabilidad\Common\Service\Auth::class) ); }, - Contabilidad\Common\Service\PdfHandler::class => function(Container $c) { - return new Contabilidad\Common\Service\PdfHandler($c->get(GuzzleHttp\Client::class), $c->get('folders')->pdfs, implode('/', [ - $c->get('urls')->python, - 'pdf', - 'parse' - ])); - }, - Contabilidad\Common\Service\CsvHandler::class => function(Container $c) { - return new Contabilidad\Common\Service\CsvHandler($c->get('folders')->csvs); - }, - Contabilidad\Common\Service\XlsHandler::class => function(Container $c) { - return new Contabilidad\Common\Service\XlsHandler($c->get('folders')->xlss); - }, - Contabilidad\Common\Service\DocumentHandler::class => function(Container $c) { - $handlers = [ - $c->get(Contabilidad\Common\Service\XlsHandler::class), - $c->get(Contabilidad\Common\Service\CsvHandler::class), - $c->get(Contabilidad\Common\Service\PdfHandler::class) - ]; - return new Contabilidad\Common\Service\DocumentHandler($handlers); - }, + Contabilidad\Common\Service\PdfHandler::class => function(Container $c) { + return new Contabilidad\Common\Service\PdfHandler($c->get(GuzzleHttp\Client::class), $c->get('folders')->pdfs, implode('/', [ + $c->get('urls')->python, + 'pdf', + 'parse' + ])); + }, + Contabilidad\Common\Service\CsvHandler::class => function(Container $c) { + return new Contabilidad\Common\Service\CsvHandler($c->get('folders')->csvs); + }, + Contabilidad\Common\Service\XlsHandler::class => function(Container $c) { + return new Contabilidad\Common\Service\XlsHandler($c->get('folders')->xlss); + }, + Contabilidad\Common\Service\DocumentHandler::class => function(Container $c) { + $handlers = [ + $c->get(Contabilidad\Common\Service\XlsHandler::class), + $c->get(Contabilidad\Common\Service\CsvHandler::class), + $c->get(Contabilidad\Common\Service\PdfHandler::class) + ]; + return new Contabilidad\Common\Service\DocumentHandler($handlers); + }, Contabilidad\Common\Service\TiposCambios::class => function(Container $c) { return new Contabilidad\Common\Service\TiposCambios( $c->get(GuzzleHttp\Client::class), @@ -42,5 +42,17 @@ return [ $c->get('python_api'), $c->get('python_key') ); + }, + Contabilidad\Common\Service\FileHandler::class => function(Container $c) { + return new Contabilidad\Common\Service\FileHandler((object) [ + 'folder' => $c->get('folders')->uploads, + 'types' => [ + 'text/csv' => 'csvs', + 'application/pdf' => 'pdfs', + 'application/vnd.ms-excel' => 'xlss', + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'xlss', + 'application/json' => 'jsons' + ] + ]); } ]; From 93f77bfbb83373ffbbba6e1e9b75d5f48a06bd62 Mon Sep 17 00:00:00 2001 From: Aldarien Date: Wed, 22 Dec 2021 01:38:34 -0300 Subject: [PATCH 05/25] Upload files --- ui/Dockerfile | 4 + ui/common/Controller/Uploads.php | 24 ++ ui/composer.json | 11 +- ui/public/assets/scripts/uploads.list.js | 210 ++++++++++++++++++ ui/resources/routes/uploads.php | 10 + ui/resources/views/config/menu.blade.php | 1 + .../views/config/menu/files.blade.php | 4 + ui/resources/views/layout/body/menu.blade.php | 1 - ui/setup/setups/03_web.php | 30 ++- 9 files changed, 275 insertions(+), 20 deletions(-) create mode 100644 ui/common/Controller/Uploads.php create mode 100644 ui/public/assets/scripts/uploads.list.js create mode 100644 ui/resources/routes/uploads.php create mode 100644 ui/resources/views/config/menu/files.blade.php diff --git a/ui/Dockerfile b/ui/Dockerfile index 952159e..a7a3ff8 100644 --- a/ui/Dockerfile +++ b/ui/Dockerfile @@ -1,5 +1,9 @@ FROM php:8-fpm +RUN apt-get update -y && apt-get install -y git libzip-dev zip + +RUN docker-php-ext-install zip + COPY --from=composer /usr/bin/composer /usr/bin/composer WORKDIR /app diff --git a/ui/common/Controller/Uploads.php b/ui/common/Controller/Uploads.php new file mode 100644 index 0000000..c04cea0 --- /dev/null +++ b/ui/common/Controller/Uploads.php @@ -0,0 +1,24 @@ +render($response, 'uploads.list'); + } + public function get(Request $request, Response $response, Client $client, $folder, $filename): Response { + $resp = $client->get(implode('/', ['upload', $folder, $filename])); + $file = $resp->getBody(); + return $response + ->withHeader('Content-Type', $resp->getHeader('Content-Type')) + ->withHeader('Content-Disposition', 'attachment; filename=' . $filename) + ->withAddedHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') + ->withHeader('Cache-Control', 'post-check=0, pre-check=0') + ->withHeader('Pragma', 'no-cache') + ->withBody($file); + } +} diff --git a/ui/composer.json b/ui/composer.json index 9cfd883..19237c5 100644 --- a/ui/composer.json +++ b/ui/composer.json @@ -8,7 +8,8 @@ "rubellum/slim-blade-view": "^0.1.1", "nyholm/psr7-server": "^1.0", "zeuxisoo/slim-whoops": "^0.7.3", - "nyholm/psr7": "^1.4" + "nyholm/psr7": "^1.4", + "guzzlehttp/guzzle": "^7.4" }, "require-dev": { "phpunit/phpunit": "^9.5", @@ -24,11 +25,5 @@ "psr-4": { "Contabilidad\\Common\\": "common" } - }, - "repositories": [ - { - "type": "git", - "url": "http://git.provm.cl/ProVM/controller.git" - } - ] + } } diff --git a/ui/public/assets/scripts/uploads.list.js b/ui/public/assets/scripts/uploads.list.js new file mode 100644 index 0000000..24094c3 --- /dev/null +++ b/ui/public/assets/scripts/uploads.list.js @@ -0,0 +1,210 @@ +class Archivo { + constructor({folder, filename}) { + this.folder = folder + this.filename = filename + this.modal = null + } + setModal(modal) { + this.modal = modal + return this + } + draw() { + return $('').append( + $('').append( + $('').attr('class', 'item').attr('href', _urls.base + ['upload', this.folder, this.filename].join('/')).html(this.filename) + ) + ).append( + $('').attr('class', 'right aligned').append( + $('').attr('class', 'ui mini circular icon button').append( + $('').attr('class', 'edit icon') + ).click((e) => { + e.preventDefault() + const t = e.currentTarget + this.edit() + return false + }) + ).append( + $('').attr('class', 'ui mini red circular icon button').append( + $('').attr('class', 'remove icon') + ).click((e) => { + e.preventDefault() + const t = e.currentTarget + this.remove() + return false + }) + ) + ) + } + edit() { + this.modal.find('form').trigger('reset') + this.modal.find('form').find("[name='folder']").val(this.folder) + this.modal.find('form').find("[name='old_filename']").val(this.filename) + this.modal.find('form').find("[name='filename']").val(this.filename) + this.modal.modal('show') + } + remove() { + return sendDelete([_urls.api, 'upload', this.folder, this.filename].join('/')).then((data) => { + if (data.deleted) { + archivos.get() + } + }) + } +} +const archivos = { + id: '#archivos', + archivos: [], + modals: { + add: null, + edit: null + }, + get: function() { + return { + parent: () => { + let parent = $(this.id).find('tbody') + if (parent.length === 0) { + const table = $('
').attr('class', 'ui striped table').append( + $('').append( + $('').append( + $('').html('Archivo') + ).append( + $('').attr('class', 'right aligned').append( + $('').attr('class', 'ui tiny green circular icon button').append( + $('').attr('class', 'plus icon') + ).click((e) => { + e.preventDefault() + this.add() + return false + }) + ) + ) + ) + ) + parent = $('') + table.append(parent) + $(this.id).append(table) + } + return parent + }, + archivos: () => { + return sendGet(_urls.api + '/uploads').then((data) => { + if (data.files === null || data.files.length === 0) { + return + } + $.each(data.files, (i, el) => { + const arch = new Archivo(el) + arch.setModal(this.modals.edit) + this.archivos.push(arch) + }) + }).then(() => { + this.draw() + }) + }, + cuentas: () => { + return sendGet(_urls.api + '/cuentas') + } + } + }, + draw: function() { + const tbody = this.get().parent() + tbody.html('') + $.each(this.archivos, (i, el) => { + tbody.append(el.draw()) + }) + }, + add: function() { + this.modals.add.find('form').trigger('reset') + this.modals.add.modal('show') + }, + doAdd: function() { + const data = new FormData(this.modals.add.find('form')) + return sendPost(_urls.api + '/categorias/add', data, true).then((resp) => { + this.modals.add.modal('hide') + this.getCategorias() + }) + }, + doEdit: function() { + const folder = this.modals.edit.find("[name='folder']").val() + const filename = this.modals.edit.find("[name='old_filename']").val() + const data = JSON.stringify({ + cuenta: this.modals.edit.find("[name='cuenta']").val(), + fecha: this.modals.edit.find("[name='fecha']").val() + }) + sendPut([_urls.api, 'upload', folder, filename].join('/'), data).then((resp) => { + this.modals.edit.modal('hide') + if (resp.edited) { + this.get().archivos() + } + }) + }, + updateCalendar: function(modal) { + const today = new Date() + const start = new Date(today.getFullYear(), today.getMonth() - 1) + modal.find('.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('-') + } + } + }) + }, + updateCuentas: function(modal, data) { + if (data.cuentas === null || data.cuentas.length === 0) { + return + } + const select = modal.find("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}) + }, + setupModal: function() { + this.modals.add = $('#add_modal') + this.modals.edit = $('#edit_modal') + $.each(this.modals, (i, el) => { + el.modal().find('.close.icon').click(() => { + el.modal('hide') + }) + this.updateCalendar(el) + }) + this.modals.add.find('form').submit((e) => { + e.preventDefault() + this.doAdd() + return false + }) + this.modals.add.find('#archivo_btn').css('cursor', 'pointer').click(() => { + this.modals.add.find("[name='archivo']").trigger('click') + }) + this.modals.add.find("[name='archivo']").change((e) => { + const arch = $(e.currentTarget) + const filename = arch[0].files[0].name + this.modals.add.find('#archivo_btn').find('input').val(filename) + }) + this.modals.edit.find('form').submit((e) => { + e.preventDefault() + this.doEdit() + return false + }) + this.get().cuentas().then((data) => { + this.updateCuentas(this.modals.add, data) + this.updateCuentas(this.modals.edit, data) + }) + }, + setup: function() { + this.setupModal() + this.get().archivos() + } +} diff --git a/ui/resources/routes/uploads.php b/ui/resources/routes/uploads.php new file mode 100644 index 0000000..af9cf9a --- /dev/null +++ b/ui/resources/routes/uploads.php @@ -0,0 +1,10 @@ +group('/uploads', function($app) { + $app->get('/add', [Uploads::class, 'upload']); + $app->get('[/]', Uploads::class); +}); +$app->group('/upload/{folder}/{filename}', function($app) { + $app->get('[/]', [Uploads::class, 'get']); +}); diff --git a/ui/resources/views/config/menu.blade.php b/ui/resources/views/config/menu.blade.php index c361fbe..6137067 100644 --- a/ui/resources/views/config/menu.blade.php +++ b/ui/resources/views/config/menu.blade.php @@ -1,4 +1,5 @@