afc_salesforce 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +4 -0
- data/README.md +1 -0
- data/Rakefile +6 -0
- data/afc_salesforce.gemspec +40 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/afc_salesforce.rb +56 -0
- data/lib/afc_salesforce/account.rb +61 -0
- data/lib/afc_salesforce/additional_income.rb +12 -0
- data/lib/afc_salesforce/ahc_realtor.rb +0 -0
- data/lib/afc_salesforce/asset.rb +13 -0
- data/lib/afc_salesforce/base.rb +11 -0
- data/lib/afc_salesforce/borrower.rb +36 -0
- data/lib/afc_salesforce/configuration.rb +16 -0
- data/lib/afc_salesforce/forms/agent_referral.rb +50 -0
- data/lib/afc_salesforce/forms/long_purchase.rb +56 -0
- data/lib/afc_salesforce/forms/long_refinance.rb +56 -0
- data/lib/afc_salesforce/forms/short_lead.rb +48 -0
- data/lib/afc_salesforce/lead.rb +31 -0
- data/lib/afc_salesforce/models/account.rb +267 -0
- data/lib/afc_salesforce/models/ahc_realtor.rb +67 -0
- data/lib/afc_salesforce/models/asset.rb +35 -0
- data/lib/afc_salesforce/models/base.rb +17 -0
- data/lib/afc_salesforce/models/concerns/type_setter.rb +23 -0
- data/lib/afc_salesforce/models/contact.rb +152 -0
- data/lib/afc_salesforce/models/income.rb +25 -0
- data/lib/afc_salesforce/models/lead.rb +118 -0
- data/lib/afc_salesforce/tools.rb +4 -0
- data/lib/afc_salesforce/tools/utilities.rb +45 -0
- data/lib/afc_salesforce/tools/validation.rb +18 -0
- data/lib/afc_salesforce/tools/validation/rule/email.rb +58 -0
- data/lib/afc_salesforce/tools/validation/rule/instance_of.rb +36 -0
- data/lib/afc_salesforce/tools/validation/rule/length.rb +52 -0
- data/lib/afc_salesforce/tools/validation/rule/matches.rb +44 -0
- data/lib/afc_salesforce/tools/validation/rule/not_empty.rb +32 -0
- data/lib/afc_salesforce/tools/validation/rule/not_nil.rb +32 -0
- data/lib/afc_salesforce/tools/validation/rule/numeric.rb +32 -0
- data/lib/afc_salesforce/tools/validation/rule/phone.rb +51 -0
- data/lib/afc_salesforce/tools/validation/rule/regular_expression.rb +33 -0
- data/lib/afc_salesforce/tools/validation/validator.rb +128 -0
- data/lib/afc_salesforce/version.rb +3 -0
- metadata +194 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e768c92706638383120f1a7722c63675f21244b8
|
4
|
+
data.tar.gz: ee5f3bf779bb49689fe65a92423e87b525549cc1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5ce372b9c6846645309d931b9a0e76cd9df20ba83d7ee5fd88180902bd2ea8f918fd702d10aa918a5e9419f4e2d5c0ef01e564b9d703e6bd75a4e1bf296971e0
|
7
|
+
data.tar.gz: c553e5d3c96746197d89807f7d6bad29e54ed9b48e6c0beaec3c2a634b632d1b53bddeeacc75672d244801eaaa110ff06f39c01456c48e7c8085046acae1db93
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/CODE_OF_CONDUCT.md
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
# Contributor Covenant Code of Conduct
|
2
|
+
|
3
|
+
## Our Pledge
|
4
|
+
|
5
|
+
In the interest of fostering an open and welcoming environment, we as
|
6
|
+
contributors and maintainers pledge to making participation in our project and
|
7
|
+
our community a harassment-free experience for everyone, regardless of age, body
|
8
|
+
size, disability, ethnicity, gender identity and expression, level of experience,
|
9
|
+
nationality, personal appearance, race, religion, or sexual identity and
|
10
|
+
orientation.
|
11
|
+
|
12
|
+
## Our Standards
|
13
|
+
|
14
|
+
Examples of behavior that contributes to creating a positive environment
|
15
|
+
include:
|
16
|
+
|
17
|
+
* Using welcoming and inclusive language
|
18
|
+
* Being respectful of differing viewpoints and experiences
|
19
|
+
* Gracefully accepting constructive criticism
|
20
|
+
* Focusing on what is best for the community
|
21
|
+
* Showing empathy towards other community members
|
22
|
+
|
23
|
+
Examples of unacceptable behavior by participants include:
|
24
|
+
|
25
|
+
* The use of sexualized language or imagery and unwelcome sexual attention or
|
26
|
+
advances
|
27
|
+
* Trolling, insulting/derogatory comments, and personal or political attacks
|
28
|
+
* Public or private harassment
|
29
|
+
* Publishing others' private information, such as a physical or electronic
|
30
|
+
address, without explicit permission
|
31
|
+
* Other conduct which could reasonably be considered inappropriate in a
|
32
|
+
professional setting
|
33
|
+
|
34
|
+
## Our Responsibilities
|
35
|
+
|
36
|
+
Project maintainers are responsible for clarifying the standards of acceptable
|
37
|
+
behavior and are expected to take appropriate and fair corrective action in
|
38
|
+
response to any instances of unacceptable behavior.
|
39
|
+
|
40
|
+
Project maintainers have the right and responsibility to remove, edit, or
|
41
|
+
reject comments, commits, code, wiki edits, issues, and other contributions
|
42
|
+
that are not aligned to this Code of Conduct, or to ban temporarily or
|
43
|
+
permanently any contributor for other behaviors that they deem inappropriate,
|
44
|
+
threatening, offensive, or harmful.
|
45
|
+
|
46
|
+
## Scope
|
47
|
+
|
48
|
+
This Code of Conduct applies both within project spaces and in public spaces
|
49
|
+
when an individual is representing the project or its community. Examples of
|
50
|
+
representing a project or community include using an official project e-mail
|
51
|
+
address, posting via an official social media account, or acting as an appointed
|
52
|
+
representative at an online or offline event. Representation of a project may be
|
53
|
+
further defined and clarified by project maintainers.
|
54
|
+
|
55
|
+
## Enforcement
|
56
|
+
|
57
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
58
|
+
reported by contacting the project team at donavan.white@americanfinancing.net. All
|
59
|
+
complaints will be reviewed and investigated and will result in a response that
|
60
|
+
is deemed necessary and appropriate to the circumstances. The project team is
|
61
|
+
obligated to maintain confidentiality with regard to the reporter of an incident.
|
62
|
+
Further details of specific enforcement policies may be posted separately.
|
63
|
+
|
64
|
+
Project maintainers who do not follow or enforce the Code of Conduct in good
|
65
|
+
faith may face temporary or permanent repercussions as determined by other
|
66
|
+
members of the project's leadership.
|
67
|
+
|
68
|
+
## Attribution
|
69
|
+
|
70
|
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
71
|
+
available at [http://contributor-covenant.org/version/1/4][version]
|
72
|
+
|
73
|
+
[homepage]: http://contributor-covenant.org
|
74
|
+
[version]: http://contributor-covenant.org/version/1/4/
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Gem for connecting to SalesForce (Not for production use)
|
data/Rakefile
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'afc_salesforce/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "afc_salesforce"
|
8
|
+
spec.version = AFCSalesforce::VERSION
|
9
|
+
spec.authors = ["Donavan White"]
|
10
|
+
spec.email = ["donavan.white@americanfinancing.net"]
|
11
|
+
spec.license = 'MIT'
|
12
|
+
|
13
|
+
spec.summary = %q{Salesforce Library for the AFC Salesforce Instance}
|
14
|
+
spec.description = %q{Ruby lib for handling the connection to REST endpoints on any Sandbox and Production Salesforce}
|
15
|
+
spec.homepage = "https://www.americanfinancing.net"
|
16
|
+
|
17
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
18
|
+
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
19
|
+
# if spec.respond_to?(:metadata)
|
20
|
+
# spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
|
21
|
+
# else
|
22
|
+
# raise "RubyGems 2.0 or newer is required to protect against " \
|
23
|
+
# "public gem pushes."
|
24
|
+
# end
|
25
|
+
|
26
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
27
|
+
f.match(%r{^(test|spec|features)/})
|
28
|
+
end
|
29
|
+
spec.bindir = "exe"
|
30
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
31
|
+
spec.require_paths = ["lib"]
|
32
|
+
|
33
|
+
spec.add_development_dependency "bundler", "~> 1.14"
|
34
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
35
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
36
|
+
spec.add_development_dependency "simplecov", "~> 0.14"
|
37
|
+
spec.add_development_dependency "factory_girl", "~> 4.8"
|
38
|
+
spec.add_runtime_dependency 'restforce', '~> 2.5', '>= 2.5.3'
|
39
|
+
spec.add_dependency "json", "~> 1.7"
|
40
|
+
end
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "afc/salesforce"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'time'
|
2
|
+
require 'json'
|
3
|
+
require 'restforce'
|
4
|
+
|
5
|
+
require_relative 'afc_salesforce/configuration'
|
6
|
+
|
7
|
+
require_relative 'afc_salesforce/tools/utilities'
|
8
|
+
require_relative 'afc_salesforce/tools/validation'
|
9
|
+
require_relative 'afc_salesforce/tools/validation/rule/email'
|
10
|
+
require_relative 'afc_salesforce/tools/validation/rule/length'
|
11
|
+
require_relative 'afc_salesforce/tools/validation/rule/matches'
|
12
|
+
require_relative 'afc_salesforce/tools/validation/rule/not_empty'
|
13
|
+
require_relative 'afc_salesforce/tools/validation/rule/not_nil'
|
14
|
+
require_relative 'afc_salesforce/tools/validation/rule/numeric'
|
15
|
+
require_relative 'afc_salesforce/tools/validation/rule/phone'
|
16
|
+
require_relative 'afc_salesforce/tools/validation/rule/regular_expression'
|
17
|
+
require_relative 'afc_salesforce/tools/validation/rule/instance_of'
|
18
|
+
|
19
|
+
require_relative 'afc_salesforce/models/concerns/type_setter'
|
20
|
+
require_relative 'afc_salesforce/models/base'
|
21
|
+
require_relative 'afc_salesforce/models/account'
|
22
|
+
require_relative 'afc_salesforce/models/asset'
|
23
|
+
require_relative 'afc_salesforce/models/contact'
|
24
|
+
require_relative 'afc_salesforce/models/income'
|
25
|
+
require_relative 'afc_salesforce/models/lead'
|
26
|
+
|
27
|
+
require_relative 'afc_salesforce/base'
|
28
|
+
require_relative 'afc_salesforce/account'
|
29
|
+
require_relative 'afc_salesforce/additional_income'
|
30
|
+
require_relative 'afc_salesforce/asset'
|
31
|
+
require_relative 'afc_salesforce/borrower'
|
32
|
+
require_relative 'afc_salesforce/lead'
|
33
|
+
|
34
|
+
require_relative 'afc_salesforce/forms/long_purchase'
|
35
|
+
require_relative 'afc_salesforce/forms/long_refinance'
|
36
|
+
require_relative 'afc_salesforce/forms/short_lead'
|
37
|
+
|
38
|
+
require_relative 'afc_salesforce/version'
|
39
|
+
|
40
|
+
module AFCSalesforce
|
41
|
+
class << self
|
42
|
+
attr_accessor :configuration
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.configuration
|
46
|
+
@configuration ||= Configuration.new
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.reset
|
50
|
+
@configuration = Configuration.new
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.configure
|
54
|
+
yield(configuration)
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module AFCSalesforce
|
2
|
+
class Account < Base
|
3
|
+
attr_accessor :phone, :email, :street, :zip, :state, :city, :loan_type, :purchase_date,
|
4
|
+
:property_address, :property_city, :property_state, :property_zip, :property_type, :program_type, :last_appraisal__c,
|
5
|
+
:loan_purpose, :property_bedroom_count, :property_acre_count, :property_bathroom_count, :property_price, :property_close_date, :is_escrowed,
|
6
|
+
:property_down_payment, :realtor_email, :realtor_name, :realtor_phone, :source, :endorser, :realtor_sign_up_date,
|
7
|
+
:initial_purchase_price, :date_of_purchase, :refinance_loan_type, :approximate_value, :date_of_last_appraisal,
|
8
|
+
:appraised_value, :square_feet, :first_mortgage_payment, :first_mortgage_balance, :first_mortgage_interest_rate,
|
9
|
+
:monthly_taxes, :monthly_insurance, :name, :hoa_dues, :is_va_eligible, :purchase_close_date, :second_mortgage, :second_mortgage_payment,
|
10
|
+
:second_mortgage_date_opened, :second_mortgage_balance, :x2nd_mortgage_date_opened__c, :second_mortgage_rate, :refinance_reason,
|
11
|
+
:number_of_units, :session_uuid
|
12
|
+
|
13
|
+
def to_h
|
14
|
+
AFCSalesforce::Models::Account.new(
|
15
|
+
acres__c: @property_acre_count,
|
16
|
+
appraised_value__c: @appraised_value,
|
17
|
+
approximate_value__c: @approximate_value,
|
18
|
+
bathrooms__c: @property_bathroom_count,
|
19
|
+
bedrooms__c: @property_bedroom_count,
|
20
|
+
billingpostalcode: @zip,
|
21
|
+
billingstate: @state,
|
22
|
+
billingstreet: @street,
|
23
|
+
down_payment__c: @property_down_payment,
|
24
|
+
endorser__c: @endorser,
|
25
|
+
escrowed__c: @is_escrowed,
|
26
|
+
hoa_dues__c: @hoa_dues,
|
27
|
+
last_appraisal__c: @date_of_last_appraisal,
|
28
|
+
loan_type__c: @refinance_loan_type,
|
29
|
+
loan_purpose__c: @loan_purpose,
|
30
|
+
monthly_insurance__c: @monthly_insurance,
|
31
|
+
monthly_taxes__c: @monthly_taxes,
|
32
|
+
name: @name,
|
33
|
+
new_purchase_price__c: @property_price,
|
34
|
+
number_of_units__c: @number_of_units,
|
35
|
+
original_purchase_price__c: @initial_purchase_price,
|
36
|
+
phone: @phone,
|
37
|
+
program_type__c: @program_type,
|
38
|
+
property_type__c: @property_type,
|
39
|
+
purchase_date__c: @purchase_date,
|
40
|
+
puchase_close_date__c: @purchase_close_date,
|
41
|
+
realtor_email__c: @realtor_email,
|
42
|
+
realtor_name__c: @realtor_name,
|
43
|
+
realtor_phone_number__c: @realtor_phone,
|
44
|
+
refinance_purpose__c: @refinance_reason,
|
45
|
+
session_uuid__c: @session_uuid,
|
46
|
+
source__c: @source,
|
47
|
+
square_feet__c: @square_feet,
|
48
|
+
type__c: @loan_type,
|
49
|
+
va_eligible__c: @is_va_eligible,
|
50
|
+
x1st_mortgage_balance__c: @first_mortgage_balance,
|
51
|
+
x1st_mortgage_payment__c: @first_mortgage_payment,
|
52
|
+
x1st_mortgage_rate__c: @first_mortgage_interest_rate,
|
53
|
+
x2nd_mortgage__c: @second_mortgage,
|
54
|
+
x2nd_mortgage_balance__c: @second_mortgage_balance,
|
55
|
+
x2nd_mortgage_date_opened__c: @second_mortgage_date_opened,
|
56
|
+
x2nd_mortgage_payment__c: @second_mortgage_payment,
|
57
|
+
x2nd_mortgage_rate__c: @second_mortgage_rate
|
58
|
+
).to_h
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
File without changes
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module AFCSalesforce
|
2
|
+
class Borrower < Base
|
3
|
+
attr_accessor :first_name, :income_type, :middle_name, :last_name, :phone,
|
4
|
+
:ssn, :email, :street, :city, :state, :zip, :company_name,
|
5
|
+
:marital_status, :suffix
|
6
|
+
|
7
|
+
set_as_integer :monthly_income, :yearly_income, :years_on_job
|
8
|
+
set_as_boolean :is_self_employed, :is_primary
|
9
|
+
set_as_date :birthdate
|
10
|
+
|
11
|
+
def to_h
|
12
|
+
AFCSalesforce::Models::Contact.new(
|
13
|
+
additional_income_type__c: @income_type,
|
14
|
+
firstname: @first_name,
|
15
|
+
middle_name__c: @middle_name,
|
16
|
+
lastname: @last_name,
|
17
|
+
suffix__c: @suffix,
|
18
|
+
phone: @phone,
|
19
|
+
ssn__c: @ssn,
|
20
|
+
email: @email,
|
21
|
+
marital_status__c: @marital_status,
|
22
|
+
mailingstreet: @street,
|
23
|
+
mailingcity: @city,
|
24
|
+
mailingstate: @state,
|
25
|
+
mailingpostalcode: @zip,
|
26
|
+
bor_company_name__c: @company_name,
|
27
|
+
monthly_income__c: @monthly_income,
|
28
|
+
yearly_income__c: @yearly_income,
|
29
|
+
years_on_the_job__c: @years_on_job,
|
30
|
+
is_self_employed__c: @is_self_employed,
|
31
|
+
primary_borrower__c: @is_primary,
|
32
|
+
birthdate: @birthdate
|
33
|
+
).to_h
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module AFCSalesforce
|
2
|
+
class Configuration
|
3
|
+
attr_accessor :salesforce_host, :salesforce_username, :salesforce_password, :salesforce_security_token,
|
4
|
+
:salesforce_client_id, :salesforce_client_secret, :salesforce_api_version
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@salesforce_host = nil
|
8
|
+
@salesforce_username = nil
|
9
|
+
@salesforce_password = nil
|
10
|
+
@salesforce_security_token = nil
|
11
|
+
@salesforce_client_id = nil
|
12
|
+
@salesforce_client_secret = nil
|
13
|
+
@salesforce_api_version = nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module AFCSalesforce
|
2
|
+
module Forms
|
3
|
+
class AgentReferral
|
4
|
+
attr_accessor :lead, :ahc_realtor
|
5
|
+
|
6
|
+
def initialize(options={})
|
7
|
+
@lead = options[:lead]
|
8
|
+
@ahc_realtor = options[:ahc_realtor]
|
9
|
+
end
|
10
|
+
|
11
|
+
def valid?
|
12
|
+
validator = AgentReferralValidator.new(self)
|
13
|
+
validator.valid?
|
14
|
+
end
|
15
|
+
|
16
|
+
def validate!
|
17
|
+
validator = AgentReferralValidator.new(self)
|
18
|
+
if validator.valid?
|
19
|
+
return true
|
20
|
+
else
|
21
|
+
return validator.errors
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def salesforce_hash
|
26
|
+
{
|
27
|
+
short_lead: {
|
28
|
+
lead: @lead.to_h
|
29
|
+
}
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
def send_to_salesforce
|
34
|
+
Restforce.new(
|
35
|
+
username: AFCSalesforce.configuration.salesforce_username,
|
36
|
+
password: AFCSalesforce.configuration.salesforce_password,
|
37
|
+
client_id: AFCSalesforce.configuration.salesforce_client_id,
|
38
|
+
client_secret: AFCSalesforce.configuration.salesforce_client_secret,
|
39
|
+
api_version: AFCSalesforce.configuration.salesforce_api_version
|
40
|
+
).post(URI('/services/apexrest/v1/lead_form'), salesforce_hash)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class AgentReferralValidator < AFCSalesforce::Tools::Validation::Validator
|
45
|
+
include AFCSalesforce::Tools::Validation
|
46
|
+
rule :lead, [{instance_of: AFCSalesforce::Lead}, :not_nil]
|
47
|
+
rule :ahc_realtor, [{instance_of: AFCSalesforce::AHCRealtor}, :not_nil]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|