Created
August 20, 2020 23:32
-
-
Save seguelador/9a0add5cadd4fcf32b4f20b92ef5460b to your computer and use it in GitHub Desktop.
Ejemplo de como utilizar un Active Record Transaction
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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