#ruby-on-rails #ruby #business-logic
#ruby-on-rails #ruby #бизнес-логика
Вопрос:
У меня есть настройка, в которой я хотел бы отправлять автоматические напоминания пользователям, если они не внесли ежемесячный арендный платеж. Арендодатель имеет мнение определить день месяца, в который арендатор должен произвести платеж ( due_date
). Чего я хотел бы добиться, так это того, что если платеж не был произведен в течение 2 дней с момента due_date
отправки арендатору электронного письма. В настоящее время у меня есть следующая задача для этого.
namespace :rent_due_reminder do
desc "Sends monthly reminders to tenants who haven't paid their rent."
task :send => :environment do
Offer.all.each do |offer|
if offer.status == "accepted" amp;amp; offer.due_date.present?
landlord = User.find_by(id: offer.landlord_id)
tenant = User.find_by(id: offer.user_id)
stripe_account = Stripe::Account.retrieve(landlord.merchant_id)
payments = Stripe::Charge.list(
{
limit: 100,
expand: ['data.source_transfer.source_transaction.dispute', 'data.application_fee'],
source: {object: 'all'}
},
{ stripe_account: landlord.merchant_id }
)
due_date = "#{Date.today.year}-#{Date.today.month}-#{offer.due_date}".to_datetime
last_payment_date = DateTime.strptime(payments.data.last.created.to_s,'%s')
if (SOME CONDITION)
OfferMailer.with(offer: offer, tenant: tenant, landlord: landlord).rent_due.deliver
end
end
end
end
end
Итак, что я делаю, так это то, что я выбираю последний платеж и получаю дату этого, и это то, что я должен использовать для настройки почтовой программы. Первоначально я думал, что могу просто посмотреть и посмотреть last_payment_date < due_date 2
, но, похоже, это не сработало. Возможно, я запутался в этом, поскольку, если у меня несколько арендодателей, и у некоторых из них есть срок выполнения, например, 30-го числа каждого месяца, а у некоторых из них 1-е число каждого месяца, должен ли я по-прежнему запускать задачу ежемесячно или как мне это настроить? Извиняюсь за достаточно плохое объяснение, я сам тоже очень смущаюсь этим.
Ответ №1:
В вашей логике есть недостаток. Даже если пользователь произвел платеж в установленный срок, last_payment date
он все равно будет меньше due_date 2
. Итак, вам нужно добавить еще одну проверку, которая гарантирует, что платеж был произведен за текущий месяц.
например, если срок оплаты моей аренды составляет 5-е число каждого месяца, вам необходимо проверить, что платеж был произведен между 1-м и 5-м. В настоящее время вы проверяете только, была ли дата последнего платежа до 7-го. Это также включает действительные платежи.
Конечно, приведенная выше логика также ошибочна, потому что люди могут вносить авансовые платежи, и вам тоже нужно будет это исправить. Один из способов обойти это — создать счет и убедиться, что все счета оплачены, а не просто проверять наличие последних платежей. Таким образом, вы можете рассчитать просрочки более чем на один месяц.