ish_models 3.1.0.10 → 3.1.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/ish_models.rb +4 -0
- data/lib/wco/lead.rb +6 -0
- data/lib/wco/office_action.rb +32 -0
- data/lib/wco_email/campaign.rb +55 -0
- data/lib/wco_email/context.rb +114 -0
- data/lib/wco_email/scheduled_email_action.rb +64 -0
- metadata +6 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b627aad79581526f09eb54fc4ccbc0008a196def8f094ccdcc4040056f176ec
|
4
|
+
data.tar.gz: e06ce92b8f549fdb0d5909d4d338aef318388c90f63869c9baa89e52afdf9705
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ab2ea04a6d77d2f4245f330ce5cee822169b7a1449f8f92936c583f2099472088770f96123bf8a6f57466c1e3e2ceccb6924f09f0a7a7fc8697096042e46001
|
7
|
+
data.tar.gz: b0f242406016f9b680964a984564f428b70c80aed5cab8dfcf5ab602b9fb2780a98b601cdd1f01d2a5b02611f53d1ea6c25c6dec0bcb6ccd4cb5ce5a3946c3ed
|
data/lib/ish_models.rb
CHANGED
@@ -8,13 +8,17 @@ module Wco; end
|
|
8
8
|
module WcoEmail; end
|
9
9
|
module WcoHosting; end
|
10
10
|
|
11
|
+
require 'wco/lead'
|
11
12
|
require 'wco/leadset'
|
13
|
+
require 'wco/office_action'
|
12
14
|
require 'wco/profile'
|
13
15
|
require 'wco/tag'
|
14
16
|
|
17
|
+
require 'wco_email/context'
|
15
18
|
require 'wco_email/conversation'
|
16
19
|
require 'wco_email/email_filter'
|
17
20
|
require 'wco_email/message_template'
|
21
|
+
require 'wco_email/scheduled_email_action'
|
18
22
|
|
19
23
|
require 'wco_hosting/appliance'
|
20
24
|
require 'wco_hosting/appliance_tmpl'
|
data/lib/wco/lead.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
|
2
|
+
##
|
3
|
+
## 2023-09-13 _vp_ I don't know if it's even used.
|
4
|
+
##
|
5
|
+
class Wco::OfficeAction
|
6
|
+
include Mongoid::Document
|
7
|
+
include Mongoid::Timestamps
|
8
|
+
store_in collection: 'office_actions'
|
9
|
+
|
10
|
+
field :slug, type: :string
|
11
|
+
validates :slug, uniqueness: true, allow_nil: true
|
12
|
+
|
13
|
+
field :descr, type: :string ## optional
|
14
|
+
|
15
|
+
|
16
|
+
STATE_ACTIVE = 'active'
|
17
|
+
STATE_INACTIVE = 'inactive'
|
18
|
+
STATES = [ STATE_ACTIVE, STATE_INACTIVE ]
|
19
|
+
field :state, type: :string
|
20
|
+
scope :active, ->{ where( state: STATE_ACTIVE ) }
|
21
|
+
|
22
|
+
|
23
|
+
has_many :ties, class_name: '::Office::ActionTie', inverse_of: :office_action
|
24
|
+
has_many :prev_ties, class_name: '::Office::ActionTie', inverse_of: :next_office_action
|
25
|
+
accepts_nested_attributes_for :ties
|
26
|
+
|
27
|
+
field :action_exe, type: :string
|
28
|
+
|
29
|
+
field :perform_at, type: :time
|
30
|
+
|
31
|
+
end
|
32
|
+
OAct = Wco::OfficeAction
|
@@ -0,0 +1,55 @@
|
|
1
|
+
|
2
|
+
##
|
3
|
+
## Sends a campaign.
|
4
|
+
## _vp_ 2023-02-02
|
5
|
+
##
|
6
|
+
class WcoEmail::Campaign
|
7
|
+
include Mongoid::Document
|
8
|
+
include Mongoid::Timestamps
|
9
|
+
store_in collection: 'ish_email_campaigns'
|
10
|
+
|
11
|
+
field :slug
|
12
|
+
validates_uniqueness_of :slug, allow_nil: true
|
13
|
+
|
14
|
+
PAGE_PARAM_NAME = 'email_contexts_page'
|
15
|
+
|
16
|
+
field :from_email
|
17
|
+
validates_presence_of :from_email
|
18
|
+
|
19
|
+
belongs_to :email_template
|
20
|
+
def tmpl; email_template; end
|
21
|
+
|
22
|
+
field :subject
|
23
|
+
field :body
|
24
|
+
|
25
|
+
field :sent_at, type: DateTime
|
26
|
+
field :send_at, type: DateTime
|
27
|
+
|
28
|
+
has_many :unsubscribes, class_name: '::Ish::EmailUnsubscribe', inverse_of: :campaign
|
29
|
+
|
30
|
+
def campaign_leads
|
31
|
+
return ::EmailCampaignLead.where( email_campaign_id: self.id.to_s ).includes( :lead )
|
32
|
+
end
|
33
|
+
|
34
|
+
def leads
|
35
|
+
::Lead.joins( :email_campaign_leads ).where( 'email_campaign_leads.email_campaign_id' => self.id.to_s )
|
36
|
+
end
|
37
|
+
|
38
|
+
##
|
39
|
+
## For tracking
|
40
|
+
##
|
41
|
+
attr_reader :tid
|
42
|
+
|
43
|
+
def do_send
|
44
|
+
leads.each do |lead|
|
45
|
+
ctx = Ctx.create!({
|
46
|
+
email_template: tmpl,
|
47
|
+
from_email: tmpl.from_email,
|
48
|
+
lead_id: lead.id,
|
49
|
+
send_at: Time.now,
|
50
|
+
subject: tmpl.subject,
|
51
|
+
})
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
##
|
2
|
+
## Send a single email
|
3
|
+
##
|
4
|
+
|
5
|
+
class WcoEmail::Context
|
6
|
+
include Mongoid::Document
|
7
|
+
include Mongoid::Timestamps
|
8
|
+
store_in collection: 'ish_email_contexts'
|
9
|
+
|
10
|
+
field :slug
|
11
|
+
validates_uniqueness_of :slug, allow_nil: true
|
12
|
+
|
13
|
+
field :preview_str, type: :string
|
14
|
+
def preview_str
|
15
|
+
if self[:preview_str].presence
|
16
|
+
return self[:preview_str]
|
17
|
+
else
|
18
|
+
return tmpl.preview_str
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
field :body
|
23
|
+
def body
|
24
|
+
if self[:body].presence
|
25
|
+
return self[:body]
|
26
|
+
else
|
27
|
+
return tmpl.body
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
PAGE_PARAM_NAME = 'email_contexts_page'
|
32
|
+
|
33
|
+
field :from_email
|
34
|
+
def from_email
|
35
|
+
if self[:from_email].presence
|
36
|
+
return self[:from_email]
|
37
|
+
else
|
38
|
+
return tmpl.from_email
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
field :subject
|
43
|
+
def subject
|
44
|
+
self[:subject].presence || tmpl.subject
|
45
|
+
end
|
46
|
+
|
47
|
+
belongs_to :email_template
|
48
|
+
def tmpl; email_template; end
|
49
|
+
|
50
|
+
belongs_to :scheduled_email_action, class_name: '::Office::ScheduledEmailAction', optional: true
|
51
|
+
def sch; scheduled_email_action; end
|
52
|
+
|
53
|
+
belongs_to :email_campaign, class_name: 'Ish::EmailCampaign', optional: true
|
54
|
+
|
55
|
+
field :rendered_str
|
56
|
+
|
57
|
+
field :sent_at, type: DateTime
|
58
|
+
field :send_at, type: DateTime
|
59
|
+
field :unsubscribed_at, type: DateTime
|
60
|
+
|
61
|
+
|
62
|
+
def notsent
|
63
|
+
Ish::EmailContext.where( sent_at: nil, unsubscribed_at: nil )
|
64
|
+
end
|
65
|
+
def self.notsent; new.notsent; end
|
66
|
+
|
67
|
+
|
68
|
+
def scheduled
|
69
|
+
# or({ :send_at.lte => Time.now }, { :send_at => nil }) ## This won't work b/c I need draft state!
|
70
|
+
Ish::EmailContext.where({ :send_at.lte => Time.now })
|
71
|
+
end
|
72
|
+
def self.scheduled; new.scheduled; end
|
73
|
+
|
74
|
+
|
75
|
+
## like belongs_to to_lead , but Lead is SQL to just the lead_id
|
76
|
+
field :lead_id, type: :integer
|
77
|
+
def lead; Lead.find( lead_id ); end
|
78
|
+
def to_email; lead[:email]; end ## @TODO: remove, just use the lead. _vp_ 2023-03-27
|
79
|
+
# ## no `to` field b/c that's the lead
|
80
|
+
# field :tos, type: :array, default: []
|
81
|
+
field :cc, type: :string
|
82
|
+
field :ccs, type: :array, default: []
|
83
|
+
|
84
|
+
##
|
85
|
+
## For tracking / utm
|
86
|
+
##
|
87
|
+
attr_reader :tid
|
88
|
+
|
89
|
+
def get_binding
|
90
|
+
@lead = lead()
|
91
|
+
@utm_tracking_str = {
|
92
|
+
'cid' => lead.id,
|
93
|
+
'utm_campaign' => tmpl.slug,
|
94
|
+
'utm_medium' => 'email',
|
95
|
+
'utm_source' => tmpl.slug,
|
96
|
+
}.map { |k, v| "#{k}=#{v}" }.join("&")
|
97
|
+
eval( tmpl.config_exe )
|
98
|
+
binding()
|
99
|
+
end
|
100
|
+
|
101
|
+
def self.summary
|
102
|
+
pipeline = [
|
103
|
+
{ '$group' => {
|
104
|
+
'_id' => { '$dateToString' => { 'format' => "%Y-%m-%d", 'date' => "$sent_at", 'timezone' => 'America/Chicago' } }, 'total' => { '$sum' => 1 }
|
105
|
+
} },
|
106
|
+
{ '$sort' => { '_id': -1 } },
|
107
|
+
]
|
108
|
+
outs = Ish::EmailContext.collection.aggregate( pipeline )
|
109
|
+
outs.to_a
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
Ctx = WcoEmail::Context
|
114
|
+
|
@@ -0,0 +1,64 @@
|
|
1
|
+
|
2
|
+
require 'mongoid-paranoia'
|
3
|
+
|
4
|
+
##
|
5
|
+
## 2023-03-04 _vp_ An instance of an EmailAction.
|
6
|
+
##
|
7
|
+
class WcoEmail::ScheduledEmailAction
|
8
|
+
include Mongoid::Document
|
9
|
+
include Mongoid::Timestamps
|
10
|
+
include Mongoid::Paranoia
|
11
|
+
store_in collection: 'office_scheduled_email_actions'
|
12
|
+
|
13
|
+
field :lead_id, type: :integer
|
14
|
+
def lead
|
15
|
+
Lead.find( lead_id )
|
16
|
+
end
|
17
|
+
|
18
|
+
STATE_ACTIVE = 'active'
|
19
|
+
STATE_INACTIVE = 'inactive'
|
20
|
+
STATE_TRASH = 'trash'
|
21
|
+
STATE_UNSUBSCRIBED = 'unsubscribed'
|
22
|
+
STATES = [ STATE_ACTIVE, STATE_INACTIVE, STATE_UNSUBSCRIBED, STATE_TRASH ]
|
23
|
+
field :state, type: :string
|
24
|
+
scope :active, ->{ where( state: STATE_ACTIVE ) }
|
25
|
+
|
26
|
+
belongs_to :email_action, class_name: '::Office::EmailAction'
|
27
|
+
validates :email_action, uniqueness: { scope: :lead_id }
|
28
|
+
def act; email_action; end
|
29
|
+
def act= a; email_action= a; end
|
30
|
+
|
31
|
+
has_many :email_contexts, class_name: '::Ish::EmailContext'
|
32
|
+
def ctxs; email_contexts; end
|
33
|
+
|
34
|
+
field :perform_at, type: :time
|
35
|
+
|
36
|
+
def send_and_roll
|
37
|
+
sch = self
|
38
|
+
sch.update({ state: Sch::STATE_INACTIVE })
|
39
|
+
|
40
|
+
# send now
|
41
|
+
ctx = Ctx.create!({
|
42
|
+
email_template_id: sch.act.tmpl.id,
|
43
|
+
from_email: sch.act.tmpl.from_email,
|
44
|
+
lead_id: sch.lead.id,
|
45
|
+
scheduled_email_action_id: sch.act.id,
|
46
|
+
send_at: Time.now,
|
47
|
+
subject: sch.act.tmpl.subject,
|
48
|
+
})
|
49
|
+
|
50
|
+
# schedule next actions & update the action
|
51
|
+
sch.act.ties.each do |tie|
|
52
|
+
next_sch = Sch.find_or_initialize_by({
|
53
|
+
lead_id: sch.lead_id,
|
54
|
+
email_action_id: tie.next_email_action.id,
|
55
|
+
})
|
56
|
+
next_sch.perform_at = eval(tie.next_at_exe)
|
57
|
+
next_sch.state = Sch::STATE_ACTIVE
|
58
|
+
next_sch.save!
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
::Sch = WcoEmail::ScheduledEmailAction
|
64
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ish_models
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1.0.
|
4
|
+
version: 3.1.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mac_a2141
|
@@ -142,12 +142,17 @@ files:
|
|
142
142
|
- lib/ish_models.rb
|
143
143
|
- lib/ish_models/engine.rb
|
144
144
|
- lib/tasks/ish_models_tasks.rake
|
145
|
+
- lib/wco/lead.rb
|
145
146
|
- lib/wco/leadset.rb
|
147
|
+
- lib/wco/office_action.rb
|
146
148
|
- lib/wco/profile.rb
|
147
149
|
- lib/wco/tag.rb
|
150
|
+
- lib/wco_email/campaign.rb
|
151
|
+
- lib/wco_email/context.rb
|
148
152
|
- lib/wco_email/conversation.rb
|
149
153
|
- lib/wco_email/email_filter.rb
|
150
154
|
- lib/wco_email/message_template.rb
|
155
|
+
- lib/wco_email/scheduled_email_action.rb
|
151
156
|
- lib/wco_email/tag.rb-trash
|
152
157
|
- lib/wco_hosting/appliance.rb
|
153
158
|
- lib/wco_hosting/appliance_tmpl.rb
|