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,13 @@
1
+ class ChatChannel < ApplicationCable::Channel
2
+ def subscribed
3
+ user = params[:user]
4
+ stream_from "ChatChannel"
5
+ ActionCable.server.broadcast("chat_channel", { message: "Hello, world!", user: user })
6
+ end
7
+
8
+ def received(data)
9
+ end
10
+
11
+ def unsubscribed
12
+ end
13
+ end
@@ -0,0 +1,86 @@
1
+ module Stay
2
+ module BookingValidations
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ before_action :validate_booking_params, only: :create
7
+ end
8
+
9
+ private
10
+
11
+ def validate_booking_params
12
+ property = Stay::Property.friendly.find_by(slug: booking_params[:property_id])
13
+
14
+ return render_error("Property not found.", :not_found) unless property
15
+
16
+ return render_error("Property Host not active.", :not_found) unless property.user
17
+
18
+ return render_error("You cannot create a booking for your own property.", :unprocessable_entity) if property.user == current_devise_api_user
19
+
20
+ return render_error("Hosts cannot create bookings for properties.", :unprocessable_entity) if current_devise_api_user.stay_host?
21
+
22
+ if booking_params[:check_in_date].nil? || booking_params[:check_out_date].nil?
23
+ return render_error("Please select both check-in and check-out dates.", :unprocessable_entity)
24
+ end
25
+
26
+ return render_error("Please select the guest count.", :unprocessable_entity) if booking_params[:number_of_guests].nil?
27
+
28
+ if property.shared_property && booking_params[:line_items_attributes].nil?
29
+ return render_error("Please select a room for the shared property.", :unprocessable_entity)
30
+ end
31
+
32
+ validate_shared_property_room(property) if property.shared_property
33
+ validate_guest_limit(property)
34
+ validate_property_availability(property)
35
+ end
36
+
37
+ def validate_shared_property_room(property)
38
+ line_item = booking_params[:line_items_attributes][0]
39
+ return unless line_item
40
+
41
+ room_id = line_item[:room_id]
42
+ check_in_date = booking_params[:check_in_date].to_date
43
+ check_out_date = booking_params[:check_out_date].to_date
44
+ room = Stay::Room.find_by(id: room_id)
45
+
46
+ if room.nil?
47
+ render_error("Room not found.", :not_found)
48
+ elsif room.property_id != property.id
49
+ render_error("Room not found in the property.", :not_found)
50
+ elsif room.status == "inactive"
51
+ render_error("Room is inactive.", :unprocessable_entity)
52
+ elsif !property.allow_extra_guest && booking_params[:number_of_guests] > room.max_guests
53
+ render_error("No extra guests allowed. Maximum guest limit for this room is #{room.max_guests || 1}.", :unprocessable_entity)
54
+ elsif check_in_date < room.booking_start.to_date
55
+ render_error("Room not available on your check-in date.", :unprocessable_entity)
56
+ elsif check_out_date > room.booking_end.to_date
57
+ render_error("Room not available on your check-out date.", :unprocessable_entity)
58
+ end
59
+ end
60
+
61
+ def validate_guest_limit(property)
62
+ if !property.shared_property && !property.allow_extra_guest && booking_params[:number_of_guests] > property.guest_number
63
+ render_error("No extra guests allowed. Maximum guest limit for this property is #{property.guest_number || 1}.", :unprocessable_entity)
64
+ end
65
+ end
66
+
67
+ def validate_property_availability(property)
68
+ check_in_date = booking_params[:check_in_date].to_date
69
+ check_out_date = booking_params[:check_out_date].to_date
70
+
71
+ if property.unlimited_availability
72
+ if check_in_date < property.availability_start.to_date
73
+ render_error("Property not available on your check-in date.", :unprocessable_entity)
74
+ elsif check_in_date > check_out_date
75
+ render_error("Check-out date cannot be earlier than check-in date.", :unprocessable_entity)
76
+ end
77
+ else
78
+ if check_in_date < property.availability_start.to_date
79
+ render_error("Property not available on your check-in date.", :unprocessable_entity)
80
+ elsif check_out_date > property.availability_end.to_date
81
+ render_error("Property not available on your check-out date.", :unprocessable_entity)
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,72 @@
1
+ module Stay
2
+ module StripeConcern
3
+ extend ActiveSupport::Concern
4
+ def user
5
+ current_devise_api_user || current_user
6
+ end
7
+
8
+ def create_payment_method
9
+ Stripe::PaymentMethod.create({
10
+ type: params[:payment_method_type],
11
+ card: {
12
+ number: params[:number],
13
+ exp_month: params[:exp_month],
14
+ exp_year: params[:exp_year],
15
+ cvc: params[:cvc],
16
+ },
17
+ })
18
+ end
19
+ def create_customer
20
+ Stripe::Customer.create({
21
+ email: user.email,
22
+ name: "#{user.first_name} #{user.last_name}",
23
+ address: {
24
+ city: user.addresses.last&.city,
25
+ state: user.addresses.last&.state.name,
26
+ country: user.addresses.last&.country.name,
27
+ line1: user.addresses.last&.address1,
28
+ line2: user.addresses.last&.address2,
29
+ postal_code: user.addresses.last&.zipcode
30
+ },
31
+ metadata: { order_id: user.id }
32
+ })
33
+ end
34
+
35
+ def create_or_retrieve_customer
36
+ customers = Stripe::Customer.list(email: user.email).data
37
+ if customers.empty?
38
+ create_customer
39
+ else
40
+ customers.first
41
+ end
42
+ end
43
+
44
+ def create_payment_intent
45
+ Stripe::PaymentIntent.create(
46
+ amount: @booking.total.to_i* 100,
47
+ description: @booking.user.email,
48
+ currency: params[:currency] || 'INR',
49
+ payment_method: params[:payment_method_id],
50
+ automatic_payment_methods: { enabled: true },
51
+ receipt_email: user.email,
52
+ customer: @customer,
53
+ confirm: params[:confirm],
54
+ return_url: params[:redirect_url]
55
+ )
56
+ end
57
+
58
+ def get_payment_intent
59
+ Stripe::PaymentIntent.retrieve(@booking.payment_intent_id)
60
+ end
61
+
62
+ def confirm_payment_intent
63
+ Stripe::PaymentIntent.confirm(
64
+ params[:payment_intent_id],
65
+ {
66
+ payment_method: params[:payment_method_id],
67
+ return_url: params[redirect_url],
68
+ })
69
+ end
70
+
71
+ end
72
+ end
@@ -0,0 +1,76 @@
1
+ module Stay
2
+ module Admin
3
+ class AddressesController < Stay::Admin::BaseController
4
+ before_action :set_address, only: %i[show edit update destroy]
5
+
6
+ # GET /Stay/admin/addresses
7
+ # GET /Stay/admin/addresses.json
8
+ def index
9
+ @addresses = Stay::Address.page(params[:page])
10
+ end
11
+
12
+ # GET /Stay/admin/addresses/1
13
+ # GET /Stay/admin/addresses/1.json
14
+ def show
15
+ end
16
+
17
+ # GET /Stay/admin/addresses/new
18
+ def new
19
+ @address = Stay::Address.new
20
+ end
21
+
22
+ # GET /Stay/admin/addresses/1/edit
23
+ def edit
24
+ end
25
+
26
+ # POST /Stay/admin/addresses
27
+ # POST /Stay/admin/addresses.json
28
+ def create
29
+ @address = Stay::Address.new(address_params)
30
+
31
+ respond_to do |format|
32
+ if @address.save
33
+ format.html { redirect_to [:admin, @address], notice: 'Address was successfully created.' }
34
+ format.json { render :show, status: :created, location: @address }
35
+ else
36
+ format.html { render :new }
37
+ format.json { render json: @address.errors, status: :unprocessable_entity }
38
+ end
39
+ end
40
+ end
41
+
42
+ # PATCH/PUT /Stay/admin/addresses/1
43
+ # PATCH/PUT /Stay/admin/addresses/1.json
44
+ def update
45
+ respond_to do |format|
46
+ if @address.update(address_params)
47
+ format.html { redirect_to [:admin, @address], notice: 'Address was successfully updated.' }
48
+ format.json { render :show, status: :ok, location: @address }
49
+ else
50
+ format.html { render :edit }
51
+ format.json { render json: @address.errors, status: :unprocessable_entity }
52
+ end
53
+ end
54
+ end
55
+
56
+ # DELETE /Stay/admin/addresses/1
57
+ # DELETE /Stay/admin/addresses/1.json
58
+ def destroy
59
+ @address.destroy
60
+ respond_to do |format|
61
+ format.html { redirect_to admin_addresses_url, notice: 'Address was successfully destroyed.' }
62
+ format.json { head :no_content }
63
+ end
64
+ end
65
+
66
+ private
67
+ def set_address
68
+ @address = Stay::Address.find(params[:id])
69
+ end
70
+
71
+ def address_params
72
+ params.require(:address).permit(:address1, :address2, :city, :state, :country, :zipcode)
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,52 @@
1
+ module Stay
2
+ class Admin::AmenitiesController < Stay::Admin::BaseController
3
+ before_action :set_amenity, only: %i[ show edit update destroy ]
4
+
5
+ def index
6
+ @amenities = Stay::Amenity.page(params[:page])
7
+ end
8
+
9
+ def show
10
+ end
11
+
12
+ def new
13
+ @amenity = Stay::Amenity.new
14
+ end
15
+
16
+ def edit
17
+ end
18
+
19
+ def create
20
+ @amenity = Stay::Amenity.new(amenity_params)
21
+
22
+ if @amenity.save
23
+ redirect_to admin_amenity_path(@amenity), notice: "Amenity was successfully created."
24
+ else
25
+ render :new, status: :unprocessable_entity
26
+ end
27
+ end
28
+
29
+ def update
30
+ if @amenity.update(amenity_params)
31
+ redirect_to admin_amenity_path(@amenity), notice: "Amenity was successfully updated.", status: :see_other
32
+ else
33
+ render :edit, status: :unprocessable_entity
34
+ end
35
+ end
36
+
37
+ def destroy
38
+ @amenity.destroy!
39
+ redirect_to admin_amenities_url, notice: "Amenity was successfully destroyed.", status: :see_other
40
+ end
41
+
42
+ private
43
+
44
+ def set_amenity
45
+ @amenity = Stay::Amenity.find(params[:id])
46
+ end
47
+
48
+ def amenity_params
49
+ params.require(:amenity).permit(:name, :amenity_type)
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,52 @@
1
+ module Stay
2
+ class Admin::AmenityCategoriesController < Stay::Admin::BaseController
3
+ before_action :set_amenity_category, only: %i[ show edit update destroy ]
4
+
5
+ def index
6
+ @amenity_categories = Stay::AmenityCategory.page(params[:page])
7
+ end
8
+
9
+ def show
10
+ end
11
+
12
+ def new
13
+ @amenity_category = Stay::AmenityCategory.new
14
+ end
15
+
16
+ def edit
17
+ end
18
+
19
+ def create
20
+ @amenity_category = Stay::AmenityCategory.new(amenity_category_params)
21
+
22
+ if @amenity_category.save
23
+ redirect_to admin_amenity_category_path(@amenity_category), notice: "Amenity was successfully created."
24
+ else
25
+ render :new, status: :unprocessable_entity
26
+ end
27
+ end
28
+
29
+ def update
30
+ if @amenity_category.update(amenity_category_params)
31
+ redirect_to admin_amenity_category_path(@amenity_category), notice: "Amenity was successfully updated.", status: :see_other
32
+ else
33
+ render :edit, status: :unprocessable_entity
34
+ end
35
+ end
36
+
37
+ def destroy
38
+ @amenity_category.destroy!
39
+ redirect_to admin_amenity_categories_url, notice: "Amenity was successfully destroyed.", status: :see_other
40
+ end
41
+
42
+ private
43
+
44
+ def set_amenity_category
45
+ @amenity_category = Stay::AmenityCategory.find(params[:id])
46
+ end
47
+
48
+ def amenity_category_params
49
+ params.require(:amenity_category).permit(:name)
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,38 @@
1
+ module Stay
2
+ module Admin
3
+ class BaseController < ApplicationController
4
+ include Stay::ControllerHelpers::Currency
5
+ include Stay::ControllerHelpers::Store
6
+ layout "stay/admin"
7
+ before_action :authenticate_user!
8
+ before_action :ensure_admin
9
+ before_action :load_stores
10
+
11
+ def stores_scope
12
+ Stay::Store.includes(:translations)
13
+ end
14
+
15
+ def load_stores
16
+ @stores = stores_scope.order(default: :desc)
17
+ end
18
+
19
+ def set_current_store
20
+ return if @object.nil?
21
+
22
+ ensure_current_store(@object)
23
+ end
24
+
25
+ def set_currency
26
+ return if @object.nil?
27
+
28
+ @object.currency = current_currency if model_class.method_defined?(:currency=)
29
+ end
30
+
31
+ private
32
+
33
+ def ensure_admin
34
+ redirect_to root_path, alert: "Access denied!" unless current_user.stay_admin?
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,51 @@
1
+ module Stay
2
+ class Admin::BedTypesController < Stay::Admin::BaseController
3
+ before_action :set_bed_type, only: %i[show edit update destroy]
4
+
5
+ def index
6
+ @bed_types = Stay::BedType.page(params[:page])
7
+ end
8
+
9
+ def new
10
+ @bed_type = Stay::BedType.new
11
+ end
12
+
13
+ def create
14
+ @bed_type = Stay::BedType.new(bed_type_params)
15
+ if @bed_type.save
16
+ redirect_to admin_bed_types_path, notice: 'Bed type 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 @bed_type.update(bed_type_params)
30
+ redirect_to admin_bed_types_path, notice: 'Bed type was successfully updated.'
31
+ else
32
+ render :edit
33
+ end
34
+ end
35
+
36
+ def destroy
37
+ @bed_type.destroy
38
+ redirect_to admin_bed_types_path, notice: 'Bed type was successfully deleted.'
39
+ end
40
+
41
+ private
42
+
43
+ def set_bed_type
44
+ @bed_type = Stay::BedType.find(params[:id])
45
+ end
46
+
47
+ def bed_type_params
48
+ params.require(:bed_type).permit(:name)
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,54 @@
1
+ module Stay
2
+ module Admin
3
+ class BookingsController < Stay::Admin::BaseController
4
+ before_action :set_booking, only: %i[show edit update destroy]
5
+
6
+ def index
7
+ @q = current_store.bookings.ransack(params[:q])
8
+ @bookings = @q.result.order(created_at: :desc).page(params[:page])
9
+ end
10
+
11
+ def show
12
+ end
13
+
14
+ def new
15
+ @booking = current_store.bookings.build
16
+ end
17
+
18
+ def create
19
+ @booking = current_store.bookings.build(booking_params)
20
+ if @booking.save
21
+ redirect_to admin_booking_path(@booking), notice: 'Booking was successfully created.'
22
+ else
23
+ render :new
24
+ end
25
+ end
26
+
27
+ def edit
28
+ end
29
+
30
+ def update
31
+ if @booking.update(booking_params)
32
+ redirect_to admin_booking_path(@booking), notice: 'Booking was successfully updated.'
33
+ else
34
+ render :edit
35
+ end
36
+ end
37
+
38
+ def destroy
39
+ @booking.destroy
40
+ redirect_to admin_bookings_url, notice: 'Booking was successfully destroyed.'
41
+ end
42
+
43
+ private
44
+
45
+ def set_booking
46
+ @booking = current_store.bookings.find_by(id: params[:id])
47
+ end
48
+
49
+ def booking_params
50
+ params.require(:booking).permit(:user_id, :check_in_date, :check_out_date, :number_of_guests, :status)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,51 @@
1
+ module Stay
2
+ class Admin::CancellationPoliciesController < Stay::Admin::BaseController
3
+ before_action :set_policy_type, only: %i[show edit update destroy]
4
+
5
+ def index
6
+ @policies = Stay::CancellationPolicy.page(params[:page])
7
+ end
8
+
9
+ def new
10
+ @policy = Stay::CancellationPolicy.new
11
+ end
12
+
13
+ def create
14
+ @policy = Stay::CancellationPolicy.new(policy_params)
15
+ if @policy.save
16
+ redirect_to admin_cancellation_policies_path, notice: "Policy 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 @policy.update(policy_params)
30
+ redirect_to admin_cancellation_policies_path, notice: "Policy was successfully updated."
31
+ else
32
+ render :edit
33
+ end
34
+ end
35
+
36
+ def destroy
37
+ @policy.destroy
38
+ redirect_to admin_cancellation_policies_path, notice: "Policy was successfully deleted."
39
+ end
40
+
41
+ private
42
+
43
+ def set_policy_type
44
+ @policy = Stay::CancellationPolicy.find(params[:id])
45
+ end
46
+
47
+ def policy_params
48
+ params.require(:cancellation_policy).permit(:name, :description)
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,53 @@
1
+ module Stay
2
+ module Admin
3
+ class ChatsController < Stay::Admin::BaseController
4
+ before_action :set_chat, only: %i[show edit update destroy]
5
+
6
+ def index
7
+ @chats = Stay::Chat.all
8
+ end
9
+
10
+ def show
11
+ end
12
+
13
+ def new
14
+ @chat = Stay::Chat.new
15
+ end
16
+
17
+ def create
18
+ @chat = Stay::Chat.new(chat_params)
19
+ if @chat.save
20
+ redirect_to admin_chat_path(@chat), notice: 'Chat was successfully created.'
21
+ else
22
+ render :new
23
+ end
24
+ end
25
+
26
+ def edit
27
+ end
28
+
29
+ def update
30
+ if @chat.update(chat_params)
31
+ redirect_to admin_chat_path(@chat), notice: 'Chat was successfully updated.'
32
+ else
33
+ render :edit
34
+ end
35
+ end
36
+
37
+ def destroy
38
+ @chat.destroy
39
+ redirect_to admin_chats_path, notice: 'Chat was successfully destroyed.'
40
+ end
41
+
42
+ private
43
+
44
+ def set_chat
45
+ @chat = Stay::Chat.find(params[:id])
46
+ end
47
+
48
+ def chat_params
49
+ params.require(:chat).permit(:sender_id, :receiver_id, :property_id)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,66 @@
1
+ module Stay
2
+ class Admin::CitiesController < Stay::Admin::BaseController
3
+ before_action :set_state
4
+ before_action :set_city, only: [:edit, :update, :destroy]
5
+
6
+ def index
7
+ @cities = @state.cities
8
+ respond_to do |format|
9
+ format.html
10
+ format.json { render json: @cities }
11
+ end
12
+
13
+ end
14
+
15
+ def new
16
+ @city = @state.cities.new
17
+ end
18
+
19
+ def create
20
+ @city = @state.cities.new(city_params)
21
+ if @city.save
22
+ redirect_to admin_state_cities_path(@state), notice: 'City was successfully created.'
23
+ else
24
+ flash.now[:alert] = @city.errors.full_messages.join(', ')
25
+ render :new
26
+ end
27
+ end
28
+
29
+ def edit
30
+ end
31
+
32
+ def update
33
+ if @city.update(city_params)
34
+ redirect_to admin_state_cities_path(@state), notice: 'City was successfully updated.'
35
+ else
36
+ flash.now[:alert] = @city.errors.full_messages.join(', ')
37
+ render :edit
38
+ end
39
+ end
40
+
41
+ def destroy
42
+ if @city.destroy
43
+ flash[:alert] = "City was successfully deleted."
44
+ redirect_to admin_state_cities_path(@state)
45
+ else
46
+ flash[:alert] = @city.errors.full_messages.join(', ')
47
+ redirect_to admin_state_cities_path(@state)
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+
54
+ def set_state
55
+ @state = Stay::State.find(params[:state_id])
56
+ end
57
+
58
+ def set_city
59
+ @city = @state.cities.find(params[:id])
60
+ end
61
+
62
+ def city_params
63
+ params.require(:city).permit(:name)
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Stay::Admin::ConfirmationsController < Devise::ConfirmationsController
4
+ # GET /resource/confirmation/new
5
+ # def new
6
+ # super
7
+ # end
8
+
9
+ # POST /resource/confirmation
10
+ # def create
11
+ # super
12
+ # end
13
+
14
+ # GET /resource/confirmation?confirmation_token=abcdef
15
+ # def show
16
+ # super
17
+ # end
18
+
19
+ # protected
20
+
21
+ # The path used after resending confirmation instructions.
22
+ # def after_resending_confirmation_instructions_path_for(resource_name)
23
+ # super(resource_name)
24
+ # end
25
+
26
+ # The path used after confirmation.
27
+ # def after_confirmation_path_for(resource_name, resource)
28
+ # super(resource_name, resource)
29
+ # end
30
+ end