harpiya_core 4.3.0.alpha

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 (764) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/LICENSE +26 -0
  4. data/Rakefile +15 -0
  5. data/app/assets/config/harpiya_core_manifest.js +1 -0
  6. data/app/assets/images/logo/harpiya_50.png +0 -0
  7. data/app/assets/images/noimage/large.png +0 -0
  8. data/app/assets/images/noimage/mini.png +0 -0
  9. data/app/assets/images/noimage/product.png +0 -0
  10. data/app/assets/images/noimage/small.png +0 -0
  11. data/app/assets/javascripts/harpiya.js +78 -0
  12. data/app/controllers/harpiya/base_controller.rb +14 -0
  13. data/app/controllers/harpiya/errors_controller.rb +11 -0
  14. data/app/finders/concerns/harpiya/product_filterable.rb +9 -0
  15. data/app/finders/harpiya/addresses/find.rb +6 -0
  16. data/app/finders/harpiya/base_finder.rb +14 -0
  17. data/app/finders/harpiya/countries/find.rb +39 -0
  18. data/app/finders/harpiya/credit_cards/find.rb +12 -0
  19. data/app/finders/harpiya/line_items/find_by_variant.rb +13 -0
  20. data/app/finders/harpiya/menus/find.rb +11 -0
  21. data/app/finders/harpiya/option_values/find_available.rb +20 -0
  22. data/app/finders/harpiya/orders/find_complete.rb +69 -0
  23. data/app/finders/harpiya/orders/find_current.rb +34 -0
  24. data/app/finders/harpiya/product_properties/find_available.rb +20 -0
  25. data/app/finders/harpiya/products/find.rb +242 -0
  26. data/app/finders/harpiya/taxons/find.rb +82 -0
  27. data/app/finders/harpiya/variants/option_types_finder.rb +21 -0
  28. data/app/finders/harpiya/variants/visible_finder.rb +22 -0
  29. data/app/helpers/harpiya/base_helper.rb +228 -0
  30. data/app/helpers/harpiya/currency_helper.rb +34 -0
  31. data/app/helpers/harpiya/locale_helper.rb +35 -0
  32. data/app/helpers/harpiya/mail_helper.rb +29 -0
  33. data/app/helpers/harpiya/products_helper.rb +182 -0
  34. data/app/mailers/harpiya/base_mailer.rb +46 -0
  35. data/app/mailers/harpiya/order_mailer.rb +26 -0
  36. data/app/mailers/harpiya/reimbursement_mailer.rb +12 -0
  37. data/app/mailers/harpiya/shipment_mailer.rb +12 -0
  38. data/app/mailers/harpiya/test_mailer.rb +8 -0
  39. data/app/models/concerns/harpiya/adjustment_source.rb +58 -0
  40. data/app/models/concerns/harpiya/calculated_adjustments.rb +35 -0
  41. data/app/models/concerns/harpiya/default_price.rb +36 -0
  42. data/app/models/concerns/harpiya/display_link.rb +34 -0
  43. data/app/models/concerns/harpiya/display_money.rb +32 -0
  44. data/app/models/concerns/harpiya/filter_param.rb +21 -0
  45. data/app/models/concerns/harpiya/named_type.rb +12 -0
  46. data/app/models/concerns/harpiya/number_as_param.rb +9 -0
  47. data/app/models/concerns/harpiya/product_scopes.rb +310 -0
  48. data/app/models/concerns/harpiya/ransackable_attributes.rb +23 -0
  49. data/app/models/concerns/harpiya/user_address.rb +51 -0
  50. data/app/models/concerns/harpiya/user_methods.rb +90 -0
  51. data/app/models/concerns/harpiya/user_payment_source.rb +21 -0
  52. data/app/models/concerns/harpiya/user_reporting.rb +22 -0
  53. data/app/models/concerns/harpiya/vat_price_calculation.rb +48 -0
  54. data/app/models/friendly_id/slug_decorator.rb +9 -0
  55. data/app/models/harpiya/ability.rb +93 -0
  56. data/app/models/harpiya/address.rb +245 -0
  57. data/app/models/harpiya/adjustable/adjuster/base.rb +25 -0
  58. data/app/models/harpiya/adjustable/adjuster/promotion.rb +41 -0
  59. data/app/models/harpiya/adjustable/adjuster/tax.rb +26 -0
  60. data/app/models/harpiya/adjustable/adjustments_updater.rb +51 -0
  61. data/app/models/harpiya/adjustable/promotion_accumulator.rb +78 -0
  62. data/app/models/harpiya/adjustment.rb +109 -0
  63. data/app/models/harpiya/app_configuration.rb +85 -0
  64. data/app/models/harpiya/app_dependencies.rb +87 -0
  65. data/app/models/harpiya/asset.rb +8 -0
  66. data/app/models/harpiya/asset/support/active_storage.rb +25 -0
  67. data/app/models/harpiya/base.rb +41 -0
  68. data/app/models/harpiya/calculator.rb +44 -0
  69. data/app/models/harpiya/calculator/default_tax.rb +58 -0
  70. data/app/models/harpiya/calculator/flat_percent_item_total.rb +22 -0
  71. data/app/models/harpiya/calculator/flat_rate.rb +20 -0
  72. data/app/models/harpiya/calculator/flexi_rate.rb +30 -0
  73. data/app/models/harpiya/calculator/percent_on_line_item.rb +22 -0
  74. data/app/models/harpiya/calculator/price_sack.rb +29 -0
  75. data/app/models/harpiya/calculator/returns/default_refund_amount.rb +40 -0
  76. data/app/models/harpiya/calculator/shipping/flat_percent_item_total.rb +22 -0
  77. data/app/models/harpiya/calculator/shipping/flat_rate.rb +18 -0
  78. data/app/models/harpiya/calculator/shipping/flexi_rate.rb +35 -0
  79. data/app/models/harpiya/calculator/shipping/per_item.rb +22 -0
  80. data/app/models/harpiya/calculator/shipping/price_sack.rb +28 -0
  81. data/app/models/harpiya/calculator/tiered_flat_rate.rb +38 -0
  82. data/app/models/harpiya/calculator/tiered_percent.rb +45 -0
  83. data/app/models/harpiya/classification.rb +15 -0
  84. data/app/models/harpiya/country.rb +58 -0
  85. data/app/models/harpiya/credit_card.rb +193 -0
  86. data/app/models/harpiya/customer_return.rb +68 -0
  87. data/app/models/harpiya/exchange.rb +50 -0
  88. data/app/models/harpiya/fulfilment_changer.rb +159 -0
  89. data/app/models/harpiya/gateway.rb +81 -0
  90. data/app/models/harpiya/gateway/bogus.rb +92 -0
  91. data/app/models/harpiya/gateway/bogus_simple.rb +24 -0
  92. data/app/models/harpiya/icon.rb +9 -0
  93. data/app/models/harpiya/image.rb +74 -0
  94. data/app/models/harpiya/image/configuration/active_storage.rb +53 -0
  95. data/app/models/harpiya/inventory_unit.rb +132 -0
  96. data/app/models/harpiya/legacy_user.rb +13 -0
  97. data/app/models/harpiya/line_item.rb +178 -0
  98. data/app/models/harpiya/log_entry.rb +17 -0
  99. data/app/models/harpiya/menu.rb +62 -0
  100. data/app/models/harpiya/menu_item.rb +76 -0
  101. data/app/models/harpiya/option_type.rb +42 -0
  102. data/app/models/harpiya/option_type_prototype.rb +9 -0
  103. data/app/models/harpiya/option_value.rb +37 -0
  104. data/app/models/harpiya/option_value_variant.rb +9 -0
  105. data/app/models/harpiya/order.rb +751 -0
  106. data/app/models/harpiya/order/address_book.rb +73 -0
  107. data/app/models/harpiya/order/checkout.rb +319 -0
  108. data/app/models/harpiya/order/currency_updater.rb +37 -0
  109. data/app/models/harpiya/order/payments.rb +74 -0
  110. data/app/models/harpiya/order/store_credit.rb +64 -0
  111. data/app/models/harpiya/order_inventory.rb +135 -0
  112. data/app/models/harpiya/order_merger.rb +66 -0
  113. data/app/models/harpiya/order_promotion.rb +16 -0
  114. data/app/models/harpiya/order_updater.rb +179 -0
  115. data/app/models/harpiya/payment.rb +285 -0
  116. data/app/models/harpiya/payment/gateway_options.rb +90 -0
  117. data/app/models/harpiya/payment/processing.rb +176 -0
  118. data/app/models/harpiya/payment_capture_event.rb +9 -0
  119. data/app/models/harpiya/payment_method.rb +87 -0
  120. data/app/models/harpiya/payment_method/check.rb +43 -0
  121. data/app/models/harpiya/payment_method/store_credit.rb +134 -0
  122. data/app/models/harpiya/preference.rb +5 -0
  123. data/app/models/harpiya/preferences/configuration.rb +68 -0
  124. data/app/models/harpiya/preferences/preferable.rb +133 -0
  125. data/app/models/harpiya/preferences/preferable_class_methods.rb +50 -0
  126. data/app/models/harpiya/preferences/scoped_store.rb +34 -0
  127. data/app/models/harpiya/preferences/store.rb +105 -0
  128. data/app/models/harpiya/price.rb +72 -0
  129. data/app/models/harpiya/product.rb +508 -0
  130. data/app/models/harpiya/product_option_type.rb +12 -0
  131. data/app/models/harpiya/product_promotion_rule.rb +9 -0
  132. data/app/models/harpiya/product_property.rb +43 -0
  133. data/app/models/harpiya/promotion.rb +241 -0
  134. data/app/models/harpiya/promotion/actions/create_adjustment.rb +26 -0
  135. data/app/models/harpiya/promotion/actions/create_item_adjustments.rb +33 -0
  136. data/app/models/harpiya/promotion/actions/create_line_items.rb +85 -0
  137. data/app/models/harpiya/promotion/actions/free_shipping.rb +19 -0
  138. data/app/models/harpiya/promotion/rules/country.rb +23 -0
  139. data/app/models/harpiya/promotion/rules/first_order.rb +38 -0
  140. data/app/models/harpiya/promotion/rules/item_total.rb +59 -0
  141. data/app/models/harpiya/promotion/rules/one_use_per_user.rb +23 -0
  142. data/app/models/harpiya/promotion/rules/option_value.rb +44 -0
  143. data/app/models/harpiya/promotion/rules/product.rb +67 -0
  144. data/app/models/harpiya/promotion/rules/taxon.rb +72 -0
  145. data/app/models/harpiya/promotion/rules/user.rb +31 -0
  146. data/app/models/harpiya/promotion/rules/user_logged_in.rb +18 -0
  147. data/app/models/harpiya/promotion_action.rb +25 -0
  148. data/app/models/harpiya/promotion_action_line_item.rb +9 -0
  149. data/app/models/harpiya/promotion_category.rb +6 -0
  150. data/app/models/harpiya/promotion_handler/cart.rb +41 -0
  151. data/app/models/harpiya/promotion_handler/coupon.rb +144 -0
  152. data/app/models/harpiya/promotion_handler/free_shipping.rb +31 -0
  153. data/app/models/harpiya/promotion_handler/page.rb +24 -0
  154. data/app/models/harpiya/promotion_handler/promotion_duplicator.rb +58 -0
  155. data/app/models/harpiya/promotion_rule.rb +44 -0
  156. data/app/models/harpiya/promotion_rule_taxon.rb +9 -0
  157. data/app/models/harpiya/promotion_rule_user.rb +9 -0
  158. data/app/models/harpiya/property.rb +50 -0
  159. data/app/models/harpiya/property_prototype.rb +9 -0
  160. data/app/models/harpiya/prototype.rb +14 -0
  161. data/app/models/harpiya/prototype_taxon.rb +9 -0
  162. data/app/models/harpiya/refund.rb +89 -0
  163. data/app/models/harpiya/refund_reason.rb +13 -0
  164. data/app/models/harpiya/reimbursement.rb +163 -0
  165. data/app/models/harpiya/reimbursement/credit.rb +25 -0
  166. data/app/models/harpiya/reimbursement/reimbursement_type_engine.rb +44 -0
  167. data/app/models/harpiya/reimbursement/reimbursement_type_validator.rb +15 -0
  168. data/app/models/harpiya/reimbursement_performer.rb +34 -0
  169. data/app/models/harpiya/reimbursement_tax_calculator.rb +37 -0
  170. data/app/models/harpiya/reimbursement_type.rb +20 -0
  171. data/app/models/harpiya/reimbursement_type/credit.rb +13 -0
  172. data/app/models/harpiya/reimbursement_type/exchange.rb +9 -0
  173. data/app/models/harpiya/reimbursement_type/original_payment.rb +13 -0
  174. data/app/models/harpiya/reimbursement_type/reimbursement_helpers.rb +63 -0
  175. data/app/models/harpiya/reimbursement_type/store_credit.rb +20 -0
  176. data/app/models/harpiya/return_authorization.rb +95 -0
  177. data/app/models/harpiya/return_authorization_reason.rb +7 -0
  178. data/app/models/harpiya/return_item.rb +261 -0
  179. data/app/models/harpiya/return_item/eligibility_validator/base_validator.rb +24 -0
  180. data/app/models/harpiya/return_item/eligibility_validator/default.rb +30 -0
  181. data/app/models/harpiya/return_item/eligibility_validator/inventory_shipped.rb +16 -0
  182. data/app/models/harpiya/return_item/eligibility_validator/no_reimbursements.rb +16 -0
  183. data/app/models/harpiya/return_item/eligibility_validator/order_completed.rb +16 -0
  184. data/app/models/harpiya/return_item/eligibility_validator/rma_required.rb +16 -0
  185. data/app/models/harpiya/return_item/eligibility_validator/time_since_purchase.rb +16 -0
  186. data/app/models/harpiya/return_item/exchange_variant_eligibility/same_option_value.rb +34 -0
  187. data/app/models/harpiya/return_item/exchange_variant_eligibility/same_product.rb +9 -0
  188. data/app/models/harpiya/returns_calculator.rb +7 -0
  189. data/app/models/harpiya/role.rb +8 -0
  190. data/app/models/harpiya/role_user.rb +6 -0
  191. data/app/models/harpiya/shipment.rb +404 -0
  192. data/app/models/harpiya/shipment_handler.rb +41 -0
  193. data/app/models/harpiya/shipping_calculator.rb +21 -0
  194. data/app/models/harpiya/shipping_category.rb +11 -0
  195. data/app/models/harpiya/shipping_method.rb +69 -0
  196. data/app/models/harpiya/shipping_method_category.rb +6 -0
  197. data/app/models/harpiya/shipping_method_zone.rb +6 -0
  198. data/app/models/harpiya/shipping_rate.rb +50 -0
  199. data/app/models/harpiya/state.rb +41 -0
  200. data/app/models/harpiya/state_change.rb +10 -0
  201. data/app/models/harpiya/stock/adjuster.rb +56 -0
  202. data/app/models/harpiya/stock/availability_validator.rb +29 -0
  203. data/app/models/harpiya/stock/content_item.rb +54 -0
  204. data/app/models/harpiya/stock/coordinator.rb +67 -0
  205. data/app/models/harpiya/stock/differentiator.rb +45 -0
  206. data/app/models/harpiya/stock/estimator.rb +74 -0
  207. data/app/models/harpiya/stock/inventory_unit_builder.rb +23 -0
  208. data/app/models/harpiya/stock/package.rb +112 -0
  209. data/app/models/harpiya/stock/packer.rb +52 -0
  210. data/app/models/harpiya/stock/prioritizer.rb +58 -0
  211. data/app/models/harpiya/stock/quantifier.rb +40 -0
  212. data/app/models/harpiya/stock/splitter/backordered.rb +19 -0
  213. data/app/models/harpiya/stock/splitter/base.rb +30 -0
  214. data/app/models/harpiya/stock/splitter/shipping_category.rb +31 -0
  215. data/app/models/harpiya/stock/splitter/weight.rb +84 -0
  216. data/app/models/harpiya/stock_item.rb +101 -0
  217. data/app/models/harpiya/stock_location.rb +138 -0
  218. data/app/models/harpiya/stock_movement.rb +38 -0
  219. data/app/models/harpiya/stock_transfer.rb +50 -0
  220. data/app/models/harpiya/store.rb +165 -0
  221. data/app/models/harpiya/store_credit.rb +249 -0
  222. data/app/models/harpiya/store_credit_category.rb +35 -0
  223. data/app/models/harpiya/store_credit_event.rb +38 -0
  224. data/app/models/harpiya/store_credit_type.rb +6 -0
  225. data/app/models/harpiya/store_product.rb +11 -0
  226. data/app/models/harpiya/tax_category.rb +18 -0
  227. data/app/models/harpiya/tax_rate.rb +119 -0
  228. data/app/models/harpiya/taxon.rb +110 -0
  229. data/app/models/harpiya/taxon_image.rb +18 -0
  230. data/app/models/harpiya/taxon_image/configuration/active_storage.rb +36 -0
  231. data/app/models/harpiya/taxonomy.rb +25 -0
  232. data/app/models/harpiya/variant.rb +347 -0
  233. data/app/models/harpiya/zone.rb +204 -0
  234. data/app/models/harpiya/zone_member.rb +12 -0
  235. data/app/paginators/harpiya/shared/paginate.rb +26 -0
  236. data/app/presenters/harpiya/filters/options_presenter.rb +27 -0
  237. data/app/presenters/harpiya/filters/price_presenter.rb +22 -0
  238. data/app/presenters/harpiya/filters/price_range_presenter.rb +29 -0
  239. data/app/presenters/harpiya/filters/properties_presenter.rb +23 -0
  240. data/app/presenters/harpiya/filters/property_presenter.rb +22 -0
  241. data/app/presenters/harpiya/filters/quantified_price_range_presenter.rb +44 -0
  242. data/app/presenters/harpiya/product_summary_presenter.rb +26 -0
  243. data/app/presenters/harpiya/variant_presenter.rb +80 -0
  244. data/app/presenters/harpiya/variants/option_types_presenter.rb +87 -0
  245. data/app/presenters/harpiya/variants/options_presenter.rb +49 -0
  246. data/app/services/harpiya/account/addresses/create.rb +24 -0
  247. data/app/services/harpiya/account/addresses/helper.rb +43 -0
  248. data/app/services/harpiya/account/addresses/update.rb +23 -0
  249. data/app/services/harpiya/account/create.rb +17 -0
  250. data/app/services/harpiya/account/update.rb +15 -0
  251. data/app/services/harpiya/build_localized_redirect_url.rb +101 -0
  252. data/app/services/harpiya/cart/add_item.rb +45 -0
  253. data/app/services/harpiya/cart/create.rb +21 -0
  254. data/app/services/harpiya/cart/estimate_shipping_rates.rb +39 -0
  255. data/app/services/harpiya/cart/recalculate.rb +32 -0
  256. data/app/services/harpiya/cart/remove_item.rb +39 -0
  257. data/app/services/harpiya/cart/remove_line_item.rb +18 -0
  258. data/app/services/harpiya/cart/set_quantity.rb +22 -0
  259. data/app/services/harpiya/cart/update.rb +37 -0
  260. data/app/services/harpiya/checkout/add_store_credit.rb +51 -0
  261. data/app/services/harpiya/checkout/advance.rb +18 -0
  262. data/app/services/harpiya/checkout/complete.rb +23 -0
  263. data/app/services/harpiya/checkout/get_shipping_rates.rb +52 -0
  264. data/app/services/harpiya/checkout/next.rb +13 -0
  265. data/app/services/harpiya/checkout/remove_store_credit.rb +17 -0
  266. data/app/services/harpiya/checkout/update.rb +43 -0
  267. data/app/services/harpiya/compare_line_items.rb +23 -0
  268. data/app/services/harpiya/generate_token.rb +20 -0
  269. data/app/sorters/harpiya/base_sorter.rb +35 -0
  270. data/app/sorters/harpiya/orders/sort.rb +6 -0
  271. data/app/sorters/harpiya/products/sort.rb +35 -0
  272. data/app/validators/db_maximum_length_validator.rb +20 -0
  273. data/app/validators/email_validator.rb +9 -0
  274. data/app/views/harpiya/errors/forbidden.html.erb +0 -0
  275. data/app/views/harpiya/errors/unauthorized.html.erb +0 -0
  276. data/app/views/harpiya/order_mailer/cancel_email.html.erb +24 -0
  277. data/app/views/harpiya/order_mailer/cancel_email.text.erb +12 -0
  278. data/app/views/harpiya/order_mailer/confirm_email.html.erb +23 -0
  279. data/app/views/harpiya/order_mailer/confirm_email.text.erb +12 -0
  280. data/app/views/harpiya/order_mailer/store_owner_notification_email.html.erb +23 -0
  281. data/app/views/harpiya/order_mailer/store_owner_notification_email.text.erb +12 -0
  282. data/app/views/harpiya/reimbursement_mailer/reimbursement_email.html.erb +56 -0
  283. data/app/views/harpiya/reimbursement_mailer/reimbursement_email.text.erb +24 -0
  284. data/app/views/harpiya/shared/_base_mailer_footer.html.erb +12 -0
  285. data/app/views/harpiya/shared/_base_mailer_header.html.erb +13 -0
  286. data/app/views/harpiya/shared/_base_mailer_stylesheets.html.erb +456 -0
  287. data/app/views/harpiya/shared/_error_messages.html.erb +11 -0
  288. data/app/views/harpiya/shared/_mailer_line_item.html.erb +16 -0
  289. data/app/views/harpiya/shared/_paths.html.erb +8 -0
  290. data/app/views/harpiya/shared/_purchased_items_table.html.erb +64 -0
  291. data/app/views/harpiya/shared/_purchased_items_table.text.erb +25 -0
  292. data/app/views/harpiya/shared/purchased_items_table/_adjustment.html.erb +13 -0
  293. data/app/views/harpiya/shared/purchased_items_table/_line_item.html.erb +27 -0
  294. data/app/views/harpiya/shared/purchased_items_table/_subtotal.html.erb +13 -0
  295. data/app/views/harpiya/shared/purchased_items_table/_total.html.erb +13 -0
  296. data/app/views/harpiya/shipment_mailer/shipped_email.html.erb +36 -0
  297. data/app/views/harpiya/shipment_mailer/shipped_email.text.erb +17 -0
  298. data/app/views/harpiya/test_mailer/test_email.html.erb +40 -0
  299. data/app/views/harpiya/test_mailer/test_email.text.erb +4 -0
  300. data/app/views/layouts/harpiya/base_mailer.html.erb +46 -0
  301. data/config/initializers/active_storage.rb +7 -0
  302. data/config/initializers/assets.rb +1 -0
  303. data/config/initializers/friendly_id.rb +7 -0
  304. data/config/initializers/inflections.rb +3 -0
  305. data/config/initializers/rails61_fixes.rb +3 -0
  306. data/config/initializers/state_machine.rb +37 -0
  307. data/config/locales/en.yml +1864 -0
  308. data/config/locales/tr.yml +1864 -0
  309. data/config/routes.rb +6 -0
  310. data/db/default/harpiya/countries.rb +24 -0
  311. data/db/default/harpiya/default_reimbursement_type.rb +1 -0
  312. data/db/default/harpiya/roles.rb +2 -0
  313. data/db/default/harpiya/states.rb +49 -0
  314. data/db/default/harpiya/store_credit_categories.rb +1 -0
  315. data/db/default/harpiya/stores.rb +21 -0
  316. data/db/default/harpiya/zones.rb +29 -0
  317. data/db/migrate/20120831092320_harpiya_one_two.rb +481 -0
  318. data/db/migrate/20120831092359_harpiya_promo_one_two.rb +45 -0
  319. data/db/migrate/20120905145253_add_tax_rate_label.rb +5 -0
  320. data/db/migrate/20120905151823_add_toggle_tax_rate_display.rb +5 -0
  321. data/db/migrate/20120929093553_remove_unused_preference_columns.rb +8 -0
  322. data/db/migrate/20121009142519_add_lock_version_to_variant.rb +5 -0
  323. data/db/migrate/20121010142909_add_states_required_to_countries.rb +5 -0
  324. data/db/migrate/20121012071449_add_on_demand_to_product_and_variant.rb +6 -0
  325. data/db/migrate/20121017010007_remove_not_null_constraint_from_products_on_hand.rb +11 -0
  326. data/db/migrate/20121031162139_split_prices_from_variants.rb +31 -0
  327. data/db/migrate/20121107003422_remove_not_null_from_harpiya_prices_amount.rb +9 -0
  328. data/db/migrate/20121107184631_add_currency_to_line_items.rb +5 -0
  329. data/db/migrate/20121107194006_add_currency_to_orders.rb +5 -0
  330. data/db/migrate/20121109173623_add_cost_currency_to_variants.rb +5 -0
  331. data/db/migrate/20121111231553_remove_display_on_from_payment_methods.rb +5 -0
  332. data/db/migrate/20121124203911_add_position_to_taxonomies.rb +5 -0
  333. data/db/migrate/20121126040517_add_last_ip_to_harpiya_orders.rb +5 -0
  334. data/db/migrate/20121213162028_add_state_to_harpiya_adjustments.rb +6 -0
  335. data/db/migrate/20130114053446_add_display_on_to_harpiya_payment_methods.rb +9 -0
  336. data/db/migrate/20130120201805_add_position_to_product_properties.harpiya.rb +6 -0
  337. data/db/migrate/20130203232234_add_identifier_to_harpiya_payments.rb +5 -0
  338. data/db/migrate/20130207155350_add_order_id_index_to_payments.rb +9 -0
  339. data/db/migrate/20130208032954_add_primary_to_harpiya_products_taxons.rb +5 -0
  340. data/db/migrate/20130211190146_create_harpiya_stock_items.rb +14 -0
  341. data/db/migrate/20130211191120_create_harpiya_stock_locations.rb +11 -0
  342. data/db/migrate/20130213191427_create_default_stock.rb +33 -0
  343. data/db/migrate/20130222032153_add_order_id_index_to_shipments.rb +5 -0
  344. data/db/migrate/20130226032817_change_meta_description_on_harpiya_products_to_text.rb +5 -0
  345. data/db/migrate/20130226191231_add_stock_location_id_to_harpiya_shipments.rb +5 -0
  346. data/db/migrate/20130227143905_add_pending_to_inventory_unit.rb +6 -0
  347. data/db/migrate/20130228164411_remove_on_demand_from_product_and_variant.rb +6 -0
  348. data/db/migrate/20130228210442_create_shipping_method_zone.rb +21 -0
  349. data/db/migrate/20130301162745_remove_shipping_category_id_from_shipping_method.rb +5 -0
  350. data/db/migrate/20130301162924_create_shipping_method_categories.rb +13 -0
  351. data/db/migrate/20130301205200_add_tracking_url_to_harpiya_shipping_methods.rb +5 -0
  352. data/db/migrate/20130304162240_create_harpiya_shipping_rates.rb +24 -0
  353. data/db/migrate/20130304192936_remove_category_match_attributes_from_shipping_method.rb +7 -0
  354. data/db/migrate/20130305143310_create_stock_movements.rb +12 -0
  355. data/db/migrate/20130306181701_add_address_fields_to_stock_location.rb +22 -0
  356. data/db/migrate/20130306191917_add_active_field_to_stock_locations.rb +5 -0
  357. data/db/migrate/20130306195650_add_backorderable_to_stock_item.rb +5 -0
  358. data/db/migrate/20130307161754_add_default_quantity_to_stock_movement.rb +5 -0
  359. data/db/migrate/20130318151756_add_source_and_destination_to_stock_movements.rb +8 -0
  360. data/db/migrate/20130319062004_change_orders_total_precision.rb +8 -0
  361. data/db/migrate/20130319063911_change_harpiya_payments_amount_precision.rb +7 -0
  362. data/db/migrate/20130319064308_change_harpiya_return_authorization_amount_precision.rb +7 -0
  363. data/db/migrate/20130319082943_change_adjustments_amount_precision.rb +7 -0
  364. data/db/migrate/20130319183250_add_originator_to_stock_movement.rb +7 -0
  365. data/db/migrate/20130319190507_drop_source_and_destination_from_stock_movement.rb +15 -0
  366. data/db/migrate/20130325163316_migrate_inventory_unit_sold_to_on_hand.rb +9 -0
  367. data/db/migrate/20130326175857_add_stock_location_to_rma.rb +5 -0
  368. data/db/migrate/20130328130308_update_shipment_state_for_canceled_orders.rb +15 -0
  369. data/db/migrate/20130328195253_add_seo_metas_to_taxons.rb +9 -0
  370. data/db/migrate/20130329134939_remove_stock_item_and_variant_lock.rb +14 -0
  371. data/db/migrate/20130413230529_add_name_to_harpiya_credit_cards.rb +5 -0
  372. data/db/migrate/20130414000512_update_name_fields_on_harpiya_credit_cards.rb +13 -0
  373. data/db/migrate/20130417120034_add_index_to_source_columns_on_adjustments.rb +5 -0
  374. data/db/migrate/20130417120035_update_adjustment_states.rb +16 -0
  375. data/db/migrate/20130417123427_add_shipping_rates_to_shipments.rb +15 -0
  376. data/db/migrate/20130418125341_create_harpiya_stock_transfers.rb +14 -0
  377. data/db/migrate/20130423110707_drop_products_count_on_hand.rb +5 -0
  378. data/db/migrate/20130423223847_set_default_shipping_rate_cost.rb +5 -0
  379. data/db/migrate/20130509115210_add_number_to_stock_transfer.rb +23 -0
  380. data/db/migrate/20130514151929_add_sku_index_to_harpiya_variants.rb +5 -0
  381. data/db/migrate/20130515180736_add_backorderable_default_to_harpiya_stock_location.rb +5 -0
  382. data/db/migrate/20130516151222_add_propage_all_variants_to_harpiya_stock_location.rb +5 -0
  383. data/db/migrate/20130611054351_rename_shipping_methods_zones_to_harpiya_shipping_methods_zones.rb +5 -0
  384. data/db/migrate/20130611185927_add_user_id_index_to_harpiya_orders.rb +5 -0
  385. data/db/migrate/20130618041418_add_updated_at_to_harpiya_countries.rb +9 -0
  386. data/db/migrate/20130619012236_add_updated_at_to_harpiya_states.rb +9 -0
  387. data/db/migrate/20130626232741_add_cvv_result_code_and_cvv_result_message_to_harpiya_payments.rb +6 -0
  388. data/db/migrate/20130628021056_add_unique_index_to_permalink_on_harpiya_products.rb +5 -0
  389. data/db/migrate/20130628022817_add_unique_index_to_orders_shipments_and_stock_transfers.rb +7 -0
  390. data/db/migrate/20130708052307_add_deleted_at_to_harpiya_tax_rates.rb +5 -0
  391. data/db/migrate/20130711200933_remove_lock_version_from_inventory_units.rb +6 -0
  392. data/db/migrate/20130718042445_add_cost_price_to_line_item.rb +5 -0
  393. data/db/migrate/20130718233855_set_backorderable_to_default_to_false.rb +6 -0
  394. data/db/migrate/20130725031716_add_created_by_id_to_harpiya_orders.rb +5 -0
  395. data/db/migrate/20130729214043_index_completed_at_on_harpiya_orders.rb +5 -0
  396. data/db/migrate/20130802014537_add_tax_category_id_to_harpiya_line_items.rb +5 -0
  397. data/db/migrate/20130802022321_migrate_tax_categories_to_line_items.rb +10 -0
  398. data/db/migrate/20130806022521_drop_harpiya_mail_methods.rb +12 -0
  399. data/db/migrate/20130806145853_set_default_stock_location_on_shipments.rb +8 -0
  400. data/db/migrate/20130807024301_upgrade_adjustments.rb +46 -0
  401. data/db/migrate/20130807024302_rename_adjustment_fields.rb +20 -0
  402. data/db/migrate/20130809164245_add_admin_name_column_to_harpiya_shipping_methods.rb +5 -0
  403. data/db/migrate/20130809164330_add_admin_name_column_to_harpiya_stock_locations.rb +5 -0
  404. data/db/migrate/20130813004002_add_shipment_total_to_harpiya_orders.rb +5 -0
  405. data/db/migrate/20130813140619_expand_order_number_size.rb +9 -0
  406. data/db/migrate/20130813232134_rename_activators_to_promotions.rb +5 -0
  407. data/db/migrate/20130815000406_add_adjustment_total_to_line_items.rb +5 -0
  408. data/db/migrate/20130815024413_add_adjustment_total_to_shipments.rb +5 -0
  409. data/db/migrate/20130826062534_add_depth_to_harpiya_taxons.rb +16 -0
  410. data/db/migrate/20130828234942_add_tax_total_to_line_items_shipments_and_orders.rb +8 -0
  411. data/db/migrate/20130830001033_add_shipping_category_to_shipping_methods_and_products.rb +15 -0
  412. data/db/migrate/20130830001159_migrate_old_shipping_calculators.rb +19 -0
  413. data/db/migrate/20130903183026_add_code_to_harpiya_promotion_rules.rb +5 -0
  414. data/db/migrate/20130909115621_change_states_required_for_countries.rb +9 -0
  415. data/db/migrate/20130915032339_add_deleted_at_to_harpiya_stock_items.rb +5 -0
  416. data/db/migrate/20130917024658_remove_promotions_event_name_field.rb +5 -0
  417. data/db/migrate/20130924040529_add_promo_total_to_line_items_and_shipments_and_orders.rb +7 -0
  418. data/db/migrate/20131001013410_remove_unused_credit_card_fields.rb +16 -0
  419. data/db/migrate/20131026154747_add_track_inventory_to_variant.rb +5 -0
  420. data/db/migrate/20131107132123_add_tax_category_to_variants.rb +6 -0
  421. data/db/migrate/20131113035136_add_channel_to_harpiya_orders.rb +5 -0
  422. data/db/migrate/20131118043959_add_included_to_adjustments.rb +5 -0
  423. data/db/migrate/20131118050234_rename_tax_total_fields.rb +11 -0
  424. data/db/migrate/20131118183431_add_line_item_id_to_harpiya_inventory_units.rb +21 -0
  425. data/db/migrate/20131120234456_add_updated_at_to_variants.rb +5 -0
  426. data/db/migrate/20131127001002_add_position_to_classifications.rb +5 -0
  427. data/db/migrate/20131211112807_create_harpiya_orders_promotions.rb +8 -0
  428. data/db/migrate/20131211192741_unique_shipping_method_categories.rb +24 -0
  429. data/db/migrate/20131218054603_add_item_count_to_harpiya_orders.rb +5 -0
  430. data/db/migrate/20140106065820_remove_value_type_from_harpiya_preferences.rb +8 -0
  431. data/db/migrate/20140106224208_rename_permalink_to_slug_for_products.rb +5 -0
  432. data/db/migrate/20140120160805_add_index_to_variant_id_and_currency_on_prices.rb +5 -0
  433. data/db/migrate/20140124023232_rename_activator_id_in_rules_and_actions_to_promotion_id.rb +6 -0
  434. data/db/migrate/20140129024326_add_deleted_at_to_harpiya_prices.rb +5 -0
  435. data/db/migrate/20140203161722_add_approver_id_and_approved_at_to_orders.rb +6 -0
  436. data/db/migrate/20140204115338_add_confirmation_delivered_to_harpiya_orders.rb +5 -0
  437. data/db/migrate/20140204192230_add_auto_capture_to_payment_methods.rb +5 -0
  438. data/db/migrate/20140205120320_create_harpiya_payment_capture_events.rb +12 -0
  439. data/db/migrate/20140205144710_add_uncaptured_amount_to_payments.rb +5 -0
  440. data/db/migrate/20140205181631_default_variant_weight_to_zero.rb +11 -0
  441. data/db/migrate/20140207085910_add_tax_category_id_to_shipping_methods.rb +5 -0
  442. data/db/migrate/20140207093021_add_tax_rate_id_to_shipping_rates.rb +5 -0
  443. data/db/migrate/20140211040159_add_pre_tax_amount_to_line_items_and_shipments.rb +6 -0
  444. data/db/migrate/20140213184916_add_more_indexes.rb +13 -0
  445. data/db/migrate/20140219060952_add_considered_risky_to_orders.rb +5 -0
  446. data/db/migrate/20140227112348_add_preference_store_to_everything.rb +8 -0
  447. data/db/migrate/20140307235515_add_user_id_to_harpiya_credit_cards.rb +13 -0
  448. data/db/migrate/20140309023735_migrate_old_preferences.rb +27 -0
  449. data/db/migrate/20140309024355_create_harpiya_stores.rb +25 -0
  450. data/db/migrate/20140309033438_create_store_from_preferences.rb +42 -0
  451. data/db/migrate/20140315053743_add_timestamps_to_harpiya_assets.rb +6 -0
  452. data/db/migrate/20140318191500_create_harpiya_taxons_promotion_rules.rb +8 -0
  453. data/db/migrate/20140331100557_add_additional_store_fields.rb +8 -0
  454. data/db/migrate/20140410141842_add_many_missing_indexes.rb +18 -0
  455. data/db/migrate/20140410150358_correct_some_polymorphic_index_and_add_more_missing.rb +66 -0
  456. data/db/migrate/20140415041315_add_user_id_created_by_id_index_to_order.rb +5 -0
  457. data/db/migrate/20140508151342_change_harpiya_price_amount_precision.rb +8 -0
  458. data/db/migrate/20140518174634_add_token_to_harpiya_orders.rb +5 -0
  459. data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +29 -0
  460. data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +10 -0
  461. data/db/migrate/20140604135309_drop_credit_card_first_name_and_last_name.rb +6 -0
  462. data/db/migrate/20140609201656_add_deleted_at_to_harpiya_promotion_actions.rb +6 -0
  463. data/db/migrate/20140616202624_remove_uncaptured_amount_from_harpiya_payments.rb +5 -0
  464. data/db/migrate/20140625214618_create_harpiya_refunds.rb +12 -0
  465. data/db/migrate/20140702140656_create_harpiya_return_authorization_inventory_unit.rb +12 -0
  466. data/db/migrate/20140707125621_rename_return_authorization_inventory_unit_to_return_items.rb +5 -0
  467. data/db/migrate/20140709160534_backfill_line_item_pre_tax_amount.rb +10 -0
  468. data/db/migrate/20140710041921_recreate_harpiya_return_authorizations.rb +55 -0
  469. data/db/migrate/20140710181204_add_amount_fields_to_return_items.rb +7 -0
  470. data/db/migrate/20140710190048_drop_return_authorization_amount.rb +5 -0
  471. data/db/migrate/20140713140455_create_harpiya_return_authorization_reasons.rb +28 -0
  472. data/db/migrate/20140713140527_create_harpiya_refund_reasons.rb +14 -0
  473. data/db/migrate/20140713142214_rename_return_authorization_reason.rb +5 -0
  474. data/db/migrate/20140715182625_create_harpiya_promotion_categories.rb +11 -0
  475. data/db/migrate/20140716204111_drop_received_at_on_return_items.rb +9 -0
  476. data/db/migrate/20140716212330_add_reception_and_acceptance_status_to_return_items.rb +6 -0
  477. data/db/migrate/20140717155155_create_default_refund_reason.rb +9 -0
  478. data/db/migrate/20140717185932_add_default_to_harpiya_stock_locations.rb +7 -0
  479. data/db/migrate/20140718133010_create_harpiya_customer_returns.rb +9 -0
  480. data/db/migrate/20140718133349_add_customer_return_id_to_return_item.rb +6 -0
  481. data/db/migrate/20140718195325_create_friendly_id_slugs.rb +15 -0
  482. data/db/migrate/20140723004419_rename_harpiya_refund_return_authorization_id.rb +5 -0
  483. data/db/migrate/20140723152808_increase_return_item_pre_tax_amount_precision.rb +13 -0
  484. data/db/migrate/20140723214541_copy_product_slugs_to_slug_history.rb +15 -0
  485. data/db/migrate/20140725131539_create_harpiya_reimbursements.rb +21 -0
  486. data/db/migrate/20140728225422_add_promotionable_to_harpiya_products.rb +5 -0
  487. data/db/migrate/20140729133613_add_exchange_inventory_unit_foreign_keys.rb +7 -0
  488. data/db/migrate/20140730155938_add_acceptance_status_errors_to_return_item.rb +5 -0
  489. data/db/migrate/20140731150017_create_harpiya_reimbursement_types.rb +20 -0
  490. data/db/migrate/20140804185157_add_default_to_shipment_cost.rb +10 -0
  491. data/db/migrate/20140805171035_add_default_to_harpiya_credit_cards.rb +5 -0
  492. data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +10 -0
  493. data/db/migrate/20140806144901_add_type_to_reimbursement_type.rb +9 -0
  494. data/db/migrate/20140808184039_create_harpiya_reimbursement_credits.rb +10 -0
  495. data/db/migrate/20140827170513_add_meta_title_to_harpiya_products.rb +7 -0
  496. data/db/migrate/20140911173301_add_kind_to_zone.rb +11 -0
  497. data/db/migrate/20140924164824_add_code_to_harpiya_tax_categories.rb +5 -0
  498. data/db/migrate/20140927193717_default_pre_tax_amount_should_be_zero.rb +6 -0
  499. data/db/migrate/20141002191113_add_code_to_harpiya_shipping_methods.rb +5 -0
  500. data/db/migrate/20141007230328_add_cancel_audit_fields_to_harpiya_orders.rb +6 -0
  501. data/db/migrate/20141009204607_add_store_id_to_orders.rb +8 -0
  502. data/db/migrate/20141012083513_create_harpiya_taxons_prototypes.rb +8 -0
  503. data/db/migrate/20141021194502_add_state_lock_version_to_order.rb +5 -0
  504. data/db/migrate/20141023005240_add_counter_cache_from_harpiya_variants_to_harpiya_stock_items.rb +8 -0
  505. data/db/migrate/20141101231208_fix_adjustment_order_presence.rb +13 -0
  506. data/db/migrate/20141105213646_update_classifications_positions.rb +9 -0
  507. data/db/migrate/20141120135441_add_guest_token_index_to_harpiya_orders.rb +5 -0
  508. data/db/migrate/20141215232040_remove_token_permissions_table.rb +6 -0
  509. data/db/migrate/20141215235502_remove_extra_products_slug_index.rb +5 -0
  510. data/db/migrate/20141217215630_update_product_slug_index.rb +6 -0
  511. data/db/migrate/20141218025915_rename_identifier_to_number_for_payment.rb +5 -0
  512. data/db/migrate/20150118210639_create_harpiya_store_credits.rb +24 -0
  513. data/db/migrate/20150118211500_create_harpiya_store_credit_categories.rb +8 -0
  514. data/db/migrate/20150118212051_create_harpiya_store_credit_events.rb +17 -0
  515. data/db/migrate/20150118212101_create_harpiya_store_credit_types.rb +10 -0
  516. data/db/migrate/20150121022521_remove_environment_from_payment_method.rb +6 -0
  517. data/db/migrate/20150122145607_add_resellable_to_return_items.rb +5 -0
  518. data/db/migrate/20150122202432_add_code_to_harpiya_promotion_categories.rb +5 -0
  519. data/db/migrate/20150128032538_remove_environment_from_tracker.rb +8 -0
  520. data/db/migrate/20150128060325_remove_harpiya_configurations.rb +16 -0
  521. data/db/migrate/20150216173445_add_index_to_harpiya_stock_items_variant_id.rb +13 -0
  522. data/db/migrate/20150309161154_ensure_payments_have_numbers.rb +13 -0
  523. data/db/migrate/20150314013438_add_missing_indexes_on_harpiya_tables.rb +67 -0
  524. data/db/migrate/20150317174308_remove_duplicated_indexes_from_multi_columns.rb +18 -0
  525. data/db/migrate/20150324104002_remove_user_index_from_harpiya_state_changes.rb +14 -0
  526. data/db/migrate/20150515211137_fix_adjustment_order_id.rb +70 -0
  527. data/db/migrate/20150522071831_add_position_to_harpiya_payment_methods.rb +5 -0
  528. data/db/migrate/20150522181728_add_deleted_at_to_friendly_id_slugs.rb +6 -0
  529. data/db/migrate/20150609093816_increase_scale_on_pre_tax_amounts.rb +16 -0
  530. data/db/migrate/20150626181949_add_taxable_adjustment_total_to_line_item.rb +19 -0
  531. data/db/migrate/20150627090949_migrate_payment_methods_display.rb +12 -0
  532. data/db/migrate/20150707204155_enable_acts_as_paranoid_on_calculators.rb +6 -0
  533. data/db/migrate/20150714154102_harpiya_payment_method_store_credits.rb +12 -0
  534. data/db/migrate/20150726141425_rename_has_and_belongs_to_associations_to_model_names.rb +18 -0
  535. data/db/migrate/20150727191614_harpiya_store_credit_types.rb +11 -0
  536. data/db/migrate/20150819154308_add_discontinued_to_products_and_variants.rb +68 -0
  537. data/db/migrate/20151220072838_remove_shipping_method_id_from_harpiya_orders.rb +13 -0
  538. data/db/migrate/20160207191757_add_id_column_to_earlier_habtm_tables.rb +16 -0
  539. data/db/migrate/20160219165458_add_indexes.rb +14 -0
  540. data/db/migrate/20160509064646_remove_counter_cache_from_harpiya_variants_to_harpiya_stock_items.rb +10 -0
  541. data/db/migrate/20160608090604_add_zipcode_required_to_harpiya_countries.rb +7 -0
  542. data/db/migrate/20161014145148_add_created_at_to_variant.rb +8 -0
  543. data/db/migrate/20161014152814_add_null_false_to_harpiya_variants_timestamps.rb +6 -0
  544. data/db/migrate/20161125065505_add_quantity_to_inventory_units.rb +5 -0
  545. data/db/migrate/20170119122701_add_original_return_item_id_to_harpiya_inventory_units.rb +29 -0
  546. data/db/migrate/20170315152755_add_unique_index_on_number_to_harpiya_orders.rb +16 -0
  547. data/db/migrate/20170316154338_add_unique_index_on_number_to_harpiya_stock_transfer.rb +16 -0
  548. data/db/migrate/20170316205511_add_unique_index_on_number_to_harpiya_shipment.rb +16 -0
  549. data/db/migrate/20170320134043_add_unique_index_on_number_to_harpiya_payments.rb +17 -0
  550. data/db/migrate/20170320142750_add_unique_index_on_number_to_harpiya_return_authorizations.rb +16 -0
  551. data/db/migrate/20170320145040_add_unique_index_on_number_to_harpiya_customer_returns.rb +16 -0
  552. data/db/migrate/20170320145518_add_unique_index_on_number_to_harpiya_reimbursements.rb +16 -0
  553. data/db/migrate/20170323151450_add_missing_unique_indexes_for_unique_attributes.rb +37 -0
  554. data/db/migrate/20170329110859_add_index_on_stock_location_to_harpiya_customer_returns.rb +5 -0
  555. data/db/migrate/20170329113917_add_index_on_prototype_to_harpiya_option_type_prototype.rb +19 -0
  556. data/db/migrate/20170330082155_add_indexes_to_harpiya_option_value_variant.rb +19 -0
  557. data/db/migrate/20170330132215_add_index_on_promotion_id_to_order_promotions.rb +5 -0
  558. data/db/migrate/20170331101758_add_indexes_for_property_prototype.rb +20 -0
  559. data/db/migrate/20170331103334_add_index_for_prototype_id_to_prototype_taxons.rb +5 -0
  560. data/db/migrate/20170331110454_add_indexes_to_refunds.rb +6 -0
  561. data/db/migrate/20170331111757_add_indexes_to_reimbursement_credits.rb +6 -0
  562. data/db/migrate/20170331115246_add_indexes_to_return_authorizations.rb +6 -0
  563. data/db/migrate/20170331120125_add_indexes_to_return_items.rb +11 -0
  564. data/db/migrate/20170331121725_add_index_to_role_users.rb +18 -0
  565. data/db/migrate/20170331123625_add_index_to_shipping_method_categories.rb +5 -0
  566. data/db/migrate/20170331123832_add_index_to_shipping_method_zones.rb +20 -0
  567. data/db/migrate/20170331124251_add_index_to_harpiya_shipping_rates.rb +6 -0
  568. data/db/migrate/20170331124513_add_index_to_harpiya_stock_items.rb +5 -0
  569. data/db/migrate/20170331124924_add_index_to_harpiya_stock_movement.rb +5 -0
  570. data/db/migrate/20170413211707_change_indexes_on_friendly_id_slugs.rb +10 -0
  571. data/db/migrate/20170722102643_add_analytics_kind_to_harpiya_trackers.rb +5 -0
  572. data/db/migrate/20170727103056_rename_tracker_kind_field.rb +5 -0
  573. data/db/migrate/20171004223836_remove_icon_from_taxons.rb +8 -0
  574. data/db/migrate/20180222133746_add_unique_index_on_harpiya_promotions_code.rb +6 -0
  575. data/db/migrate/20180613080857_rename_guest_token_to_token_in_orders.rb +5 -0
  576. data/db/migrate/20180915160001_add_timestamps_to_harpiya_prices.rb +12 -0
  577. data/db/migrate/20181024100754_add_deleted_at_to_harpiya_credit_cards.rb +6 -0
  578. data/db/migrate/20190305121659_add_iso_and_iso3_validation_on_presence_and_uniqueness.rb +18 -0
  579. data/db/migrate/20190523092729_add_user_id_and_deleted_at_to_harpiya_addresses.rb +12 -0
  580. data/db/migrate/20191005121504_add_store_id_to_payment_methods.rb +7 -0
  581. data/db/migrate/20191016134113_add_deafult_value_for_store_default_currency.rb +5 -0
  582. data/db/migrate/20191017121054_add_supported_currencies_to_store.rb +11 -0
  583. data/db/migrate/20200102141311_add_social_to_harpiya_stores.rb +10 -0
  584. data/db/migrate/20200212144523_add_hide_from_nav_to_taxons.rb +5 -0
  585. data/db/migrate/20200308210757_add_default_locale_to_harpiya_store.rb +7 -0
  586. data/db/migrate/20200310145140_add_customer_support_email_to_harpiya_store.rb +7 -0
  587. data/db/migrate/20200421095017_add_compare_at_amount_to_harpiya_prices.rb +7 -0
  588. data/db/migrate/20200423123001_add_default_country_id_to_harpiya_store.rb +9 -0
  589. data/db/migrate/20200430072209_add_footer_fields_to_harpiya_stores.rb +8 -0
  590. data/db/migrate/20200513154939_add_show_property_to_harpiya_product_properties.rb +5 -0
  591. data/db/migrate/20200607161221_add_store_owner_order_notification_delivered_to_harpiya_orders.rb +7 -0
  592. data/db/migrate/20200607161222_add_new_order_notifications_email_to_harpiya_stores.rb +7 -0
  593. data/db/migrate/20200610113542_add_label_to_harpiya_addresses.rb +5 -0
  594. data/db/migrate/20200826075557_add_unique_index_on_taxon_id_and_product_id_to_harpiya_products_taxons.rb +5 -0
  595. data/db/migrate/20201006110150_add_checkout_zone_field_to_store.rb +12 -0
  596. data/db/migrate/20201012091259_add_filterable_column_to_harpiya_option_types.rb +10 -0
  597. data/db/migrate/20201013084504_add_seo_robots_to_harpiya_stores.rb +5 -0
  598. data/db/migrate/20201023152810_add_filterable_to_harpiya_properties.rb +8 -0
  599. data/db/migrate/20201127084048_add_default_country_kind_to_harpiya_zones.rb +5 -0
  600. data/db/migrate/20210112193440_remove_contact_email_from_harpiya_stores.rb +5 -0
  601. data/db/migrate/20210114182625_create_harpiya_payment_methods_stores.rb +10 -0
  602. data/db/migrate/20210114220232_migrate_data_payment_methods_stores.rb +15 -0
  603. data/db/migrate/20210117112551_remove_store_id_from_harpiya_payment_methods.rb +5 -0
  604. data/db/migrate/20210120142527_ensure_default_locale_in_harpiya_stores.rb +5 -0
  605. data/db/migrate/20210205211040_add_supported_locales_to_harpiya_stores.rb +11 -0
  606. data/db/migrate/20210215202602_migrate_harpiya_i18n_globalize_config.rb +22 -0
  607. data/db/migrate/20210407200948_create_harpiya_menus.rb +16 -0
  608. data/db/migrate/20210408092939_create_harpiya_menu_items.rb +31 -0
  609. data/db/migrate/20210504163720_add_filter_param_to_harpiya_product_properties.rb +8 -0
  610. data/db/migrate/20210505114659_add_filter_param_to_harpiya_properties.rb +8 -0
  611. data/db/migrate/20210527094055_create_harpiya_products_stores.rb +29 -0
  612. data/db/migrate/20210608045519_ensure_store_default_country_is_set.rb +5 -0
  613. data/db/seeds.rb +5 -0
  614. data/harpiya_core.gemspec +59 -0
  615. data/lib/friendly_id/slug_rails5_patch.rb +11 -0
  616. data/lib/generators/harpiya/custom_user/custom_user_generator.rb +51 -0
  617. data/lib/generators/harpiya/custom_user/templates/authentication_helpers.rb.tt +36 -0
  618. data/lib/generators/harpiya/custom_user/templates/initializer.rb.tt +1 -0
  619. data/lib/generators/harpiya/custom_user/templates/migration.rb.tt +7 -0
  620. data/lib/generators/harpiya/dummy/dummy_generator.rb +154 -0
  621. data/lib/generators/harpiya/dummy/templates/initializers/bullet.rb +5 -0
  622. data/lib/generators/harpiya/dummy/templates/initializers/devise.rb +3 -0
  623. data/lib/generators/harpiya/dummy/templates/rails/application.rb +10 -0
  624. data/lib/generators/harpiya/dummy/templates/rails/boot.rb +6 -0
  625. data/lib/generators/harpiya/dummy/templates/rails/database.yml +80 -0
  626. data/lib/generators/harpiya/dummy/templates/rails/routes.rb +2 -0
  627. data/lib/generators/harpiya/dummy/templates/rails/script/rails +6 -0
  628. data/lib/generators/harpiya/dummy/templates/rails/test.rb +38 -0
  629. data/lib/generators/harpiya/dummy_model/dummy_model_generator.rb +23 -0
  630. data/lib/generators/harpiya/dummy_model/templates/migration.rb.tt +10 -0
  631. data/lib/generators/harpiya/dummy_model/templates/model.rb.tt +6 -0
  632. data/lib/generators/harpiya/install/install_generator.rb +249 -0
  633. data/lib/generators/harpiya/install/templates/config/initializers/harpiya.rb +31 -0
  634. data/lib/generators/harpiya/mailers_preview/mailers_preview_generator.rb +23 -0
  635. data/lib/generators/harpiya/mailers_preview/templates/mailers/previews/order_preview.rb +13 -0
  636. data/lib/generators/harpiya/mailers_preview/templates/mailers/previews/reimbursement_preview.rb +5 -0
  637. data/lib/generators/harpiya/mailers_preview/templates/mailers/previews/shipment_preview.rb +5 -0
  638. data/lib/generators/harpiya/mailers_preview/templates/mailers/previews/user_preview.rb +11 -0
  639. data/lib/harpiya/core.rb +116 -0
  640. data/lib/harpiya/core/components.rb +17 -0
  641. data/lib/harpiya/core/controller_helpers/auth.rb +93 -0
  642. data/lib/harpiya/core/controller_helpers/common.rb +65 -0
  643. data/lib/harpiya/core/controller_helpers/currency.rb +54 -0
  644. data/lib/harpiya/core/controller_helpers/locale.rb +58 -0
  645. data/lib/harpiya/core/controller_helpers/order.rb +108 -0
  646. data/lib/harpiya/core/controller_helpers/search.rb +14 -0
  647. data/lib/harpiya/core/controller_helpers/store.rb +55 -0
  648. data/lib/harpiya/core/controller_helpers/strong_parameters.rb +43 -0
  649. data/lib/harpiya/core/engine.rb +150 -0
  650. data/lib/harpiya/core/importer.rb +9 -0
  651. data/lib/harpiya/core/importer/order.rb +242 -0
  652. data/lib/harpiya/core/importer/product.rb +63 -0
  653. data/lib/harpiya/core/number_generator.rb +51 -0
  654. data/lib/harpiya/core/product_duplicator.rb +79 -0
  655. data/lib/harpiya/core/product_filters.rb +194 -0
  656. data/lib/harpiya/core/query_filters.rb +11 -0
  657. data/lib/harpiya/core/query_filters/comparable.rb +46 -0
  658. data/lib/harpiya/core/query_filters/date.rb +8 -0
  659. data/lib/harpiya/core/query_filters/number.rb +8 -0
  660. data/lib/harpiya/core/query_filters/text.rb +32 -0
  661. data/lib/harpiya/core/routes.rb +42 -0
  662. data/lib/harpiya/core/search/base.rb +138 -0
  663. data/lib/harpiya/core/token_generator.rb +22 -0
  664. data/lib/harpiya/core/version.rb +7 -0
  665. data/lib/harpiya/database_type_utilities.rb +12 -0
  666. data/lib/harpiya/dependencies_helper.rb +11 -0
  667. data/lib/harpiya/i18n.rb +33 -0
  668. data/lib/harpiya/localized_number.rb +23 -0
  669. data/lib/harpiya/migrations.rb +80 -0
  670. data/lib/harpiya/money.rb +77 -0
  671. data/lib/harpiya/permitted_attributes.rb +126 -0
  672. data/lib/harpiya/service_module.rb +102 -0
  673. data/lib/harpiya/testing_support/ability_helpers.rb +97 -0
  674. data/lib/harpiya/testing_support/authorization_helpers.rb +69 -0
  675. data/lib/harpiya/testing_support/bar_ability.rb +14 -0
  676. data/lib/harpiya/testing_support/caching.rb +47 -0
  677. data/lib/harpiya/testing_support/capybara_config.rb +26 -0
  678. data/lib/harpiya/testing_support/capybara_ext.rb +88 -0
  679. data/lib/harpiya/testing_support/common_rake.rb +54 -0
  680. data/lib/harpiya/testing_support/controller_requests.rb +103 -0
  681. data/lib/harpiya/testing_support/extension_rake.rb +9 -0
  682. data/lib/harpiya/testing_support/factories.rb +19 -0
  683. data/lib/harpiya/testing_support/factories/address_factory.rb +23 -0
  684. data/lib/harpiya/testing_support/factories/adjustment_factory.rb +28 -0
  685. data/lib/harpiya/testing_support/factories/calculator_factory.rb +20 -0
  686. data/lib/harpiya/testing_support/factories/classification_factory.rb +8 -0
  687. data/lib/harpiya/testing_support/factories/country_factory.rb +9 -0
  688. data/lib/harpiya/testing_support/factories/credit_card_factory.rb +12 -0
  689. data/lib/harpiya/testing_support/factories/customer_return_factory.rb +29 -0
  690. data/lib/harpiya/testing_support/factories/image_factory.rb +7 -0
  691. data/lib/harpiya/testing_support/factories/inventory_unit_factory.rb +18 -0
  692. data/lib/harpiya/testing_support/factories/line_item_factory.rb +12 -0
  693. data/lib/harpiya/testing_support/factories/menu_factory.rb +7 -0
  694. data/lib/harpiya/testing_support/factories/menu_item_factory.rb +7 -0
  695. data/lib/harpiya/testing_support/factories/options_factory.rb +27 -0
  696. data/lib/harpiya/testing_support/factories/order_factory.rb +102 -0
  697. data/lib/harpiya/testing_support/factories/order_promotion_factory.rb +6 -0
  698. data/lib/harpiya/testing_support/factories/payment_factory.rb +30 -0
  699. data/lib/harpiya/testing_support/factories/payment_method_factory.rb +36 -0
  700. data/lib/harpiya/testing_support/factories/price_factory.rb +7 -0
  701. data/lib/harpiya/testing_support/factories/product_factory.rb +49 -0
  702. data/lib/harpiya/testing_support/factories/product_option_type_factory.rb +6 -0
  703. data/lib/harpiya/testing_support/factories/product_property_factory.rb +6 -0
  704. data/lib/harpiya/testing_support/factories/promotion_category_factory.rb +5 -0
  705. data/lib/harpiya/testing_support/factories/promotion_factory.rb +73 -0
  706. data/lib/harpiya/testing_support/factories/promotion_rule_factory.rb +5 -0
  707. data/lib/harpiya/testing_support/factories/property_factory.rb +28 -0
  708. data/lib/harpiya/testing_support/factories/prototype_factory.rb +11 -0
  709. data/lib/harpiya/testing_support/factories/refund_factory.rb +22 -0
  710. data/lib/harpiya/testing_support/factories/reimbursement_factory.rb +16 -0
  711. data/lib/harpiya/testing_support/factories/reimbursement_type_factory.rb +7 -0
  712. data/lib/harpiya/testing_support/factories/return_authorization_factory.rb +21 -0
  713. data/lib/harpiya/testing_support/factories/return_item_factory.rb +14 -0
  714. data/lib/harpiya/testing_support/factories/role_factory.rb +9 -0
  715. data/lib/harpiya/testing_support/factories/shipment_factory.rb +21 -0
  716. data/lib/harpiya/testing_support/factories/shipping_category_factory.rb +5 -0
  717. data/lib/harpiya/testing_support/factories/shipping_method_factory.rb +22 -0
  718. data/lib/harpiya/testing_support/factories/state_factory.rb +10 -0
  719. data/lib/harpiya/testing_support/factories/stock_factory.rb +31 -0
  720. data/lib/harpiya/testing_support/factories/stock_item_factory.rb +9 -0
  721. data/lib/harpiya/testing_support/factories/stock_location_factory.rb +28 -0
  722. data/lib/harpiya/testing_support/factories/stock_movement_factory.rb +11 -0
  723. data/lib/harpiya/testing_support/factories/store_credit_category_factory.rb +9 -0
  724. data/lib/harpiya/testing_support/factories/store_credit_event_factory.rb +8 -0
  725. data/lib/harpiya/testing_support/factories/store_credit_factory.rb +17 -0
  726. data/lib/harpiya/testing_support/factories/store_credit_type_factory.rb +11 -0
  727. data/lib/harpiya/testing_support/factories/store_factory.rb +27 -0
  728. data/lib/harpiya/testing_support/factories/tax_category_factory.rb +6 -0
  729. data/lib/harpiya/testing_support/factories/tax_rate_factory.rb +9 -0
  730. data/lib/harpiya/testing_support/factories/taxon_factory.rb +7 -0
  731. data/lib/harpiya/testing_support/factories/taxonomy_factory.rb +5 -0
  732. data/lib/harpiya/testing_support/factories/user_factory.rb +22 -0
  733. data/lib/harpiya/testing_support/factories/variant_factory.rb +38 -0
  734. data/lib/harpiya/testing_support/factories/zone_factory.rb +28 -0
  735. data/lib/harpiya/testing_support/factories/zone_member_factory.rb +6 -0
  736. data/lib/harpiya/testing_support/flash.rb +25 -0
  737. data/lib/harpiya/testing_support/flatpickr_capybara.rb +101 -0
  738. data/lib/harpiya/testing_support/i18n.rb +94 -0
  739. data/lib/harpiya/testing_support/image_helpers.rb +13 -0
  740. data/lib/harpiya/testing_support/kernel.rb +17 -0
  741. data/lib/harpiya/testing_support/locale_helpers.rb +78 -0
  742. data/lib/harpiya/testing_support/next_instance_of.rb +38 -0
  743. data/lib/harpiya/testing_support/order_walkthrough.rb +78 -0
  744. data/lib/harpiya/testing_support/preferences.rb +30 -0
  745. data/lib/harpiya/testing_support/rspec_retry_config.rb +10 -0
  746. data/lib/harpiya/testing_support/url_helpers.rb +9 -0
  747. data/lib/harpiya_core.rb +2 -0
  748. data/lib/tasks/core.rake +187 -0
  749. data/lib/tasks/email.rake +10 -0
  750. data/lib/tasks/exchanges.rake +66 -0
  751. data/script/rails +9 -0
  752. data/spec/fixtures/favicon.ico +0 -0
  753. data/spec/fixtures/files/icon_256x256.gif +0 -0
  754. data/spec/fixtures/files/icon_256x256.png +0 -0
  755. data/spec/fixtures/files/icon_512x512.png +0 -0
  756. data/spec/fixtures/files/img_256x128.png +0 -0
  757. data/spec/fixtures/text-file.txt +1 -0
  758. data/spec/fixtures/thinking-cat.jpg +0 -0
  759. data/vendor/assets/javascripts/cleave.js +1669 -0
  760. data/vendor/assets/javascripts/fetch.umd.js +531 -0
  761. data/vendor/assets/javascripts/jquery.payment.js +652 -0
  762. data/vendor/assets/javascripts/jsuri.js +458 -0
  763. data/vendor/assets/javascripts/polyfill.min.js +1 -0
  764. metadata +1260 -0
