spree_cm_commissioner 2.5.0.pre.pre13 → 2.5.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 (110) hide show
  1. checksums.yaml +4 -4
  2. data/.env.example +4 -0
  3. data/Gemfile.lock +1 -1
  4. data/app/assets/images/mailer/call.png +0 -0
  5. data/app/assets/images/mailer/email.png +0 -0
  6. data/app/assets/images/mailer/user-tenant.png +0 -0
  7. data/app/controllers/spree/admin/base_controller_decorator.rb +7 -33
  8. data/app/controllers/spree/api/v2/storefront/guests_controller.rb +7 -51
  9. data/app/controllers/spree/api/v2/storefront/intercity_taxi/distance_calculator_controller.rb +47 -0
  10. data/app/controllers/spree/api/v2/storefront/intercity_taxi/draft_orders_controller.rb +7 -5
  11. data/app/controllers/spree/api/v2/storefront/trip_search_controller.rb +2 -2
  12. data/app/controllers/spree/api/v2/tenant/intercity_taxi/distance_calculator_controller.rb +47 -0
  13. data/app/controllers/spree/api/v2/tenant/intercity_taxi/draft_orders_controller.rb +7 -5
  14. data/app/controllers/spree/api/v2/tenant/trip_search_controller.rb +2 -2
  15. data/app/controllers/spree_cm_commissioner/admin/orders_controller_decorator.rb +9 -1
  16. data/app/interactors/spree_cm_commissioner/google_routes_distance_calculator.rb +0 -13
  17. data/app/interactors/spree_cm_commissioner/invalidate_cache_request.rb +3 -3
  18. data/app/interactors/spree_cm_commissioner/vehicle_type_updater.rb +41 -0
  19. data/app/jobs/spree_cm_commissioner/invalidate_cache_request_job.rb +1 -1
  20. data/app/mailers/spree/order_mailer_decorator.rb +22 -1
  21. data/app/models/concerns/spree_cm_commissioner/line_item_seat_selection.rb +40 -0
  22. data/app/models/concerns/spree_cm_commissioner/line_item_transitable.rb +1 -1
  23. data/app/models/concerns/spree_cm_commissioner/vehicle_kind.rb +21 -0
  24. data/app/models/spree_cm_commissioner/adjustable/adjuster/pricing_action.rb +25 -0
  25. data/app/models/spree_cm_commissioner/guest.rb +1 -1
  26. data/app/models/spree_cm_commissioner/guest_dynamic_field.rb +3 -0
  27. data/app/models/spree_cm_commissioner/homepage_background_app_image.rb +1 -1
  28. data/app/models/spree_cm_commissioner/invite_guest.rb +2 -5
  29. data/app/models/spree_cm_commissioner/line_item_decorator.rb +2 -2
  30. data/app/models/spree_cm_commissioner/option_type_decorator.rb +4 -1
  31. data/app/models/spree_cm_commissioner/option_value_decorator.rb +4 -1
  32. data/app/models/spree_cm_commissioner/{option_value_vehicle.rb → option_value_vehicle_type.rb} +2 -2
  33. data/app/models/spree_cm_commissioner/order_decorator.rb +14 -1
  34. data/app/models/spree_cm_commissioner/saved_guest.rb +2 -0
  35. data/app/models/spree_cm_commissioner/trip.rb +7 -6
  36. data/app/models/spree_cm_commissioner/vehicle.rb +8 -20
  37. data/app/models/spree_cm_commissioner/vehicle_type.rb +28 -0
  38. data/app/models/spree_cm_commissioner/vehicle_type_option_type.rb +6 -0
  39. data/app/models/spree_cm_commissioner/vendor_decorator.rb +1 -0
  40. data/app/overrides/spree/admin/orders/_order_actions/actions.html.erb.deface +36 -1
  41. data/app/overrides/spree/admin/products/edit/clear_cache_button.html.erb.deface +1 -1
  42. data/app/overrides/spree/admin/taxons/edit/clear_cache_button.html.erb.deface +3 -2
  43. data/app/queries/spree_cm_commissioner/trip_query.rb +5 -5
  44. data/app/request_schemas/spree_cm_commissioner/intercity_taxi_draft_order_update_schema.rb +2 -0
  45. data/app/serializers/spree/v2/storefront/line_item_serializer_decorator.rb +12 -0
  46. data/app/serializers/spree/v2/tenant/line_item_serializer.rb +14 -1
  47. data/app/serializers/spree_cm_commissioner/v2/storefront/distance_serializer.rb +26 -0
  48. data/app/serializers/spree_cm_commissioner/v2/storefront/intercity_taxi_line_item_serializer.rb +3 -3
  49. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_result_serializer.rb +2 -2
  50. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_serializer.rb +1 -1
  51. data/app/serializers/spree_cm_commissioner/v2/storefront/{trip_vehicle_serializer.rb → trip_vehicle_type_serializer.rb} +2 -4
  52. data/app/services/spree_cm_commissioner/api_caches/invalidate.rb +98 -0
  53. data/app/services/spree_cm_commissioner/calculate_distance.rb +279 -0
  54. data/app/services/spree_cm_commissioner/cart/recalculate_decorator.rb +28 -1
  55. data/app/services/spree_cm_commissioner/guests/claim_invite_guest_service.rb +65 -0
  56. data/app/services/spree_cm_commissioner/intercity_taxi_order/calculate_distance.rb +224 -0
  57. data/app/services/spree_cm_commissioner/intercity_taxi_order/update.rb +30 -3
  58. data/app/services/spree_cm_commissioner/line_items/apply_pricing_models.rb +27 -0
  59. data/app/services/spree_cm_commissioner/pricing_models/apply.rb +4 -12
  60. data/app/services/spree_cm_commissioner/signing/sign_data.rb +42 -0
  61. data/app/services/spree_cm_commissioner/signing/verify_signature.rb +52 -0
  62. data/app/services/spree_cm_commissioner/transit/export_order.rb +146 -0
  63. data/app/services/spree_cm_commissioner/update_guest_service.rb +129 -0
  64. data/app/services/spree_cm_commissioner/vendor_places/create_with_google_map_data.rb +24 -7
  65. data/app/services/spree_cm_commissioner/vendor_places/update.rb +4 -2
  66. data/app/views/spree/admin/homepage_section/edit.html.erb +7 -2
  67. data/app/views/spree/order_mailer/cancel_email.html.erb +17 -0
  68. data/app/views/spree/order_mailer/confirm_email.html.erb +2 -2
  69. data/app/views/spree_cm_commissioner/cancel_order_mailer/_cancel_email.html.erb +13 -0
  70. data/app/views/spree_cm_commissioner/cancel_order_mailer/_footer.html.erb +8 -0
  71. data/app/views/spree_cm_commissioner/cancel_order_mailer/_header.html.erb +3 -0
  72. data/app/views/spree_cm_commissioner/cancel_order_mailer/_mailer_stylesheets.html.erb +88 -0
  73. data/app/views/spree_cm_commissioner/cancel_order_mailer/tenant/_cancel_email.html.erb +13 -0
  74. data/app/views/spree_cm_commissioner/cancel_order_mailer/tenant/_footer.html.erb +8 -0
  75. data/app/views/spree_cm_commissioner/cancel_order_mailer/tenant/_header.html.erb +15 -0
  76. data/app/views/spree_cm_commissioner/layouts/cancel_order_mailer.html.erb +16 -0
  77. data/app/views/spree_cm_commissioner/layouts/order_mailer.html.erb +1 -1
  78. data/app/views/spree_cm_commissioner/order_mailer/_customer_info.html.erb +2 -8
  79. data/app/views/spree_cm_commissioner/order_mailer/_mailer_stylesheets.html.erb +51 -23
  80. data/app/views/spree_cm_commissioner/order_mailer/_support_contact.html.erb +2 -7
  81. data/app/views/spree_cm_commissioner/order_mailer/purchased_items/_items.html.erb +76 -42
  82. data/app/views/spree_cm_commissioner/order_mailer/tenant/_customer_info.html.erb +4 -10
  83. data/app/views/spree_cm_commissioner/order_mailer/tenant/_support_contact.html.erb +3 -8
  84. data/config/locales/en.yml +14 -0
  85. data/config/locales/km.yml +26 -2
  86. data/config/routes.rb +2 -0
  87. data/db/migrate/20251127074809_change_guest_dynamic_fields_value_from_jsonb_to_text.rb +40 -0
  88. data/db/migrate/20251219035243_add_migrations_to_support_vehicle_types.rb +36 -0
  89. data/db/migrate/20260105072146_add_nationality_group_and_age_group_to_cm_saved_guests.rb +6 -0
  90. data/db/migrate/20260106093359_add_contact_phone_to_cm_vendor_places.rb +5 -0
  91. data/lib/spree_cm_commissioner/distance.rb +88 -0
  92. data/lib/spree_cm_commissioner/engine.rb +3 -0
  93. data/lib/spree_cm_commissioner/test_helper/factories/guest_factory.rb +2 -2
  94. data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +3 -3
  95. data/lib/spree_cm_commissioner/test_helper/factories/pricing_model_variant_factory.rb +6 -0
  96. data/lib/spree_cm_commissioner/test_helper/factories/seat_layout_factory.rb +1 -1
  97. data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +1 -0
  98. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_factory.rb +4 -1
  99. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_type_factory.rb +7 -0
  100. data/lib/spree_cm_commissioner/trip_query_result.rb +1 -1
  101. data/lib/spree_cm_commissioner/trip_result.rb +7 -1
  102. data/lib/spree_cm_commissioner/version.rb +1 -1
  103. data/lib/spree_cm_commissioner.rb +1 -1
  104. metadata +43 -12
  105. data/app/interactors/spree_cm_commissioner/trip_distance_calculator.rb +0 -165
  106. data/app/interactors/spree_cm_commissioner/vehicle_updater.rb +0 -41
  107. data/app/models/concerns/spree_cm_commissioner/vehicle_type.rb +0 -11
  108. data/app/models/spree_cm_commissioner/vehicle_option_type.rb +0 -6
  109. data/lib/spree_cm_commissioner/intercity_taxi/distance.rb +0 -38
  110. data/lib/spree_cm_commissioner/test_helper/factories/vendor_route_factory.rb +0 -7
