lesli_support 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (165) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +5 -0
  3. data/app/assets/config/lesli_support_manifest.js +38 -0
  4. data/app/assets/images/lesli_support/support-logo.svg +9 -0
  5. data/app/assets/javascripts/lesli_support/application.js +5011 -0
  6. data/app/assets/stylesheets/lesli_support/application.css +9 -0
  7. data/app/controllers/lesli_support/accounts_controller.rb +60 -0
  8. data/app/controllers/lesli_support/application_controller.rb +4 -0
  9. data/app/controllers/lesli_support/catalog_categories_controller.rb +60 -0
  10. data/app/controllers/lesli_support/catalog_priorities_controller.rb +60 -0
  11. data/app/controllers/lesli_support/catalog_types_controller.rb +60 -0
  12. data/app/controllers/lesli_support/catalog_workspaces_controller.rb +60 -0
  13. data/app/controllers/lesli_support/catalogs_controller.rb +12 -0
  14. data/app/controllers/lesli_support/dashboard/components_controller.rb +92 -0
  15. data/app/controllers/lesli_support/dashboards_controller.rb +36 -0
  16. data/app/controllers/lesli_support/options_controller.rb +23 -0
  17. data/app/controllers/lesli_support/ticket/discussions_controller.rb +5 -0
  18. data/app/controllers/lesli_support/tickets_controller.rb +169 -0
  19. data/app/helpers/lesli_support/accounts_helper.rb +4 -0
  20. data/app/helpers/lesli_support/application_helper.rb +4 -0
  21. data/app/helpers/lesli_support/catalog_categories_helper.rb +4 -0
  22. data/app/helpers/lesli_support/catalog_priorities_helper.rb +4 -0
  23. data/app/helpers/lesli_support/catalog_types_helper.rb +4 -0
  24. data/app/helpers/lesli_support/catalog_workspaces_helper.rb +4 -0
  25. data/app/helpers/lesli_support/catalogs_helper.rb +4 -0
  26. data/app/helpers/lesli_support/dashboards_helper.rb +4 -0
  27. data/app/helpers/lesli_support/options_helper.rb +4 -0
  28. data/app/helpers/lesli_support/ticket/discussions_helper.rb +4 -0
  29. data/app/jobs/lesli_support/application_job.rb +4 -0
  30. data/app/mailers/lesli_support/application_mailer.rb +6 -0
  31. data/app/models/lesli_support/account.rb +48 -0
  32. data/app/models/lesli_support/application_record.rb +5 -0
  33. data/app/models/lesli_support/catalog.rb +15 -0
  34. data/app/models/lesli_support/catalog_category.rb +5 -0
  35. data/app/models/lesli_support/catalog_priority.rb +5 -0
  36. data/app/models/lesli_support/catalog_type.rb +5 -0
  37. data/app/models/lesli_support/catalog_workspace.rb +5 -0
  38. data/app/models/lesli_support/dashboard/component.rb +18 -0
  39. data/app/models/lesli_support/dashboard.rb +15 -0
  40. data/app/models/lesli_support/option.rb +4 -0
  41. data/app/models/lesli_support/ticket/discussion.rb +7 -0
  42. data/app/models/lesli_support/ticket.rb +44 -0
  43. data/app/services/lesli_support/catalog_service.rb +139 -0
  44. data/app/services/lesli_support/ticket_service.rb +147 -0
  45. data/app/views/layouts/lesli_support/application.html.erb +15 -0
  46. data/app/views/lesli_support/accounts/_account.html.erb +2 -0
  47. data/app/views/lesli_support/accounts/_form.html.erb +17 -0
  48. data/app/views/lesli_support/accounts/edit.html.erb +10 -0
  49. data/app/views/lesli_support/accounts/index.html.erb +14 -0
  50. data/app/views/lesli_support/accounts/new.html.erb +9 -0
  51. data/app/views/lesli_support/accounts/show.html.erb +10 -0
  52. data/app/views/lesli_support/catalog_categories/_catalog_category.html.erb +2 -0
  53. data/app/views/lesli_support/catalog_categories/_form.html.erb +17 -0
  54. data/app/views/lesli_support/catalog_categories/edit.html.erb +10 -0
  55. data/app/views/lesli_support/catalog_categories/index.html.erb +14 -0
  56. data/app/views/lesli_support/catalog_categories/new.html.erb +9 -0
  57. data/app/views/lesli_support/catalog_categories/show.html.erb +10 -0
  58. data/app/views/lesli_support/catalog_priorities/_catalog_priority.html.erb +2 -0
  59. data/app/views/lesli_support/catalog_priorities/_form.html.erb +17 -0
  60. data/app/views/lesli_support/catalog_priorities/edit.html.erb +10 -0
  61. data/app/views/lesli_support/catalog_priorities/index.html.erb +14 -0
  62. data/app/views/lesli_support/catalog_priorities/new.html.erb +9 -0
  63. data/app/views/lesli_support/catalog_priorities/show.html.erb +10 -0
  64. data/app/views/lesli_support/catalog_types/_catalog_type.html.erb +2 -0
  65. data/app/views/lesli_support/catalog_types/_form.html.erb +17 -0
  66. data/app/views/lesli_support/catalog_types/edit.html.erb +10 -0
  67. data/app/views/lesli_support/catalog_types/index.html.erb +14 -0
  68. data/app/views/lesli_support/catalog_types/new.html.erb +9 -0
  69. data/app/views/lesli_support/catalog_types/show.html.erb +10 -0
  70. data/app/views/lesli_support/catalog_workspaces/_catalog_workspace.html.erb +2 -0
  71. data/app/views/lesli_support/catalog_workspaces/_form.html.erb +17 -0
  72. data/app/views/lesli_support/catalog_workspaces/edit.html.erb +10 -0
  73. data/app/views/lesli_support/catalog_workspaces/index.html.erb +14 -0
  74. data/app/views/lesli_support/catalog_workspaces/new.html.erb +9 -0
  75. data/app/views/lesli_support/catalog_workspaces/show.html.erb +10 -0
  76. data/app/views/lesli_support/catalogs/_catalog.html.erb +2 -0
  77. data/app/views/lesli_support/catalogs/_form.html.erb +17 -0
  78. data/app/views/lesli_support/catalogs/edit.html.erb +10 -0
  79. data/app/views/lesli_support/catalogs/index.html.erb +14 -0
  80. data/app/views/lesli_support/catalogs/new.html.erb +9 -0
  81. data/app/views/lesli_support/catalogs/show.html.erb +10 -0
  82. data/app/views/lesli_support/dashboards/edit.html.erb +1 -0
  83. data/app/views/lesli_support/dashboards/index.html.erb +1 -0
  84. data/app/views/lesli_support/dashboards/new.html.erb +1 -0
  85. data/app/views/lesli_support/dashboards/show.html.erb +1 -0
  86. data/app/views/lesli_support/options/_form.html.erb +17 -0
  87. data/app/views/lesli_support/options/_option.html.erb +2 -0
  88. data/app/views/lesli_support/options/edit.html.erb +10 -0
  89. data/app/views/lesli_support/options/index.html.erb +14 -0
  90. data/app/views/lesli_support/options/new.html.erb +9 -0
  91. data/app/views/lesli_support/options/show.html.erb +10 -0
  92. data/app/views/lesli_support/partials/_engine-navigation.html.erb +39 -0
  93. data/app/views/lesli_support/ticket/discussions/_discussion.html.erb +2 -0
  94. data/app/views/lesli_support/ticket/discussions/_form.html.erb +17 -0
  95. data/app/views/lesli_support/ticket/discussions/edit.html.erb +10 -0
  96. data/app/views/lesli_support/ticket/discussions/index.html.erb +14 -0
  97. data/app/views/lesli_support/ticket/discussions/new.html.erb +9 -0
  98. data/app/views/lesli_support/ticket/discussions/show.html.erb +10 -0
  99. data/app/views/lesli_support/tickets/edit.html.erb +20 -0
  100. data/app/views/lesli_support/tickets/index.html.erb +34 -0
  101. data/app/views/lesli_support/tickets/new.html.erb +20 -0
  102. data/app/views/lesli_support/tickets/show.html.erb +20 -0
  103. data/config/locales/translations.en.yml +43 -0
  104. data/config/locales/translations.es.yml +43 -0
  105. data/config/locales/translations.fr.yml +43 -0
  106. data/config/locales/translations.it.yml +43 -0
  107. data/config/locales/translations.pt.yml +43 -0
  108. data/config/routes.rb +61 -0
  109. data/db/migrate/v1/0702000110_create_lesli_support_accounts.rb +42 -0
  110. data/db/migrate/v1/0702000210_create_lesli_support_account_settings.rb +46 -0
  111. data/db/migrate/v1/0702010110_create_lesli_support_catalog_workspaces.rb +43 -0
  112. data/db/migrate/v1/0702010210_create_lesli_support_catalog_types.rb +42 -0
  113. data/db/migrate/v1/0702010310_create_lesli_support_catalog_categories.rb +43 -0
  114. data/db/migrate/v1/0702010410_create_lesli_support_catalog_priorities.rb +43 -0
  115. data/db/migrate/v1/0702050110_create_lesli_support_dashboards.rb +50 -0
  116. data/db/migrate/v1/0702050210_create_lesli_support_dashboard_components.rb +50 -0
  117. data/db/migrate/v1/0702100110_create_lesli_support_slas.rb +59 -0
  118. data/db/migrate/v1/0702110110_create_lesli_support_tickets.rb +99 -0
  119. data/db/migrate/v1/0702110510_create_lesli_support_ticket_discussions.rb +52 -0
  120. data/db/seed/development.rb +62 -0
  121. data/db/seed/production.rb +31 -0
  122. data/db/seed/test.rb +31 -0
  123. data/db/seeds.rb +45 -0
  124. data/db/tables/0702010510_create_cloud_help_catalog_ticket_sources.rb +44 -0
  125. data/db/tables/0702020110_create_cloud_help_workflows.rb +47 -0
  126. data/db/tables/0702020210_create_cloud_help_workflow_statuses.rb +47 -0
  127. data/db/tables/0702020310_create_cloud_help_workflow_associations.rb +29 -0
  128. data/db/tables/0702020410_create_cloud_help_workflow_actions.rb +18 -0
  129. data/db/tables/0702020510_create_cloud_help_workflow_checks.rb +20 -0
  130. data/db/tables/0702030110_create_cloud_help_custom_fields.rb +15 -0
  131. data/db/tables/0702040110_create_cloud_help_custom_validations.rb +16 -0
  132. data/db/tables/0702040210_create_cloud_help_custom_validation_rules.rb +16 -0
  133. data/db/tables/0702040310_create_cloud_help_custom_validation_fields.rb +16 -0
  134. data/db/tables/0702100310_create_cloud_help_ticket_actions.rb +16 -0
  135. data/db/tables/0702100410_create_cloud_help_ticket_activities.rb +15 -0
  136. data/db/tables/0702100610_create_cloud_help_ticket_files.rb +16 -0
  137. data/db/tables/0702100710_create_cloud_help_ticket_subscribers.rb +16 -0
  138. data/db/tables/0702101010_create_cloud_help_ticket_timelines.rb +14 -0
  139. data/db/tables/0702101110_create_cloud_help_ticket_assignments.rb +15 -0
  140. data/db/tables/0702101210_create_cloud_help_ticket_histories.rb +15 -0
  141. data/db/tables/0702110310_create_cloud_help_sla_actions.rb +17 -0
  142. data/db/tables/0702110410_create_cloud_help_sla_activities.rb +15 -0
  143. data/db/tables/0702110510_create_cloud_help_sla_discussions.rb +17 -0
  144. data/db/tables/0702110610_create_cloud_help_sla_files.rb +16 -0
  145. data/db/tables/0702110710_create_cloud_help_sla_subscribers.rb +16 -0
  146. data/db/tables/0702111010_create_cloud_help_sla_associations.rb +13 -0
  147. data/lib/lesli_support/engine.rb +50 -0
  148. data/lib/lesli_support/version.rb +4 -0
  149. data/lib/lesli_support.rb +6 -0
  150. data/lib/scss/application.scss +11 -0
  151. data/lib/tasks/lesli_support_tasks.rake +4 -0
  152. data/lib/vue/application.js +93 -0
  153. data/lib/vue/apps/dashboard/components/engine-version.vue +71 -0
  154. data/lib/vue/apps/dashboard/components/my-tasks.vue +77 -0
  155. data/lib/vue/apps/tickets/components/assignments.vue +93 -0
  156. data/lib/vue/apps/tickets/components/form.vue +305 -0
  157. data/lib/vue/apps/tickets/components/internal-comments.vue +107 -0
  158. data/lib/vue/apps/tickets/components/sla-info.vue +115 -0
  159. data/lib/vue/apps/tickets/index.vue +145 -0
  160. data/lib/vue/apps/tickets/new.vue +78 -0
  161. data/lib/vue/apps/tickets/show.vue +183 -0
  162. data/lib/vue/stores/tickets.js +276 -0
  163. data/lib/vue/stores/translations.json +272 -0
  164. data/readme.md +72 -0
  165. metadata +223 -0
@@ -0,0 +1,4 @@
1
+ module LesliSupport
2
+ module CatalogWorkspacesHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module LesliSupport
2
+ module CatalogsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module LesliSupport
2
+ module DashboardsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module LesliSupport
2
+ module OptionsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module LesliSupport
2
+ module Ticket::DiscussionsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module LesliSupport
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module LesliSupport
2
+ class ApplicationMailer < ActionMailer::Base
3
+ default from: "from@example.com"
4
+ layout "mailer"
5
+ end
6
+ end
@@ -0,0 +1,48 @@
1
+ =begin
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Ruby on Rails SaaS Development Framework.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://www.lesli.tech
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ =end
32
+
33
+ module LesliSupport
34
+ class Account < ApplicationRecord
35
+ belongs_to :account, class_name: "Lesli::Account"
36
+ has_many :catalog_workspaces
37
+ has_many :catalog_types
38
+ has_many :catalog_categories
39
+ has_many :catalog_priorities
40
+ has_many :tickets
41
+
42
+ after_create :initialize_account
43
+
44
+ def initialize_account
45
+ Dashboard.initialize_dashboard(self)
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,5 @@
1
+ module LesliSupport
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,15 @@
1
+ module LesliSupport
2
+ class Catalog < ApplicationRecord
3
+ has_ancestry
4
+ belongs_to :parent, class_name: "Catalog", optional: true
5
+
6
+ after_save :catalog_option_order
7
+
8
+ def catalog_option_order
9
+ return if self.parent_id.nil?
10
+ return unless self.order.nil?
11
+ self.order = self.id
12
+ self.save!
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ module LesliSupport
2
+ class CatalogCategory < ApplicationRecord
3
+ has_many :tickets
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module LesliSupport
2
+ class CatalogPriority < ApplicationRecord
3
+ has_many :tickets
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module LesliSupport
2
+ class CatalogType < ApplicationRecord
3
+ has_many :tickets
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module LesliSupport
2
+ class CatalogWorkspace < ApplicationRecord
3
+ has_many :tickets
4
+ end
5
+ end
@@ -0,0 +1,18 @@
1
+ module LesliSupport
2
+ class Dashboard::Component < ApplicationRecord
3
+
4
+ belongs_to :dashboard, inverse_of: :components
5
+
6
+ def self.component_ids
7
+ ["version", "my-tasks"]
8
+ end
9
+ # components_ids: {
10
+ # list_new_tickets: "list_new_tickets",
11
+ # list_my_tickets: "list_my_tickets",
12
+ # list_unassigned_tickets: "list_unassigned_tickets",
13
+ # chart_tickets_by_type: "chart_tickets_by_type",
14
+ # chart_tickets_by_category: "chart_tickets_by_category",
15
+ # hours_worked: "hours_worked"
16
+ # }
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+
2
+ module LesliSupport
3
+ class Dashboard < Lesli::Shared::Dashboard
4
+ self.table_name = "lesli_support_dashboards"
5
+
6
+ belongs_to :account
7
+
8
+ has_many :components, inverse_of: :dashboard, autosave: true, dependent: :destroy
9
+ accepts_nested_attributes_for :components, allow_destroy: true
10
+
11
+ def self.initialize_dashboard(account)
12
+ super(self, account, [])
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,4 @@
1
+ module LesliSupport
2
+ class Option < ApplicationRecord
3
+ end
4
+ end
@@ -0,0 +1,7 @@
1
+ module LesliSupport
2
+ class Ticket::Discussion < Lesli::CloudObject::Discussion
3
+ belongs_to :cloud_object, class_name: "LesliSupport::Ticket", foreign_key: "ticket_id"
4
+ belongs_to :parent, class_name: "Discussion", optional: true
5
+ has_many :children, class_name: "Discussion", foreign_key: "parent_id"
6
+ end
7
+ end
@@ -0,0 +1,44 @@
1
+ =begin
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Ruby on Rails SaaS Development Framework.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://www.lesli.tech
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ =end
32
+
33
+ module LesliSupport
34
+ class Ticket < Lesli::ApplicationLesliRecord
35
+ belongs_to :account
36
+ belongs_to :user, class_name: "Lesli::User"
37
+ belongs_to :creator, class_name: "Lesli::User"
38
+
39
+ belongs_to :catalog_workspace, optional: true
40
+ belongs_to :catalog_type, optional: true
41
+ belongs_to :catalog_category, optional: true
42
+ belongs_to :catalog_priority, optional: true
43
+ end
44
+ end
@@ -0,0 +1,139 @@
1
+ =begin
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Ruby on Rails SaaS Development Framework.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://www.lesli.tech
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ =end
32
+
33
+ module LesliSupport
34
+ class CatalogService < Lesli::ApplicationLesliService
35
+
36
+ def find ticket_id
37
+ super(current_user.account.help.tickets.find_by(id: ticket_id))
38
+ end
39
+
40
+ def index
41
+
42
+ return current_user.account.support.tickets.left_joins(
43
+ :user, :creator
44
+ ).select(
45
+ :id,
46
+ :subject,
47
+ :deadline,
48
+ :creator_id,
49
+ :user_id,
50
+ "CONCAT_WS(' ', lesli_users.first_name, lesli_users.last_name) as user_name",
51
+ "CONCAT_WS(' ', creators_lesli_support_tickets.first_name, creators_lesli_support_tickets.last_name) as creator_name",
52
+ "lesli_support_tickets.updated_at",
53
+ "lesli_support_tickets.created_at"
54
+ ).order(id: :desc)
55
+ .page(query[:pagination][:page])
56
+ .per(query[:pagination][:perPage])
57
+
58
+ current_user.account.help.tickets.left_joins(
59
+ :priority,
60
+ :type,
61
+ :workspace,
62
+ :category,
63
+ :status,
64
+ :assignments,
65
+ :assigned,
66
+ :user
67
+ ).select(
68
+ :id,
69
+ :subject,
70
+ :deadline,
71
+ :assigned_id,
72
+ :user_id,
73
+ "CONCAT_WS(' ', users.first_name, users.last_name) as assigned_name",
74
+ "CONCAT_WS(' ', users_cloud_help_tickets.first_name, users_cloud_help_tickets.last_name) as user_name",
75
+ "cloud_help_tickets.updated_at",
76
+ "cloud_help_tickets.created_at"
77
+ )
78
+ end
79
+
80
+ def create(ticket_params)
81
+
82
+ ticket = current_user.account.help.tickets.new(ticket_params)
83
+ #ticket.source = Catalog::TicketSource.cloud_help_source(current_user.account.help)
84
+ ticket.creator = current_user
85
+ ticket.user = current_user
86
+
87
+ unless ticket_params.dig(:started_at)
88
+ #ticket.started_at = LC::Date2.new(Time.current).date.get
89
+ end
90
+
91
+ if ticket.save
92
+ #Ticket.log_activity_create(current_user, ticket)
93
+ #Ticket::Subscriber.add_subscriber(ticket, current_user, "discussion_created", "email")
94
+ #Workflow::Action.execute_actions(current_user, ticket, {}, ticket.attributes)
95
+ self.resource = ticket
96
+ else
97
+ pp ticket.errors.full_messages
98
+ self.error(ticket.errors.full_messages.to_sentence)
99
+ end
100
+
101
+ self
102
+ end
103
+
104
+ def show()
105
+ return current_user.account.help.tickets.left_joins(
106
+ :user, :creator
107
+ ).select(
108
+ :id,
109
+ :subject,
110
+ :deadline,
111
+ :creator_id,
112
+ :user_id,
113
+ "CONCAT_WS(' ', lesli_users.first_name, lesli_users.last_name) as user_name",
114
+ "CONCAT_WS(' ', creators_lesli_support_tickets.first_name, creators_lesli_support_tickets.last_name) as creator_name",
115
+ "lesli_support_tickets.updated_at",
116
+ "lesli_support_tickets.created_at"
117
+ ).where("lesli_support_tickets.id = ?", self.resource.id).first
118
+ end
119
+
120
+ def options()
121
+ catalogs = {}
122
+
123
+ # Retrieve all root nodes (nodes with no parent)
124
+ root_catalogs = current_user.account.support.catalogs
125
+ .where(ancestry: nil)
126
+
127
+ # Fetch all trees
128
+ root_catalogs.each do |catalog|
129
+ catalogs[catalog.name.downcase] = {
130
+ id: catalog.id,
131
+ name: catalog.name,
132
+ options: catalog.children
133
+ }
134
+ end
135
+
136
+ catalogs
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,147 @@
1
+ =begin
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Ruby on Rails SaaS Development Framework.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://www.lesli.tech
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ =end
32
+
33
+ module LesliSupport
34
+ class TicketService < Lesli::ApplicationLesliService
35
+
36
+ def find ticket_id
37
+ super(current_user.account.support.tickets.find_by(id: ticket_id))
38
+ end
39
+
40
+ def index
41
+
42
+ return current_user.account.support.tickets.left_joins(
43
+ :user,
44
+ :creator,
45
+ :catalog_priority
46
+ ).select(
47
+ :id,
48
+ :subject,
49
+ :deadline,
50
+ :creator_id,
51
+ :user_id,
52
+ "CONCAT_WS(' ', lesli_users.first_name, lesli_users.last_name) as user_name",
53
+ "CONCAT_WS(' ', creators_lesli_support_tickets.first_name, creators_lesli_support_tickets.last_name) as creator_name",
54
+ "lesli_support_tickets.updated_at",
55
+ "lesli_support_tickets.created_at",
56
+ "lesli_support_catalog_priorities.name as priority_name"
57
+ ).order(id: :desc)
58
+ .page(query[:pagination][:page])
59
+ .per(query[:pagination][:perPage])
60
+
61
+ current_user.account.help.tickets.left_joins(
62
+ :priority,
63
+ :type,
64
+ :workspace,
65
+ :category,
66
+ :status,
67
+ :assignments,
68
+ :assigned,
69
+ :user
70
+ ).select(
71
+ :id,
72
+ :subject,
73
+ :deadline,
74
+ :assigned_id,
75
+ :user_id,
76
+ "CONCAT_WS(' ', users.first_name, users.last_name) as assigned_name",
77
+ "CONCAT_WS(' ', users_cloud_help_tickets.first_name, users_cloud_help_tickets.last_name) as user_name",
78
+ "cloud_help_tickets.updated_at",
79
+ "cloud_help_tickets.created_at"
80
+ )
81
+ end
82
+
83
+ def create(ticket_params)
84
+
85
+ ticket = current_user.account.support.tickets.new(ticket_params)
86
+ #ticket.source = Catalog::TicketSource.cloud_help_source(current_user.account.help)
87
+ ticket.creator = current_user
88
+ ticket.user = current_user
89
+
90
+ unless ticket_params.dig(:started_at)
91
+ #ticket.started_at = LC::Date2.new(Time.current).date.get
92
+ end
93
+
94
+ if ticket.save
95
+ #Ticket.log_activity_create(current_user, ticket)
96
+ #Ticket::Subscriber.add_subscriber(ticket, current_user, "discussion_created", "email")
97
+ #Workflow::Action.execute_actions(current_user, ticket, {}, ticket.attributes)
98
+ self.resource = ticket
99
+ else
100
+ pp ticket.errors.full_messages
101
+ self.error(ticket.errors.full_messages.to_sentence)
102
+ end
103
+
104
+ self
105
+ end
106
+
107
+ def show()
108
+ return current_user.account.support.tickets.left_joins(
109
+ :user, :creator
110
+ ).select(
111
+ :id,
112
+ :subject,
113
+ :description,
114
+ :reference_url,
115
+ :deadline,
116
+ :started_at,
117
+ :completed_at,
118
+ :hours_worked,
119
+ :creator_id,
120
+ :user_id,
121
+ :catalog_workspace_id,
122
+ :catalog_type_id,
123
+ :catalog_category_id,
124
+ :catalog_priority_id,
125
+ "CONCAT_WS(' ', lesli_users.first_name, lesli_users.last_name) as user_name",
126
+ "CONCAT_WS(' ', creators_lesli_support_tickets.first_name, creators_lesli_support_tickets.last_name) as creator_name",
127
+ "lesli_support_tickets.updated_at",
128
+ "lesli_support_tickets.created_at"
129
+ ).where("lesli_support_tickets.id = ?", self.resource.id).first
130
+ end
131
+
132
+ def update(params)
133
+ self.resource.update(params)
134
+ end
135
+
136
+ def with_deadline()
137
+ current_user.account.support.tickets
138
+ #.joins("left join cloud_help_ticket_assignments chta on chta.cloud_help_tickets_id = cloud_help_tickets.id and chta.users_id = #{current_user.id}")
139
+ .select(:id, :subject, :description, :deadline)
140
+ .where.not(:deadline => nil)
141
+ #.where("cloud_help_tickets.deadline >= ?", query[:filters][:start_date])
142
+ #.where("cloud_help_tickets.deadline <= ? ", query[:filters][:end_date])
143
+ #.where("cloud_help_tickets.users_id = ? or cloud_help_tickets.user_main_id = ? or chta.users_id = ?", current_user.id, current_user.id, current_user.id)
144
+ .order(:deadline)
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Lesli help</title>
5
+ <%= csrf_meta_tags %>
6
+ <%= csp_meta_tag %>
7
+
8
+ <%= stylesheet_link_tag "lesli_support/application", media: "all" %>
9
+ </head>
10
+ <body>
11
+
12
+ <%= yield %>
13
+
14
+ </body>
15
+ </html>
@@ -0,0 +1,2 @@
1
+ <div id="<%= dom_id account %>">
2
+ </div>
@@ -0,0 +1,17 @@
1
+ <%= form_with(model: account) do |form| %>
2
+ <% if account.errors.any? %>
3
+ <div style="color: red">
4
+ <h2><%= pluralize(account.errors.count, "error") %> prohibited this account from being saved:</h2>
5
+
6
+ <ul>
7
+ <% account.errors.each do |error| %>
8
+ <li><%= error.full_message %></li>
9
+ <% end %>
10
+ </ul>
11
+ </div>
12
+ <% end %>
13
+
14
+ <div>
15
+ <%= form.submit %>
16
+ </div>
17
+ <% end %>
@@ -0,0 +1,10 @@
1
+ <h1>Editing account</h1>
2
+
3
+ <%= render "form", account: @account %>
4
+
5
+ <br>
6
+
7
+ <div>
8
+ <%= link_to "Show this account", @account %> |
9
+ <%= link_to "Back to accounts", accounts_path %>
10
+ </div>
@@ -0,0 +1,14 @@
1
+ <p style="color: green"><%= notice %></p>
2
+
3
+ <h1>Accounts</h1>
4
+
5
+ <div id="accounts">
6
+ <% @accounts.each do |account| %>
7
+ <%= render account %>
8
+ <p>
9
+ <%= link_to "Show this account", account %>
10
+ </p>
11
+ <% end %>
12
+ </div>
13
+
14
+ <%= link_to "New account", new_account_path %>
@@ -0,0 +1,9 @@
1
+ <h1>New account</h1>
2
+
3
+ <%= render "form", account: @account %>
4
+
5
+ <br>
6
+
7
+ <div>
8
+ <%= link_to "Back to accounts", accounts_path %>
9
+ </div>
@@ -0,0 +1,10 @@
1
+ <p style="color: green"><%= notice %></p>
2
+
3
+ <%= render @account %>
4
+
5
+ <div>
6
+ <%= link_to "Edit this account", edit_account_path(@account) %> |
7
+ <%= link_to "Back to accounts", accounts_path %>
8
+
9
+ <%= button_to "Destroy this account", @account, method: :delete %>
10
+ </div>
@@ -0,0 +1,2 @@
1
+ <div id="<%= dom_id catalog_category %>">
2
+ </div>
@@ -0,0 +1,17 @@
1
+ <%= form_with(model: catalog_category) do |form| %>
2
+ <% if catalog_category.errors.any? %>
3
+ <div style="color: red">
4
+ <h2><%= pluralize(catalog_category.errors.count, "error") %> prohibited this catalog_category from being saved:</h2>
5
+
6
+ <ul>
7
+ <% catalog_category.errors.each do |error| %>
8
+ <li><%= error.full_message %></li>
9
+ <% end %>
10
+ </ul>
11
+ </div>
12
+ <% end %>
13
+
14
+ <div>
15
+ <%= form.submit %>
16
+ </div>
17
+ <% end %>
@@ -0,0 +1,10 @@
1
+ <h1>Editing catalog category</h1>
2
+
3
+ <%= render "form", catalog_category: @catalog_category %>
4
+
5
+ <br>
6
+
7
+ <div>
8
+ <%= link_to "Show this catalog category", @catalog_category %> |
9
+ <%= link_to "Back to catalog categories", catalog_categories_path %>
10
+ </div>
@@ -0,0 +1,14 @@
1
+ <p style="color: green"><%= notice %></p>
2
+
3
+ <h1>Catalog categories</h1>
4
+
5
+ <div id="catalog_categories">
6
+ <% @catalog_categories.each do |catalog_category| %>
7
+ <%= render catalog_category %>
8
+ <p>
9
+ <%= link_to "Show this catalog category", catalog_category %>
10
+ </p>
11
+ <% end %>
12
+ </div>
13
+
14
+ <%= link_to "New catalog category", new_catalog_category_path %>