# License: AGPL-3.0-or-later WITH Web-Template-Output-Additional-Permission-3.0-or-later require 'param_validation' require 'qx' module OnboardAccounts def self.create_org(params) nonprofit_data = set_nonprofit_defaults(params['nonprofit']) ParamValidation.new(nonprofit_data, { name: {required: true}, # email: {required: true}, # phone: {required: true}, city: {required: true}, state_code: {required: true} }) user_data = set_user_defaults(params['user']) ParamValidation.new(user_data, { name: {required: true}, email: {required: true}, password: {required: true}, phone: {required: true} }) extra_info = params['extraInfo'] nonprofit = Qx.insert_into(:nonprofits) .values(nonprofit_data).timestamps .returning('*') .execute.last billing_plan_id = Settings.default_bp.id billing_subscription = Qx.insert_into(:billing_subscriptions) .values({ nonprofit_id: nonprofit['id'], billing_plan_id: billing_plan_id, status: 'active' }) .timestamps.execute.last # Create the user using the User and Role models (since we have to use Devise) user = User.create!(user_data) role = Qx.insert_into(:roles) .values(user_id: user.id, name: 'nonprofit_admin', host_id: nonprofit['id'], host_type: 'Nonprofit') .timestamps .execute.last self.delay.send_onboard_email(nonprofit, nonprofit_data, user_data, extra_info) return { nonprofit: nonprofit, user: user, role: role, billing_subscription: billing_subscription } end ### ethis is a one time method in order to add a user without testing for the method. Do not use this long term def self.create_org_with_user(params, user=nil) nonprofit_data = set_nonprofit_defaults(params['nonprofit']) ParamValidation.new(nonprofit_data, { name: {required: true}, # email: {required: true}, # phone: {required: true}, city: {required: true}, state_code: {required: true} }) if (!user) user_data = set_user_defaults(params['user']) ParamValidation.new(user_data, { name: {required: true}, email: {required: true}, password: {required: true}, phone: {required: true} }) end extra_info = params['extraInfo'] nonprofit = Qx.insert_into(:nonprofits) .values(nonprofit_data).timestamps .returning('*') .execute.last # Create a billing subscription for the 6% fee tier billing_plan_id = Settings.default_bp.id billing_subscription = Qx.insert_into(:billing_subscriptions) .values({ nonprofit_id: nonprofit['id'], billing_plan_id: billing_plan_id, status: 'active' }) .timestamps.execute.last # Create the user using the User and Role models (since we have to use Devise) user = !user ? User.create!(user_data) : user role = Qx.insert_into(:roles) .values(user_id: user.id, name: 'nonprofit_admin', host_id: nonprofit['id'], host_type: 'Nonprofit') .timestamps .execute.last self.delay.send_onboard_email(nonprofit, nonprofit_data, user_data, extra_info) return { nonprofit: nonprofit, user: user, role: role, billing_subscription: billing_subscription } end def self.set_nonprofit_defaults(data) data = data.merge({ verification_status: 'unverified', published: true, vetted: Settings.nonprofits_must_be_vetted ? false : true, statement: data[:name][0..16], city_slug: Format::Url.convert_to_slug(data[:city]), state_code_slug: Format::Url.convert_to_slug(data[:state_code]), slug: Format::Url.convert_to_slug(data[:name]) }) data end def self.set_user_defaults(data) data end # np is the created nonprofit row in the database # nonprofit_data is the data sent from the onboarding form, and may include extra stuff not in the db # user_data and extra_info are additional data hashes sent from the onboarding form def self.send_onboard_email(np, nonprofit_data, user_data, extra_info) # Send the welcome email to the nonprofit NonprofitMailer.welcome(np['id']).deliver # Send an email notifying people internal folks of the new nonporfit, with the above info and extra_info to_emails = ['support@commitchange.com'] message = %Q( New signup on CommitChange for an organization with the name "#{np['name']}" Location: #{np['city']} #{np['state_code']}, #{np['zip_code']} Org Email: #{nonprofit_data['email']} Org Phone: #{nonprofit_data['phone']} User Email: #{user_data['email']} User Name: #{user_data['name']} User Phone: #{user_data['phone']} Entity Type: #{extra_info['entity_type']} How they heard about us: #{extra_info['how_they_heard']} What they want to use: #{['use_donations', 'use_crm', 'use_campaigns', 'use_events'].select{|x| extra_info[x] == 'on'}.join(", ")} ) subject = "New Account Signup: #{np['name']}" GenericMailer.generic_mail('support@commitchange.com', 'CC Bot', message, subject, to_emails, '').deliver end end