auction_fun_core 0.8.5 → 0.8.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/.standard.yml +2 -0
  3. data/CHANGELOG.md +48 -0
  4. data/Procfile +1 -0
  5. data/README.md +34 -32
  6. data/Rakefile +1 -1
  7. data/auction_fun_core.gemspec +1 -0
  8. data/db/migrate/20240229143000_create_auctions.rb +1 -0
  9. data/db/seeds.rb +87 -36
  10. data/i18n/en-US/contracts/contracts.en-US.yml +12 -0
  11. data/i18n/en-US/mail/application.en-US.yml +66 -0
  12. data/i18n/en-US/mail/auction_context/post_auction/participant.en-US.yml +13 -0
  13. data/i18n/en-US/mail/auction_context/post_auction/winner.en-US.yml +13 -0
  14. data/i18n/en-US/mail/auction_context/pre_auction/auction_start_reminder.en-US.yml +11 -0
  15. data/i18n/pt-BR/contracts/contracts.pt-BR.yml +12 -0
  16. data/i18n/pt-BR/mail/application.pt-BR.yml +66 -0
  17. data/i18n/pt-BR/mail/auction_context/post_auction/participant.pt-BR.yml +13 -0
  18. data/i18n/pt-BR/mail/auction_context/post_auction/winner.pt-BR.yml +13 -0
  19. data/i18n/pt-BR/mail/auction_context/pre_auction/auction_start_reminder.pt-BR.yml +11 -0
  20. data/i18n/pt-BR/mail/user_context/registration.pt-BR.yml +0 -4
  21. data/lib/auction_fun_core/business/configuration.rb +31 -0
  22. data/lib/auction_fun_core/business/token_generator.rb +19 -1
  23. data/lib/auction_fun_core/contracts/application_contract.rb +9 -1
  24. data/lib/auction_fun_core/contracts/auction_context/create_contract.rb +35 -20
  25. data/lib/auction_fun_core/contracts/auction_context/post_auction/participant_contract.rb +64 -0
  26. data/lib/auction_fun_core/contracts/auction_context/post_auction/winner_contract.rb +62 -0
  27. data/lib/auction_fun_core/contracts/auction_context/pre_auction/auction_start_reminder_contract.rb +48 -0
  28. data/lib/auction_fun_core/contracts/auction_context/processor/finish/closed_contract.rb +59 -0
  29. data/lib/auction_fun_core/contracts/auction_context/processor/finish/penny_contract.rb +60 -0
  30. data/lib/auction_fun_core/contracts/auction_context/processor/finish/standard_contract.rb +60 -0
  31. data/lib/auction_fun_core/contracts/auction_context/processor/pause_contract.rb +16 -4
  32. data/lib/auction_fun_core/contracts/auction_context/processor/start_contract.rb +17 -5
  33. data/lib/auction_fun_core/contracts/auction_context/processor/unpause_contract.rb +16 -4
  34. data/lib/auction_fun_core/contracts/bid_context/create_bid_closed_contract.rb +20 -11
  35. data/lib/auction_fun_core/contracts/bid_context/create_bid_penny_contract.rb +18 -9
  36. data/lib/auction_fun_core/contracts/bid_context/create_bid_standard_contract.rb +19 -10
  37. data/lib/auction_fun_core/contracts/staff_context/authentication_contract.rb +18 -4
  38. data/lib/auction_fun_core/contracts/staff_context/registration_contract.rb +20 -8
  39. data/lib/auction_fun_core/contracts/user_context/authentication_contract.rb +18 -4
  40. data/lib/auction_fun_core/contracts/user_context/email_confirmation_contract.rb +17 -2
  41. data/lib/auction_fun_core/contracts/user_context/phone_confirmation_contract.rb +17 -2
  42. data/lib/auction_fun_core/contracts/user_context/registration_contract.rb +26 -8
  43. data/lib/auction_fun_core/entities/auction.rb +52 -2
  44. data/lib/auction_fun_core/entities/bid.rb +3 -2
  45. data/lib/auction_fun_core/entities/staff.rb +15 -2
  46. data/lib/auction_fun_core/entities/user.rb +31 -2
  47. data/lib/auction_fun_core/events/app.rb +8 -2
  48. data/lib/auction_fun_core/events/listener.rb +19 -16
  49. data/lib/auction_fun_core/operations/auction_context/create_operation.rb +37 -11
  50. data/lib/auction_fun_core/operations/auction_context/post_auction/participant_operation.rb +85 -0
  51. data/lib/auction_fun_core/operations/auction_context/post_auction/winner_operation.rb +85 -0
  52. data/lib/auction_fun_core/operations/auction_context/pre_auction/auction_start_reminder_operation.rb +96 -0
  53. data/lib/auction_fun_core/operations/auction_context/processor/finish/closed_operation.rb +172 -0
  54. data/lib/auction_fun_core/operations/auction_context/processor/finish/penny_operation.rb +171 -0
  55. data/lib/auction_fun_core/operations/auction_context/processor/finish/standard_operation.rb +171 -0
  56. data/lib/auction_fun_core/operations/auction_context/processor/pause_operation.rb +36 -1
  57. data/lib/auction_fun_core/operations/auction_context/processor/start_operation.rb +23 -11
  58. data/lib/auction_fun_core/operations/auction_context/processor/unpause_operation.rb +36 -1
  59. data/lib/auction_fun_core/operations/bid_context/create_bid_penny_operation.rb +57 -7
  60. data/lib/auction_fun_core/operations/staff_context/registration_operation.rb +10 -0
  61. data/lib/auction_fun_core/relations/auctions.rb +252 -30
  62. data/lib/auction_fun_core/relations/bids.rb +18 -0
  63. data/lib/auction_fun_core/relations/staffs.rb +1 -1
  64. data/lib/auction_fun_core/repos/auction_context/auction_repository.rb +40 -11
  65. data/lib/auction_fun_core/repos/bid_context/bid_repository.rb +27 -5
  66. data/lib/auction_fun_core/repos/staff_context/staff_repository.rb +63 -21
  67. data/lib/auction_fun_core/repos/user_context/user_repository.rb +69 -25
  68. data/lib/auction_fun_core/services/mail/auction_context/post_auction/participant_mailer.rb +37 -0
  69. data/lib/auction_fun_core/services/mail/auction_context/post_auction/winner_mailer.rb +37 -0
  70. data/lib/auction_fun_core/services/mail/auction_context/pre_auction/auction_start_reminder_mailer.rb +35 -0
  71. data/lib/auction_fun_core/services/mail/templates/auction_context/post_auction/participant.html.erb +173 -0
  72. data/lib/auction_fun_core/services/mail/templates/auction_context/post_auction/winner.html.erb +174 -0
  73. data/lib/auction_fun_core/services/mail/templates/auction_context/pre_auction/auction_start_reminder.html.erb +192 -0
  74. data/lib/auction_fun_core/services/mail/templates/user_context/registration.html.erb +2 -2
  75. data/lib/auction_fun_core/services/mail/user_context/registration_mailer.rb +6 -0
  76. data/lib/auction_fun_core/version.rb +1 -1
  77. data/lib/auction_fun_core/workers/application_job.rb +12 -0
  78. data/lib/auction_fun_core/workers/operations/auction_context/post_auction/participant_operation_job.rb +38 -0
  79. data/lib/auction_fun_core/workers/operations/auction_context/post_auction/winner_operation_job.rb +37 -0
  80. data/lib/auction_fun_core/workers/operations/auction_context/pre_auction/auction_start_reminder_operation_job.rb +44 -0
  81. data/lib/auction_fun_core/workers/operations/auction_context/processor/finish/closed_operation_job.rb +37 -0
  82. data/lib/auction_fun_core/workers/operations/auction_context/processor/finish/penny_operation_job.rb +40 -0
  83. data/lib/auction_fun_core/workers/operations/auction_context/processor/finish/standard_operation_job.rb +38 -0
  84. data/lib/auction_fun_core/workers/operations/auction_context/processor/start_operation_job.rb +6 -3
  85. data/lib/auction_fun_core/workers/services/mail/auction_context/post_auction/participant_mailer_job.rb +56 -0
  86. data/lib/auction_fun_core/workers/services/mail/auction_context/post_auction/winner_mailer_job.rb +57 -0
  87. data/lib/auction_fun_core/workers/services/mail/auction_context/pre_auction/auction_start_reminder_mailer_job.rb +48 -0
  88. data/lib/auction_fun_core/workers/services/mail/user_context/registration_mailer_job.rb +8 -6
  89. data/system/providers/background_job.rb +25 -0
  90. metadata +51 -5
  91. data/lib/auction_fun_core/contracts/auction_context/processor/finish_contract.rb +0 -27
  92. data/lib/auction_fun_core/operations/auction_context/processor/finish_operation.rb +0 -61
  93. data/lib/auction_fun_core/workers/operations/auction_context/processor/finish_operation_job.rb +0 -32
