Планирование сообщений электронной почты / остатков rails в зависимости от ввода даты пользователем

#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-го. Это также включает действительные платежи.

Конечно, приведенная выше логика также ошибочна, потому что люди могут вносить авансовые платежи, и вам тоже нужно будет это исправить. Один из способов обойти это — создать счет и убедиться, что все счета оплачены, а не просто проверять наличие последних платежей. Таким образом, вы можете рассчитать просрочки более чем на один месяц.