app/models/imports/donations_import.rb in artfully_ose-1.2.0 vs app/models/imports/donations_import.rb in artfully_ose-1.3.0.pre1

- old
+ new

@@ -1,25 +1,49 @@ class DonationsImport < Import include Imports::Rollback include Imports::Validations include ArtfullyOseHelper - + + def kind "donations" end def process(parsed_row) row_valid?(parsed_row) - person = create_person(parsed_row) - contribution = create_contribution(parsed_row, person) + person = create_person(parsed_row) + create_contribution(parsed_row, person) end def rollback rollback_orders rollback_people + rollback_campaigns + rollback_appeals end - + + def before_import + # Delayed::Worker.logger.add(Logger::INFO, "--------------- before campaigns_data ---------") + @campaigns_hash = {} #{campaign_name => {start_date => xxx_date, end_date => xxx_date, goal => xxx_amount, id=xxx}} + parsed_rows.each do |parsed_row, index| + unless parsed_row.campaign.blank? + campaign = parsed_row.campaign + occurred_at = parsed_row.donation_date.blank? ? time_zone_parser.now : time_zone_parser.parse(parsed_row.donation_date) + amount = parsed_row.amount + + if @campaigns_hash.has_key?(campaign) + @campaigns_hash[campaign][:start_date] = [occurred_at, @campaigns_hash[campaign][:start_date]].min + @campaigns_hash[campaign][:end_date] = [occurred_at, @campaigns_hash[campaign][:end_date]].max + @campaigns_hash[campaign][:goal] = @campaigns_hash[campaign][:goal] + amount + else + @campaigns_hash[campaign] = {:start_date => occurred_at, :end_date => occurred_at, :goal => amount} + end + end + end + + end + def validate_amounts(parsed_row) if !parsed_row.unparsed_nongift_amount.blank? && parsed_row.nongift_amount > parsed_row.amount raise Import::RowError, "Non-deductible amount (#{parsed_row.unparsed_nongift_amount}) cannot be more than the total doantion amount (#{parsed_row.unparsed_amount})': #{parsed_row.row}" end @@ -37,48 +61,115 @@ def row_valid?(parsed_row) raise Import::RowError, "No Amount included in this row: #{parsed_row.row}" if parsed_row.unparsed_amount.blank? raise Import::RowError, "Please include a first name, last name, email, or company name in this row: #{parsed_row.row}" unless attach_person(parsed_row).naming_details_available? raise Import::RowError, "Please include a payment method in this row: #{parsed_row.row}" if parsed_row.payment_method.blank? raise Import::RowError, "Donation type must be 'Monetary' or 'In-Kind': #{parsed_row.row}" unless GiveAction.subtypes.include? (parsed_row.donation_type) + raise Import::RowError, "No Date included in this row: #{parsed_row.row}" unless parsed_row.donation_date valid_date? parsed_row.donation_date [:unparsed_amount, :unparsed_nongift_amount, :unparsed_deductible_amount].each do |amt| valid_amount? parsed_row.send(amt) unless parsed_row.send(amt).blank? end validate_amounts(parsed_row) true end - + + def create_campaign(parsed_row, params) + campaign_name = parsed_row.campaign + if campaign_name.present? + camp = self.organization.campaigns.where(:name => campaign_name).first_or_create do |campaign| + campaign.import = self + campaign.starts_at = @campaigns_hash[campaign_name] && @campaigns_hash[campaign_name][:start_date] ? + @campaigns_hash[campaign_name][:start_date] : time_zone_parser.now + campaign.ends_at = @campaigns_hash[campaign_name] && @campaigns_hash[campaign_name][:end_date] ? + @campaigns_hash[campaign_name][:end_date] : time_zone_parser.now + campaign.ends_at = nil if campaign.ends_at.to_s == campaign.starts_at.to_s + campaign.goal = @campaigns_hash[campaign_name] && @campaigns_hash[campaign_name][:goal] ? + @campaigns_hash[campaign_name][:goal] / 100 : 1000 + campaign.status = 'active' + end + params[:campaign_id] = camp.id + camp + end + end + + def create_appeal(parsed_row, campaign, params) + if parsed_row.appeal.present? && !campaign.nil? + a = campaign.appeals.where({:name => parsed_row.appeal, :organization_id => self.organization.id}).first_or_create do |appeal| + appeal.import = self + appeal.starts_at = campaign.starts_at + appeal.channel = 'email' + appeal.status = 'active' + end + params[:appeal_id] = a.id + end + end + + def create_match_eligible(parsed_row, params) + matcher = parsed_row.match_eligible_matcher + eligible_amount = parsed_row.match_eligible_amount + if matcher.present? && matcher.include?("@") && eligible_amount > 0 # todo validate email + matcher_person = Person.first_or_create({:email => matcher, :organization => self.organization}) do |p| + p.import = self + end + + params[:match_eligible] = 'true' + params[:matcher] = matcher_person.id + params[:eligible_amount] = eligible_amount + params[:ratio] = parsed_row.match_eligible_ratio.to_f if parsed_row.match_eligible_ratio.to_f > 0 + params[:commitment_date] = time_zone_parser.now.to_s + end + end + + def create_soft_credit(parsed_row, params) + soft_credit_email = parsed_row.soft_credit_email + soft_credit_first_name = parsed_row.soft_credit_first_name + soft_credit_last_name = parsed_row.soft_credit_last_name + soft_credit_amount = parsed_row.soft_credit_amount + + if soft_credit_email.present? && soft_credit_email.include?("@") && soft_credit_amount > 0 + sc_person = Person.first_or_create({:email => soft_credit_email, :organization => self.organization}) do |p| + p.import = self + p.first_name = soft_credit_first_name + p.last_name = soft_credit_last_name + end + params[:soft_credit] = {-Time.now.to_i => {:person_id => sc_person.id, :amount => soft_credit_amount}} + end + end + def create_contribution(parsed_row, person) Rails.logger.info("Processing Import [#{id}] DONATION_IMPORT: Creating contribution") - validate_amounts(parsed_row) + params = {} + params[:creator_id] = self.user.id + params[:person_id] = person.id + amount = parsed_row.amount deductible_amount = parsed_row.unparsed_deductible_amount.blank? ? amount - parsed_row.nongift_amount : parsed_row.deductible_amount nongift_amount = parsed_row.unparsed_nongift_amount.blank? ? amount - deductible_amount : parsed_row.nongift_amount occurred_at = parsed_row.donation_date.blank? ? time_zone_parser.now : time_zone_parser.parse(parsed_row.donation_date) - params = {} + params[:subtype] = parsed_row.donation_type - params[:amount] = deductible_amount + params[:amount] = deductible_amount + nongift_amount params[:nongift_amount] = nongift_amount params[:payment_method] = parsed_row.payment_method params[:organization_id] = self.organization.id params[:occurred_at] = occurred_at.to_s params[:details] = "Imported by #{user.email} on #{I18n.l self.created_at_local_to_organization, :format => :date}" - params[:person_id] = person.id params[:creator_id] = user.id - + + params[:notes] = parsed_row.notes + params[:ack_sent_date] = parsed_row.ack_sent_date + params[:fiscal_year] = parsed_row.fiscal_year + + campaign = create_campaign(parsed_row, params) + create_appeal(parsed_row, campaign, params) + create_match_eligible(parsed_row, params) + create_soft_credit(parsed_row, params) + contribution = Contribution.new(params) - contribution.save(ImportedOrder) do |contribution| - contribution.order.import_id = self.id - contribution.order.save - contribution.order.reload - contribution.action.import_id = self.id - contribution.action.creator = self.user - contribution.action.details = "Donated #{number_as_cents contribution.order.total}" - contribution.action.save - end + contribution.save(ImportedOrder, self.id) contribution end end \ No newline at end of file