@@ -0,0 +1,13 @@
1
+ <div class="cancel-greeting">
2
+ <h1>
3
+ <%= I18n.t('mail.order_mailer.hello', full_name: user_full_name(order))%>
4
+ </h1>
5
+ <p class="description">
6
+ <%= raw I18n.t('mail.order_mailer.cancel_description', order_number: order.number || 'NA') %>
7
+ </p>
8
+ <p class="description">
9
+ <span style="font-weight: bold; color: #000000;">Reason:</span>
10
+ <%= order&.internal_note %>
11
+ </p>
12
+ <div style="border-bottom: 1px solid #E5E7EB; margin-top: 1.5rem;">
13
+ </div>
@@ -0,0 +1,8 @@
1
+ <div class="footer">
2
+ <p>
3
+ <%= I18n.t('mail.order_mailer.cancel_thank') %>
4
+ </p>
5
+ <p class="team">
6
+ <%= I18n.t('mail.order_mailer.from_team', store: name) %>
7
+ </p>
8
+ </div>
@@ -0,0 +1,15 @@
1
+ <div class="header-tenant">
2
+ <table width="100%" cellpadding="0" cellspacing="0">
3
+ <tr>
4
+ <td class="tenant-name">
5
+ <%= name %>
6
+ </td>
7
+
8
+ <% if logo.present? %>
9
+ <td class="logo-tenant" align="right">
10
+ <img src="<%= logo %>">
11
+ </td>
12
+ <% end %>
13
+ </tr>
14
+ </table>
15
+ </div>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html>
3
+ <head>
4
+ <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
5
+ <meta name="x-apple-disable-message-reformatting"/>
6
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
7
+ <link href="https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel="stylesheet">
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
9
+ <%= render partial: 'spree_cm_commissioner/cancel_order_mailer/mailer_stylesheets' %>
10
+ </head>
11
+ <body>
12
+ <table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center" width="100%">
13
+ <%= yield %>
14
+ </table>
15
+ </body>
16
+ </html>
@@ -20,7 +20,7 @@
20
20
  </tr>