@@ -3,7 +3,41 @@
3
3
  module AuctionFunCore
4
4
  module Repos
5
5
  module StaffContext
6
- # SQL repository for staffs.
6
+ # Repository for handling repository operations related to staffs.
7
+ #
8
+ # This repository provides methods to interact with staff data in the database,
9
+ # including creating, updating, deleting, and retrieving staffs.
10
+ #
11
+ # @example
12
+ # staff_repo = AuctionFunCore::Repos::StaffContext::StaffRepository.new
13
+ #
14
+ # # Retrieve all staffs
15
+ # all_staffs = staff_repo.all
16
+ #
17
+ # # Get the total number of staffs
18
+ # total_staffs = staff_repo.count
19
+ #
20
+ # # Search staffs based on certain conditions
21
+ # conditions = {name: 'Staff'}
22
+ # search = staff_repo.query(conditions)
23
+ #
24
+ # # Find an staff by its ID
25
+ # staff = staff_repo.by_id(123)
26
+ #
27
+ # # Find an staff by its ID and raise an error if not found
28
+ # staff = staff_repo.by_id!(123)
29
+ #
30
+ # # Search for a staff by email or phone
31
+ # staff_by_login = staff_repo.by_login('example@example.com')
32
+ #
33
+ # # Check if a staff exists based on certain conditions
34
+ # conditions = { name: 'John Doe' }
35
+ # staff_exists = staff_repo.exists?(conditions)
36
+ #
37
+ # @see AuctionFunCore::Entities::Staff Struct representing staff data
38
+ # @see https://rom-rb.org/learn/sql/3.3/queries/
39
+ # @see https://api.rom-rb.org/rom-sql/ROM/SQL/Relation/Reading
40
+ #
7
41
  class StaffRepository < ROM::Repository[:staffs]
8
42
  include Import["container"]
9
43
 
@@ -11,50 +45,58 @@ module AuctionFunCore
11
45
  commands :create, update: :by_pk, delete: :by_pk
12
46
 
13
47
  # Returns all staffs in database.
14
- # @return [Array<ROM::Struct::Staff>, []]
48
+ # @return [Array<ROM::Struct::Staff>]
15
49
  def all
16
50
  staffs.to_a
17
51
  end
18
52
 
19
- # Returns the total number of staffs in database.
20
- # @return [Integer]
53
+ # Returns the total number of staffs in the database.
54
+ #
55
+ # @return [Integer] Total number of staffs.
21
56
  def count
22
57
  staffs.count
23
58
  end
24
59
 
25
- # Mount SQL conditions in query for search in database.
26
- # @param conditions [Hash] DSL Dataset
27
- # @return [AuctionFunCore::Relations::Staffs]
60
+ # Constructs SQL conditions for querying staffs in the database.
61
+ #
62
+ # @param conditions [Hash] The conditions to be used in the query (DSL Dataset).
63
+ # @return [AuctionFunCore::Relations::Staff] The relation containing the staffs that match the given conditions.
28
64
  def query(conditions)
29
65
  staffs.where(conditions)
30
66
  end
31
67
 
32
- # Search staff in database by primary key.
33
- # @param id [Integer] Staff ID
34
- # @return [ROM::Struct::Staff, nil]
68
+ # Retrieves an staff from the database by its primary key.
69
+ #
70
+ # @param id [Integer] The ID of the staff to retrieve.
71
+ # @return [ROM::Struct::Staff, nil] The retrieved staff, or nil if not found.
72
+ #
35
73
  def by_id(id)
