Skip to content

Instantly share code, notes, and snippets.

@seguelador
Created August 20, 2020 23:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save seguelador/9a0add5cadd4fcf32b4f20b92ef5460b to your computer and use it in GitHub Desktop.
Save seguelador/9a0add5cadd4fcf32b4f20b92ef5460b to your computer and use it in GitHub Desktop.
Ejemplo de como utilizar un Active Record Transaction
# Save scheduling distribution for a campaign
def self.save_distribution params
transaction_ok = true
begin
Scheduling.transaction do
# Get campaign and company working week days
campaign = Campaign.find(params[:campaign][:id])
company_wwd = campaign.company.working_week_days
# Si no eligió ningún día laboral, se distribuye a cualquier día
company_wwd = Hash[WORKING_WEEK_DAYS.collect { |wd| [wd, true] }] if company_wwd.values.uniq.length == 1 && !company_wwd.values.uniq.first
# Create schedulings for visits for every visitor
params[:visitors].each do |visitor|
scheduling_date = campaign.date_start
# Se recorre el listado de días a visitar
visitor[:days].each do |day|
day_found = false
days_count = 0
# Se cambia de día si el dia que se quiere visitar no es laboral y es feriado
while !day_found && days_count < 7 do
if company_wwd[scheduling_date.dayname] && !scheduling_date.is_holiday?(campaign.company_id)
day_found = true
days_count += 1
else
scheduling_date += 1.day
end
end
# Se crean los schedulings para cada visita del día
day[:visits].each do |visit|
# visit_lat = visit[:location][:latitude] # ¿Qué hacer con esto?
# visit_lng = visit[:location][:longitude] # ¿Qué hacer con esto?
# visit_estimated_time_of_arrival = visit[:estimated_time_of_arrival] # ¿Qué hacer con esto?
# visit_estimated_time_of_departure = visit[:estimated_time_of_departure] # ¿Qué hacer con esto?
# Update scheduling
visit_scheduling = Scheduling.find(visit[:id])
if visit_scheduling.present?
transaction_ok = false unless visit_scheduling.update(date: scheduling_date, source: 4)
end
end
scheduling_date += 1.day
end
end
# Change campaign status
transaction_ok = false unless campaign.scheduled!
# Force a rollback if transaction not ok
unless transaction_ok
campaign.magic_error!
raise ActiveRecord::Rollback
end
end
rescue => e
CheckinLog.error_debug "ERROR CREATING SCHEDULINGS FOR CAMPAIGN #{campaign.id}: " + e.message
transaction_ok = false
Scheduling.destroy_visits_with_error(params[:visitors])
campaign.magic_error!
raise ActiveRecord::Rollback # Force a rollback if error was caught
end
#unassigned_visits = params[:unassigned_visits] # ¿Qué hacer con esto?
transaction_ok # Return
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment