stay_commerce 0.1.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 (496) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +53 -0
  4. data/Rakefile +8 -0
  5. data/app/assets/config/stay_manifest.js +1 -0
  6. data/app/assets/fonts/bootstrap-icons.woff +0 -0
  7. data/app/assets/fonts/bootstrap-icons.woff2 +0 -0
  8. data/app/assets/images/chevron-down.svg +3 -0
  9. data/app/assets/images/circle-fill.svg +3 -0
  10. data/app/assets/images/circle.svg +3 -0
  11. data/app/assets/images/plus-circle.svg +4 -0
  12. data/app/assets/images/save.svg +3 -0
  13. data/app/assets/images/store.svg +3 -0
  14. data/app/assets/javascripts/stay/admin/address.js +165 -0
  15. data/app/assets/javascripts/stay/admin/ckeditor.min.js +7 -0
  16. data/app/assets/javascripts/stay/admin/flatpickr.min.js +2 -0
  17. data/app/assets/javascripts/stay/admin/index.js +28 -0
  18. data/app/assets/javascripts/stay/admin/property.js +37 -0
  19. data/app/assets/javascripts/stay/admin/select2.min.js +2 -0
  20. data/app/assets/javascripts/stay/application.js +14 -0
  21. data/app/assets/javascripts/stay/bootstrap.bundle.min.js +7 -0
  22. data/app/assets/javascripts/stay/ckeditor.js +11 -0
  23. data/app/assets/javascripts/stay/custom.js +56 -0
  24. data/app/assets/javascripts/stay/jquery-ui.min.js +13 -0
  25. data/app/assets/javascripts/stay/jquery.min.js +2 -0
  26. data/app/assets/stylesheets/stay/admin/flatpickr.min.css +13 -0
  27. data/app/assets/stylesheets/stay/admin/index.css +100 -0
  28. data/app/assets/stylesheets/stay/admin/select2.min.css +1 -0
  29. data/app/assets/stylesheets/stay/application.css +24 -0
  30. data/app/assets/stylesheets/stay/badges.css +72 -0
  31. data/app/assets/stylesheets/stay/bootstrap-icons.min.css +5 -0
  32. data/app/assets/stylesheets/stay/bootstrap-icons_fix.css +5 -0
  33. data/app/assets/stylesheets/stay/common.css +283 -0
  34. data/app/assets/stylesheets/stay/jquery-ui.css +1311 -0
  35. data/app/assets/stylesheets/stay/webpixels.css +7 -0
  36. data/app/channels/chat_channel.rb +13 -0
  37. data/app/controllers/concerns/stay/booking_validations.rb +86 -0
  38. data/app/controllers/concerns/stay/stripe_concern.rb +72 -0
  39. data/app/controllers/stay/admin/addresses_controller.rb +76 -0
  40. data/app/controllers/stay/admin/amenities_controller.rb +52 -0
  41. data/app/controllers/stay/admin/amenity_categories_controller.rb +52 -0
  42. data/app/controllers/stay/admin/base_controller.rb +38 -0
  43. data/app/controllers/stay/admin/bed_types_controller.rb +51 -0
  44. data/app/controllers/stay/admin/bookings_controller.rb +54 -0
  45. data/app/controllers/stay/admin/cancellation_policies_controller.rb +51 -0
  46. data/app/controllers/stay/admin/chats_controller.rb +53 -0
  47. data/app/controllers/stay/admin/cities_controller.rb +66 -0
  48. data/app/controllers/stay/admin/confirmations_controller.rb +30 -0
  49. data/app/controllers/stay/admin/countries_controller.rb +53 -0
  50. data/app/controllers/stay/admin/dashboard_controller.rb +8 -0
  51. data/app/controllers/stay/admin/features_controller.rb +54 -0
  52. data/app/controllers/stay/admin/home_controller.rb +15 -0
  53. data/app/controllers/stay/admin/house_rules_controller.rb +51 -0
  54. data/app/controllers/stay/admin/messages_controller.rb +53 -0
  55. data/app/controllers/stay/admin/passwords_controller.rb +32 -0
  56. data/app/controllers/stay/admin/payment_methods_controller.rb +53 -0
  57. data/app/controllers/stay/admin/payments_controller.rb +63 -0
  58. data/app/controllers/stay/admin/properties_controller.rb +118 -0
  59. data/app/controllers/stay/admin/property_categories_controller.rb +51 -0
  60. data/app/controllers/stay/admin/property_types_controller.rb +51 -0
  61. data/app/controllers/stay/admin/registrations_controller.rb +19 -0
  62. data/app/controllers/stay/admin/reviews_Controller.rb +63 -0
  63. data/app/controllers/stay/admin/roles_controller.rb +54 -0
  64. data/app/controllers/stay/admin/room_amenities_controller.rb +43 -0
  65. data/app/controllers/stay/admin/room_types_controller.rb +58 -0
  66. data/app/controllers/stay/admin/rooms_controller.rb +62 -0
  67. data/app/controllers/stay/admin/sessions_controller.rb +29 -0
  68. data/app/controllers/stay/admin/states_controller.rb +68 -0
  69. data/app/controllers/stay/admin/stores_controller.rb +132 -0
  70. data/app/controllers/stay/admin/taxes_controller.rb +51 -0
  71. data/app/controllers/stay/admin/users_controller.rb +85 -0
  72. data/app/controllers/stay/api/v1/amenities_controller.rb +13 -0
  73. data/app/controllers/stay/api/v1/amenity_categories_controller.rb +13 -0
  74. data/app/controllers/stay/api/v1/bed_types_controller.rb +9 -0
  75. data/app/controllers/stay/api/v1/booking_queries_controller.rb +205 -0
  76. data/app/controllers/stay/api/v1/bookings_controller.rb +299 -0
  77. data/app/controllers/stay/api/v1/cancellation_policies_controller.rb +10 -0
  78. data/app/controllers/stay/api/v1/chats_controller.rb +116 -0
  79. data/app/controllers/stay/api/v1/credit_cards_controller.rb +62 -0
  80. data/app/controllers/stay/api/v1/features_controller.rb +21 -0
  81. data/app/controllers/stay/api/v1/house_rules_controller.rb +9 -0
  82. data/app/controllers/stay/api/v1/invoices_controller.rb +47 -0
  83. data/app/controllers/stay/api/v1/messages_controller.rb +144 -0
  84. data/app/controllers/stay/api/v1/payments_controller.rb +61 -0
  85. data/app/controllers/stay/api/v1/profiles_controller.rb +23 -0
  86. data/app/controllers/stay/api/v1/properties_controller.rb +233 -0
  87. data/app/controllers/stay/api/v1/property_categories_controller.rb +14 -0
  88. data/app/controllers/stay/api/v1/property_types_controller.rb +14 -0
  89. data/app/controllers/stay/api/v1/room_types_controller.rb +14 -0
  90. data/app/controllers/stay/api/v1/rooms_controller.rb +23 -0
  91. data/app/controllers/stay/api/v1/user_paypal_controller.rb +53 -0
  92. data/app/controllers/stay/api/v1/users_controller.rb +17 -0
  93. data/app/controllers/stay/application_controller.rb +44 -0
  94. data/app/controllers/stay/base_api_controller.rb +14 -0
  95. data/app/controllers/stay/bookings_controller.rb +29 -0
  96. data/app/controllers/stay/payments_controller.rb +50 -0
  97. data/app/controllers/stay/profiles_controller.rb +26 -0
  98. data/app/controllers/stay/properties_controller.rb +15 -0
  99. data/app/controllers/stay/rooms_controller.rb +22 -0
  100. data/app/controllers/stay/users/confirmations_controller.rb +30 -0
  101. data/app/controllers/stay/users/omniauth_callbacks_controller.rb +30 -0
  102. data/app/controllers/stay/users/passwords_controller.rb +51 -0
  103. data/app/controllers/stay/users/registrations_controller.rb +62 -0
  104. data/app/controllers/stay/users/sessions_controller.rb +27 -0
  105. data/app/controllers/stay/users/unlocks_controller.rb +30 -0
  106. data/app/helpers/stay/admin/cities_helper.rb +4 -0
  107. data/app/helpers/stay/admin/countries_helper.rb +4 -0
  108. data/app/helpers/stay/admin/states_helper.rb +4 -0
  109. data/app/helpers/stay/admin/stores_helper.rb +25 -0
  110. data/app/helpers/stay/application_helper.rb +63 -0
  111. data/app/helpers/stay/currency_helper.rb +34 -0
  112. data/app/helpers/stay/locale_helper.rb +107 -0
  113. data/app/jobs/stay/application_job.rb +4 -0
  114. data/app/mailers/stay/application_mailer.rb +6 -0
  115. data/app/mailers/stay/user_mailer.rb +13 -0
  116. data/app/models/concerns/stay/translatable_resource.rb +25 -0
  117. data/app/models/stay/additional_rule.rb +5 -0
  118. data/app/models/stay/address.rb +40 -0
  119. data/app/models/stay/amenity.rb +13 -0
  120. data/app/models/stay/amenity_category.rb +6 -0
  121. data/app/models/stay/application_record.rb +5 -0
  122. data/app/models/stay/bed_type.rb +7 -0
  123. data/app/models/stay/booking.rb +199 -0
  124. data/app/models/stay/booking_query.rb +23 -0
  125. data/app/models/stay/cancellation_policy.rb +6 -0
  126. data/app/models/stay/chat.rb +23 -0
  127. data/app/models/stay/city.rb +9 -0
  128. data/app/models/stay/country.rb +23 -0
  129. data/app/models/stay/credit_card.rb +6 -0
  130. data/app/models/stay/discount.rb +4 -0
  131. data/app/models/stay/expense.rb +4 -0
  132. data/app/models/stay/feature.rb +11 -0
  133. data/app/models/stay/house_rule.rb +4 -0
  134. data/app/models/stay/invoice.rb +23 -0
  135. data/app/models/stay/line_item.rb +7 -0
  136. data/app/models/stay/message.rb +30 -0
  137. data/app/models/stay/payment.rb +54 -0
  138. data/app/models/stay/payment_method.rb +13 -0
  139. data/app/models/stay/price.rb +18 -0
  140. data/app/models/stay/property.rb +243 -0
  141. data/app/models/stay/property_amenity.rb +6 -0
  142. data/app/models/stay/property_category.rb +6 -0
  143. data/app/models/stay/property_feature.rb +6 -0
  144. data/app/models/stay/property_house_rule.rb +6 -0
  145. data/app/models/stay/property_tax.rb +6 -0
  146. data/app/models/stay/property_type.rb +15 -0
  147. data/app/models/stay/review.rb +5 -0
  148. data/app/models/stay/role.rb +11 -0
  149. data/app/models/stay/role_user.rb +6 -0
  150. data/app/models/stay/room.rb +93 -0
  151. data/app/models/stay/room_amenity.rb +6 -0
  152. data/app/models/stay/room_feature.rb +6 -0
  153. data/app/models/stay/room_type.rb +7 -0
  154. data/app/models/stay/state.rb +13 -0
  155. data/app/models/stay/store.rb +139 -0
  156. data/app/models/stay/store_property.rb +9 -0
  157. data/app/models/stay/tax.rb +8 -0
  158. data/app/models/stay/user.rb +111 -0
  159. data/app/models/stay/user_paypal.rb +5 -0
  160. data/app/serializers/amenity_category_serializer.rb +13 -0
  161. data/app/serializers/amenity_serializer.rb +3 -0
  162. data/app/serializers/bed_type_serializer.rb +5 -0
  163. data/app/serializers/booking_query_serializer.rb +6 -0
  164. data/app/serializers/booking_serializer.rb +68 -0
  165. data/app/serializers/cancellation_policy_serializer.rb +3 -0
  166. data/app/serializers/chat_serializer.rb +63 -0
  167. data/app/serializers/credit_card_serializer.rb +7 -0
  168. data/app/serializers/house_rules_serializer.rb +3 -0
  169. data/app/serializers/invoice_serializer.rb +41 -0
  170. data/app/serializers/last_5_messages_serializer.rb +7 -0
  171. data/app/serializers/line_item_serializer.rb +6 -0
  172. data/app/serializers/message_serializer.rb +44 -0
  173. data/app/serializers/property_category_serializer.rb +7 -0
  174. data/app/serializers/property_feature_serializer.rb +5 -0
  175. data/app/serializers/property_listing_serializer.rb +13 -0
  176. data/app/serializers/property_serializer.rb +77 -0
  177. data/app/serializers/property_type_serializer.rb +7 -0
  178. data/app/serializers/room_serializer.rb +36 -0
  179. data/app/serializers/room_type_serializer.rb +5 -0
  180. data/app/serializers/user_listing_serializer.rb +23 -0
  181. data/app/serializers/user_serializer.rb +41 -0
  182. data/app/services/stay/bookings/create_booking_service.rb +49 -0
  183. data/app/services/stay/bookings/create_line_item_service.rb +15 -0
  184. data/app/services/stay/bookings/existing_booking_service.rb +50 -0
  185. data/app/services/stay/chat/chat_messaging_service.rb +82 -0
  186. data/app/services/stay/chat/query_messaging_service.rb +56 -0
  187. data/app/services/stay/seeds/all.rb +27 -0
  188. data/app/services/stay/seeds/cancellation_policy.rb +21 -0
  189. data/app/services/stay/seeds/countries.rb +33 -0
  190. data/app/services/stay/seeds/roles.rb +9 -0
  191. data/app/services/stay/seeds/states.rb +63 -0
  192. data/app/services/stay/seeds/stores.rb +34 -0
  193. data/app/views/devise/mailer/reset_password_instructions.html.rb +10 -0
  194. data/app/views/kaminari/_first_page.html.erb +3 -0
  195. data/app/views/kaminari/_gap.html.erb +3 -0
  196. data/app/views/kaminari/_last_page.html.erb +3 -0
  197. data/app/views/kaminari/_next_page.html.erb +3 -0
  198. data/app/views/kaminari/_page.html.erb +9 -0
  199. data/app/views/kaminari/_paginator.html.erb +17 -0
  200. data/app/views/kaminari/_prev_page.html.erb +3 -0
  201. data/app/views/layouts/stay/admin.html.erb +45 -0
  202. data/app/views/layouts/stay/application.html.erb +34 -0
  203. data/app/views/stay/admin/addresses/_form.html.erb +49 -0
  204. data/app/views/stay/admin/addresses/edit.html.erb +5 -0
  205. data/app/views/stay/admin/addresses/index.html.erb +68 -0
  206. data/app/views/stay/admin/addresses/new.html.erb +5 -0
  207. data/app/views/stay/admin/addresses/show.html.erb +40 -0
  208. data/app/views/stay/admin/amenities/_form.html.erb +38 -0
  209. data/app/views/stay/admin/amenities/edit.html.erb +14 -0
  210. data/app/views/stay/admin/amenities/index.html.erb +58 -0
  211. data/app/views/stay/admin/amenities/new.html.erb +14 -0
  212. data/app/views/stay/admin/amenities/show.html.erb +19 -0
  213. data/app/views/stay/admin/amenity_categories/_form.html.erb +29 -0
  214. data/app/views/stay/admin/amenity_categories/edit.html.erb +14 -0
  215. data/app/views/stay/admin/amenity_categories/index.html.erb +53 -0
  216. data/app/views/stay/admin/amenity_categories/new.html.erb +14 -0
  217. data/app/views/stay/admin/amenity_categories/show.html.erb +18 -0
  218. data/app/views/stay/admin/bed_types/_form.html.erb +29 -0
  219. data/app/views/stay/admin/bed_types/edit.html.erb +14 -0
  220. data/app/views/stay/admin/bed_types/index.html.erb +56 -0
  221. data/app/views/stay/admin/bed_types/new.html.erb +14 -0
  222. data/app/views/stay/admin/bed_types/show.html.erb +0 -0
  223. data/app/views/stay/admin/bookings/_booking_invoice.html.erb +37 -0
  224. data/app/views/stay/admin/bookings/_booking_summary.html.erb +61 -0
  225. data/app/views/stay/admin/bookings/_form.html.erb +59 -0
  226. data/app/views/stay/admin/bookings/edit.html.erb +14 -0
  227. data/app/views/stay/admin/bookings/index.html.erb +74 -0
  228. data/app/views/stay/admin/bookings/new.html.erb +14 -0
  229. data/app/views/stay/admin/bookings/show.html.erb +80 -0
  230. data/app/views/stay/admin/cancellation_policies/_form.html.erb +38 -0
  231. data/app/views/stay/admin/cancellation_policies/edit.html.erb +14 -0
  232. data/app/views/stay/admin/cancellation_policies/index.html.erb +58 -0
  233. data/app/views/stay/admin/cancellation_policies/new.html.erb +14 -0
  234. data/app/views/stay/admin/cancellation_policies/show.html.erb +0 -0
  235. data/app/views/stay/admin/chats/_form.html.erb +31 -0
  236. data/app/views/stay/admin/chats/edit.html.erb +5 -0
  237. data/app/views/stay/admin/chats/index.html.erb +58 -0
  238. data/app/views/stay/admin/chats/new.html.erb +5 -0
  239. data/app/views/stay/admin/chats/show.html.erb +19 -0
  240. data/app/views/stay/admin/cities/_form.html.erb +30 -0
  241. data/app/views/stay/admin/cities/edit.html.erb +14 -0
  242. data/app/views/stay/admin/cities/index.html.erb +62 -0
  243. data/app/views/stay/admin/cities/new.html.erb +14 -0
  244. data/app/views/stay/admin/countries/_form.html.erb +64 -0
  245. data/app/views/stay/admin/countries/edit.html.erb +14 -0
  246. data/app/views/stay/admin/countries/index.html.erb +62 -0
  247. data/app/views/stay/admin/countries/new.html.erb +14 -0
  248. data/app/views/stay/admin/countries/show.html.erb +23 -0
  249. data/app/views/stay/admin/dashboard/index.html.erb +1 -0
  250. data/app/views/stay/admin/features/_form.html.erb +38 -0
  251. data/app/views/stay/admin/features/edit.html.erb +14 -0
  252. data/app/views/stay/admin/features/index.html.erb +58 -0
  253. data/app/views/stay/admin/features/new.html.erb +14 -0
  254. data/app/views/stay/admin/features/show.html.erb +19 -0
  255. data/app/views/stay/admin/house_rules/_form.html.erb +29 -0
  256. data/app/views/stay/admin/house_rules/edit.html.erb +14 -0
  257. data/app/views/stay/admin/house_rules/index.html.erb +54 -0
  258. data/app/views/stay/admin/house_rules/new.html.erb +14 -0
  259. data/app/views/stay/admin/house_rules/show.html.erb +18 -0
  260. data/app/views/stay/admin/mailer/confirmation_instructions.html.erb +5 -0
  261. data/app/views/stay/admin/mailer/email_changed.html.erb +7 -0
  262. data/app/views/stay/admin/mailer/password_change.html.erb +3 -0
  263. data/app/views/stay/admin/mailer/reset_password_instructions.html.erb +7 -0
  264. data/app/views/stay/admin/messages/_form.html.erb +36 -0
  265. data/app/views/stay/admin/messages/edit.html.erb +5 -0
  266. data/app/views/stay/admin/messages/index.html.erb +60 -0
  267. data/app/views/stay/admin/messages/new.html.erb +5 -0
  268. data/app/views/stay/admin/messages/show.html.erb +24 -0
  269. data/app/views/stay/admin/passwords/edit.html.erb +37 -0
  270. data/app/views/stay/admin/passwords/new.html.erb +28 -0
  271. data/app/views/stay/admin/payment_methods/_form.html.erb +22 -0
  272. data/app/views/stay/admin/payment_methods/edit.html.erb +14 -0
  273. data/app/views/stay/admin/payment_methods/index.html.erb +54 -0
  274. data/app/views/stay/admin/payment_methods/new.html.erb +14 -0
  275. data/app/views/stay/admin/payment_methods/show.html.erb +18 -0
  276. data/app/views/stay/admin/payments/_form.html.erb +36 -0
  277. data/app/views/stay/admin/payments/edit.html.erb +5 -0
  278. data/app/views/stay/admin/payments/index.html.erb +60 -0
  279. data/app/views/stay/admin/payments/new.html.erb +5 -0
  280. data/app/views/stay/admin/payments/show.html.erb +24 -0
  281. data/app/views/stay/admin/properties/_amenities.html.erb +38 -0
  282. data/app/views/stay/admin/properties/_calendar.html.erb +37 -0
  283. data/app/views/stay/admin/properties/_description.html.erb +126 -0
  284. data/app/views/stay/admin/properties/_details.html.erb +75 -0
  285. data/app/views/stay/admin/properties/_features.html.erb +39 -0
  286. data/app/views/stay/admin/properties/_form.html.erb +118 -0
  287. data/app/views/stay/admin/properties/_images.html.erb +48 -0
  288. data/app/views/stay/admin/properties/_location.html.erb +55 -0
  289. data/app/views/stay/admin/properties/_price.html.erb +88 -0
  290. data/app/views/stay/admin/properties/_sidebar.html.erb +47 -0
  291. data/app/views/stay/admin/properties/edit.html.erb +17 -0
  292. data/app/views/stay/admin/properties/index.html.erb +82 -0
  293. data/app/views/stay/admin/properties/new.html.erb +14 -0
  294. data/app/views/stay/admin/properties/show.html.erb +149 -0
  295. data/app/views/stay/admin/property_categories/_form.html.erb +29 -0
  296. data/app/views/stay/admin/property_categories/edit.html.erb +14 -0
  297. data/app/views/stay/admin/property_categories/index.html.erb +57 -0
  298. data/app/views/stay/admin/property_categories/new.html.erb +14 -0
  299. data/app/views/stay/admin/property_categories/show.html.erb +18 -0
  300. data/app/views/stay/admin/property_types/_form.html.erb +29 -0
  301. data/app/views/stay/admin/property_types/edit.html.erb +14 -0
  302. data/app/views/stay/admin/property_types/index.html.erb +56 -0
  303. data/app/views/stay/admin/property_types/new.html.erb +14 -0
  304. data/app/views/stay/admin/property_types/show.html.erb +18 -0
  305. data/app/views/stay/admin/registrations/edit.html.erb +43 -0
  306. data/app/views/stay/admin/registrations/new.html.erb +35 -0
  307. data/app/views/stay/admin/reviews/_form.html.erb +37 -0
  308. data/app/views/stay/admin/reviews/edit.html.erb +14 -0
  309. data/app/views/stay/admin/reviews/index.html.erb +58 -0
  310. data/app/views/stay/admin/reviews/new.html.erb +14 -0
  311. data/app/views/stay/admin/reviews/show.html.erb +20 -0
  312. data/app/views/stay/admin/roles/_form.html.erb +24 -0
  313. data/app/views/stay/admin/roles/edit.html.erb +14 -0
  314. data/app/views/stay/admin/roles/index.html.erb +55 -0
  315. data/app/views/stay/admin/roles/new.html.erb +14 -0
  316. data/app/views/stay/admin/roles/show.html.erb +18 -0
  317. data/app/views/stay/admin/room_types/_form.html.erb +37 -0
  318. data/app/views/stay/admin/room_types/edit.html.erb +14 -0
  319. data/app/views/stay/admin/room_types/index.html.erb +58 -0
  320. data/app/views/stay/admin/room_types/new.html.erb +14 -0
  321. data/app/views/stay/admin/room_types/show.html.erb +19 -0
  322. data/app/views/stay/admin/rooms/_form.html.erb +136 -0
  323. data/app/views/stay/admin/rooms/edit.html.erb +14 -0
  324. data/app/views/stay/admin/rooms/index.html.erb +69 -0
  325. data/app/views/stay/admin/rooms/new.html.erb +14 -0
  326. data/app/views/stay/admin/rooms/show.html.erb +25 -0
  327. data/app/views/stay/admin/sessions/new.html.erb +36 -0
  328. data/app/views/stay/admin/shared/_common-table.html.erb +334 -0
  329. data/app/views/stay/admin/shared/_error_messages.html.erb +15 -0
  330. data/app/views/stay/admin/shared/_header.html.erb +55 -0
  331. data/app/views/stay/admin/shared/_links.html.erb +15 -0
  332. data/app/views/stay/admin/shared/_sidebar.html.erb +154 -0
  333. data/app/views/stay/admin/shared/_store_switcher.html.erb +30 -0
  334. data/app/views/stay/admin/states/_form.html.erb +39 -0
  335. data/app/views/stay/admin/states/edit.html.erb +14 -0
  336. data/app/views/stay/admin/states/index.html.erb +61 -0
  337. data/app/views/stay/admin/states/new.html.erb +14 -0
  338. data/app/views/stay/admin/states/show.html.erb +0 -0
  339. data/app/views/stay/admin/stores/_form.html.erb +30 -0
  340. data/app/views/stay/admin/stores/_tabs.html.erb +17 -0
  341. data/app/views/stay/admin/stores/edit.html.erb +14 -0
  342. data/app/views/stay/admin/stores/form/_basic.html.erb +35 -0
  343. data/app/views/stay/admin/stores/form/_emails.html.erb +34 -0
  344. data/app/views/stay/admin/stores/form/_footer.html.erb +28 -0
  345. data/app/views/stay/admin/stores/form/_internationalization.html.erb +52 -0
  346. data/app/views/stay/admin/stores/form/_seo.html.erb +42 -0
  347. data/app/views/stay/admin/stores/form/_social.html.erb +34 -0
  348. data/app/views/stay/admin/stores/index.html.erb +66 -0
  349. data/app/views/stay/admin/stores/new.html.erb +14 -0
  350. data/app/views/stay/admin/stores/translations.html.erb +8 -0
  351. data/app/views/stay/admin/taxes/_form.html.erb +29 -0
  352. data/app/views/stay/admin/taxes/edit.html.erb +14 -0
  353. data/app/views/stay/admin/taxes/index.html.erb +56 -0
  354. data/app/views/stay/admin/taxes/new.html.erb +14 -0
  355. data/app/views/stay/admin/taxes/show.html.erb +18 -0
  356. data/app/views/stay/admin/users/_address.html.erb +57 -0
  357. data/app/views/stay/admin/users/_address_form.html.erb +29 -0
  358. data/app/views/stay/admin/users/_form.html.erb +73 -0
  359. data/app/views/stay/admin/users/_sidebar.html.erb +12 -0
  360. data/app/views/stay/admin/users/addresses.html.erb +17 -0
  361. data/app/views/stay/admin/users/edit.html.erb +17 -0
  362. data/app/views/stay/admin/users/index.html.erb +74 -0
  363. data/app/views/stay/admin/users/new.html.erb +14 -0
  364. data/app/views/stay/admin/users/show.html.erb +23 -0
  365. data/app/views/stay/bookings/new.html.erb +92 -0
  366. data/app/views/stay/payments/_payment.js.erb +127 -0
  367. data/app/views/stay/payments/new.html.erb +187 -0
  368. data/app/views/stay/properties/index.html.erb +56 -0
  369. data/app/views/stay/properties/show.html.erb +137 -0
  370. data/app/views/stay/shared/_navbar.html.erb +35 -0
  371. data/app/views/stay/user_mailer/new_host_signup.html.erb +12 -0
  372. data/app/views/stay/user_mailer/welcome_email.html.erb +9 -0
  373. data/app/views/stay/users/confirmations/new.html.erb +16 -0
  374. data/app/views/stay/users/mailer/confirmation_instructions.html.erb +5 -0
  375. data/app/views/stay/users/mailer/email_changed.html.erb +7 -0
  376. data/app/views/stay/users/mailer/password_change.html.erb +3 -0
  377. data/app/views/stay/users/mailer/reset_password_instructions.html.erb +7 -0
  378. data/app/views/stay/users/mailer/unlock_instructions.html.erb +7 -0
  379. data/app/views/stay/users/passwords/edit.html.erb +37 -0
  380. data/app/views/stay/users/passwords/new.html.erb +28 -0
  381. data/app/views/stay/users/registrations/edit.html.erb +43 -0
  382. data/app/views/stay/users/registrations/new.html.erb +42 -0
  383. data/app/views/stay/users/sessions/new.html.erb +43 -0
  384. data/app/views/stay/users/shared/_error_messages.html.erb +15 -0
  385. data/app/views/stay/users/shared/_links.html.erb +25 -0
  386. data/app/views/stay/users/unlocks/new.html.erb +16 -0
  387. data/config/initializers/devise.rb +358 -0
  388. data/config/initializers/friendly_id.rb +107 -0
  389. data/config/initializers/geocoder.rb +4 -0
  390. data/config/initializers/kaminari_config.rb +14 -0
  391. data/config/initializers/mobility.rb +17 -0
  392. data/config/initializers/stripe.rb +8 -0
  393. data/config/locales/devise.en.yml +65 -0
  394. data/config/locales/devise_api.en.yml +23 -0
  395. data/config/locales/en.yml +38 -0
  396. data/config/routes.rb +187 -0
  397. data/db/migrate/20240912073149_devise_create_stay_users.rb +50 -0
  398. data/db/migrate/20240912073248_create_devise_api_tables.rb +29 -0
  399. data/db/migrate/20240912092842_create_stay_roles.rb +9 -0
  400. data/db/migrate/20240912093003_create_stay_role_users.rb +10 -0
  401. data/db/migrate/20240912093151_create_stay_properties.rb +16 -0
  402. data/db/migrate/20240912093213_create_stay_rooms.rb +12 -0
  403. data/db/migrate/20240912093240_create_stay_bookings.rb +15 -0
  404. data/db/migrate/20240912093346_create_stay_payment_methods.rb +9 -0
  405. data/db/migrate/20240912093408_create_stay_payments.rb +12 -0
  406. data/db/migrate/20240912093603_create_stay_reviews.rb +11 -0
  407. data/db/migrate/20240912093644_create_stay_chats.rb +11 -0
  408. data/db/migrate/20240912093717_create_stay_messages.rb +12 -0
  409. data/db/migrate/20240912093759_create_stay_countries.rb +14 -0
  410. data/db/migrate/20240912093824_create_stay_states.rb +11 -0
  411. data/db/migrate/20240912093903_create_stay_cities.rb +10 -0
  412. data/db/migrate/20240912094149_create_stay_addresses.rb +19 -0
  413. data/db/migrate/20240916071141_create_active_storage_tables.rb +57 -0
  414. data/db/migrate/20240918080551_add_columns_to_stay_bookings.rb +12 -0
  415. data/db/migrate/20240918101502_add_columns_to_stay_payments.rb +16 -0
  416. data/db/migrate/20240918110958_create_stay_prices.rb +13 -0
  417. data/db/migrate/20240918112045_add_columns_to_stay_rooms.rb +5 -0
  418. data/db/migrate/20240918114609_add_payment_intent_in_bookings.rb +6 -0
  419. data/db/migrate/20240919045205_add_user_to_stay_addresses.rb +5 -0
  420. data/db/migrate/20240919063400_create_stay_room_types.rb +10 -0
  421. data/db/migrate/20240919070423_rename_room_type_to_room_type_id_in_stay_rooms.rb +5 -0
  422. data/db/migrate/20240919071642_rename_status_to_state_in_stay_payments.rb +5 -0
  423. data/db/migrate/20240919100508_remove_room_id_from_stay_properties.rb +5 -0
  424. data/db/migrate/20240919111801_create_stay_line_items.rb +16 -0
  425. data/db/migrate/20240919124704_remove_room_id_from_stay_bookings.rb +5 -0
  426. data/db/migrate/20240924053658_add_is_master_in_stay_rooms.rb +5 -0
  427. data/db/migrate/20240925063733_add_zipcode_required_in_countries.rb +5 -0
  428. data/db/migrate/20240926055951_remove_city_reference_from_stay_addresses.rb +5 -0
  429. data/db/migrate/20240927055935_change_price_per_night_to_decimal_in_stay_rooms.rb +5 -0
  430. data/db/migrate/20240927063023_add_first_name_to_stay_addresses.rb +8 -0
  431. data/db/migrate/20240927070538_change_description_to_text_in_stay_properties.rb +6 -0
  432. data/db/migrate/20240927111110_create_stay_stores.rb +33 -0
  433. data/db/migrate/20240930095921_create_stay_cancellation_policies.rb +9 -0
  434. data/db/migrate/20240930100157_add_cancellation_id_to_stay_properties.rb +5 -0
  435. data/db/migrate/20240930152331_create_stay_store_translations.rb +22 -0
  436. data/db/migrate/20240930162337_create_stay_store_properties.rb +10 -0
  437. data/db/migrate/20241001101816_create_stay_property_categories.rb +8 -0
  438. data/db/migrate/20241001102646_add_property_category_id_to_property.rb +5 -0
  439. data/db/migrate/20241001103758_create_stay_property_types.rb +9 -0
  440. data/db/migrate/20241001111306_add_store_id_to_stay_bookings.rb +5 -0
  441. data/db/migrate/20241001160330_add_deleted_at_to_stay_store_translations.rb +5 -0
  442. data/db/migrate/20241004061647_add_field_to_stay_properties.rb +20 -0
  443. data/db/migrate/20241004062057_create_stay_bed_types.rb +9 -0
  444. data/db/migrate/20241004062251_add_details_to_stay_rooms.rb +9 -0
  445. data/db/migrate/20241004070456_add_property_type_id_to_stay_property_categories.rb +6 -0
  446. data/db/migrate/20241004105821_create_stay_amenity_categories.rb +8 -0
  447. data/db/migrate/20241004112600_create_stay_amenities.rb +9 -0
  448. data/db/migrate/20241004115207_create_stay_house_rules.rb +8 -0
  449. data/db/migrate/20241004115317_create_stay_additional_rules.rb +9 -0
  450. data/db/migrate/20241004115608_create_stay_property_amenities.rb +9 -0
  451. data/db/migrate/20241004115615_create_stay_room_amenities.rb +9 -0
  452. data/db/migrate/20241007051646_add_preferences_to_stay_users.rb +5 -0
  453. data/db/migrate/20241007165530_create_stay_creates.rb +10 -0
  454. data/db/migrate/20241008111346_add_deleted_at_to_stay_users.rb +7 -0
  455. data/db/migrate/20241008151958_add_price_per_night_in_stay_properties.rb +5 -0
  456. data/db/migrate/20241010071855_add_zipcode_to_stay_property.rb +8 -0
  457. data/db/migrate/20241014085441_add_amenity_type_in_amenities.rb +5 -0
  458. data/db/migrate/20241015055940_create_stay_features.rb +10 -0
  459. data/db/migrate/20241015060804_create_stay_property_features.rb +9 -0
  460. data/db/migrate/20241015060854_create_stay_room_features.rb +9 -0
  461. data/db/migrate/20241016055948_create_stay_tax.rb +9 -0
  462. data/db/migrate/20241016060354_create_stay_property_tax.rb +11 -0
  463. data/db/migrate/20241016091120_remove_column_from_stay_properties_categories.rb +6 -0
  464. data/db/migrate/20241016091829_add_column_to_stay_property.rb +5 -0
  465. data/db/migrate/20241016112707_add_country_to_stay_properties.rb +6 -0
  466. data/db/migrate/20241016153847_add_state_to_properties.rb +7 -0
  467. data/db/migrate/20241016170528_up_date_price_column_in_stay_property.rb +5 -0
  468. data/db/migrate/20241017031520_add_new_field_to_stay_properties.rb +8 -0
  469. data/db/migrate/20241017051450_add_column_to_stay_chat.rb +7 -0
  470. data/db/migrate/20241018090158_create_stay_stay_credit_cards.rb +16 -0
  471. data/db/migrate/20241021090444_create_stay_stay_user_paypals.rb +9 -0
  472. data/db/migrate/20241024065949_add_stay_property_to_stay_b0okings.rb +5 -0
  473. data/db/migrate/20241027062126_add_events_to_stay_messages.rb +8 -0
  474. data/db/migrate/20241028105007_create_stay_invoices.rb +15 -0
  475. data/db/migrate/20241028105323_create_stay_expenses.rb +10 -0
  476. data/db/migrate/20241028105331_create_stay_discounts.rb +10 -0
  477. data/db/migrate/20241101044618_create_stay_booking_queries.rb +17 -0
  478. data/db/migrate/20241101093057_add_read_at_to_stay_messages.rb +5 -0
  479. data/db/migrate/20241113061248_modify_cancellation_policy_on_properties.rb +7 -0
  480. data/db/migrate/20241118064033_rename_columns_in_stay_properties.rb +7 -0
  481. data/db/migrate/20241127060541_add_new_fields_to_property.rb +11 -0
  482. data/db/migrate/20241128111832_add_name_to_stay_rooms.rb +5 -0
  483. data/db/migrate/20241129063922_change_amenity_category_null_on_stay_amenities.rb +5 -0
  484. data/db/migrate/20241205092935_add_slug_to_stay_properties.rb +6 -0
  485. data/db/migrate/20241205092943_create_friendly_id_slugs.rb +21 -0
  486. data/db/migrate/20241217044817_add_deleted_atto_stay_property.rb +6 -0
  487. data/db/migrate/20241230064432_modify_property_category_on_properties.rb +7 -0
  488. data/db/seeds.rb +1 -0
  489. data/lib/stay/controller_helpers/currency.rb +54 -0
  490. data/lib/stay/controller_helpers/store.rb +37 -0
  491. data/lib/stay/engine.rb +16 -0
  492. data/lib/stay/money.rb +77 -0
  493. data/lib/stay/version.rb +3 -0
  494. data/lib/stay.rb +16 -0
  495. data/lib/tasks/stay_tasks.rake +4 -0
  496. metadata +967 -0
