Compare commits

...

2 Commits

Author SHA1 Message Date
d6bd26c76f Fix missing ifthenpaylink bug
If you added a member and they clicked on the payment link within 5
minutes, there was a possibility that the ifthenpay link hadn't been
generated yet.

This fixes that bug by generating the ifthenpay links on member
creation.
2023-09-20 14:20:18 +01:00
dcc6d1a991 Improve branding mechanisms 2023-09-20 14:19:35 +01:00
36 changed files with 218 additions and 115 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

View File

@ -15,13 +15,10 @@ main {
.banner {
width: 100%;
height: 30px;
padding: 15px;
background-image: url(logo.svg);
background-size: auto 30px;
background-repeat: no-repeat;
background-position: center;
background-color: #041952;
}
footer {

View File

@ -28,6 +28,7 @@ class MembersController < ApplicationController
@member = Member.new(member_params.merge(number: (Member.maximum(:number) || 0) + 1))
if @member.save
@member.generate_missing_ifthenpay_links!
@member.reset_status!
NotificationMailer.with(member: @member).registration.deliver_now!

View File

@ -1,34 +1,9 @@
module Config
def self.organization_full_name
"ANSOL - Associação Nacional para o Software Livre"
class <<self
if ENV.fetch("BRANDING") == "d3"
include Config::D3
else
include Config::Ansol
end
def self.organization_website
"https://ansol.org"
end
def self.regular_payment_value
30
end
def self.reduced_payment_value
6
end
def self.ifthenpay_payment_title
"Quotas ANSOL"
end
def self.payment_iban
"PT50 0035 2178 00027478430 14"
end
def self.payment_proof_email
"direccao@ansol.org"
end
def self.reduced_payment_description
"Caso queiras usufruir da quota reduzida de 6.00€ para estudantes, pessoas
desempregadas ou reformadas, envia-nos um comprovativo desse estatuto."
end
end

60
app/lib/config/ansol.rb Normal file
View File

@ -0,0 +1,60 @@
module Config
module Ansol
def organization_short_name
"ANSOL"
end
def organization_full_name
"ANSOL - Associação Nacional para o Software Livre"
end
def organization_website
"https://ansol.org"
end
def regular_payment_value
30
end
def reduced_payment_value
6
end
def full_rights_vesting_period
6.months
end
def payment_pending_grace_period
90.days
end
def ifthenpay_payment_title
"Quotas ANSOL"
end
def payment_iban
"PT50 0035 2178 00027478430 14"
end
def payment_proof_email
"direccao@ansol.org"
end
def reduced_payment_description
"Caso queiras usufruir da quota reduzida de 6.00€ para estudantes, pessoas
desempregadas ou reformadas, envia-nos um comprovativo desse estatuto."
end
def header_color
"white"
end
def header_background_color
"#041952"
end
def organization_logo_url
"https://#{ENV['BASE_HOST']}/logo.png"
end
end
end

60
app/lib/config/d3.rb Normal file
View File

@ -0,0 +1,60 @@
module Config
module D3
def organization_short_name
"D3"
end
def organization_full_name
"Associação D3 - Defesa dos Direitos Digitais"
end
def organization_website
"https://direitosdigitais.pt"
end
def regular_payment_value
32
end
def reduced_payment_value
16
end
def full_rights_vesting_period
1.year
end
def payment_pending_grace_period
120.days
end
def ifthenpay_payment_title
"Quotas D3"
end
def payment_iban
"PT50 0033 0000 45508899562 05"
end
def payment_proof_email
"direccao@direitosdigitais.pt"
end
def reduced_payment_description
"Caso queiras usufruir da quota reduzida de 6.00€ para estudantes, pessoas
desempregadas ou reformadas, envia-nos um comprovativo desse estatuto."
end
def header_color
"#60f163"
end
def header_background_color
"#424242"
end
def organization_logo_url
"https://direitosdigitais.pt/templates/g5_hydrogen/custom/images/d3/d3-logo/logo-d3-transparente.png"
end
end
end

View File

@ -1,58 +1,70 @@
class NotificationMailer < ApplicationMailer
# Subject can be set in your I18n file at config/locales/en.yml
# with the following lookup:
#
# en.notification_mailer.expiration_in_60d.subject
#
default to: ->() { @member.email }
def expiration_in_60d
set_notification
mail to: @notification.member.email
mail
end
def expiration_in_30d
set_notification
mail to: @notification.member.email
mail
end
def expired
set_notification
mail to: @notification.member.email
mail
end
def expired_30d_ago
set_notification
mail to: @notification.member.email
mail
end
def expired_60d_ago
set_notification
mail to: @notification.member.email
mail
end
def cancelled
set_notification
mail to: @notification.member.email
mail
end
def registration
@member = params[:member]
@payment = @member.create_payment
mail to: @member.email
set_member
mail
end
def first_payment_confirmation
@contribution = params[:contribution]
mail to: @contribution.member.email
set_contribution
mail
end
def payment_renewal_confirmation
@contribution = params[:contribution]
mail to: @contribution.member.email
set_contribution
mail
end
private
def set_notification
@notification = params[:notification]
@member = @notification.member
@payment = @notification.member.create_payment
end
def set_contribution
@contribution = params[:contribution]
@member = @contribution.member
end
def set_member
@member = params[:member]
@payment = @member.create_payment
end
def default_i18n_subject
mailer_scope = self.class.mailer_name.tr("/", ".")
I18n.t(:subject, scope: [mailer_scope, action_name], organization_short_name: Config.organization_short_name)
end
end

View File

@ -14,11 +14,11 @@ class Member < ApplicationRecord
end
def cancelled_on
expires_on + 90.days
expires_on + Config.payment_pending_grace_period
end
def obtains_full_rights_on
joined_on + 6.months
joined_on + Config.full_rights_vesting_period
end
def reset_status!
@ -26,6 +26,7 @@ class Member < ApplicationRecord
end
def employed?
# normal is deprecated, here for retrocompatibility reasons
category == "normal" || category == "employed"
end
@ -111,7 +112,7 @@ class Member < ApplicationRecord
{ to_be_sent_on: expires_on + 0.days, template: "expired" },
{ to_be_sent_on: expires_on + 30.days, template: "expired_30d_ago" },
{ to_be_sent_on: expires_on + 60.days, template: "expired_60d_ago" },
{ to_be_sent_on: expires_on + 90.days, template: "cancelled" },
{ to_be_sent_on: expires_on + Config.payment_pending_grace_period, template: "cancelled" },
].reject do |n|
n[:to_be_sent_on].before?(from) || dates.include?(n[:to_be_sent_on])
end.each do |n|

View File

@ -11,7 +11,9 @@
</head>
<body>
<div class='banner'></div>
<div class='banner' style="background-color: <%= Config.header_background_color %>;">
<img src="<%= Config.organization_logo_url %>" style="margin: 0px auto; max-width: 400px; display: block; color: <%= Config.header_color %>" alt="<%= Config.organization_full_name %>" />
</div>
<% if signed_in? %>
<nav>
<ul>

View File

@ -9,8 +9,8 @@
<body>
<div style="max-width: 600px;">
<div style="background-color: #041952; padding: 20px">
<img src="<%= image_url("ansol-logo-white.png") %>" style="margin: 0px auto; max-width: 400px; display: block; color: white" alt="ANSOL" />
<div style="background-color: <%= Config.header_background_color %>; padding: 20px; text-align: center;">
<img src="<%= Config.organization_logo_url %>" style="margin: 0px auto; max-width: 400px; display: block; color: <%= Config.header_color %>" alt="<%= Config.organization_full_name %>" />
</div>
<%= yield %>

View File

@ -1,4 +1,4 @@
<p>
Saudações livres,<br>
Direcção da ANSOL
Direcção da <%= Config.organization_short_name %>
</p>

View File

@ -1,2 +1,2 @@
Saudações livres,
Direcção da ANSOL
Direcção da <%= Config.organization_short_name %>

View File

@ -0,0 +1,3 @@
<p>
<%= t('notification_mailer.greetings', display_name: member.display_name) %>
</p>

View File

@ -0,0 +1 @@
<%= t('notification_mailer.greetings', display_name: member.display_name) %>

View File

@ -1,10 +1,8 @@
<p>
<%= t('notification_mailer.greetings', display_name: @notification.member.display_name) %>
</p>
<%= render partial: "greetings", locals: { member: @member } %>
<p>
Como não recebemos o pagamento anual das quotas da ANSOL, a tua inscrição foi
cancelada.
Como não recebemos o pagamento anual das quotas da <%= Config.organization_short_name %>,
a tua inscrição foi cancelada.
</p>
<p>
@ -24,7 +22,4 @@
rápido possível.
</p>
<p>
Saudações livres,<br>
Direcção da ANSOL
</p>
<%= render partial: "cheers" %>

View File

@ -1,7 +1,7 @@
<%= t('notification_mailer.greetings', display_name: @notification.member.display_name) %>
<%= render partial: "greetings", locals: { member: @member } %>
Como não recebemos o pagamento anual das quotas da ANSOL, a tua inscrição foi
cancelada.
Como não recebemos o pagamento anual das quotas da <%= Config.organization_short_name %>,
a tua inscrição foi cancelada.
Vamos revogar em breve os teus acessos à infraestrutura da associação exclusiva
para membros (nextcloud, mailing list, sala de Matrix, etc).
@ -13,5 +13,4 @@ Caso consideres que estás a receber esta mensagem indevidamente, contacta-nos
através do endereço direccao@ansol.org para resolvermos a situação o mais
rápido possível.
Saudações livres,
Direcção da ANSOL
<%= render partial: "cheers" %>

View File

@ -1,4 +1,4 @@
<p><%= t('notification_mailer.greetings', display_name: @notification.member.display_name) %></p>
<%= render partial: "greetings", locals: { member: @member } %>
<p>
A tua inscrição como membro da ANSOL expira em 30 dias.

View File

@ -1,4 +1,4 @@
<%= t('notification_mailer.greetings', display_name: @notification.member.display_name) %>
<%= render partial: "greetings", locals: { member: @member } %>
A tua inscrição como membro da ANSOL expira em 30 dias.

View File

@ -1,4 +1,4 @@
<p><%= t('notification_mailer.greetings', display_name: @notification.member.display_name) %></p>
<%= render partial: "greetings", locals: { member: @member } %>
<p>
A tua inscrição como membro da ANSOL expira em 60 dias.

View File

@ -1,4 +1,4 @@
<%= t('notification_mailer.greetings', display_name: @notification.member.display_name) %>
<%= render partial: "greetings", locals: { member: @member } %>
A tua inscrição como membro da ANSOL expira em 60 dias.

View File

@ -1,6 +1,4 @@
<p>
<%= t('notification_mailer.greetings', display_name: @notification.member.display_name) %>
</p>
<%= render partial: "greetings", locals: { member: @member } %>
<p>
A tua inscrição como membro da ANSOL vai ser cancelada dentro de 30 dias por

View File

@ -1,4 +1,4 @@
<%= t('notification_mailer.greetings', display_name: @notification.member.display_name) %>
<%= render partial: "greetings", locals: { member: @member } %>
A tua inscrição como membro da ANSOL expirou hoje e não recebemos a tua
contribuição anual.

View File

@ -1,6 +1,4 @@
<p>
<%= t('notification_mailer.greetings', display_name: @notification.member.display_name) %>
</p>
<%= render partial: "greetings", locals: { member: @member } %>
<p>
A tua inscrição como membro da ANSOL expirou há um mês e ainda não recebemos

View File

@ -1,4 +1,4 @@
<%= t('notification_mailer.greetings', display_name: @notification.member.display_name) %>
<%= render partial: "greetings", locals: { member: @member } %>
A tua inscrição como membro da ANSOL expirou há um mês e ainda não recebemos
a tua contribuição anual.

View File

@ -1,6 +1,4 @@
<p>
<%= t('notification_mailer.greetings', display_name: @notification.member.display_name) %>
</p>
<%= render partial: "greetings", locals: { member: @member } %>
<p>
A tua inscrição como membro da ANSOL vai ser cancelada dentro de 30 dias por

View File

@ -1,4 +1,4 @@
<%= t('notification_mailer.greetings', display_name: @notification.member.display_name) %>
<%= render partial: "greetings", locals: { member: @member } %>
A tua inscrição como membro da ANSOL expirou há 60 dias e ainda não recebemos
a tua contribuição anual.

View File

@ -1,4 +1,4 @@
<p><%= t('notification_mailer.greetings', display_name: @contribution.member.display_name) %></p>
<%= render partial: "greetings", locals: { member: @member } %>
<p>
Bem-vinde à ANSOL! Confirmamos que recebemos o teu pagamento, e tua inscrição

View File

@ -1,4 +1,4 @@
<%= t('notification_mailer.greetings', display_name: @contribution.member.display_name) %>
<%= render partial: "greetings", locals: { member: @member } %>
Bem-vinde à ANSOL! Confirmamos que recebemos o teu pagamento, e tua inscrição
está válida até <%= @contribution.member.expires_on %>.

View File

@ -1,4 +1,4 @@
<p><%= t('notification_mailer.greetings', display_name: @contribution.member.display_name) %></p>
<%= render partial: "greetings", locals: { member: @member } %>
<p>
Recebemos o teu pagamento. Obrigado por continuares a apoiar a ANSOL. A tua

View File

@ -1,4 +1,4 @@
<%= t('notification_mailer.greetings', display_name: @contribution.member.display_name) %>
<%= render partial: "greetings", locals: { member: @member } %>
Recebemos o teu pagamento. Obrigado por continuares a apoiar a ANSOL. A tua
inscrição foi renovada e está válida até <%= @contribution.member.expires_on %>.

View File

@ -1,4 +1,4 @@
<p><%= t('notification_mailer.greetings', display_name: @member.display_name) %></p>
<%= render partial: "greetings", locals: { member: @member } %>
<p>
Obrigado pelo interesse em fazer parte da ANSOL. A tua candidatura foi

View File

@ -1,4 +1,4 @@
<%= t('notification_mailer.greetings', display_name: @member.display_name) %>
<%= render partial: "greetings", locals: { member: @member } %>
Obrigado pelo interesse em fazer parte da ANSOL. A tua candidatura foi aprovada
pela direcção.

View File

@ -1,4 +1,7 @@
en:
option:
positive: Yes
negative: No
navigation:
members: "Member list"
board: "Board"
@ -68,21 +71,21 @@ en:
notification_mailer:
payment_cta: "Pay now"
expiration_in_60d:
subject: "ANSOL - Pagamento anual de quotas"
title: "Pagamento anual de quotas"
subject: "%{organization_short_name} - Yearly membership renewal"
expiration_in_30d:
subject: "ANSOL - Prazo para pagamento de quotas vence em 30 dias"
subject: "%{organization_short_name} - Your membership expires in 30 days"
expired:
subject: "ANSOL - Pagamento de quotas pendente"
subject: "%{organization_short_name} - Membership payment pending"
expired_30d_ago:
subject: "ANSOL - Pagamento de quotas em atraso"
subject: "%{organization_short_name} - Membership payment expired"
expired_60d_ago:
subject: "ANSOL - Suspensão de inscrição iminente"
subject: "%{organization_short_name} - Your membership is about to be suspended"
first_payment_confirmation:
subject: "ANSOL - Payment received: Welcome!"
subject: "%{organization_short_name} - Payment received: Welcome!"
payment_renewal_confirmation:
subject: "ANSOL - Payment received"
subject: "%{organization_short_name} - Payment received"
registration:
subject: "ANSOL - Registration approved: Payment required"
subject: "%{organization_short_name} - Registration approved: Payment required"
cancelled:
subject: "ANSOL - Inscrição cancelada"
subject: "%{organization_short_name} - Membership suspended"
greetings: "Dear %{display_name}"

View File

@ -105,23 +105,23 @@ pt:
notification_mailer:
payment_cta: "Pagar quotas"
expiration_in_60d:
subject: "ANSOL - Pagamento anual de quotas"
subject: "%{organization_short_name} - Pagamento anual de quotas"
expiration_in_30d:
subject: "ANSOL - Inscrição expira em 30 dias"
subject: "%{organization_short_name} - Inscrição expira em 30 dias"
expired:
subject: "ANSOL - Pagamento de quotas pendente"
subject: "%{organization_short_name} - Pagamento de quotas pendente"
expired_30d_ago:
subject: "ANSOL - Pagamento de quotas em atraso"
subject: "%{organization_short_name} - Pagamento de quotas em atraso"
expired_60d_ago:
subject: "ANSOL - Suspensão de inscrição iminente"
subject: "%{organization_short_name} - Suspensão de inscrição iminente"
first_payment_confirmation:
subject: "ANSOL - Pagamento recebido: Mensagem de boas vindas"
subject: "%{organization_short_name} - Pagamento recebido: Mensagem de boas vindas"
payment_renewal_confirmation:
subject: "ANSOL - Pagamento de quotas recebido"
subject: "%{organization_short_name} - Pagamento de quotas recebido"
registration:
subject: "ANSOL - Inscrição aprovada: Pagamento inicial de quotas"
subject: "%{organization_short_name} - Inscrição aprovada: Pagamento inicial de quotas"
cancelled:
subject: "ANSOL - Inscrição cancelada"
subject: "%{organization_short_name} - Inscrição cancelada"
greetings: "Car(a/o/e) %{display_name}"
sessions:
new:

BIN
public/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB