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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2279ed1da365c2f560279b053789d0ec84654e186246069ed048fc43e4f5a1e1
4
- data.tar.gz: 0b27812e0789ded6977891aa5cf58f84173b4ea4aa92d4ab02ce70d67aeb7842
3
+ metadata.gz: 1b627aad79581526f09eb54fc4ccbc0008a196def8f094ccdcc4040056f176ec
4
+ data.tar.gz: e06ce92b8f549fdb0d5909d4d338aef318388c90f63869c9baa89e52afdf9705
5
5
  SHA512:
6
- metadata.gz: 50144c53859b17c5ac007176731c0cfc71b62a8eabd8f9502f6ce8614f4fbb2b890c7785d562515923eaa7af7a2bd42ae3b2a383ffb2c1ec2ff8fa0bb8142e98
7
- data.tar.gz: 1d06bd5b53f330a0548ca0a430721d9ae6b0bb2d0afb3c0157d6b2adf4ee227db9e255b2e507e3b2e89fd803e36b027475daf4a2163b8661936998c19be31e5f
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.10
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