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.
Files changed (222) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +12 -0
  3. data/exe/pd1 +8 -0
  4. data/lib/avmtrf1/active_directory/user.rb +28 -0
  5. data/lib/avmtrf1/active_directory.rb +8 -0
  6. data/lib/avmtrf1/ad_user.rb +11 -0
  7. data/lib/avmtrf1/check_point/session/login.rb +57 -0
  8. data/lib/avmtrf1/check_point/session.rb +60 -0
  9. data/lib/avmtrf1/check_point.rb +3 -0
  10. data/lib/avmtrf1/default_esosti.rb +20 -0
  11. data/lib/avmtrf1/default_jira.rb +18 -0
  12. data/lib/avmtrf1/default_redmine.rb +16 -0
  13. data/lib/avmtrf1/docker/image.rb +49 -0
  14. data/lib/avmtrf1/docker/image_runner.rb +83 -0
  15. data/lib/avmtrf1/docker.rb +9 -0
  16. data/lib/avmtrf1/esosti/entities/issue.rb +24 -0
  17. data/lib/avmtrf1/esosti/entities.rb +9 -0
  18. data/lib/avmtrf1/esosti/instance/changed.rb +33 -0
  19. data/lib/avmtrf1/esosti/instance.rb +22 -0
  20. data/lib/avmtrf1/esosti/raw_data_sanitizer.rb +47 -0
  21. data/lib/avmtrf1/esosti/session/action_base.rb +34 -0
  22. data/lib/avmtrf1/esosti/session/atividades.rb +35 -0
  23. data/lib/avmtrf1/esosti/session/login.rb +47 -0
  24. data/lib/avmtrf1/esosti/session/solicitacao/main.rb +49 -0
  25. data/lib/avmtrf1/esosti/session/solicitacao.rb +81 -0
  26. data/lib/avmtrf1/esosti/session.rb +36 -0
  27. data/lib/avmtrf1/esosti.rb +8 -0
  28. data/lib/avmtrf1/executables.rb +23 -0
  29. data/lib/avmtrf1/forponto/parsers/day_registers.rb +19 -0
  30. data/lib/avmtrf1/forponto/parsers/espelho/day_node.rb +50 -0
  31. data/lib/avmtrf1/forponto/parsers/espelho/methods_as_fields.rb +21 -0
  32. data/lib/avmtrf1/forponto/parsers/espelho/row_node.rb +34 -0
  33. data/lib/avmtrf1/forponto/parsers/espelho/rows_consumer.rb +71 -0
  34. data/lib/avmtrf1/forponto/parsers/espelho/sub_node.rb +20 -0
  35. data/lib/avmtrf1/forponto/parsers/espelho/summary_node.rb +55 -0
  36. data/lib/avmtrf1/forponto/parsers/espelho/utils.rb +32 -0
  37. data/lib/avmtrf1/forponto/parsers/espelho.rb +26 -0
  38. data/lib/avmtrf1/forponto/session/day_registers.rb +39 -0
  39. data/lib/avmtrf1/forponto/session/interval.rb +27 -0
  40. data/lib/avmtrf1/forponto/session/login.rb +45 -0
  41. data/lib/avmtrf1/forponto/session.rb +32 -0
  42. data/lib/avmtrf1/forponto/user/balance.rb +155 -0
  43. data/lib/avmtrf1/forponto/user/day_registers.rb +32 -0
  44. data/lib/avmtrf1/forponto/user/month.rb +141 -0
  45. data/lib/avmtrf1/forponto/user.rb +22 -0
  46. data/lib/avmtrf1/git/cached_repository.rb +27 -0
  47. data/lib/avmtrf1/git/gitlab.rb +11 -0
  48. data/lib/avmtrf1/git/issue_on_repository.rb +100 -0
  49. data/lib/avmtrf1/git/push_large/_utils.rb +16 -0
  50. data/lib/avmtrf1/git/push_large/lfs_commit/cache.rb +21 -0
  51. data/lib/avmtrf1/git/push_large/lfs_commit/checkout_previous_revision.rb +35 -0
  52. data/lib/avmtrf1/git/push_large/lfs_commit/commit_changes.rb +48 -0
  53. data/lib/avmtrf1/git/push_large/lfs_commit/helpers.rb +29 -0
  54. data/lib/avmtrf1/git/push_large/lfs_commit/pick_source_revision.rb +103 -0
  55. data/lib/avmtrf1/git/push_large/lfs_commit/push.rb +90 -0
  56. data/lib/avmtrf1/git/push_large/lfs_commit/track_large_files.rb +53 -0
  57. data/lib/avmtrf1/git/push_large/lfs_commit.rb +47 -0
  58. data/lib/avmtrf1/git/push_large/source_commit/push.rb +42 -0
  59. data/lib/avmtrf1/git/push_large/source_commit.rb +58 -0
  60. data/lib/avmtrf1/git/push_large.rb +69 -0
  61. data/lib/avmtrf1/git/reference.rb +34 -0
  62. data/lib/avmtrf1/git.rb +10 -0
  63. data/lib/avmtrf1/gitlab/commit.rb +37 -0
  64. data/lib/avmtrf1/gitlab/repository.rb +41 -0
  65. data/lib/avmtrf1/ini/profile.rb +42 -0
  66. data/lib/avmtrf1/ini.rb +55 -0
  67. data/lib/avmtrf1/inventario_sistemas/parser/body.rb +27 -0
  68. data/lib/avmtrf1/inventario_sistemas/parser/body_row.rb +12 -0
  69. data/lib/avmtrf1/inventario_sistemas/parser/header.rb +38 -0
  70. data/lib/avmtrf1/inventario_sistemas/parser/header_column.rb +27 -0
  71. data/lib/avmtrf1/inventario_sistemas/parser.rb +40 -0
  72. data/lib/avmtrf1/inventario_sistemas/site_build/html_page_base/elements.rb +54 -0
  73. data/lib/avmtrf1/inventario_sistemas/site_build/html_page_base/layout.rb +55 -0
  74. data/lib/avmtrf1/inventario_sistemas/site_build/html_page_base/stylesheet.css +57 -0
  75. data/lib/avmtrf1/inventario_sistemas/site_build/html_page_base.rb +41 -0
  76. data/lib/avmtrf1/inventario_sistemas/site_build/index.rb +20 -0
  77. data/lib/avmtrf1/inventario_sistemas/site_build/sistema.rb +62 -0
  78. data/lib/avmtrf1/inventario_sistemas/site_build/sistemas_index.rb +31 -0
  79. data/lib/avmtrf1/inventario_sistemas/site_build.rb +71 -0
  80. data/lib/avmtrf1/inventario_sistemas.rb +38 -0
  81. data/lib/avmtrf1/issues/factory.rb +22 -0
  82. data/lib/avmtrf1/issues.rb +7 -0
  83. data/lib/avmtrf1/jira/entities/issue.rb +30 -0
  84. data/lib/avmtrf1/jira/entities.rb +9 -0
  85. data/lib/avmtrf1/jira/instance.rb +28 -0
  86. data/lib/avmtrf1/jira.rb +8 -0
  87. data/lib/avmtrf1/node_js/docker_image.rb +14 -0
  88. data/lib/avmtrf1/node_js.rb +9 -0
  89. data/lib/avmtrf1/openvpn/config/builder.rb +59 -0
  90. data/lib/avmtrf1/openvpn/config/parser/builder.rb +62 -0
  91. data/lib/avmtrf1/openvpn/config/parser/line.rb +47 -0
  92. data/lib/avmtrf1/openvpn/config/parser/simple.rb +27 -0
  93. data/lib/avmtrf1/openvpn/config/parser/tag.rb +39 -0
  94. data/lib/avmtrf1/openvpn/config/parser.rb +20 -0
  95. data/lib/avmtrf1/oracle/connection/base.rb +66 -0
  96. data/lib/avmtrf1/oracle/connection/string_builder.rb +44 -0
  97. data/lib/avmtrf1/oracle/connection.rb +12 -0
  98. data/lib/avmtrf1/oracle/object/base.rb +39 -0
  99. data/lib/avmtrf1/oracle/object/table.rb +15 -0
  100. data/lib/avmtrf1/oracle/object/user.rb +15 -0
  101. data/lib/avmtrf1/oracle/object/view.rb +15 -0
  102. data/lib/avmtrf1/oracle/object.rb +25 -0
  103. data/lib/avmtrf1/oracle/objects/relation.rb +23 -0
  104. data/lib/avmtrf1/oracle/objects/sql_builder.rb +64 -0
  105. data/lib/avmtrf1/oracle/objects.rb +53 -0
  106. data/lib/avmtrf1/oracle/oci8.rb +29 -0
  107. data/lib/avmtrf1/oracle.rb +10 -0
  108. data/lib/avmtrf1/patches/avm/git/issue/complete.rb +50 -0
  109. data/lib/avmtrf1/patches/avm/git/issue.rb +4 -0
  110. data/lib/avmtrf1/patches/avm/git/launcher/base.rb +46 -0
  111. data/lib/avmtrf1/patches/avm/git/launcher.rb +4 -0
  112. data/lib/avmtrf1/patches/avm/git.rb +4 -0
  113. data/lib/avmtrf1/patches/avm.rb +4 -0
  114. data/lib/avmtrf1/patches/inifile.rb +13 -0
  115. data/lib/avmtrf1/patches.rb +4 -0
  116. data/lib/avmtrf1/php/docker_images/base.rb +49 -0
  117. data/lib/avmtrf1/php/docker_images/factory.rb +37 -0
  118. data/lib/avmtrf1/php/docker_images/v5.rb +47 -0
  119. data/lib/avmtrf1/php/docker_images/v7.rb +27 -0
  120. data/lib/avmtrf1/php/docker_images/v7_v4.rb +30 -0
  121. data/lib/avmtrf1/php/docker_images/v8.rb +19 -0
  122. data/lib/avmtrf1/php/docker_images.rb +11 -0
  123. data/lib/avmtrf1/php.rb +9 -0
  124. data/lib/avmtrf1/red/client/authorization.xml.erb +4 -0
  125. data/lib/avmtrf1/red/client.rb +38 -0
  126. data/lib/avmtrf1/red/helper.rb +35 -0
  127. data/lib/avmtrf1/red/profile/put_file.xml.erb +19 -0
  128. data/lib/avmtrf1/red/profile.rb +58 -0
  129. data/lib/avmtrf1/red/server.rb +33 -0
  130. data/lib/avmtrf1/red.rb +5 -0
  131. data/lib/avmtrf1/redmine/entities/issue.rb +29 -0
  132. data/lib/avmtrf1/redmine/entities/issue_status.rb +23 -0
  133. data/lib/avmtrf1/redmine/entities.rb +10 -0
  134. data/lib/avmtrf1/redmine/instance.rb +41 -0
  135. data/lib/avmtrf1/redmine.rb +7 -0
  136. data/lib/avmtrf1/rest_provider/entity.rb +18 -0
  137. data/lib/avmtrf1/rest_provider/instance/issues.rb +30 -0
  138. data/lib/avmtrf1/rest_provider/instance.rb +30 -0
  139. data/lib/avmtrf1/rest_provider/request.rb +44 -0
  140. data/lib/avmtrf1/rest_provider/response.rb +73 -0
  141. data/lib/avmtrf1/rest_provider.rb +7 -0
  142. data/lib/avmtrf1/result.rb +44 -0
  143. data/lib/avmtrf1/ruby.rb +9 -0
  144. data/lib/avmtrf1/tools/application.rb +13 -0
  145. data/lib/avmtrf1/tools/core_ext.rb +4 -0
  146. data/lib/avmtrf1/tools/msgraph/api/entity.rb +35 -0
  147. data/lib/avmtrf1/tools/msgraph/api/member.rb +31 -0
  148. data/lib/avmtrf1/tools/msgraph/api/root.rb +27 -0
  149. data/lib/avmtrf1/tools/msgraph/api/team/member_add.rb +36 -0
  150. data/lib/avmtrf1/tools/msgraph/api/team.rb +40 -0
  151. data/lib/avmtrf1/tools/msgraph/api.rb +55 -0
  152. data/lib/avmtrf1/tools/msgraph/error.rb +31 -0
  153. data/lib/avmtrf1/tools/msgraph/request_mixin.rb +18 -0
  154. data/lib/avmtrf1/tools/msgraph/response_mixin.rb +23 -0
  155. data/lib/avmtrf1/tools/msgraph/token_retrieve.rb +42 -0
  156. data/lib/avmtrf1/tools/msgraph.rb +11 -0
  157. data/lib/avmtrf1/tools/rubygems/dependency.rb +20 -0
  158. data/lib/avmtrf1/tools/rubygems/not_found_error.rb +17 -0
  159. data/lib/avmtrf1/tools/rubygems.rb +11 -0
  160. data/lib/avmtrf1/tools/runner/check_point/login.rb +33 -0
  161. data/lib/avmtrf1/tools/runner/check_point.rb +17 -0
  162. data/lib/avmtrf1/tools/runner/esosti/changed.rb +39 -0
  163. data/lib/avmtrf1/tools/runner/esosti/fetch.rb +39 -0
  164. data/lib/avmtrf1/tools/runner/esosti/request.rb +76 -0
  165. data/lib/avmtrf1/tools/runner/esosti.rb +27 -0
  166. data/lib/avmtrf1/tools/runner/forponto/espelho.rb +47 -0
  167. data/lib/avmtrf1/tools/runner/forponto/marcacoes.rb +32 -0
  168. data/lib/avmtrf1/tools/runner/forponto/resumos.rb +87 -0
  169. data/lib/avmtrf1/tools/runner/forponto/saldo.rb +91 -0
  170. data/lib/avmtrf1/tools/runner/forponto.rb +70 -0
  171. data/lib/avmtrf1/tools/runner/git/gitlab/commit_link.rb +81 -0
  172. data/lib/avmtrf1/tools/runner/git/gitlab.rb +20 -0
  173. data/lib/avmtrf1/tools/runner/git/issues_check.rb +59 -0
  174. data/lib/avmtrf1/tools/runner/git/push_large.rb +46 -0
  175. data/lib/avmtrf1/tools/runner/git.rb +14 -0
  176. data/lib/avmtrf1/tools/runner/inventario_sistemas.rb +71 -0
  177. data/lib/avmtrf1/tools/runner/msgraph/joined_teams.rb +39 -0
  178. data/lib/avmtrf1/tools/runner/msgraph/request.rb +45 -0
  179. data/lib/avmtrf1/tools/runner/msgraph/team/member/add.rb +48 -0
  180. data/lib/avmtrf1/tools/runner/msgraph/team/member.rb +25 -0
  181. data/lib/avmtrf1/tools/runner/msgraph/team/members.rb +38 -0
  182. data/lib/avmtrf1/tools/runner/msgraph/team.rb +27 -0
  183. data/lib/avmtrf1/tools/runner/msgraph/token.rb +31 -0
  184. data/lib/avmtrf1/tools/runner/msgraph.rb +43 -0
  185. data/lib/avmtrf1/tools/runner/node_js/docker.rb +15 -0
  186. data/lib/avmtrf1/tools/runner/node_js.rb +18 -0
  187. data/lib/avmtrf1/tools/runner/openvpn.rb +91 -0
  188. data/lib/avmtrf1/tools/runner/oracle/query.rb +71 -0
  189. data/lib/avmtrf1/tools/runner/oracle/source_get.rb +51 -0
  190. data/lib/avmtrf1/tools/runner/oracle/user_clear.rb +59 -0
  191. data/lib/avmtrf1/tools/runner/oracle.rb +37 -0
  192. data/lib/avmtrf1/tools/runner/php/docker.rb +20 -0
  193. data/lib/avmtrf1/tools/runner/php.rb +18 -0
  194. data/lib/avmtrf1/tools/runner/red.rb +83 -0
  195. data/lib/avmtrf1/tools/runner/source.rb +14 -0
  196. data/lib/avmtrf1/tools/runner.rb +43 -0
  197. data/lib/avmtrf1/tools.rb +4 -0
  198. data/lib/pd1_tools/version.rb +5 -0
  199. data/lib/pd1_tools.rb +7 -0
  200. data/template/avmtrf1/node_js/docker_image/Dockerfile.template +25 -0
  201. data/template/avmtrf1/node_js/docker_image/auxiliary/config_banner.sh +15 -0
  202. data/template/avmtrf1/node_js/docker_image/auxiliary/init.sh +18 -0
  203. data/template/avmtrf1/node_js/docker_image/auxiliary/lib.sh +30 -0
  204. data/template/avmtrf1/node_js/docker_image/auxiliary/ng_serve.sh +16 -0
  205. data/template/avmtrf1/node_js/docker_image/auxiliary/npm_install.sh +21 -0
  206. data/template/avmtrf1/node_js/docker_image/auxiliary/start.sh +17 -0
  207. data/template/avmtrf1/php/docker_images/base/Dockerfile.template +104 -0
  208. data/template/avmtrf1/php/docker_images/base/aux/apache_foreground.sh +16 -0
  209. data/template/avmtrf1/php/docker_images/base/aux/apache_user.sh +54 -0
  210. data/template/avmtrf1/php/docker_images/base/aux/app_user_run.sh +17 -0
  211. data/template/avmtrf1/php/docker_images/base/aux/config_banner.sh +20 -0
  212. data/template/avmtrf1/php/docker_images/base/aux/init.sh +39 -0
  213. data/template/avmtrf1/php/docker_images/base/aux/laravel.sh +58 -0
  214. data/template/avmtrf1/php/docker_images/base/aux/lib.sh +70 -0
  215. data/template/avmtrf1/php/docker_images/base/aux/pear.sh +35 -0
  216. data/template/avmtrf1/php/docker_images/base/aux/php_composer.sh +31 -0
  217. data/template/avmtrf1/php/docker_images/base/aux/php_values.sh +41 -0
  218. data/template/avmtrf1/php/docker_images/base/aux/setup_apache_site.sh +16 -0
  219. data/template/avmtrf1/php/docker_images/base/aux/start.sh +26 -0
  220. data/template/avmtrf1/php/docker_images/base/aux/templates/apache_site.conf +12 -0
  221. data/template/avmtrf1/tools/msgraph/token_retrieve/python_retriever.py +85 -0
  222. 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,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avmtrf1
4
+ module Esosti
5
+ require 'avmtrf1/esosti/entities'
6
+ require 'avmtrf1/esosti/instance'
7
+ end
8
+ 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