21
21
  <tr>
22
22
  <td height="60px">
23
- <table class="email-footer" align="center" width="570" cellpadding="0" cellspacing="0" role="presentation">
23
+ <table class="email-footer" align="center" width="100%" style="max-width: 570px;" cellpadding="0" cellspacing="0" role="presentation">
24
24
  <tr>
25
25
  <td>
26
26
  <% if @order.tenant.nil? %>
@@ -1,31 +1,25 @@
1
1
  <div class="content-cell">
2
2
  <div class="container">
3
3
  <h2><%= I18n.t('mail.order_mailer.customer_info')%></h2>
4
- <div class="flex two-columns">
4
+ <div class="flex two-columns-contact">
5
5
  <div class="two-columns-item">
6
6
  <div class="flex two-columns-item_detail">
7
- <div class="two-columns_icon"><%= image_tag "mailer/user.png", class: "mail-icon"%></div>
7
+ <div class="two-columns_icon" style="color: black;"><%= image_tag "mailer/user.png", class: "mail-icon"%></div>
8
8
  <div class="two-columns_text-container">
9
- <p class="two-columns_title">Name</p>
10
9
  <p class="two-columns_description"><%= user_full_name(order) %></p>
11
10
  </div>
12
11
  </div>
13
12
  <div class="flex two-columns-item_detail">
14
13
  <div class="two-columns_icon"><%= image_tag "mailer/envelope.png", class: "mail-icon"%></div>
15
14
  <div class="two-columns_text-container">
16
- <p class="two-columns_title">Email</p>
17
15
  <% if order.email.present? %>
18
16
  <p class="two-columns_description"><%= link_to order.email, "mailto:#{order.email}" %></p>
19
17
  <% end %>
20
18
  </div>
21
19
  </div>
22
- </div>
23
- <div class="vertical-separater"></div>
24
- <div class="two-columns-item">
25
20
  <div class="flex two-columns-item_detail">
26
21
  <div class="two-columns_icon"><%= image_tag "mailer/phone.png", class: "mail-icon"%></div>
27
22
  <div class="two-columns_text-container">
28
- <p class="two-columns_title">Contact</p>
29
23
  <% if order.phone_number.present? || order.intel_phone_number.present? %>
30
24
  <p class="two-columns_description">
31
25
  <%= link_to(
@@ -1,5 +1,9 @@
1
1
  <style type="text/css" rel="stylesheet" media="all">
2
2
  /* Custom Mailer ------------------------------ */
3
+ body {
4
+ padding: 0;
5
+ margin: 0;
6
+ }
3
7
 
4
8
  #confirm-email {
5
9
  font-family: "Poppins", "Nunito Sans", Helvetica, Arial, sans-serif;
@@ -95,12 +99,12 @@
95
99
  margin-bottom: 0.625rem;
96
100
  }
97
101
  #confirm-email .icon-hang-meas {
98
- width: 50%;
102
+ width: 40%;
99
103
  text-align: right;
100
104
  }
101
105
  #confirm-email .icon-hang-meas img {
102
- width: 6.25rem;
103
- height: 6.25rem;
106
+ width: 3.5rem;
107
+ height: 3.5rem;
104
108
  border-radius: 50%;
105
109
  background-color: #fff;
106
110
  display: inline-block;
@@ -108,7 +112,8 @@
108
112
  #confirm-email .header h1 {
109
113
  margin: 0;
110
114
  color: #fff;
111
- width: 50%;
115
+ width: 60%;
116
+ font-size: 1.8rem;
112
117
  }
113
118
 
114
119
  #confirm-email .header {
@@ -140,26 +145,25 @@
140
145
  padding: 0.625rem 0;
141
146
  }
142
147
  #confirm-email .purchase_image {
143
- width: 20%;
148
+ border-radius:10px;
149
+ width:auto; height:auto;
150
+ display:block; margin-bottom:6px;
151
+ margin-right: 8px;
144
152
  }
145
153
  #confirm-email .purchase_item {
146
154
  padding: 0 0.625rem;
147
155
  width: 60%;
148
156
  }
149
157
  #confirm-email .purchase-item-option-text {
150
- font-size: 1rem;
151
- background-color: #F2F2F2;
152
- color: #646161;
153
- white-space: normal;
154
- overflow: hidden;
155
- display: inline-block;
156
- max-width: 100%;
157
- width: auto;
158
- padding: 0.375rem 0.875rem;
159
- margin: 0.625rem 0;
160
- border-radius: 6.25rem;
161
- word-wrap: break-word;
162
- word-break: break-word;
158
+ padding:12px;
159
+ border:1px solid #d1d5db;
160
+ background-color:#f3f4f6;
161
+ border-radius:10px;
162
+ font-size:12px;
163
+ line-height:1.25;
164
+ color:#4b5563;
165
+ word-wrap:break-word;
166
+ text-align:start;
163
167
  }
164
168
  #confirm-email .purchase_item_price {
165
169
  margin-bottom: 0.5rem; }
@@ -186,9 +190,18 @@
186
190
  height: auto;
187
191
  background: #F2F2F2;
188
192
  }
193
+ #confirm-email .two-columns-contact{
194
+ display: flex;
195
+ flex-direction: column;
196
+ }
197
+ #confirm-email .two-columns-contact .two-columns-item {
198
+ flex: 1 1 45%;
199
+ word-wrap: break-word;
200
+ word-break: break-word;
201
+ width: 100%;
202
+ }
189
203
  #confirm-email .two-columns .two-columns-item {
190
204
  flex: 1 1 45%;
191
- margin: 0.5rem 0;
192
205
  word-wrap: break-word;
193
206
  word-break: break-word;
194
207
  width: 100%;
@@ -200,16 +213,30 @@
200
213
  width: 65%;
201
214
  justify-content: right;
202
215
  }
203
- #confirm-email .two-columns .two-columns-item_detail {
216
+ #confirm-email .two-columns-contact .two-columns-item_detail {
204
217
  margin-bottom: 1rem;
205
218
  width: 100%;
219
+ display: flex;
220
+ align-items: center;
206
221
  }
207
222
  #confirm-email .two-columns_icon {
208
- min-width: 3rem;
209
- height: 3rem;
223
+ min-width: 2rem;
224
+ height: 2rem;
210
225
  background: #f1f1f1;
211
226
  border-radius: 50%;
212
227
  display: flex;
228
+ align-items: center;
229
+ justify-content: center;
230
+ fill: blue;
231
+ stroke: black;
232
+ }
233
+ #confirm-email .two-columns_icon .mail-icon {
234
+ width: 1rem; /* Adjust size as needed */
235
+ height: 1rem;
236
+ }
237
+ #confirm-email .two-columns_icon .mail-icon-tenant {
238
+ width: 1.2rem;
239
+ height: 1.2rem;
213
240
  }
214
241
  #confirm-email .two-columns_icon .vendor-logo {
215
242
  max-width: 3rem;
@@ -295,6 +322,7 @@
295
322
  padding: 1.5rem;
296
323
  border-radius: 0 0 1.5625rem 1.5625rem;
297
324
  border: 0.0625rem solid #dddfe2;
325
+ background-color: #fff;
298
326
  }
299
327
  .purchase {
300
328
  width: 100%;
@@ -310,7 +338,7 @@
310
338
  align: right;
311
339
  }
312
340
  .align-right {
313
- padding: 0.625rem;
341
+ padding: 0.625rem 0;
314
342
  text-align: right;
315
343
  align: right;
316
344
  }
@@ -1,12 +1,11 @@
1
1
  <div class="content-cell">
2
2
  <div class="container">
