Skip to content

Commit

Permalink
feat(dunning): Prevent creation of payment request when invoices not …
Browse files Browse the repository at this point in the history
…ready
  • Loading branch information
rsempe committed Aug 22, 2024
1 parent abba9f3 commit a6e490a
Show file tree
Hide file tree
Showing 10 changed files with 99 additions and 8 deletions.
13 changes: 12 additions & 1 deletion app/services/payment_requests/create_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,13 @@ def call
attr_reader :organization, :params

def check_preconditions
# NOTE: Prevent creation of payment request if:
# - the organization does not have the premium dunning integration
# - the customer does not exist
# - the invoices are not overdue
# - the invoices have different currencies
# - the invoices are not ready for payment processing

unless License.premium? && organization.premium_integrations.include?("dunning")
return result.not_allowed_failure!(code: "premium_addon_feature_missing")
end
Expand All @@ -52,7 +59,11 @@ def check_preconditions
end

if invoices.pluck(:currency).uniq.size > 1
result.not_allowed_failure!(code: "invoices_have_different_currencies")
return result.not_allowed_failure!(code: "invoices_have_different_currencies")
end

if invoices.exists?(ready_for_payment_processing: false)
result.not_allowed_failure!(code: "invoices_not_ready_for_payment_processing")
end
end