@@ -0,0 +1,54 @@
1
+ # app/controllers/Stay/admin/role_controller.rb
2
+ module Stay
3
+ module Admin
4
+ class RolesController < Stay::Admin::BaseController
5
+ before_action :set_role, only: %i[show edit update destroy]
6
+
7
+ def index
8
+ @roles = Stay::Role.page(params[:page])
9
+ end
10
+
11
+ def show
12
+ end
13
+
14
+ def new
15
+ @role = Stay::Role.new
16
+ end
17
+
18
+ def create
19
+ @role = Stay::Role.new(role_params)
20
+ if @role.save
21
+ redirect_to admin_role_path(@role), notice: 'Role was successfully created.'
22
+ else
23
+ render :new
24
+ end
25
+ end
26
+
27
+ def edit
28
+ end
29
+
30
+ def update
31
+ if @role.update(role_params)
32
+ redirect_to admin_role_path(@role), notice: 'Role was successfully updated.'
33
+ else
34
+ render :edit
35
+ end
36
+ end
37
+
38
+ def destroy
39
+ @role.destroy
40
+ redirect_to admin_roles_path, notice: 'Role was successfully destroyed.'
41
+ end
42
+
43
+ private
44
+
45
+ def set_role
46
+ @role = Stay::Role.find(params[:id])
47
+ end
48
+
49
+ def role_params
50
+ params.require(:role).permit(:name)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,43 @@
1
+ module Stay
2
+ class Admin::RoomAmenitiesController < Stay::Admin::BaseController
3
+ before_action :set_property_and_room, only: [:index, :destroy, :new, :create]
4
+ before_action :set_room_amenity, only: [:destroy]
5
+
6
+ def index
7
+ @room_amenities = @room.room_amenities
8
+ end
9
+
10
+ def new
11
+ @room_amenity = Stay::RoomAmenity.new
12
+ end
13
+
14
+ def create
15
+ @room_amenity = Stay::RoomAmenity.new(room_amenity_params.merge(stay_room_id: params[:room_id]))
16
+ if @room_amenity.save
17
+ redirect_to admin_property_room_room_amenities_path(@property, @room), notice: 'Room Amenity was successfully added.'
18
+ else
19
+ render :new
20
+ end
21
+ end
22
+
23
+ def destroy
24
+ @room_amenity.destroy
25
+ redirect_to admin_property_room_room_amenities_path, notice: 'Room Amenity was successfully destroyed.'
26
+ end
27
+
28
+ private
29
+
30
+ def set_property_and_room
31
+ @property = Stay::Property.find(params[:property_id]) if params[:property_id]
32
+ @room = Stay::Room.find(params[:room_id]) if params[:room_id]
33
+ end
34
+
35
+ def set_room_amenity
36
+ @room_amenity = @room.room_amenities.find(params[:id])
37
+ end
38
+
39
+ def room_amenity_params
40
+ params.require(:room_amenity).permit(:stay_amenity_id, :description, :position, :active, :extra_charge)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,58 @@
1
+ module Stay
2
+ class Admin::RoomTypesController < Stay::Admin::BaseController
3
+ before_action :set_room_type, only: %i[show edit update destroy]
4
+
5
+ # GET /admin/room_types
6
+ def index
7
+ @room_types = Stay::RoomType.page(params[:page])
8
+ end
9
+
10
+ # GET /admin/room_types/new
11
+ def new
12
+ @room_type = Stay::RoomType.new
13
+ end
14
+
15
+ # POST /admin/room_types
16
+ def create
17
+ @room_type = Stay::RoomType.new(room_type_params)
18
+ if @room_type.save
19
+ redirect_to admin_room_types_path, notice: 'Room type was successfully created.'
20
+ else
21
+ render :new
22
+ end
23
+ end
24
+
25
+ # GET /admin/room_types/:id
26
+ def show
27
+ end
28
+
29
+ # GET /admin/room_types/:id/edit
30
+ def edit
31
+ end
32
+
33
+ # PATCH/PUT /admin/room_types/:id
34
+ def update
35
+ if @room_type.update(room_type_params)
36
+ redirect_to admin_room_types_path, notice: 'Room type was successfully updated.'
37
+ else
38
+ render :edit
39
+ end
40
+ end
41
+
42
+ # DELETE /admin/room_types/:id
43
+ def destroy
44
+ @room_type.destroy
45
+ redirect_to admin_room_types_path, notice: 'Room type was successfully deleted.'
46
+ end
47
+
48
+ private
49
+
50
+ def set_room_type
51
+ @room_type = Stay::RoomType.find(params[:id])
52
+ end
53
+
54
+ def room_type_params
55
+ params.require(:room_type).permit(:name, :description)
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,62 @@
1
+ module Stay
2
+ module Admin
3
+ class RoomsController < Stay::Admin::BaseController
4
+ before_action :set_property
5
+ before_action :set_room, only: %i[show edit update destroy]
6
+
7
+ def index
8
+ @rooms = @property.rooms
9
+ end
10
+
11
+ def show
12
+ end
13
+
14
+ def new
15
+ @room = @property.rooms.new
16
+ end
17
+
18
+ def create
19
+ @room = @property.rooms.build(room_params)
20
+ if @room.save
21
+ redirect_to admin_property_rooms_path(@property), notice: "Room was successfully created."
22
+ else
23
+ render :new
24
+ end
25
+ end
26
+
27
+ def edit
28
+ end
29
+
30
+ def update
31
+ if @room.update(room_params)
32
+ redirect_to admin_property_room_path(@property), notice: "Room was successfully updated."
33
+ else
34
+ render :edit
35
+ end
36
+ end
37
+
38
+ def destroy
39
+ @room.destroy
40
+ redirect_to admin_property_rooms_path(@property), notice: "Room was successfully destroyed."
41
+ end
42
+
43
+ private
44
+
45
+ def set_property
46
+ @property = Stay::Property.friendly.find(params[:property_id])
47
+ end
48
+
49
+ def set_room
50
+ @room = @property.rooms.find(params[:id])
51
+ end
52
+
53
+ def room_params
54
+ params.require(:room).permit(:property_id, :max_guests, :price_per_month, :room_type_id, :booking_start, :booking_end, :description,
55
+ :size, :bed_type_id, :status, amenity_ids: [], feature_ids: [], room_images: [],
56
+ room_amenities_attributes: [ :id, :amenity_id, :_destroy ],
57
+ room_features_attributes: [ :id, :name, :feature_id, :_destroy ],
58
+ )
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,29 @@
1
+ class Stay::Admin::SessionsController < Devise::SessionsController
2
+ layout "stay/admin"
3
+
4
+ def create
5
+ user = Stay::User.find_by(email: params.dig(:user, :email))
6
+ if user && user.stay_admin?
7
+ super
8
+ else
9
+ flash[:alert] = user ? "Access Denied, User must have admin role" : "User not found"
10
+ redirect_to admin_login_path
11
+ end
12
+ end
13
+
14
+ protected
15
+
16
+ def respond_to_on_destroy
17
+ respond_to do |format|
18
+ format.all { head :no_content }
19
+ format.any(*navigational_formats) { redirect_to after_sign_out_redirect(resource_name) }
20
+ end
21
+ end
22
+
23
+ def after_sign_out_redirect(resource_or_scope)
24
+ scope = Devise::Mapping.find_scope!(resource_or_scope)
25
+ router_name = Devise.mappings[scope].router_name
26
+ context = router_name ? send(router_name) : self
27
+ context.respond_to?(:admin_login_path) ? context.admin_login_path : "/"
28
+ end
29
+ end
@@ -0,0 +1,68 @@
1
+ class Stay::Admin::StatesController < Stay::Admin::BaseController
2
+ before_action :set_country
3
+ before_action :set_state, only: [:show, :edit, :update, :destroy]
4
+
5
+ # GET /admin/countries/:country_id/states
6
+ def index
7
+ @states = @country.states.page(params[:page])
8
+ respond_to do |format|
9
+ format.html
10
+ format.json { render json: @states }
11
+ end
12
+ end
13
+
14
+ # GET /admin/countries/:country_id/states/:id
15
+ def show
16
+ end
17
+
18
+ # GET /admin/countries/:country_id/states/new
19
+ def new
20
+ @state = @country.states.build
21
+ end
22
+
23
+ # POST /admin/countries/:country_id/states
24
+ def create
25
+ @state = @country.states.build(state_params)
26
+ if @state.save
27
+ redirect_to admin_country_states_path(@country), notice: 'State was successfully created.'
28
+ else
29
+ render :new
30
+ end
31
+ end
32
+
33
+ # GET /admin/countries/:country_id/states/:id/edit
34
+ def edit
35
+ end
36
+
37
+ # PATCH/PUT /admin/countries/:country_id/states/:id
38
+ def update
39
+ if @state.update(state_params)
40
+ redirect_to admin_country_states_path(@country), notice: 'State was successfully updated.'
41
+ else
42
+ render :edit
43
+ end
44
+ end
45
+
46
+ # DELETE /admin/countries/:country_id/states/:id
47
+ def destroy
48
+ @state.destroy
49
+ redirect_to admin_country_states_path(@country), notice: 'State was successfully deleted.'
50
+ end
51
+
52
+ private
53
+
54
+ # Set the country based on country_id from the URL
55
+ def set_country
56
+ @country = Stay::Country.find(params[:country_id])
57
+ end
58
+
59
+ # Set the state for show, edit, update, and destroy actions
60
+ def set_state
61
+ @state = @country.states.find(params[:id])
62
+ end
63
+
64
+ # Strong parameters to allow specific attributes for states
65
+ def state_params
66
+ params.require(:state).permit(:name, :abbr, :country_id)
67
+ end
68
+ end
@@ -0,0 +1,132 @@
1
+ # app/controllers/stay/admin/stores_controller.rb
2
+ module Stay
3
+ module Admin
4
+ class StoresController < Stay::Admin::BaseController
5
+ helper Stay::LocaleHelper
6
+ before_action :load_store, only: [:new, :edit, :update]
7
+ before_action :set_default_currency, only: :new
8
+ before_action :set_default_locale, only: :new
9
+ before_action :normalize_supported_currencies, only: [:create, :update]
10
+ before_action :normalize_supported_locales, only: [:create, :update]
11
+ before_action :set_default_country_id, only: :new
12
+ before_action :load_all_countries, only: [:new, :edit, :update, :create]
13
+ # before_action :load_all_zones, only: [:new, :edit, :update, :create]
14
+ before_action :set_store, only: [:show, :edit, :update, :destroy, :set_default]
15
+
16
+ # GET /admin/stores
17
+ def index
18
+ @stores = Stay::Store.all
19
+ end
20
+
21
+ # GET /admin/stores/new
22
+ def new
23
+ @store = Stay::Store.new
24
+ end
25
+
26
+ # POST /admin/stores
27
+ def create
28
+ @store = Stay::Store.new(store_params)
29
+
30
+ if @store.save
31
+ flash[:success] = "Store created successfully"
32
+ redirect_to admin_url, allow_other_host: true
33
+ else
34
+ flash.now[:error] = "Unable to create store."
35
+ render :new
36
+ end
37
+ end
38
+
39
+ # GET /admin/stores/:id/edit
40
+ def edit
41
+ end
42
+
43
+ def show
44
+ end
45
+
46
+ # PATCH/PUT /admin/stores/:id
47
+ def update
48
+ if @store.update(store_params)
49
+ flash[:success] = "Store Update Successfully"
50
+ redirect_to admin_stores_path
51
+ else
52
+ flash.now[:error] = "Unable to update store."
53
+ render :edit
54
+ end
55
+ end
56
+
57
+ # DELETE /admin/stores/:id
58
+ def destroy
59
+ if @store.destroy
60
+ flash[:success] = "Store deleted successfully."
61
+ else
62
+ flash[:error] = "Failed to delete the store. Please try again."
63
+ end
64
+ redirect_to admin_stores_path
65
+ end
66
+
67
+ def set_default
68
+ Stay::Store.update_all(default: false)
69
+ if @store.update(default: true)
70
+ redirect_to admin_stores_path, notice: 'Store successfully set as default.'
71
+ else
72
+ redirect_to admin_stores_path, alert: 'Failed to set store as default.'
73
+ end
74
+ end
75
+
76
+ private
77
+
78
+ def set_store
79
+ @store = Stay::Store.find(params[:id])
80
+ end
81
+
82
+ def store_params
83
+ params.require(:store).permit(:name, :url, :seo_title, :code, :meta_keywords,
84
+ :meta_description, :default_currency, :mail_from_address,
85
+ :customer_support_email, :facebook, :twitter, :instagram,
86
+ :description, :address, :contact_phone, :supported_locales,
87
+ :default_locale, :default_country_id, :supported_currencies,
88
+ :new_order_notifications_email, :checkout_zone_id, :seo_robots,
89
+ :digital_asset_authorized_clicks, :digital_asset_authorized_days,
90
+ :limit_digital_download_count, :limit_digital_download_days, :digital_asset_link_expire_time,
91
+ { mailer_logo_attributes: {}, favicon_image_attributes: {}, logo_attributes: {} })
92
+ end
93
+
94
+ def load_store
95
+ @store = stores_scope.find_by(id: params[:id]) || stores_scope.new
96
+ end
97
+
98
+ def load_all_countries
99
+ @countries = Stay::Country.pluck(:name, :id)
100
+ end
101
+
102
+ def set_default_currency
103
+ @store.default_currency = Stay::Store.default.default_currency
104
+ end
105
+
106
+ def set_default_locale
107
+ @store.default_locale = I18n.locale
108
+ end
109
+
110
+ def normalize_supported_currencies
111
+ if params[:store][:supported_currencies]&.is_a?(Array)
112
+ params[:store][:supported_currencies] = params[:store][:supported_currencies].compact.uniq.reject(&:blank?).join(',')
113
+ end
114
+ end
115
+
116
+ def normalize_supported_locales
117
+ if params[:store][:supported_locales]&.is_a?(Array)
118
+ params[:store][:supported_locales] = params[:store][:supported_locales].compact.uniq.reject(&:blank?).join(',')
119
+ end
120
+ end
121
+
122
+ def set_default_country_id
123
+ @store.default_country_id ||= Stay::Store.default.default_country_id || Stay::Country.find_by(iso: "US")&.id
124
+ end
125
+
126
+ def save_translation_values
127
+ @object = @store
128
+ super
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,51 @@
1
+ module Stay
2
+ class Admin::TaxesController < Stay::Admin::BaseController
3
+ before_action :set_tax, only: %i[show edit update destroy]
4
+
5
+ def index
6
+ @taxes = Stay::Tax.page(params[:page])
7
+ end
8
+
9
+ def new
10
+ @tax = Stay::Tax.new
11
+ end
12
+
13
+ def create
14
+ @tax = Stay::Tax.new(tax_params)
15
+ if @tax.save
16
+ redirect_to admin_taxes_path, notice: 'Tax was successfully created.'
17
+ else
18
+ render :new
19
+ end
20
+ end
21
+
22
+ def show
23
+ end
24
+
25
+ def edit
26
+ end
27
+
28
+ def update
29
+ if @tax.update(tax_params)
30
+ redirect_to admin_taxes_path, notice: 'Tax was successfully updated.'
31
+ else
32
+ render :edit
33
+ end
34
+ end
35
+
36
+ def destroy
37
+ @tax.destroy
38
+ redirect_to admin_taxes_path, notice: 'Tax was successfully deleted.'
39
+ end
40
+
41
+ private
42
+
43
+ def set_tax
44
+ @tax = Stay::Tax.find(params[:id])
45
+ end
46
+
47
+ def tax_params
48
+ params.require(:tax).permit(:name)
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,85 @@
1
+ module Stay
2
+ module Admin
3
+ class UsersController < Stay::Admin::BaseController
4
+ before_action :set_user, only: [ :show, :edit, :update, :destroy, :addresses ]
5
+
6
+ # GET /Stay/admin/users
7
+ def index
8
+ @q = Stay::User.ransack(params[:q])
9
+ @users = @q.result.order(created_at: :desc).page(params[:page]).per(30)
10
+ end
11
+
12
+ # GET /Stay/admin/users/1
13
+ def show
14
+ end
15
+
16
+ # GET /Stay/admin/users/new
17
+ def new
18
+ @user = Stay::User.new
19
+ end
20
+
21
+ # GET /Stay/admin/users/1/edit
22
+ def edit
23
+ end
24
+
25
+ # POST /Stay/admin/users
26
+ # POST /Stay/admin/users.json
27
+ def create
28
+ @user = Stay::User.new(user_params)
29
+ if @user.save
30
+ redirect_to admin_user_path(@user), notice: "User was successfully created."
31
+ else
32
+ render :new
33
+ end
34
+ end
35
+
36
+ # PATCH/PUT /Stay/admin/users/1
37
+ # PATCH/PUT /Stay/admin/users/1.json
38
+ def update
39
+ if params[:user][:password].blank? && params[:user][:password_confirmation].blank?
40
+ params[:user].delete(:password)
41
+ params[:user].delete(:password_confirmation)
42
+ end
43
+
44
+ @user.updating_password = params[:user][:password].present?
45
+
46
+ if @user.update(user_params)
47
+ redirect_to admin_user_path(@user), notice: "User was successfully updated."
48
+ else
49
+ render :edit
50
+ end
51
+ end
52
+
53
+ # DELETE /Stay/admin/users/1
54
+ # DELETE /Stay/admin/users/1.json
55
+ def destroy
56
+ @user.destroy
57
+ redirect_to admin_users_url, notice: "User was successfully destroyed."
58
+ end
59
+
60
+ def addresses
61
+ if request.put?
62
+ params[:user][:addresses_attributes][:user_id] = @user.id if params[:user][:addresses_attributes].present?
63
+ if @user.update(user_params)
64
+ flash[:success] = "Address updated successfully"
65
+ redirect_to admin_user_path(@user)
66
+ else
67
+ flash.now[:error] = "Failed to update address"
68
+ render :addresses, status: :unprocessable_entity
69
+ end
70
+ end
71
+ end
72
+
73
+ private
74
+ # Use callbacks to share common setup or constraints between actions.
75
+ def set_user
76
+ @user = Stay::User.find(params[:id])
77
+ end
78
+
79
+ def user_params
80
+ params.require(:user).permit(:first_name, :last_name, :email, :phone, :date_of_birth, :gender, :password, :password_confirmation, :profile_image, stay_role_ids: [], addresses_attributes: [ :id, :address1, :address2, :city, :state, :country,
81
+ :zipcode, :longitude, :latitude, :state_id, :country_id, :firstname, :lastname, :phone, :alternative_phone ])
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,13 @@
1
+ class Stay::Api::V1::AmenitiesController < ApplicationController
2
+ before_action :authenticate_devise_api_token!
3
+
4
+ def property
5
+ amenities = Stay::Amenity.where(amenity_type: "property").all
6
+ render json: { data: ActiveModelSerializers::SerializableResource.new(amenities, each_serializer: AmenitySerializer) }
7
+ end
8
+
9
+ def room
10
+ amenities = Stay::Amenity.where(amenity_type: "room").all
11
+ render json: { data: ActiveModelSerializers::SerializableResource.new(amenities, each_serializer: AmenitySerializer) }
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ class Stay::Api::V1::AmenityCategoriesController < ApplicationController
2
+ before_action :authenticate_devise_api_token!
3
+
4
+ def property
5
+ amenities = Stay::AmenityCategory.all
6
+ render json: { data:ActiveModelSerializers::SerializableResource.new(amenities, each_serializer: AmenityCategorySerializer, type:"property") }
7
+ end
8
+
9
+ def room
10
+ amenities = Stay::AmenityCategory.all
11
+ render json: { data:ActiveModelSerializers::SerializableResource.new(amenities, each_serializer: AmenityCategorySerializer, type:"room") }
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ class Stay::Api::V1::BedTypesController < Stay::BaseApiController
2
+ before_action :authenticate_devise_api_token!
3
+
4
+ def index
5
+ @bed_type = Stay::BedType.all
6
+ return render json: { error: "no data found", success: false }, status: :unprocessable_entity unless @bed_type.any?
7
+ render json: { message: "bed type found", data: ActiveModelSerializers::SerializableResource.new(@bed_type, each_serializer: BedTypeSerializer), success: true }, status: :ok
8
+ end
9
+ end