DataObjects/Core_notify.php
[Pman.Core] / DataObjects / Core_notify.php
1 <?php
2 /**
3  *
4  * Table is designed to be used with a mailer to notify or issue
5  * emails (or maybe others later??)
6  *
7  *
8 CREATE TABLE  core_notify  (
9   `id` int(11)  NOT NULL AUTO_INCREMENT,
10   `recur_id` INT(11) NOT NULL;
11   `act_when` DATETIME NOT NULL,
12   `onid` int(11)  NOT NULL DEFAULT 0,
13   `ontable` varchar(128)  NOT NULL DEFAULT '',
14   `person_id` int(11)  NOT NULL DEFAULT 0,
15   `msgid` varchar(128)  NOT NULL  DEFAULT '',
16   `sent` DATETIME  NOT NULL,
17   `event_id` int(11)  NOT NULL DEFAULT 0,
18   PRIMARY KEY (`id`),
19   INDEX `lookup`(`act_when`, `msgid`)
20 );
21 **/
22
23 require_once 'DB/DataObject.php';
24
25 class Pman_Core_DataObjects_Core_notify extends DB_DataObject 
26 {
27     ###START_AUTOCODE
28     /* the code below is auto generated do not remove the above tag */
29
30     public $__table = 'core_notify';                     // table name
31     public $id;                              // int(11)  not_null primary_key auto_increment
32     public $recur_id;                        // int(11) not_null
33     public $act_when;                        // datetime(19)  not_null multiple_key binary
34     public $onid;                            // int(11)  not_null
35     public $ontable;                         // string(128)  not_null
36     public $person_id;                       // int(11)  not_null
37     public $msgid;                           // string(128)  not_null
38     public $sent;                            // datetime(19)  not_null binary
39     public $event_id;                        // int(11)  
40     public $watch_id;                        // int(11)  
41     public $trigger_person_id;                 // int(11)
42     public $trigger_event_id;              // int(11)  
43     public $evtype;                         // event type (or method to call)fall
44     public $act_start;
45     public $person_table;
46
47
48     /* the code above is auto generated do not remove the tag below */
49     ###END_AUTOCODE
50     
51     function person($set = false)
52     {
53         if ($set !== false) {
54             $this->person_id = is_object($set) ? $set->id : $set;
55             return;
56         }
57         static $cache  =array();
58         $person_table = empty($this->person_table) ? 'Person' : $this->person_table;
59         $col = $person_table == "Person" ? 'person_id' : $person_table . '_id';
60         
61         if (isset($cache[$person_table .':'. $this->{$col}])) {
62             return $cache[$person_table .':'. $this->{$col}];
63         }
64         
65         $c = DB_DataObject::Factory($person_table);
66         $c->get($this->{$col});
67         $cache[$person_table .':'. $this->{$col}] = $c;
68         return $c;
69         
70     }
71     function object($set = false)
72     {
73         if ($set !== false) {
74             $this->ontable = $set->tableName();
75             $this->onid = $set->id;
76             return $set;
77         }
78         $c = DB_DataObject::factory($this->ontable);
79         
80         if ($this->onid == 0) {
81             return $c; // empty dataobject.
82         }
83         
84         $c->autoJoin();
85         
86         if ($c->get($this->onid)) {
87             return $c;
88         }
89         return false;
90         
91     }
92     function beforeDelete($dependants_array, $roo) {
93         if ($this->delivered()) {
94             $roo->jerr("you can not delete a record of a successfull delivery");
95         }
96     }
97     function  beforeInsert($request,$roo)
98     {
99         if (empty($request['act_when']) && !empty($request['act_start'])) {
100             $this->act_start($request['act_start']);
101         }
102         
103     }
104     function beforeUpdate($old, $request,$roo)
105     {
106         if (empty($request['act_when']) && !empty($request['act_start'])) {
107             $this->act_start($request['act_start']);
108         }
109     }
110     
111     
112     function act_start($set = false)
113     {
114         if ($set === false) {
115             return $this->act_start;
116         }
117         $this->act_when = $set;
118         $this->act_start = $set;
119         return $set;
120     }
121     
122     function event()
123     {
124
125         $c = DB_DataObject::factory('Events');
126         
127         if ($c->get($this->event_id)) {
128             return $c;
129         }
130         return false;
131         
132     }
133     
134     function triggerEvent()
135     {
136
137         $c = DB_DataObject::factory('Events');
138         
139         if ($c->get($this->trigger_event_id)) {
140             return $c;
141         }
142         return false;
143         
144     }
145     
146     function delivered()
147     {
148         return !empty($this->msgid);
149     }
150     
151     function whereAddDeliveryStatus($delivered = false)
152     {
153         $tn = $this->tableName();
154         if ($delivered) {
155             $this->whereAdd("$tn.msgid IS NOT NULL AND $tn.msgid != ''");
156         } else {
157             $this->whereAdd("$tn.msgid IS NULL OR $tn.msgid = ''");    
158         }
159     }
160     
161     function status() // used by commandline reporting at present..
162     {
163         switch($this->event_id) {
164             case -1:
165                 return 'DELIVERED';   //not valid..
166             case 0:
167                 return 'PENDING';
168             default:
169                 $p ='';
170                 if (strtotime($this->act_when) > time()) {
171                     $p = "RETRY: {$this->act_when} ";
172                 }
173                 return  $p. $this->event()->remarks;
174         }
175         
176     }
177     
178     function applyFilters($q, $au, $roo)
179     {
180         if (isset($q['ontable']) && !in_array($q['ontable'], array('Person', 'Events',  'core_watch'))) {
181             // this will only work on tables not joined to ours.
182             
183             //DB_DAtaObject::DebugLevel(1);
184             // then we can build a join..
185             $d = DB_DataObject::Factory($q['ontable']);
186             $ji = $d->autoJoin();
187             //echo '<PRE>';print_R($ji);
188             // get cols
189             foreach($ji['join_names'] as $cname=>$fname) {
190                  $this->selectAdd($fname . ' as ontable_id_' . $cname );
191             }
192             
193             //$this->selectAdd($d->_query['data_select']); -- this will cause the same dataIndex...
194             $this->_join .= "
195                 LEFT JOIN {$d->tableName()} ON {$this->tableName()}.onid = {$d->tableName()}.id
196                 {$d->_join}
197             "; 
198             $this->selectAs($d, 'core_notify_%s');
199         } 
200         if (!empty($q['query']['person_id_name']) ) {
201             $this->whereAdd( "join_person_id_id.name LIKE '{$this->escape($q['query']['person_id_name'])}%'");
202              
203         }
204          if (!empty($q['query']['status'])) {
205             switch ($q['query']['status']) {
206                 
207                 case 'SUCCESS';
208                     $this->whereAdd("msgid  != ''");
209                     break;
210                 case 'FAILED';
211                     
212                     $this->whereAdd("msgid  = '' AND event_id > 0 AND act_when < NOW()");
213                     
214                     break;
215                 case 'PENDING';
216                     $this->whereAdd('event_id = 0 OR (event_id  > 0 AND act_when > NOW() )');
217                     break;
218                 
219                 case 'OPENED';
220                     $this->whereAdd('is_open > 0');
221                     break;
222                 
223                 case 'ALL':
224                 default:
225                     break;
226             }
227         }
228         
229         if(!empty($q['_evtype_align'])){
230             $this->selectAdd("
231                 (SELECT
232                         display_name
233                 FROM
234                         core_enum
235                 WHERE
236                         etype = 'Core.NotifyType'
237                     AND
238                         name = core_notify.evtype
239                     AND
240                         active = 1
241                 ) AS evtype_align
242             ");
243         }
244         
245         if(!empty($q['from'])){
246             $this->whereAdd("
247                 act_when >= '{$q['from']}'
248             ");
249         }
250         
251         if(!empty($q['to'])){
252             $this->whereAdd("
253                 act_when <= '{$q['to']}'
254             ");
255         }
256         
257     }
258     
259 }