3
3
  <h2><%= I18n.t('mail.order_mailer.bookmeplus_support')%></h2>
4
- <div class="flex two-columns">
4
+ <div class="flex two-columns-contact">
5
5
  <div class="two-columns-item">
6
6
  <div class="flex two-columns-item_detail">
7
- <div class="two-columns_icon"><%= image_tag "mailer/phone.png", class: "mail-icon"%></div>
7
+ <div class="two-columns_icon"><%= image_tag "mailer/phone.png", class: "mail-icon" %></div>
8
8
  <div class="two-columns_text-container">
9
- <p class="two-columns_title">Contact</p>
10
9
  <% if current_store.contact_phone.present? %>
11
10
  <p class="two-columns_description">
12
11
  <%= link_to current_store.contact_phone, "tel:#{current_store.contact_phone}" %>
@@ -14,13 +13,9 @@
14
13
  <% end %>
15
14
  </div>
16
15
  </div>
17
- </div>
18
- <div class="vertical-separater"></div>
19
- <div class="two-columns-item">
20
16
  <div class="flex two-columns-item_detail">
21
17
  <div class="two-columns_icon"><%= image_tag "mailer/envelope.png", class: "mail-icon"%></div>
22
18
  <div class="two-columns_text-container">
23
- <p class="two-columns_title">Email</p>
24
19
  <% if current_store.customer_support_email.present? %>
25
20
  <p class="two-columns_description">
26
21
  <%= link_to current_store.customer_support_email, "mailto:#{current_store.customer_support_email}" %>
@@ -1,46 +1,80 @@
1
- <table class="purchase order-info">
1
+ <table class="purchase order-info" width="100%" cellpadding="0" cellspacing="0">
2
2
  <% line_items.each do |line_item| %>
3
3
  <tr>
4
- <td class="purchase_image align-center-vertical">
5
- <% if line_item.variant.present? && variant_image_url(line_item.variant).present? %>
6
- <%= link_to(
7
- image_tag(
8
- variant_image_url(line_item.variant),
9
- style: "border-radius: 10px; width: 100%;"),
10
- custom_product_storefront_resource_url(line_item.product) || '#'
11
- ) %>
12
- <% end %>
13
- </td>
14
- <td class="purchase_item">
15
- <% if line_item.name.present? %>
16
- <p><%= link_to(
17
- raw(line_item.name),
4
+ <td>
5
+ <!-- Outer container table -->
6
+ <table width="100%" cellpadding="0" cellspacing="0" role="presentation">
7
+
8
+ <!-- Row 1: Name + Quantity × Price -->
9
+ <tr>
10
+ <td align="left" valign="top" width="60%">
11
+ <% if line_item.name.present? %>
12
+ <span>
13
+ <%= link_to(raw(line_item.name), custom_product_storefront_resource_url(line_item.product) || '#') %>
14
+ </span>
15
+ <% end %>
16
+ </td>
17
+ <td align="right" valign="top" width="40%">
18
+ <table width="100%" cellpadding="0" cellspacing="0" role="presentation">
19
+ <tr>
20
+ <td align="right" style="color: gray; padding-bottom:2px; white-space:nowrap;">
21
+ <%= line_item.quantity %> x <%= line_item.single_money %>
22
+ </td>
23
+ </tr>
24
+ <tr>
25
+ <td align="right">
26
+ <span style="font-weight:600;"><%= line_item.display_amount %></span>
27
+ </td>
28
+ </tr>
29
+ </table>
30
+ </td>
31
+ </tr>
32
+
33
+ </table>
34
+
35
+ <!-- Separate table for Image + Options to avoid width conflicts -->
36
+ <table width="100%" cellpadding="0" cellspacing="0" role="presentation" style="margin-top:6px;">
37
+ <tr>
38
+ <!-- Image -->
39
+ <td align="left" valign="top">
40
+ <% if line_item.variant.present? && variant_image_url(line_item.variant).present? %>
41
+ <%= link_to(
42
+ image_tag(
43
+ variant_image_url(line_item.variant),
44
+ class: "purchase_image"
45
+ ),
18
46
  custom_product_storefront_resource_url(line_item.product) || '#'
19
- ) %></p>
20
- <% end %>
21
- <% if line_item.variant.options_text.present? %>
22
- <div class="purchase-item-option-text">
23
- <%= sanitize(line_item.variant.options_text) %>
24
- </div>
25
- <% end %>
26
- <div> <%= link_to 'View Details', custom_product_line_item_url(line_item) %></div>
27
- </td>
28
- <td class="align-right align-center-vertical" width="10%">
29
- <span>
30
- <%= line_item.quantity %>x
31
- </span>
47
+ ) %>
48
+ <% end %>
49
+ </td>
50
+
51
+ <!-- Options -->
52
+ <td align="right" valign="top" width="100%">
53
+ <% if line_item.variant.options_text.present? %>
54
+ <table width="100%" cellpadding="0" cellspacing="0" role="presentation">
55
+ <tr>
56
+ <td class="purchase-item-option-text">
57
+ <%= sanitize(line_item.variant.options_text) %>
58
+ </td>
59
+ </tr>
60
+ </table>
61
+ <% end %>
62
+ </td>
63
+ </tr>
64
+
65
+ <!-- Detail link -->
66
+ <tr>
67
+ <td></td>
68
+ <td align="right" style="padding-top:6px;">
69
+ <%= link_to 'View Pass', custom_product_line_item_url(line_item)%>
70
+ </td>
71
+ </tr>
72
+ </table>
32
73
  </td>
