From a2a48d2c8b9ef92f88dc1698dfd6bc13b565b3a9 Mon Sep 17 00:00:00 2001 From: Lucas Awade Date: Mon, 5 Feb 2024 14:22:07 +0000 Subject: [PATCH] =?UTF-8?q?atualiza=C3=A7=C3=A3o=20da=20tela=20de=20login?= =?UTF-8?q?=20e=20cria=C3=A7=C3=A3o=20da=20nova=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/codeworxtech.html | 121 -- admin/images/_notes/index_r1_c1.gif.mno | 5 - admin/images/_notes/index_r2_c1.gif.mno | 5 - admin/images/_notes/index_r2_c2.gif.mno | 5 - admin/images/_notes/index_r2_c3.gif.mno | 5 - admin/images/_notes/index_r2_c4.gif.mno | 5 - admin/images/_notes/index_r2_c5.gif.mno | 5 - admin/images/_notes/index_r3_c1.gif.mno | 5 - app/controllers/AuthController.php | 113 ++ app/controllers/CallController.php | 102 ++ app/controllers/QueueController.php | 46 + app/core/Connection.php | 37 + app/core/Database.php | 90 ++ app/core/Repository.php | 318 +++++ app/middleware/AuthMiddleware.php | 30 + app/models/Audita.php | 31 + app/models/AuditaFull.php | 10 + app/models/Bilhetes.php | 10 + app/models/Organizacao.php | 10 + app/models/OrganizacaoUsuario.php | 10 + app/models/Parametro.php | 10 + app/models/Queue.php | 10 + app/models/Token.php | 10 + app/models/Usuario.php | 10 + app/shared/Logger.php | 173 +++ app/traits/AuthToken.php | 46 + app/traits/Validate.php | 51 + cadOrganizacao.log | 0 composer.json | 24 + composer.lock | 1095 ++++++++++++++++ doc/Atendimento.rtf | 67 - doc/Perfil/perfil-apl.txt | 68 - doc/backup/default.sql | 42 - doc/changelog.docx | Bin 14360 -> 0 bytes doc/changelog.pdf | Bin 72374 -> 0 bytes doc/changelog.txt | 58 - doc/chatMidia/altera-parametros-midia.sql | 21 - doc/correcoes-1711.txt | 5 - doc/correcoes-1711.txt~ | 2 - doc/funcoes-internas.sql | 2 - ...DE_USO_E_PRIVACIDADE_APLICACAO_SIMPLES.pdf | Bin 62984 -> 0 bytes doc/pre-venda/alteracoes-banco.sql | 12 - doc/pre-venda/configura-prevenda | 89 -- doc/pre-venda/corrige_cliente.sql | 30 - doc/pre-venda/recicla-base-clientes | 33 - images/_notes/index_r1_c1.gif.mno | 5 - images/_notes/index_r2_c1.gif.mno | 5 - images/_notes/index_r2_c2.gif.mno | 5 - images/_notes/index_r2_c3.gif.mno | 5 - images/_notes/index_r2_c4.gif.mno | 5 - images/_notes/index_r2_c5.gif.mno | 5 - images/_notes/index_r3_c1.gif.mno | 5 - .../core.assemble_plugin_filepath.php | 66 - .../core.assign_smarty_interface.php | 42 - .../internals/core.create_dir_structure.php | 74 -- .../internals/core.display_debug_console.php | 59 - img/libs/internals/core.get_include_path.php | 42 - img/libs/internals/core.get_microtime.php | 21 - img/libs/internals/core.get_php_resource.php | 76 -- img/libs/internals/core.is_secure.php | 56 - img/libs/internals/core.is_trusted.php | 42 - img/libs/internals/core.load_plugins.php | 123 -- .../internals/core.load_resource_plugin.php | 72 -- .../internals/core.process_cached_inserts.php | 69 - .../core.process_compiled_include.php | 34 - img/libs/internals/core.read_cache_file.php | 98 -- img/libs/internals/core.rm_auto.php | 69 - img/libs/internals/core.rmdir.php | 54 - .../internals/core.run_insert_handler.php | 70 -- .../internals/core.smarty_include_php.php | 47 - img/libs/internals/core.write_cache_file.php | 94 -- .../internals/core.write_compiled_include.php | 90 -- .../core.write_compiled_resource.php | 34 - img/libs/internals/core.write_file.php | 53 - img/libs/plugins/block.textformat.php | 101 -- img/libs/plugins/compiler.assign.php | 39 - .../plugins/function.assign_debug_info.php | 39 - img/libs/plugins/function.config_load.php | 139 -- img/libs/plugins/function.counter.php | 77 -- img/libs/plugins/function.cycle.php | 100 -- img/libs/plugins/function.debug.php | 33 - img/libs/plugins/function.eval.php | 47 - img/libs/plugins/function.fetch.php | 218 ---- img/libs/plugins/function.html_checkboxes.php | 140 --- img/libs/plugins/function.html_image.php | 139 -- img/libs/plugins/function.html_options.php | 117 -- img/libs/plugins/function.html_radios.php | 154 --- .../plugins/function.html_select_date.php | 327 ----- .../plugins/function.html_select_time.php | 188 --- img/libs/plugins/function.html_table.php | 174 --- img/libs/plugins/function.mailto.php | 157 --- img/libs/plugins/function.math.php | 83 -- img/libs/plugins/function.popup.php | 120 -- img/libs/plugins/function.popup_init.php | 38 - img/libs/plugins/modifier.capitalize.php | 40 - img/libs/plugins/modifier.cat.php | 31 - .../plugins/modifier.count_characters.php | 30 - .../plugins/modifier.count_paragraphs.php | 27 - img/libs/plugins/modifier.count_sentences.php | 27 - img/libs/plugins/modifier.count_words.php | 31 - img/libs/plugins/modifier.date_format.php | 57 - img/libs/plugins/modifier.debug_print_var.php | 88 -- img/libs/plugins/modifier.default.php | 30 - img/libs/plugins/modifier.escape.php | 90 -- img/libs/plugins/modifier.indent.php | 27 - img/libs/plugins/modifier.lower.php | 25 - img/libs/plugins/modifier.nl2br.php | 33 - img/libs/plugins/modifier.regex_replace.php | 45 - img/libs/plugins/modifier.replace.php | 28 - img/libs/plugins/modifier.spacify.php | 27 - img/libs/plugins/modifier.string_format.php | 27 - img/libs/plugins/modifier.strip.php | 31 - img/libs/plugins/modifier.strip_tags.php | 30 - include/util/Conexao.php | 436 +++---- index.php | 1 - integracao/download/layouteBaseDiscador.pdf | Bin 260064 -> 0 bytes integracao/imgIntegra/delphiIco.png | Bin 689 -> 0 bytes integracao/imgIntegra/dotNetIco.png | Bin 2935 -> 0 bytes integracao/imgIntegra/javaIco.png | Bin 2345 -> 0 bytes integracao/imgIntegra/logoPrincipal.gif | Bin 4330 -> 0 bytes integracao/imgIntegra/phpIco.png | Bin 3554 -> 0 bytes integracao/imgIntegra/textoApi.png | Bin 6296 -> 0 bytes integracao/integracao.hmtl | 68 - integracao/rest.php | 70 -- integracao/simpleschat/css/styles.css | 1118 ----------------- integracao/simpleschat/images/audio-icon.svg | 1 - integracao/simpleschat/images/camera-icon.svg | 1 - integracao/simpleschat/images/clip.svg | 1 - .../simpleschat/images/community_message.svg | 363 ------ .../simpleschat/images/cross-circle.svg | 2 - .../simpleschat/images/double-check-seen.svg | 1 - .../images/double-check-unseen.svg | 1 - .../simpleschat/images/double-check.svg | 1 - integracao/simpleschat/images/down-arrow.svg | 1 - integracao/simpleschat/images/favicon.ico | Bin 438 -> 0 bytes integracao/simpleschat/images/file.svg | 2 - integracao/simpleschat/images/gt-arrow.svg | 1 - integracao/simpleschat/images/icons.svg | 1 - .../simpleschat/images/icons/csv-file.png | Bin 12605 -> 0 bytes .../simpleschat/images/icons/doc-file.png | Bin 9930 -> 0 bytes .../images/icons/notfound-file.png | Bin 12799 -> 0 bytes .../simpleschat/images/icons/pdf-file.png | Bin 8217 -> 0 bytes .../simpleschat/images/icons/ppt-file.png | Bin 8343 -> 0 bytes .../simpleschat/images/icons/txt-file.png | Bin 9495 -> 0 bytes .../simpleschat/images/icons/xls-file.png | Bin 11617 -> 0 bytes .../simpleschat/images/icons/zip-file.png | Bin 8533 -> 0 bytes integracao/simpleschat/images/loading.gif | Bin 36058 -> 0 bytes .../simpleschat/images/manage_chats.svg | 1 - integracao/simpleschat/images/menu-icon.svg | 1 - .../simpleschat/images/message-icon.svg | 1 - .../images/message-tail-receiver.svg | 1 - .../images/message-tail-sender.svg | 1 - integracao/simpleschat/images/messenger.png | Bin 129504 -> 0 bytes .../simpleschat/images/microphone-seen.svg | 1 - integracao/simpleschat/images/microphone.svg | 2 - .../simpleschat/images/notifications.svg | 1 - integracao/simpleschat/images/paper-plane.svg | 2 - integracao/simpleschat/images/pause.svg | 1 - integracao/simpleschat/images/picture.svg | 2 - .../simpleschat/images/placeholder-image.svg | 1 - .../simpleschat/images/play-audio-icon.svg | 1 - integracao/simpleschat/images/play.svg | 2 - integracao/simpleschat/images/power.svg | 1 - integracao/simpleschat/images/redo.svg | 2 - integracao/simpleschat/images/search-icon.svg | 1 - .../simpleschat/images/single-check.svg | 1 - integracao/simpleschat/images/status.svg | 1 - integracao/simpleschat/images/stop.svg | 70 -- integracao/simpleschat/images/telegram.png | Bin 57029 -> 0 bytes integracao/simpleschat/images/trash.svg | 2 - integracao/simpleschat/images/user.png | Bin 29318 -> 0 bytes .../images/wallpaper_simpleschat.png | Bin 214516 -> 0 bytes integracao/simpleschat/images/whatsapp.png | Bin 29936 -> 0 bytes integracao/simpleschat/js/config.js | 5 - integracao/simpleschat/js/cronometro.js | 54 - integracao/simpleschat/js/jquery-3.6.0.min.js | 2 - integracao/simpleschat/js/main.js | 444 ------- integracao/simpleschat/js/requests.js | 262 ---- integracao/simpleschat/js/util.js | 573 --------- integracao/simpleschat/sound/notification.mp3 | Bin 7567 -> 0 bytes integracao/testeIntegra.php | 10 - .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 418 -> 0 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 312 -> 0 bytes .../images/ui-bg_flat_10_000000_40x100.png | Bin 205 -> 0 bytes .../images/ui-bg_glass_100_f6f6f6_1x400.png | Bin 262 -> 0 bytes .../images/ui-bg_glass_100_fdf5ce_1x400.png | Bin 348 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 207 -> 0 bytes .../ui-bg_gloss-wave_35_f6a828_500x100.png | Bin 5815 -> 0 bytes .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin 278 -> 0 bytes .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin 328 -> 0 bytes jquery-ui/images/ui-icons_222222_256x240.png | Bin 6922 -> 0 bytes jquery-ui/images/ui-icons_228ef1_256x240.png | Bin 4549 -> 0 bytes jquery-ui/images/ui-icons_ef8c08_256x240.png | Bin 4549 -> 0 bytes jquery-ui/images/ui-icons_ffd27a_256x240.png | Bin 4549 -> 0 bytes jquery-ui/images/ui-icons_ffffff_256x240.png | Bin 6299 -> 0 bytes jquery-ui/index.html | 513 -------- projeto/Discador/visao-geral-discador.txt | 76 -- .../IdentificaChamada/sql/function-strtoint | 15 - .../sql/query-identifica-chamdas.sql | 50 - .../sql/query-tipo-chamda.sql | 31 - .../sql/query-verifica-chamadas.sql | 26 - .../query-chamadas-entrantes-geral.sql | 46 - .../doc}/eventos-atendimento.txt | 0 projeto/ver-1.6.5.5/Correcoes-1.6.5.5 | 24 - projeto/ver-1.6.5.5/notas-1.6.5.6 | 23 - public/.htaccess | 4 + public/api.php | 47 + scriptApl/img/arrow.gif | Bin 86 -> 0 bytes scriptApl/img/arrow.png | Bin 525 -> 0 bytes scriptApl/img/arrow_old.png | Bin 525 -> 0 bytes scriptApl/menu.css.bak | 71 -- scriptApl/tree_tpl.js.bak | 36 - 212 files changed, 2510 insertions(+), 9362 deletions(-) delete mode 100644 admin/codeworxtech.html delete mode 100644 admin/images/_notes/index_r1_c1.gif.mno delete mode 100644 admin/images/_notes/index_r2_c1.gif.mno delete mode 100644 admin/images/_notes/index_r2_c2.gif.mno delete mode 100644 admin/images/_notes/index_r2_c3.gif.mno delete mode 100644 admin/images/_notes/index_r2_c4.gif.mno delete mode 100644 admin/images/_notes/index_r2_c5.gif.mno delete mode 100644 admin/images/_notes/index_r3_c1.gif.mno create mode 100644 app/controllers/AuthController.php create mode 100644 app/controllers/CallController.php create mode 100644 app/controllers/QueueController.php create mode 100644 app/core/Connection.php create mode 100644 app/core/Database.php create mode 100644 app/core/Repository.php create mode 100644 app/middleware/AuthMiddleware.php create mode 100644 app/models/Audita.php create mode 100644 app/models/AuditaFull.php create mode 100644 app/models/Bilhetes.php create mode 100644 app/models/Organizacao.php create mode 100644 app/models/OrganizacaoUsuario.php create mode 100644 app/models/Parametro.php create mode 100644 app/models/Queue.php create mode 100644 app/models/Token.php create mode 100644 app/models/Usuario.php create mode 100755 app/shared/Logger.php create mode 100644 app/traits/AuthToken.php create mode 100644 app/traits/Validate.php delete mode 100644 cadOrganizacao.log create mode 100644 composer.json create mode 100644 composer.lock delete mode 100644 doc/Atendimento.rtf delete mode 100644 doc/Perfil/perfil-apl.txt delete mode 100644 doc/backup/default.sql delete mode 100644 doc/changelog.docx delete mode 100644 doc/changelog.pdf delete mode 100644 doc/changelog.txt delete mode 100644 doc/chatMidia/altera-parametros-midia.sql delete mode 100644 doc/correcoes-1711.txt delete mode 100644 doc/correcoes-1711.txt~ delete mode 100644 doc/funcoes-internas.sql delete mode 100644 doc/lgpd/TERMO_DE_USO_E_PRIVACIDADE_APLICACAO_SIMPLES.pdf delete mode 100644 doc/pre-venda/alteracoes-banco.sql delete mode 100644 doc/pre-venda/configura-prevenda delete mode 100644 doc/pre-venda/corrige_cliente.sql delete mode 100644 doc/pre-venda/recicla-base-clientes delete mode 100644 images/_notes/index_r1_c1.gif.mno delete mode 100644 images/_notes/index_r2_c1.gif.mno delete mode 100644 images/_notes/index_r2_c2.gif.mno delete mode 100644 images/_notes/index_r2_c3.gif.mno delete mode 100644 images/_notes/index_r2_c4.gif.mno delete mode 100644 images/_notes/index_r2_c5.gif.mno delete mode 100644 images/_notes/index_r3_c1.gif.mno delete mode 100644 img/libs/internals/core.assemble_plugin_filepath.php delete mode 100644 img/libs/internals/core.assign_smarty_interface.php delete mode 100644 img/libs/internals/core.create_dir_structure.php delete mode 100644 img/libs/internals/core.display_debug_console.php delete mode 100644 img/libs/internals/core.get_include_path.php delete mode 100644 img/libs/internals/core.get_microtime.php delete mode 100644 img/libs/internals/core.get_php_resource.php delete mode 100644 img/libs/internals/core.is_secure.php delete mode 100644 img/libs/internals/core.is_trusted.php delete mode 100644 img/libs/internals/core.load_plugins.php delete mode 100644 img/libs/internals/core.load_resource_plugin.php delete mode 100644 img/libs/internals/core.process_cached_inserts.php delete mode 100644 img/libs/internals/core.process_compiled_include.php delete mode 100644 img/libs/internals/core.read_cache_file.php delete mode 100644 img/libs/internals/core.rm_auto.php delete mode 100644 img/libs/internals/core.rmdir.php delete mode 100644 img/libs/internals/core.run_insert_handler.php delete mode 100644 img/libs/internals/core.smarty_include_php.php delete mode 100644 img/libs/internals/core.write_cache_file.php delete mode 100644 img/libs/internals/core.write_compiled_include.php delete mode 100644 img/libs/internals/core.write_compiled_resource.php delete mode 100644 img/libs/internals/core.write_file.php delete mode 100644 img/libs/plugins/block.textformat.php delete mode 100644 img/libs/plugins/compiler.assign.php delete mode 100644 img/libs/plugins/function.assign_debug_info.php delete mode 100644 img/libs/plugins/function.config_load.php delete mode 100644 img/libs/plugins/function.counter.php delete mode 100644 img/libs/plugins/function.cycle.php delete mode 100644 img/libs/plugins/function.debug.php delete mode 100644 img/libs/plugins/function.eval.php delete mode 100644 img/libs/plugins/function.fetch.php delete mode 100644 img/libs/plugins/function.html_checkboxes.php delete mode 100644 img/libs/plugins/function.html_image.php delete mode 100644 img/libs/plugins/function.html_options.php delete mode 100644 img/libs/plugins/function.html_radios.php delete mode 100644 img/libs/plugins/function.html_select_date.php delete mode 100644 img/libs/plugins/function.html_select_time.php delete mode 100644 img/libs/plugins/function.html_table.php delete mode 100644 img/libs/plugins/function.mailto.php delete mode 100644 img/libs/plugins/function.math.php delete mode 100644 img/libs/plugins/function.popup.php delete mode 100644 img/libs/plugins/function.popup_init.php delete mode 100644 img/libs/plugins/modifier.capitalize.php delete mode 100644 img/libs/plugins/modifier.cat.php delete mode 100644 img/libs/plugins/modifier.count_characters.php delete mode 100644 img/libs/plugins/modifier.count_paragraphs.php delete mode 100644 img/libs/plugins/modifier.count_sentences.php delete mode 100644 img/libs/plugins/modifier.count_words.php delete mode 100644 img/libs/plugins/modifier.date_format.php delete mode 100644 img/libs/plugins/modifier.debug_print_var.php delete mode 100644 img/libs/plugins/modifier.default.php delete mode 100644 img/libs/plugins/modifier.escape.php delete mode 100644 img/libs/plugins/modifier.indent.php delete mode 100644 img/libs/plugins/modifier.lower.php delete mode 100644 img/libs/plugins/modifier.nl2br.php delete mode 100644 img/libs/plugins/modifier.regex_replace.php delete mode 100644 img/libs/plugins/modifier.replace.php delete mode 100644 img/libs/plugins/modifier.spacify.php delete mode 100644 img/libs/plugins/modifier.string_format.php delete mode 100644 img/libs/plugins/modifier.strip.php delete mode 100644 img/libs/plugins/modifier.strip_tags.php delete mode 100644 integracao/download/layouteBaseDiscador.pdf delete mode 100644 integracao/imgIntegra/delphiIco.png delete mode 100644 integracao/imgIntegra/dotNetIco.png delete mode 100644 integracao/imgIntegra/javaIco.png delete mode 100644 integracao/imgIntegra/logoPrincipal.gif delete mode 100644 integracao/imgIntegra/phpIco.png delete mode 100644 integracao/imgIntegra/textoApi.png delete mode 100644 integracao/integracao.hmtl delete mode 100644 integracao/rest.php delete mode 100644 integracao/simpleschat/css/styles.css delete mode 100644 integracao/simpleschat/images/audio-icon.svg delete mode 100644 integracao/simpleschat/images/camera-icon.svg delete mode 100644 integracao/simpleschat/images/clip.svg delete mode 100644 integracao/simpleschat/images/community_message.svg delete mode 100644 integracao/simpleschat/images/cross-circle.svg delete mode 100644 integracao/simpleschat/images/double-check-seen.svg delete mode 100644 integracao/simpleschat/images/double-check-unseen.svg delete mode 100644 integracao/simpleschat/images/double-check.svg delete mode 100644 integracao/simpleschat/images/down-arrow.svg delete mode 100644 integracao/simpleschat/images/favicon.ico delete mode 100644 integracao/simpleschat/images/file.svg delete mode 100644 integracao/simpleschat/images/gt-arrow.svg delete mode 100644 integracao/simpleschat/images/icons.svg delete mode 100644 integracao/simpleschat/images/icons/csv-file.png delete mode 100644 integracao/simpleschat/images/icons/doc-file.png delete mode 100644 integracao/simpleschat/images/icons/notfound-file.png delete mode 100644 integracao/simpleschat/images/icons/pdf-file.png delete mode 100644 integracao/simpleschat/images/icons/ppt-file.png delete mode 100644 integracao/simpleschat/images/icons/txt-file.png delete mode 100644 integracao/simpleschat/images/icons/xls-file.png delete mode 100644 integracao/simpleschat/images/icons/zip-file.png delete mode 100644 integracao/simpleschat/images/loading.gif delete mode 100644 integracao/simpleschat/images/manage_chats.svg delete mode 100644 integracao/simpleschat/images/menu-icon.svg delete mode 100644 integracao/simpleschat/images/message-icon.svg delete mode 100644 integracao/simpleschat/images/message-tail-receiver.svg delete mode 100644 integracao/simpleschat/images/message-tail-sender.svg delete mode 100644 integracao/simpleschat/images/messenger.png delete mode 100644 integracao/simpleschat/images/microphone-seen.svg delete mode 100644 integracao/simpleschat/images/microphone.svg delete mode 100644 integracao/simpleschat/images/notifications.svg delete mode 100644 integracao/simpleschat/images/paper-plane.svg delete mode 100644 integracao/simpleschat/images/pause.svg delete mode 100644 integracao/simpleschat/images/picture.svg delete mode 100644 integracao/simpleschat/images/placeholder-image.svg delete mode 100644 integracao/simpleschat/images/play-audio-icon.svg delete mode 100644 integracao/simpleschat/images/play.svg delete mode 100644 integracao/simpleschat/images/power.svg delete mode 100644 integracao/simpleschat/images/redo.svg delete mode 100644 integracao/simpleschat/images/search-icon.svg delete mode 100644 integracao/simpleschat/images/single-check.svg delete mode 100644 integracao/simpleschat/images/status.svg delete mode 100644 integracao/simpleschat/images/stop.svg delete mode 100644 integracao/simpleschat/images/telegram.png delete mode 100644 integracao/simpleschat/images/trash.svg delete mode 100644 integracao/simpleschat/images/user.png delete mode 100644 integracao/simpleschat/images/wallpaper_simpleschat.png delete mode 100644 integracao/simpleschat/images/whatsapp.png delete mode 100644 integracao/simpleschat/js/config.js delete mode 100644 integracao/simpleschat/js/cronometro.js delete mode 100644 integracao/simpleschat/js/jquery-3.6.0.min.js delete mode 100644 integracao/simpleschat/js/main.js delete mode 100644 integracao/simpleschat/js/requests.js delete mode 100644 integracao/simpleschat/js/util.js delete mode 100644 integracao/simpleschat/sound/notification.mp3 delete mode 100644 integracao/testeIntegra.php delete mode 100644 jquery-ui/images/ui-bg_diagonals-thick_18_b81900_40x40.png delete mode 100644 jquery-ui/images/ui-bg_diagonals-thick_20_666666_40x40.png delete mode 100644 jquery-ui/images/ui-bg_flat_10_000000_40x100.png delete mode 100644 jquery-ui/images/ui-bg_glass_100_f6f6f6_1x400.png delete mode 100644 jquery-ui/images/ui-bg_glass_100_fdf5ce_1x400.png delete mode 100644 jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100644 jquery-ui/images/ui-bg_gloss-wave_35_f6a828_500x100.png delete mode 100644 jquery-ui/images/ui-bg_highlight-soft_100_eeeeee_1x100.png delete mode 100644 jquery-ui/images/ui-bg_highlight-soft_75_ffe45c_1x100.png delete mode 100644 jquery-ui/images/ui-icons_222222_256x240.png delete mode 100644 jquery-ui/images/ui-icons_228ef1_256x240.png delete mode 100644 jquery-ui/images/ui-icons_ef8c08_256x240.png delete mode 100644 jquery-ui/images/ui-icons_ffd27a_256x240.png delete mode 100644 jquery-ui/images/ui-icons_ffffff_256x240.png delete mode 100644 jquery-ui/index.html delete mode 100644 projeto/Discador/visao-geral-discador.txt delete mode 100644 projeto/IdentificaChamada/sql/function-strtoint delete mode 100644 projeto/IdentificaChamada/sql/query-identifica-chamdas.sql delete mode 100644 projeto/IdentificaChamada/sql/query-tipo-chamda.sql delete mode 100644 projeto/IdentificaChamada/sql/query-verifica-chamadas.sql delete mode 100644 projeto/Relatorios/PBX/CHAMDAS ENTRANTES GERAL/query-chamadas-entrantes-geral.sql rename projeto/{Relatorios/Geral => base/doc}/eventos-atendimento.txt (100%) delete mode 100644 projeto/ver-1.6.5.5/Correcoes-1.6.5.5 delete mode 100644 projeto/ver-1.6.5.5/notas-1.6.5.6 create mode 100644 public/.htaccess create mode 100644 public/api.php delete mode 100644 scriptApl/img/arrow.gif delete mode 100644 scriptApl/img/arrow.png delete mode 100644 scriptApl/img/arrow_old.png delete mode 100644 scriptApl/menu.css.bak delete mode 100644 scriptApl/tree_tpl.js.bak diff --git a/admin/codeworxtech.html b/admin/codeworxtech.html deleted file mode 100644 index c0919f3e..00000000 --- a/admin/codeworxtech.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - -
-
-
- The http://phpmailer.codeworxtech.com/ website now carries a few - advertisements through the Google Adsense network to help offset - some of our costs.
- Thanks ....
-
-

