ish_models 3.1.0.9 → 3.1.0.11

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 998cd0fb81cd84fb7c0ea1b80e37f959271b2cf9503fd17dcf3040096c11eb41
4
- data.tar.gz: 5226e69c9cc7916b3b3d7662749f83c0bd4fa662e75365306f2a583cafc044f4
3
+ metadata.gz: 1b627aad79581526f09eb54fc4ccbc0008a196def8f094ccdcc4040056f176ec
4
+ data.tar.gz: e06ce92b8f549fdb0d5909d4d338aef318388c90f63869c9baa89e52afdf9705
5
5
  SHA512:
6
- metadata.gz: '024445128c840ecb5ddc5f7ef3891bb11535ad85a87983897f05a3584b5872c26339c8f2cfc233f12078e699a3606023bfa19bfc7665182a9be3bfe48e780d5e'
7
- data.tar.gz: 97fbace86154ca32954de0d1eadf40e9a8f849b7e063499c5b0c8469c6cb5c13a0b1f6d5fa68fe91464a81a89003a951f2400c396eae748857fee8b1fa52c217
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,6 @@
1
+
2
+ class Wco::Lead
3
+ include Mongoid::Document
4
+ include Mongoid::Timestamps
5
+
6
+ end
@@ -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.9
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