33
- <td class="align-right align-center-vertical" width="20%">
34
- <div class="f-fallback purchase_item_price">
35
- <%= line_item.single_money %><br>
36
- </div>
37
- <div class="f-fallback purchase_item_price">
38
- <%= line_item.display_amount %>
39
- </div>
40
- </td>
41
- </tr>
42
- <tr>
43
- <td colspan="4"><hr></td>
44
- </tr>
45
- <%end%>
46
- </table>
74
+ </tr>
75
+
76
+ <tr>
77
+ <td><hr></td>
78
+ </tr>
79
+ <% end %>
80
+ </table>
@@ -1,31 +1,25 @@
1
1
  <div class="content-cell">
2
2
  <div class="container">
3
3
  <h2><%= I18n.t('mail.order_mailer.customer_info') %></h2>
4
- <div class="flex two-columns">
4
+ <div class="flex two-columns-contact">
5
5
  <div class="two-columns-item">
6
6
  <div class="flex two-columns-item_detail">
7
- <div class="two-columns_icon"><%= image_tag "mailer/tenant_user.png", class: "mail-icon" %></div>
7
+ <div class="two-columns_icon"><%= image_tag "mailer/user-tenant.png", class: "mail-icon" %></div>
8
8
  <div class="two-columns_text-container">
9
- <p class="two-columns_title">Name</p>
10
9
  <p class="two-columns_description"><%= user_full_name(order) %></p>
11
10
  </div>
12
11
  </div>
13
12
  <div class="flex two-columns-item_detail">
14
- <div class="two-columns_icon"><%= image_tag "mailer/mail.png", class: "mail-icon" %></div>
13
+ <div class="two-columns_icon"><%= image_tag "mailer/email.png", class: "mail-icon" %></div>
15
14
  <div class="two-columns_text-container">
16
- <p class="two-columns_title">Email</p>
17
15
  <% if order.email.present? %>
18
16
  <p class="two-columns_description"><%= link_to order.email, "mailto:#{order.email}" %></p>
19
17
  <% end %>
20
18
  </div>
21
19
  </div>
22
- </div>
23
- <div class="vertical-separater"></div>
24
- <div class="two-columns-item">
25
20
  <div class="flex two-columns-item_detail">
26
- <div class="two-columns_icon"><%= image_tag "mailer/tenant_phone.png", class: "mail-icon" %></div>
21
+ <div class="two-columns_icon"><%= image_tag "mailer/call.png", class: "mail-icon-tenant" %></div>
27
22
  <div class="two-columns_text-container">
28
- <p class="two-columns_title">Contact</p>
29
23
  <% if order.phone_number.present? || order.intel_phone_number.present? %>
30
24
  <p class="two-columns_description">