My name is Andy Prevost, AKA "codeworxtech".
- www.codeworxtech.com for more information.
-

-

WHY USE OUR TOOLS & WHAT'S IN IT FOR YOU?

-

A valid question. We're developers too. We've been writing software, primarily for the internet, for more than 15 years. Along the way, there are two major things that had tremendous impact of our company: PHP and Open Source. PHP is without doubt the most popular platform for the internet. There has been more progress in this area of technology because of Open Source software than in any other IT segment. We have used many open source tools, some as learning tools, some as components in projects we were working on. To us, it's not about popularity ... we're committed to robust, stable, and efficient tools you can use to get your projects in your user's hands quickly. So the shorter answer: what's in it for you? rapid development and rapid deployment without fuss and with straight forward open source licensing.

-

Now, the introductions:

-

Our company, Worx International Inc., is the publisher of several Open Source applications and developer tools as well as several commercial PHP applications. The Open Source applications are ttCMS and DCP Portal. The Open Source developer tools include QuickComponents (QuickSkin and QuickCache) and now PHPMailer. - We have staff and offices in the United States, Caribbean, the Middle - East, and our primary development center in Canada. Our company is represented by - agents and resellers globally.

-

Worx International Inc. is at the forefront of developing PHP applications. Our staff are all Zend Certified university educated and experts at object oriented programming. While Worx International Inc. can handle any project from trouble shooting programs written by others all the way to finished mission-critical applications, we specialize in taking projects from inception all the way through to implementation - on budget, and on time. If you need help with your projects, we're the team to get it done right at a reasonable price.

-

Over the years, there have been a number of tools that have been constant favorites in all of our projects. We have become the project administrators for most of these tools.

-

Our developer tools are all Open Source. Here's a brief description:

-
    -
  • PHPMailer. Originally authored by Brent Matzelle, PHPMailer is the leading "email transfer class" for PHP. PHPMailer is downloaded more than 18000 times each and every month by developers looking for a stable, simple email solution. We used it ourselves for years as our favorite tool. It's always been small (the entire footprint is around 100 Kb), stable, and as complete a solution as you can find. Other tools are nowhere near as simple. And more importantly, most of our applications (including PHPMailer) is implemented in a smaller footprint than one competing email class. Our thanks to Brent Matzelle for this superb tool - our commitment is to keep it lean, keep it focused, and compliant with standards. Visit the PHPMailer website at - http://phpmailer.codeworxtech.com/.
    - Please note: all of our focus is now on the PHPMailer for PHP5.
    - PS. While you are at it, please visit our sponsor's sites, click on their ads. - It helps offset some of our costs.
    - Want to help? We're looking for progressive developers to join our team of volunteer professionals working on PHPMailer. Our entire focus is on PHPMailer for PHP5, and our next major task is to enhance our - exception/error handling with PHP 5's object oriented try/throw/catch mechanisms. If you are interested, let us know.
    -
    -
  • -
  • QuickCache. Originally authored by Jean Pierre Deckers as jpCache, QuickCache is an HTTP OpCode caching strategy that works on your entire site with only one line of code at the top of your script. The cached pages can be stored as files or as database objects. The benefits are absolutely astounding: bandwidth savings of up to 80% and screen display times increased by 8 - 10x. Visit the QuickCache website at - http://quickcache.codeworxtech.com/.
    -
    -
  • -
  • QuickSkin. Originally authored by Philipp v. Criegern and named "SmartTemplate". The project was taken over by Manuel 'EndelWar' Dalla Lana and now by "codeworxtech". QuickSkin is one of the truly outstanding templating engines available, but has always been confused with Smarty Templating Engine. QuickSkin is even more relevant today than when it was launched. It's a small footprint with big impact on your projects. It features a built in caching technology, token based substitution, and works on the concept of one single HTML file as the template. The HTML template file can contain variable information making it one small powerful tool for your developer tool kit. Visit the QuickSkin website at - http://quickskin.codeworxtech.com/.
    -
    -
  • -
-

We're committed to PHP and to the Open Source community.

-

Opportunities with Worx International Inc.:

-
    -
  • Resellers/Agents: We're always interested in talking with companies that - want to represent - Worx International Inc. in their markets. We also have private label programs for our commercial products (in certain circumstances).
  • -
  • Programmers/Developers: We are usually fully staffed, however, if you would like to be considered for a career with - Worx International Inc., we would be pleased to hear from you.
    - A few things to note:
    -
      -
    • experience level does not matter: from fresh out of college to multi-year experience - it's your - creative mind and a positive attitude we want
    • -
    • if you contact us looking for employment, include a cover letter, indicate what type of work/career you are looking for and expected compensation
    • -
    • if you are representing someone else looking for work, do not contact us. We have an exclusive relationship with a recruiting partner already and not interested in altering the arrangement. We will not hire your candidate under any circumstances unless they wish to approach us individually.
    • -
    • any contact that ignores any of these points will be discarded
    • -
  • -
  • Affiliates/Partnerships: We are interested in partnering with other firms who are leaders in their field. We clearly understand that successful companies are built on successful relationships in all industries world-wide. We currently have innovative relationships throughout the world that are mutually beneficial. Drop us a line and let's talk.
  • -
