Skip to content

Commit b141878

Browse files
authored
feat: terms & conditions (#49)
1 parent 9bd1855 commit b141878

5 files changed

Lines changed: 169 additions & 1 deletion

File tree

lib/gallium/ticketing/checkout_form.ex

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ defmodule Gallium.Ticketing.CheckoutForm do
1515
field :wants_transport, :boolean, default: false
1616
field :table_preference, :string
1717
field :allergies, :string
18+
field :terms_accepted, :boolean, default: false, virtual: true
1819

1920
embeds_one :accompany, AccompanyForm, primary_key: false, on_replace: :delete do
2021
field :full_name, :string
@@ -33,11 +34,13 @@ defmodule Gallium.Ticketing.CheckoutForm do
3334
:is_cesium_member,
3435
:wants_transport,
3536
:table_preference,
36-
:allergies
37+
:allergies,
38+
:terms_accepted
3739
])
3840
|> validate_required([:full_name, :student_number, :phone_number, :is_cesium_member],
3941
message: "Este campo é obrigatório"
4042
)
43+
|> validate_terms_accepted()
4144
|> validate_length(:full_name, min: 3, message: "O nome tem de ter pelo menos 3 letras")
4245
|> validate_format(:phone_number, ~r/^\+?\d{9,15}$/, message: "Número de telefone inválido")
4346
|> validate_format(:student_number, ~r/^(a\d{1,6}|pg\d{1,5}|e\d{1,6})$/i,
@@ -52,6 +55,18 @@ defmodule Gallium.Ticketing.CheckoutForm do
5255
|> cast_embed(:accompany, with: &accompany_changeset/2)
5356
end
5457

58+
defp validate_terms_accepted(changeset) do
59+
if get_field(changeset, :terms_accepted) == true do
60+
changeset
61+
else
62+
add_error(
63+
changeset,
64+
:terms_accepted,
65+
"Tens de aceitar os Termos e Condições para continuar"
66+
)
67+
end
68+
end
69+
5570
defp accompany_changeset(schema, attrs) do
5671
schema
5772
|> cast(attrs, [:full_name, :email, :phone_number])
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
defmodule GalliumWeb.TermsLive.Index do
2+
use GalliumWeb, :landing_view
3+
4+
@impl true
5+
def mount(_params, _session, socket) do
6+
{:ok, assign(socket, :page_title, "Termos e Condições")}
7+
end
8+
end
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
<section class="bg-beige w-full">
2+
<div class="max-w-3xl mx-auto px-6 py-16 md:py-24">
3+
<div class="text-center mb-12">
4+
<p class="text-bronze font-cormorant text-sm tracking-[3px] uppercase mb-3">
5+
Jantar de Gala 26
6+
</p>
7+
<h1 class="text-bronze font-amarante text-5xl md:text-6xl uppercase mb-4">
8+
Termos e Condições
9+
</h1>
10+
<p class="text-gray-500 font-cormorant text-lg">
11+
Lê com atenção antes de concluires a tua compra.
12+
</p>
13+
</div>
14+
15+
<div class="flex flex-col gap-10 font-cormorant text-gray-700 text-base md:text-lg leading-relaxed">
16+
<div>
17+
<h2 class="text-bronze font-amarante text-2xl uppercase tracking-wide mb-3">
18+
1. Reembolsos
19+
</h2>
20+
<p>
21+
Não são efetuados <strong>reembolsos</strong>, sob qualquer circunstância, após a
22+
confirmação do pagamento do bilhete. Ao concluíres a compra, declaras estar ciente
23+
de que o valor pago não será devolvido, total ou parcialmente, independentemente do
24+
motivo invocado (incluindo, mas não se limitando a, impossibilidade de
25+
comparência, alteração de planos pessoais ou desistência).
26+
</p>
27+
</div>
28+
29+
<div>
30+
<h2 class="text-bronze font-amarante text-2xl uppercase tracking-wide mb-3">
31+
2. Transferência do Bilhete
32+
</h2>
33+
<p>
34+
É possível alterar a pessoa associada ao bilhete, desde que tal alteração seja
35+
comunicada à organização com a devida antecedência e até à data limite de venda
36+
de bilhetes. Para solicitar a transferência, deves contactar a organização
37+
através dos canais oficiais, indicando o nome, número de estudante e contacto da
38+
nova pessoa. A transferência só se considera efetiva após confirmação por parte
39+
da organização.
40+
</p>
41+
</div>
42+
43+
<div>
44+
<h2 class="text-bronze font-amarante text-2xl uppercase tracking-wide mb-3">
45+
3. Data Limite de Venda
46+
</h2>
47+
<p>
48+
A venda de bilhetes encerra no dia <strong>21 de maio</strong>. Após esta data,
49+
não serão aceites novas inscrições nem pagamentos, ainda que existam vagas
50+
disponíveis.
51+
</p>
52+
</div>
53+
54+
<div>
55+
<h2 class="text-bronze font-amarante text-2xl uppercase tracking-wide mb-3">
56+
4. Lotação e Disponibilidade
57+
</h2>
58+
<p>
59+
O evento tem uma lotação máxima de <strong>100 pessoas</strong>. Após atingido
60+
este limite, os bilhetes poderão deixar de estar disponíveis. Caso a organização
61+
decida disponibilizar bilhetes adicionais, o respetivo preço poderá ser superior
62+
ao praticado até então. A organização reserva-se o direito de encerrar as vendas
63+
a qualquer momento, sem aviso prévio, assim que a lotação seja atingida.
64+
</p>
65+
</div>
66+
67+
<div>
68+
<h2 class="text-bronze font-amarante text-2xl uppercase tracking-wide mb-3">
69+
5. Transporte
70+
</h2>
71+
<p>
72+
O transporte (ida e volta) é assegurado pela organização apenas aos participantes
73+
que o tenham solicitado expressamente no momento da compra do bilhete.
74+
</p>
75+
<p class="mt-3">
76+
Caso indiques que <strong>não pretendes transporte</strong>, fica desde já
77+
esclarecido que o mesmo <strong>não te será garantido</strong> e não terás lugar
78+
reservado no(s) autocarro(s), mesmo que mudes de ideias posteriormente. Cabe-te a
79+
ti assegurar a tua deslocação até ao local do evento e de regresso.
80+
</p>
81+
<p class="mt-3">
82+
Caso tenhas pedido transporte e, posteriormente, percebas que afinal não
83+
necessitas dele, pedimos que comuniques essa informação à organização, com a
84+
maior brevidade possível, através dos canais oficiais. Esta cortesia permite-nos
85+
ajustar a logística e, eventualmente, disponibilizar o lugar a outro
86+
participante.
87+
</p>
88+
</div>
89+
90+
<div>
91+
<h2 class="text-bronze font-amarante text-2xl uppercase tracking-wide mb-3">
92+
6. Aceitação dos Termos
93+
</h2>
94+
<p>
95+
A compra de um bilhete para o Jantar de Gala implica a leitura, compreensão e
96+
aceitação integral dos presentes Termos e Condições. A organização reserva-se o
97+
direito de recusar a entrada no evento a participantes que não cumpram as
98+
condições aqui descritas.
99+
</p>
100+
</div>
101+
102+
<div class="border-t border-bronze/20 pt-8 mt-4">
103+
<p class="text-gray-500 text-sm tracking-wide">
104+
Para qualquer questão ou pedido relacionado com a transferência de bilhete,
105+
transporte ou outras situações previstas neste documento, contacta a organização
106+
através dos canais oficiais do CeSIUM.
107+
</p>
108+
</div>
109+
</div>
110+
</div>
111+
</section>

lib/gallium_web/live/ticketing_purchase/steps/personal_data.html.heex

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,39 @@
177177
</:icon>
178178
</.input>
179179

180+
<div class="flex flex-col gap-1 mt-2">
181+
<label class="flex items-start gap-3 font-cormorant text-base text-gray-700 cursor-pointer">
182+
<input type="hidden" name={@form_data[:terms_accepted].name} value="false" />
183+
<input
184+
type="checkbox"
185+
id={@form_data[:terms_accepted].id}
186+
name={@form_data[:terms_accepted].name}
187+
value="true"
188+
checked={@form_data[:terms_accepted].value == true}
189+
class="checkbox checkbox-sm checkbox-primary mt-1 shrink-0"
190+
/>
191+
<span>
192+
Li e aceito os
193+
<.link
194+
navigate={~p"/terms"}
195+
target="_blank"
196+
class="text-blue-500 underline hover:text-blue-700"
197+
>
198+
Termos e Condições
199+
</.link>
200+
da compra do bilhete. *
201+
</span>
202+
</label>
203+
<p
204+
:for={{msg, _} <- @form_data[:terms_accepted].errors}
205+
:if={@form_data.action == :validate}
206+
class="mt-1.5 flex gap-2 items-center text-sm text-error font-cormorant"
207+
>
208+
<.icon name="hero-exclamation-circle-mini" class="size-4 shrink-0" />
209+
{msg}
210+
</p>
211+
</div>
212+
180213
<div class="flex flex-row justify-between mt-4">
181214
<div>
182215
<.primary_button

lib/gallium_web/router.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ defmodule GalliumWeb.Router do
2424
on_mount: [{GalliumWeb.UserAuth, :mount_current_scope}] do
2525
live "/", LandingLive.Index, :index
2626
live "/tickets", TicketsLive.Index, :index
27+
live "/terms", TermsLive.Index, :index
2728
end
2829
end
2930

0 commit comments

Comments
 (0)