31
25
  <%= link_to(
@@ -1,12 +1,11 @@
1
1
  <div class="content-cell">
2
2
  <div class="container">
3
3
  <h2><%= name %> Support</h2>
4
- <div class="flex two-columns">
4
+ <div class="flex two-columns-contact">
5
5
  <div class="two-columns-item">
6
6
  <div class="flex two-columns-item_detail">
7
- <div class="two-columns_icon"><%= image_tag "mailer/tenant_phone.png", class: "mail-icon"%></div>
7
+ <div class="two-columns_icon"><%= image_tag "mailer/call.png", class: "mail-icon-tenant"%></div>
8
8
  <div class="two-columns_text-container">
9
- <p class="two-columns_title">Contact</p>
10
9
  <% if order&.tenant&.contact_phone&.present? %>
11
10
  <p class="two-columns_description">
12
11
  <%= link_to order.tenant.contact_phone, "tel:#{order.tenant.contact_phone}" %>
@@ -14,13 +13,9 @@
14
13
  <% end %>
15
14
  </div>
16
15
  </div>
17
- </div>
18
- <div class="vertical-separater"></div>
19
- <div class="two-columns-item">
20
16
  <div class="flex two-columns-item_detail">
21
- <div class="two-columns_icon"><%= image_tag "mailer/mail.png", class: "mail-icon"%></div>
17
+ <div class="two-columns_icon"><%= image_tag "mailer/email.png", class: "mail-icon"%></div>
22
18
  <div class="two-columns_text-container">
23
- <p class="two-columns_title">Email</p>
24
19
  <p class="two-columns_description">
25
20
  <%= order&.tenant&.customer_support_email.present? ? link_to(order.tenant.customer_support_email, "mailto:#{order.tenant.customer_support_email}") : "N/A" %>
26
21
  </p>
@@ -119,6 +119,17 @@ en:
119
119
  product_kind_option_types:
120
120
  empty_info: "<b>Note:</b> Set service option types to service first. To edit, go to <b>Details</b> tab > <b>Option Types</b>"
121
121
 
122
+ vehicle_type:
123
+ suv: "SUV"
124
+ sedan: "Sedan"
125
+ van: "Van"
126
+ minivan: "Minivan"
127
+ sleeping_bus: "Sleeping Bus"
128
+ luxury_van: "Luxury Van"
129
+ air_bus: "Air Bus"
130
+ bus: "Bus"
131
+ ferry: "Ferry"
132
+
122
133
  line_item:
123
134
  validation:
124
135
  exceeded_max_quantity_per_order: "Exceeded maximum quantity per order"
@@ -528,6 +539,9 @@ en:
528
539
  hello: "Hello %{full_name},"
529
540
  thanks: "Thanks %{full_name},"
530
541
  booking_event: "Your booking for %{order_number} is successfully complete!"
542
+ cancel_description: "Your order <span style='color: #000000; font-weight: bold;'>%{order_number}</span> has been <span style='color: red; font-weight: bold;'>CANCELLED</span>. Please retain this cancellation information for your records."
543
+ cancel_thank: "Thank you for your business."
544
+ from_team: "The %{store} Team"
531
545
  booking_reference: "For reference, your booking ID is %{order_number}."
532
546
  booking_id: "Booking ID <b>%{order_number}</b>"
533
547
  booking_summary: "Booking Summary"
@@ -113,6 +113,17 @@ km:
113
113
  product_kind_option_types:
114
114
  empty_info: "<b>ចំណាំ:</b> កំណត់ប្រភេទសម្រាប់ផលិតផល. ដើម្បីកែប្រែ, សូមចូលទៅ <b>លម្អិត</b> tab > <b>ប្រភេទ</b>"
115
115
 
116
+ vehicle_type:
117
+ suv: "SUV"
118
+ sedan: "Sedan"
119
+ van: "Van"
120
+ minivan: "Minivan"
121
+ sleeping_bus: "Sleeping Bus"
122
+ luxury_van: "Luxury Van"
123
+ air_bus: "Air Bus"
124
+ bus: "Bus"
125
+ ferry: "Ferry"
126
+
116
127
  line_item:
117
128
  validation:
118
129
  exceeded_max_quantity_per_order: "លើសពីបរិមាណអតិបរមាក្នុងមួយការបញ្ជាទិញ"
@@ -190,6 +201,16 @@ km:
190
201
  system_registered: "ចុះឈ្មោះដោយប្រព័ន្ធ"
191
202
  self_registered: "ចុះឈ្មោះដោយខ្លួនឯង"
192
203
  registration_source: "ប្រភេទការចុះឈ្មោះ"
204
+ vehicle_kind:
205
+ suv: "SUV"
206
+ sedan: "Sedan"
207
+ van: "Van"
208
+ minivan: "Minivan"
209
+ sleeping_bus: "Sleeping Bus"
210
+ luxury_van: "Luxury Van"
211
+ air_bus: "Air Bus"
212
+ bus: "Bus"
213
+ ferry: "Ferry"
193
214
  service_types:
194
215
  organizer: "Organizer"
195
216
  transit: "Transit"
@@ -388,9 +409,12 @@ km:
388
409
  booking_confirm: "Confirmed!"
389
410
  hello: "Hello %{full_name},"
390
411
  thanks: "Thanks %{full_name},"
391
- booking_event: "Your booking for %{order_name} is successfully complete!"
412
+ booking_event: "Your booking for %{order_number} is successfully complete!"
413
+ cancel_description: "Your order <span style='color: #000000; font-weight: bold;'>%{order_number}</span> has been <span style='color: red; font-weight: bold;'>CANCELLED</span>. Please retain this cancellation information for your records."
414
+ cancel_thank: "Thank you for your business."
415
+ from_team: "The %{store} Team"
392
416
  booking_reference: "For reference, your booking ID is %{order_number}."
393
- booking_id: "Booking ID <b>%{order_number}<b>"
417
+ booking_id: "Booking ID <b>%{order_number}</b>"
394
418
  booking_summary: "Booking Summary"
395
419
  check_in: "Check in:"
396
420
  check_out: "Check out:"
data/config/routes.rb CHANGED
@@ -563,6 +563,7 @@ Spree::Core::Engine.add_routes do
563
563
 
564
564
  namespace :intercity_taxi do
565
565
  resource :draft_orders, only: %i[create update]
566
+ resource :distance_calculator, controller: :distance_calculator, only: [:create]
566
567
  end
567
568
 
568
569
  resource :reset_passwords, only: [:update]
@@ -708,6 +709,7 @@ Spree::Core::Engine.add_routes do
708
709
  end
709
710
  namespace :intercity_taxi do
710
711
  resource :draft_orders, only: %i[create update]
712
+ resource :distance_calculator, controller: :distance_calculator, only: [:create]
711
713
  end
712
714
  end
713
715
 
@@ -0,0 +1,40 @@
1
+ class ChangeGuestDynamicFieldsValueFromJsonbToText < ActiveRecord::Migration[7.0]
2
+ def up
3
+ # Check if the migration has already been run
4
+ return if column_exists?(:cm_guest_dynamic_fields, :value, :text)
5
+
6
+ add_column :cm_guest_dynamic_fields, :value_text, :text
7
+
8
+ # Convert JSONB value to TEXT value
9
+ execute <<-SQL
10
+ UPDATE cm_guest_dynamic_fields
11
+ SET value_text = value ->> 0
12
+ SQL
13
+
14
+ remove_column :cm_guest_dynamic_fields, :value
15
+ rename_column :cm_guest_dynamic_fields, :value_text, :value
16
+
17
+ # Restore NOT NULL and default value constraints
18
+ #To make it the same as the original: t.jsonb :value, default: [], null: false
19
+ change_column_default :cm_guest_dynamic_fields, :value, ''
20
+ change_column_null :cm_guest_dynamic_fields, :value, false
21
+ end
22
+
23
+ def down
24
+ add_column :cm_guest_dynamic_fields, :value_jsonb, :jsonb
25
+
26
+ # Convert TEXT value to JSONB value
27
+ execute <<-SQL
28
+ UPDATE cm_guest_dynamic_fields
29
+ SET value_jsonb = to_jsonb(value)
30
+ SQL
31
+
32
+ remove_column :cm_guest_dynamic_fields, :value
33
+ rename_column :cm_guest_dynamic_fields, :value_jsonb, :value
34
+
35
+ # Restore NOT NULL and default value constraints
36
+ #To make it the same as the original: t.jsonb :value, default: [], null: false
37
+ change_column_default :cm_guest_dynamic_fields, :value, []
38
+ change_column_null :cm_guest_dynamic_fields, :value, false
39
+ end
40
+ end
@@ -0,0 +1,36 @@
1
+ class AddMigrationsToSupportVehicleTypes < ActiveRecord::Migration[7.0]
2
+ def change
3
+ # 1. rename amentity table from vehicle to vehicle type
4
+ rename_table :cm_vehicle_option_types, :cm_vehicle_type_option_types if table_exists?(:cm_vehicle_option_types)
5
+ rename_table :cm_option_value_vehicles, :cm_option_value_vehicle_types if table_exists?(:cm_option_value_vehicles)
6
+ rename_table :cm_vehicles, :cm_vehicle_types if table_exists?(:cm_vehicles) && !table_exists?(:cm_vehicle_types)
7
+
8
+ rename_column :cm_vehicle_type_option_types, :vehicle_id, :vehicle_type_id if column_exists?(:cm_vehicle_type_option_types, :vehicle_id)
9
+ rename_column :cm_option_value_vehicle_types, :vehicle_id, :vehicle_type_id if column_exists?(:cm_option_value_vehicle_types, :vehicle_id)
10
+
11
+ # 2. remove uncessary column for vehicle type.
12
+ # also rename code to name to make it more friendly. Meyhong also use name.
13
+ # rename vehicle_type to kind to avoid confusion with vehicle_type association
14
+ change_table :cm_vehicle_types do |t|
15
+ t.remove :license_plate if column_exists?(:cm_vehicle_types, :license_plate)
16
+ t.remove :allow_seat_selection if column_exists?(:cm_vehicle_types, :allow_seat_selection)
17
+ t.rename :code, :name if column_exists?(:cm_vehicle_types, :code)
18
+ t.rename :vehicle_type, :kind if column_exists?(:cm_vehicle_types, :vehicle_type)
19
+ end
20
+
21
+ # 3. new vehicle table
22
+ create_table :cm_vehicles, if_not_exists: true do |t|
23
+ t.string :license_plate
24
+ t.string :name
25
+ t.integer :kind
26
+ t.references :vendor, null: false, foreign_key: { to_table: :spree_vendors }
27
+ t.references :vehicle_type, null: false, foreign_key: { to_table: :cm_vehicle_types }
28
+ t.timestamps
29
+ end
30
+
31
+ # 4. drop existing vehicle assocation, and add vehicle/vehicle type assocation type to trip again.
32
+ remove_column :cm_trips, :vehicle_id if column_exists?(:cm_trips, :vehicle_id)
33
+ add_reference :cm_trips, :vehicle, null: true, foreign_key: { to_table: :cm_vehicles } unless column_exists?(:cm_trips, :vehicle_id)
34
+ add_reference :cm_trips, :vehicle_type, null: true, foreign_key: { to_table: :cm_vehicle_types } unless column_exists?(:cm_trips, :vehicle_type_id)
35
+ end
36
+ end
@@ -0,0 +1,6 @@
1
+ class AddNationalityGroupAndAgeGroupToCmSavedGuests < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_saved_guests, :nationality_group, :integer, default: 0, null: false, if_not_exists: true
4
+ add_column :cm_saved_guests, :age_group, :integer, default: 0, null: false, if_not_exists: true
5
+ end
6
+ end