- Regards,
- Andy Prevost (aka, codeworxtech)
- codeworxtech@users.sourceforge.net
-
- We now also offer website design. hosting, and remote forms processing. Visit WorxStudio.com for more information.
-
-
- - diff --git a/admin/images/_notes/index_r1_c1.gif.mno b/admin/images/_notes/index_r1_c1.gif.mno deleted file mode 100644 index c85c4b75..00000000 --- a/admin/images/_notes/index_r1_c1.gif.mno +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/admin/images/_notes/index_r2_c1.gif.mno b/admin/images/_notes/index_r2_c1.gif.mno deleted file mode 100644 index 1e94032e..00000000 --- a/admin/images/_notes/index_r2_c1.gif.mno +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/admin/images/_notes/index_r2_c2.gif.mno b/admin/images/_notes/index_r2_c2.gif.mno deleted file mode 100644 index 1f311d2b..00000000 --- a/admin/images/_notes/index_r2_c2.gif.mno +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/admin/images/_notes/index_r2_c3.gif.mno b/admin/images/_notes/index_r2_c3.gif.mno deleted file mode 100644 index f1bb9018..00000000 --- a/admin/images/_notes/index_r2_c3.gif.mno +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/admin/images/_notes/index_r2_c4.gif.mno b/admin/images/_notes/index_r2_c4.gif.mno deleted file mode 100644 index eea5b468..00000000 --- a/admin/images/_notes/index_r2_c4.gif.mno +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/admin/images/_notes/index_r2_c5.gif.mno b/admin/images/_notes/index_r2_c5.gif.mno deleted file mode 100644 index a2231977..00000000 --- a/admin/images/_notes/index_r2_c5.gif.mno +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/admin/images/_notes/index_r3_c1.gif.mno b/admin/images/_notes/index_r3_c1.gif.mno deleted file mode 100644 index 535c6df4..00000000 --- a/admin/images/_notes/index_r3_c1.gif.mno +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/app/controllers/AuthController.php b/app/controllers/AuthController.php new file mode 100644 index 00000000..32e9b6f6 --- /dev/null +++ b/app/controllers/AuthController.php @@ -0,0 +1,113 @@ +post('/auth', [self::class, 'auth']); + }; + } + + function auth(Request $request, Response $response, $args) + { + $body = json_decode($request->getBody()->getContents(), true); + + if (empty($body['senha']) || empty($body['email'])) { + $response->getBody()->write(json_encode( + [ + 'status' => false, + 'data' => ["message" => "Por favor verifique as informacoes passadas!"] + ] + )); + return $response; + } + + $usuario = Usuario::find(["email" => $body['email']], ['id', 'nome', 'apelido', 'email', 'senha']); + + if (!$usuario || md5($body['senha']) != $usuario->senha) { + $response->getBody()->write(json_encode(['status' => false, 'data' => ["message" => "Usuario e senha nao confere, por favor verifique as informacoes passadas!"]])); + return $response; + } + + $expiredat = (new \DateTime())->modify('+1 days')->format('Y-m-d H:i:s'); + $tokenPayload = ['sub' => $usuario->id, 'name' => $usuario->nome, 'email' => $usuario->email, 'expired_at' => $expiredat]; + $tokens = Token::find(["id_usuario" => $usuario->id]); + + if ($tokens) { + $expiredDate = new DateTime($tokens->expired_at); + $now = new DateTime(); + if ($expiredDate < $now) { + Token::delete(["id" => $tokens->id]); + } else { + $response->getBody()->write(json_encode(['status' => true, 'data' => ["token" => $tokens->token, "refresh_token" => $tokens->refresh_token]])); + return $response; + } + } + + $token = JWT::encode($tokenPayload, self::CONF_JWT_SECRET_KEY, 'HS256'); + $refreshToken = JWT::encode(['email' => $usuario->email], self::CONF_JWT_SECRET_KEY, 'HS256'); + + $insert = [ + "token" => $token, + "id_usuario" => $usuario->id, + "refresh_token" => $refreshToken, + "expired_at" => $expiredat, + "updated_at" => date('Y-m-d H:i:s') + ]; + + $isCreated = Token::create($insert); + + if (!$isCreated) { + $response->getBody()->write(json_encode(['status' => false, 'data' => ["message" => "Nao foi possivel gerar o Token de autenticacao!"]])); + return $response; + } + + $org = OrganizacaoUsuario::find(['id_usuario' => $usuario->id], ['id_organizacao']); + $org_id = $org->id_organizacao ?? '0'; + + $auditoria = [ + 'login' => $usuario->apelido, + 'id_prog' => '1', + 'full_ip' => $_SERVER['REMOTE_ADDR'], + 'full_uid' => time(), + 'full_prog_nome' => 'api.php', + 'full_tipo' => 'POST', + 'full_log' => json_encode( + [ + "usuario" => [ + 'id' => $usuario->id, + 'nome' => $usuario->nome, + 'email' => $usuario->email + ], + "request" => $body, + "server" => $_SERVER + ], + true + ), + 'org_id' => $org_id + ]; + + AuditaFull::create($auditoria); + $response->getBody()->write( + json_encode(['status' => true, 'data' => ["token" => $token, "refresh_token" => $refreshToken]]) + ); + + return $response; + } +} diff --git a/app/controllers/CallController.php b/app/controllers/CallController.php new file mode 100644 index 00000000..40cd2217 --- /dev/null +++ b/app/controllers/CallController.php @@ -0,0 +1,102 @@ +post('/bilhetes', [self::class, 'listarBilhetes']); + $group->post('/eventos', [self::class, 'listarEventos']); + }; + } + + function listarBilhetes(Request $request, Response $response, array $args) + { + try { + $body = json_decode($request->getBody()->getContents(), true); + $dados = $this->validateData($request, true); + + $query = "SELECT + a.id_bilhetes AS id, a.calldate AS data_hora, + a.src AS origem, a.dst AS destino, a.billsec AS tempo_conversacao, + a.duration AS tempo_atendimento, a.accountcode AS id_transfer, + a.uniqueid AS uniqueid, a.userfield AS nome_audio, + a.data_bilhete AS data, a.fora_horario AS fora_horario, + a.org_id + FROM pbx_bilhetes a + WHERE a.lastapp <> 'Transferred Call' "; + + $dados['org_id'] = $body['org_id']; + foreach ($dados as $k => $v) { + if ($v) { + $query .= " AND $k = :$k"; + } + } + + $data = Bilhetes::query($query, $dados); + if (!$data) { + $response->getBody()->write(json_encode(['status' => false, 'data' => ['message' => 'Nenhum resultado encontrado!']])); + } else { + $response->getBody()->write(json_encode(['status' => true, 'data' => $data])); + } + } catch (Exception $e) { + $response->getBody()->write(json_encode(['status' => false, 'data' => ["message" => "Nao foi possivel realizar a consulta! " . $e->getMessage()]])); + } + return $response; + } + + public function listarEventos(Request $request, Response $response, array $args) + { + try { + $body = json_decode($request->getBody()->getContents(), true); + $dados = $this->validateData($request, true); + $query = "SELECT + a.id_bilhetes AS id, + a.uniqueid, + c.id AS fila_id, + b.fila, + d.nome, + d.apelido AS login, + SUBSTRING(b.agente,7,4) AS matricula, + b.evento AS evento, + b.param1 AS param1, + b.param2 AS param2, + b.param3 AS param3, + b.param4 AS param4 + FROM pbx_bilhetes a + INNER JOIN pbx_eventos_dacs b ON a.uniqueid = b.uid2 + INNER JOIN pbx_dacs c ON c.nome = b.fila + INNER JOIN pbx_usuarios d ON d.matricula = SUBSTRING(b.agente,7,4) + WHERE evento IN ('ABANDON','COMPLETEAGENT','COMPLETECALLER','CONNECT','ENTERQUEUE', + 'EXITWITHTIMEOUT', 'TRANSBORDANDO', 'TRANSBORDADO','TRANSFER', 'TRANSFERORIG', + 'COMPLETACALLER', 'COMPLETAAGENT', 'ANSWERED', 'BUSYS', 'NOANSWERS') "; + + $dados['org_id'] = $body['org_id']; + $data = Bilhetes::query($query, $dados); + foreach ($dados as $k => $v) { + if ($v) { + $query .= " AND $k = :$k"; + } + } + + if (!$data) { + $response->getBody()->write(json_encode(['status' => false, 'data' => ['message' => 'Nenhum resultado encontrado!']])); + } else { + $response->getBody()->write(json_encode(['status' => true, 'data' => $data])); + } + } catch (Exception $e) { + $response->getBody()->write(json_encode(['status' => false, 'data' => ["message" => "Nao foi possivel realizar a consulta! " . $e->getMessage()]])); + } + return $response; + } +} diff --git a/app/controllers/QueueController.php b/app/controllers/QueueController.php new file mode 100644 index 00000000..4d5c5747 --- /dev/null +++ b/app/controllers/QueueController.php @@ -0,0 +1,46 @@ +post('/listar', [self::class, 'listarQueue']); + }; + } + + function listarQueue(Request $request, Response $response, array $args) + { + try { + $body = json_decode($request->getBody()->getContents(), true); + $dados = $this->validateData($request); + + $dados['org_id'] = $body['org_id']; + + $data = Queue::find($dados, [ + 'id', "REGEXP_REPLACE(nome, '@[0-9]+', '') AS nome", 'numero', 'musicclass', 'strategy', 'servicelevel', + 'status', 'tempo_ring', 'modo_atendimento', + 'disponivelfila', 'libera_pausa' + ]); + + if (!$data) { + $response->getBody()->write(json_encode(['status' => false, 'data' => ['message' => 'Nenhum resultado encontrado!']])); + } else { + $response->getBody()->write(json_encode(['status' => true, 'data' => $data])); + } + } catch (Exception $e) { + $response->getBody()->write(json_encode(['status' => false, 'data' => ["message" => "Nao foi possivel realizar a consulta! " . $e->getMessage()]])); + } + return $response; + } +} diff --git a/app/core/Connection.php b/app/core/Connection.php new file mode 100644 index 00000000..c9b06f9f --- /dev/null +++ b/app/core/Connection.php @@ -0,0 +1,37 @@ + 'postgres', + 'porta_db' => '5432', + 'base_db' => 'pbx', + 'usuario' => 'contacte', + 'senha' => 'ctepgSQL' + ]; + self::$instance = new PDO( + "pgsql:host={$cd['host_db']};port={$cd['porta_db']};dbname={$cd['base_db']}", + $cd['usuario'], + $cd['senha'], + [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, + PDO::ATTR_CASE => PDO::CASE_NATURAL + ] + ); + } + if (self::$instance) { + return self::$instance; + } + return null; + } +} diff --git a/app/core/Database.php b/app/core/Database.php new file mode 100644 index 00000000..6d24d2c9 --- /dev/null +++ b/app/core/Database.php @@ -0,0 +1,90 @@ +logger = new Logger('database_' . date('Ymd')); + } + + public function databaseLog() + { + return $this->logger; + } + + protected function strquery($stmt, $params) + { + foreach ($params as $key => $value) { + if (is_null($value) || (is_string($value) && $value == '')) { + $value = null; + } + if (is_bool($value)) { + $value = (int)$value; + } + $stmt->bindValue(":{$key}", $value, (is_int($value) ? PDO::PARAM_INT : PDO::PARAM_STR)); + } + } + + function create($query, $data) + { + try { + $stmt = Connection::getInstance()->prepare($query); + $this->strquery($stmt, $data); + $stmt->execute(); + return Connection::getInstance()->lastInsertId(); + } catch (PDOException $e) { + $this->logger->error(print_r(['error' => $e->getMessage(), 'query' => $query, 'data' => $data], true)); + } + } + + function read($query, $data = null) + { + try { + $stmt = Connection::getInstance()->prepare($query); + $this->strquery($stmt, $data); + $stmt->execute(); + if ($stmt->rowCount() > 0) { + return $stmt; + } + return null; + } catch (PDOException $e) { + $this->logger->error(print_r(['error' => $e->getMessage(), 'query' => $query, 'data' => $data], true)); + } + } + + function delete($query, $data): int + { + try { + $stmt = Connection::getInstance()->prepare($query); + $this->strquery($stmt, $data); + $stmt->execute(); + return ($stmt->rowCount() ? 1 : 0); + } catch (Exception $e) { + $this->logger->error(print_r(['error' => $e->getMessage(), 'query' => $query, 'data' => $data], true)); + } + return 0; + } + + function update($query, $data): int + { + try { + $stmt = Connection::getInstance()->prepare($query); + $this->strquery($stmt, $data); + $stmt->execute(); + return $stmt->rowCount() ? 1 : 0; + } catch (Exception $e) { + $this->logger->error(print_r(['error' => $e->getMessage(), 'query' => $query, 'data' => $data], true)); + } + return 0; + } +} diff --git a/app/core/Repository.php b/app/core/Repository.php new file mode 100644 index 00000000..812f2640 --- /dev/null +++ b/app/core/Repository.php @@ -0,0 +1,318 @@ + $value) { + $dados[$key] = $value; + if (array_key_last($params) == $key) { + $query .= " $key )"; + } else { + $query .= " $key, "; + } + } + $query .= " VALUES( "; + foreach ($params as $key => $value) { + if (array_key_last($params) == $key) { + $query .= " :$key );"; + } else { + $query .= " :$key, "; + } + } + return $db->create($query, $dados); + } catch (Exception $e) { + $db->databaseLog()->error(print_r( + [ + 'error' => $e->getMessage(), + __FUNCTION__ => $table, + 'query' => $query, + 'params' => $params + ], + true + )); + } + } + + public static function query(string $query, array $params = []) + { + $db = new Database(); + try { + $data = $db->read($query, $params); + if (!$data) { + return []; + } + return $data?->fetchAll(); + } catch (Exception $e) { + $db->databaseLog()->error(print_r( + [ + 'error' => $e->getMessage(), + __FUNCTION__ => 'custom', + 'query' => $query, + 'params' => $params + ], + true + )); + } + } + + public static function find(array $params = [], array $columns = []): array | stdClass + { + $db = new Database(); + try { + $table = static::$table; + $column = count($columns) > 0 ? implode(',', $columns) : "*"; + $query = "SELECT $column FROM $table WHERE 1 = 1"; + foreach ($params as $k => $v) { + $query .= " AND $k = :$k"; + } + $db->databaseLog()->error($query); + + $data = $db->read($query, $params); + if (!$data) { + return []; + } + return $data->fetch(); + } catch (Exception $e) { + $db->databaseLog()->error(print_r( + [ + 'error' => $e->getMessage(), + __FUNCTION__ => $table, + 'query' => $query, + 'params' => $params, + 'columns' => $columns + ], + true + )); + } + } + + public static function get(array $params = [], array $columns = []): array | stdClass + { + $db = new Database(); + try { + $table = static::$table; + $column = count($columns) > 0 ? implode(',', $columns) : "*"; + $query = "SELECT $column FROM $table WHERE 1 = 1"; + foreach ($params as $k => $v) { + $query .= " AND $k = :$k"; + } + + $data = $db->read($query, $params); + if (!$data) { + return null; + } + return $data->fetchAll(); + } catch (Exception $e) { + $db->databaseLog()->error(print_r( + [ + 'error' => $e->getMessage(), + __FUNCTION__ => $table, + 'query' => $query, + 'params' => $params, + 'columns' => $columns + ], + true + )); + } + } + + public static function update(array $params, array $where) + { + $db = new Database(); + try { + $dados = array_filter($params); + $table = static::$table; + $query = "UPDATE $table SET "; + foreach ($dados as $key => $value) { + if (array_key_last($dados) == $key) { + $query .= " $key = :$key"; + } else { + $query .= " $key = :$key, "; + } + } + $query .= " WHERE 1 = 1 "; + if (empty($where)) { + throw new Exception("Parâmetro (where) é obrigatório! [Table: $table] where: ['column' => 'value']"); + } + + foreach ($where as $column => $value) { + $query .= "AND $column = :$column"; + $dados[$column] = $value; + } + + return $db->update($query, $dados); + } catch (Exception $e) { + $db->databaseLog()->error(print_r( + [ + 'error' => $e->getMessage(), + __FUNCTION__ => $table, + 'query' => $query, + 'params' => $params, + 'where' => $where + ], + true + )); + } + } + + public static function delete(array $where): int + { + $db = new Database(); + try { + $table = static::$table; + $dados = []; + $query = "DELETE FROM $table WHERE 1 = 1"; + if (empty($where)) { + throw new Exception("Parâmetro (where) é obrigatório! [Table: $table] where: ['column' => 'value']"); + } + + foreach ($where as $column => $value) { + $query .= "AND $column = :$column"; + $dados[$column] = $value; + } + + return $db->delete($query, $dados); + } catch (Exception $e) { + $db->databaseLog()->error(print_r( + [ + 'error' => $e->getMessage(), + __FUNCTION__ => $table, + 'query' => $query, + 'where' => $where + ], + true + )); + } + return 0; + } + + + // function create(array $params) + // { + // $dados = []; + // try { + // $table = $this->table; + // $query = "INSERT INTO $table ("; + // foreach ($params as $key => $value) { + // $dados[$key] = $value; + // if (array_key_last($params) == $key) { + // $query .= " $key )"; + // } else { + // $query .= " $key, "; + // } + // } + // $query .= " VALUES( "; + // foreach ($params as $key => $value) { + // if (array_key_last($params) == $key) { + // $query .= " :$key );"; + // } else { + // $query .= " :$key, "; + // } + // } + // return $this->db->create($query, $dados); + // } catch (Exception $e) { + // } + // } + + // function list(array $params = []) + // { + // try { + // $table = $this->table; + // $query = "SELECT * FROM $table"; + // $data = $this->db->read($query, $params); + // if (!$data) { + // return []; + // } + // return $data->fetchAll(); + // } catch (Exception $e) { + // } + // } + + // function update(array $params, $where) + // { + // try { + // $dados = array_filter($params); + // $table = $this->table; + // $query = "UPDATE $table SET "; + // foreach ($dados as $key => $value) { + // if (array_key_last($dados) == $key) { + // $query .= " $key = :$key"; + // } else { + // $query .= " $key = :$key, "; + // } + // } + // $query .= " WHERE 1 = 1 "; + // if (empty($where)) { + // throw new Exception("Parâmetro (where) é obrigatório! [Table: $table] where: ['column' => 'value']"); + // } + + // foreach ($where as $column => $value) { + // $query .= "AND $column = :$column"; + // $dados[$column] = $value; + // } + + // return $this->db->update($query, $dados); + // } catch (Exception $e) { + // } + // } + + // function delete(array $where): int + // { + // try { + // $table = $this->table; + // $dados = []; + // $query = "DELETE FROM $table WHERE 1 = 1"; + // if (empty($where)) { + // throw new Exception("Parâmetro (where) é obrigatório! [Table: $table] where: ['column' => 'value']"); + // } + + // foreach ($where as $column => $value) { + // $query .= "AND $column = :$column"; + // $dados[$column] = $value; + // } + + // return $this->db->delete($query, $dados); + // } catch (Exception $e) { + // } + // return 0; + // } + + // function get(array $params = null, $limit = 100) + // { + // try { + // $table = $this->table; + // $dados = []; + // $query = "SELECT * FROM $table WHERE 1=1 "; + // if (empty($params)) { + // $query .= " ORDER BY 1 LIMIT $limit"; + // } else { + // foreach ($params as $column => $value) { + // $query .= "AND $column = :$column"; + // $dados[$column] = $value; + // } + // } + + // $data = $this->db->read($query, $dados); + // if (!$data) { + // return []; + // } + // return $data->fetch(); + // } catch (Exception $e) { + // } + // } +} diff --git a/app/middleware/AuthMiddleware.php b/app/middleware/AuthMiddleware.php new file mode 100644 index 00000000..3fcf2c1b --- /dev/null +++ b/app/middleware/AuthMiddleware.php @@ -0,0 +1,30 @@ +findToken($request); + $response = $handler->handle($request); + } catch (Exception $e) { + $fac = new ResponseFactory; + $response = $fac->createResponse(403); + $message = mb_convert_encoding($e->getMessage(), 'ISO8859-1'); + $response->withStatus(403)->withHeader('Content-Type', 'application/json')->getBody()->write( + json_encode(['status' => false, 'data' => ['message' => $message]]) + ); + } + return $response; + } +} diff --git a/app/models/Audita.php b/app/models/Audita.php new file mode 100644 index 00000000..0fbf89e6 --- /dev/null +++ b/app/models/Audita.php @@ -0,0 +1,31 @@ +name = $nameLog; + $this->path = $path; + $this->active = $active; + $this->config($nameLog); + } + + ######################################################################## + ## TYPES ## + ######################################################################## + + public function success($log, $debug_trace = null) + { + $this->type = self::LOG_SUCCESS; + $this->text = $log; + $this->header($log, $debug_trace ? $debug_trace : debug_backtrace()); + $this->write(); + } + + public function debug($log, $debug_trace = null) + { + $this->type = self::LOG_DEBUG; + $this->text = $log; + $this->header($log, $debug_trace ? $debug_trace : $this->name); + $this->write(); + } + + public function info($log, $debug_trace = null) + { + $this->type = self::LOG_INFO; + $this->text = $log; + $this->header($log, $debug_trace ? $debug_trace : $this->name); + $this->write(); + } + + public function error($log, $debug_trace = null) + { + $this->type = self::LOG_ERROR; + $this->text = $log; + $this->header($log, $debug_trace ? $debug_trace : $this->name); + $this->write(); + } + + public function warning($log, $debug_trace = null) + { + $this->type = self::LOG_WARNING; + $this->text = $log; + $this->header($log, $debug_trace ? $debug_trace : $this->name); + $this->write(); + } + + ######################################################################## + ## IMPORTANT ## + ######################################################################## + + private function write() + { + if ($this->active) { + file_put_contents($this->file, $this->log, FILE_APPEND); + } + } + + private function header($log, $debug_trace) + { + $this->log = "________________________________________________________________________________________\n"; + if (is_array($debug_trace)) { + $method = $debug_trace[0]['class'] ? "{$debug_trace[0]['class']}::{$debug_trace[0]['function']}" : $debug_trace[0]['function']; + $args = null; + $x = 0; + if (count($debug_trace[0]['args']) > 0) { + foreach ($debug_trace[0]['args'] as $key => $arg) { + $x++; + $args .= $arg; + if (count($debug_trace[0]['args']) != $x) { + $args .= ","; + } + } + } + $this->log .= sprintf("\n[ %s ][ LINE %s ][ %s ][ ARGS ($args) ][ %s ]\n\n", date('d/m/Y H:i:s'), $debug_trace[0]['line'], $method, $this->type); + } else { + $this->log .= sprintf("\n[ %s ][ %s ][ %s ]\n\n", date('d/m/Y H:i:s'), $debug_trace, $this->type); + } + $this->log .= "> " . $log; + $this->log .= "\n\n ---------------------------------- [ FINISH LOGGER ] ----------------------------------\n\n"; + } + + public function openLog() + { + //$file = fopen($this->file, 'rb'); + } + + public function locateLog() + { + echo "\n\n {$this->file} \n\n"; + } + + ######################################################################## + ## CONFIGS ## + ######################################################################## + + public function config($name, $exten = ".log", $prefix = null) + { + if (file_exists($this->file)) { + $contents = file_get_contents($this->file); + } + + $this->file = trim($this->path . $prefix . ($name ? $name : $this->name) . $exten); + file_put_contents($this->file, $contents ? $contents : "", FILE_APPEND); + } + + public function getType() + { + return $this->type; + } + + public function getText() + { + return $this->text; + } + + public function setLogger($active) + { + if ($this->active === true) { + $this->active = $active; + } else if ($active === false) { + $this->active = $active; + } else { + $this->active = true; + } + } +} diff --git a/app/traits/AuthToken.php b/app/traits/AuthToken.php new file mode 100644 index 00000000..87b9ab4f --- /dev/null +++ b/app/traits/AuthToken.php @@ -0,0 +1,46 @@ +getBody()->getContents(), true); + $headers = $request->getHeader('Authorization'); + $bearerToken = str_replace('Bearer ', '', $headers[0]); + + if (empty($bearerToken)) { + throw new Exception('Informe o token.'); + } + + if (empty($body['org_id'])) { + throw new Exception('Informe o org_id.'); + } + + $tokenEmpresa = Token::query( + "SELECT pu.id as user_id, t.id as token_id, pou.id_organizacao, t.token, t.expired_at + FROM pbx_usuarios pu + INNER JOIN pbx_tokens t ON t.id_usuario = pu.id + INNER JOIN pbx_organizacao_usuarios pou ON pou.id_usuario = pu.id + WHERE t.token = :token AND id_organizacao = :org_id;", + ["token" => $bearerToken, 'org_id' => $body['org_id']] + ); + + if (empty($tokenEmpresa)) { + throw new Exception('Requisicao nao autorizada, por favor verifique o token e a permissao de acesso!'); + } + + $expiredDate = new DateTime($tokenEmpresa[0]->expired_at); + $now = new DateTime(); + if ($expiredDate < $now) { + throw new Exception('Token expirado, realize uma nova autenticacao.'); + } + return $tokenEmpresa; + } +} diff --git a/app/traits/Validate.php b/app/traits/Validate.php new file mode 100644 index 00000000..12431d2d --- /dev/null +++ b/app/traits/Validate.php @@ -0,0 +1,51 @@ +getBody()->getContents(), true); + $parametro = Parametro::find(['org_id' => $body['org_id']], ['prm_max_dias_relatorio']); + $datas = []; + + $filters = [ + 'id', 'uniqueid', 'origem', 'destino', + 'fila', 'org_id', 'data_inicial', + 'data_final', 'agente', 'apelido', + 'nome', 'ramal', 'evento' + ]; + + foreach ($body as $k => $v) { + if (!in_array($k, $filters)) { + throw new Exception("O parametro informado e invalido [$k]!"); + } + } + + if ($data) { + $datas['data_inicial'] = $body['data_inicial'] ?? date('Y-m-d H:i:s'); + $datas['data_final'] = $body['data_final'] ?? date('Y-m-d H:i:s'); + + if (($body['data_inicial'] && $body['data_final']) && strtotime($body['data_inicial']) > strtotime($body['data_final'])) { + throw new Exception('A [data_inicial] nao pode ser maior que [data_final]!'); + } + + if ($body['data_final'] && strtotime($datas['data_inicial']) > strtotime($body['data_final'])) { + throw new Exception('Informe o parametro de [data_inicial]!'); + } + + if ($parametro->prm_max_dias_relatorio) { + if (strtotime($datas['data_inicial']) > strtotime($body['data_inicial'] . "+" . $parametro->prm_max_dias_relatorio . "days")) { + throw new Exception("O periodo nao pode ultrapassar " . $parametro->prm_max_dias_relatorio . " dias!"); + } + } + } + return $datas; + } +} diff --git a/cadOrganizacao.log b/cadOrganizacao.log deleted file mode 100644 index e69de29b..00000000 diff --git a/composer.json b/composer.json new file mode 100644 index 00000000..9561ded6 --- /dev/null +++ b/composer.json @@ -0,0 +1,24 @@ +{ + "name": "simplesip/aplicativo", + "description": "Projeto Simples IP", + "authors": [{ + "name": "Simples IP Desenvolvimento", + "email": "desenvolvimento@simplesip.com.br" + }], + "autoload": { + "psr-4": { + "app\\": "app/" + } + }, + "require": { + "slim/slim": "4.*", + "slim/psr7": "^1.6", + "tuupola/cors-middleware": "^1.3", + "firebase/php-jwt": "^6.3" + }, + "config": { + "optimize-autoloader": false, + "classmap-authoritative": false + } + +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 00000000..0ebf0709 --- /dev/null +++ b/composer.lock @@ -0,0 +1,1095 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "fdbb6dffe913987160bb9dd2cbde94e0", + "packages": [ + { + "name": "fig/http-message-util", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message-util.git", + "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message-util/zipball/9d94dc0154230ac39e5bf89398b324a86f63f765", + "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765", + "shasum": "" + }, + "require": { + "php": "^5.3 || ^7.0 || ^8.0" + }, + "suggest": { + "psr/http-message": "The package containing the PSR-7 interfaces" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Fig\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Utility classes and constants for use with PSR-7 (psr/http-message)", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-message-util/issues", + "source": "https://github.com/php-fig/http-message-util/tree/1.1.5" + }, + "time": "2020-11-24T22:02:12+00:00" + }, + { + "name": "firebase/php-jwt", + "version": "v6.10.0", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "a49db6f0a5033aef5143295342f1c95521b075ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/a49db6f0a5033aef5143295342f1c95521b075ff", + "reference": "a49db6f0a5033aef5143295342f1c95521b075ff", + "shasum": "" + }, + "require": { + "php": "^7.4||^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^6.5||^7.4", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psr/cache": "^1.0||^2.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/v6.10.0" + }, + "time": "2023-12-01T16:26:39+00:00" + }, + { + "name": "neomerx/cors-psr7", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/neomerx/cors-psr7.git", + "reference": "515d7fdb60b9d475da70029d4e5662beaae1875f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/neomerx/cors-psr7/zipball/515d7fdb60b9d475da70029d4e5662beaae1875f", + "reference": "515d7fdb60b9d475da70029d4e5662beaae1875f", + "shasum": "" + }, + "require": { + "php": ">=8.0.0", + "psr/http-message": "^1.0", + "psr/log": "^3.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.11", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^9.2", + "scrutinizer/ocular": "^1.4", + "squizlabs/php_codesniffer": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Neomerx\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "neomerx", + "email": "info@neomerx.com" + } + ], + "description": "Framework agnostic (PSR-7) CORS implementation (www.w3.org/TR/cors/)", + "homepage": "https://github.com/neomerx/cors-psr7", + "keywords": [ + "Cross Origin Resource Sharing", + "Cross-Origin Resource Sharing", + "cors", + "neomerx", + "psr-7", + "psr7", + "w3.org", + "www.w3.org" + ], + "support": { + "issues": "https://github.com/neomerx/cors-psr7/issues", + "source": "https://github.com/neomerx/cors-psr7/tree/3.0.2" + }, + "time": "2022-11-28T03:29:06+00:00" + }, + { + "name": "nikic/fast-route", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/FastRoute.git", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "FastRoute\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov", + "email": "nikic@php.net" + } + ], + "description": "Fast request router for PHP", + "keywords": [ + "router", + "routing" + ], + "support": { + "issues": "https://github.com/nikic/FastRoute/issues", + "source": "https://github.com/nikic/FastRoute/tree/master" + }, + "time": "2018-02-13T20:26:39+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "e616d01114759c4c489f93b099585439f795fe35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + }, + "time": "2023-04-10T20:10:41+00:00" + }, + { + "name": "psr/http-message", + "version": "1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/1.1" + }, + "time": "2023-04-04T09:50:52+00:00" + }, + { + "name": "psr/http-server-handler", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-handler.git", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side request handler", + "keywords": [ + "handler", + "http", + "http-interop", + "psr", + "psr-15", + "psr-7", + "request", + "response", + "server" + ], + "support": { + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" + }, + "time": "2023-04-10T20:06:20+00:00" + }, + { + "name": "psr/http-server-middleware", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-middleware.git", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-server-handler": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side middleware", + "keywords": [ + "http", + "http-interop", + "middleware", + "psr", + "psr-15", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-server-middleware/issues", + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" + }, + "time": "2023-04-11T06:14:47+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "slim/psr7", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/slimphp/Slim-Psr7.git", + "reference": "72d2b2bac94ab4575d369f605dbfafbe168d3163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/slimphp/Slim-Psr7/zipball/72d2b2bac94ab4575d369f605dbfafbe168d3163", + "reference": "72d2b2bac94ab4575d369f605dbfafbe168d3163", + "shasum": "" + }, + "require": { + "fig/http-message-util": "^1.1.5", + "php": "^7.4 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0", + "symfony/polyfill-php80": "^1.26" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "adriansuter/php-autoload-override": "^1.3", + "ext-json": "*", + "http-interop/http-factory-tests": "^0.9.0", + "php-http/psr7-integration-tests": "1.1", + "phpspec/prophecy": "^1.15", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/phpstan": "^1.8", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Slim\\Psr7\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Josh Lockhart", + "email": "hello@joshlockhart.com", + "homepage": "http://joshlockhart.com" + }, + { + "name": "Andrew Smith", + "email": "a.smith@silentworks.co.uk", + "homepage": "http://silentworks.co.uk" + }, + { + "name": "Rob Allen", + "email": "rob@akrabat.com", + "homepage": "http://akrabat.com" + }, + { + "name": "Pierre Berube", + "email": "pierre@lgse.com", + "homepage": "http://www.lgse.com" + } + ], + "description": "Strict PSR-7 implementation", + "homepage": "https://www.slimframework.com", + "keywords": [ + "http", + "psr-7", + "psr7" + ], + "support": { + "issues": "https://github.com/slimphp/Slim-Psr7/issues", + "source": "https://github.com/slimphp/Slim-Psr7/tree/1.6.1" + }, + "time": "2023-04-17T16:02:20+00:00" + }, + { + "name": "slim/slim", + "version": "4.12.0", + "source": { + "type": "git", + "url": "https://github.com/slimphp/Slim.git", + "reference": "e9e99c2b24398b967841c6c4c3048622cc7e2b18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/slimphp/Slim/zipball/e9e99c2b24398b967841c6c4c3048622cc7e2b18", + "reference": "e9e99c2b24398b967841c6c4c3048622cc7e2b18", + "shasum": "" + }, + "require": { + "ext-json": "*", + "nikic/fast-route": "^1.3", + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "adriansuter/php-autoload-override": "^1.4", + "ext-simplexml": "*", + "guzzlehttp/psr7": "^2.5", + "httpsoft/http-message": "^1.1", + "httpsoft/http-server-request": "^1.1", + "laminas/laminas-diactoros": "^2.17", + "nyholm/psr7": "^1.8", + "nyholm/psr7-server": "^1.0", + "phpspec/prophecy": "^1.17", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.6", + "slim/http": "^1.3", + "slim/psr7": "^1.6", + "squizlabs/php_codesniffer": "^3.7" + }, + "suggest": { + "ext-simplexml": "Needed to support XML format in BodyParsingMiddleware", + "ext-xml": "Needed to support XML format in BodyParsingMiddleware", + "php-di/php-di": "PHP-DI is the recommended container library to be used with Slim", + "slim/psr7": "Slim PSR-7 implementation. See https://www.slimframework.com/docs/v4/start/installation.html for more information." + }, + "type": "library", + "autoload": { + "psr-4": { + "Slim\\": "Slim" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Josh Lockhart", + "email": "hello@joshlockhart.com", + "homepage": "https://joshlockhart.com" + }, + { + "name": "Andrew Smith", + "email": "a.smith@silentworks.co.uk", + "homepage": "http://silentworks.co.uk" + }, + { + "name": "Rob Allen", + "email": "rob@akrabat.com", + "homepage": "http://akrabat.com" + }, + { + "name": "Pierre Berube", + "email": "pierre@lgse.com", + "homepage": "http://www.lgse.com" + }, + { + "name": "Gabriel Manricks", + "email": "gmanricks@me.com", + "homepage": "http://gabrielmanricks.com" + } + ], + "description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs", + "homepage": "https://www.slimframework.com", + "keywords": [ + "api", + "framework", + "micro", + "router" + ], + "support": { + "docs": "https://www.slimframework.com/docs/v4/", + "forum": "https://discourse.slimframework.com/", + "irc": "irc://irc.freenode.net:6667/slimphp", + "issues": "https://github.com/slimphp/Slim/issues", + "rss": "https://www.slimframework.com/blog/feed.rss", + "slack": "https://slimphp.slack.com/", + "source": "https://github.com/slimphp/Slim", + "wiki": "https://github.com/slimphp/Slim/wiki" + }, + "funding": [ + { + "url": "https://opencollective.com/slimphp", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/slim/slim", + "type": "tidelift" + } + ], + "time": "2023-07-23T04:54:29+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "tuupola/callable-handler", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/tuupola/callable-handler.git", + "reference": "0bc7b88630ca753de9aba8f411046856f5ca6f8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tuupola/callable-handler/zipball/0bc7b88630ca753de9aba8f411046856f5ca6f8c", + "reference": "0bc7b88630ca753de9aba8f411046856f5ca6f8c", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0", + "psr/http-server-middleware": "^1.0" + }, + "require-dev": { + "overtrue/phplint": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0", + "squizlabs/php_codesniffer": "^3.2", + "tuupola/http-factory": "^0.4.0|^1.0", + "zendframework/zend-diactoros": "^1.6.0|^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Tuupola\\Middleware\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mika Tuupola", + "email": "tuupola@appelsiini.net", + "homepage": "https://appelsiini.net/", + "role": "Developer" + } + ], + "description": "Compatibility layer for PSR-7 double pass and PSR-15 middlewares.", + "homepage": "https://github.com/tuupola/callable-handler", + "keywords": [ + "middleware", + "psr-15", + "psr-7" + ], + "support": { + "issues": "https://github.com/tuupola/callable-handler/issues", + "source": "https://github.com/tuupola/callable-handler/tree/1.1.0" + }, + "funding": [ + { + "url": "https://github.com/tuupola", + "type": "github" + } + ], + "time": "2020-09-09T08:31:54+00:00" + }, + { + "name": "tuupola/cors-middleware", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/tuupola/cors-middleware.git", + "reference": "8fd7674f4c1910203685765f2e26ecdde57a25ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tuupola/cors-middleware/zipball/8fd7674f4c1910203685765f2e26ecdde57a25ab", + "reference": "8fd7674f4c1910203685765f2e26ecdde57a25ab", + "shasum": "" + }, + "require": { + "neomerx/cors-psr7": "^2.0|^3.0", + "php": "^7.2|^8.0", + "psr/http-message": "^1.0.1", + "psr/http-server-middleware": "^1.0", + "tuupola/callable-handler": "^1.0", + "tuupola/http-factory": "^1.0.2" + }, + "require-dev": { + "equip/dispatch": "^2.0", + "nyholm/psr7": "^1.5", + "overtrue/phplint": "^3.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^7.0|^8.0|^9.0", + "rector/rector": "^0.14.0", + "symplify/easy-coding-standard": "^11.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Tuupola\\Middleware\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mika Tuupola", + "email": "tuupola@appelsiini.net", + "homepage": "https://appelsiini.net/", + "role": "Developer" + } + ], + "description": "PSR-7 and PSR-15 CORS middleware", + "homepage": "https://github.com/tuupola/cors-middleware", + "keywords": [ + "cors", + "middleware", + "psr-15", + "psr-7" + ], + "support": { + "issues": "https://github.com/tuupola/cors-middleware/issues", + "source": "https://github.com/tuupola/cors-middleware/tree/1.4.3" + }, + "funding": [ + { + "url": "https://github.com/tuupola", + "type": "github" + } + ], + "time": "2022-10-11T11:29:25+00:00" + }, + { + "name": "tuupola/http-factory", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/tuupola/http-factory.git", + "reference": "ae3f8fbdd31cf2f1bbe920b38963c5e4d1e9c454" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tuupola/http-factory/zipball/ae3f8fbdd31cf2f1bbe920b38963c5e4d1e9c454", + "reference": "ae3f8fbdd31cf2f1bbe920b38963c5e4d1e9c454", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0", + "psr/http-factory": "^1.0" + }, + "conflict": { + "nyholm/psr7": "<1.0" + }, + "provide": { + "psr/http-factory-implementation": "^1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9.0", + "overtrue/phplint": "^3.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0", + "squizlabs/php_codesniffer": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Tuupola\\Http\\Factory\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mika Tuupola", + "email": "tuupola@appelsiini.net", + "homepage": "https://appelsiini.net/", + "role": "Developer" + } + ], + "description": "Lightweight autodiscovering PSR-17 HTTP factories", + "homepage": "https://github.com/tuupola/http-factory", + "keywords": [ + "http", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/tuupola/http-factory/issues", + "source": "https://github.com/tuupola/http-factory/tree/1.4.0" + }, + "funding": [ + { + "url": "https://github.com/tuupola", + "type": "github" + } + ], + "time": "2021-09-14T12:46:25+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/doc/Atendimento.rtf b/doc/Atendimento.rtf deleted file mode 100644 index 20529b65..00000000 --- a/doc/Atendimento.rtf +++ /dev/null @@ -1,67 +0,0 @@ -{\rtf1\ansi\deff3\adeflang1025 -{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}{\f4\fswiss\fprq2\fcharset0 Liberation Sans{\*\falt Arial};}{\f5\fnil\fprq0\fcharset2 OpenSymbol{\*\falt Arial Unicode MS};}{\f6\fnil\fprq2\fcharset0 AR PL UMing HK;}{\f7\fnil\fprq2\fcharset0 Lohit Devanagari;}{\f8\fnil\fprq0\fcharset0 Lohit Devanagari;}} -{\colortbl;\red0\green0\blue0;\red128\green128\blue128;} -{\stylesheet{\s0\snext0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033 Normal;} -{\*\cs15\snext15\b\ab Strong Emphasis;} -{\*\cs16\snext16\dbch\af5\dbch\af5\loch\f5 Bullets;} -{\s17\sbasedon0\snext18\sb240\sa120\keepn\dbch\af6\dbch\af7\afs28\loch\f4\fs28 Heading;} -{\s18\sbasedon0\snext18\sl288\slmult1\sb0\sa140 Text Body;} -{\s19\sbasedon18\snext19\sl288\slmult1\sb0\sa140\dbch\af8 List;} -{\s20\sbasedon0\snext20\sb120\sa120\noline\i\dbch\af8\afs24\ai\fs24 Caption;} -{\s21\sbasedon0\snext21\noline\dbch\af8 Index;} -}{\info{\author root }{\creatim\yr2017\mo6\dy5\hr8\min47}{\author root }{\revtim\yr2017\mo6\dy23\hr17\min25}{\printim\yr0\mo0\dy0\hr0\min0}{\comment LibreOffice}{\vern67241986}}\deftab709 -\viewscale120 -{\*\pgdsctbl -{\pgdsc0\pgdscuse451\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Default Style;}} -\formshade\paperh15840\paperw12240\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\sectunlocked1\pgndec\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc -\pgndec\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033\qc{\rtlch \ltrch\loch -Chamada Entrante} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\rtlch \ltrch - }{\b\ab\rtlch \ltrch - }{\b\ab\rtlch \ltrch\loch -Defini\u231\'e7\u227\'e3o} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\rtlch \ltrch - }{\rtlch \ltrch\loch -\tab } -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\rtlch \ltrch\loch -\tab Chamada recebida da p\u250\'fablica fixo ou m\u243\'f3vel, local, interurbana ou internacional,} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\rtlch \ltrch - } -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\b\ab\rtlch \ltrch - }{\b\ab\rtlch \ltrch\loch -Tipo de Atendimento }{\rtlch \ltrch\loch - } -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\rtlch \ltrch - } -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\ul\ulc0\b\ab\rtlch \ltrch\loch -Eletr\u244\'f4nico}{\rtlch \ltrch\loch - } -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\rtlch \ltrch\loch -\tab Consideramos atendimento eletr\u244\'f4nico aquele que objetiva resolver o problama do usu\u225\'e1rio sem a necessidade de intera\u231\'e7\u227\'e3o humana e ocorre em uma das situa\u231\'e7\u245\'f5es abaixo:} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\b\ab\rtlch \ltrch\loch -\tab URA} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\b\ab\rtlch \ltrch\loch -\tab }{\rtlch \ltrch\loch - \tab Sistema interativo, capaz de emitir a segunda via de uma fatura por exemplo;} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\b\ab\rtlch \ltrch\loch -\tab Voice Mail } -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\b0\ab0\rtlch \ltrch\loch -\tab \tab Sistema que armazena e gerencia mensagens de voz gravadas;} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\b\ab\rtlch \ltrch\loch -\tab An\u250\'fancio } -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\b0\ab0\rtlch \ltrch\loch -\tab \tab Sistema normalmente utilizado para informar o usu\u225\'e1rio, como por exemplo nos feri\u225\'e1dos.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\rtlch \ltrch - } -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\ul\ulc0\b\ab\rtlch \ltrch\loch -DAC ou Fila}{\ul\ulc0\rtlch \ltrch\loch - } -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\rtlch \ltrch\loch -\tab A chamada passa por um sistema de gerenciamento que organiza as chamadas em fila para posterior atendimento humano, esta pode ser atendida imediatamente, ap\u243\'f3s espera ou ainda abandonada.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033\rtlch \ltrch\loch - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\ul\ulc0\b\ab\rtlch \ltrch\loch -Ramal} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ltrpar\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\rtlch \ltrch\loch -\tab A chamada \u233\'e9 direcionada para uma ramal interno para atendimento humano.} -\par } \ No newline at end of file diff --git a/doc/Perfil/perfil-apl.txt b/doc/Perfil/perfil-apl.txt deleted file mode 100644 index e80396a9..00000000 --- a/doc/Perfil/perfil-apl.txt +++ /dev/null @@ -1,68 +0,0 @@ - -Perfil de Usuários. - - O perfil de usuários do sistema é baseado em grupos, estes sdão inicialmente serão gerados pelo super usuário(admin) que tem acesso nativo a todas as funçoes do sistema, -e portanto, pode adcionar qualquer funcionalidade a qualquer grupo. O admin deverá criar um grupo inicial denominado Administrador que conterá todas as funcionalidades -necessária para administrar o sistema e será adicionado o usuário de mesmo nome, o qual deverá ser usado para gerar o perfil inicial do sistema. - Um usuário pode ser adicionado a diversos grupos herdando todas as funcionalidade dos mesmos, este usuario podera portanto fornecer as mesmas permissões a outros -usuarios por ele gerenciado. - -Tabelas: - Cria grupo de usuários, para dar permissões individuais aos usuarios icluindo automaticamente um grupo para cada usuário com o mesmo nome, -os mesmos deverão aparecer na tela de gerenciamento de grupos e conterão apenas o login correspondente. - -CREATE TABLE pbx_grupo -( - gp_id integer NOT NULL DEFAULT nextval('pbx_grupo_gp_id_seq'::regclass), - gp_nome character varying(50) NOT NULL, --> Nome do grupo - gp_status integer NOT NULL DEFAULT 1, --> Status 0 desativado 1 ativado - user_id integer NOT NULL DEFAULT 0, --> Cria um grupo para cada usuario, para fazer permissoes individualizadas. - gp_user integer NOT NULL DEFAULT 0, --> Dono do grupo, ou seja usuario que o criou. Usado para verificacao na delecao do usuario. - CONSTRAINT "pkGrupId" PRIMARY KEY (gp_id), - CONSTRAINT "idxGrupNome" UNIQUE (gp_nome, user_id) -); - --- Index: "idxDonoGrupo" --- DROP INDEX "idxDonoGrupo"; -CREATE INDEX "idxDonoGrupo" ON pbx_grupo USING btree (gp_id, gp_user); - - -Relaciona usuários a grupos, os usuários constantes no grupo herdardão suas permissões. -REATE TABLE pbx_grupo_usuario -( - user_id integer NOT NULL, - gp_id integer NOT NULL, - CONSTRAINT "pkGpUserId" PRIMARY KEY (user_id, gp_id), - CONSTRAINT "fkUsuarios" FOREIGN KEY (user_id) - REFERENCES pbx_usuarios (id) MATCH SIMPLE - ON UPDATE NO ACTION ON DELETE NO ACTION -); - --- Index: "idxUsuariosGrupos" --- DROP INDEX "idxUsuariosGrupos"; -CREATE INDEX "idxUsuariosGrupos" ON pbx_grupo_usuario USING btree (gp_id); - -Relaciona o grupo e suas funçoes. --- Table: pbx_grupo_funcoes --- DROP TABLE pbx_grupo_funcoes; -CREATE TABLE pbx_grupo_funcoes -( - gp_id integer NOT NULL, - fun_id integer NOT NULL, - CONSTRAINT "pkGrupoFunc" PRIMARY KEY (gp_id, fun_id) -); - -Regras: - 1 -> O usuário pode pertencer a diversos grupos. - 2 -> O usuário herda as funcionalidades de todos os grupos. - 3 -> A restrissão aplicada aos ramais é um caso especial, pois irá bloquear o acesso a todos os usuários do grupo, e irá prevalecer a qualquer liberação. - Para se criar um bloqueio individualizado deve-se aplicar o bloqueio apenas ao usuario em questdão. - 4 -> Um usuário poderá dar o mesmo nível de permissões que possue para outros usuários. - 5 -> Para se remover uma permissdão de um usuário devera faze-lo de forma recursiva removendo também dos outros usuários que herdaram suas permissões. - 6 -> Para se remover um usuário deve-se verificar suas dependências. - - - - - - diff --git a/doc/backup/default.sql b/doc/backup/default.sql deleted file mode 100644 index 656c7389..00000000 --- a/doc/backup/default.sql +++ /dev/null @@ -1,42 +0,0 @@ - -delete from pbx_backup_arquivos; -delete from pbx_backup; -delete from pbx_backup_configuracao; -delete from pbx_backup_destino; -delete from pbx_backup_protocolo; -delete from pbx_backup_tipo; -delete from pbx_backup_frequencia_qtde; -delete from pbx_backup_frequencia; - - - ---- Tipo -insert into pbx_backup_tipo values(1;'Áudio'); -insert into pbx_backup_tipo values2;'Configurações'); -insert into pbx_backup_tipo values3;'Configurações/Dados'); -insert into pbx_backup_tipo values4;'Dados'); - ---PROTOCOLO -insert into pbx_backup_protocolo values(1,'Ftp',1); -insert into pbx_backup_protocolo values(2,'Sftp',1); -insert into pbx_backup_protocolo values(3,'Rede',1); -insert into pbx_backup_protocolo values(4,'Local',1); -insert into pbx_backup_protocolo values(5,'USB',1); - ---FREQUENCIA -insert into pbx_backup_frequencia values(1, 'Diário'); -insert into pbx_backup_frequencia values(2, 'Semanal'); - -insert into pbx_backup_frequencia_qtde values(1,1,'Uma vez ao dia', '0'); -insert into pbx_backup_frequencia_qtde values(2,1,'Duas vezez ao dia','0;12'); -insert into pbx_backup_frequencia_qtde values(3,1,'Três vezes ao dia', '0;8;16'); -insert into pbx_backup_frequencia_qtde values(4,2,'Domingo', 0); -insert into pbx_backup_frequencia_qtde values(5,2,'Segunda', 0); -insert into pbx_backup_frequencia_qtde values(6,2,'Terça', 0); -insert into pbx_backup_frequencia_qtde values(7,2,'Quarta', 0); -insert into pbx_backup_frequencia_qtde values(8,2,'Quinta', 0); -insert into pbx_backup_frequencia_qtde values(9,2,'Sexta', 0); -insert into pbx_backup_frequencia_qtde values(10,2,'Sabado', 0); - - - diff --git a/doc/changelog.docx b/doc/changelog.docx deleted file mode 100644 index 148e15f2b9701bf54c7229e8858e3f455cb643bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14360 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 H40bdC1yHIv diff --git a/doc/changelog.txt b/doc/changelog.txt deleted file mode 100644 index 886d5598..00000000 --- a/doc/changelog.txt +++ /dev/null @@ -1,58 +0,0 @@ -Versao-1.7.11.5 -Data: 01/11/2022 -Autor: Amarildo Pereira -E-mail: amarildo.pereira@simplesip.com.br -Modulo: Grupo de Usuarios -Descricao: Usuarios que estiverem no grupo administrador, poderao adicionar e -remover usuarios de todos os grupos que o usuario do mesmo nome(adminis- -trador) estiver presente. Como o usuario administrador e automaticamente -incluido em todo novo grupo criado, isto resolvera o problema de inclusao de -bloqueio de ramais sem afetar o usuario em questao. - -Versao-1.7.11.5 -Data: 05/11/2022 -Autor: Amarildo Pereira -E-mail: amarildo.pereira@simplesip.com.br -Modulo: Supervisor -Descricao: Criacao de hierarquia na monitoria do supervisor de acordo com as regras da LGPD, -sao criados os grupos com a seguinte nomenclatura, "LGPD_NOMEGRUPO_N...", sendo N1 o nivel -mais alto, seguido por N2, N3, Nn. Para todo usuario que iniciar o monitoramento sera tocado -um audio com os informativos da LGPD e sera perguntado se deseja continuar, o usuario devera -pressionar 1 para continuar e 2 para cancelar, se estiver monitorando um usuario de nivel in- -ferior este nao recebera aviso, caso senha do mesmo nivel ou nivel superior entao recebera um -aviso de que esta sendo monitorado e podera pressionar *1 para permitir ou *2 para cancelar. -Este recurso pode ser habilitado no modulo Configuracoes aba Supervisor. - - -Versao-1.7.11.5 -Data: 05/11/2022 -Autor: Amarildo Pereira -E-mail: amarildo.pereira@simplesip.com.br -Modulo: Relatorios/Callcenter -Descricao: Incluida a opcao de servicos (Vinculados a Rota de Entrada) nos relatorios de: -- Abandonadas Fila -- Classificacao de Atendimento -- Classificacao Mensal -- Classificacao por Agente -- Metas Mensa -- Metas Diaria -- Recebidas Agente -- Rechamadas -O comportamento pode ser configurado em Configuracao/Sistema, podendo ser habilitado (Mostra -o filtro e acrescenta a coluna servicos) habilita filtros (Apenas inclui o filtro) e desabilitado. - - -Versão: 1.7.11.5 -Autor: Lucas Awade -Data: 08/11/2022 -Modulo: Discador -Descricao: Relatorio de campanha: Foi substituido o arquivo de retorno para um relatorio visual e de extração -para que os usuarios possam pesquisar e retornar para contatos de campanha selecionada. Cada usuario - poderá apenas realizar busca da campanha que seu grupo pertence a fila. - -Versão: 1.7.11.5 -Autor: Lucas Awade -Data: 08/11/2022 -Modulo: Fila -Descricao: Disponibilidade Fila: Adicionado um novo campo no cadastro de fila para que os administradores -possam disponibilizar para os agentes de uma determinada fila a possibilidade de marcar o "Disponivel Fila". diff --git a/doc/chatMidia/altera-parametros-midia.sql b/doc/chatMidia/altera-parametros-midia.sql deleted file mode 100644 index a8202c69..00000000 --- a/doc/chatMidia/altera-parametros-midia.sql +++ /dev/null @@ -1,21 +0,0 @@ -select id, prm_sk_host_chat, prm_chat_api, prm_media_simultaneo, prm_chat_api_supervisor into pbx_parametros_bk from pbx_parametros where id = 1; - -alter table pbx_parametros drop column prm_chat_api_supervisor; -alter table pbx_parametros add prm_chat_api_supervisor varchar(255); - - -alter table pbx_parametros drop column prm_sk_host_chat; -alter table pbx_parametros add prm_sk_host_chat varchar(255); - - -alter table pbx_parametros drop column prm_chat_api; -alter table pbx_parametros add prm_chat_api varchar(255); - - -update pbx_parametros set prm_chat_api_supervisor = (select prm_chat_api_supervisor from pbx_parametros_bk where id = 1); -update pbx_parametros set prm_chat_api = (select prm_chat_api from pbx_parametros_bk where id = 1); -update pbx_parametros set prm_sk_host_chat = (select prm_sk_host_chat from pbx_parametros_bk where id = 1); - -drop table pbx_parametros_bk; ---select id, prm_sk_host_chat, prm_chat_api, prm_media_simultaneo, prm_chat_api_supervisor from pbx_parametros where id = 1; - diff --git a/doc/correcoes-1711.txt b/doc/correcoes-1711.txt deleted file mode 100644 index 165d8fd4..00000000 --- a/doc/correcoes-1711.txt +++ /dev/null @@ -1,5 +0,0 @@ -Manutenção de Sites -> http://localhost/index.php?idProg=105 - Mostra senha no código - - - diff --git a/doc/correcoes-1711.txt~ b/doc/correcoes-1711.txt~ deleted file mode 100644 index 6d725c48..00000000 --- a/doc/correcoes-1711.txt~ +++ /dev/null @@ -1,2 +0,0 @@ -Manutenção de Sites - Mostra senha no código diff --git a/doc/funcoes-internas.sql b/doc/funcoes-internas.sql deleted file mode 100644 index 961e09c9..00000000 --- a/doc/funcoes-internas.sql +++ /dev/null @@ -1,2 +0,0 @@ -select * from pbx_funcoes_internas where id_prog in(27,28,29,30, 31); -select * from pbx_funcoes_internas where id_prog in(84); \ No newline at end of file diff --git a/doc/lgpd/TERMO_DE_USO_E_PRIVACIDADE_APLICACAO_SIMPLES.pdf b/doc/lgpd/TERMO_DE_USO_E_PRIVACIDADE_APLICACAO_SIMPLES.pdf deleted file mode 100644 index 6f7c08938579683295e880bf84f495d73ad8af69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62984 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

