From a6e490a39c99f5fcc2ca0a79bad8f32eaf1f03f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Romain=20Semp=C3=A9?= Date: Thu, 22 Aug 2024 14:49:37 +0200 Subject: [PATCH] feat(dunning): Prevent creation of payment request when invoices not ready --- app/services/payment_requests/create_service.rb | 13 ++++++++++++- config/locales/de/email.yml | 10 ++++++++++ config/locales/en/email.yml | 13 +++++++++++++ config/locales/es/email.yml | 10 ++++++++++ config/locales/fr/email.yml | 10 ++++++++++ config/locales/it/email.yml | 10 ++++++++++ config/locales/nb/email.yml | 10 ++++++++++ config/locales/sv/email.yml | 10 ++++++++++ lib/lago_utils/lago_utils/license.rb | 9 ++------- .../payment_requests/create_service_spec.rb | 12 ++++++++++++ 10 files changed, 99 insertions(+), 8 deletions(-) diff --git a/app/services/payment_requests/create_service.rb b/app/services/payment_requests/create_service.rb index 11f50730b22..c091bddd5d8 100644 --- a/app/services/payment_requests/create_service.rb +++ b/app/services/payment_requests/create_service.rb @@ -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 @@ -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 diff --git a/config/locales/de/email.yml b/config/locales/de/email.yml index f38a0eeb41c..d2e01d12497 100644 --- a/config/locales/de/email.yml +++ b/config/locales/de/email.yml @@ -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} diff --git a/config/locales/en/email.yml b/config/locales/en/email.yml index d963676283d..8c6126648fd 100644 --- a/config/locales/en/email.yml +++ b/config/locales/en/email.yml @@ -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} diff --git a/config/locales/es/email.yml b/config/locales/es/email.yml index d215aa0d1c7..36f9646e054 100644 --- a/config/locales/es/email.yml +++ b/config/locales/es/email.yml @@ -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} diff --git a/config/locales/fr/email.yml b/config/locales/fr/email.yml index cb168f1836f..28e8d5ac46d 100644 --- a/config/locales/fr/email.yml +++ b/config/locales/fr/email.yml @@ -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} diff --git a/config/locales/it/email.yml b/config/locales/it/email.yml index 00eb8660dd3..0cacbe37370 100644 --- a/config/locales/it/email.yml +++ b/config/locales/it/email.yml @@ -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} diff --git a/config/locales/nb/email.yml b/config/locales/nb/email.yml index afee9636a10..f8ca12f01a3 100644 --- a/config/locales/nb/email.yml +++ b/config/locales/nb/email.yml @@ -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} diff --git a/config/locales/sv/email.yml b/config/locales/sv/email.yml index b9f19dc6f5a..73f8420bcc8 100644 --- a/config/locales/sv/email.yml +++ b/config/locales/sv/email.yml @@ -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} diff --git a/lib/lago_utils/lago_utils/license.rb b/lib/lago_utils/lago_utils/license.rb index 5b7b8d83e4f..636723931cd 100644 --- a/lib/lago_utils/lago_utils/license.rb +++ b/lib/lago_utils/lago_utils/license.rb @@ -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? diff --git a/spec/services/payment_requests/create_service_spec.rb b/spec/services/payment_requests/create_service_spec.rb index e13440e97b5..56e08f53a39 100644 --- a/spec/services/payment_requests/create_service_spec.rb +++ b/spec/services/payment_requests/create_service_spec.rb @@ -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