Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion lib/gallium/ticketing/checkout_form.ex
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ defmodule Gallium.Ticketing.CheckoutForm do
field :wants_transport, :boolean, default: false
field :table_preference, :string
field :allergies, :string
field :terms_accepted, :boolean, default: false, virtual: true

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

defp validate_terms_accepted(changeset) do
if get_field(changeset, :terms_accepted) == true do
changeset
else
add_error(
changeset,
:terms_accepted,
"Tens de aceitar os Termos e Condições para continuar"
)
end
end

defp accompany_changeset(schema, attrs) do
schema
|> cast(attrs, [:full_name, :email, :phone_number])
Expand Down
8 changes: 8 additions & 0 deletions lib/gallium_web/live/terms/index.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
defmodule GalliumWeb.TermsLive.Index do
use GalliumWeb, :landing_view

@impl true
def mount(_params, _session, socket) do
{:ok, assign(socket, :page_title, "Termos e Condições")}
end
end
111 changes: 111 additions & 0 deletions lib/gallium_web/live/terms/index.html.heex
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
<section class="bg-beige w-full">
<div class="max-w-3xl mx-auto px-6 py-16 md:py-24">
<div class="text-center mb-12">
<p class="text-bronze font-cormorant text-sm tracking-[3px] uppercase mb-3">
Jantar de Gala 26
</p>
<h1 class="text-bronze font-amarante text-5xl md:text-6xl uppercase mb-4">
Termos e Condições
</h1>
<p class="text-gray-500 font-cormorant text-lg">
Lê com atenção antes de concluires a tua compra.
</p>
</div>

<div class="flex flex-col gap-10 font-cormorant text-gray-700 text-base md:text-lg leading-relaxed">
<div>
<h2 class="text-bronze font-amarante text-2xl uppercase tracking-wide mb-3">
1. Reembolsos
</h2>
<p>
Não são efetuados <strong>reembolsos</strong>, sob qualquer circunstância, após a
confirmação do pagamento do bilhete. Ao concluíres a compra, declaras estar ciente
de que o valor pago não será devolvido, total ou parcialmente, independentemente do
motivo invocado (incluindo, mas não se limitando a, impossibilidade de
comparência, alteração de planos pessoais ou desistência).
</p>
</div>

<div>
<h2 class="text-bronze font-amarante text-2xl uppercase tracking-wide mb-3">
2. Transferência do Bilhete
</h2>
<p>
É possível alterar a pessoa associada ao bilhete, desde que tal alteração seja
comunicada à organização com a devida antecedência e até à data limite de venda
de bilhetes. Para solicitar a transferência, deves contactar a organização
através dos canais oficiais, indicando o nome, número de estudante e contacto da
nova pessoa. A transferência só se considera efetiva após confirmação por parte
da organização.
</p>
</div>

<div>
<h2 class="text-bronze font-amarante text-2xl uppercase tracking-wide mb-3">
3. Data Limite de Venda
</h2>
<p>
A venda de bilhetes encerra no dia <strong>21 de maio</strong>. Após esta data,
não serão aceites novas inscrições nem pagamentos, ainda que existam vagas
disponíveis.
</p>
</div>

<div>
<h2 class="text-bronze font-amarante text-2xl uppercase tracking-wide mb-3">
4. Lotação e Disponibilidade
</h2>
<p>
O evento tem uma lotação máxima de <strong>100 pessoas</strong>. Após atingido
este limite, os bilhetes poderão deixar de estar disponíveis. Caso a organização
decida disponibilizar bilhetes adicionais, o respetivo preço poderá ser superior
ao praticado até então. A organização reserva-se o direito de encerrar as vendas
a qualquer momento, sem aviso prévio, assim que a lotação seja atingida.
</p>
</div>

<div>
<h2 class="text-bronze font-amarante text-2xl uppercase tracking-wide mb-3">
5. Transporte
</h2>
<p>
O transporte (ida e volta) é assegurado pela organização apenas aos participantes
que o tenham solicitado expressamente no momento da compra do bilhete.
</p>
<p class="mt-3">
Caso indiques que <strong>não pretendes transporte</strong>, fica desde já
esclarecido que o mesmo <strong>não te será garantido</strong> e não terás lugar
reservado no(s) autocarro(s), mesmo que mudes de ideias posteriormente. Cabe-te a
ti assegurar a tua deslocação até ao local do evento e de regresso.
</p>
<p class="mt-3">
Caso tenhas pedido transporte e, posteriormente, percebas que afinal não
necessitas dele, pedimos que comuniques essa informação à organização, com a
maior brevidade possível, através dos canais oficiais. Esta cortesia permite-nos
ajustar a logística e, eventualmente, disponibilizar o lugar a outro
participante.
</p>
</div>

<div>
<h2 class="text-bronze font-amarante text-2xl uppercase tracking-wide mb-3">
6. Aceitação dos Termos
</h2>
<p>
A compra de um bilhete para o Jantar de Gala implica a leitura, compreensão e
aceitação integral dos presentes Termos e Condições. A organização reserva-se o
direito de recusar a entrada no evento a participantes que não cumpram as
condições aqui descritas.
</p>
</div>

<div class="border-t border-bronze/20 pt-8 mt-4">
<p class="text-gray-500 text-sm tracking-wide">
Para qualquer questão ou pedido relacionado com a transferência de bilhete,
transporte ou outras situações previstas neste documento, contacta a organização
através dos canais oficiais do CeSIUM.
</p>
</div>
</div>
</div>
</section>
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,39 @@
</:icon>
</.input>

<div class="flex flex-col gap-1 mt-2">
<label class="flex items-start gap-3 font-cormorant text-base text-gray-700 cursor-pointer">
<input type="hidden" name={@form_data[:terms_accepted].name} value="false" />
<input
type="checkbox"
id={@form_data[:terms_accepted].id}
name={@form_data[:terms_accepted].name}
value="true"
checked={@form_data[:terms_accepted].value == true}
class="checkbox checkbox-sm checkbox-primary mt-1 shrink-0"
/>
<span>
Li e aceito os
<.link
navigate={~p"/terms"}
target="_blank"
class="text-blue-500 underline hover:text-blue-700"
>
Termos e Condições
</.link>
da compra do bilhete. *
</span>
</label>
<p
:for={{msg, _} <- @form_data[:terms_accepted].errors}
:if={@form_data.action == :validate}
class="mt-1.5 flex gap-2 items-center text-sm text-error font-cormorant"
>
<.icon name="hero-exclamation-circle-mini" class="size-4 shrink-0" />
{msg}
</p>
</div>

<div class="flex flex-row justify-between mt-4">
<div>
<.primary_button
Expand Down
1 change: 1 addition & 0 deletions lib/gallium_web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ defmodule GalliumWeb.Router do
on_mount: [{GalliumWeb.UserAuth, :mount_current_scope}] do
live "/", LandingLive.Index, :index
live "/tickets", TicketsLive.Index, :index
live "/terms", TermsLive.Index, :index
end
end

Expand Down
Loading