@@ -0,0 +1,76 @@
1
+ module Harpiya
2
+ class MenuItem < Harpiya::Base
3
+ include Harpiya::DisplayLink
4
+
5
+ acts_as_nested_set dependent: :destroy
6
+
7
+ belongs_to :menu, touch: true
8
+ belongs_to :linked_resource, polymorphic: true
9
+
10
+ before_create :ensure_item_belongs_to_root
11
+ before_save :reset_link_attributes, :paremeterize_code
12
+
13
+ after_save :touch_ancestors_and_menu
14
+ after_touch :touch_ancestors_and_menu
15
+
16
+ ITEM_TYPE = %w[Link Container]
17
+
18
+ LINKED_RESOURCE_TYPE = ['URL']
19
+ STATIC_RESOURCE_TYPE = ['Home Page']
20
+ DYNAMIC_RESOURCE_TYPE = ['Harpiya::Product', 'Harpiya::Taxon']
21
+
22
+ LINKED_RESOURCE_TYPE.unshift(*STATIC_RESOURCE_TYPE)
23
+ LINKED_RESOURCE_TYPE.push(*DYNAMIC_RESOURCE_TYPE)
24
+
25
+ validates :name, presence: true
26
+ validates :menu, presence: true
27
+ validates :item_type, inclusion: { in: ITEM_TYPE }
28
+ validates :linked_resource_type, inclusion: { in: LINKED_RESOURCE_TYPE }
29
+
30
+ has_one :icon, as: :viewable, dependent: :destroy, class_name: 'Harpiya::Icon'
31
+ accepts_nested_attributes_for :icon, reject_if: :all_blank
32
+
33
+ def container?
34
+ item_type == 'Container'
35
+ end
36
+
37
+ def code?(item_code = nil)
38
+ if item_code
39
+ code == item_code
40
+ else
41
+ code.present?
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ def reset_link_attributes
48
+ if linked_resource_type_changed? || item_type == 'Container'
49
+ self.linked_resource_id = nil
50
+ self.destination = nil
51
+ self.new_window = false
52
+
53
+ self.linked_resource_type = 'URL' if item_type == 'Container'
54
+ end
55
+ end
56
+
57
+ def ensure_item_belongs_to_root
58
+ if menu.try(:root).present? && parent_id.nil?
59
+ self.parent = menu.root
60
+
61
+ store_new_parent
62
+ end
63
+ end
64
+
65
+ def touch_ancestors_and_menu
66
+ ancestors.update_all(updated_at: Time.current)
67
+ menu.try!(:touch)
68
+ end
69
+
70
+ def paremeterize_code
71
+ return if code.blank?
72
+
73
+ self.code = code.parameterize
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,42 @@
1
+ module Harpiya
2
+ class OptionType < Harpiya::Base
3
+ acts_as_list
4
+
5
+ with_options dependent: :destroy, inverse_of: :option_type do
6
+ has_many :option_values, -> { order(:position) }
7
+ has_many :product_option_types
8
+ end
9
+
10
+ has_many :products, through: :product_option_types
11
+
12
+ has_many :option_type_prototypes, class_name: 'Harpiya::OptionTypePrototype'
13
+ has_many :prototypes, through: :option_type_prototypes, class_name: 'Harpiya::Prototype'
14
+
15
+ with_options presence: true do
16
+ validates :name, uniqueness: { case_sensitive: false, allow_blank: true }
17
+ validates :presentation
18
+ end
19
+
20
+ default_scope { order(:position) }
21
+
22
+ scope :filterable, -> { where(filterable: true) }
23
+
24
+ accepts_nested_attributes_for :option_values, reject_if: ->(ov) { ov[:name].blank? || ov[:presentation].blank? }, allow_destroy: true
25
+
26
+ after_touch :touch_all_products
27
+
28
+ def filter_param
29
+ name.parameterize
30
+ end
31
+
32
+ def self.color
33
+ find_by(name: 'color')
34
+ end
35
+
36
+ private
37
+
38
+ def touch_all_products
39
+ products.update_all(updated_at: Time.current)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,9 @@
1
+ module Harpiya
2
+ class OptionTypePrototype < Harpiya::Base
3
+ belongs_to :option_type, class_name: 'Harpiya::OptionType'
4
+ belongs_to :prototype, class_name: 'Harpiya::Prototype'
5
+
6
+ validates :prototype, :option_type, presence: true
7
+ validates :prototype_id, uniqueness: { scope: :option_type_id }
8
+ end
9
+ end
@@ -0,0 +1,37 @@
1
+ module Harpiya
2
+ class OptionValue < Harpiya::Base
3
+ belongs_to :option_type, class_name: 'Harpiya::OptionType', touch: true, inverse_of: :option_values
4
+ acts_as_list scope: :option_type
5
+
6
+ has_many :option_value_variants, class_name: 'Harpiya::OptionValueVariant'
7
+ has_many :variants, through: :option_value_variants, class_name: 'Harpiya::Variant'
8
+
9
+ with_options presence: true do
10
+ validates :name, uniqueness: { scope: :option_type_id, case_sensitive: false }
11
+ validates :presentation
12
+ end
13
+
14
+ scope :filterable, lambda {
15
+ joins(:option_type).
16
+ where(OptionType.table_name => { filterable: true }).
17
+ distinct
18
+ }
19
+
20
+ scope :for_products, lambda { |products|
21
+ joins(:variants).
22
+ where(Variant.table_name => { product_id: products.map(&:id) })
23
+ }
24
+
25
+ after_touch :touch_all_variants
26
+
27
+ delegate :name, :presentation, to: :option_type, prefix: true, allow_nil: true
28
+
29
+ self.whitelisted_ransackable_attributes = ['presentation']
30
+
31
+ private
32
+
33
+ def touch_all_variants
34
+ variants.update_all(updated_at: Time.current)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,9 @@
1
+ module Harpiya
2
+ class OptionValueVariant < Harpiya::Base
3
+ belongs_to :option_value, class_name: 'Harpiya::OptionValue'
4
+ belongs_to :variant, touch: true, class_name: 'Harpiya::Variant'
5
+
6
+ validates :option_value, :variant, presence: true
7
+ validates :option_value_id, uniqueness: { scope: :variant_id }
8
+ end
9
+ end
@@ -0,0 +1,751 @@
1
+ require_dependency 'harpiya/order/checkout'
2
+ require_dependency 'harpiya/order/currency_updater'
3
+ require_dependency 'harpiya/order/payments'
4
+ require_dependency 'harpiya/order/store_credit'
5
+
6
+ module Harpiya
7
+ class Order < Harpiya::Base
8
+ PAYMENT_STATES = %w(balance_due credit_owed failed paid void)
9
+ SHIPMENT_STATES = %w(backorder canceled partial pending ready shipped)
10
+
11
+ include Harpiya::Order::Checkout
12
+ include Harpiya::Order::CurrencyUpdater
13
+ include Harpiya::Order::Payments
14
+ include Harpiya::Order::StoreCredit
15
+ include Harpiya::Order::AddressBook
16
+ include Harpiya::Core::NumberGenerator.new(prefix: 'R')
17
+ include Harpiya::Core::TokenGenerator
18
+
19
+ include NumberAsParam
20
+
21
+ extend Harpiya::DisplayMoney
22
+ money_methods :outstanding_balance, :item_total, :adjustment_total,
23
+ :included_tax_total, :additional_tax_total, :tax_total,
24
+ :shipment_total, :promo_total, :total,
25
+ :cart_promo_total, :pre_tax_item_amount, :pre_tax_total
26
+
27
+ alias display_ship_total display_shipment_total
28
+ alias_attribute :ship_total, :shipment_total
29
+
30
+ MONEY_THRESHOLD = 100_000_000
31
+ MONEY_VALIDATION = {
32
+ presence: true,
33
+ numericality: {
34
+ greater_than: -MONEY_THRESHOLD,
35
+ less_than: MONEY_THRESHOLD,
36
+ allow_blank: true
37
+ },
38
+ format: { with: /\A-?\d+(?:\.\d{1,2})?\z/, allow_blank: true }
39
+ }.freeze
40
+
41
+ POSITIVE_MONEY_VALIDATION = MONEY_VALIDATION.deep_dup.tap do |validation|
42
+ validation.fetch(:numericality)[:greater_than_or_equal_to] = 0
43
+ end.freeze
44
+
45
+ NEGATIVE_MONEY_VALIDATION = MONEY_VALIDATION.deep_dup.tap do |validation|
46
+ validation.fetch(:numericality)[:less_than_or_equal_to] = 0
47
+ end.freeze
48
+
49
+ checkout_flow do
50
+ go_to_state :address
51
+ go_to_state :delivery
52
+ go_to_state :payment, if: ->(order) { order.payment? || order.payment_required? }
53
+ go_to_state :confirm, if: ->(order) { order.confirmation_required? }
54
+ go_to_state :complete
55
+ remove_transition from: :delivery, to: :confirm, unless: ->(order) { order.confirmation_required? }
56
+ end
57
+
58
+ self.whitelisted_ransackable_associations = %w[shipments user promotions bill_address ship_address line_items store]
59
+ self.whitelisted_ransackable_attributes = %w[completed_at email number state payment_state shipment_state total considered_risky channel]
60
+
61
+ attr_reader :coupon_code
62
+ attr_accessor :temporary_address, :temporary_credit_card
63
+
64
+ if Harpiya.user_class
65
+ belongs_to :user, class_name: Harpiya.user_class.to_s, optional: true
66
+ belongs_to :created_by, class_name: Harpiya.user_class.to_s, optional: true
67
+ belongs_to :approver, class_name: Harpiya.user_class.to_s, optional: true
68
+ belongs_to :canceler, class_name: Harpiya.user_class.to_s, optional: true
69
+ else
70
+ belongs_to :user, optional: true
71
+ belongs_to :created_by, optional: true
72
+ belongs_to :approver, optional: true
73
+ belongs_to :canceler, optional: true
74
+ end
75
+
76
+ belongs_to :bill_address, foreign_key: :bill_address_id, class_name: 'Harpiya::Address',
77
+ optional: true, dependent: :destroy
78
+ alias_attribute :billing_address, :bill_address
79
+
80
+ belongs_to :ship_address, foreign_key: :ship_address_id, class_name: 'Harpiya::Address',
81
+ optional: true, dependent: :destroy
82
+ alias_attribute :shipping_address, :ship_address
83
+
84
+ belongs_to :store, class_name: 'Harpiya::Store'
85
+
86
+ with_options dependent: :destroy do
87
+ has_many :state_changes, as: :stateful, class_name: 'Harpiya::StateChange'
88
+ has_many :line_items, -> { order(:created_at) }, inverse_of: :order, class_name: 'Harpiya::LineItem'
89
+ has_many :payments, class_name: 'Harpiya::Payment'
90
+ has_many :return_authorizations, inverse_of: :order, class_name: 'Harpiya::ReturnAuthorization'
91
+ has_many :adjustments, -> { order(:created_at) }, as: :adjustable, class_name: 'Harpiya::Adjustment'
92
+ end
93
+ has_many :reimbursements, inverse_of: :order, class_name: 'Harpiya::Reimbursement'
94
+ has_many :line_item_adjustments, through: :line_items, source: :adjustments
95
+ has_many :inventory_units, inverse_of: :order, class_name: 'Harpiya::InventoryUnit'
96
+ has_many :variants, through: :line_items
97
+ has_many :products, through: :variants
98
+ has_many :refunds, through: :payments
99
+ has_many :all_adjustments,
100
+ class_name: 'Harpiya::Adjustment',
101
+ foreign_key: :order_id,
102
+ dependent: :destroy,
103
+ inverse_of: :order
104
+
105
+ has_many :order_promotions, class_name: 'Harpiya::OrderPromotion'
106
+ has_many :promotions, through: :order_promotions, class_name: 'Harpiya::Promotion'
107
+
108
+ has_many :shipments, class_name: 'Harpiya::Shipment', dependent: :destroy, inverse_of: :order do
109
+ def states
110
+ pluck(:state).uniq
111
+ end
112
+ end
113
+ has_many :shipment_adjustments, through: :shipments, source: :adjustments
114
+
115
+ accepts_nested_attributes_for :line_items
116
+ accepts_nested_attributes_for :bill_address
117
+ accepts_nested_attributes_for :ship_address
118
+ accepts_nested_attributes_for :payments, reject_if: :credit_card_nil_payment?
119
+ accepts_nested_attributes_for :shipments
120
+
121
+ # Needs to happen before save_permalink is called
122
+ before_validation :ensure_store_presence
123
+ before_validation :ensure_currency_presence
124
+ before_validation :uppercase_number
125
+
126
+ before_validation :clone_billing_address, if: :use_billing?
127
+ attr_accessor :use_billing
128
+
129
+ before_create :create_token
130
+ before_create :link_by_email
131
+ before_update :homogenize_line_item_currencies, if: :currency_changed?
132
+
133
+ with_options presence: true do
134
+ # we want to have this case_sentive: true as changing it to false causes all SQL to use LOWER(slug)
135
+ # which is very costly and slow on large set of records
136
+ validates :number, length: { maximum: 32, allow_blank: true }, uniqueness: { allow_blank: true, case_sensitive: true }
137
+ validates :email, length: { maximum: 254, allow_blank: true }, email: { allow_blank: true }, if: :require_email
138
+ validates :item_count, numericality: { greater_than_or_equal_to: 0, less_than: 2**31, only_integer: true, allow_blank: true }
139
+ validates :store
140
+ validates :currency
141
+ end
142
+ validates :payment_state, inclusion: { in: PAYMENT_STATES, allow_blank: true }
143
+ validates :shipment_state, inclusion: { in: SHIPMENT_STATES, allow_blank: true }
144
+ validates :item_total, POSITIVE_MONEY_VALIDATION
145
+ validates :adjustment_total, MONEY_VALIDATION
146
+ validates :included_tax_total, POSITIVE_MONEY_VALIDATION
147
+ validates :additional_tax_total, POSITIVE_MONEY_VALIDATION
148
+ validates :payment_total, MONEY_VALIDATION
149
+ validates :shipment_total, MONEY_VALIDATION
150
+ validates :promo_total, NEGATIVE_MONEY_VALIDATION
151
+ validates :total, MONEY_VALIDATION
152
+
153
+ delegate :update_totals, :persist_totals, to: :updater
154
+ delegate :merge!, to: :merger
155
+ delegate :firstname, :lastname, to: :bill_address, prefix: true, allow_nil: true
156
+
157
+ class_attribute :update_hooks
158
+ self.update_hooks = Set.new
159
+
160
+ scope :created_between, ->(start_date, end_date) { where(created_at: start_date..end_date) }
161
+ scope :completed_between, ->(start_date, end_date) { where(completed_at: start_date..end_date) }
162
+ scope :complete, -> { where.not(completed_at: nil) }
163
+ scope :incomplete, -> { where(completed_at: nil) }
164
+ scope :not_canceled, -> { where.not(state: 'canceled') }
165
+ scope :with_deleted_bill_address, -> { joins(:bill_address).where.not(Address.table_name => { deleted_at: nil }) }
166
+ scope :with_deleted_ship_address, -> { joins(:ship_address).where.not(Address.table_name => { deleted_at: nil }) }
167
+
168
+ # shows completed orders first, by their completed_at date, then uncompleted orders by their created_at
169
+ scope :reverse_chronological, -> { order(Arel.sql('harpiya_orders.completed_at IS NULL'), completed_at: :desc, created_at: :desc) }
170
+
171
+ # Use this method in other gems that wish to register their own custom logic
172
+ # that should be called after Order#update
173
+ def self.register_update_hook(hook)
174
+ update_hooks.add(hook)
175
+ end
176
+
177
+ # For compatiblity with Calculator::PriceSack
178
+ def amount
179
+ line_items.inject(0.0) { |sum, li| sum + li.amount }
180
+ end
181
+
182
+ # Sum of all line item amounts pre-tax
183
+ def pre_tax_item_amount
184
+ line_items.sum(:pre_tax_amount)
185
+ end
186
+
187
+ # Sum of all line item and shipment pre-tax
188
+ def pre_tax_total
189
+ pre_tax_item_amount + shipments.sum(:pre_tax_amount)
190
+ end
191
+
192
+ def shipping_discount
193
+ shipment_adjustments.non_tax.eligible.sum(:amount) * - 1
194
+ end
195
+
196
+ def completed?
197
+ completed_at.present?
198
+ end
199
+
200
+ # Indicates whether or not the user is allowed to proceed to checkout.
201
+ # Currently this is implemented as a check for whether or not there is at
202
+ # least one LineItem in the Order. Feel free to override this logic in your
203
+ # own application if you require additional steps before allowing a checkout.
204
+ def checkout_allowed?
205
+ line_items.exists?
206
+ end
207
+
208
+ # Is this a free order in which case the payment step should be skipped
209
+ def payment_required?
210
+ total.to_f > 0.0
211
+ end
212
+
213
+ # If true, causes the confirmation step to happen during the checkout process
214
+ def confirmation_required?
215
+ Harpiya::Config[:always_include_confirm_step] ||
216
+ payments.valid.map(&:payment_method).compact.any?(&:payment_profiles_supported?) ||
217
+ # Little hacky fix for #4117
218
+ # If this wasn't here, order would transition to address state on confirm failure
219
+ # because there would be no valid payments any more.
220
+ confirm?
221
+ end
222
+
223
+ def backordered?
224
+ shipments.any?(&:backordered?)
225
+ end
226
+
227
+ # Returns the relevant zone (if any) to be used for taxation purposes.
228
+ # Uses default tax zone unless there is a specific match
229
+ def tax_zone
230
+ @tax_zone ||= Zone.match(tax_address) || Zone.default_tax
231
+ end
232
+
233
+ # Returns the address for taxation based on configuration
234
+ def tax_address
235
+ Harpiya::Config[:tax_using_ship_address] ? ship_address : bill_address
236
+ end
237
+
238
+ def updater
239
+ @updater ||= OrderUpdater.new(self)
240
+ end
241
+
242
+ def update_with_updater!
243
+ updater.update
244
+ end
245
+
246
+ def merger
247
+ @merger ||= Harpiya::OrderMerger.new(self)
248
+ end
249
+
250
+ def ensure_store_presence
251
+ self.store ||= Harpiya::Store.default
252
+ end
253
+
254
+ def allow_cancel?
255
+ return false if !completed? || canceled?
256
+
257
+ shipment_state.nil? || %w{ready backorder pending}.include?(shipment_state)
258
+ end
259
+
260
+ def all_inventory_units_returned?
261
+ inventory_units.all?(&:returned?)
262
+ end
263
+
264
+ # Associates the specified user with the order.
265
+ def associate_user!(user, override_email = true)
266
+ self.user = user
267
+ self.email = user.email if override_email
268
+ self.created_by ||= user
269
+ self.bill_address ||= user.bill_address.try(:clone)
270
+ self.ship_address ||= user.ship_address.try(:clone)
271
+
272
+ changes = slice(:user_id, :email, :created_by_id, :bill_address_id, :ship_address_id)
273
+
274
+ # immediately persist the changes we just made, but don't use save
275
+ # since we might have an invalid address associated
276
+ self.class.unscoped.where(id: self).update_all(changes)
277
+ end
278
+
279
+ def quantity_of(variant, options = {})
280
+ line_item = find_line_item_by_variant(variant, options)
281
+ line_item ? line_item.quantity : 0
282
+ end
283
+
284
+ def find_line_item_by_variant(variant, options = {})
285
+ line_items.detect do |line_item|
286
+ line_item.variant_id == variant.id &&
287
+ Harpiya::Dependencies.cart_compare_line_items_service.constantize.new.call(order: self, line_item: line_item, options: options).value
288
+ end
289
+ end
290
+
291
+ # Creates new tax charges if there are any applicable rates. If prices already
292
+ # include taxes then price adjustments are created instead.
293
+ def create_tax_charge!
294
+ Harpiya::TaxRate.adjust(self, line_items)
295
+ Harpiya::TaxRate.adjust(self, shipments) if shipments.any?
296
+ end
297
+
298
+ def create_shipment_tax_charge!
299
+ Harpiya::TaxRate.adjust(self, shipments) if shipments.any?
300
+ end
301
+
302
+ def update_line_item_prices!
303
+ transaction do
304
+ line_items.reload.each(&:update_price)
305
+ save!
306
+ end
307
+ end
308
+
309
+ def outstanding_balance
310
+ if canceled?
311
+ -1 * payment_total
312
+ else
313
+ total - (payment_total + reimbursement_paid_total)
314
+ end
315
+ end
316
+
317
+ def reimbursement_paid_total
318
+ reimbursements.sum(&:paid_amount)
319
+ end
320
+
321
+ def outstanding_balance?
322
+ outstanding_balance != 0
323
+ end
324
+
325
+ def name
326
+ if (address = bill_address || ship_address)
327
+ address.full_name
328
+ end
329
+ end
330
+
331
+ def can_ship?
332
+ complete? || resumed? || awaiting_return? || returned?
333
+ end
334
+
335
+ def uneditable?
336
+ complete? || canceled? || returned?
337
+ end
338
+
339
+ def credit_cards
340
+ credit_card_ids = payments.from_credit_card.pluck(:source_id).uniq
341
+ CreditCard.where(id: credit_card_ids)
342
+ end
343
+
344
+ def valid_credit_cards
345
+ credit_card_ids = payments.from_credit_card.valid.pluck(:source_id).uniq
346
+ CreditCard.where(id: credit_card_ids)
347
+ end
348
+
349
+ # Finalizes an in progress order after checkout is complete.
350
+ # Called after transition to complete state when payments will have been processed
351
+ def finalize!
352
+ # lock all adjustments (coupon promotions, etc.)
353
+ all_adjustments.each(&:close)
354
+
355
+ # update payment and shipment(s) states, and save
356
+ updater.update_payment_state
357
+ shipments.each do |shipment|
358
+ shipment.update!(self)
359
+ shipment.finalize!
360
+ end
361
+
362
+ updater.update_shipment_state
363
+ save!
364
+ updater.run_hooks
365
+
366
+ touch :completed_at
367
+
368
+ deliver_order_confirmation_email unless confirmation_delivered?
369
+
370
+ deliver_store_owner_order_notification_email if deliver_store_owner_order_notification_email?
371
+
372
+ consider_risk
373
+ end
374
+
375
+ def fulfill!
376
+ shipments.each { |shipment| shipment.update!(self) if shipment.persisted? }
377
+ updater.update_shipment_state
378
+ save!
379
+ end
380
+
381
+ def deliver_order_confirmation_email
382
+ OrderMailer.confirm_email(id).deliver_later
383
+ update_column(:confirmation_delivered, true)
384
+ end
385
+
386
+ # Helper methods for checkout steps
387
+ def paid?
388
+ payment_state == 'paid' || payment_state == 'credit_owed'
389
+ end
390
+
391
+ def available_payment_methods(store = nil)
392
+ @available_payment_methods ||= collect_payment_methods(store)
393
+ end
394
+
395
+ def insufficient_stock_lines
396
+ line_items.select(&:insufficient_stock?)
397
+ end
398
+
399
+ ##
400
+ # Check to see if any line item variants are discontinued.
401
+ # If so add error and restart checkout.
402
+ def ensure_line_item_variants_are_not_discontinued
403
+ if line_items.any? { |li| !li.variant || li.variant.discontinued? }
404
+ restart_checkout_flow
405
+ errors.add(:base, Harpiya.t(:discontinued_variants_present))
406
+ false
407
+ else
408
+ true
409
+ end
410
+ end
411
+
412
+ def ensure_line_items_are_in_stock
413
+ if insufficient_stock_lines.present?
414
+ restart_checkout_flow
415
+ errors.add(:base, Harpiya.t(:insufficient_stock_lines_present))
416
+ false
417
+ else
418
+ true
419
+ end
420
+ end
421
+
422
+ def empty!
423
+ if completed?
424
+ raise Harpiya.t(:cannot_empty_completed_order)
425
+ else
426
+ line_items.destroy_all
427
+ updater.update_item_count
428
+ adjustments.destroy_all
429
+ shipments.destroy_all
430
+ state_changes.destroy_all
431
+ order_promotions.destroy_all
432
+
433
+ update_totals
434
+ persist_totals
435
+ restart_checkout_flow
436
+ self
437
+ end
438
+ end
439
+
440
+ def has_step?(step)
441
+ checkout_steps.include?(step)
442
+ end
443
+
444
+ def state_changed(name)
445
+ state = "#{name}_state"
446
+ if persisted?
447
+ old_state = send("#{state}_was")
448
+ new_state = send(state)
449
+ unless old_state == new_state
450
+ log_state_changes(state_name: name, old_state: old_state, new_state: new_state)
451
+ end
452
+ end
453
+ end
454
+
455
+ def log_state_changes(state_name:, old_state:, new_state:)
456
+ state_changes.create(
457
+ previous_state: old_state,
458
+ next_state: new_state,
459
+ name: state_name,
460
+ user_id: user_id
461
+ )
462
+ end
463
+
464
+ def coupon_code=(code)
465
+ @coupon_code = begin
466
+ code.strip.downcase
467
+ rescue StandardError
468
+ nil
469
+ end
470
+ end
471
+
472
+ def can_add_coupon?
473
+ Harpiya::Promotion.order_activatable?(self)
474
+ end
475
+
476
+ def shipped?
477
+ %w(partial shipped).include?(shipment_state)
478
+ end
479
+
480
+ def create_proposed_shipments
481
+ all_adjustments.shipping.delete_all
482
+
483
+ shipment_ids = shipments.map(&:id)
484
+ StateChange.where(stateful_type: 'Harpiya::Shipment', stateful_id: shipment_ids).delete_all
485
+ ShippingRate.where(shipment_id: shipment_ids).delete_all
486
+
487
+ shipments.delete_all
488
+
489
+ # Inventory Units which are not associated to any shipment (unshippable)
490
+ # and are not returned or shipped should be deleted
491
+ inventory_units.on_hand_or_backordered.delete_all
492
+
493
+ self.shipments = Harpiya::Stock::Coordinator.new(self).shipments
494
+ end
495
+
496
+ def apply_free_shipping_promotions
497
+ Harpiya::PromotionHandler::FreeShipping.new(self).activate
498
+ shipments.each { |shipment| Harpiya::Adjustable::AdjustmentsUpdater.update(shipment) }
499
+ create_shipment_tax_charge!
500
+ update_with_updater!
501
+ end
502
+
503
+ # Applies user promotions when login after filling the cart
504
+ def apply_unassigned_promotions
505
+ ::Harpiya::PromotionHandler::Cart.new(self).activate
506
+ end
507
+
508
+ # Clean shipments and make order back to address state
509
+ #
510
+ # At some point the might need to force the order to transition from address
511
+ # to delivery again so that proper updated shipments are created.
512
+ # e.g. customer goes back from payment step and changes order items
513
+ def ensure_updated_shipments
514
+ if shipments.any? && !completed?
515
+ shipments.destroy_all
516
+ update_column(:shipment_total, 0)
517
+ restart_checkout_flow
518
+ end
519
+ end
520
+
521
+ def restart_checkout_flow
522
+ update_columns(
523
+ state: 'cart',
524
+ updated_at: Time.current
525
+ )
526
+ next! unless line_items.empty?
527
+ end
528
+
529
+ def refresh_shipment_rates(shipping_method_filter = ShippingMethod::DISPLAY_ON_FRONT_END)
530
+ shipments.map { |s| s.refresh_rates(shipping_method_filter) }
531
+ end
532
+
533
+ def shipping_eq_billing_address?
534
+ bill_address == ship_address
535
+ end
536
+
537
+ def set_shipments_cost
538
+ shipments.each(&:update_amounts)
539
+ updater.update_shipment_total
540
+ persist_totals
541
+ end
542
+
543
+ def is_risky?
544
+ !payments.risky.empty?
545
+ end
546
+
547
+ def canceled_by(user)
548
+ transaction do
549
+ cancel!
550
+ update_columns(
551
+ canceler_id: user.id,
552
+ canceled_at: Time.current
553
+ )
554
+ end
555
+ end
556
+
557
+ def approved_by(user)
558
+ transaction do
559
+ approve!
560
+ update_columns(
561
+ approver_id: user.id,
562
+ approved_at: Time.current
563
+ )
564
+ end
565
+ end
566
+
567
+ def approved?
568
+ !!approved_at
569
+ end
570
+
571
+ def can_approve?
572
+ !approved?
573
+ end
574
+
575
+ def consider_risk
576
+ considered_risky! if is_risky? && !approved?
577
+ end
578
+
579
+ def considered_risky!
580
+ update_column(:considered_risky, true)
581
+ end
582
+
583
+ def approve!
584
+ update_column(:considered_risky, false)
585
+ end
586
+
587
+ def reload(options = nil)
588
+ remove_instance_variable(:@tax_zone) if defined?(@tax_zone)
589
+ super
590
+ end
591
+
592
+ def tax_total
593
+ included_tax_total + additional_tax_total
594
+ end
595
+
596
+ def quantity
597
+ line_items.sum(:quantity)
598
+ end
599
+
600
+ def has_non_reimbursement_related_refunds?
601
+ refunds.non_reimbursement.exists? ||
602
+ payments.offset_payment.exists? # how old versions of harpiya stored refunds
603
+ end
604
+
605
+ def collect_backend_payment_methods
606
+ PaymentMethod.available_on_back_end.select { |pm| pm.available_for_order?(self) }
607
+ end
608
+
609
+ # determines whether the inventory is fully discounted
610
+ #
611
+ # Returns
612
+ # - true if inventory amount is the exact negative of inventory related adjustments
613
+ # - false otherwise
614
+ def fully_discounted?
615
+ adjustment_total + line_items.map(&:final_amount).sum == 0.0
616
+ end
617
+ alias fully_discounted fully_discounted?
618
+
619
+ def promo_code
620
+ promotions.pluck(:code).compact.first
621
+ end
622
+
623
+ def payments_attributes=(attributes)
624
+ validate_payments_attributes(attributes)
625
+ super(attributes)
626
+ end
627
+
628
+ def validate_payments_attributes(attributes)
629
+ # Ensure the payment methods specified are allowed for this user
630
+ payment_methods = Harpiya::PaymentMethod.where(id: available_payment_methods.map(&:id))
631
+ attributes.each do |payment_attributes|
632
+ payment_method_id = payment_attributes[:payment_method_id]
633
+
634
+ # raise RecordNotFound unless it is an allowed payment method
635
+ payment_methods.find(payment_method_id) if payment_method_id
636
+ end
637
+ end
638
+
639
+ def valid_promotions
640
+ order_promotions.where(promotion_id: valid_promotion_ids).uniq(&:promotion_id)
641
+ end
642
+
643
+ def valid_promotion_ids
644
+ all_adjustments.eligible.nonzero.promotion.map { |a| a.source.promotion_id }.uniq
645
+ end
646
+
647
+ def valid_coupon_promotions
648
+ promotions.
649
+ where(id: valid_promotion_ids).
650
+ coupons
651
+ end
652
+
653
+ # Returns item and whole order discount amount for Order
654
+ # without Shipment disccounts (eg. Free Shipping)
655
+ # @return [BigDecimal]
656
+ def cart_promo_total
657
+ all_adjustments.eligible.nonzero.promotion.
658
+ where.not(adjustable_type: 'Harpiya::Shipment').
659
+ sum(:amount)
660
+ end
661
+
662
+ def has_free_shipping?
663
+ shipment_adjustments.
664
+ joins(:promotion_action).
665
+ where(harpiya_adjustments: { eligible: true, source_type: 'Harpiya::PromotionAction' },
666
+ harpiya_promotion_actions: { type: 'Harpiya::Promotion::Actions::FreeShipping' }).exists?
667
+ end
668
+
669
+ private
670
+
671
+ def link_by_email
672
+ self.email = user.email if user
673
+ end
674
+
675
+ # Determine if email is required (we don't want validation errors before we hit the checkout)
676
+ def require_email
677
+ true unless new_record? || ['cart', 'address'].include?(state)
678
+ end
679
+
680
+ def ensure_line_items_present
681
+ unless line_items.present?
682
+ errors.add(:base, Harpiya.t(:there_are_no_items_for_this_order)) && (return false)
683
+ end
684
+ end
685
+
686
+ def ensure_available_shipping_rates
687
+ if shipments.empty? || shipments.any? { |shipment| shipment.shipping_rates.blank? }
688
+ # After this point, order redirects back to 'address' state and asks user to pick a proper address
689
+ # Therefore, shipments are not necessary at this point.
690
+ shipments.destroy_all
691
+ errors.add(:base, Harpiya.t(:items_cannot_be_shipped)) && (return false)
692
+ end
693
+ end
694
+
695
+ def after_cancel
696
+ shipments.each(&:cancel!)
697
+ payments.completed.each(&:cancel!)
698
+
699
+ # Free up authorized store credits
700
+ payments.store_credits.pending.each(&:void!)
701
+
702
+ send_cancel_email
703
+ update_with_updater!
704
+ end
705
+
706
+ def send_cancel_email
707
+ OrderMailer.cancel_email(id).deliver_later
708
+ end
709
+
710
+ def after_resume
711
+ shipments.each(&:resume!)
712
+ consider_risk
713
+ end
714
+
715
+ def use_billing?
716
+ use_billing.in?([true, 'true', '1'])
717
+ end
718
+
719
+ def ensure_currency_presence
720
+ self.currency ||= store.default_currency || Harpiya::Config[:currency]
721
+ end
722
+
723
+ def create_token
724
+ self.token ||= generate_token
725
+ end
726
+
727
+ def collect_payment_methods(store = nil)
728
+ PaymentMethod.available_on_front_end.select { |pm| pm.available_for_order?(self) && pm.available_for_store?(store) }
729
+ end
730
+
731
+ def credit_card_nil_payment?(attributes)
732
+ payments.store_credits.present? && attributes[:amount].to_f.zero?
733
+ end
734
+
735
+ # Returns true if:
736
+ # 1. an email address is set for new order notifications AND
737
+ # 2. no notification for this order has been sent yet.
738
+ def deliver_store_owner_order_notification_email?
739
+ store.new_order_notifications_email.present? && !store_owner_notification_delivered?
740
+ end
741
+
742
+ def deliver_store_owner_order_notification_email
743
+ OrderMailer.store_owner_notification_email(id).deliver_later
744
+ update_column(:store_owner_notification_delivered, true)
745
+ end
746
+
747
+ def uppercase_number
748
+ number&.upcase!
749
+ end
750
+ end
751
+ end