36
74
  staffs.by_pk(id).one
37
75
  end
38
76
 
39
- # Search staffs in database by primary key.
40
- # @param id [Integer] Staff ID
41
- # @raise [ROM::TupleCountMismatchError] if not found on database
42
- # @return [ROM::Struct::Auction]
77
+ # Retrieves an staff from the database by its primary key, raising an error if not found.
78
+ #
79
+ # @param id [Integer] The ID of the staff to retrieve.
80
+ # @raise [ROM::TupleCountMismatchError] if the staff is not found.
81
+ # @return [ROM::Struct::Staff] The retrieved staff.
82
+ #
43
83
  def by_id!(id)
44
84
  staffs.by_pk(id).one!
45
85
  end
46
86
 
47
- # Search staff in database by email of phone keys.
48
- # @param login [String] Staff email or phone
49
- # @return [ROM::Struct::Staff, nil]
87
+ # Searches for a staff in the database by email or phone keys.
88
+ #
89
+ # @param login [String] The email or phone of the staff.
90
+ # @return [ROM::Struct::Staff, nil] The staff found with the provided email or phone,
91
+ # or nil if not found.
50
92
  def by_login(login)
51
93
  staffs.where(Sequel[email: login] | Sequel[phone: login]).one
52
94
  end
53
95
 
54
- # Checks if it returns any staff given one or more conditions.
55
- # @param conditions [Hash] DSL Dataset
56
- # @return [true] when some staff is returned from the given condition.
57
- # @return [false] when no staff is returned from the given condition.
96
+ # Checks if a bid exists based on the provided conditions.
97
+ #
98
+ # @param conditions [Hash] The conditions to check (DSL Dataset).
99
+ # @return [Boolean] true if a staff exists that matches the conditions, otherwise false.
58
100
  def exists?(conditions)
59
101
  staffs.exist?(conditions)
60
102
  end
@@ -3,7 +3,40 @@
3
3
  module AuctionFunCore
4
4
  module Repos
5
5
  module UserContext
6
- # SQL repository for users.
6
+ # Repository for handling repository operations related to users.
7
+ #
8
+ # This repository provides methods to interact with user data in the database,
9
+ # including creating, updating, deleting, and retrieving users.
10
+ #
11
+ # @example
12
+ # user_repo = AuctionFunCore::Repos::UserContext::UserRepository.new
13
+ #
14
+ # # Retrieve all users
15
+ # all_users = user_repo.all
16
+ #
17
+ # # Get the total number of users
18
+ # total_users = user_repo.count
19
+ #
20
+ # # Find a user by its ID
21
+ # user = user_repo.by_id(123)
22
+ #
23
+ # # Find a user by its ID and raise an error if not found
24
+ # user = user_repo.by_id!(123)
25
+ #
26
+ # # Search for a user by email or phone
27
+ # user = user_repo.by_login('example@example.com')
28
+ # user = user_repo.by_login('1234567890')
29
+ #
30
+ # # Search for a user by email confirmation token
31
+ # user = user_repo.by_email_confirmation_token('email_confirmation_token')
32
+ #
33
+ # # Search for a user by phone confirmation token
34
+ # user = user_repo.by_phone_confirmation_token('phone_confirmation_token')
35
+ #
36
+ # @see AuctionFunCore::Entities::User Struct representing user data
37
+ # @see https://rom-rb.org/learn/sql/3.3/queries/
38
+ # @see https://api.rom-rb.org/rom-sql/ROM/SQL/Relation/Reading
39
+ #
7
40
  class UserRepository < ROM::Repository[:users]