Q@Et4{iw> zGe)lgi)7<&}Xa<+Q~@5-WZJglClt&jeeiMp|Mdg5`r-jqpbmJ&RVigw9d5l zSPj-*c(szOivc8j1kJ8spJR8id)b4mo^|Kr2|rW^xbWBQNKNA|)p!C&ato{DwPiKw zfg=q>FEx~BwCqzg343^wL$fc@49A--4mll5@pW}DW{%Xs4413}QHxv$!Jx;CZOg)i z3(M#y#@2|eDw(Q6sS?@|LfS_)Js}j>H)|=X5CjV`eF^677w^CNvPt)!)^{U5ei0^T zPV5|Y>&2B#@Zrgqbj`SDS>;btG;(jb?2ehayH1_5Y&Ir2(H!y4YngcM_rfvr+LTMW zFdDFb4|N>%7-$81luPP(m;)s+5s*5;DV*p!gP$Xuon646FDwu@yUZ=#=K68MxaN~x zCl}_q&MI8%U7a&GHPAs%7y{C07hElk!HA!>0g|&sHmA8*i)9(*kEL5kib$L6vT;^O zmfh_hnQjO)#l$pNDA&jvUd@ZJs(na zRwZ<^d8y@kZmDA_f1`7GV0rL{&`t3hlFL(8WaZ+)q&I}&Ql{1MEg_=Y=<;EGYjG!m z+wB8Bmyy871zl22mHUirmJav@!RL1w(|(hQ@EeJ!Oe1%Z4$=he&Sw06h*8J{km|O> zHfS8oYYYklc4?6is1=U5e`**4$wEGuGCS?GjkeMjn$pX$cq|c1#wfjm<2gbfilxla zEDSm$Ss0_!Ss3O5*=oWI4_Z}o=*T_~l@C1VgXv}%)P$;3;8-B8N`_AzC5JD}dptWa z={xV*(|=j%z%6&ehIw1dQgmeW#>thPRiT*PI&={CA?KKv{cfcNFb}o zyIpCA!{^RtF@qBg=|aJmjo0Cv5|K*Fvac@C3+F2xZUV}dNK|$gfE@D!U~v-`V_2rW z@GEb>m++1tWnhAnOlwWMOnXfSO*&ISmb0LasUzxokwp|@u_!W{rV|`F?knyfM{-j0 zxE`@exdVMTV|xf&GN!x`x%msL+N@7Y+2UWMy$%58pXJ>h13OiXrXHr#wG#vFc#sLQ zwGj<=ActF{5?f2P3|>=hfm4a=aJPSd8m7oXRfm!1dM2XM8bqZF5S8-a@5-sObdWY#(+uM?g*^U3IPCK@)zS5VdZIp^ z&-?0-8EM95gp-_Umi0+;1|*pzkxa*8zDzhGOL-8B$^b}+Dkh0A8S}Bam<%#ZW>SXC z;Qr1;qY(gQCM*L_&_hh}to7_t{Sck!1UAS(z$|7~Fb5fmkqTdL#d0)YQc&kJReIp0 zIZj~pbqvyCc<+OuR4D%l5ny@vC|{KXEk8|zyR_lIil;^c+Tthg#vR}Hi^GX7F>Hi!g(I?UW`Ie{<79utK zgA5Rc3@wB#wk%nqYFJ#=0l=C)(uSSTA%$&GO~7>85FwSDwPWUzH*TJ|^vfGxyU~F2 zmLkWxp#IIvFW5f08G;Xw`{gu^RPa{6o8jTc%I$^bNh>xkz2gR`yP>Cnr``T%1Cq-( zb^aMQmoHlV=GValY(XRzq036uQk|XA#L1FK5VDb$O(r7_2-t}XWTfDYd&B{I1WKwiR#F4YBN?HeGEYC0 zolvcttIfnM!$!&Xst(t!>ZnQA_rl@6H2z>oScfFxanx@z_=j@EmE?FIO|P=Px^&$auFMgu-!z$X?Pph1e?y%oM)RXxa@Vt(H@ zp&IT~QHTdH8Y+kQ{KwqbFe4Cpr@*6{)zL@-XuZKfy6PaKNAe<%Bg9)m%xc>dc}p z)%cgy6b^|;7qIU-tY^u`_uVt|srgvRz~g^C?u27oPOdzK;}l}9*13J|)qAI%4x3di z^N+D(6aJeg6Z;3c8R;9O^QWU;4uSbfD>BIiY?86UN4@7kCiyQ_3tYe!n2;?VY*c9z zG`W%P_B%K!eE+3GfSLQtNEd5KyFrcn13iqGh7GYtvU$}Zx3`I`I(R<|Kl>}MsI2pG zjb-2jzgr4aP94TJ5Qyk~oh;hR#mbbYp{j7A;hvv{1^9}^)h21G(k z@}lVEeV%MWjr>7+QkqC7kvp4JwEbjltgn~OKgxtzsfr5v)=D92k{eSW{MrP&`>z)l#5&y4rP zACK>d>*7j0nU5=6fsQYa?~3n@A4F}v#D|L07l1P%u^jG%1ca2=OA!QxeB?_N!4V`W zp7Kw0>~!pLeC41VQrq)Yhv|51m)#O`KxEr;+HZLwIxMHt3q@wXTOH)at=M|2W?S{3 zI!f5As|N?vHpECcXRzcKFDx-;#kB4h%nNDphi0U9wD3PvTtB=GV^ZLG$fPWU5%|MF z^++v=0FOBC9wF|TRe6TFQfrUM8Rg>OCGPcqj|2a+y8J+3hTn;8|FMwhnJBi@Sw%*;$rW_e~$MxSwK z3DVDb@Z}C}rlZHP+;PxB(GKX4>e|m4a48mIKbz5FB&=NbYv!q=YMxYtgc>ekOfkmW z(a^{zN|0y0sA4?oxYi6cvGhMSW#u0jHZ{HtMc|QnVVKH_P{jPcRd;GMR-qTFSN;Jp z|4yu}G%Y-qa(&-9EPM0``Qo7EBfwe6@|}fzKpT+Y_e%e(^otU~?HBfo-!k8FhlE3t z{$=6M%%8b;gm=Zyn9n$an{jhaK@h2zxqs7NJIK3DtE~4C59=N_-DmxS{trgu)x?du zn~aOCCzkT$uyFRQ|9G5iA$1yzCN7}2W!;LHya+;SQ5#1_HqWlLOd|JR$)mg(*P zW)mlt1PnQ}^PZ9*3ciwvD-%-hn^2I6PJNEIy59bG297NpK7Jl=P1UUfZ;@-@#P@02 zLy8@_3C^I6>vH%}1@WM)Ln_&-TLNzxXUSUKig>Kj#yYy79aYva-urRnCgx*+an;BR z04xI#3vz}$f#I4stHM!dUH{e6*D9~U!fQ*vTsrm3XP)>D8t#AQOJdAJl@Hg#8PE=C zIDKv9qle#sV=AwH@OkB3I2!ZTCZtJDMw%o7>cBxoq}-Ip;0FPRhYQ3!1D*0edr z#e4g|RG16h*SLweF=broUKJo}{%E@DkN&v-*?^)!&Hv1(-e&~(V;mhVMTuxsL{4Zj zhT?IrJ6DICQAWysJ(#AdB}Z^>1p8BEph|dDL46-pOf;%2bP0D%b=Jp!?x14mAWnZA zA;_x3ye{rb|$ zzl^oI9aDaGN!RK3Xfn;JGMxqO@Kt5zlJs@;H{^evUY&m^@j&XntdX17aCQ@6j+1Fm zoKN$0G8k9io$qcwwrzZSIeJp;#CW;>XH8S{(^^h$JEeV2dQQWc`B^RN>+j94ZF#2t z$)=6@4J}*SUrN7JAFj8yAZ~xM-CS>s;@v|V8;nhuS!blJabvPB*;YuDQtfr^ZO2B( zrf-Tai(j3-CVNf&(&js(cg9zyS7cY!uWr5{Jdl1X{aM?;>%Y!_-Td!%Z*xmqJC$#$ zCo^&wA`c`I<|C1?Z!VHir1($VXqjv1g-aC&8FRJDz|y|BCy9tdLd zAQo~loCFAF>N9IIy3ECem@E~Mg!c{rE0B~kU-#|9L1ih2V@l+4KcUB8zqS<^`k&iq zV)E%3`=pOW)UNsl_Fud(s1a&lQ8nMCVkVR^kq(J2W#{<0QaXXEEY=XsepKag)r=9@ zd0aL7(RIxjk)6j?Ge%_Rah2wgz{6ouIs=w>AM3SpF0*r7Yjf(>(GAC((aD=w(Y5`-uaIyf0k7=(%Yb-?rm#U* zj&nI^ix`xett_h(d7fF4gyTNN0$+Kk^7qO=D-RNLhKfC*=HH%0QeOvJ;BU5qQ2z_c zgkY#E&AY^|lM8bjE^HtT>Gpfk&J~~lexUamg%&7S!b$)^B zZ>XbIND*UIbD-n!v5Nmx?X-gN8@OslV`IP?+}3{x_57jDX=_0UAp5j2A8bIjriSsU zCN%KC`H?)1s+tmn+PtR-A;)7)0}5-Z=6kFiqOZQc``v5rI%)Au3O-tJ*Sem{KR^EY zrpXUqT6v8ySH>N#wqE|lNoxvScl|@f)w-T7Oqn#lb;|9?|J;f^5*}%0;qJVTpUG=f<|xBhAMK$BZB_OFTT{p^crS5}lb=lAT4j zNb7h2TkMVX5i*;{V;ZbQk~=!`Y^>W7G?_+DwJf8u%i{T1sGFpa@d>E|94)b#{vJQ! zcaPy?N`oAcl@UG3MakvKHOa@5x}-Gv?rktI1V6a%0CE?#8B5xzM|IdE&GfMY7QOeg1URJS$1Fc zxLI@8jhHrL|L^~DHSS&Q%=UZkd1}n)`rF?;<&?J`+dy@BF_GT!<57<5mY>#mLQ{bC z`ru}cNP!+XYQcdu%MCuRHsy|@lS~7KThgk8xnj88TuHUabq@oBP z!@YNSYN+y8%-itd%2IV3LGS%D#FbZ|_pXQG?ZAr^P@w;tjRD4sryY5azZbsPvroU@ z`+4A7;-C6|dcFyK7c^N2N)J7jz_p$`^?FX!0(d9mB%Do>(*9EPIa&@3F_+V zfiK0HRYhh?nrt?+$;T!m_;{?`6voWqOV%U(6p@ojQRd7t#}Yo|&4xpM2zwB12pUWT zGx0>TM#=3r8Yh}&ntDu&Ov_C=lhiOI`YEgFB+Rwt!Nk%)*z^A(s#Ud+ie?3P8Vj$% zzy=fBwLn(IS~M4iMKfgI7Y{C2f7w{S+ivx1vCEy${_5bMEl;<)rI->;ZmzHh~E)8>c3Lp~xc znwXJOfm&nVd9#TfITbtATkwum4Os0A)8u3r-s!VCg>VWtAtSIrCV_4Aqk&6*5_*yeLhL_g+!N=fY6U#9|^jc zMox}PvMNcnR0l4(TrJ`8BOr<4AP6<#@skZW zv!UiT7M4*gTLl8DMApW}Be3bmT8aBFtjrkU;%zqG1=~c2&F*mh241I!SFII!bRfc3 zZL3gSCa2ZvG->ts0{QvSW1PuFF&%XuqJDyOXnvd`Iz>Wo>GTu|026LrF9)rJDM~n# znu*1#r9+((i(NX8a%zve$J68O@m()m=Xy@}9RI0cn#IgwXK}L})J_620^?Ey#YKsP z$K{s-K7S(VY9^Y62GnaqvDH?+nFpt3MiyE{GB!%0wqcpNsB_>Y^(W(P%v33nhS6uU=xJ zO#u@@n|7G?n7%UgBSBxGGnw={pH)W%-S`sTH`51w1 zypE#$PM$|5D1n$zlz35;2uP67FS^jaiy#R|`key0LLg*UFL9CL7i9n;>6A&z7?(qC z{2L59WSd^LSqbrvw8Ml$2CKQu57tX>ktiM51{~k>hzuR_H_^ zF*C6!u{^ORu`}^i!kE}jT#8&t7joiV0=i95a_EC@6%==Y7QRve)6+K-id;Z`-=!OM zLFY5*-|>J%|C)kziZj5&=Xl7=j1B_bMBQ@TP93Ft2AxfU(QpcSxH%e-=m28kFC}K5 zo9RpUEyV0A?w6Rpg>LbHhG;GCLuWdcMb;2r={5dB|lB#f@!{)0~lOwHND zgIDG9j8FvQkA`KE9F8W3V^|yc?loV2cFh$5RsFVNEBHds|GDb3b6?c-F>VNurSE@7 zb=5TQ_hB;k{hQ?9hG^nRNER0(S?ng7lvP{-wuf3Hg>J<(Z9C<3< z+mG9V#I(M?0j%A#m66)MUC<-t_(_e=D`j}^5T1V<0J4I39%($K?NSnQrrCX@(L^LGljv zRyT2Z_J-`8*+=Z_vM)Bg-SBaPF%j-1)+_EO-Z+Bkh}DqOC707nMu%%g!I zwvBBYK6`!q2C2#nJAeU&MEU-MpnyJ7|DjEsF>9>CD3BSdLN9o9>2}~pmpJ;L!)H(| zTn-g#NNyDA4w)K>r@w0hxK+U>W%XPQxjp@#wV?M~f&df#p}3-Mc)nOHpG zxU;6s#97ojMEhyfC%_95F!}^`)7C2%Ca1b+VVhUL#||mylqA6!_WBJZv;<{q+0qM7 z-y(-h!4R?%rzWUY z>Qbo#yC6u_BcrgdigEd=r3A)ruvUqoOqpkb^_KeR*u;s6If;kE_eY$G&kiI!viC&H<^vY~951Lx}ITP`FnH(&0*G_cgaE$~cu zOH4pI{oqCmlj!aL{0YCHO_ndig)<MQ@+^1;d% zhak%CdH+|xdLMtNPx{_^sq)X~U#J{>>3(%tgD!P={*^U<{p%X^sUkMUBgssGgIhvo z3yp_JzE(15=Vj*yu|LQ62KI*jEB1NZ5Ov0dQNiP5$H%7z%dwN<^XPff*|DXPRloxz z=R5crjuV~d#OB7ocI)(RiE+A^BSHgsE&s zVz4O@Lj8@zAs7zveqgom2D~JoD_{yPhLDC3x-+rRViW@P!W%cGQ;Taz|Ap25!3on2 z6;g~m@O|j_5SD`@rzRTe$8Qj-La@nh&p^~rbVV%_rK zE0^xQ_>w)By#n9YIC<>{AFRckOsFWl9O7gN1i>!lY_qW1Ni-58i4%y^iI<3%9Dk7B z=iZk-@cbX~Rx2lmxwovMKP!<5WMf!8CIu-U^0{6ug67XzvuqTi4p33)2vQOw-3$m)0y6^)Lr8~6Dk(5@Nq0zhhe%0xrwB+%he(Lj&;t@9-AMoN z{oddG?)ANEecxF#>&)KI?z8v#W7c!_IU~Yl5cA$-kb`YU4@}%1m7Q^T0j~!cay`?I zPY07)7WQ|&40f&ZSdz`CizP;{^p`hu+RO8G7-HMjk zHyYhKTe4g0$45UGUe|qnmR?Z}QbZ(<24W$;DX6O41B?*M!g! zuh)LcT$Sy8ydIUpCn&Rs`gQV3teuiugRHXB-e$O(rNP)&k8h8=lg%L`%4L|L?HODg z&2gQFL+hm$(@1pCW0V%P?9l^{m7s6BwLFrS#!DfDGAA3%qm{x>-QSFxHE$QDKg^52dvA#-ecC(8{4#GPP%TzVqREfJ z-BC~b@YH0<=L|8Ypx^SdNbG94C|&=Nev{NBrEYQbP)3^SSXMt>I`zS|CQhSGKn~<) zYI;fAbBo3v_$oEhbXkx2LFK+kpI$35mnL2JGm{oqEHf|() zWWZIcR(8XwPw3D_%)UA?iPl{SP;t*mh`?lW=gh&6p0UJx?j;?*-P0CXNEaMPAiU{5 zMRL-%-wv&hd1`CuOQ8uVlh)Aqoc6&qu4LbjSkL)a=`50a+mEo?F~IwM8_g?s`j8A> z^#Id(`b-IiBUAyJ3r%a zmO-qFI-ZByg~b`v@de^*ocw^ci!L?U)pep?>+*z{tGvCU7`irZI9g_;Y+U1_&X^1+KA=-#jX zI2duIeJGPhv3OCSWnY(uK2LaHcrTy}AT0AUa3n%xm1SvFCMaINNTu+l+|MnHZvPZR zwv`1cc9^gKeC6FOWGj&}4z#{|qA!$qVlG*+Dt{uxZkr(ImwxzT>H{gAZ(cjEJ^!HL z!^@zZUqIE0M$sA1I?mgA*XT%JoChmv+1MD|6xpBx;ufd^R~^|MZMMo1(UYGry`Fj% z-L_xL%FbakrmtPAd%Vm3GTs>xlH@D$j9<+NH<0-ny_^emq*MT8IdAOb+E)S+66PS^ z&IL%6efBA=zQo$lLGqKuqxaa0-t~B6?LbkdKj_KgtSUo*45KK8eco&&4vI|@f-;>6 zd@n!mX?zj8&LDF|*VwlgA(20Klh&e_Z^9XT?%QzWy)mg=z)?9~8zKd@6>6}^Kd)Z%%*1Bq%Iz9Dq-fP9G(o#_hJNkTNAMdG4_b#|_*RGJX>g&&Irv~ojqs?5# z$vo0dN*@mCW~s*{uPtBO#r9^Hr$0pzCyM9lYd-;WoqZT(i2nLZTmK2k;TarA@x*nx zhQ?(FH9I5YCU2q^7a_$Y^6}j+CBo9uKNdaQ+xAQSu9tkqN=gv zK&Cwz&?)^gaY*yIMFdN!2ioRw!VH-|E}R2Rrd$|J!j_E275A+Z6}#Lh(gn}?HpO3( zLF)Dr<<}OczN5>pfLre>gZ~S69==KY8$TX2MoR< z($$1VTrJL$YHqvX;LY8h&}K!8#@Va4k%{W=UuM)s8J?OC zp;jDOPi$Xk8D7^z%#Nvi>`N~jT~v-(HY~A&sz_E2&%?hKGjiL9C?qB~p4ihwP#p76 zMtH^0oY2IqN_HD#I5r!_I>v^zjytz!eG;j`wR`-`-ca8kEuIOd{p~mt>nxQ6@d$Vm z>5xie7w{^|JYeUWXrE1^?vRmYT?c+R7;KzM)j-x~Y5u7eQ5H6b)CWi(q;yl{;SVr5 z(^^B{2kky3POJf&tDCgu`EuP|-PX_(g!kDhjDLMwIQXjc)f1%mEK;~=t)j|XKUnsa6!^{5`WO(*u27}88_b=Z8Q}*$nc`yW+Y+ZW zM(6g3{yvDC*wKP{sPU_8&31*Sxt)5k0W}KF7$&v=Sg2aij6z52hAl=NhFqyK850QK zKa2WeNPzA-lBfQ%(JiG}!)Bxl3yn&Z$eb|kUNfM}-O8og_)dwT zu2-m-sgH-547K^&H79mPh-f%_FHqsBprtXl@0iR+5fiOl&qs8*Z5= z*6)ViD&nd?b?9~Nye>v_WAjGrW+U|aB5qhVVkka^#*SI*U0lMO&hp5L#3T8HX$o>a zPP1iw!6D`toQ<+6oY@4yX4EnH!{S+I#wbCmKu&fH98!}vg3>g(V+)Dsr#acDuk+;- zRjg>!IC_YM{7s*J%MBG4Bj35=^R}@BW!FrZ@RTawkDCbusI}$ZR;%Z|pqh+bt=VW)G+^;P?qwQin04fTk|B*>wEtB1*g-KnCDdzC-kL4-!`tt|o&k|2-A4V9X0 zo%a5wn6^Mr3eeXxu{D(PpQS?3z$k$jFMYVy`1xWrHtK? zbu4i>)ArSE$@kLkicudP!~Sa_ia)Z;Pb{Ph!FtL0!+xgeC|TES=euTQp)wPX?CfIc z{#_IDKE5%LxRylS!G)ssIir0m2@7P>Gaw)~xQ%`TYWx(Co0mE2 zHXd`BHQuNsmnO;V#G>#i34m%R}(eBSJ z4$mYQ?G{s3)rElYLF0WOJI(#uD!tK^)<-zIFc3z@)6FqtK3Dr|pM`_Xfp)>ghl@Wi zz7E_vZGZI>I`rz#y%KmN7$wDnYF2!NL0F93K8)5Q*H2nf)-4iLwtCv)s(gOQW&}3!>4)BY~y-=PU4A$>j=1*OLcM3BgXi;0+NE+0@3C>o~?!S96S$!mqMQ18afjbwcYrT`xAO;~O=4 zco7}t&yR(PK6=j6uZSLzA04eX4qXm4M{Q5fXw5Lxw3~YN=ebiI%+_q7-yc=Wkd1^; zcE>L(DJPq2$4<*nnew!18C~~UPN)V0P?d~dx(rlKy28jr-+|Ktolq=DvsQ_{dwYb{ zgq~;&_GR4x^f$?9{OsN(P&2wwzKKv*-x|WOWCAy@A@Zm>QZ(~8ezcD^4z3AyN?osf zJtX1Wv{`iI83PMi8#S6bJbJK`Lh{AF@CIZ%d6iyu7yDjM575G7dDrU*F{30wqYoBw zxgww-7Mw4sTK2y@FrA3w9hd>e^3_f%+CB^qMq7}bEwD1Q9k0@p~UQ9K~nZ4nj&%>i_xha zgg{^sI>cBm*GO@tj3x&ARq=XFksTSYdd&v{`sCvuv>r;**u7Y2#T)fm(>>o_kab)5 zlSE|uXE0XX=5PKA71E<)_-MN#xD#o z4Uvgu?_-y1E*F~SpL^(}N6P}6rx*%HlEpa9;lRQg?qZa4nrbwtzpI}T{ zpNhM3N)hXNmvc#7hDGy8;)tT2GJK^K{%QCGtv2?}K+{xx2txTpNZ?aeLe}$Ej@Ipq zsG7Nx_cfzQ4LJ0SN(CVwts_1%AC%O<`bZv*z(uO?0i4l?&+qOKWhk}A=4UlAah z>7`1n<8cWloAtju36}&A$R@FQ0`@9nb|VuW=&E&k>y2 z^K3fe@gXOPw_Zp~f`={IxD^=-SydPO;nIb-AlVi*;qw&^vaMM$<<}KP@E{EBX(XV+ z+5zXT#e8q`uD{odPrm3Yjcu?b+%t}cc!~k>8ItdR^v1VPx{%slBXB=Lx8iF3&IDZp=Wn5#{R|bwjzx zk%1iCBDFAjYu6Opk*Y0uhJS^_95yg9y>{roBj)c|ZH6BuBj&@w)^PWJU=h(yKWl&o zEUncAr}|-p+f9EBfspAIc>1mO4}gsgmvt?RQDQVHFN(DDND?a{`dxQTfRs^n zJ@oLRuHiJRUNoZjghVg1&T2ekaqY+<)Jx1QgCu_cbSFs4)PuY8%tvA#tR6cmF62d@ z@WXCJYp@KB28mOZl-Wm2pHYk(Y|-i5l%=X-s(H4zy!T$r$q&Dc-m~rC{OV}oKE55HdwL$4xsh7Hz7FIP}*mPzV>_b>bhw#$w5 z%5?<*VT^i{&x?n9`g115@G&Yyb?#UCwnaoCcjRDVp$&d>sGq0{^lgm@&@d%iIu+Vr z+L&!LL%!NIB^M3-Cu_9LvL+&3?J?Pn^!V7h@P;&u+)4sHTA zw6jLTf#p#$q4nin!P%S=dajKgGsHa_?onY9UL~7-@$%v2@iP?LgX1Mut1K!MK|W`) z+ZFj-S_^Jxr|mTn%Z{g4_j^O#nCMFImN&ym+G?eU>OCpM?w40qA-yrRD@7$MLbSe! z#4ug^8Rlwh&gjfkrF|OI@)g*LU)D&H%OiBTF|j#V7biL%?qoU!i_(PfXeQHO>XK>A zX?ni;nlg)tfoB&7F0*jR+Ta|pdTB-${j5w=qpHA8?&V~-wqr1kv@(9NEu$7XIU)ku zdy@HMuBLaDa*vWi^g&jy{>mq2@3tQo`4Ze=P*(o z+k5fWs|eY!b;@(whIxOvRoqL8%UnNK#2!)D)8%K)=Y z0gwoW?H_}}?3Xk=-hz>wW{c2&M!7u-V6C|&qLD2+MW6aw6AcX>Q`PQvs4IJvBs)3pzHqnHmn?)2g`aOr=7VB&5 z#8dg!cMiBv3L}xLjM|rPG9P_Ff*d@;Qw^FF4_j=NC3@|6g2$1#56TDZLPt-19P0egb&(%lwT!#w| zdX6@hGgB@vJM#t~w=%IaVop=u8tM^uf2JT_E3Q!VNRT({z^h*@1ysq3 zQb8UGpcCu(%hgI1JwiyhNRNs>jZYj7cKBI;1gzO2_98n^%tK*E^tQw27ne-0bOC%b-7IX;zj`SYwf^$*$ad$pVhfx5 zSP%W1uBQdBFZZ6Nchp5;CF+eUzM@YRNg1hHcKPbw8Hul&{VnN9Q>&N<_g~Uxo!{3w z-M3&A>JJ@z)uz8=zjNV!i5{M_1@`zXDrK(Nmb9?hjz@P>z0X@lMRY<{Omv({)25cZ zw==!SUb#T3VSf)`$9nlpa~e(C^%VU}eBHqPRpXa(D>K-d;@y7e*B#qIv(usV6UjNO zp9O)S3RC0H4$A~5)6Z>^2zhIO9>XCE{TTQH7o(=(;jvudsh>LhKznwQ$%vVHQpe6VQ(CG=7B zjuUFpX)CUO6X(DCmXtS9hcsIy0OW_@+HABkzLA=Jg;|$46<#-13S$*iap!j7cB76B z4ja=t0BwE`z6F!7gV+>XJ=sXtrzF_$WeCJm24*x6#G_M&3IMnGrFV^}D}Rh)4m!;v z*L|T_zFWIw+W_0zm>zk`F1NQ(*N~n%ZJchI$oCia`%4nCPN@<^+L*~0#814X6@&C% z1vX`bXDx8iEj3nSoPWh0G`orlSW(qd80xbgXAN(PUmqeqti8DiFtlK)9=VkhwqBM# zT@HH{;VLwC#4<2CfL&57j+RjvY;0$lTTOxU?$utyuL1x5VML`l#+P)+B5ShAF=*^8 zF}3z-ZEDDq*?w+PDxfp7{7q6yV9{kmnE?};(SyIog)tQ(1vU-{wD` zkhXd(^TND8+rPT^FnG)oEtLFf*h+;&48v$2`)c9iTr(ESa0zn$MLqc!avj?7_Jl2sfUXSbQ*2k8aSm zt&oVtB@_JVNzoU`Yyoz=YVQ@>NuyNicDpZJk@ zL+2w0m#`I>0Vgu;;R~E9$wYm7@_LC^GKWVKGbP&td{eF#Guv8CV$-(`%S$n5e8Yp; zi221s$MkmFIit1V2A+@KtE`C{$7jX4VIl4D8qrKPeY#%YH1?e;3@a6x4}L&R_fgoo)s0Bb#OcNCx_N4-9vVr{08* zG&&3>$mzcMDxyr#HC?l@@D0(iX;Iv)0RIQ!;`i*3==w;En@u_+0Qw661|&QP^I0IN z)mMKZ^$qc-mS{0KxT_NAd_m;j@Mgt@vo6tvI=^MVFyy1e=nFLIs5PXeB#Oo8&!37g zBu>RwMiawO>ri)KO2sM)qCzq|Kw$S1J8!dn^(C_V%Pv1Pj-v70qFlGIPjC1NTL3eu>bu=%4}-e{Xt%{GB;I+6x1o=yKd^&X-&Yq8Ve1yEFX)8+!a@*tP)&;a)`nGDv#qMt(yu2SfhWbZ#Zi2jr6)T%V$#N<+as zP!J4t+hE<#hSRM|*-rwfR8wKZA*Ao1mvnqc+auwyk7rDQ-PnM{r4=qgCT>z?+#PdA z=~0) zLSU`LO^BR53|4M~{_OJ0vAHq7y(D$`> z-o<9alx)27qGAHoxAj@5wmPIPrA3>J?6&07=%hU(oV^gw%+A!=#mUUb_V+J)V=Fue z5Cr@^i-_Rys5;r3sF}F{b$L{!Wq~~EW*#m;9(h|M3p2^TXQ{tuc{m=Ati7EJ@QzJX z6pu$+#n{Tsh_9uFrob371`R{#(6uK|Se^WV8_4*VMj7J$Nle?0}-{f&cyp)kHbaK9<;g7h|AM{T;DEOar0{=xG40;#A|C9&*FZO}Kzcc0!ItcVG zRsX>83j7nt|4&=M(BG-`2QN(U&saggkl$JNpLF~Xfj@1zqvQV*2ZHel-Yx!r@ZQn= z0|y54^ZvPRclq|a4*r7|%m?NBr#xQ%KmEAt69WVN!FwkU_NN~ZkRa&KSV6#i|A_M) zj{hHeArRhw=z#G3)4n@5{?q{l!=Qi03JMnd_dIoRGJ0)e=JeMNr1tua+3&pPd1-I& z0_6Q&Z+DxByq&o{@UMFR4M+oZMWp$_Ah3Wmp8!;v4+0jHxGM$;5U-T1q@;u(L>4A1 f`v0bY|1LOZ7b7Q^zsd~?0l{E+EG#lAvUvXkjDZAy diff --git a/doc/pre-venda/alteracoes-banco.sql b/doc/pre-venda/alteracoes-banco.sql deleted file mode 100644 index 413328df..00000000 --- a/doc/pre-venda/alteracoes-banco.sql +++ /dev/null @@ -1,12 +0,0 @@ --- select * from pbx_cliente; --- select cletp_id, cletp_descricao from pbx_cliente_etapa; - -drop table pbx_cliente_etapas; -create table pbx_cliente_etapa( cletp_id int not null primary key, cletp_descricao varchar(64) not null); -alter table pbx_cliente add cletp_id int not null default 1; - -insert into pbx_cliente_etapa values('1', 'VALIDACAO'), ('2', 'PROSPECCAO'), ('3', 'FINALIZACAO'); - - -Alter table add termo_uso_privacidade integer NOT NULL DEFAULT 0; -Alter table add termo_uso_privacidade_log character varying(1024); \ No newline at end of file diff --git a/doc/pre-venda/configura-prevenda b/doc/pre-venda/configura-prevenda deleted file mode 100644 index 2a2943e2..00000000 --- a/doc/pre-venda/configura-prevenda +++ /dev/null @@ -1,89 +0,0 @@ - --- --- RELACAO DE STATUS POR MATRICULA --- -SELECT DISTINCT d.ctst_id, d.ctst_nome -FROM pbx_usuarios a -INNER JOIN pbx_grupo_usuario b ON a.id = b.user_id -INNER JOIN pbx_grupo_campanha_contato_status c ON b.gp_id = c.gp_id -INNER JOIN pbx_campanha_contato_status d ON c.ctst_id = d.ctst_id -WHERE matricula = '1084' -AND d.ctst_status = 1 -ORDER BY ctst_nome; - --- --- NUMERO DE REGISTROS POR STATUS --- -select ctst_ID, ctst_nome, count(*) -from pbx_cliente a, pbx_campanha_contato_status b -where b.ctst_id = a.client_status::int -and a.clo_id = 1 -group by ctst_ID, ctst_nome order by 2; - - --- Cliente origem --- select * from pbx_cliente_origem --- select * from pbx_cliente_fornecedor - --- --- INFORMACOES DO FORNECEDOR E LISTAS --- -SELECT clo_id,clo_titulo,clo_descricao,a.cfr_id,cfr_razao_social,nome,apelido, (SELECT count(clo_id) FROM pbx_cliente WHERE clo_id = a.clo_id) AS registros, a.data_reg -FROM pbx_cliente_origem a -INNER JOIN pbx_cliente_fornecedor b ON a.cfr_id = b.cfr_id -INNER JOIN pbx_usuarios c ON c.matricula = a.user_reg::VARCHAR -WHERE clo_id = 1; - --- --- NUMERO TOTAL DE REGISTROS POR LISTA E NUMERO DE REGISTROS ATRIBUIDOS A UMA MATRICULA --- -SELECT COUNT(client_id) AS registros, SUM(CASE WHEN(client_user_contato <> '')THEN 1 ELSE 0 END) AS registros_matricula FROM pbx_cliente WHERE clo_id = 1 and client_status <> '999' - --- --- USUARIOS RELACIONADOS AO PRE-VENDA --- -SELECT DISTINCT id, nome, apelido, matricula FROM pbx_usuarios a -INNER JOIN pbx_grupo_usuario b ON a.id = b.user_id -INNER JOIN pbx_grupo_funcoes c ON c.gp_id = b.gp_id -WHERE b.gp_id IN(SELECT gp_id FROM (SELECT CASE WHEN(COUNT(gp_id) > 1) THEN gp_id END AS gp_id FROM pbx_grupo_funcoes WHERE fun_id = 209 OR fun_id = 2 GROUP BY gp_id ORDER BY 1) AS DATA) - ---select * FROM pbx_funcoes WHERE fun_id = 209 OR fun_id = 2 - - -/* --- --- MANIPULA OS REGISTROS PARA APRESENTARMOS APENAS DE DETERMINADOS ESTADOS --- -select * from pbx_cliente where clo_id = 1 and client_status = '0' and client_user_contato = '' and client_uf NOT in('SP', 'PR', 'SC', 'RS'); -update pbx_cliente set client_status = '999' where clo_id = 1 and client_status = '0' and client_user_contato = '' and client_uf NOT in('SP', 'PR', 'SC', 'RS'); -SELECT * FROM pbx_cliente WHERE clo_id = 1 AND client_user_contato <> '' AND list_id IS NULL AND cmp_id IS NULL; - - - -"Pre Venda";"alessandra.neri";"1055" -"Pre Venda";"aline.souza";"1067" -"Pre Venda";"joicy.alves";"1073" -"Pre Venda";"luciene.franca";"1054" -"Pre Venda Admin";"amarildo.pereira";"1028" -"Pre Venda Admin";"awade";"1040" -"Pre Venda Admin";"gabriely.korb";"1084" -"Pre Venda Admin";"paulo.ricardo";"1074" - - -select * from pbx_grupo_campanha_contato_status c, pbx_campanha_contato_status d where c.ctst_id = d.ctst_id order by 2,3 ; -select * from pbx_campanha_contato_status; -select * from pbx_grupo_usuario; -select * from pbx_funcoes_internas where arquivo ilike '%grupos%' -select * from pbx_funcoes_internas where id_prog = 352 - -341;"cadastros/prevenda/listacampanhacliente.php";338;0;0 -344;"cadastros/prevenda/statusReciclaLista.php";338;0;0 - --- matriculas pre-venda -select distinct c.gp_id, c.gp_nome, a.apelido, a.matricula -from pbx_usuarios a, pbx_grupo_usuario b, pbx_grupo c - where b.user_id = a.id - and c.gp_id = b.gp_id - and gp_nome ilike 'pre%' - order by 1,2; -*/ diff --git a/doc/pre-venda/corrige_cliente.sql b/doc/pre-venda/corrige_cliente.sql deleted file mode 100644 index 3d6e7bf4..00000000 --- a/doc/pre-venda/corrige_cliente.sql +++ /dev/null @@ -1,30 +0,0 @@ -select client_out_id, * from pbx_cliente where clo_id = 1 and client_status::int <> 21 and coalesce(client_out_id, 0) > 0; - -update pbx_cliente set client_out_id = null where clo_id = 1 and client_status::int <> 21 and coalesce(client_out_id, 0) > 0; - -begin - -update pbx_cliente - set client_out_id = pbx_cliente_bk_prevenda.client_out_id - from pbx_cliente_bk_prevenda - where pbx_cliente.client_id = pbx_cliente_bk_prevenda.client_id - and pbx_cliente_bk_prevenda.clo_id = 1 - and pbx_cliente_bk_prevenda.client_status::int <> 21 - and coalesce(pbx_cliente_bk_prevenda.client_out_id, 0) > 0; - -commit - - rollback - -/* -select * from pbx_cliente_bk_prevenda where clo_id = 1 and client_status::int <> 21 and coalesce(client_out_id, 0) > 0; - -select * into pbx_cliente_bk_prevenda from pbx_cliente - -select * from pbx_cliente_bk_prevenda -select ctst_ID, ctst_nome, count(*) -from pbx_cliente a, pbx_campanha_contato_status b -where b.ctst_id = a.client_status::int -group by ctst_ID, ctst_nome order by 1; - -*/ \ No newline at end of file diff --git a/doc/pre-venda/recicla-base-clientes b/doc/pre-venda/recicla-base-clientes deleted file mode 100644 index 2963f27e..00000000 --- a/doc/pre-venda/recicla-base-clientes +++ /dev/null @@ -1,33 +0,0 @@ -SELECT * FROM pbx_campanha_referencia_recicla; - -select * from pbx_cliente_audio where client_id in(select client_id from pbx_cliente where client_status in('9', '10', '11', '20', '23', '24')); -select * from pbx_cliente_anotacoes where client_id in(select client_id from pbx_cliente where client_status in('9', '10', '11', '20', '23', '24')); -select * from pbx_cliente_contato where client_id in(select client_id from pbx_cliente where client_status in('9', '10', '11', '20', '23', '24')); -select * from pbx_cliente where client_id in(select client_id from pbx_cliente where client_status in('9', '10', '11', '20', '23', '24')); - - -delete from pbx_cliente_audio where client_id in(select client_id from pbx_cliente where client_status in('9', '10', '11', '20', '23', '24')); -delete from pbx_cliente_anotacoes where client_id in(select client_id from pbx_cliente where client_status in('9', '10', '11', '20', '23', '24')); -delete from pbx_cliente_contato where client_id in(select client_id from pbx_cliente where client_status in('9', '10', '11', '20', '23', '24')); -delete from pbx_cliente where client_id in(select client_id from pbx_cliente where client_status in('9', '10', '11', '20', '23', '24')); - -update pbx_cliente set client_status = 0 where client_status in('1','2', '3', '4', '6', '8','12', '19', '25'); - - select ctst_ID, ctst_nome, count(*) - from pbx_cliente a, pbx_campanha_contato_status b - where b.ctst_id = a.client_status::int - group by ctst_ID, ctst_nome order by 1 - - -select * from pbx_campanha_operacao where cmp_id = 230; - --- desativa todas as listas do pre-venda, deve-se observar o id_dac e atualizar para o correspondente. -update pbx_campanha_lista set list_status = 2 where cmp_id IN(select cmp_id from pbx_campanha where ID_DAC = 134); -update pbx_campanha_contato set cont_status = -1 where cmp_id IN(select cmp_id from pbx_campanha where ID_DAC = 134); -update pbx_campanha_contato_fone set conf_status = '-1' where cmp_id IN(select cmp_id from pbx_campanha where ID_DAC = 134); -update pbx_campanha set cmp_status = '0' where cmp_id in( select cmp_id from pbx_campanha where ID_DAC = 134); - - - /* - - */ \ No newline at end of file diff --git a/images/_notes/index_r1_c1.gif.mno b/images/_notes/index_r1_c1.gif.mno deleted file mode 100644 index c85c4b75..00000000 --- a/images/_notes/index_r1_c1.gif.mno +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/images/_notes/index_r2_c1.gif.mno b/images/_notes/index_r2_c1.gif.mno deleted file mode 100644 index 1e94032e..00000000 --- a/images/_notes/index_r2_c1.gif.mno +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/images/_notes/index_r2_c2.gif.mno b/images/_notes/index_r2_c2.gif.mno deleted file mode 100644 index 1f311d2b..00000000 --- a/images/_notes/index_r2_c2.gif.mno +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/images/_notes/index_r2_c3.gif.mno b/images/_notes/index_r2_c3.gif.mno deleted file mode 100644 index f1bb9018..00000000 --- a/images/_notes/index_r2_c3.gif.mno +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/images/_notes/index_r2_c4.gif.mno b/images/_notes/index_r2_c4.gif.mno deleted file mode 100644 index eea5b468..00000000 --- a/images/_notes/index_r2_c4.gif.mno +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/images/_notes/index_r2_c5.gif.mno b/images/_notes/index_r2_c5.gif.mno deleted file mode 100644 index a2231977..00000000 --- a/images/_notes/index_r2_c5.gif.mno +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/images/_notes/index_r3_c1.gif.mno b/images/_notes/index_r3_c1.gif.mno deleted file mode 100644 index 535c6df4..00000000 --- a/images/_notes/index_r3_c1.gif.mno +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/img/libs/internals/core.assemble_plugin_filepath.php b/img/libs/internals/core.assemble_plugin_filepath.php deleted file mode 100644 index 11245bd8..00000000 --- a/img/libs/internals/core.assemble_plugin_filepath.php +++ /dev/null @@ -1,66 +0,0 @@ -plugins_dir as $_plugin_dir) { - - $_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename; - - // see if path is relative - if (!preg_match("/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/", $_plugin_dir)) { - $_relative_paths[] = $_plugin_dir; - // relative path, see if it is in the SMARTY_DIR - if (@is_readable(SMARTY_DIR . $_plugin_filepath)) { - $_return = SMARTY_DIR . $_plugin_filepath; - break; - } - } - // try relative to cwd (or absolute) - if (@is_readable($_plugin_filepath)) { - $_return = $_plugin_filepath; - break; - } - } - - if ($_return === false) { - // still not found, try PHP include_path - if (isset($_relative_paths)) { - foreach ((array) $_relative_paths as $_plugin_dir) { - - $_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename; - - $_params = array('file_path' => $_plugin_filepath); - require_once(SMARTY_CORE_DIR . 'core.get_include_path.php'); - if (smarty_core_get_include_path($_params, $smarty)) { - $_return = $_params['new_file_path']; - break; - } - } - } - } - $_filepaths_cache[$_plugin_filename] = $_return; - return $_return; -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/internals/core.assign_smarty_interface.php b/img/libs/internals/core.assign_smarty_interface.php deleted file mode 100644 index 7ba5584e..00000000 --- a/img/libs/internals/core.assign_smarty_interface.php +++ /dev/null @@ -1,42 +0,0 @@ - - * Name: assign_smarty_interface
- * Purpose: assign the $smarty interface variable - * @param array Format: null - * @param Smarty - */ -function smarty_core_assign_smarty_interface($params, &$smarty) { - if (isset($smarty->_smarty_vars) && isset($smarty->_smarty_vars['request'])) { - return; - } - - $_globals_map = array('g' => 'HTTP_GET_VARS', - 'p' => 'HTTP_POST_VARS', - 'c' => 'HTTP_COOKIE_VARS', - 's' => 'HTTP_SERVER_VARS', - 'e' => 'HTTP_ENV_VARS'); - - $_smarty_vars_request = array(); - - foreach (preg_split('!!', strtolower($smarty->request_vars_order)) as $_c) { - if (isset($_globals_map[$_c])) { - $_smarty_vars_request = array_merge($_smarty_vars_request, $GLOBALS[$_globals_map[$_c]]); - } - } - $_smarty_vars_request = @array_merge($_smarty_vars_request, $GLOBALS['HTTP_SESSION_VARS']); - - $smarty->_smarty_vars['request'] = $_smarty_vars_request; -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/internals/core.create_dir_structure.php b/img/libs/internals/core.create_dir_structure.php deleted file mode 100644 index 63751d8f..00000000 --- a/img/libs/internals/core.create_dir_structure.php +++ /dev/null @@ -1,74 +0,0 @@ -_dir_perms) && !is_dir($_new_dir)) { - $smarty->trigger_error("problem creating directory '" . $_new_dir . "'"); - return false; - } - $_new_dir .= '/'; - } - } -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/internals/core.display_debug_console.php b/img/libs/internals/core.display_debug_console.php deleted file mode 100644 index 61a33127..00000000 --- a/img/libs/internals/core.display_debug_console.php +++ /dev/null @@ -1,59 +0,0 @@ - - * Name: display_debug_console
- * Purpose: display the javascript debug console window - * @param array Format: null - * @param Smarty - */ -function smarty_core_display_debug_console($params, &$smarty) { - // we must force compile the debug template in case the environment - // changed between separate applications. - - if (empty($smarty->debug_tpl)) { - // set path to debug template from SMARTY_DIR - $smarty->debug_tpl = SMARTY_DIR . 'debug.tpl'; - if ($smarty->security && is_file($smarty->debug_tpl)) { - $smarty->secure_dir[] = realpath($smarty->debug_tpl); - } - $smarty->debug_tpl = 'file:' . SMARTY_DIR . 'debug.tpl'; - } - - $_ldelim_orig = $smarty->left_delimiter; - $_rdelim_orig = $smarty->right_delimiter; - - $smarty->left_delimiter = '{'; - $smarty->right_delimiter = '}'; - - $_compile_id_orig = $smarty->_compile_id; - $smarty->_compile_id = null; - - $_compile_path = $smarty->_get_compile_path($smarty->debug_tpl); - if ($smarty->_compile_resource($smarty->debug_tpl, $_compile_path)) { - ob_start(); - $smarty->_include($_compile_path); - $_results = ob_get_contents(); - ob_end_clean(); - } else { - $_results = ''; - } - - $smarty->_compile_id = $_compile_id_orig; - - $smarty->left_delimiter = $_ldelim_orig; - $smarty->right_delimiter = $_rdelim_orig; - - return $_results; -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/internals/core.get_include_path.php b/img/libs/internals/core.get_include_path.php deleted file mode 100644 index b0188269..00000000 --- a/img/libs/internals/core.get_include_path.php +++ /dev/null @@ -1,42 +0,0 @@ - diff --git a/img/libs/internals/core.get_microtime.php b/img/libs/internals/core.get_microtime.php deleted file mode 100644 index 5c3f0b0a..00000000 --- a/img/libs/internals/core.get_microtime.php +++ /dev/null @@ -1,21 +0,0 @@ - diff --git a/img/libs/internals/core.get_php_resource.php b/img/libs/internals/core.get_php_resource.php deleted file mode 100644 index 7d63904f..00000000 --- a/img/libs/internals/core.get_php_resource.php +++ /dev/null @@ -1,76 +0,0 @@ -trusted_dir; - $smarty->_parse_resource_name($params, $smarty); - - /* - * Find out if the resource exists. - */ - - if ($params['resource_type'] == 'file') { - $_readable = false; - if (file_exists($params['resource_name']) && is_readable($params['resource_name'])) { - $_readable = true; - } else { - // test for file in include_path - $_params = array('file_path' => $params['resource_name']); - require_once(SMARTY_CORE_DIR . 'core.get_include_path.php'); - if (smarty_core_get_include_path($_params, $smarty)) { - $_include_path = $_params['new_file_path']; - $_readable = true; - } - } - } else if ($params['resource_type'] != 'file') { - $_template_source = null; - $_readable = is_callable($smarty->_plugins['resource'][$params['resource_type']][0][0]) && call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][0], array($params['resource_name'], &$_template_source, &$smarty)); - } - - /* - * Set the error function, depending on which class calls us. - */ - if (method_exists($smarty, '_syntax_error')) { - $_error_funcc = '_syntax_error'; - } else { - $_error_funcc = 'trigger_error'; - } - - if ($_readable) { - if ($smarty->security) { - require_once(SMARTY_CORE_DIR . 'core.is_trusted.php'); - if (!smarty_core_is_trusted($params, $smarty)) { - $smarty->$_error_funcc('(secure mode) ' . $params['resource_type'] . ':' . $params['resource_name'] . ' is not trusted'); - return false; - } - } - } else { - $smarty->$_error_funcc($params['resource_type'] . ':' . $params['resource_name'] . ' is not readable'); - return false; - } - - if ($params['resource_type'] == 'file') { - $params['php_resource'] = $params['resource_name']; - } else { - $params['php_resource'] = $_template_source; - } - return true; -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/internals/core.is_secure.php b/img/libs/internals/core.is_secure.php deleted file mode 100644 index abfb2fe9..00000000 --- a/img/libs/internals/core.is_secure.php +++ /dev/null @@ -1,56 +0,0 @@ -security || $smarty->security_settings['INCLUDE_ANY']) { - return true; - } - - if ($params['resource_type'] == 'file') { - $_rp = realpath($params['resource_name']); - if (isset($params['resource_base_path'])) { - foreach ((array) $params['resource_base_path'] as $curr_dir) { - if (($_cd = realpath($curr_dir)) !== false && - strncmp($_rp, $_cd, strlen($_cd)) == 0 && - substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR) { - return true; - } - } - } - if (!empty($smarty->secure_dir)) { - foreach ((array) $smarty->secure_dir as $curr_dir) { - if (($_cd = realpath($curr_dir)) !== false) { - if ($_cd == $_rp) { - return true; - } elseif (strncmp($_rp, $_cd, strlen($_cd)) == 0 && - substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR) { - return true; - } - } - } - } - } else { - // resource is not on local file system - return call_user_func_array( - $smarty->_plugins['resource'][$params['resource_type']][0][2], array($params['resource_name'], &$smarty)); - } - - return false; -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/internals/core.is_trusted.php b/img/libs/internals/core.is_trusted.php deleted file mode 100644 index f66a7cd3..00000000 --- a/img/libs/internals/core.is_trusted.php +++ /dev/null @@ -1,42 +0,0 @@ -trusted_dir)) { - $_rp = realpath($params['resource_name']); - foreach ((array) $smarty->trusted_dir as $curr_dir) { - if (!empty($curr_dir) && is_readable($curr_dir)) { - $_cd = realpath($curr_dir); - if (strncmp($_rp, $_cd, strlen($_cd)) == 0 && substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR) { - $_smarty_trusted = true; - break; - } - } - } - } - } else { - // resource is not on local file system - $_smarty_trusted = call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][3], array($params['resource_name'], $smarty)); - } - - return $_smarty_trusted; -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/internals/core.load_plugins.php b/img/libs/internals/core.load_plugins.php deleted file mode 100644 index 55a6fc16..00000000 --- a/img/libs/internals/core.load_plugins.php +++ /dev/null @@ -1,123 +0,0 @@ -_plugins[$_type][$_name]; - - /* - * We do not load plugin more than once for each instance of Smarty. - * The following code checks for that. The plugin can also be - * registered dynamically at runtime, in which case template file - * and line number will be unknown, so we fill them in. - * - * The final element of the info array is a flag that indicates - * whether the dynamically registered plugin function has been - * checked for existence yet or not. - */ - if (isset($_plugin)) { - if (empty($_plugin[3])) { - if (!is_callable($_plugin[0])) { - $smarty->_trigger_fatal_error("[plugin] $_type '$_name' is not implemented", $_tpl_file, $_tpl_line, __FILE__, __LINE__); - } else { - $_plugin[1] = $_tpl_file; - $_plugin[2] = $_tpl_line; - $_plugin[3] = true; - if (!isset($_plugin[4])) - $_plugin[4] = true; /* cacheable */ - } - } - continue; - } else if ($_type == 'insert') { - /* - * For backwards compatibility, we check for insert functions in - * the symbol table before trying to load them as a plugin. - */ - $_plugin_func = 'insert_' . $_name; - if (function_exists($_plugin_func)) { - $_plugin = array($_plugin_func, $_tpl_file, $_tpl_line, true, false); - continue; - } - } - - $_plugin_file = $smarty->_get_plugin_filepath($_type, $_name); - - if (!$_found = ($_plugin_file != false)) { - $_message = "could not load plugin file '$_type.$_name.php'\n"; - } - - /* - * If plugin file is found, it -must- provide the properly named - * plugin function. In case it doesn't, simply output the error and - * do not fall back on any other method. - */ - if ($_found) { - include_once $_plugin_file; - - $_plugin_func = 'smarty_' . $_type . '_' . $_name; - if (!function_exists($_plugin_func)) { - $smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", $_tpl_file, $_tpl_line, __FILE__, __LINE__); - continue; - } - } - /* - * In case of insert plugins, their code may be loaded later via - * 'script' attribute. - */ else if ($_type == 'insert' && $_delayed_loading) { - $_plugin_func = 'smarty_' . $_type . '_' . $_name; - $_found = true; - } - - /* - * Plugin specific processing and error checking. - */ - if (!$_found) { - if ($_type == 'modifier') { - /* - * In case modifier falls back on using PHP functions - * directly, we only allow those specified in the security - * context. - */ - if ($smarty->security && !in_array($_name, $smarty->security_settings['MODIFIER_FUNCS'])) { - $_message = "(secure mode) modifier '$_name' is not allowed"; - } else { - if (!function_exists($_name)) { - $_message = "modifier '$_name' is not implemented"; - } else { - $_plugin_func = $_name; - $_found = true; - } - } - } else if ($_type == 'function') { - /* - * This is a catch-all situation. - */ - $_message = "unknown tag - '$_name'"; - } - } - - if ($_found) { - $smarty->_plugins[$_type][$_name] = array($_plugin_func, $_tpl_file, $_tpl_line, true, true); - } else { - // output error - $smarty->_trigger_fatal_error('[plugin] ' . $_message, $_tpl_file, $_tpl_line, __FILE__, __LINE__); - } - } -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/internals/core.load_resource_plugin.php b/img/libs/internals/core.load_resource_plugin.php deleted file mode 100644 index 4ab31416..00000000 --- a/img/libs/internals/core.load_resource_plugin.php +++ /dev/null @@ -1,72 +0,0 @@ -_plugins['resource'][$params['type']]; - if (isset($_plugin)) { - if (!$_plugin[1] && count($_plugin[0])) { - $_plugin[1] = true; - foreach ($_plugin[0] as $_plugin_func) { - if (!is_callable($_plugin_func)) { - $_plugin[1] = false; - break; - } - } - } - - if (!$_plugin[1]) { - $smarty->_trigger_fatal_error("[plugin] resource '" . $params['type'] . "' is not implemented", null, null, __FILE__, __LINE__); - } - - return; - } - - $_plugin_file = $smarty->_get_plugin_filepath('resource', $params['type']); - $_found = ($_plugin_file != false); - - if ($_found) { /* - * If the plugin file is found, it -must- provide the properly named - * plugin functions. - */ - include_once($_plugin_file); - - /* - * Locate functions that we require the plugin to provide. - */ - $_resource_ops = array('source', 'timestamp', 'secure', 'trusted'); - $_resource_funcs = array(); - foreach ($_resource_ops as $_op) { - $_plugin_func = 'smarty_resource_' . $params['type'] . '_' . $_op; - if (!function_exists($_plugin_func)) { - $smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", null, null, __FILE__, __LINE__); - return; - } else { - $_resource_funcs[] = $_plugin_func; - } - } - - $smarty->_plugins['resource'][$params['type']] = array($_resource_funcs, true); - } -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/internals/core.process_cached_inserts.php b/img/libs/internals/core.process_cached_inserts.php deleted file mode 100644 index acd4eae2..00000000 --- a/img/libs/internals/core.process_cached_inserts.php +++ /dev/null @@ -1,69 +0,0 @@ -_smarty_md5 . '{insert_cache (.*)}' . $smarty->_smarty_md5 . '!Uis', $params['results'], $match); - list($cached_inserts, $insert_args) = $match; - - for ($i = 0, $for_max = count($cached_inserts); $i < $for_max; $i++) { - if ($smarty->debugging) { - $_params = array(); - require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); - $debug_start_time = smarty_core_get_microtime($_params, $smarty); - } - - $args = unserialize($insert_args[$i]); - $name = $args['name']; - - if (isset($args['script'])) { - $_params = array('resource_name' => $smarty->_dequote($args['script'])); - require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php'); - if (!smarty_core_get_php_resource($_params, $smarty)) { - return false; - } - $resource_type = $_params['resource_type']; - $php_resource = $_params['php_resource']; - - - if ($resource_type == 'file') { - $smarty->_include($php_resource, true); - } else { - $smarty->_eval($php_resource); - } - } - - $function_name = $smarty->_plugins['insert'][$name][0]; - if (empty($args['assign'])) { - $replace = $function_name($args, $smarty); - } else { - $smarty->assign($args['assign'], $function_name($args, $smarty)); - $replace = ''; - } - - $params['results'] = substr_replace($params['results'], $replace, strpos($params['results'], $cached_inserts[$i]), strlen($cached_inserts[$i])); - if ($smarty->debugging) { - $_params = array(); - require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); - $smarty->_smarty_debug_info[] = array('type' => 'insert', - 'filename' => 'insert_' . $name, - 'depth' => $smarty->_inclusion_depth, - 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $debug_start_time); - } - } - - return $params['results']; -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/internals/core.process_compiled_include.php b/img/libs/internals/core.process_compiled_include.php deleted file mode 100644 index 9babb312..00000000 --- a/img/libs/internals/core.process_compiled_include.php +++ /dev/null @@ -1,34 +0,0 @@ -_cache_including; - $smarty->_cache_including = true; - - $_return = $params['results']; - - foreach ($smarty->_cache_info['cache_serials'] as $_include_file_path => $_cache_serial) { - $smarty->_include($_include_file_path, true); - } - - foreach ($smarty->_cache_info['cache_serials'] as $_include_file_path => $_cache_serial) { - $_return = preg_replace_callback('!(\{nocache\:(' . $_cache_serial . ')#(\d+)\})!s', array(&$smarty, '_process_compiled_include_callback'), $_return); - } - $smarty->_cache_including = $_cache_including; - return $_return; -} - -?> diff --git a/img/libs/internals/core.read_cache_file.php b/img/libs/internals/core.read_cache_file.php deleted file mode 100644 index 78177e4d..00000000 --- a/img/libs/internals/core.read_cache_file.php +++ /dev/null @@ -1,98 +0,0 @@ -force_compile) { - // force compile enabled, always regenerate - return false; - } - - if (isset($content_cache[$params['tpl_file'] . ',' . $params['cache_id'] . ',' . $params['compile_id']])) { - list($params['results'], $smarty->_cache_info) = $content_cache[$params['tpl_file'] . ',' . $params['cache_id'] . ',' . $params['compile_id']]; - return true; - } - - if (!empty($smarty->cache_handler_func)) { - // use cache_handler function - call_user_func_array($smarty->cache_handler_func, array('read', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], null)); - } else { - // use local cache file - $_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']); - $_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id); - $params['results'] = $smarty->_read_file($_cache_file); - } - - if (empty($params['results'])) { - // nothing to parse (error?), regenerate cache - return false; - } - - $_contents = $params['results']; - $_info_start = strpos($_contents, "\n") + 1; - $_info_len = (int) substr($_contents, 0, $_info_start - 1); - $_cache_info = unserialize(substr($_contents, $_info_start, $_info_len)); - $params['results'] = substr($_contents, $_info_start + $_info_len); - - if ($smarty->caching == 2 && isset($_cache_info['expires'])) { - // caching by expiration time - if ($_cache_info['expires'] > -1 && (time() > $_cache_info['expires'])) { - // cache expired, regenerate - return false; - } - } else { - // caching by lifetime - if ($smarty->cache_lifetime > -1 && (time() - $_cache_info['timestamp'] > $smarty->cache_lifetime)) { - // cache expired, regenerate - return false; - } - } - - if ($smarty->compile_check) { - $_params = array('get_source' => false, 'quiet' => true); - foreach (array_keys($_cache_info['template']) as $_template_dep) { - $_params['resource_name'] = $_template_dep; - if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) { - // template file has changed, regenerate cache - return false; - } - } - - if (isset($_cache_info['config'])) { - $_params = array('resource_base_path' => $smarty->config_dir, 'get_source' => false, 'quiet' => true); - foreach (array_keys($_cache_info['config']) as $_config_dep) { - $_params['resource_name'] = $_config_dep; - if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) { - // config file has changed, regenerate cache - return false; - } - } - } - } - - $content_cache[$params['tpl_file'] . ',' . $params['cache_id'] . ',' . $params['compile_id']] = array($params['results'], $_cache_info); - - $smarty->_cache_info = $_cache_info; - return true; -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/internals/core.rm_auto.php b/img/libs/internals/core.rm_auto.php deleted file mode 100644 index 8e282b59..00000000 --- a/img/libs/internals/core.rm_auto.php +++ /dev/null @@ -1,69 +0,0 @@ - $params['auto_base'], - 'level' => 0, - 'exp_time' => $params['exp_time'] - ); - require_once(SMARTY_CORE_DIR . 'core.rmdir.php'); - $_res = smarty_core_rmdir($_params, $smarty); - } else { - $_tname = $smarty->_get_auto_filename($params['auto_base'], $params['auto_source'], $params['auto_id']); - - if (isset($params['auto_source'])) { - if (isset($params['extensions'])) { - $_res = false; - foreach ((array) $params['extensions'] as $_extension) - $_res |= $smarty->_unlink($_tname . $_extension, $params['exp_time']); - } else { - $_res = $smarty->_unlink($_tname, $params['exp_time']); - } - } elseif ($smarty->use_sub_dirs) { - $_params = array( - 'dirname' => $_tname, - 'level' => 1, - 'exp_time' => $params['exp_time'] - ); - require_once(SMARTY_CORE_DIR . 'core.rmdir.php'); - $_res = smarty_core_rmdir($_params, $smarty); - } else { - // remove matching file names - $_handle = opendir($params['auto_base']); - $_res = true; - while (false !== ($_filename = readdir($_handle))) { - if ($_filename == '.' || $_filename == '..') { - continue; - } elseif (substr($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, 0, strlen($_tname)) == $_tname) { - $_res &= (bool) $smarty->_unlink($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, $params['exp_time']); - } - } - } - } - - return $_res; -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/internals/core.rmdir.php b/img/libs/internals/core.rmdir.php deleted file mode 100644 index 7fff2b0a..00000000 --- a/img/libs/internals/core.rmdir.php +++ /dev/null @@ -1,54 +0,0 @@ - keep root) - * WARNING: no tests, it will try to remove what you tell it! - * - * @param string $dirname - * @param integer $level - * @param integer $exp_time - * @return boolean - */ -// $dirname, $level = 1, $exp_time = null - -function smarty_core_rmdir($params, &$smarty) { - if (!isset($params['level'])) { - $params['level'] = 1; - } - if (!isset($params['exp_time'])) { - $params['exp_time'] = null; - } - - if ($_handle = @opendir($params['dirname'])) { - - while (false !== ($_entry = readdir($_handle))) { - if ($_entry != '.' && $_entry != '..') { - if (@is_dir($params['dirname'] . DIRECTORY_SEPARATOR . $_entry)) { - $_params = array( - 'dirname' => $params['dirname'] . DIRECTORY_SEPARATOR . $_entry, - 'level' => $params['level'] + 1, - 'exp_time' => $params['exp_time'] - ); - smarty_core_rmdir($_params, $smarty); - } else { - $smarty->_unlink($params['dirname'] . DIRECTORY_SEPARATOR . $_entry, $params['exp_time']); - } - } - } - closedir($_handle); - } - - if ($params['level']) { - return @rmdir($params['dirname']); - } - return (bool) $_handle; -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/internals/core.run_insert_handler.php b/img/libs/internals/core.run_insert_handler.php deleted file mode 100644 index d18c4213..00000000 --- a/img/libs/internals/core.run_insert_handler.php +++ /dev/null @@ -1,70 +0,0 @@ -debugging) { - $_params = array(); - $_debug_start_time = smarty_core_get_microtime($_params, $smarty); - } - - if ($smarty->caching) { - $_arg_string = serialize($params['args']); - $_name = $params['args']['name']; - if (!isset($smarty->_cache_info['insert_tags'][$_name])) { - $smarty->_cache_info['insert_tags'][$_name] = array('insert', - $_name, - $smarty->_plugins['insert'][$_name][1], - $smarty->_plugins['insert'][$_name][2], - !empty($params['args']['script']) ? true : false); - } - return $smarty->_smarty_md5 . "{insert_cache $_arg_string}" . $smarty->_smarty_md5; - } else { - if (isset($params['args']['script'])) { - $_params = array('resource_name' => $smarty->_dequote($params['args']['script'])); - require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php'); - if (!smarty_core_get_php_resource($_params, $smarty)) { - return false; - } - - if ($_params['resource_type'] == 'file') { - $smarty->_include($_params['php_resource'], true); - } else { - $smarty->_eval($_params['php_resource']); - } - unset($params['args']['script']); - } - - $_funcname = $smarty->_plugins['insert'][$params['args']['name']][0]; - $_content = $_funcname($params['args'], $smarty); - if ($smarty->debugging) { - $_params = array(); - require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); - $smarty->_smarty_debug_info[] = array('type' => 'insert', - 'filename' => 'insert_' . $params['args']['name'], - 'depth' => $smarty->_inclusion_depth, - 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time); - } - - if (!empty($params['args']["assign"])) { - $smarty->assign($params['args']["assign"], $_content); - } else { - return $_content; - } - } -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/internals/core.smarty_include_php.php b/img/libs/internals/core.smarty_include_php.php deleted file mode 100644 index 063dcb3a..00000000 --- a/img/libs/internals/core.smarty_include_php.php +++ /dev/null @@ -1,47 +0,0 @@ - $params['smarty_file']); - require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php'); - smarty_core_get_php_resource($_params, $smarty); - $_smarty_resource_type = $_params['resource_type']; - $_smarty_php_resource = $_params['php_resource']; - - if (!empty($params['smarty_assign'])) { - ob_start(); - if ($_smarty_resource_type == 'file') { - $smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']); - } else { - $smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']); - } - $smarty->assign($params['smarty_assign'], ob_get_contents()); - ob_end_clean(); - } else { - if ($_smarty_resource_type == 'file') { - $smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']); - } else { - $smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']); - } - } -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/internals/core.write_cache_file.php b/img/libs/internals/core.write_cache_file.php deleted file mode 100644 index 09a09fad..00000000 --- a/img/libs/internals/core.write_cache_file.php +++ /dev/null @@ -1,94 +0,0 @@ -_cache_info['timestamp'] = time(); - if ($smarty->cache_lifetime > -1) { - // expiration set - $smarty->_cache_info['expires'] = $smarty->_cache_info['timestamp'] + $smarty->cache_lifetime; - } else { - // cache will never expire - $smarty->_cache_info['expires'] = -1; - } - - // collapse nocache.../nocache-tags - if (preg_match_all('!\{(/?)nocache\:[0-9a-f]{32}#\d+\}!', $params['results'], $match, PREG_PATTERN_ORDER)) { - // remove everything between every pair of outermost noache.../nocache-tags - // and replace it by a single nocache-tag - // this new nocache-tag will be replaced by dynamic contents in - // smarty_core_process_compiled_includes() on a cache-read - - $match_count = count($match[0]); - $results = preg_split('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!', $params['results'], -1, PREG_SPLIT_DELIM_CAPTURE); - - $level = 0; - $j = 0; - for ($i = 0, $results_count = count($results); $i < $results_count && $j < $match_count; $i++) { - if ($results[$i] == $match[0][$j]) { - // nocache tag - if ($match[1][$j]) { // closing tag - $level--; - unset($results[$i]); - } else { // opening tag - if ($level++ > 0) - unset($results[$i]); - } - $j++; - } elseif ($level > 0) { - unset($results[$i]); - } - } - $params['results'] = implode('', $results); - } - $smarty->_cache_info['cache_serials'] = $smarty->_cache_serials; - - // prepend the cache header info into cache file - $_cache_info = serialize($smarty->_cache_info); - $params['results'] = strlen($_cache_info) . "\n" . $_cache_info . $params['results']; - - if (!empty($smarty->cache_handler_func)) { - // use cache_handler function - call_user_func_array($smarty->cache_handler_func, array('write', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], $smarty->_cache_info['expires'])); - } else { - // use local cache file - - if (!@is_writable($smarty->cache_dir)) { - // cache_dir not writable, see if it exists - if (!@is_dir($smarty->cache_dir)) { - $smarty->trigger_error('the $cache_dir \'' . $smarty->cache_dir . '\' does not exist, or is not a directory.', E_USER_ERROR); - return false; - } - $smarty->trigger_error('unable to write to $cache_dir \'' . realpath($smarty->cache_dir) . '\'. Be sure $cache_dir is writable by the web server user.', E_USER_ERROR); - return false; - } - - $_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']); - $_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id); - $_params = array('filename' => $_cache_file, 'contents' => $params['results'], 'create_dirs' => true); - require_once(SMARTY_CORE_DIR . 'core.write_file.php'); - smarty_core_write_file($_params, $smarty); - return true; - } -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/internals/core.write_compiled_include.php b/img/libs/internals/core.write_compiled_include.php deleted file mode 100644 index b1a827d7..00000000 --- a/img/libs/internals/core.write_compiled_include.php +++ /dev/null @@ -1,90 +0,0 @@ -caching && \!\$this->_cache_including\)\: echo \'\{nocache\:(' . $params['cache_serial'] . ')#(\d+)\}\'; endif;'; - $_tag_end = 'if \(\$this->caching && \!\$this->_cache_including\)\: echo \'\{/nocache\:(\\2)#(\\3)\}\'; endif;'; - - preg_match_all('!(' . $_tag_start . '(.*)' . $_tag_end . ')!Us', $params['compiled_content'], $_match_source, PREG_SET_ORDER); - - // no nocache-parts found: done - if (count($_match_source) == 0) - return; - - // convert the matched php-code to functions - $_include_compiled = "_version . ", created on " . strftime_("%Y-%m-%d %H:%M:%S") . "\n"; - $_include_compiled .= " compiled from " . strtr(urlencode($params['resource_name']), array('%2F' => '/', '%3A' => ':')) . " */\n\n"; - - $_compile_path = $params['include_file_path']; - - $smarty->_cache_serials[$_compile_path] = $params['cache_serial']; - $_include_compiled .= "\$this->_cache_serials['" . $_compile_path . "'] = '" . $params['cache_serial'] . "';\n\n?>"; - - $_include_compiled .= $params['plugins_code']; - $_include_compiled .= "= 5.0) ? '_smarty' : 'this'; - for ($_i = 0, $_for_max = count($_match_source); $_i < $_for_max; $_i++) { - $_match = & $_match_source[$_i]; - $source = $_match[4]; - if ($this_varname == '_smarty') { - /* rename $this to $_smarty in the sourcecode */ - $tokens = token_get_all('\n"; - - $_params = array('filename' => $_compile_path, - 'contents' => $_include_compiled, 'create_dirs' => true); - - require_once(SMARTY_CORE_DIR . 'core.write_file.php'); - smarty_core_write_file($_params, $smarty); - return true; -} - -?> diff --git a/img/libs/internals/core.write_compiled_resource.php b/img/libs/internals/core.write_compiled_resource.php deleted file mode 100644 index 9e031070..00000000 --- a/img/libs/internals/core.write_compiled_resource.php +++ /dev/null @@ -1,34 +0,0 @@ -compile_dir)) { - // compile_dir not writable, see if it exists - if (!@is_dir($smarty->compile_dir)) { - $smarty->trigger_error('the $compile_dir \'' . $smarty->compile_dir . '\' does not exist, or is not a directory.', E_USER_ERROR); - return false; - } - $smarty->trigger_error('unable to write to $compile_dir \'' . realpath($smarty->compile_dir) . '\'. Be sure $compile_dir is writable by the web server user.', E_USER_ERROR); - return false; - } - - $_params = array('filename' => $params['compile_path'], 'contents' => $params['compiled_content'], 'create_dirs' => true); - require_once(SMARTY_CORE_DIR . 'core.write_file.php'); - smarty_core_write_file($_params, $smarty); - return true; -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/internals/core.write_file.php b/img/libs/internals/core.write_file.php deleted file mode 100644 index f81df0f4..00000000 --- a/img/libs/internals/core.write_file.php +++ /dev/null @@ -1,53 +0,0 @@ - $_dirname); - require_once(SMARTY_CORE_DIR . 'core.create_dir_structure.php'); - smarty_core_create_dir_structure($_params, $smarty); - } - - // write to tmp file, then rename it to avoid file locking race condition - $_tmp_file = tempnam($_dirname, 'wrt'); - - if (!($fd = @fopen($_tmp_file, 'wb'))) { - $_tmp_file = $_dirname . DIRECTORY_SEPARATOR . uniqid('wrt'); - if (!($fd = @fopen($_tmp_file, 'wb'))) { - $smarty->trigger_error("problem writing temporary file '$_tmp_file'"); - return false; - } - } - - fwrite($fd, $params['contents']); - fclose($fd); - - if (DIRECTORY_SEPARATOR == '\\' || !@rename($_tmp_file, $params['filename'])) { - // On platforms and filesystems that cannot overwrite with rename() - // delete the file before renaming it -- because windows always suffers - // this, it is short-circuited to avoid the initial rename() attempt - @unlink($params['filename']); - @rename($_tmp_file, $params['filename']); - } - @chmod($params['filename'], $smarty->_file_perms); - - return true; -} - -/* vim: set expandtab: */ -?> \ No newline at end of file diff --git a/img/libs/plugins/block.textformat.php b/img/libs/plugins/block.textformat.php deleted file mode 100644 index 466d565f..00000000 --- a/img/libs/plugins/block.textformat.php +++ /dev/null @@ -1,101 +0,0 @@ - - * Name: textformat
- * Purpose: format text a certain way with preset styles - * or custom wrap/indent settings
- * @link http://smarty.php.net/manual/en/language.function.textformat.php {textformat} - * (Smarty online manual) - * @param array - *

- * Params:   style: string (email)
- *           indent: integer (0)
- *           wrap: integer (80)
- *           wrap_char string ("\n")
- *           indent_char: string (" ")
- *           wrap_boundary: boolean (true)
- * 
- * @author Monte Ohrt - * @param string contents of the block - * @param Smarty clever simulation of a method - * @return string string $content re-formatted - */ -function smarty_block_textformat($params, $content, &$smarty) { - if (is_null($content)) { - return; - } - - $style = null; - $indent = 0; - $indent_first = 0; - $indent_char = ' '; - $wrap = 80; - $wrap_char = "\n"; - $wrap_cut = false; - $assign = null; - - foreach ($params as $_key => $_val) { - switch ($_key) { - case 'style': - case 'indent_char': - case 'wrap_char': - case 'assign': - $$_key = (string) $_val; - break; - - case 'indent': - case 'indent_first': - case 'wrap': - $$_key = (int) $_val; - break; - - case 'wrap_cut': - $$_key = (bool) $_val; - break; - - default: - $smarty->trigger_error("textformat: unknown attribute '$_key'"); - } - } - - if ($style == 'email') { - $wrap = 72; - } - - // split into paragraphs - $_paragraphs = preg_split('![\r\n][\r\n]!', $content); - $_output = ''; - - for ($_x = 0, $_y = count($_paragraphs); $_x < $_y; $_x++) { - if ($_paragraphs[$_x] == '') { - continue; - } - // convert mult. spaces & special chars to single space - $_paragraphs[$_x] = preg_replace(array('!\s+!', '!(^\s+)|(\s+$)!'), array(' ', ''), $_paragraphs[$_x]); - // indent first line - if ($indent_first > 0) { - $_paragraphs[$_x] = str_repeat($indent_char, $indent_first) . $_paragraphs[$_x]; - } - // wordwrap sentences - $_paragraphs[$_x] = wordwrap($_paragraphs[$_x], $wrap - $indent, $wrap_char, $wrap_cut); - // indent lines - if ($indent > 0) { - $_paragraphs[$_x] = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraphs[$_x]); - } - } - $_output = implode($wrap_char . $wrap_char, $_paragraphs); - - return $assign ? $smarty->assign($assign, $_output) : $_output; -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/plugins/compiler.assign.php b/img/libs/plugins/compiler.assign.php deleted file mode 100644 index c7ccc318..00000000 --- a/img/libs/plugins/compiler.assign.php +++ /dev/null @@ -1,39 +0,0 @@ - - * Name: assign
- * Purpose: assign a value to a template variable - * @link http://smarty.php.net/manual/en/language.custom.functions.php#LANGUAGE.FUNCTION.ASSIGN {assign} - * (Smarty online manual) - * @author Monte Ohrt (initial author) - * @author messju mohr (conversion to compiler function) - * @param string containing var-attribute and value-attribute - * @param Smarty_Compiler - */ -function smarty_compiler_assign($tag_attrs, &$compiler) { - $_params = $compiler->_parse_attrs($tag_attrs); - - if (!isset($_params['var'])) { - $compiler->_syntax_error("assign: missing 'var' parameter", E_USER_WARNING); - return; - } - - if (!isset($_params['value'])) { - $compiler->_syntax_error("assign: missing 'value' parameter", E_USER_WARNING); - return; - } - - return "\$this->assign({$_params['var']}, {$_params['value']});"; -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/plugins/function.assign_debug_info.php b/img/libs/plugins/function.assign_debug_info.php deleted file mode 100644 index 7bd16084..00000000 --- a/img/libs/plugins/function.assign_debug_info.php +++ /dev/null @@ -1,39 +0,0 @@ - - * Name: assign_debug_info
- * Purpose: assign debug info to the template
- * @author Monte Ohrt - * @param array unused in this plugin, this plugin uses {@link Smarty::$_config}, - * {@link Smarty::$_tpl_vars} and {@link Smarty::$_smarty_debug_info} - * @param Smarty - */ -function smarty_function_assign_debug_info($params, &$smarty) { - $assigned_vars = $smarty->_tpl_vars; - ksort($assigned_vars); - if (@is_array($smarty->_config[0])) { - $config_vars = $smarty->_config[0]; - ksort($config_vars); - $smarty->assign("_debug_config_keys", array_keys($config_vars)); - $smarty->assign("_debug_config_vals", array_values($config_vars)); - } - - $included_templates = $smarty->_smarty_debug_info; - - $smarty->assign("_debug_keys", array_keys($assigned_vars)); - $smarty->assign("_debug_vals", array_values($assigned_vars)); - - $smarty->assign("_debug_tpls", $included_templates); -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/plugins/function.config_load.php b/img/libs/plugins/function.config_load.php deleted file mode 100644 index 7100b6b1..00000000 --- a/img/libs/plugins/function.config_load.php +++ /dev/null @@ -1,139 +0,0 @@ - - * Name: config_load
- * Purpose: load config file vars - * @link http://smarty.php.net/manual/en/language.function.config.load.php {config_load} - * (Smarty online manual) - * @author Monte Ohrt - * @author messju mohr (added use of resources) - * @param array Format: - *
- * array('file' => required config file name,
- *       'section' => optional config file section to load
- *       'scope' => local/parent/global
- *       'global' => overrides scope, setting to parent if true)
- * 
- * @param Smarty - */ -function smarty_function_config_load($params, &$smarty) { - if ($smarty->debugging) { - $_params = array(); - require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); - $_debug_start_time = smarty_core_get_microtime($_params, $smarty); - } - - $_file = isset($params['file']) ? $smarty->_dequote($params['file']) : null; - $_section = isset($params['section']) ? $smarty->_dequote($params['section']) : null; - $_scope = isset($params['scope']) ? $smarty->_dequote($params['scope']) : 'global'; - $_global = isset($params['global']) ? $smarty->_dequote($params['global']) : false; - - if (!isset($_file) || strlen($_file) == 0) { - $smarty->trigger_error("missing 'file' attribute in config_load tag", E_USER_ERROR, __FILE__, __LINE__); - } - - if (isset($_scope)) { - if ($_scope != 'local' && - $_scope != 'parent' && - $_scope != 'global') { - $smarty->trigger_error("invalid 'scope' attribute value", E_USER_ERROR, __FILE__, __LINE__); - } - } else { - if ($_global) { - $_scope = 'parent'; - } else { - $_scope = 'local'; - } - } - - $_params = array('resource_name' => $_file, - 'resource_base_path' => $smarty->config_dir, - 'get_source' => false); - $smarty->_parse_resource_name($_params); - $_file_path = $_params['resource_type'] . ':' . $_params['resource_name']; - if (isset($_section)) - $_compile_file = $smarty->_get_compile_path($_file_path . '|' . $_section); - else - $_compile_file = $smarty->_get_compile_path($_file_path); - - if ($smarty->force_compile || !file_exists($_compile_file)) { - $_compile = true; - } elseif ($smarty->compile_check) { - $_params = array('resource_name' => $_file, - 'resource_base_path' => $smarty->config_dir, - 'get_source' => false); - $_compile = $smarty->_fetch_resource_info($_params) && - $_params['resource_timestamp'] > filemtime($_compile_file); - } else { - $_compile = false; - } - - if ($_compile) { - // compile config file - if (!is_object($smarty->_conf_obj)) { - require_once SMARTY_DIR . $smarty->config_class . '.class.php'; - $smarty->_conf_obj = new $smarty->config_class(); - $smarty->_conf_obj->overwrite = $smarty->config_overwrite; - $smarty->_conf_obj->booleanize = $smarty->config_booleanize; - $smarty->_conf_obj->read_hidden = $smarty->config_read_hidden; - $smarty->_conf_obj->fix_newlines = $smarty->config_fix_newlines; - } - - $_params = array('resource_name' => $_file, - 'resource_base_path' => $smarty->config_dir, - $_params['get_source'] = true); - if (!$smarty->_fetch_resource_info($_params)) { - return; - } - $smarty->_conf_obj->set_file_contents($_file, $_params['source_content']); - $_config_vars = array_merge($smarty->_conf_obj->get($_file), $smarty->_conf_obj->get($_file, $_section)); - if (function_exists('var_export')) { - $_output = ''; - } else { - $_output = ' '\\\'', '\\' => '\\\\')) . '\'); ?>'; - } - $_params = (array('compile_path' => $_compile_file, 'compiled_content' => $_output, 'resource_timestamp' => $_params['resource_timestamp'])); - require_once(SMARTY_CORE_DIR . 'core.write_compiled_resource.php'); - smarty_core_write_compiled_resource($_params, $smarty); - } else { - include($_compile_file); - } - - if ($smarty->caching) { - $smarty->_cache_info['config'][$_file] = true; - } - - $smarty->_config[0]['vars'] = @array_merge($smarty->_config[0]['vars'], $_config_vars); - $smarty->_config[0]['files'][$_file] = true; - - if ($_scope == 'parent') { - $smarty->_config[1]['vars'] = @array_merge($smarty->_config[1]['vars'], $_config_vars); - $smarty->_config[1]['files'][$_file] = true; - } else if ($_scope == 'global') { - for ($i = 1, $for_max = count($smarty->_config); $i < $for_max; $i++) { - $smarty->_config[$i]['vars'] = @array_merge($smarty->_config[$i]['vars'], $_config_vars); - $smarty->_config[$i]['files'][$_file] = true; - } - } - - if ($smarty->debugging) { - $_params = array(); - require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); - $smarty->_smarty_debug_info[] = array('type' => 'config', - 'filename' => $_file . ' [' . $_section . '] ' . $_scope, - 'depth' => $smarty->_inclusion_depth, - 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time); - } -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/plugins/function.counter.php b/img/libs/plugins/function.counter.php deleted file mode 100644 index 5b56a493..00000000 --- a/img/libs/plugins/function.counter.php +++ /dev/null @@ -1,77 +0,0 @@ - - * Name: counter
- * Purpose: print out a counter value - * @author Monte Ohrt - * @link http://smarty.php.net/manual/en/language.function.counter.php {counter} - * (Smarty online manual) - * @param array parameters - * @param Smarty - * @return string|null - */ -function smarty_function_counter($params, &$smarty) { - static $counters = array(); - - $name = (isset($params['name'])) ? $params['name'] : 'default'; - if (!isset($counters[$name])) { - $counters[$name] = array( - 'start' => 1, - 'skip' => 1, - 'direction' => 'up', - 'count' => 1 - ); - } - $counter = & $counters[$name]; - - if (isset($params['start'])) { - $counter['start'] = $counter['count'] = (int) $params['start']; - } - - if (!empty($params['assign'])) { - $counter['assign'] = $params['assign']; - } - - if (isset($counter['assign'])) { - $smarty->assign($counter['assign'], $counter['count']); - } - - if (isset($params['print'])) { - $print = (bool) $params['print']; - } else { - $print = empty($counter['assign']); - } - - if ($print) { - $retval = $counter['count']; - } else { - $retval = null; - } - - if (isset($params['skip'])) { - $counter['skip'] = $params['skip']; - } - - if (isset($params['direction'])) { - $counter['direction'] = $params['direction']; - } - - if ($counter['direction'] == "down") - $counter['count'] -= $counter['skip']; - else - $counter['count'] += $counter['skip']; - - return $retval; -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/plugins/function.cycle.php b/img/libs/plugins/function.cycle.php deleted file mode 100644 index 54ec2bb4..00000000 --- a/img/libs/plugins/function.cycle.php +++ /dev/null @@ -1,100 +0,0 @@ - - * Name: cycle
- * Date: May 3, 2002
- * Purpose: cycle through given values
- * Input: - * - name = name of cycle (optional) - * - values = comma separated list of values to cycle, - * or an array of values to cycle - * (this can be left out for subsequent calls) - * - reset = boolean - resets given var to true - * - print = boolean - print var or not. default is true - * - advance = boolean - whether or not to advance the cycle - * - delimiter = the value delimiter, default is "," - * - assign = boolean, assigns to template var instead of - * printed. - * - * Examples:
- *
- * {cycle values="#eeeeee,#d0d0d0d"}
- * {cycle name=row values="one,two,three" reset=true}
- * {cycle name=row}
- * 
- * @link http://smarty.php.net/manual/en/language.function.cycle.php {cycle} - * (Smarty online manual) - * @author Monte Ohrt - * @author credit to Mark Priatel - * @author credit to Gerard - * @author credit to Jason Sweat - * @version 1.3 - * @param array - * @param Smarty - * @return string|null - */ -function smarty_function_cycle($params, &$smarty) { - static $cycle_vars; - - $name = (empty($params['name'])) ? 'default' : $params['name']; - $print = (isset($params['print'])) ? (bool) $params['print'] : true; - $advance = (isset($params['advance'])) ? (bool) $params['advance'] : true; - $reset = (isset($params['reset'])) ? (bool) $params['reset'] : false; - - if (!in_array('values', array_keys($params))) { - if (!isset($cycle_vars[$name]['values'])) { - $smarty->trigger_error("cycle: missing 'values' parameter"); - return; - } - } else { - if (isset($cycle_vars[$name]['values']) && $cycle_vars[$name]['values'] != $params['values']) { - $cycle_vars[$name]['index'] = 0; - } - $cycle_vars[$name]['values'] = $params['values']; - } - - $cycle_vars[$name]['delimiter'] = (isset($params['delimiter'])) ? $params['delimiter'] : ','; - - if (is_array($cycle_vars[$name]['values'])) { - $cycle_array = $cycle_vars[$name]['values']; - } else { - $cycle_array = explode($cycle_vars[$name]['delimiter'], $cycle_vars[$name]['values']); - } - - if (!isset($cycle_vars[$name]['index']) || $reset) { - $cycle_vars[$name]['index'] = 0; - } - - if (isset($params['assign'])) { - $print = false; - $smarty->assign($params['assign'], $cycle_array[$cycle_vars[$name]['index']]); - } - - if ($print) { - $retval = $cycle_array[$cycle_vars[$name]['index']]; - } else { - $retval = null; - } - - if ($advance) { - if ($cycle_vars[$name]['index'] >= count($cycle_array) - 1) { - $cycle_vars[$name]['index'] = 0; - } else { - $cycle_vars[$name]['index'] ++; - } - } - - return $retval; -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/plugins/function.debug.php b/img/libs/plugins/function.debug.php deleted file mode 100644 index 13c52567..00000000 --- a/img/libs/plugins/function.debug.php +++ /dev/null @@ -1,33 +0,0 @@ - - * Name: debug
- * Date: July 1, 2002
- * Purpose: popup debug window - * @link http://smarty.php.net/manual/en/language.function.debug.php {debug} - * (Smarty online manual) - * @author Monte Ohrt - * @version 1.0 - * @param array - * @param Smarty - * @return string output from {@link Smarty::_generate_debug_output()} - */ -function smarty_function_debug($params, &$smarty) { - if (isset($params['output'])) { - $smarty->assign('_smarty_debug_output', $params['output']); - } - require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php'); - return smarty_core_display_debug_console(null, $smarty); -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/plugins/function.eval.php b/img/libs/plugins/function.eval.php deleted file mode 100644 index 722b8a32..00000000 --- a/img/libs/plugins/function.eval.php +++ /dev/null @@ -1,47 +0,0 @@ - - * Name: eval
- * Purpose: evaluate a template variable as a template
- * @link http://smarty.php.net/manual/en/language.function.eval.php {eval} - * (Smarty online manual) - * @author Monte Ohrt - * @param array - * @param Smarty - */ -function smarty_function_eval($params, &$smarty) { - - if (!isset($params['var'])) { - $smarty->trigger_error("eval: missing 'var' parameter"); - return; - } - - if ($params['var'] == '') { - return; - } - - $smarty->_compile_source('evaluated template', $params['var'], $_var_compiled); - - ob_start(); - $smarty->_eval('?>' . $_var_compiled); - $_contents = ob_get_contents(); - ob_end_clean(); - - if (!empty($params['assign'])) { - $smarty->assign($params['assign'], $_contents); - } else { - return $_contents; - } -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/plugins/function.fetch.php b/img/libs/plugins/function.fetch.php deleted file mode 100644 index 439fb2ed..00000000 --- a/img/libs/plugins/function.fetch.php +++ /dev/null @@ -1,218 +0,0 @@ - - * Name: fetch
- * Purpose: fetch file, web or ftp data and display results - * @link http://smarty.php.net/manual/en/language.function.fetch.php {fetch} - * (Smarty online manual) - * @author Monte Ohrt - * @param array - * @param Smarty - * @return string|null if the assign parameter is passed, Smarty assigns the - * result to a template variable - */ -function smarty_function_fetch($params, &$smarty) { - if (empty($params['file'])) { - $smarty->_trigger_fatal_error("[plugin] parameter 'file' cannot be empty"); - return; - } - - $content = ''; - if ($smarty->security && !preg_match('!^(http|ftp)://!i', $params['file'])) { - $_params = array('resource_type' => 'file', 'resource_name' => $params['file']); - require_once(SMARTY_CORE_DIR . 'core.is_secure.php'); - if (!smarty_core_is_secure($_params, $smarty)) { - $smarty->_trigger_fatal_error('[plugin] (secure mode) fetch \'' . $params['file'] . '\' is not allowed'); - return; - } - - // fetch the file - if ($fp = @fopen($params['file'], 'r')) { - while (!feof($fp)) { - $content .= fgets($fp, 4096); - } - fclose($fp); - } else { - $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] . '\''); - return; - } - } else { - // not a local file - if (preg_match('!^http://!i', $params['file'])) { - // http fetch - if ($uri_parts = parse_url($params['file'])) { - // set defaults - $host = $server_name = $uri_parts['host']; - $timeout = 30; - $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; - $agent = "Smarty Template Engine " . $smarty->_version; - $referer = ""; - $uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/'; - $uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : ''; - $_is_proxy = false; - if (empty($uri_parts['port'])) { - $port = 80; - } else { - $port = $uri_parts['port']; - } - if (!empty($uri_parts['user'])) { - $user = $uri_parts['user']; - } - if (!empty($uri_parts['pass'])) { - $pass = $uri_parts['pass']; - } - // loop through parameters, setup headers - foreach ($params as $param_key => $param_value) { - switch ($param_key) { - case "file": - case "assign": - case "assign_headers": - break; - case "user": - if (!empty($param_value)) { - $user = $param_value; - } - break; - case "pass": - if (!empty($param_value)) { - $pass = $param_value; - } - break; - case "accept": - if (!empty($param_value)) { - $accept = $param_value; - } - break; - case "header": - if (!empty($param_value)) { - if (!preg_match('![\w\d-]+: .+!', $param_value)) { - $smarty->_trigger_fatal_error("[plugin] invalid header format '" . $param_value . "'"); - return; - } else { - $extra_headers[] = $param_value; - } - } - break; - case "proxy_host": - if (!empty($param_value)) { - $proxy_host = $param_value; - } - break; - case "proxy_port": - if (!preg_match('!\D!', $param_value)) { - $proxy_port = (int) $param_value; - } else { - $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '" . $param_key . "'"); - return; - } - break; - case "agent": - if (!empty($param_value)) { - $agent = $param_value; - } - break; - case "referer": - if (!empty($param_value)) { - $referer = $param_value; - } - break; - case "timeout": - if (!preg_match('!\D!', $param_value)) { - $timeout = (int) $param_value; - } else { - $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '" . $param_key . "'"); - return; - } - break; - default: - $smarty->_trigger_fatal_error("[plugin] unrecognized attribute '" . $param_key . "'"); - return; - } - } - if (!empty($proxy_host) && !empty($proxy_port)) { - $_is_proxy = true; - $fp = fsockopen($proxy_host, $proxy_port, $errno, $errstr, $timeout); - } else { - $fp = fsockopen($server_name, $port, $errno, $errstr, $timeout); - } - - if (!$fp) { - $smarty->_trigger_fatal_error("[plugin] unable to fetch: $errstr ($errno)"); - return; - } else { - if ($_is_proxy) { - fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n"); - } else { - fputs($fp, "GET $uri HTTP/1.0\r\n"); - } - if (!empty($host)) { - fputs($fp, "Host: $host\r\n"); - } - if (!empty($accept)) { - fputs($fp, "Accept: $accept\r\n"); - } - if (!empty($agent)) { - fputs($fp, "User-Agent: $agent\r\n"); - } - if (!empty($referer)) { - fputs($fp, "Referer: $referer\r\n"); - } - if (isset($extra_headers) && is_array($extra_headers)) { - foreach ($extra_headers as $curr_header) { - fputs($fp, $curr_header . "\r\n"); - } - } - if (!empty($user) && !empty($pass)) { - fputs($fp, "Authorization: BASIC " . base64_encode("$user:$pass") . "\r\n"); - } - - fputs($fp, "\r\n"); - while (!feof($fp)) { - $content .= fgets($fp, 4096); - } - fclose($fp); - $csplit = explode("\r\n\r\n", $content, 2); - - $content = $csplit[1]; - - if (!empty($params['assign_headers'])) { - $smarty->assign($params['assign_headers'], split("\r\n", $csplit[0])); - } - } - } else { - $smarty->_trigger_fatal_error("[plugin] unable to parse URL, check syntax"); - return; - } - } else { - // ftp fetch - if ($fp = @fopen($params['file'], 'r')) { - while (!feof($fp)) { - $content .= fgets($fp, 4096); - } - fclose($fp); - } else { - $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] . '\''); - return; - } - } - } - - - if (!empty($params['assign'])) { - $smarty->assign($params['assign'], $content); - } else { - return $content; - } -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/plugins/function.html_checkboxes.php b/img/libs/plugins/function.html_checkboxes.php deleted file mode 100644 index d771fa28..00000000 --- a/img/libs/plugins/function.html_checkboxes.php +++ /dev/null @@ -1,140 +0,0 @@ - - * Type: function
- * Name: html_checkboxes
- * Date: 24.Feb.2003
- * Purpose: Prints out a list of checkbox input types
- * Input:
- * - name (optional) - string default "checkbox" - * - values (required) - array - * - options (optional) - associative array - * - checked (optional) - array default not set - * - separator (optional) - ie
or   - * - output (optional) - the output next to each checkbox - * - assign (optional) - assign the output as an array to this variable - * Examples: - *
- * {html_checkboxes values=$ids output=$names}
- * {html_checkboxes values=$ids name='box' separator='
' output=$names} - * {html_checkboxes values=$ids checked=$checked separator='
' output=$names} - *
- * @link http://smarty.php.net/manual/en/language.function.html.checkboxes.php {html_checkboxes} - * (Smarty online manual) - * @author Christopher Kvarme - * @author credits to Monte Ohrt - * @version 1.0 - * @param array - * @param Smarty - * @return string - * @uses smarty_function_escape_special_chars() - */ -function smarty_function_html_checkboxes($params, &$smarty) { - require_once $smarty->_get_plugin_filepath('shared', 'escape_special_chars'); - - $name = 'checkbox'; - $values = null; - $options = null; - $selected = null; - $separator = ''; - $labels = true; - $output = null; - - $extra = ''; - - foreach ($params as $_key => $_val) { - switch ($_key) { - case 'name': - case 'separator': - $$_key = $_val; - break; - - case 'labels': - $$_key = (bool) $_val; - break; - - case 'options': - $$_key = (array) $_val; - break; - - case 'values': - case 'output': - $$_key = array_values((array) $_val); - break; - - case 'checked': - case 'selected': - $selected = array_map('strval', array_values((array) $_val)); - break; - - case 'checkboxes': - $smarty->trigger_error('html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', E_USER_WARNING); - $options = (array) $_val; - break; - - case 'assign': - break; - - default: - if (!is_array($_val)) { - $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; - } else { - $smarty->trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE); - } - break; - } - } - - if (!isset($options) && !isset($values)) - return ''; /* raise error here? */ - - settype($selected, 'array'); - $_html_result = array(); - - if (isset($options)) { - - foreach ($options as $_key => $_val) - $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels); - } else { - foreach ($values as $_i => $_key) { - $_val = isset($output[$_i]) ? $output[$_i] : ''; - $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels); - } - } - - if (!empty($params['assign'])) { - $smarty->assign($params['assign'], $_html_result); - } else { - return implode("\n", $_html_result); - } -} - -function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels) { - $_output = ''; - if ($labels) - $_output .= ''; - $_output .= $separator; - - return $_output; -} - -?> diff --git a/img/libs/plugins/function.html_image.php b/img/libs/plugins/function.html_image.php deleted file mode 100644 index ff1deaad..00000000 --- a/img/libs/plugins/function.html_image.php +++ /dev/null @@ -1,139 +0,0 @@ - - * Name: html_image
- * Date: Feb 24, 2003
- * Purpose: format HTML tags for the image
- * Input:
- * - file = file (and path) of image (required) - * - height = image height (optional, default actual height) - * - width = image width (optional, default actual width) - * - basedir = base directory for absolute paths, default - * is environment variable DOCUMENT_ROOT - * - path_prefix = prefix for path output (optional, default empty) - * - * Examples: {html_image file="/images/masthead.gif"} - * Output: - * @link http://smarty.php.net/manual/en/language.function.html.image.php {html_image} - * (Smarty online manual) - * @author Monte Ohrt - * @author credits to Duda - wrote first image function - * in repository, helped with lots of functionality - * @version 1.0 - * @param array - * @param Smarty - * @return string - * @uses smarty_function_escape_special_chars() - */ -function smarty_function_html_image($params, &$smarty) { - require_once $smarty->_get_plugin_filepath('shared', 'escape_special_chars'); - - $alt = ''; - $file = ''; - $height = ''; - $width = ''; - $extra = ''; - $prefix = ''; - $suffix = ''; - $path_prefix = ''; - $server_vars = ($smarty->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS']; - $basedir = isset($server_vars['DOCUMENT_ROOT']) ? $server_vars['DOCUMENT_ROOT'] : ''; - foreach ($params as $_key => $_val) { - switch ($_key) { - case 'file': - case 'height': - case 'width': - case 'dpi': - case 'path_prefix': - case 'basedir': - $$_key = $_val; - break; - - case 'alt': - if (!is_array($_val)) { - $$_key = smarty_function_escape_special_chars($_val); - } else { - $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); - } - break; - - case 'link': - case 'href': - $prefix = '
'; - $suffix = ''; - break; - - default: - if (!is_array($_val)) { - $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; - } else { - $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); - } - break; - } - } - - if (empty($file)) { - $smarty->trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE); - return; - } - - if (substr($file, 0, 1) == '/') { - $_image_path = $basedir . $file; - } else { - $_image_path = $file; - } - - if (!isset($params['width']) || !isset($params['height'])) { - if (!$_image_data = @getimagesize($_image_path)) { - if (!file_exists($_image_path)) { - $smarty->trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE); - return; - } else if (!is_readable($_image_path)) { - $smarty->trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE); - return; - } else { - $smarty->trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE); - return; - } - } - if ($smarty->security && - ($_params = array('resource_type' => 'file', 'resource_name' => $_image_path)) && - (require_once(SMARTY_CORE_DIR . 'core.is_secure.php')) && - (!smarty_core_is_secure($_params, $smarty))) { - $smarty->trigger_error("html_image: (secure) '$_image_path' not in secure directory", E_USER_NOTICE); - } - - if (!isset($params['width'])) { - $width = $_image_data[0]; - } - if (!isset($params['height'])) { - $height = $_image_data[1]; - } - } - - if (isset($params['dpi'])) { - if (strstr($server_vars['HTTP_USER_AGENT'], 'Mac')) { - $dpi_default = 72; - } else { - $dpi_default = 96; - } - $_resize = $dpi_default / $params['dpi']; - $width = round($width * $_resize); - $height = round($height * $_resize); - } - - return $prefix . '' . $alt . '' . $suffix; -} - -/* vim: set expandtab: */ -?> diff --git a/img/libs/plugins/function.html_options.php b/img/libs/plugins/function.html_options.php deleted file mode 100644 index 219dac0e..00000000 --- a/img/libs/plugins/function.html_options.php +++ /dev/null @@ -1,117 +0,0 @@ - - * Name: html_options
- * Input:
- * - name (optional) - string default "select" - * - values (required if no options supplied) - array - * - options (required if no values supplied) - associative array - * - selected (optional) - string default not set - * - output (required if not options supplied) - array - * Purpose: Prints the list of