Я разработчик сопровождения сайта управления запасами. Существует ежеквартальный процесс, который дает сбой примерно 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% наших клиентов делают это ежеквартально, и я проверил базу данных напрямую, и все соответствующие клиенты сгребается, когда код запускается вручную. Насколько я могу судить, на самом деле нет рифмы или причины, по которой клиенты проходят / терпят неудачу. Единственным исключением является тот факт, что более старые клиенты, как правило, менее подвержены сбоям, но нет «жесткого отсечения», которое проходит / терпит неудачу.