auction_fun_core 0.8.5 → 0.8.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +25 -0
  3. data/auction_fun_core.gemspec +1 -0
  4. data/db/migrate/20240229143000_create_auctions.rb +1 -0
  5. data/db/seeds.rb +87 -36
  6. data/i18n/en-US/contracts/contracts.en-US.yml +9 -0
  7. data/i18n/en-US/mail/application.en-US.yml +59 -0
  8. data/i18n/en-US/mail/auction_context/post_auction/participant.en-US.yml +13 -0
  9. data/i18n/en-US/mail/auction_context/post_auction/winner.en-US.yml +13 -0
  10. data/i18n/pt-BR/contracts/contracts.pt-BR.yml +9 -0
  11. data/i18n/pt-BR/mail/application.pt-BR.yml +59 -0
  12. data/i18n/pt-BR/mail/auction_context/post_auction/participant.pt-BR.yml +13 -0
  13. data/i18n/pt-BR/mail/auction_context/post_auction/winner.pt-BR.yml +13 -0
  14. data/i18n/pt-BR/mail/user_context/registration.pt-BR.yml +0 -4
  15. data/lib/auction_fun_core/contracts/auction_context/post_auction/participant_contract.rb +42 -0
  16. data/lib/auction_fun_core/contracts/auction_context/post_auction/winner_contract.rb +41 -0
  17. data/lib/auction_fun_core/contracts/auction_context/processor/finish/closed_contract.rb +47 -0
  18. data/lib/auction_fun_core/contracts/auction_context/processor/finish/penny_contract.rb +48 -0
  19. data/lib/auction_fun_core/contracts/auction_context/processor/finish/standard_contract.rb +48 -0
  20. data/lib/auction_fun_core/entities/auction.rb +6 -0
  21. data/lib/auction_fun_core/operations/auction_context/create_operation.rb +12 -2
  22. data/lib/auction_fun_core/operations/auction_context/post_auction/participant_operation.rb +52 -0
  23. data/lib/auction_fun_core/operations/auction_context/post_auction/winner_operation.rb +51 -0
  24. data/lib/auction_fun_core/operations/auction_context/processor/finish/closed_operation.rb +100 -0
  25. data/lib/auction_fun_core/operations/auction_context/processor/finish/penny_operation.rb +100 -0
  26. data/lib/auction_fun_core/operations/auction_context/processor/finish/standard_operation.rb +102 -0
  27. data/lib/auction_fun_core/operations/auction_context/processor/start_operation.rb +23 -11
  28. data/lib/auction_fun_core/operations/bid_context/create_bid_penny_operation.rb +57 -7
  29. data/lib/auction_fun_core/operations/staff_context/registration_operation.rb +10 -0
  30. data/lib/auction_fun_core/relations/auctions.rb +167 -26
  31. data/lib/auction_fun_core/relations/staffs.rb +1 -1
  32. data/lib/auction_fun_core/services/mail/auction_context/post_auction/participant_mailer.rb +31 -0
  33. data/lib/auction_fun_core/services/mail/auction_context/post_auction/winner_mailer.rb +31 -0
  34. data/lib/auction_fun_core/services/mail/templates/auction_context/post_auction/participant.html.erb +173 -0
  35. data/lib/auction_fun_core/services/mail/templates/auction_context/post_auction/winner.html.erb +174 -0
  36. data/lib/auction_fun_core/services/mail/templates/user_context/registration.html.erb +2 -2
  37. data/lib/auction_fun_core/version.rb +1 -1
  38. data/lib/auction_fun_core/workers/application_job.rb +2 -0
  39. data/lib/auction_fun_core/workers/operations/auction_context/post_auction/participant_operation_job.rb +33 -0
  40. data/lib/auction_fun_core/workers/operations/auction_context/post_auction/winner_operation_job.rb +33 -0
  41. data/lib/auction_fun_core/workers/operations/auction_context/processor/finish/closed_operation_job.rb +34 -0
  42. data/lib/auction_fun_core/workers/operations/auction_context/processor/finish/penny_operation_job.rb +37 -0
  43. data/lib/auction_fun_core/workers/operations/auction_context/processor/finish/standard_operation_job.rb +34 -0
  44. data/lib/auction_fun_core/workers/services/mail/auction_context/post_auction/participant_mailer_job.rb +51 -0
  45. data/lib/auction_fun_core/workers/services/mail/auction_context/post_auction/winner_mailer_job.rb +51 -0
  46. data/system/providers/background_job.rb +19 -0
  47. metadata +43 -5
  48. data/lib/auction_fun_core/contracts/auction_context/processor/finish_contract.rb +0 -27
  49. data/lib/auction_fun_core/operations/auction_context/processor/finish_operation.rb +0 -61
  50. data/lib/auction_fun_core/workers/operations/auction_context/processor/finish_operation_job.rb +0 -32
@@ -7,13 +7,13 @@ module AuctionFunCore
7
7
  class Auctions < ROM::Relation[:sql]
8
8
  use :pagination, per_page: 10
9
9
 
10
- KINDS = Types::Coercible::String.default("standard").enum("standard", "penny", "closed")
11
- STATUSES = Types::Coercible::String.default("scheduled")
12
- .enum("scheduled", "running", "paused", "canceled", "finished")
10
+ KINDS = Types::Coercible::String.enum("standard", "penny", "closed")
11
+ STATUSES = Types::Coercible::String.enum("scheduled", "running", "paused", "canceled", "finished")
13
12
 
14
13
  schema(:auctions, infer: true) do
15
14
  attribute :id, Types::Integer
16
15
  attribute :staff_id, Types::ForeignKey(:staffs)
16
+ attribute :winner_id, Types::ForeignKey(:users)
17
17
  attribute :title, Types::String
18
18
  attribute :description, Types::String
19
19
  attribute :kind, KINDS
@@ -32,6 +32,7 @@ module AuctionFunCore
32
32
 
33
33
  associations do
34
34
  belongs_to :staff, as: :staff, relation: :staffs
35
+ belongs_to :winner, as: :winner, relation: :users, foreign_key: :winner_id
35
36
  has_many :bids, as: :bids, relation: :bids
36
37
  end
37
38
  end
@@ -40,22 +41,13 @@ module AuctionFunCore
40
41
  auto_struct(true)
41
42
 
42
43
  def all(page = 1, per_page = 10, options = {bidders_count: 3})
43
- offset = ((page - 1) * per_page)
44
-
45
- read(all_auctions_with_bid_info(per_page, offset, options))
46
- end
47
-
48
- def info(auction_id, options = {bidders_count: 3})
49
- raise "Invalid argument" unless auction_id.is_a?(Integer)
44
+ raise "Invalid argument" unless page.is_a?(Integer) && per_page.is_a?(Integer)
50
45
 
51
- read(auction_with_bid_info(auction_id, options))
52
- end
53
-
54
- private
46
+ offset = ((page - 1) * per_page)
55
47
 
56
- def auction_with_bid_info(auction_id, options = {bidders_count: 3})
57
- "SELECT a.id, a.title, a.description, a.kind, a.status, a.started_at, a.finished_at, a.stopwatch, a.initial_bid_cents,
58
- (SELECT COUNT(*) FROM (SELECT * FROM bids WHERE bids.auction_id = #{auction_id}) dt) AS total_bids,
48
+ read("
49
+ SELECT a.id, a.title, a.description, a.kind, a.status, a.started_at, a.finished_at, a.stopwatch, a.initial_bid_cents,
50
+ (SELECT COUNT(*) FROM (SELECT * FROM bids WHERE bids.auction_id = a.id) dt) AS total_bids,
59
51
  CASE
60
52
  WHEN a.kind = 'standard' THEN
61
53
  json_build_object(
@@ -78,15 +70,18 @@ module AuctionFunCore
78
70
  json_build_object('minimal', (a.initial_bid_cents + (a.initial_bid_cents * 0.10))::int)
79
71
  END as bids
80
72
  FROM auctions as a
81
- LEFT JOIN LATERAL (SELECT * FROM bids WHERE auction_id = a.id ORDER BY value_cents DESC LIMIT #{options[:bidders_count]}) as bi ON a.id = bi.auction_id AND a.id = #{auction_id}
73
+ LEFT JOIN LATERAL (SELECT * FROM bids WHERE auction_id = a.id ORDER BY value_cents DESC LIMIT #{options[:bidders_count]}) as bi ON a.id = bi.auction_id
82
74
  LEFT JOIN users ON bi.user_id = users.id AND bi.auction_id = a.id
83
- WHERE a.id = #{auction_id}
84
- GROUP BY a.id"
75
+ GROUP BY a.id
76
+ LIMIT #{per_page} OFFSET #{offset}")
85
77
  end
86
78
 
87
- def all_auctions_with_bid_info(per_page, offset, options = {bidders_count: 3})
88
- "SELECT a.id, a.title, a.description, a.kind, a.status, a.started_at, a.finished_at, a.stopwatch, a.initial_bid_cents,
89
- (SELECT COUNT(*) FROM (SELECT * FROM bids WHERE bids.auction_id = a.id) dt) AS total_bids,
79
+ def info(auction_id, options = {bidders_count: 3})
80
+ raise "Invalid argument" unless auction_id.is_a?(Integer)
81
+
82
+ read("
83
+ SELECT a.id, a.title, a.description, a.kind, a.status, a.started_at, a.finished_at, a.stopwatch, a.initial_bid_cents,
84
+ (SELECT COUNT(*) FROM (SELECT * FROM bids WHERE bids.auction_id = #{auction_id}) dt) AS total_bids,
90
85
  CASE
91
86
  WHEN a.kind = 'standard' THEN
92
87
  json_build_object(
@@ -109,10 +104,156 @@ module AuctionFunCore
109
104
  json_build_object('minimal', (a.initial_bid_cents + (a.initial_bid_cents * 0.10))::int)
110
105
  END as bids
111
106
  FROM auctions as a
112
- LEFT JOIN LATERAL (SELECT * FROM bids WHERE auction_id = a.id ORDER BY value_cents DESC LIMIT #{options[:bidders_count]}) as bi ON a.id = bi.auction_id
107
+ LEFT JOIN LATERAL (SELECT * FROM bids WHERE auction_id = a.id ORDER BY value_cents DESC LIMIT #{options[:bidders_count]}) as bi ON a.id = bi.auction_id AND a.id = #{auction_id}
113
108
  LEFT JOIN users ON bi.user_id = users.id AND bi.auction_id = a.id
114
- GROUP BY a.id
115
- LIMIT #{per_page} OFFSET #{offset}"
109
+ WHERE a.id = #{auction_id}
110
+ GROUP BY a.id")
111
+ end
112
+
113
+ # Retrieves the standard auction winner and other participating bidders for a specified auction.
114
+ #
115
+ # This method queries the database to fetch the winner based on the highest bid and collects an array
116
+ # of other participants who placed bids in the auction, all except for the winner. The method returns
117
+ # structured data that includes the auction ID, winner's ID, total number of bids,
118
+ # and a list of participant IDs.
119
+ #
120
+ # @return [Hash] a hash containing details about the auction, including winner and participants:
121
+ # - :id [Integer] the ID of the auction
122
+ # - :winner_id [Integer] the ID of the winning bidder
123
+ # - :total_bids [Integer] the total number of bids placed in the auction
124
+ # - :participants [Array<Integer>] an array of user IDs of the other participants, excluding the winner
125
+ def load_standard_auction_winners_and_participants(auction_id)
126
+ raise "Invalid argument" unless auction_id.is_a?(Integer)
127
+
128
+ read("SELECT a.id, a.kind, a.status, w.user_id AS winner_id, COALESCE(COUNT(b.id), 0) AS total_bids,
129
+ COALESCE(
130
+ ARRAY_REMOVE(ARRAY_AGG(DISTINCT b.user_id ORDER BY b.user_id), w.user_id), ARRAY[]::INT[]
131
+ ) AS participant_ids
132
+ FROM auctions a
133
+ LEFT JOIN bids b ON a.id = b.auction_id
134
+ LEFT JOIN (
135
+ SELECT auction_id, user_id, MAX(value_cents) AS value_cents
136
+ FROM bids
137
+ WHERE auction_id = #{auction_id}
138
+ GROUP BY auction_id, user_id
139
+ ORDER BY value_cents DESC
140
+ LIMIT 1
141
+ ) AS w ON a.id = w.auction_id
142
+ WHERE a.id = #{auction_id}
143
+ GROUP BY a.id, w.user_id")
144
+ end
145
+
146
+ # Retrieves the penny auction winner and other participating bidders for a specified auction.
147
+ #
148
+ # This method queries the database to fetch the winner based on the latest bid and collects an array
149
+ # of other participants who placed bids in the auction, all except for the winner. The method returns
150
+ # structured data that includes the auction ID, winner's ID, total number of bids,
151
+ # and a list of participant IDs.
152
+ #
153
+ # @return [Hash] a hash containing details about the auction, including winner and participants:
154
+ # - :id [Integer] the ID of the auction
155
+ # - :winner_id [Integer] the ID of the winning bidder
156
+ # - :total_bids [Integer] the total number of bids placed in the auction
157
+ # - :participants [Array<Integer>] an array of user IDs of the other participants, excluding the winner
158
+ def load_penny_auction_winners_and_participants(auction_id)
159
+ raise "Invalid argument" unless auction_id.is_a?(Integer)
160
+
161
+ read("SELECT a.id, a.kind, a.status, w.user_id AS winner_id, COALESCE(COUNT(b.id), 0) AS total_bids,
162
+ COALESCE(
163
+ ARRAY_REMOVE(ARRAY_AGG(DISTINCT b.user_id ORDER BY b.user_id), w.user_id), ARRAY[]::INT[]
164
+ ) AS participant_ids
165
+ FROM auctions a
166
+ LEFT JOIN bids b ON a.id = b.auction_id
167
+ LEFT JOIN (
168
+ SELECT auction_id, user_id
169
+ FROM bids
170
+ WHERE auction_id = #{auction_id}
171
+ ORDER BY bids.created_at DESC
172
+ LIMIT 1
173
+ ) AS w ON a.id = w.auction_id
174
+ WHERE a.id = #{auction_id}
175
+ GROUP BY a.id, w.user_id")
176
+ end
177
+
178
+ # Retrieves the closed auction winner and other participating bidders for a specified auction.
179
+ #
180
+ # This method queries the database to fetch the winner based on the highest bid and collects an array
181
+ # of other participants who placed bids in the auction, all except for the winner. The method returns
182
+ # structured data that includes the auction ID, winner's ID, total number of bids,
183
+ # and a list of participant IDs.
184
+ #
185
+ # @return [Hash] a hash containing details about the auction, including winner and participants:
186
+ # - :id [Integer] the ID of the auction
187
+ # - :winner_id [Integer] the ID of the winning bidder
188
+ # - :total_bids [Integer] the total number of bids placed in the auction
189
+ # - :participants [Array<Integer>] an array of user IDs of the other participants, excluding the winner
190
+ def load_closed_auction_winners_and_participants(auction_id)
191
+ raise "Invalid argument" unless auction_id.is_a?(Integer)
192
+
193
+ read("SELECT a.id, a.kind, a.status, w.user_id AS winner_id, COALESCE(COUNT(b.id), 0) AS total_bids,
194
+ COALESCE(
195
+ ARRAY_REMOVE(ARRAY_AGG(DISTINCT b.user_id ORDER BY b.user_id), w.user_id), ARRAY[]::INT[]
196
+ ) AS participant_ids
197
+ FROM auctions a
198
+ LEFT JOIN bids b ON a.id = b.auction_id
199
+ LEFT JOIN (
200
+ SELECT auction_id, user_id, MAX(value_cents) AS value_cents
201
+ FROM bids
202
+ WHERE auction_id = #{auction_id}
203
+ GROUP BY auction_id, user_id
204
+ ORDER BY value_cents DESC
205
+ LIMIT 1
206
+ ) AS w ON a.id = w.auction_id
207
+ WHERE a.id = #{auction_id}
208
+ GROUP BY a.id, w.user_id")
209
+ end
210
+
211
+ def load_winner_statistics(auction_id, winner_id)
212
+ raise "Invalid argument" unless auction_id.is_a?(Integer) && winner_id.is_a?(Integer)
213
+
214
+ read("SELECT a.id, COUNT(b.id) AS auction_total_bids, MAX(b.value_cents) AS winner_bid,
215
+ date(a.finished_at) as auction_date,
216
+ (SELECT COUNT(*) FROM bids b2
217
+ WHERE b2.auction_id = #{auction_id}
218
+ AND b2.user_id = #{winner_id}
219
+ ) AS winner_total_bids
220
+ FROM auctions a
221
+ LEFT JOIN bids b ON a.id = b.auction_id AND a.id = #{auction_id}
222
+ LEFT JOIN users u ON u.id = b.user_id AND u.id = #{winner_id}
223
+ LEFT JOIN (
224
+ SELECT auction_id, user_id, MAX(value_cents) AS value_cents
225
+ FROM bids
226
+ WHERE auction_id = #{auction_id}
227
+ GROUP BY auction_id, user_id
228
+ ORDER BY value_cents DESC
229
+ LIMIT 1
230
+ ) AS w ON a.id = w.auction_id
231
+ WHERE a.id = #{auction_id}
232
+ GROUP BY a.id")
233
+ end
234
+
235
+ def load_participant_statistics(auction_id, participant_id)
236
+ raise "Invalid argument" unless auction_id.is_a?(Integer) && participant_id.is_a?(Integer)
237
+
238
+ read("SELECT a.id, COUNT(b.id) AS auction_total_bids, MAX(b.value_cents) AS winner_bid,
239
+ date(a.finished_at) as auction_date,
240
+ (SELECT COUNT(*) FROM bids b2
241
+ WHERE b2.auction_id = #{auction_id}
242
+ AND b2.user_id = #{participant_id}
243
+ ) AS winner_total_bids
244
+ FROM auctions a
245
+ LEFT JOIN bids b ON a.id = b.auction_id AND a.id = #{auction_id}
246
+ LEFT JOIN users u ON u.id = b.user_id AND u.id = #{participant_id}
247
+ LEFT JOIN (
248
+ SELECT auction_id, user_id, MAX(value_cents) AS value_cents
249
+ FROM bids
250
+ WHERE auction_id = #{auction_id}
251
+ GROUP BY auction_id, user_id
252
+ ORDER BY value_cents DESC
253
+ LIMIT 1
254
+ ) AS w ON a.id = w.auction_id
255
+ WHERE a.id = #{auction_id}
256
+ GROUP BY a.id")
116
257
  end
117
258
  end
118
259
  end
@@ -7,7 +7,7 @@ module AuctionFunCore
7
7
  class Staffs < ROM::Relation[:sql]
8
8
  use :pagination, per_page: 10
9
9
 
10
- STAFF_KINDS = Types::Coercible::String.default("common").enum("root", "common")
10
+ STAFF_KINDS = Types::Coercible::String.enum("root", "common")
11
11
 
12
12
  schema(:staffs, infer: true) do
13
13
  attribute :id, Types::Integer
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AuctionFunCore
4
+ module Services
5
+ module Mail
6
+ module AuctionContext
7
+ module PostAuction
8
+ class ParticipantMailer
9
+ include IdleMailer::Mailer
10
+ include IdleMailer::TemplateManager
11
+
12
+ # @param auction [ROM::Struct::Auction] The auction object
13
+ # @param participant [ROM::Struct::User] The user object
14
+ # @param statistics [OpenStruct] Statistics object
15
+ def initialize(auction, participant, statistics)
16
+ @auction = auction
17
+ @participant = participant
18
+ @statistics = statistics
19
+ mail.to = participant.email
20
+ mail.subject = I18n.t("mail.auction_context.post_auction.participant_mailer.subject", title: @auction.title)
21
+ end
22
+
23
+ def self.template_name
24
+ IdleMailer.config.templates.join("auction_context/post_auction/participant")
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AuctionFunCore
4
+ module Services
5
+ module Mail
6
+ module AuctionContext
7
+ module PostAuction
8
+ class WinnerMailer
9
+ include IdleMailer::Mailer
10
+ include IdleMailer::TemplateManager
11
+
12
+ # @param auction [ROM::Struct::Auction] The auction object
13
+ # @param winner [ROM::Struct::User] The user object
14
+ # @param statistics [OpenStruct] Statistics object
15
+ def initialize(auction, winner, statistics)
16
+ @auction = auction
17
+ @winner = winner
18
+ @statistics = statistics
19
+ mail.to = winner.email
20
+ mail.subject = I18n.t("mail.auction_context.post_auction.winner_mailer.subject", title: @auction.title)
21
+ end
22
+
23
+ def self.template_name
24
+ IdleMailer.config.templates.join("auction_context/post_auction/winner")
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ 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("mail.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>