8
41
  include Import["container"]
9
42
 
@@ -11,7 +44,7 @@ module AuctionFunCore
11
44
  commands :create, update: :by_pk, delete: :by_pk
12
45
 
13
46
  # Returns all users in database.
14
- # @return [Array<ROM::Struct::User>, []]
47
+ # @return [Array<ROM::Struct::User>]
15
48
  def all
16
49
  users.to_a
17
50
  end
@@ -22,53 +55,64 @@ module AuctionFunCore
22
55
  users.count
23
56
  end
24
57
 
25
- # Mount SQL conditions in query for search in database.
26
- # @param conditions [Hash] DSL Dataset
27
- # @return [AuctionFunCore::Relations::Users]
58
+ # Constructs SQL conditions for querying users in the database.
59
+ #
60
+ # @param conditions [Hash] The conditions to be used in the query (DSL Dataset).
61
+ # @return [AuctionFunCore::Relations::Users] The relation containing the users that match the given conditions.
28
62
  def query(conditions)
29
63
  users.where(conditions)
30
64
  end
31
65
 
32
- # Search user in database by primary key.
33
- # @param id [Integer] User ID
34
- # @return [ROM::Struct::User, nil]
66
+ # Retrieves a user from the database by its primary key.
67
+ #
68
+ # @param id [Integer] The ID of the user to retrieve.
69
+ # @return [ROM::Struct::User, nil] The retrieved user, or nil if not found.
70
+ #
35
71
  def by_id(id)
36
72
  users.by_pk(id).one
37
73
  end
38
74
 
39
- # Search user in database by primary key.
40
- # @param id [Integer] User ID
41
- # @raise [ROM::TupleCountMismatchError] if not found on database
42
- # @return [ROM::Struct::Auction]
75
+ # Retrieves a user from the database by its primary key, raising an error if not found.
76
+ #
77
+ # @param id [Integer] The ID of the user to retrieve.
78
+ # @raise [ROM::TupleCountMismatchError] if the user is not found.
79
+ # @return [ROM::Struct::User] The retrieved user.
80
+ #
43
81
  def by_id!(id)
44
82
  users.by_pk(id).one!
45
83
  end
46
84
 
47
- # Search user in database by email of phone keys.
48
- # @param login [String] User email or phone
49
- # @return [ROM::Struct::User, nil]
85
+ # Searches for a user in the database by email or phone keys.
86
+ #
87
+ # @param login [String] The email or phone of the user.
88
+ # @return [ROM::Struct::User, nil] The user found with the provided email or phone,
89
+ # or nil if not found.
50
90
  def by_login(login)
51
91
  users.where(Sequel[email: login] | Sequel[phone: login]).one
52
92
  end
53
93
 
54
- # Search user in database by email_confirmation_token key.
55
- # @param email_confirmation_token [String] User email confirmation token
56
- # @return [ROM::Struct::User, nil]
94
+ # Searches for a user in the database by email confirmation token.
95
+ #
96
+ # @param email_confirmation_token [String] The email confirmation token of the user.
97
+ # @return [ROM::Struct::User, nil] The user found with the provided email confirmation token,
98
+ # or nil if not found.
57
99
  def by_email_confirmation_token(email_confirmation_token)
58
100
  users.where(Sequel[email_confirmation_token: email_confirmation_token]).one
