pshq_engine 0.0.1

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 (261) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/.travis.yml +3 -0
  4. data/Gemfile +4 -0
  5. data/README.md +39 -0
  6. data/Rakefile +1 -0
  7. data/app/models/.keep +0 -0
  8. data/app/models/ability.rb +76 -0
  9. data/app/models/alert.rb +56 -0
  10. data/app/models/asset.rb +485 -0
  11. data/app/models/asset_assignment.rb +13 -0
  12. data/app/models/asset_image.rb +9 -0
  13. data/app/models/asset_repair_request.rb +167 -0
  14. data/app/models/asset_scan.rb +87 -0
  15. data/app/models/asset_ticket.rb +3 -0
  16. data/app/models/cancellation.rb +64 -0
  17. data/app/models/candidate.rb +127 -0
  18. data/app/models/certification.rb +4 -0
  19. data/app/models/concerns/.keep +0 -0
  20. data/app/models/depreciation_setting.rb +10 -0
  21. data/app/models/dispatch.rb +3 -0
  22. data/app/models/employee.rb +22 -0
  23. data/app/models/feedback.rb +24 -0
  24. data/app/models/history_email.rb +221 -0
  25. data/app/models/importfile.rb +6 -0
  26. data/app/models/job.rb +37 -0
  27. data/app/models/jobs_users.rb +18 -0
  28. data/app/models/lateness.rb +35 -0
  29. data/app/models/location.rb +4 -0
  30. data/app/models/manufacturer.rb +4 -0
  31. data/app/models/member.rb +65 -0
  32. data/app/models/member_device.rb +4 -0
  33. data/app/models/message.rb +33 -0
  34. data/app/models/note.rb +20 -0
  35. data/app/models/notification.rb +73 -0
  36. data/app/models/notification_user.rb +4 -0
  37. data/app/models/o_auth/base.rb +27 -0
  38. data/app/models/o_auth/facebook.rb +21 -0
  39. data/app/models/o_auth/google.rb +18 -0
  40. data/app/models/organization.rb +189 -0
  41. data/app/models/plan.rb +4 -0
  42. data/app/models/project.rb +5 -0
  43. data/app/models/project_payment.rb +4 -0
  44. data/app/models/recurring_time_off.rb +4 -0
  45. data/app/models/response.rb +23 -0
  46. data/app/models/role.rb +22 -0
  47. data/app/models/schedule.rb +228 -0
  48. data/app/models/setting.rb +25 -0
  49. data/app/models/shift.rb +364 -0
  50. data/app/models/shift_off.rb +4 -0
  51. data/app/models/shift_trade.rb +43 -0
  52. data/app/models/subdomain.rb +5 -0
  53. data/app/models/swap.rb +82 -0
  54. data/app/models/task.rb +26 -0
  55. data/app/models/template.rb +59 -0
  56. data/app/models/template_asset.rb +3 -0
  57. data/app/models/timeoff.rb +101 -0
  58. data/app/models/token.rb +22 -0
  59. data/app/models/transaction.rb +2 -0
  60. data/app/models/unavailable.rb +37 -0
  61. data/app/models/user.rb +392 -0
  62. data/app/models/user_notification_setting.rb +178 -0
  63. data/app/models/user_vacation_info.rb +22 -0
  64. data/app/models/vacation.rb +24 -0
  65. data/app/models/vendor.rb +130 -0
  66. data/app/models/vendor_rating.rb +7 -0
  67. data/bin/console +14 -0
  68. data/bin/setup +7 -0
  69. data/db/migrate/20140211085026_devise_create_users.rb +58 -0
  70. data/db/migrate/20140211093822_rolify_create_roles.rb +19 -0
  71. data/db/migrate/20140211124352_create_subdomains.rb +9 -0
  72. data/db/migrate/20140211175737_devise_invitable_add_to_users.rb +24 -0
  73. data/db/migrate/20140222020040_create_schedules.rb +13 -0
  74. data/db/migrate/20140222020246_create_jobs.rb +11 -0
  75. data/db/migrate/20140222020348_create_shifts.rb +17 -0
  76. data/db/migrate/20140222020425_create_organizations.rb +19 -0
  77. data/db/migrate/20140226070901_create_plans.rb +11 -0
  78. data/db/migrate/20140302152936_create_feedbacks.rb +12 -0
  79. data/db/migrate/20140302153059_create_swaps.rb +16 -0
  80. data/db/migrate/20140302153215_create_timeoffs.rb +19 -0
  81. data/db/migrate/20140302153302_create_cancellations.rb +13 -0
  82. data/db/migrate/20140306014858_create_candidates.rb +15 -0
  83. data/db/migrate/20140314041018_create_shift_trades.rb +15 -0
  84. data/db/migrate/20140314041210_create_notes.rb +11 -0
  85. data/db/migrate/20140314041313_create_latenesses.rb +11 -0
  86. data/db/migrate/20140314041351_create_vacations.rb +11 -0
  87. data/db/migrate/20140314041440_create_user_vacation_infos.rb +11 -0
  88. data/db/migrate/20140318072438_create_jobs_users.rb +10 -0
  89. data/db/migrate/20140325151307_create_tasks.rb +16 -0
  90. data/db/migrate/20140406040247_create_mailboxer.mailboxer_engine.rb +66 -0
  91. data/db/migrate/20140406040248_add_conversation_optout.mailboxer_engine.rb +15 -0
  92. data/db/migrate/20141015085628_create_alerts.rb +14 -0
  93. data/db/migrate/20141023104634_add_disabled_to_users.rb +5 -0
  94. data/db/migrate/20141024094518_add_is_viewed_to_schedules.rb +5 -0
  95. data/db/migrate/20141027091531_add_customer_id_to_users.rb +5 -0
  96. data/db/migrate/20141029124637_create_unavailables.rb +11 -0
  97. data/db/migrate/20141029151702_create_certifications.rb +10 -0
  98. data/db/migrate/20141105091745_add_reminder_time_to_shifts.rb +5 -0
  99. data/db/migrate/20141106054916_create_certifications_users.rb +10 -0
  100. data/db/migrate/20141106100123_add_birth_date_to_users.rb +5 -0
  101. data/db/migrate/20141106134815_add_allow_rolling_v_hrs_to_organizations.rb +5 -0
  102. data/db/migrate/20141107155319_create_recurring_time_offs.rb +12 -0
  103. data/db/migrate/20141111084845_add_termination_date_to_users.rb +5 -0
  104. data/db/migrate/20141111103759_add_requested_weekly_hours_to_users.rb +5 -0
  105. data/db/migrate/20141113094547_add_api_token_to_users.rb +5 -0
  106. data/db/migrate/20150105143729_create_templates.rb +9 -0
  107. data/db/migrate/20150105164236_add_coloumn_is_template.rb +5 -0
  108. data/db/migrate/20150106121306_add_org_id.rb +5 -0
  109. data/db/migrate/20150126070904_add_job_id_to_shifts.rb +6 -0
  110. data/db/migrate/20150203112955_add_time_zone_to_org.rb +5 -0
  111. data/db/migrate/20150204160711_add_show_owner_to_org.rb +5 -0
  112. data/db/migrate/20150210165627_add_training_hours_to_shift.rb +9 -0
  113. data/db/migrate/20150217131509_add_total_hours_to_schedules.rb +5 -0
  114. data/db/migrate/20150218094709_add_show_disable_users.rb +5 -0
  115. data/db/migrate/20150225134050_add_notes_to_cancellation.rb +9 -0
  116. data/db/migrate/20150226125524_add_unexcused_absence_note_to_cancellation.rb +9 -0
  117. data/db/migrate/20150226125811_add_cancel_shift_to_shifts.rb +9 -0
  118. data/db/migrate/20150302100542_add_picture_to_user.rb +9 -0
  119. data/db/migrate/20150304082219_add_priorty_to_user.rb +9 -0
  120. data/db/migrate/20150304094605_add_time_format_to_organization.rb +8 -0
  121. data/db/migrate/20150304142621_create_shift_offs.rb +15 -0
  122. data/db/migrate/20150306120726_add_shiftoff_to_shifts.rb +9 -0
  123. data/db/migrate/20150310103643_add_email_and_number_to_user.rb +11 -0
  124. data/db/migrate/20150311110055_add_one_sided_to_candidate.rb +9 -0
  125. data/db/migrate/20150318083934_add_notes_to_shift_trade.rb +9 -0
  126. data/db/migrate/20150408180855_add_column_status_to_unavailability.rb +8 -0
  127. data/db/migrate/20150409140324_create_assets.rb +35 -0
  128. data/db/migrate/20150409142753_create_vendors.rb +14 -0
  129. data/db/migrate/20150409144023_create_employees.rb +13 -0
  130. data/db/migrate/20150409144751_create_assign_assets.rb +16 -0
  131. data/db/migrate/20150409150449_create_asset_repair_requests.rb +19 -0
  132. data/db/migrate/20150409151023_create_dispatches.rb +13 -0
  133. data/db/migrate/20150409151329_create_vendor_ratings.rb +11 -0
  134. data/db/migrate/20150409151546_create_template_assets.rb +11 -0
  135. data/db/migrate/20150413101913_create_index_organization.rb +7 -0
  136. data/db/migrate/20150414153330_change_vendors.rb +16 -0
  137. data/db/migrate/20150420112003_add_name_to_users.rb +5 -0
  138. data/db/migrate/20150421074542_add_comment_to_ratings.rb +5 -0
  139. data/db/migrate/20150421131331_add_retire_column_to_assets.rb +5 -0
  140. data/db/migrate/20150422135600_add_attachment_avatar_to_assets.rb +11 -0
  141. data/db/migrate/20150422143242_create_importfiles.rb +8 -0
  142. data/db/migrate/20150422143301_add_attachment_avatar_to_importfiles.rb +11 -0
  143. data/db/migrate/20150423080234_change_retire_column.rb +5 -0
  144. data/db/migrate/20150423170953_add_attachment_avatar_to_vendors.rb +11 -0
  145. data/db/migrate/20150423225459_add_lockable.rb +7 -0
  146. data/db/migrate/20150427171842_create_asset_scans.rb +15 -0
  147. data/db/migrate/20150429211309_add_attachment_logo_to_organizations.rb +11 -0
  148. data/db/migrate/20150430074555_change_assets_table.rb +8 -0
  149. data/db/migrate/20150430235920_add_unique_email_index_to_users.rb +5 -0
  150. data/db/migrate/20150505104834_add_columntouser.rb +8 -0
  151. data/db/migrate/20150505140926_add_maintenance_cost_to_assets.rb +6 -0
  152. data/db/migrate/20150505142413_create_asset_images.rb +8 -0
  153. data/db/migrate/20150505152604_create_pg_search_documents.rb +17 -0
  154. data/db/migrate/20150506090012_change_employee.rb +12 -0
  155. data/db/migrate/20150506110441_add_status_to_asset_repair_requests.rb +6 -0
  156. data/db/migrate/20150507080738_change_phone_in_employees.rb +6 -0
  157. data/db/migrate/20150507101306_create_manufacturers.rb +12 -0
  158. data/db/migrate/20150507101446_remove.rb +9 -0
  159. data/db/migrate/20150507102211_add_index_manufacturer.rb +5 -0
  160. data/db/migrate/20150507104605_add_website_manufacturer.rb +5 -0
  161. data/db/migrate/20150507115535_change_refrence_manucaturer.rb +6 -0
  162. data/db/migrate/20150507150848_create_notifications.rb +9 -0
  163. data/db/migrate/20150507150855_create_notification_users.rb +10 -0
  164. data/db/migrate/20150508094912_add_landline_to_organization.rb +5 -0
  165. data/db/migrate/20150508143536_add_source_to_notifications.rb +7 -0
  166. data/db/migrate/20150508145048_add_postal_to_profile.rb +5 -0
  167. data/db/migrate/20150508162219_add_summary_to_notifications.rb +5 -0
  168. data/db/migrate/20150509220624_remove_responded_from_notifications.rb +5 -0
  169. data/db/migrate/20150509220625_add_responded_to_notifications.rb +5 -0
  170. data/db/migrate/20150509225608_change_columns_asset_repair_requests.rb +11 -0
  171. data/db/migrate/20150511105420_remove_avatar_asset.rb +6 -0
  172. data/db/migrate/20150514105700_add_unique_asset_id_to_asset.rb +5 -0
  173. data/db/migrate/20150515110042_add_deleted_at_in_assets.rb +6 -0
  174. data/db/migrate/20150515111410_add_deleted_at_vendors.rb +6 -0
  175. data/db/migrate/20150515113054_add_deleted_at_in_employee.rb +6 -0
  176. data/db/migrate/20150515142228_create_locations.rb +16 -0
  177. data/db/migrate/20150515142242_add_locations_to_assets.rb +5 -0
  178. data/db/migrate/20150515142536_add_organization_to_locations.rb +5 -0
  179. data/db/migrate/20150518123010_change_assign_asset.rb +9 -0
  180. data/db/migrate/20150518140153_add_asset_id_in_asset_assign.rb +5 -0
  181. data/db/migrate/20150518144758_rename_assign_assets.rb +8 -0
  182. data/db/migrate/20150518145248_rename_asset_assignment.rb +8 -0
  183. data/db/migrate/20150519140425_change_empid_to_string.rb +6 -0
  184. data/db/migrate/20150521085132_change_uique_asset_id_to_string.rb +6 -0
  185. data/db/migrate/20150525095045_add_status_to_organizations.rb +5 -0
  186. data/db/migrate/20150525123202_create_transactions.rb +20 -0
  187. data/db/migrate/20150526124755_create_settings.rb +16 -0
  188. data/db/migrate/20150603163451_add_cost_comment_collected_by_to_asset_repair_request.rb +7 -0
  189. data/db/migrate/20150605144111_collected.rb +5 -0
  190. data/db/migrate/20150609111725_add_column_notification.rb +5 -0
  191. data/db/migrate/20150609170014_create_user_notification_settings.rb +13 -0
  192. data/db/migrate/20150609175555_add_city_to_locations.rb +4 -0
  193. data/db/migrate/20150612190052_addcity.rb +5 -0
  194. data/db/migrate/20150614215015_create_members.rb +27 -0
  195. data/db/migrate/20150616070816_add_organization_to_schedules.rb +9 -0
  196. data/db/migrate/20150616114344_change_timestape_to_date.rb +4 -0
  197. data/db/migrate/20150619085555_add_index_repair_scan_to_repair.rb +6 -0
  198. data/db/migrate/20150623120915_create_depreciation_settings.rb +9 -0
  199. data/db/migrate/20150624060402_add_depriciation_ref_to_assets.rb +5 -0
  200. data/db/migrate/20150624085501_add_organization_ref_dep.rb +5 -0
  201. data/db/migrate/20150624114339_add_user_to_vacation_info.rb +9 -0
  202. data/db/migrate/20150624131422_change_dep_seeting.rb +6 -0
  203. data/db/migrate/20150625090838_add_dep_cost_col_in_assets.rb +5 -0
  204. data/db/migrate/20150626123545_add_vendor_id_to_asset.rb +5 -0
  205. data/db/migrate/20150629095216_add_depreciated_cost_asset.rb +5 -0
  206. data/db/migrate/20150629124325_add_allow_vendor_additon_to_setings.rb +7 -0
  207. data/db/migrate/20150630080925_add_approve_to_vendor.rb +5 -0
  208. data/db/migrate/20150630112252_add_referrenc_dereciation_to_asset.rb +5 -0
  209. data/db/migrate/20150630124838_add_ref_dep_organization.rb +5 -0
  210. data/db/migrate/20150707102850_add_column_sittings_to_delete_ticket.rb +6 -0
  211. data/db/migrate/20150710150314_add_org_ref_to_subdomain.rb +5 -0
  212. data/db/migrate/20150713204553_add_hire_dateto_member.rb +9 -0
  213. data/db/migrate/20150714004440_add_organization_to_notes.rb +9 -0
  214. data/db/migrate/20150714100444_add_time_format_to_member.rb +9 -0
  215. data/db/migrate/20150714202050_create_asset_tickets.rb +11 -0
  216. data/db/migrate/20150722151752_add_invitation_counts_to_user.rb +10 -0
  217. data/db/migrate/20150723141352_add_invitation_created_at_to_member.rb +10 -0
  218. data/db/migrate/20150724105130_create_projects.rb +8 -0
  219. data/db/migrate/20150724105257_create_project_payments.rb +13 -0
  220. data/db/migrate/20150724220844_add_user_index_to_asset.rb +6 -0
  221. data/db/migrate/20150727085046_add_projects_to_organization.rb +11 -0
  222. data/db/migrate/20150727122551_add_coloumn_to_vendors.rb +5 -0
  223. data/db/migrate/20150727211029_add_column_code_to_asset.rb +5 -0
  224. data/db/migrate/20150728101649_add_disabled_to_member.rb +9 -0
  225. data/db/migrate/20150731095354_add_column_repair_date_to_asset.rb +6 -0
  226. data/db/migrate/20150731104152_add_column_repair_reminder_setting.rb +5 -0
  227. data/db/migrate/20150806085559_create_member_devices.rb +10 -0
  228. data/db/migrate/20150807133155_add_view_to_alert.rb +9 -0
  229. data/db/migrate/20150808151840_app_col_in_member_device.rb +5 -0
  230. data/db/migrate/20150808180234_add_deleted_at_toalerts.rb +7 -0
  231. data/db/migrate/20150810110136_add_address_in_4_feilds_vendor.rb +12 -0
  232. data/db/migrate/20150810172933_change_column_type_in_vendors.rb +6 -0
  233. data/db/migrate/20150811061019_change_column_in_vendors.rb +5 -0
  234. data/db/migrate/20150811133002_change_shift_off_time.rb +5 -0
  235. data/db/migrate/20150811135657_change_column_type_timestamp_to_date.rb +7 -0
  236. data/db/migrate/20150818131207_create_history_emails.rb +10 -0
  237. data/db/migrate/20150820115042_change_schedule_total_hours.rb +6 -0
  238. data/db/migrate/20150820120309_add_column_email_remove.rb +5 -0
  239. data/db/migrate/20150820121702_add_column_email_organization.rb +5 -0
  240. data/db/migrate/20150824085019_add_column_asset_purchase_vendor.rb +5 -0
  241. data/db/migrate/20150826122944_add_column_exipry_notification.rb +5 -0
  242. data/db/migrate/20150827113937_create_members_roles.rb +9 -0
  243. data/db/migrate/20150828145913_add_locable_to_member.rb +7 -0
  244. data/db/migrate/20150903155708_add_vendor_feilds_to_user.rb +8 -0
  245. data/db/migrate/20150903200953_add_shift_to_candidate.rb +9 -0
  246. data/db/migrate/20150904082434_add_one_sided_to_trade_shift.rb +9 -0
  247. data/db/migrate/20150904134529_add_column_in_setting_user_dispatch.rb +5 -0
  248. data/db/migrate/20150907082501_add_website_for_vendor.rb +6 -0
  249. data/db/migrate/20150907141100_add_dollar_limit_to_user.rb +5 -0
  250. data/db/migrate/20150907193030_add_estimate_in_repair.rb +8 -0
  251. data/db/migrate/20150908123735_add_vendor_aproval_in_repair.rb +10 -0
  252. data/db/migrate/20150909112005_add_column_amount_into_plan.rb +5 -0
  253. data/db/migrate/20150916131512_add_plan_name_to_project_payment.rb +9 -0
  254. data/db/schema.rb +909 -0
  255. data/db/seeds.rb +23 -0
  256. data/lib/assets/.keep +0 -0
  257. data/lib/pshq_engine/version.rb +3 -0
  258. data/lib/pshq_engine.rb +5 -0
  259. data/lib/tasks/.keep +0 -0
  260. data/pshq_engine.gemspec +26 -0
  261. metadata +330 -0
