pd1_tools 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +12 -0
- data/exe/pd1 +8 -0
- data/lib/avmtrf1/active_directory/user.rb +28 -0
- data/lib/avmtrf1/active_directory.rb +8 -0
- data/lib/avmtrf1/ad_user.rb +11 -0
- data/lib/avmtrf1/check_point/session/login.rb +57 -0
- data/lib/avmtrf1/check_point/session.rb +60 -0
- data/lib/avmtrf1/check_point.rb +3 -0
- data/lib/avmtrf1/default_esosti.rb +20 -0
- data/lib/avmtrf1/default_jira.rb +18 -0
- data/lib/avmtrf1/default_redmine.rb +16 -0
- data/lib/avmtrf1/docker/image.rb +49 -0
- data/lib/avmtrf1/docker/image_runner.rb +83 -0
- data/lib/avmtrf1/docker.rb +9 -0
- data/lib/avmtrf1/esosti/entities/issue.rb +24 -0
- data/lib/avmtrf1/esosti/entities.rb +9 -0
- data/lib/avmtrf1/esosti/instance/changed.rb +33 -0
- data/lib/avmtrf1/esosti/instance.rb +22 -0
- data/lib/avmtrf1/esosti/raw_data_sanitizer.rb +47 -0
- data/lib/avmtrf1/esosti/session/action_base.rb +34 -0
- data/lib/avmtrf1/esosti/session/atividades.rb +35 -0
- data/lib/avmtrf1/esosti/session/login.rb +47 -0
- data/lib/avmtrf1/esosti/session/solicitacao/main.rb +49 -0
- data/lib/avmtrf1/esosti/session/solicitacao.rb +81 -0
- data/lib/avmtrf1/esosti/session.rb +36 -0
- data/lib/avmtrf1/esosti.rb +8 -0
- data/lib/avmtrf1/executables.rb +23 -0
- data/lib/avmtrf1/forponto/parsers/day_registers.rb +19 -0
- data/lib/avmtrf1/forponto/parsers/espelho/day_node.rb +50 -0
- data/lib/avmtrf1/forponto/parsers/espelho/methods_as_fields.rb +21 -0
- data/lib/avmtrf1/forponto/parsers/espelho/row_node.rb +34 -0
- data/lib/avmtrf1/forponto/parsers/espelho/rows_consumer.rb +71 -0
- data/lib/avmtrf1/forponto/parsers/espelho/sub_node.rb +20 -0
- data/lib/avmtrf1/forponto/parsers/espelho/summary_node.rb +55 -0
- data/lib/avmtrf1/forponto/parsers/espelho/utils.rb +32 -0
- data/lib/avmtrf1/forponto/parsers/espelho.rb +26 -0
- data/lib/avmtrf1/forponto/session/day_registers.rb +39 -0
- data/lib/avmtrf1/forponto/session/interval.rb +27 -0
- data/lib/avmtrf1/forponto/session/login.rb +45 -0
- data/lib/avmtrf1/forponto/session.rb +32 -0
- data/lib/avmtrf1/forponto/user/balance.rb +155 -0
- data/lib/avmtrf1/forponto/user/day_registers.rb +32 -0
- data/lib/avmtrf1/forponto/user/month.rb +141 -0
- data/lib/avmtrf1/forponto/user.rb +22 -0
- data/lib/avmtrf1/git/cached_repository.rb +27 -0
- data/lib/avmtrf1/git/gitlab.rb +11 -0
- data/lib/avmtrf1/git/issue_on_repository.rb +100 -0
- data/lib/avmtrf1/git/push_large/_utils.rb +16 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/cache.rb +21 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/checkout_previous_revision.rb +35 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/commit_changes.rb +48 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/helpers.rb +29 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/pick_source_revision.rb +103 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/push.rb +90 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/track_large_files.rb +53 -0
- data/lib/avmtrf1/git/push_large/lfs_commit.rb +47 -0
- data/lib/avmtrf1/git/push_large/source_commit/push.rb +42 -0
- data/lib/avmtrf1/git/push_large/source_commit.rb +58 -0
- data/lib/avmtrf1/git/push_large.rb +69 -0
- data/lib/avmtrf1/git/reference.rb +34 -0
- data/lib/avmtrf1/git.rb +10 -0
- data/lib/avmtrf1/gitlab/commit.rb +37 -0
- data/lib/avmtrf1/gitlab/repository.rb +41 -0
- data/lib/avmtrf1/ini/profile.rb +42 -0
- data/lib/avmtrf1/ini.rb +55 -0
- data/lib/avmtrf1/inventario_sistemas/parser/body.rb +27 -0
- data/lib/avmtrf1/inventario_sistemas/parser/body_row.rb +12 -0
- data/lib/avmtrf1/inventario_sistemas/parser/header.rb +38 -0
- data/lib/avmtrf1/inventario_sistemas/parser/header_column.rb +27 -0
- data/lib/avmtrf1/inventario_sistemas/parser.rb +40 -0
- data/lib/avmtrf1/inventario_sistemas/site_build/html_page_base/elements.rb +54 -0
- data/lib/avmtrf1/inventario_sistemas/site_build/html_page_base/layout.rb +55 -0
- data/lib/avmtrf1/inventario_sistemas/site_build/html_page_base/stylesheet.css +57 -0
- data/lib/avmtrf1/inventario_sistemas/site_build/html_page_base.rb +41 -0
- data/lib/avmtrf1/inventario_sistemas/site_build/index.rb +20 -0
- data/lib/avmtrf1/inventario_sistemas/site_build/sistema.rb +62 -0
- data/lib/avmtrf1/inventario_sistemas/site_build/sistemas_index.rb +31 -0
- data/lib/avmtrf1/inventario_sistemas/site_build.rb +71 -0
- data/lib/avmtrf1/inventario_sistemas.rb +38 -0
- data/lib/avmtrf1/issues/factory.rb +22 -0
- data/lib/avmtrf1/issues.rb +7 -0
- data/lib/avmtrf1/jira/entities/issue.rb +30 -0
- data/lib/avmtrf1/jira/entities.rb +9 -0
- data/lib/avmtrf1/jira/instance.rb +28 -0
- data/lib/avmtrf1/jira.rb +8 -0
- data/lib/avmtrf1/node_js/docker_image.rb +14 -0
- data/lib/avmtrf1/node_js.rb +9 -0
- data/lib/avmtrf1/openvpn/config/builder.rb +59 -0
- data/lib/avmtrf1/openvpn/config/parser/builder.rb +62 -0
- data/lib/avmtrf1/openvpn/config/parser/line.rb +47 -0
- data/lib/avmtrf1/openvpn/config/parser/simple.rb +27 -0
- data/lib/avmtrf1/openvpn/config/parser/tag.rb +39 -0
- data/lib/avmtrf1/openvpn/config/parser.rb +20 -0
- data/lib/avmtrf1/oracle/connection/base.rb +66 -0
- data/lib/avmtrf1/oracle/connection/string_builder.rb +44 -0
- data/lib/avmtrf1/oracle/connection.rb +12 -0
- data/lib/avmtrf1/oracle/object/base.rb +39 -0
- data/lib/avmtrf1/oracle/object/table.rb +15 -0
- data/lib/avmtrf1/oracle/object/user.rb +15 -0
- data/lib/avmtrf1/oracle/object/view.rb +15 -0
- data/lib/avmtrf1/oracle/object.rb +25 -0
- data/lib/avmtrf1/oracle/objects/relation.rb +23 -0
- data/lib/avmtrf1/oracle/objects/sql_builder.rb +64 -0
- data/lib/avmtrf1/oracle/objects.rb +53 -0
- data/lib/avmtrf1/oracle/oci8.rb +29 -0
- data/lib/avmtrf1/oracle.rb +10 -0
- data/lib/avmtrf1/patches/avm/git/issue/complete.rb +50 -0
- data/lib/avmtrf1/patches/avm/git/issue.rb +4 -0
- data/lib/avmtrf1/patches/avm/git/launcher/base.rb +46 -0
- data/lib/avmtrf1/patches/avm/git/launcher.rb +4 -0
- data/lib/avmtrf1/patches/avm/git.rb +4 -0
- data/lib/avmtrf1/patches/avm.rb +4 -0
- data/lib/avmtrf1/patches/inifile.rb +13 -0
- data/lib/avmtrf1/patches.rb +4 -0
- data/lib/avmtrf1/php/docker_images/base.rb +49 -0
- data/lib/avmtrf1/php/docker_images/factory.rb +37 -0
- data/lib/avmtrf1/php/docker_images/v5.rb +47 -0
- data/lib/avmtrf1/php/docker_images/v7.rb +27 -0
- data/lib/avmtrf1/php/docker_images/v7_v4.rb +30 -0
- data/lib/avmtrf1/php/docker_images/v8.rb +19 -0
- data/lib/avmtrf1/php/docker_images.rb +11 -0
- data/lib/avmtrf1/php.rb +9 -0
- data/lib/avmtrf1/red/client/authorization.xml.erb +4 -0
- data/lib/avmtrf1/red/client.rb +38 -0
- data/lib/avmtrf1/red/helper.rb +35 -0
- data/lib/avmtrf1/red/profile/put_file.xml.erb +19 -0
- data/lib/avmtrf1/red/profile.rb +58 -0
- data/lib/avmtrf1/red/server.rb +33 -0
- data/lib/avmtrf1/red.rb +5 -0
- data/lib/avmtrf1/redmine/entities/issue.rb +29 -0
- data/lib/avmtrf1/redmine/entities/issue_status.rb +23 -0
- data/lib/avmtrf1/redmine/entities.rb +10 -0
- data/lib/avmtrf1/redmine/instance.rb +41 -0
- data/lib/avmtrf1/redmine.rb +7 -0
- data/lib/avmtrf1/rest_provider/entity.rb +18 -0
- data/lib/avmtrf1/rest_provider/instance/issues.rb +30 -0
- data/lib/avmtrf1/rest_provider/instance.rb +30 -0
- data/lib/avmtrf1/rest_provider/request.rb +44 -0
- data/lib/avmtrf1/rest_provider/response.rb +73 -0
- data/lib/avmtrf1/rest_provider.rb +7 -0
- data/lib/avmtrf1/result.rb +44 -0
- data/lib/avmtrf1/ruby.rb +9 -0
- data/lib/avmtrf1/tools/application.rb +13 -0
- data/lib/avmtrf1/tools/core_ext.rb +4 -0
- data/lib/avmtrf1/tools/msgraph/api/entity.rb +35 -0
- data/lib/avmtrf1/tools/msgraph/api/member.rb +31 -0
- data/lib/avmtrf1/tools/msgraph/api/root.rb +27 -0
- data/lib/avmtrf1/tools/msgraph/api/team/member_add.rb +36 -0
- data/lib/avmtrf1/tools/msgraph/api/team.rb +40 -0
- data/lib/avmtrf1/tools/msgraph/api.rb +55 -0
- data/lib/avmtrf1/tools/msgraph/error.rb +31 -0
- data/lib/avmtrf1/tools/msgraph/request_mixin.rb +18 -0
- data/lib/avmtrf1/tools/msgraph/response_mixin.rb +23 -0
- data/lib/avmtrf1/tools/msgraph/token_retrieve.rb +42 -0
- data/lib/avmtrf1/tools/msgraph.rb +11 -0
- data/lib/avmtrf1/tools/rubygems/dependency.rb +20 -0
- data/lib/avmtrf1/tools/rubygems/not_found_error.rb +17 -0
- data/lib/avmtrf1/tools/rubygems.rb +11 -0
- data/lib/avmtrf1/tools/runner/check_point/login.rb +33 -0
- data/lib/avmtrf1/tools/runner/check_point.rb +17 -0
- data/lib/avmtrf1/tools/runner/esosti/changed.rb +39 -0
- data/lib/avmtrf1/tools/runner/esosti/fetch.rb +39 -0
- data/lib/avmtrf1/tools/runner/esosti/request.rb +76 -0
- data/lib/avmtrf1/tools/runner/esosti.rb +27 -0
- data/lib/avmtrf1/tools/runner/forponto/espelho.rb +47 -0
- data/lib/avmtrf1/tools/runner/forponto/marcacoes.rb +32 -0
- data/lib/avmtrf1/tools/runner/forponto/resumos.rb +87 -0
- data/lib/avmtrf1/tools/runner/forponto/saldo.rb +91 -0
- data/lib/avmtrf1/tools/runner/forponto.rb +70 -0
- data/lib/avmtrf1/tools/runner/git/gitlab/commit_link.rb +81 -0
- data/lib/avmtrf1/tools/runner/git/gitlab.rb +20 -0
- data/lib/avmtrf1/tools/runner/git/issues_check.rb +59 -0
- data/lib/avmtrf1/tools/runner/git/push_large.rb +46 -0
- data/lib/avmtrf1/tools/runner/git.rb +14 -0
- data/lib/avmtrf1/tools/runner/inventario_sistemas.rb +71 -0
- data/lib/avmtrf1/tools/runner/msgraph/joined_teams.rb +39 -0
- data/lib/avmtrf1/tools/runner/msgraph/request.rb +45 -0
- data/lib/avmtrf1/tools/runner/msgraph/team/member/add.rb +48 -0
- data/lib/avmtrf1/tools/runner/msgraph/team/member.rb +25 -0
- data/lib/avmtrf1/tools/runner/msgraph/team/members.rb +38 -0
- data/lib/avmtrf1/tools/runner/msgraph/team.rb +27 -0
- data/lib/avmtrf1/tools/runner/msgraph/token.rb +31 -0
- data/lib/avmtrf1/tools/runner/msgraph.rb +43 -0
- data/lib/avmtrf1/tools/runner/node_js/docker.rb +15 -0
- data/lib/avmtrf1/tools/runner/node_js.rb +18 -0
- data/lib/avmtrf1/tools/runner/openvpn.rb +91 -0
- data/lib/avmtrf1/tools/runner/oracle/query.rb +71 -0
- data/lib/avmtrf1/tools/runner/oracle/source_get.rb +51 -0
- data/lib/avmtrf1/tools/runner/oracle/user_clear.rb +59 -0
- data/lib/avmtrf1/tools/runner/oracle.rb +37 -0
- data/lib/avmtrf1/tools/runner/php/docker.rb +20 -0
- data/lib/avmtrf1/tools/runner/php.rb +18 -0
- data/lib/avmtrf1/tools/runner/red.rb +83 -0
- data/lib/avmtrf1/tools/runner/source.rb +14 -0
- data/lib/avmtrf1/tools/runner.rb +43 -0
- data/lib/avmtrf1/tools.rb +4 -0
- data/lib/pd1_tools/version.rb +5 -0
- data/lib/pd1_tools.rb +7 -0
- data/template/avmtrf1/node_js/docker_image/Dockerfile.template +25 -0
- data/template/avmtrf1/node_js/docker_image/auxiliary/config_banner.sh +15 -0
- data/template/avmtrf1/node_js/docker_image/auxiliary/init.sh +18 -0
- data/template/avmtrf1/node_js/docker_image/auxiliary/lib.sh +30 -0
- data/template/avmtrf1/node_js/docker_image/auxiliary/ng_serve.sh +16 -0
- data/template/avmtrf1/node_js/docker_image/auxiliary/npm_install.sh +21 -0
- data/template/avmtrf1/node_js/docker_image/auxiliary/start.sh +17 -0
- data/template/avmtrf1/php/docker_images/base/Dockerfile.template +104 -0
- data/template/avmtrf1/php/docker_images/base/aux/apache_foreground.sh +16 -0
- data/template/avmtrf1/php/docker_images/base/aux/apache_user.sh +54 -0
- data/template/avmtrf1/php/docker_images/base/aux/app_user_run.sh +17 -0
- data/template/avmtrf1/php/docker_images/base/aux/config_banner.sh +20 -0
- data/template/avmtrf1/php/docker_images/base/aux/init.sh +39 -0
- data/template/avmtrf1/php/docker_images/base/aux/laravel.sh +58 -0
- data/template/avmtrf1/php/docker_images/base/aux/lib.sh +70 -0
- data/template/avmtrf1/php/docker_images/base/aux/pear.sh +35 -0
- data/template/avmtrf1/php/docker_images/base/aux/php_composer.sh +31 -0
- data/template/avmtrf1/php/docker_images/base/aux/php_values.sh +41 -0
- data/template/avmtrf1/php/docker_images/base/aux/setup_apache_site.sh +16 -0
- data/template/avmtrf1/php/docker_images/base/aux/start.sh +26 -0
- data/template/avmtrf1/php/docker_images/base/aux/templates/apache_site.conf +12 -0
- data/template/avmtrf1/tools/msgraph/token_retrieve/python_retriever.py +85 -0
- metadata +460 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'tempfile'
|
4
|
+
require 'avmtrf1/esosti/parsers/solicitacao/main'
|
5
|
+
|
6
|
+
module Avmtrf1
|
7
|
+
module Esosti
|
8
|
+
class Session
|
9
|
+
class Solicitacao < ::Avmtrf1::Esosti::Session::ActionBase
|
10
|
+
class Main < ::Avmtrf1::Esosti::Session::ActionBase
|
11
|
+
attr_reader :data
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def run
|
16
|
+
build_data
|
17
|
+
end
|
18
|
+
|
19
|
+
def build_data
|
20
|
+
file = Tempfile.new('foo')
|
21
|
+
begin
|
22
|
+
file.write(session.current_source)
|
23
|
+
@data = ::Avmtrf1::Esosti::Parsers::Solicitacao::Main.new(file.path).data
|
24
|
+
ensure
|
25
|
+
file.close
|
26
|
+
file.unlink
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def data_keys
|
31
|
+
%w[source pessoa_afetada]
|
32
|
+
end
|
33
|
+
|
34
|
+
def pessoa_afetada_data
|
35
|
+
by_aria_label('Pessoa Afetada Mais Informações')
|
36
|
+
end
|
37
|
+
|
38
|
+
def detalhes_data
|
39
|
+
session.find_element(id: 'dijitEditorBody').text
|
40
|
+
end
|
41
|
+
|
42
|
+
def by_aria_label(aria_label)
|
43
|
+
session.find_element(xpath: "//.[@aria-label = '#{aria_label}']").text
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'action_base'
|
4
|
+
Dir["#{File.dirname(__FILE__)}/#{File.basename(__FILE__, '.*')}/*.rb"].sort.each do |path|
|
5
|
+
require path
|
6
|
+
end
|
7
|
+
|
8
|
+
module Avmtrf1
|
9
|
+
module Esosti
|
10
|
+
class Session
|
11
|
+
class Solicitacao < ::Avmtrf1::Esosti::Session::ActionBase
|
12
|
+
def initialize(parent, solicitacao_id)
|
13
|
+
@solicitacao_id = solicitacao_id.to_s.upcase
|
14
|
+
super(parent)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
attr_reader :solicitacao_id
|
20
|
+
|
21
|
+
def run
|
22
|
+
raise 'Argument "solicitacao_id" is blank' if solicitacao_id.blank?
|
23
|
+
|
24
|
+
go_to_solicitacao
|
25
|
+
build_data
|
26
|
+
end
|
27
|
+
|
28
|
+
def data_keys
|
29
|
+
%w[main]
|
30
|
+
end
|
31
|
+
|
32
|
+
def main_data
|
33
|
+
Main.new(parent).data
|
34
|
+
end
|
35
|
+
|
36
|
+
def go_to_solicitacao
|
37
|
+
go_to_solicitacoes
|
38
|
+
search_by_id
|
39
|
+
click_on_first_result
|
40
|
+
wait_for_solicitacao_page
|
41
|
+
end
|
42
|
+
|
43
|
+
def go_to_solicitacoes
|
44
|
+
session.action.move_to(session.find_element(
|
45
|
+
xpath: '//.[contains(text(), "Central de Serviços")]'
|
46
|
+
)).perform
|
47
|
+
session.wait_for_element(xpath: '//.[contains(text(), "Solicitações de Serviço")]').click
|
48
|
+
end
|
49
|
+
|
50
|
+
def search_by_id
|
51
|
+
session.wait_for_element(
|
52
|
+
xpath: '//.[@id = "SystemNavAppContent-sc_div"]' \
|
53
|
+
'//input[@type = "text" and contains(@class, "queryField")]'
|
54
|
+
).send_keys(solicitacao_id)
|
55
|
+
session.action.send_keys("\n").perform
|
56
|
+
end
|
57
|
+
|
58
|
+
def click_on_first_result
|
59
|
+
session.wait.until do
|
60
|
+
first_result.click
|
61
|
+
true
|
62
|
+
rescue Selenium::WebDriver::Error::ElementClickInterceptedError
|
63
|
+
false
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def first_result
|
68
|
+
session.find_element(xpath: '//*[@id="SystemNavAppContent-chld"]' \
|
69
|
+
'//span[contains(@id, "tdrow_[C:1]_ttxt-lb[R:0]")]')
|
70
|
+
end
|
71
|
+
|
72
|
+
def wait_for_solicitacao_page
|
73
|
+
id_text = session.wait_for_element(xpath: '//.[contains(@class, "ticketidtext2")]')
|
74
|
+
return if id_text.text == solicitacao_id
|
75
|
+
|
76
|
+
raise "Wrong ID found (Found: \"#{id_text.text}\", Should be: \"#{solicitacao_id}\")"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support/json' # To-to: declare in gem "aranha"
|
4
|
+
require 'aranha/selenium/session'
|
5
|
+
Dir["#{File.dirname(__FILE__)}/#{File.basename(__FILE__, '.*')}/*.rb"].sort.each do |path|
|
6
|
+
require path
|
7
|
+
end
|
8
|
+
|
9
|
+
module Avmtrf1
|
10
|
+
module Esosti
|
11
|
+
class Session
|
12
|
+
attr_reader :session, :url, :user, :password, :uf
|
13
|
+
|
14
|
+
def initialize(url, user, password, user_uf)
|
15
|
+
raise 'Argument "url" is blank' if url.blank?
|
16
|
+
raise 'Argument "user" is blank' if user.blank?
|
17
|
+
raise 'Argument "password" is blank' if password.blank?
|
18
|
+
raise 'Argument "user_uf" is blank' if user_uf.blank?
|
19
|
+
|
20
|
+
@url = url
|
21
|
+
@user = user
|
22
|
+
@password = password
|
23
|
+
@uf = user_uf
|
24
|
+
@session = ::Aranha::Selenium::Session.new
|
25
|
+
end
|
26
|
+
|
27
|
+
def login
|
28
|
+
::Avmtrf1::Esosti::Session::Login.new(self)
|
29
|
+
end
|
30
|
+
|
31
|
+
def solicitacao_get_data(solitacao_id)
|
32
|
+
::Avmtrf1::Esosti::Session::Solicitacao.new(self, solitacao_id).data
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
|
5
|
+
module Avmtrf1
|
6
|
+
module Executables
|
7
|
+
class << self
|
8
|
+
enable_simple_cache
|
9
|
+
|
10
|
+
def env
|
11
|
+
::EacRubyUtils::Envs.local
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
%w[docker sudo].each do |program|
|
17
|
+
define_method(program.underscore + '_uncached') do # rubocop:disable Style/StringConcatenation
|
18
|
+
env.executable(program, '--version')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'aranha/parsers/html/item_list'
|
4
|
+
|
5
|
+
module Avmtrf1
|
6
|
+
module Forponto
|
7
|
+
module Parsers
|
8
|
+
class DayRegisters < ::Aranha::Parsers::Html::ItemList
|
9
|
+
field :matricula, :string, './td[1]/font/text()'
|
10
|
+
field :nome, :string, './td[2]/font/text()'
|
11
|
+
field :hora, :string, './td[3]/font/text()'
|
12
|
+
|
13
|
+
def items_xpath
|
14
|
+
'//tr[@class = "celulatabptodados"]'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'sub_node'
|
4
|
+
|
5
|
+
module Avmtrf1
|
6
|
+
module Forponto
|
7
|
+
module Parsers
|
8
|
+
class Espelho < ::Aranha::Parsers::Html::Item
|
9
|
+
class DayNode < SubNode
|
10
|
+
include MethodsAsFields
|
11
|
+
|
12
|
+
FIELDS = %w[date marcacoes summaries].freeze
|
13
|
+
SUMMARIES_XPATH = './following-sibling::tr[1]//font[@class="fontetabptodados"]/p/text()'
|
14
|
+
|
15
|
+
def initialize(*args)
|
16
|
+
super
|
17
|
+
@summaries = []
|
18
|
+
end
|
19
|
+
|
20
|
+
def add_summary(summary)
|
21
|
+
@summaries << summary
|
22
|
+
end
|
23
|
+
|
24
|
+
def date_string
|
25
|
+
node.at_xpath('.//font[@class="fontetabptodata"]/text()').to_s
|
26
|
+
end
|
27
|
+
|
28
|
+
def date
|
29
|
+
m = %r{(\d{2})/(\d{2})/(\d{4})}.match(date_string)
|
30
|
+
return Date.new(m[3].to_i, m[2].to_i, m[1].to_i) if m
|
31
|
+
|
32
|
+
raise "Date not found at \"#{date_string}\""
|
33
|
+
end
|
34
|
+
|
35
|
+
def marcacoes_string
|
36
|
+
node.at_xpath('.//font[@class="fontetabptomarc"]/text()').to_s
|
37
|
+
end
|
38
|
+
|
39
|
+
def marcacoes
|
40
|
+
marcacoes_string.scan(/\d{2}:\d{2}/)
|
41
|
+
end
|
42
|
+
|
43
|
+
def summaries
|
44
|
+
@summaries.map(&:data)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'aranha/parsers/html/item'
|
4
|
+
|
5
|
+
module Avmtrf1
|
6
|
+
module Forponto
|
7
|
+
module Parsers
|
8
|
+
class Espelho < ::Aranha::Parsers::Html::Item
|
9
|
+
module MethodsAsFields
|
10
|
+
def methods_as_fields(fields)
|
11
|
+
fields.index_with { |field| send(field) }
|
12
|
+
end
|
13
|
+
|
14
|
+
def data
|
15
|
+
methods_as_fields(self.class.const_get('FIELDS'))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'sub_node'
|
4
|
+
|
5
|
+
module Avmtrf1
|
6
|
+
module Forponto
|
7
|
+
module Parsers
|
8
|
+
class Espelho < ::Aranha::Parsers::Html::Item
|
9
|
+
class RowNode < SubNode
|
10
|
+
def empty?
|
11
|
+
Utils.string_recursive(node).blank?
|
12
|
+
end
|
13
|
+
|
14
|
+
def css_class
|
15
|
+
node['class']
|
16
|
+
end
|
17
|
+
|
18
|
+
def day?
|
19
|
+
css_class == 'celulatabptomarc'
|
20
|
+
end
|
21
|
+
|
22
|
+
def summary?
|
23
|
+
css_class == 'celulatabptodados'
|
24
|
+
end
|
25
|
+
|
26
|
+
def days_area_end?
|
27
|
+
font = node.at_xpath('.//font[@class="fontetopotabelaponto"]')
|
28
|
+
font && font.text.to_s.include?('Total das Ocorr')
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Avmtrf1
|
4
|
+
module Forponto
|
5
|
+
module Parsers
|
6
|
+
class Espelho < ::Aranha::Parsers::Html::Item
|
7
|
+
class RowsConsumer
|
8
|
+
include MethodsAsFields
|
9
|
+
|
10
|
+
FIELDS = %w[days summaries].freeze
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@days = []
|
14
|
+
@summaries = []
|
15
|
+
@days_area = true
|
16
|
+
end
|
17
|
+
|
18
|
+
def add_row(row_node)
|
19
|
+
row_node = RowNode.new(row_node)
|
20
|
+
return if row_node.empty?
|
21
|
+
|
22
|
+
if @days_area
|
23
|
+
add_row_from_days_area(row_node)
|
24
|
+
else
|
25
|
+
add_row_from_summaries_area(row_node)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def days
|
30
|
+
@days.map(&:data)
|
31
|
+
end
|
32
|
+
|
33
|
+
def summaries
|
34
|
+
@summaries.map(&:data)
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def add_row_from_days_area(row_node)
|
40
|
+
if row_node.days_area_end?
|
41
|
+
@days_area = false
|
42
|
+
elsif row_node.day?
|
43
|
+
add_day(row_node)
|
44
|
+
elsif row_node.summary?
|
45
|
+
add_summary_on_day(row_node)
|
46
|
+
else
|
47
|
+
"Unmapped class: \"#{row_node.css_class}\""
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def add_row_from_summaries_area(row_node)
|
52
|
+
raise "Not a summary node found on summaries area: #{row_node.node}" unless
|
53
|
+
row_node.summary?
|
54
|
+
|
55
|
+
row_node.node.xpath('.//table').each do |table_node|
|
56
|
+
@summaries << SummaryNode.new(table_node)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def add_day(row_node)
|
61
|
+
@days << DayNode.new(row_node.node)
|
62
|
+
end
|
63
|
+
|
64
|
+
def add_summary_on_day(row_node)
|
65
|
+
@days.last.add_summary(SummaryNode.new(row_node.node))
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'aranha/parsers/html/item'
|
4
|
+
require_relative 'methods_as_fields'
|
5
|
+
|
6
|
+
module Avmtrf1
|
7
|
+
module Forponto
|
8
|
+
module Parsers
|
9
|
+
class Espelho < ::Aranha::Parsers::Html::Item
|
10
|
+
class SubNode
|
11
|
+
attr_reader :node
|
12
|
+
|
13
|
+
def initialize(node)
|
14
|
+
@node = node
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/simple_cache'
|
4
|
+
require_relative 'sub_node'
|
5
|
+
|
6
|
+
module Avmtrf1
|
7
|
+
module Forponto
|
8
|
+
module Parsers
|
9
|
+
class Espelho < ::Aranha::Parsers::Html::Item
|
10
|
+
class SummaryNode < SubNode
|
11
|
+
include ::EacRubyUtils::SimpleCache
|
12
|
+
include MethodsAsFields
|
13
|
+
|
14
|
+
FIELDS = %w[code description time minutes].freeze
|
15
|
+
|
16
|
+
delegate :code, to: :code_description_parsed
|
17
|
+
|
18
|
+
delegate :description, to: :code_description_parsed
|
19
|
+
|
20
|
+
def time
|
21
|
+
column_text('20%')
|
22
|
+
end
|
23
|
+
|
24
|
+
def minutes
|
25
|
+
return nil if time.blank?
|
26
|
+
|
27
|
+
m = /\A(\d+):(\d+)\z/.match(time)
|
28
|
+
raise "\"#{time}\" does not match time pattern" unless m
|
29
|
+
|
30
|
+
(m[1].to_i * 60) + m[2].to_i
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def column_text(width)
|
36
|
+
Utils.string_recursive(node.at_xpath(".//td[@width='#{width}']"))
|
37
|
+
end
|
38
|
+
|
39
|
+
def code_description
|
40
|
+
column_text('80%')
|
41
|
+
end
|
42
|
+
|
43
|
+
def code_description_parsed_uncached
|
44
|
+
return ::OpenStruct.new(code: nil, description: nil) if code_description.blank? # rubocop:disable Style/OpenStructUse
|
45
|
+
|
46
|
+
m = /\A(\d+)\s*-\s*(\S.+)\z/.match(code_description)
|
47
|
+
raise "Code/description pattern not match: \"#{code_description}\"" unless m
|
48
|
+
|
49
|
+
::OpenStruct.new(code: m[1].to_i, description: m[2].strip) # rubocop:disable Style/OpenStructUse
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/simple_cache'
|
4
|
+
require_relative 'sub_node'
|
5
|
+
|
6
|
+
module Avmtrf1
|
7
|
+
module Forponto
|
8
|
+
module Parsers
|
9
|
+
class Espelho < ::Aranha::Parsers::Html::Item
|
10
|
+
class Utils
|
11
|
+
class << self
|
12
|
+
def string_recursive(node)
|
13
|
+
return nil if node.blank?
|
14
|
+
return sanitize_string(node.text) if node.is_a?(::Nokogiri::XML::Text)
|
15
|
+
|
16
|
+
s = ''
|
17
|
+
node.children.each do |child|
|
18
|
+
child_s = string_recursive(child)
|
19
|
+
s += ' ' + child_s if child_s.present? # rubocop:disable Style/StringConcatenation
|
20
|
+
end
|
21
|
+
sanitize_string(s)
|
22
|
+
end
|
23
|
+
|
24
|
+
def sanitize_string(obj)
|
25
|
+
obj.to_s.tr("\u00A0", ' ').strip
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'aranha/parsers/html/item'
|
4
|
+
require 'eac_ruby_utils/require_sub'
|
5
|
+
|
6
|
+
module Avmtrf1
|
7
|
+
module Forponto
|
8
|
+
module Parsers
|
9
|
+
class Espelho < ::Aranha::Parsers::Html::Item
|
10
|
+
::EacRubyUtils.require_sub(__FILE__)
|
11
|
+
|
12
|
+
def item_xpath
|
13
|
+
'//table[@class="fiotabelaponto"]//table//table'
|
14
|
+
end
|
15
|
+
|
16
|
+
def data
|
17
|
+
consumer = RowsConsumer.new
|
18
|
+
item_node.xpath('./tbody/tr').map do |row_node|
|
19
|
+
consumer.add_row(row_node)
|
20
|
+
end
|
21
|
+
consumer.data
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'avmtrf1/forponto/parsers/day_registers'
|
4
|
+
|
5
|
+
module Avmtrf1
|
6
|
+
module Forponto
|
7
|
+
class Session
|
8
|
+
module DayRegisters
|
9
|
+
MARCACOES_DO_DIA_VALUE = '1027'
|
10
|
+
|
11
|
+
def day_registers_data
|
12
|
+
parser_data(::Avmtrf1::Forponto::Parsers::DayRegisters, day_registers_source_code)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def day_registers_source_code
|
18
|
+
login(::Date.today.at_beginning_of_month, Date.today.at_end_of_month) # rubocop:disable Rails/Date
|
19
|
+
click_on_consultas_on_top_menu
|
20
|
+
select_marcacoes_option
|
21
|
+
sub.current_source
|
22
|
+
end
|
23
|
+
|
24
|
+
def click_on_consultas_on_top_menu
|
25
|
+
sub.switch_to.frame(sub.wait_for_element(xpath: '//frame[@name="topFrame"]'))
|
26
|
+
sub.wait_for_click(xpath: '//a[@href="javascript:document.frmconsultas.submit()"]')
|
27
|
+
sub.switch_to.default_content
|
28
|
+
end
|
29
|
+
|
30
|
+
def select_marcacoes_option
|
31
|
+
Selenium::WebDriver::Support::Select.new(
|
32
|
+
sub.wait_for_element(xpath: '//select[@name="deEdtConOpcao"]')
|
33
|
+
).select_by(:value, MARCACOES_DO_DIA_VALUE)
|
34
|
+
sub.wait_for_click(xpath: '//input[@name="ok" and @value="ok"]')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'avmtrf1/forponto/parsers/espelho'
|
4
|
+
|
5
|
+
module Avmtrf1
|
6
|
+
module Forponto
|
7
|
+
class Session
|
8
|
+
module Interval
|
9
|
+
def interval_data(start_date, end_date)
|
10
|
+
parser_data(
|
11
|
+
::Avmtrf1::Forponto::Parsers::Espelho,
|
12
|
+
interval_source_code(start_date, end_date)
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def interval_source_code(start_date, end_date)
|
19
|
+
login(start_date, end_date)
|
20
|
+
sub.switch_to.frame(sub.wait_for_element(xpath: '//frame[@name="topFrame"]'))
|
21
|
+
sub.wait_for_element(xpath: '//form[@name="frmjustificativa"]')
|
22
|
+
sub.current_source
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Avmtrf1
|
4
|
+
module Forponto
|
5
|
+
class Session
|
6
|
+
module Login
|
7
|
+
def login(start_date, end_date)
|
8
|
+
go_to_login_form
|
9
|
+
login_fill_matricula
|
10
|
+
login_fill_codigo
|
11
|
+
login_fill_start_date(start_date)
|
12
|
+
login_fill_end_date(end_date)
|
13
|
+
sub.wait_for_click(xpath: '//input[@name="ok"]')
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def go_to_login_form
|
19
|
+
sub.navigate.to root_url
|
20
|
+
sub.wait_for_click(xpath: '//a[text() = "COLABORADOR"]')
|
21
|
+
end
|
22
|
+
|
23
|
+
def login_fill_codigo
|
24
|
+
sub.wait_for_element(xpath: '//input[@name="deEdtFunConsulta"]').send_keys(codigo)
|
25
|
+
end
|
26
|
+
|
27
|
+
def login_fill_end_date(end_date)
|
28
|
+
sub.wait_for_element(xpath: '//input[@name="deEdtDataAte"]').send_keys(
|
29
|
+
end_date.strftime('%d/%m/%Y')
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
def login_fill_matricula
|
34
|
+
sub.wait_for_element(xpath: '//input[@name="deEdtFunCrachaSel"]').send_keys(matricula)
|
35
|
+
end
|
36
|
+
|
37
|
+
def login_fill_start_date(start_date)
|
38
|
+
sub.wait_for_element(xpath: '//input[@name="deEdtDataDe"]').send_keys(
|
39
|
+
start_date.strftime('%d/%m/%Y')
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'aranha/selenium/session'
|
4
|
+
require 'eac_ruby_utils/require_sub'
|
5
|
+
EacRubyUtils.require_sub(__FILE__)
|
6
|
+
|
7
|
+
module Avmtrf1
|
8
|
+
module Forponto
|
9
|
+
class Session
|
10
|
+
include ::Avmtrf1::Forponto::Session::DayRegisters
|
11
|
+
include ::Avmtrf1::Forponto::Session::Interval
|
12
|
+
include ::Avmtrf1::Forponto::Session::Login
|
13
|
+
|
14
|
+
attr_reader :sub, :root_url, :matricula, :codigo
|
15
|
+
|
16
|
+
def initialize(root_url, matricula, codigo)
|
17
|
+
@root_url = root_url
|
18
|
+
@matricula = matricula
|
19
|
+
@codigo = codigo
|
20
|
+
@sub = ::Aranha::Selenium::Session.new(
|
21
|
+
user_agent: 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def parser_data(parser_class, source_code)
|
26
|
+
tempfile = '/tmp/forponto.html'
|
27
|
+
::File.write(tempfile, source_code)
|
28
|
+
parser_class.new("file://#{tempfile}").data
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|