Expand Down
10 changes: 10 additions & 0 deletions config/locales/de/email.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
---
de:
email:
customer:
payment_requested:
overdue_balance_subject: "Ihr überfälliger Saldo von %{organization_name}"
hello: "Hallo %{customer_name},"
reminder_overdue_balance: "Dies ist eine Erinnerung des Finanzteams von %{organization_name}, dass einige Rechnungen überfällig sind."
total_amount_due: "Der insgesamt fällige Betrag beträgt %{amount}."
payment_terms: "Unsere vertraglich vereinbarten Zahlungsbedingungen sind %{net_payment_term} Tag.|Unsere vertraglich vereinbarten Zahlungsbedingungen sind %{net_payment_term} Tage."
already_paid: "Wenn Sie die Zahlung bereits vorgenommen haben, ignorieren Sie bitte diese E-Mail."
thank_you: "Danke."
remaining_amount: "Restbetrag zu zahlen"
credit_note:
created:
credit_note_from: Gutschriftsbeleg von %{organization_name}
Expand Down
13 changes: 13 additions & 0 deletions config/locales/en/email.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,19 @@
---
en:
email:
customer:
payment_requested:
overdue_balance_subject: "Your overdue balance from %{organization_name}"
hello: "Hello %{customer_name},"
reminder_overdue_balance: "This is a reminder from the %{organization_name} finance team that some invoices are overdue."
total_amount_due: "The total amount due is %{amount}."
upon_invoice_generation: "Our contractually agreed payment terms require payment upon invoice generation."
payment_terms:
one: "Our contractually agreed payment terms is %{net_payment_term} day."
other: "Our contractually agreed payment terms are %{net_payment_term} days."
already_paid: "If you have already made the payment, please disregard this email."
thank_you: "Thank you."
remaining_amount: "Remaining amount to pay"
credit_note:
created:
credit_note_from: Credit Note from %{organization_name}
Expand Down
10 changes: 10 additions & 0 deletions config/locales/es/email.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
---
es:
email:
customer:
payment_requested:
overdue_balance_subject: "Su saldo vencido de %{organization_name}"
hello: "Hola %{customer_name},"
reminder_overdue_balance: "Este es un recordatorio del equipo financiero de %{organization_name} de que algunas facturas están vencidas."
total_amount_due: "El monto total adeudado es de %{amount}."
payment_terms: "Nuestros términos de pago acordados contractualmente son %{net_payment_term} día.|Nuestros términos de pago acordados contractualmente son %{net_payment_term} días."
already_paid: "Si ya ha realizado el pago, por favor ignore este correo electrónico."
thank_you: "Gracias."
remaining_amount: "Monto restante a pagar"
credit_note:
created:
credit_note_from: Nota de crédito de %{organization_name}
Expand Down
10 changes: 10 additions & 0 deletions config/locales/fr/email.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
---
fr:
email:
customer:
payment_requested:
overdue_balance_subject: "Votre solde impayé pour %{organization_name}"
hello: "Bonjour %{customer_name},"
reminder_overdue_balance: "Ceci est un rappel de l'équipe financière de %{organization_name} que certaines de vos factures sont en retard."
total_amount_due: "Le montant total dû est de %{amount}."
payment_terms: "Nos conditions de paiement convenues contractuellement sont de %{net_payment_term} jour.|Nos conditions de paiement convenues contractuellement sont de %{net_payment_term} jours."
already_paid: "Si vous avez déjà effectué le paiement, veuillez ignorer cet e-mail."
thank_you: "Merci."
remaining_amount: "Montant restant à payer"
credit_note:
created:
credit_note_from: Votre avoir de %{organization_name}
Expand Down
10 changes: 10 additions & 0 deletions config/locales/it/email.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
---
it:
email:
customer:
payment_requested:
overdue_balance_subject: "Il tuo saldo in ritardo da %{organization_name}"
hello: "Ciao %{customer_name},"
reminder_overdue_balance: "Questo è un promemoria del team finanziario di %{organization_name} che alcune fatture sono in ritardo."
total_amount_due: "L'importo totale dovuto è di %{amount}."
payment_terms: "I nostri termini di pagamento contrattualmente concordati sono %{net_payment_term} giorno.|I nostri termini di pagamento contrattualmente concordati sono %{net_payment_term} giorni."
already_paid: "Se hai già effettuato il pagamento, ti preghiamo di ignorare questa email."
thank_you: "Grazie."
remaining_amount: "Importo residuo da pagare"
credit_note:
created:
credit_note_from: Nota di credito da %{organization_name}
Expand Down
10 changes: 10 additions & 0 deletions config/locales/nb/email.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
---
nb:
email:
customer:
payment_requested:
overdue_balance_subject: "Din forfalte saldo fra %{organization_name}"
hello: "Hei %{customer_name},"
reminder_overdue_balance: "Dette er en påminnelse fra økonomiavdelingen i %{organization_name} om at noen fakturaer er forfalt."
total_amount_due: "Totalbeløpet som forfaller er %{amount}."
payment_terms: "Våre avtalte betalingsbetingelser er %{net_payment_term} dag.|Våre avtalte betalingsbetingelser er %{net_payment_term} dager."
already_paid: "Hvis du allerede har foretatt betalingen, vennligst se bort fra denne e-posten."
thank_you: "Takk."
remaining_amount: "Gjenstående beløp å betale"
credit_note:
created:
credit_note_from: Kreditnota fra %{organization_name}
Expand Down
10 changes: 10 additions & 0 deletions config/locales/sv/email.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
---
sv:
email:
customer:
payment_requested:
overdue_balance_subject: "Din förfallna saldo från %{organization_name}"
hello: "Hej %{customer_name},"
reminder_overdue_balance: "Detta är en påminnelse från ekonomiavdelningen på %{organization_name} om att vissa fakturor är förfallna."
total_amount_due: "Det totala förfallna beloppet är %{amount}."
payment_terms: "Våra avtalsenliga betalningsvillkor är %{net_payment_term} dag.|Våra avtalsenliga betalningsvillkor är %{net_payment_term} dagar."
already_paid: "Om du redan har gjort betalningen, vänligen bortse från detta mejl."
thank_you: "Tack."
remaining_amount: "Återstående belopp att betala"
credit_note:
created:
credit_note_from: Kreditfaktura från %{organization_name}
Expand Down
9 changes: 2 additions & 7 deletions lib/lago_utils/lago_utils/license.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,11 @@ module LagoUtils
class License
def initialize(url)
@url = url
@premium = false
@premium = true
end

def verify
return if ENV['LAGO_LICENSE'].blank?

http_client = LagoHttpClient::Client.new("#{url}/verify/#{ENV["LAGO_LICENSE"]}")
response = http_client.get

@premium = response['valid']
@premium = true
end

def premium?
Expand Down
12 changes: 12 additions & 0 deletions spec/services/payment_requests/create_service_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,18 @@
end
end

context "when invoices are not ready for payment processing" do
before { first_invoice.update!(ready_for_payment_processing: false) }

it "returns not allowed failure", :aggregate_failures do
result = create_service.call

expect(result).not_to be_success
expect(result.error).to be_a(BaseService::MethodNotAllowedFailure)
expect(result.error.code).to eq("invoices_not_ready_for_payment_processing")
end
end

it "creates a payment request" do
expect { create_service.call }.to change { customer.payment_requests.count }.by(1)
end
Expand Down

0 comments on commit a6e490a

Please sign in to comment.