@@ -0,0 +1,22 @@
1
+ class Token
2
+ # JWT_SECRET = Rails.application.secrets.jwt_secret
3
+ # JWT_ALGORITHM = Rails.application.secrets.jwt_algorithm
4
+
5
+ attr_reader :user_id, :payload
6
+
7
+ def initialize token
8
+ # @payload = JWT.decode(token, JWT_SECRET, JWT_ALGORITHM).first.with_indifferent_access
9
+ # @user_id = @payload[:user_id]
10
+ # rescue JWT::DecodeError
11
+ # nil
12
+ end
13
+
14
+ # def valid?
15
+ # user_id.presence && Time.now < Time.at(@payload[:exp].to_i)
16
+ # end
17
+
18
+ # def self.encode user_id
19
+ # JWT.encode({ user_id: user_id, exp: (DateTime.now + 30).to_i }, JWT_SECRET, JWT_ALGORITHM)
20
+ # end
21
+
22
+ end
@@ -0,0 +1,2 @@
1
+ class Transaction < ActiveRecord::Base
2
+ end
@@ -0,0 +1,37 @@
1
+ class Unavailable < ActiveRecord::Base
2
+ belongs_to :shift
3
+
4
+ validates_presence_of :reason
5
+ validates_presence_of :shift
6
+
7
+ after_save :notify_to_managers
8
+
9
+ def shift_detail
10
+ "AS #{shift.job_name} from #{shift.start_time.strftime('%H:%M')} to #{shift.end_time.strftime('%H:%M')} on #{shift.formatted_due_date}"
11
+ end
12
+ def approve(manager, cancellation)
13
+ self.approved_by = manager.id
14
+ self.approved_date = Time.zone.now
15
+ # self.notes = cancellation[:notes] if !cancellation[:notes].blank?
16
+ self.status = 'approved'
17
+ save
18
+ end
19
+ def deny(cancellation)
20
+ self.status = 'denied'
21
+ save
22
+ end
23
+ private
24
+ def notify_to_managers
25
+ if notify
26
+ managers = shift.schedule.organization.get_managers
27
+ managers.each do |manager|
28
+ manager.notify_message(self)
29
+ end
30
+ end
31
+ end
32
+
33
+
34
+
35
+
36
+
37
+ end
@@ -0,0 +1,392 @@
1
+ class User < ActiveRecord::Base
2
+
3
+
4
+ has_one :user_notification_setting
5
+ has_many :ratings, :class_name => "VendorRating"
6
+ has_many :repair_requests, :class_name => "AssetRepairRequest"
7
+ has_many :user_notifications, :class_name => "NotificationUser"
8
+ has_one :user_setting , :class_name => "UserNotificationSetting"
9
+ has_and_belongs_to_many :roles, :join_table => :users_roles
10
+ has_many :member, :dependent => :destroy
11
+ accepts_nested_attributes_for :member
12
+ has_many :organizations, :through => :member
13
+ accepts_nested_attributes_for :organizations
14
+ has_many :asset
15
+ belongs_to :vacation
16
+ has_one :user_vacation_info
17
+ has_many :recurring_time_offs
18
+ has_many :cancellations, :through => :shifts
19
+ has_many :alerts
20
+ has_and_belongs_to_many :certifications
21
+ has_many :swaps, :through => :shifts
22
+ has_many :tasks
23
+ has_many :timeoffs, :dependent => :destroy
24
+ has_many :recurring_time_offs, :dependent => :destroy
25
+ has_and_belongs_to_many :jobs
26
+ has_many :feedbacks
27
+ has_many :notes, :dependent => :destroy
28
+ accepts_nested_attributes_for :notes, :reject_if => lambda { |note| note[:content].blank? }
29
+ accepts_nested_attributes_for :certifications
30
+
31
+ has_many :schedules, :dependent => :destroy do
32
+ def current_week
33
+ cur_day = Time.zone.now.strftime('%Y-%m-%d')
34
+ where("start_date <= '#{cur_day}' and end_date >= '#{cur_day}'")
35
+ end
36
+
37
+ def week_schedule_by_date(date)
38
+ where("start_date <= '#{date}' and end_date >= '#{date}'")
39
+ end
40
+
41
+ def not_template
42
+ where(:template_id => nil)
43
+ end
44
+
45
+ def schedule_by_date(start_date,end_date )
46
+ where("start_date >= '#{start_date}' and end_date <= '#{end_date}'")
47
+ end
48
+
49
+ def published
50
+ where(:publish => true)
51
+ end
52
+ end
53
+
54
+ has_many :shifts, :through => :schedules
55
+ has_many :shift_trades, :through => :swaps do
56
+ def affirmatives
57
+ where(:status => 'affirmative')
58
+ end
59
+ end
60
+
61
+ has_many :candidates, :dependent => :destroy do
62
+ def initials
63
+ where(:status => 'initial')
64
+ end
65
+ end
66
+
67
+ has_attached_file :avatar, :styles => { :medium => "300x300!", :thumb => "100x100!" }, :default_url => "assets/missing.png"
68
+ validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/
69
+
70
+ # validates_uniqueness_of :phone_number
71
+ # validates_length_of :phone_number, :within => 6..13, if: Proc.new {|user| user.phone_number != nil}
72
+ validates_uniqueness_of :email
73
+
74
+ # validates :first_name, :last_name ,:email , :presence => true
75
+ # validates :email, :uniqueness => true
76
+
77
+ include PgSearch
78
+ multisearchable :against => [:first_name, :last_name , :phone_number ,:email ]
79
+ pg_search_scope :custom_search,
80
+ :against => [:first_name, :last_name],
81
+ :using => {
82
+ :tsearch => {:prefix => true}
83
+ }
84
+
85
+ rolify
86
+
87
+ acts_as_messageable
88
+
89
+ devise :database_authenticatable, :registerable,
90
+ :recoverable, :rememberable,:timeoutable, :trackable,
91
+ :validatable,:lockable, :invitable, :omniauthable, :omniauth_providers => [:facebook,:google_oauth2,:twitter], :timeout_in => 8.hours
92
+
93
+ # functions for Sripe of TrackMyAssets
94
+ def stripe_create(token, plan_id , coupon)
95
+ Stripe.api_key = "sk_test_eIdlWzka50kLJLNIqAIklamd"
96
+ already_coupon = Stripe::Coupon.all
97
+ already_coupon.data.each do |ex_coupon|
98
+ if ex_coupon and !ex_coupon.id.blank? and ex_coupon.id == coupon
99
+ @coupon_code = coupon
100
+ else
101
+ @coupon_code
102
+ end
103
+ end
104
+ customer = Stripe::Customer.create(
105
+ :description => "http://trackmyassets.biz",
106
+ :plan => plan_id,
107
+ :source => token ,
108
+ :coupon => @coupon_code
109
+ )
110
+ return customer['id']
111
+ end
112
+
113
+ # Stripe Coupon Checking
114
+ def self.check_coupon(coupon_id)
115
+ Stripe.api_key = "sk_test_eIdlWzka50kLJLNIqAIklamd"
116
+ already_coupon = Stripe::Coupon.all
117
+ already_coupon.data.each do |ex_coupon|
118
+ if ex_coupon and !ex_coupon.id.blank? and ex_coupon.id == coupon_id
119
+ @coupon = coupon_id
120
+ else
121
+
122
+ end
123
+ end
124
+ return @coupon
125
+ end
126
+
127
+ def rating_for_vendors(vendor)
128
+ user_ratings_for_vendor = self.ratings.find_by_vendor_id(vendor.id)
129
+ if !user_ratings_for_vendor
130
+ user_ratings_for_vendor = vendor.ratings.new()
131
+ user_ratings_for_vendor.user_id = self.id
132
+ user_ratings_for_vendor.vendor_id = vendor.id
133
+ end
134
+ user_ratings_for_vendor
135
+ end
136
+
137
+ def notifications
138
+ Notification.joins(:subscribers).where(notification_users: {user_id: self.id}).order(created_at: :desc)
139
+ end
140
+
141
+ def unread_notifications_count
142
+ Notification.joins(:subscribers).where(notification_users: {user_id: self.id, seen: false}).order(created_at: :desc).count()
143
+ end
144
+
145
+ def to_json
146
+ {
147
+ :id => self.id,
148
+ :email => self.email,
149
+ :first_name => self.first_name,
150
+ :last_name => self.last_name,
151
+ :phone => self.phone_number,
152
+ # :address => self.address,
153
+ :roles => self.roles,
154
+ :is_invited => !self.invitation_created_at.nil?,
155
+ :is_accepted => !self.invitation_accepted_at.nil?,
156
+ :is_locked => !self.locked_at.nil?
157
+ }
158
+ end
159
+
160
+ def reset_user_password_token
161
+ self.reset_password_token = SecureRandom.hex(3)
162
+ self.reset_password_sent_at = Time.now.utc
163
+ self.save!(validate: false)
164
+ self.reset_password_token
165
+ end
166
+
167
+ def self.serialize_into_session(record)
168
+ [record.id.to_s, record.authenticatable_salt]
169
+ end
170
+
171
+ def assign_api_token
172
+ update_attribute(:api_token, SecureRandom.uuid)
173
+ end
174
+
175
+ def self.is_valid_user(email,password)
176
+ @user = User.find_by_email(email)
177
+ @user and @user.valid_password?(password) ? @user : nil
178
+ end
179
+
180
+ # Function for MT2W
181
+ def send_shift_reminder(min)
182
+ self.shifts.each do |shift|
183
+ d = shift.due_date
184
+ t = shift.start_time - min.to_i.minutes
185
+ dt = DateTime.new(d.year, d.month, d.day, t.hour, t.min, t.sec)
186
+ ShiftReminderWorker.perform_at(dt,self.email,"Your shift starts in #{min} minutes")
187
+ end
188
+ end
189
+
190
+ def self.enable
191
+ where(:disabled => false)
192
+ end
193
+ def self.find_for_facebook_oauth(auth)
194
+ where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|
195
+ already_user = User.where(:email => auth.info.email).first
196
+ if !user.persisted? and auth.info.email and already_user.blank?
197
+ user.provider = auth.provider
198
+ user.uid = auth.uid
199
+ user.email = auth.info.email
200
+ user.password = Devise.friendly_token[0,20]
201
+ user.first_name = auth.info.first_name
202
+ user.last_name = auth.info.last_name
203
+ # user.username = auth.info.name # assuming the user model has a name
204
+ user.avatar = process_uri(auth.info.image) # assuming the user model has an image
205
+ user.save(:validate=>false)
206
+ return user
207
+ elsif already_user
208
+ return already_user
209
+ else
210
+ return false
211
+ end
212
+ end
213
+ end
214
+
215
+ def self.process_uri(uri)
216
+ avatar_url = URI.parse(uri)
217
+ avatar_url.scheme = 'https'
218
+ avatar_url.to_s
219
+ end
220
+
221
+ def persisted?
222
+ !(new_record? || destroyed?)
223
+ end
224
+
225
+ def update_card(subscriber, card_info)
226
+ token = Stripe::Token.create(
227
+ card: {
228
+ number: card_info[:number],
229
+ exp_month: card_info[:exp_month],
230
+ exp_year: card_info[:exp_year],
231
+ cvc: card_info[:cvc]
232
+ }
233
+ )
234
+ customer = Stripe::Customer.retrieve(subscriber.customer_id)
235
+ card = customer.cards.create(card: token.id)
236
+ card.save
237
+ customer.default_card = card.id
238
+ customer.save
239
+ rescue Stripe::InvalidRequestError => e
240
+ logger.error "Stripe Error While Updating Card Info: #{e.message}"
241
+ errors.add :base, "#{e.message}"
242
+ false
243
+ end
244
+
245
+ def get_role_name(org_id)
246
+ member = self.member.where(:organization_id => org_id).first
247
+ if member.present?
248
+ return member.roles.first.name
249
+ end
250
+ end
251
+ def get_role(org_id)
252
+ member = self.member.where(:organization_id => org_id).first
253
+ if member.present?
254
+ return member.roles.first
255
+ end
256
+ end
257
+
258
+ def can_do_this(org,setting)
259
+ role = get_role_name(org.id)
260
+ if (role == 'admin' || role == 'manager' || role == 'super_admin' || setting)
261
+ return true
262
+ else
263
+ return false
264
+ end
265
+ end
266
+
267
+ def self.find_for_twitter_oauth(auth, signed_in_resource=nil)
268
+ user = User.where(:provider => auth.provider, :uid => auth.uid).first
269
+ if user
270
+ return user
271
+ else
272
+ user = User.new
273
+ name = auth.info.name
274
+ if name.include?(" ")
275
+ user.first_name = name.split(" ").first
276
+ user.last_name = name.split(" ").second
277
+ else
278
+ user.first_name = name
279
+ user.last_name = " "
280
+ end
281
+ user.provider = auth.provider
282
+ user.uid = auth.uid
283
+ user.password = Devise.friendly_token[0,20]
284
+ user.avatar = auth.info.image
285
+ user.save(:validate=>false)
286
+ return user
287
+ end
288
+ end
289
+
290
+ def self.find_for_google_oauth2(access_token, signed_in_resource=nil)
291
+ data = access_token.info
292
+ user = User.where(:provider => access_token.provider, :uid => access_token.uid ).first
293
+ if user
294
+ return user
295
+ else
296
+ registered_user = User.where(:email => data.email).first
297
+ if registered_user
298
+ return registered_user
299
+ else
300
+ user = User.new
301
+ user.provider = access_token.provider
302
+ user.uid = access_token.uid
303
+ user.email = data["email"]
304
+ user.password = Devise.friendly_token[0,20]
305
+ user.first_name = data.first_name
306
+ user.last_name = data.last_name
307
+ user.avatar = data.image # assuming the user model has an image
308
+ user.save(:validate=>false)
309
+ return user
310
+ end
311
+ end
312
+ end
313
+
314
+ def idle?(date, s_time, e_time)
315
+ shift = self.shifts.where( "due_date = :date AND ( ((start_time <= :s_time) AND (end_time >= :s_time)) OR ((:e_time >= start_time) AND (:e_time <= end_time)) OR ((start_time >= :s_time) AND (end_time <= :e_time)) ) ", {:date => date, :s_time => s_time, :e_time => e_time}).first
316
+ false if shift
317
+ true if shift.nil?
318
+ end
319
+
320
+ def notify_new_signup(org_id)
321
+ emails = self.organizations.find_by_id(org_id).users.with_role(:manager).collect { |user| user.email }
322
+ Notifier.delay.new_signup(emails,self.id)
323
+ end
324
+ def notify_alert(swap)
325
+ if self.email_notify
326
+ Notifier.delay.swap(self.email,swap.id)
327
+ end
328
+
329
+ if self.sms_notify
330
+ content = "Swap Date : #{swap.shift.due_date} Start Time : #{swap.shift.start_time} End Time : #{swap.shift.end_time}"
331
+ arguments = {
332
+ :to => self.phone_number,
333
+ :content => content
334
+ }
335
+ SmsWorker.perform_async(arguments)
336
+ end
337
+ end
338
+
339
+ def notify_message(lateness)
340
+ if self.email_notify
341
+ Notifier.delay.late(self.email,lateness.id)
342
+ end
343
+
344
+ if self.sms_notify
345
+ content = "Lateness Reason : #{lateness.reason} Start Time : #{lateness.shift.start_time} End Time : #{lateness.shift.end_time}"
346
+ arguments = {
347
+ :to => self.phone_number,
348
+ :content => content
349
+ }
350
+ SmsWorker.perform_async(arguments)
351
+ end
352
+ end
353
+
354
+ def send_instructions
355
+ template = 'send_instructions'
356
+ subject = "Reset password instructions"
357
+ Notifier.delay.send_instructions(self, subject, template)
358
+ end
359
+
360
+ def name
361
+ "#{first_name}"+ ' ' + "#{last_name}"
362
+ end
363
+
364
+ def mailboxer_email(object)
365
+ self.email
366
+ end
367
+
368
+ def self.encode user
369
+ JWT.encode({ user_id: user.id, exp: (DateTime.now + 30).to_i }, JWT_SECRET, JWT_ALGORITHM)
370
+ end
371
+
372
+ def self.for_oauth oauth
373
+ oauth.get_data
374
+ data = oauth.data
375
+ user = find_by_email(data[:email])
376
+ user = user.present? ? user : data
377
+ end
378
+
379
+ def average_rating
380
+ avg_rating = VendorRating.where(vendor_id: self.id).average("rating")
381
+ return avg_rating.to_i
382
+ end
383
+ # Get Asset Vendor
384
+ def get_asset_repair_vendor
385
+ Asset.where("vendor_id = ?", self.id)
386
+ end
387
+
388
+ # Get Asset Purchase Vendor
389
+ def get_asset_purchase_vendor
390
+ Asset.where("purchase_vendor_id = ?", self.id)
391
+ end
392
+ end
@@ -0,0 +1,178 @@
1
+ class UserNotificationSetting < ActiveRecord::Base
2
+ belongs_to :user
3
+ belongs_to :organization
4
+ has_many :notifications, :as => :source
5
+
6
+ # Email function for setting timer
7
+ def self.email_setting(user)
8
+ get_data = notify_setting(user)
9
+ if get_data.blank?
10
+ email_delay = "immediately"
11
+ # notification_update(user)
12
+ else
13
+ if get_data.email_date =="immediately"
14
+ email_delay = get_data.email_date
15
+ # notification_update(user)
16
+ else
17
+ email_delay = get_data.email_date
18
+ end
19
+ end
20
+ end
21
+
22
+ # Setting Date Time
23
+ def self.setting_date(user)
24
+ get_data = notify_setting(user)
25
+ if get_data.updated_at.blank?
26
+ st_date = DateTime.now.to_date
27
+ else
28
+ st_date = get_data.updated_at.to_date
29
+ end
30
+ end
31
+
32
+ # Repair cost for x setting
33
+ def self.repair_cost(user)
34
+ get_data = notify_setting(user)
35
+ if get_data.blank?
36
+ repaire_cost = 5
37
+ else
38
+ repaire_cost = get_data.cost
39
+ end
40
+ end
41
+
42
+ # repair count for same asset
43
+ def self.repair_count(user)
44
+ get_data = notify_setting(user)
45
+ if get_data.blank?
46
+ repaire_count = 5
47
+ else
48
+ repaire_count = get_data.repair_count
49
+ end
50
+ end
51
+
52
+ # Waranty Email Notification
53
+ def self.waranty_date(user)
54
+ get_data = notify_setting(user)
55
+ if get_data.blank?
56
+ warant_date = "warnty_day"
57
+ else
58
+ warant_date = get_data.waranty_date
59
+ end
60
+ end
61
+
62
+
63
+ # User Setting for specific user
64
+ def self.user_notification(user_id)
65
+ self.find_by_user_id(user_id)
66
+ end
67
+
68
+ # Convert Time
69
+
70
+ def self.service_date(setting)
71
+ if setting.contract_date.blank?
72
+ time = 1.day
73
+ elsif setting.contract_date =="day"
74
+ time = 1.day
75
+ elsif setting.contract_date =="week"
76
+ time = 1.week
77
+ elsif setting.contract_date =="month"
78
+ time = 1.month
79
+ elsif setting.contract_date =="2_month"
80
+ time = 2.months
81
+ elsif setting.contract_date =="3_month"
82
+ time = 3.months
83
+ end
84
+ return time
85
+ end
86
+
87
+ # Email for Assets
88
+ def self.create_asset_email(asset, organization , sender_email, user)
89
+ UserMailer.create_asset(asset, organization ,sender_email , user , user).deliver
90
+ end
91
+
92
+ def self.update_asset_email(asset,organization, sender_email, user)
93
+ seen = true
94
+ type = "asset update"
95
+ UserMailer.update_asset(asset,organization ,sender_email,user,user).deliver
96
+ HistoryEmail.history_email(user.id ,type , seen , organization.id , asset.id)
97
+ end
98
+
99
+ def self.assigment(asset, organization, employee, sender_email, user , assignment)
100
+ seen = true
101
+ type = "asset assignment"
102
+ UserMailer.asset_assgiment(asset,organization, employee, sender_email, user , assignment , user).deliver
103
+ HistoryEmail.history_email(user.id ,type,seen,organization.id , assignment.id)
104
+ end
105
+ # End of Asset
106
+ # For Vendor Creation
107
+ def self.create_vendor(vendor, sender_email, organization, user )
108
+ seen = true
109
+ type = "vendor create"
110
+ UserMailer.ct_vendor(vendor,sender_email, organization, user , user ).deliver
111
+ HistoryEmail.history_email(user.id ,type,seen,organization.id,vendor.id)
112
+ end
113
+
114
+ # For ticket
115
+ def self.create_ticket(asset , organization , sender_email, user , ticket )
116
+ seen = true
117
+ type = "create ticket"
118
+ UserMailer.create_ticket(asset , organization , sender_email, user , ticket ,user).deliver
119
+ HistoryEmail.history_email(user.id ,type,seen,organization.id , ticket.id)
120
+ end
121
+
122
+ # Ticket collect
123
+ def self.colletion_tickect(asset , organization , sender_email, user , collection)
124
+ seen = true
125
+ type = "collect ticket"
126
+ UserMailer.collect_ticket(asset , organization , sender_email, user , collection , user).deliver
127
+ HistoryEmail.history_email(user.id ,type, seen,organization.id, collection.collected_by_id)
128
+ end
129
+ # end
130
+
131
+ def self.send_repair(asset , organization , sender_email, user , request)
132
+ seen = true
133
+ type="repair request"
134
+ UserMailer.repair_request(asset , organization , sender_email, user , request , user).deliver
135
+ HistoryEmail.history_email(user.id ,type , seen,organization.id , request.id)
136
+ end
137
+
138
+ # Count Checking of repair asset
139
+ def self.repair_count_email(asset , vendor, organization, user , ticket)
140
+ total_repair = AssetRepairRequest.get_total_repair(asset.id)
141
+ member = Member.where("organization_id = ? " , organization.id).first
142
+ if member.has_role? 'owner'
143
+ onwer_user = User.where("id = ?",member.user_id).first
144
+ repair_count = UserNotificationSetting.repair_count(onwer_user.id)
145
+ if total_repair >= repair_count.to_i
146
+ UserMailer.repair_count_exceding(asset , vendor, organization , user , onwer_user, total_repair,repair_count , ticket).deliver
147
+ end
148
+ end
149
+ end
150
+
151
+ # Checking the Main Notification for cost alert
152
+ def self.collect_repair_alert(collection , organization , current_user)
153
+ purchasecost = collection.asset.purchased_cost
154
+ member = Member.where("organization_id = ? " , organization.id).first
155
+ if member.has_role? 'owner'
156
+ @onwer_user = User.where("id = ?",member.user_id).first
157
+ repair_cost = self.repair_cost(@onwer_user)
158
+ @estimate_cost = (purchasecost/100)*repair_cost.to_f
159
+ if @estimate_cost.to_f < collection.vending_cost.to_f || collection.estimate_by_user.to_f >= collection.vending_cost.to_f
160
+ if @onwer_user
161
+ UserMailer.repair_cost_alert(collection , organization , current_user , @onwer_user , @estimate_cost).deliver
162
+ end
163
+ end
164
+ end
165
+ end
166
+
167
+ private
168
+ # Def notification find
169
+ def self.notify_setting(user)
170
+ UserNotificationSetting.find_by_user_id(user)
171
+ end
172
+
173
+ def self.notification_update(user)
174
+ user_notify = Notification.find_by_notified_by_id(user)
175
+ user_notify.update_attribute(:notifications_status, true)
176
+ end
177
+
178
+ end
@@ -0,0 +1,22 @@
1
+ # == Schema Information
2
+ #
3
+ # Table name: user_vacation_infos
4
+ #
5
+ # id :integer not null, primary key
6
+ # user_id :integer
7
+ # vacation_id :integer
8
+ # spent_hours :float
9
+ # created_at :datetime
10
+ # updated_at :datetime
11
+ #
12
+
13
+ class UserVacationInfo < ActiveRecord::Base
14
+
15
+ belongs_to :member
16
+ belongs_to :vacation
17
+
18
+ validates_presence_of :member
19
+ validates_presence_of :vacation
20
+
21
+ validates_uniqueness_of :member_id, :scope => :vacation_id
22
+ end
@@ -0,0 +1,24 @@
1
+ # == Schema Information
2
+ #
3
+ # Table name: vacations
4
+ #
5
+ # id :integer not null, primary key
6
+ # name :string(255)
7
+ # total_hours :integer
8
+ # organization_id :integer
9
+ # created_at :datetime
10
+ # updated_at :datetime
11
+ #
12
+
13
+ class Vacation < ActiveRecord::Base
14
+
15
+ belongs_to :organization
16
+
17
+ has_many :users
18
+ has_many :user_vacation_infos
19
+ has_many :members, :through => :user_vacation_infos
20
+
21
+ validates_presence_of :name
22
+ validates_presence_of :total_hours
23
+
24
+ end