59
101
  end
60
102
 
61
- # Search user in database by phone_confirmation_token of phone keys.
62
- # @param phone [String] User phone confirmation token
63
- # @return [ROM::Struct::User, nil]
103
+ # Searches for a user in the database by phone confirmation token.
104
+ #
105
+ # @param phone_confirmation_token [String] The phone confirmation token of the user.
106
+ # @return [ROM::Struct::User, nil] The user found with the provided phone confirmation token,
107
+ # or nil if not found.
64
108
  def by_phone_confirmation_token(phone_confirmation_token)
65
109
  users.where(Sequel[phone_confirmation_token: phone_confirmation_token]).one
66
110
  end
67
111
 
68
- # Checks if it returns any user given one or more conditions.
69
- # @param conditions [Hash] DSL Dataset
70
- # @return [true] when some user is returned from the given condition.
71
- # @return [false] when no user is returned from the given condition.
112
+ # Checks if a user exists based on the provided conditions.
113
+ #
114
+ # @param conditions [Hash] The conditions to check (DSL Dataset).
115
+ # @return [Boolean] true if a user exists that matches the conditions, otherwise false.
72
116
  def exists?(conditions)
73
117
  users.exist?(conditions)
74
118
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AuctionFunCore
4
+ module Services
5
+ module Mail
6
+ module AuctionContext
7
+ module PostAuction
8
+ # Service class responsible for sending emails to auction participants.
9
+ class ParticipantMailer
10
+ include IdleMailer::Mailer
11
+ include IdleMailer::TemplateManager
12
+
13
+ # Initializes a new ParticipantMailer instance.
14
+ #
15
+ # @param auction [ROM::Struct::Auction] The auction object
16
+ # @param participant [ROM::Struct::User] The participant object
17
+ # @param statistics [OpenStruct] Statistics object
18
+ def initialize(auction, participant, statistics)
19
+ @auction = auction
20
+ @participant = participant
21
+ @statistics = statistics
22
+ mail.to = participant.email
23
+ mail.subject = I18n.t("mail.auction_context.post_auction.participant_mailer.subject", title: @auction.title)
24
+ end
25
+
26
+ # Returns the template name for the ParticipantMailer.
27
+ #
28
+ # @return [String] The template name.
29
+ def self.template_name
30
+ IdleMailer.config.templates.join("auction_context/post_auction/participant")
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AuctionFunCore
4
+ module Services
5
+ module Mail
6
+ module AuctionContext
7
+ module PostAuction
8
+ # Service class responsible for sending emails to auction winners.
9
+ class WinnerMailer
10
+ include IdleMailer::Mailer
11
+ include IdleMailer::TemplateManager
12
+
13
+ # Initializes a new WinnerMailer instance.
14
+ #
15
+ # @param auction [ROM::Struct::Auction] The auction object
16
+ # @param winner [ROM::Struct::User] The winner object
17
+ # @param statistics [OpenStruct] Statistics object
18
+ def initialize(auction, winner, statistics)
19
+ @auction = auction
20
+ @winner = winner
21
+ @statistics = statistics
22
+ mail.to = winner.email
23
+ mail.subject = I18n.t("mail.auction_context.post_auction.winner_mailer.subject", title: @auction.title)
24
+ end
25
+
26
+ # Returns the template name for the WinnerMailer.
27
+ #
28
+ # @return [String] The template name.
29
+ def self.template_name
30
+ IdleMailer.config.templates.join("auction_context/post_auction/winner")
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AuctionFunCore
4
+ module Services
5
+ module Mail
6
+ module AuctionContext
7
+ module PreAuction
8
+ # # Service class responsible for sending auction start reminder emails to participants.
9
+ class AuctionStartReminderMailer
10
+ include IdleMailer::Mailer
11
+ include IdleMailer::TemplateManager
12
+
13
+ # Initializes a new AuctionStartReminderMailer instance.
14
+ #
15
+ # @param auction [ROM::Struct::Auction] The auction object
16
+ # @param participant [ROM::Struct::User] The participant object
17
+ def initialize(auction, participant)
18
+ @auction = auction
19
+ @participant = participant
20
+ mail.to = participant.email
21
+ mail.subject = I18n.t("mail.auction_context.pre_auction.auction_start_reminder_mailer.subject", title: @auction.title)
22
+ end
23
+
24
+ # Returns the template name for the AuctionStartReminderMailer.
25
+ #
26
+ # @return [String] The template name.
27
+ def self.template_name
28
+ IdleMailer.config.templates.join("auction_context/pre_auction/auction_start_reminder")
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,173 @@
1
+ <table align="center" border="0" cellpadding="0" cellspacing="0" style="width:600px;" width="600">
2
+ <tr>
3
+ <td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
4
+ <div style="margin:0px auto;max-width:600px;">
5
+ <table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
6
+ <tbody>
7
+ <tr>
8
+ <td style="direction:ltr;font-size:0px;padding:20px 0;padding-bottom:0px;text-align:center;">
9
+ <table role="presentation" border="0" cellpadding="0" cellspacing="0">
10
+ <tr>
11
+ <td style="vertical-align:top;width:600px;">
12
+ <div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
13
+ <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
14
+ <tbody>
15
+ <tr>
16
+ <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
17
+ <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-collapse:collapse;border-spacing:0px;">
18
+ <tbody>
19
+ <tr>
20
+ <td style="width:50px;">
21
+ <img alt="image description" height="auto" src="https://codedmails.com/images/logo-circle.png" style="border:0;display:block;outline:none;text-decoration:none;height:auto;width:100%;font-size:14px;" width="50" />
22
+ </td>
23
+ </tr>
24
+ </tbody>
25
+ </table>
26
+ </td>
27
+ </tr>
28
+ <tr>
29
+ <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
30
+ <div style="font-family:Helvetica, Arial, sans-serif;font-size:18px;font-weight:400;line-height:24px;text-align:left;color:#434245;">
31
+ <h1 style="margin: 0; font-size: 24px; line-height: normal; font-weight: bold;">
32
+ <%= I18n.t("application.general.hello", name: @participant.name) %>,
33
+ </h1>
34
+ </div>
35
+ </td>
36
+ </tr>
37
+ </tbody>
38
+ </table>
39
+ </div>
40
+ </td>
41
+ </tr>
42
+ </table>
43
+ </td>
44
+ </tr>
45
+ </tbody>
46
+ </table>
47
+ </div>
48
+ </td>
49
+ </tr>
50
+ </table>
51
+ <table align="center" border="0" cellpadding="0" cellspacing="0" style="width:600px;" width="600">
52
+ <tr>
53
+ <td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
54
+ <div style="margin:0px auto;max-width:600px;">
55
+ <table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
56
+ <tbody>
57
+ <tr>
58
+ <td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
59
+ <table role="presentation" border="0" cellpadding="0" cellspacing="0">
60
+ <tr>
61
+ <td style="vertical-align:top;width:600px;">
62
+ <div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
63
+ <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
64
+ <tbody>
65
+ <tr>
66
+ <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
67
+ <div style="font-family:Helvetica, Arial, sans-serif;font-size:18px;font-weight:400;line-height:24px;text-align:left;color:#434245;">
68
+ <%= raw I18n.t("mail.auction_context.post_auction.participant_mailer.body.description", title: @auction.title) %>
69
+ </div>
70
+ </td>
71
+ </tr>
72
+ <tr>
73
+ <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
74
+ <div style="font-family:Helvetica, Arial, sans-serif;font-size:18px;font-weight:400;line-height:24px;text-align:left;color:#434245;">
75
+ <ul>
76
+ <li><%= I18n.t("mail.auction_context.post_auction.participant_mailer.body.stats.auction_total_bids", auction_total_bids: @statistics.auction_total_bids) %></li>
77
+ <li><%= I18n.t("mail.auction_context.post_auction.participant_mailer.body.stats.winner_bid", winner_bid: @statistics.winner_bid) %></li>
78
+ <li><%= I18n.t("mail.auction_context.post_auction.participant_mailer.body.stats.auction_date") %>: <%= I18n.l(@statistics.auction_date, format: :default) %></li>
79
+ </ul>
80
+ </td>
81
+ </tr>
82
+ <tr>
83
+ <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
84
+ <div style="font-family:Helvetica, Arial, sans-serif;font-size:18px;font-weight:bold;line-height:24px;text-align:left;color:#434245;">
85
+ <%= I18n.t("application.general.team") %>
86
+ </div>
87
+ </td>
88
+ </tr>
89
+ <tr>
90
+ <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
91
+ <table align="left" border="0" cellpadding="0" cellspacing="0" role="presentation">
92
+ <tr>
93
+ <td>
94
+ <table align="left" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
95
+ <tbody>
96
+ <tr>
97
+ <td style="padding:4px;">
98
+ <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:18px;">
99
+ <tbody>
100
+ <tr>
101
+ <td style="font-size:0;height:18px;vertical-align:middle;width:18px;">
102
+ <a href="https://twitter.com/auctionfun" target="_blank" style="color: #2e58ff; text-decoration: none;">
103
+ <img alt="twitter-logo" height="18" src="https://codedmails.com/images/social/black/twitter-logo-transparent-black.png" style="border-radius:3px;display:block;" width="18" />
104
+ </a>
105
+ </td>
106
+ </tr>
107
+ </tbody>
108
+ </table>
109
+ </td>
110
+ </tr>
111
+ </tbody>
112
+ </table>
113
+ </td>
114
+ <td>
115
+ <table align="left" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
116
+ <tbody>
117
+ <tr>
118
+ <td style="padding:4px;">
119
+ <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:18px;">
120
+ <tbody>
121
+ <tr>
122
+ <td style="font-size:0;height:18px;vertical-align:middle;width:18px;">
123
+ <a href="https://facebook.com/auctionfun" target="_blank" style="color: #2e58ff; text-decoration: none;">
124
+ <img alt="facebook-logo" height="18" src="https://codedmails.com/images/social/black/facebook-logo-transparent-black.png" style="border-radius:3px;display:block;" width="18" />
125
+ </a>
126
+ </td>
127
+ </tr>
128
+ </tbody>
129
+ </table>
130
+ </td>
131
+ </tr>
132
+ </tbody>
133
+ </table>
134
+ </td>
135
+ <td>
136
+ <table align="left" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
137
+ <tbody>
138
+ <tr>
139
+ <td style="padding:4px;">
140
+ <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:18px;">
141
+ <tbody>
142
+ <tr>
143
+ <td style="font-size:0;height:18px;vertical-align:middle;width:18px;">
144
+ <a href="https://instagram.com/auctionfun" target="_blank" style="color: #2e58ff; text-decoration: none;">
145
+ <img alt="instagram-logo" height="18" src="https://codedmails.com/images/social/black/instagram-logo-transparent-black.png" style="border-radius:3px;display:block;" width="18" />
146
+ </a>
147
+ </td>
148
+ </tr>
149
+ </tbody>
150
+ </table>
151
+ </td>
152
+ </tr>
153
+ </tbody>
154
+ </table>
155
+ </td>
156
+ </tr>
157
+ </table>
158
+ </td>
159
+ </tr>
160
+ </tbody>
161
+ </table>
162
+ </div>
163
+ </td>
164
+ </tr>
165
+ </table>
166
+ </td>
167
+ </tr>
168
+ </tbody>
169
+ </table>
170
+ </div>
171
+ </td>
172
+ </tr>
173
+ </table>