Rails: ежеквартальная автоматизация завершается без ошибок - PullRequest
0 голосов
/ 08 января 2020

Я разработчик сопровождения сайта управления запасами. Существует ежеквартальный процесс, который дает сбой примерно 10-20% наших клиентов, но не выдает сообщений об ошибках или каких-либо ошибок. Я проследил код от триггера до модели и не нашел ничего, что выделялось бы так же, как выполнение кода / тестов вручную и не могу найти какие-либо свободные концы.

Я могу поделиться фрагментами кода как запрошенный, но вот класс, который обрабатывает неисправную часть. Это тот процесс, который просматривает историю компании и генерирует рекомендуемые изменения минимальной / максимальной инвентаризации.

class ProductInventoryAdjustment < ActiveRecord::Base
  belongs_to :product
  has_many   :notifications, as: :target, dependent: :destroy

  validates :product_id,    presence: true
  validates :max_inventory, presence: true
  validates :min_inventory, presence: true
  validates :state,         presence: true

  def self.create_scheduled_adjustments
    if is_annual?
      schedules_to_adjust = ["quarterly", "semiannual", "annual"]
    elsif is_semiannual?
      schedules_to_adjust = ["quarterly", "semiannual"]
    elsif is_quarter?
      schedules_to_adjust = ["quarterly"]
    else
      # This method runs monthly, so on off months we
      # catch here and return.
      return
    end

    companies = Company.where(inventory_adjustment_schedule: schedules_to_adjust)
    companies.each { |c| create_adjustments_for_company(c) }
  end

  def self.create_adjustments_for_company(company)
    company.products.each { |p| create_adjustments_for_product(p) }
    company.users.each do |user|
      Notification.create!({
        user: user,
        notification_type: Notification::INVENTORY_ADJUSTMENT,
        target: company
      })
    end
  end

  def self.create_adjustments_for_product(product)
    return false if !product.is_old_enough_to_calculate_used_inventory?

    average_inventory_used_per_week = product.average_inventory_used_per_week
    max_inventory = (average_inventory_used_per_week * 4).ceil
    min_inventory = (average_inventory_used_per_week * 2).round

    max_inventory = 1 if max_inventory < 1

    product.inventory_adjustments.create(
      max_inventory: max_inventory,
      min_inventory: min_inventory
    )
  end

  private

    def self.is_quarter?
      [1,4,7,10].include? Date.today.month
    end

    def self.is_semiannual?
      [1,7].include? Date.today.month
    end

    def self.is_annual?
      [1].include? Date.today.month
    end

end

100% наших клиентов делают это ежеквартально, и я проверил базу данных напрямую, и все соответствующие клиенты сгребается, когда код запускается вручную. Насколько я могу судить, на самом деле нет рифмы или причины, по которой клиенты проходят / терпят неудачу. Единственным исключением является тот факт, что более старые клиенты, как правило, менее подвержены сбоям, но нет «жесткого отсечения», которое проходит / терпит неудачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...