source: trunk/prototype/modules/mail/interceptors/Helpers.php @ 7720

Revision 7720, 13.1 KB checked in by adriano, 11 years ago (diff)

Ticket #2523 - criado componente generico combobox utilizado na tela de sinalizacao para acompanhamento

Line 
1<?php
2include_once ROOTPATH."/../expressoMail1_2/inc/class.imap_functions.inc.php";
3
4use prototype\api\Config as Config;
5
6class Helpers {   
7
8/**
9 * LABEL
10 */
11        //labeled:after.find
12        public function deepnessLabeleds( &$uri , &$result , &$criteria , $original ){               
13
14                if(isset($original['criteria']['deepness']))
15                {
16                        foreach ($result as $i => $v)
17                        {
18                                if(isset($v['labelId']))
19                                {
20                                        $labels = Controller::find( array( 'concept' => 'label' ) , false, array( 'filter' => array('=', 'id'  ,  $v['labelId']) ));     
21                                        $result[$i]['label'] = $labels[0];
22                                }             
23
24                        }
25                }
26
27                return $result;
28        }
29       
30        /**
31         * Método a ser chamado na exclusão de um label, procedendo com a
32         * desvinculação deste label com todas as mensagens a que estava vinculado
33         */
34        //label:before.delete
35        public function clearAllLabeledsOfLabel( &$uri , &$result , &$criteria , $original ){
36               
37                $labeleds = Controller::find( array( 'concept' => 'labeled' ) , false, array( 'filter' => array('=', 'labelId'  ,  $uri['id']) ));
38                if (empty($labeleds))
39                        return;
40               
41                $labeledsIds = array();
42                foreach ($labeleds as $e) {
43                                $labeledsIds[] = $e['id'];
44                }
45                Controller::delete( array( 'concept' => 'labeled', 'service' => 'Imap' ), false, array( 'filter' => array( 'IN', 'id', $labeledsIds )) );
46
47                //return $result;
48        }
49        /**
50         * Método a ser chamado ao listar os labeleds, uma vez que as funções de IMAP do PHP não são capazes de
51         * obter a lista de todos os labels e nem são capazes de obter os labels de uma dada mensagem
52         */
53        //labeled:before.find
54        public function makeLabelListFilter( &$uri , &$result , &$criteria , $original ){
55
56                if (!isset($criteria['filter']) || !self::in_arrayr('labelId', $criteria['filter'])) {
57                        $labels = Controller::find( array( 'concept' => 'label' ) );
58
59                        $list = array();
60                        if(is_array($labels))
61                        foreach ($labels as $label)
62                                $list[] = $label['id'];
63                               
64                        $filter = array( 'IN' , 'labelId' , $list );
65                       
66                        if (isset($criteria['filter']) && $criteria['filter']!=NULL && count($criteria['filter']) != 0)
67                                $criteria['filter'] = array( 'AND', $criteria['filter'], $filter );
68                        else
69                                $criteria['filter'] =  $filter;
70                }
71        }
72       
73        public static function in_arrayr($needle, $haystack) {
74                //if(!is_array($haystack)) return false;
75               
76                foreach ($haystack as $v) {
77                                if ($needle == $v) return true;
78                                elseif (is_array($v)) return self::in_arrayr($needle, $v);
79                }
80                return false;
81        }
82       
83/**
84 * FOLLOWUPFLAG
85 */
86        //followupflagged:after.find
87        public function deepnessFollowupflaggeds( &$uri , &$result , &$criteria , $original ){               
88
89                if(isset($original['criteria']['deepness']))
90                {
91                        foreach ($result as $i => $v)
92                        {
93                                if(isset($v['followupflagId']))
94                                {
95                                        $followupflags = Controller::find(array('concept' => 'followupflag'), false, array('filter' => array('=', 'id', $v['followupflagId']) ));
96                                       
97                                        /**
98                                         * Devido a inconsistencias na chamada do interceptor addDefaultElementsFilter (followupflag:before.find)
99                                         * os followupflag defaults são inseridos no retorno, por isso é necessário procurar o objeto correto
100                                         * através do id
101                                         */
102                                        foreach ($followupflags as $followupflag) {
103                                                if ($v['followupflagId'] == $followupflag['id']) {
104                                                        $result[$i]['followupflag'] = $followupflag;
105                                                        break;
106                                                }
107                                        }
108                                }
109                               
110                                if(isset($v['messageNumber']) && isset($v['folderName']))
111                                {
112                                        $details = $original['criteria']['deepness'] == '1' ? 'headers' : 'all';
113                                       
114                                        $imapService = new imap_functions();
115                                        $message = $imapService->getMessages(array('messages' => array($v['folderName'] => array($v['messageNumber'])), 'details' => $details));
116                                        $result[$i]['message'] = $message[$v['folderName']][0];                         
117                                }     
118                        }
119                }
120
121                return $result;
122        }       
123       
124        //followupflagged:PostgreSQL.before.create
125        public function letFollowupflaggedKeepUnique (&$uri , &$params , &$criteria , $original ){
126
127                if (isset($params['folderName']) && isset($params['messageNumber'])) {
128                        $filter = array ('AND', array('=', 'folderName', $params['folderName']), array('=', 'messageNumber', $params['messageNumber']));
129
130                        $imap_result = Controller::find(
131                                array('concept' => 'message'),
132                                array('messageId'),
133                                array('filter' => $filter)
134                        );
135
136                        if($imap_result) {
137                                $params['messageId'] = $imap_result[0]['messageId'];
138                        }
139                }
140
141                $filter = array('=', 'messageId', $params['messageId']);
142                Controller::delete(array('concept' => 'followupflagged', 'service' => 'PostgreSQL'), null, array('filter' => $filter));
143
144        }
145       
146        //followupflag:before.find
147        public function addDefaultElementsFilter (&$uri , &$params , &$criteria , $original ){
148                $log = fopen('/tmp/adriano.log', 'a') or die('Nao foi possivel abrir o arquivo /tmp/1.log\n');
149        fwrite($log, "uri = " . var_export($uri, true) . "\n");
150        fwrite($log, "params = " . var_export($params, true) . "\n");
151        fwrite($log, "criteria = " . var_export($criteria, true) . "\n");
152        fwrite($log, "original = " . var_export($original, true) . "\n");
153        fclose($log);   
154       
155                //if (!self::in_arrayr('id', $criteria['filter'])) {
156                        $defaultsFilter = array( 'IN' , 'id' , array('1','2','3','4','5','6') );
157
158                        if (isset($criteria['filter']) && $criteria['filter']!=NULL && count($criteria['filter']) != 0)
159                                $criteria['filter'] = array( 'OR', $criteria['filter'], $defaultsFilter );
160                        else
161                                $criteria['filter'] =  $defaultsFilter;
162                //}
163        }
164
165        //Remove as dependencias de uma followupflag
166        public function clearAllFlaggedOfFollowupflag( &$uri , &$params , &$criteria , $original ){
167                //remove apenas se vier o id da Followupflag
168                if(isset($uri['id'])) {
169                        $result = Controller::find(array('concept' => 'followupflagged'), null , array('filter' => array('=' , 'followupflagId' , $uri['id'])));
170                        foreach ($result as $flagged) {
171                                Controller::delete(array('concept' => 'followupflagged', 'id' => $flagged['id']), false, false);
172                        }
173
174                        Controller::deleteALL(array('concept' => 'followupflagged'), null , array('filter' => array('=' , 'followupflagId' , $uri['id'])));
175                }
176        }
177
178        //followupflagged:PostgreSQL.after.delete
179        public function doImapDelete( &$uri , &$params , &$criteria , $original ) {
180
181                $imap_uri = $uri;
182                $imap_uri['service'] = 'Imap';
183               
184                $result = Controller::delete($imap_uri, $params, $criteria);
185               
186                return $result;
187
188        }
189       
190        //followupflagged:Imap.before.delete
191        public function getReferenceToImapDelete( &$uri , &$params , &$criteria , $original ) {
192
193                if (isset($uri['service']) && $uri['service'] == 'Imap' && $uri['id'] /*&& !$criteria*/) {
194                        $db_uri = $uri;
195                        $db_uri['service'] = 'PostgreSQL';
196                        $flagged = Controller::read($db_uri, array('messageId'), false);
197                        if ($flagged) {
198                                if (!$criteria)
199                                        $criteria = array();
200                                $criteria['filter'] = array('=', 'messageId', $flagged['messageId']);
201                        } else {
202                                return false;
203                        }
204                }
205
206        }
207               
208        //followupflagged:PostgreSQL.before.create
209        public function doImapCreate( &$uri , &$params , &$criteria , $original ) {     
210       
211                $imap_uri = $uri;
212                $imap_uri['service'] = 'Imap';
213               
214                if(empty($params['messageId']))
215                    throw new Exception('#FollowupflagMessageIdError');
216                else
217                    $params = Controller::create($imap_uri, $params);
218
219                if (!$params)
220                    throw new Exception('#FollowupflagLimitError');
221        }
222       
223        //followupflagged:PostgreSQL.after.read
224        public function doImapRead( &$uri , &$result , &$criteria , $original ) {
225                /**
226                 * Se a busca for apenas no banco de dados, pula-se todas as verificações
227                 * deste interceptor.
228                 */
229               
230           
231           
232           
233                if ($original['URI']['service'] == 'PostgreSQL') return $result;
234               
235                if ($result) {
236                        $imap_uri = $uri;
237                        $imap_uri['service'] = 'Imap';
238                        $imap_result = Controller::find(
239                                $imap_uri,
240                                false,
241                                array('filter' => array('=', 'messageId', $result['messageId']))
242                        );
243                }
244
245                /**
246                 * Faz a consistência do banco com o imap
247                 */
248                if (count($imap_result) < 1) {
249                        $r = Controller::delete($uri, null, $criteria);
250                        return false;
251                } else {
252                        $imap_result = $imap_result[0];
253                }
254               
255                /**
256                 * Faz a consistência do banco com o imap
257                 */
258                if ($imap_result['messageId'] !== $result['messageId']) {
259                        $n = $imap_result;
260                        $n['followupflagId']  = 1;
261                        $n['backgroundColor'] = '#FF2016';
262                        $n['id'] = Controller::create(array('concept' => 'followupflagged'), $n);
263                        $result = $imap_result + $n;
264                }
265               
266                $result = $result + $imap_result;
267               
268                return $result;
269        }
270       
271       
272        /**
273         * Método a ser chamado ao listar os sinalizadores, uma vez que as funções de IMAP do PHP não são capazes de
274         * obter a lista de todos os sinalizadores e nem são capazes de obter os sinalizadores de uma dada mensagem
275         */
276        //followupflagged:PostgreSQL.after.find
277        public function doImapFind( &$uri , &$result , &$criteria , $original ){
278           
279                $imap_uri = $uri;
280                $imap_uri['service'] = 'Imap';
281                $imap_criteria = $original['criteria'];
282               
283                if (self::in_arrayr('alarmDeadline', $original['criteria']) ||
284                        self::in_arrayr('doneDeadline', $original['criteria']) ||
285                        self::in_arrayr('followupflagId', $original['criteria']))
286                {
287                        if (empty($result)) return $result;
288                       
289                        $idList = array();
290                        foreach($result as $r) {
291                                $idList[] = $r['messageId'];
292                        }
293                       
294                        $imap_criteria['filter'] = array('IN', 'messageId', $idList);
295                }
296                $imap_result = Controller::find($imap_uri, false, $imap_criteria);
297
298                $log = fopen('/tmp/adriano.log', 'a') or die('Nao foi possivel abrir o arquivo /tmp/1.log\n');
299        fwrite($log, "\n\n INTERCEPTORS ");
300                fwrite($log, "\n\n imap_result = " . var_export($imap_result, true) . "\n\n");
301        fclose($log);   
302               
303                /**
304                 * Mescla os dados vindos do PostgreSQL com os dados vindos do Imap
305                 */
306                $merge_result = array ();
307                if(is_array($imap_result))
308                foreach ($imap_result as $j => $ir) {
309               
310                        foreach($result as $k => $r) {
311                       
312                                if ($r['messageId'] == $ir['messageId']) {
313                                        if (!empty($r['messageId']))
314                                                $merge_result[] = $r + $ir;
315                                       
316                                        unset($result[$k]);
317                                        unset($imap_result[$j]);
318                                       
319                                        break;
320                                }
321                        }
322                }
323               
324                /**
325                 * Faz a consistência do banco com o imap
326                 */
327                /*
328                if ($result) {
329                        $idList = array();
330                        foreach ($result as $ir) {
331                                $idList[] = $ir['messageId'];
332                        }
333                        $filter = array('IN', 'messageId', $idList);
334                        Controller::delete(array('concept' => 'followupflagged'), null , array('filter' => $filter));
335                }
336                */
337               
338                /**
339                 * Faz a consistência do banco com o imap
340                 */
341                if ($imap_result) {
342                        foreach ($imap_result as $ir ) {
343                                $n = $ir;
344                                $n['followupflagId']  = 1;
345                                $n['backgroundColor'] = '#FF2016';
346                                $n['id'] = Controller::create(array('concept' => 'followupflagged'), $n);
347                                $merge_result[] = $n;
348                        }
349                }
350
351                $log = fopen('/tmp/adriano.log', 'a') or die('Nao foi possivel abrir o arquivo /tmp/1.log\n');
352        fwrite($log, "uri = " . var_export($uri, true) . "\n\n");
353        fwrite($log, "result = " . var_export($result, true) . "\n\n");
354        //fwrite($log, "criteria = " . var_export($criteria, true) . "\n\n");
355        //fwrite($log, "original = " . var_export($original, true) . "\n\n");
356        fwrite($log, "merge_result = " . var_export($merge_result, true) . "\n\n");
357        fclose($log);   
358               
359                return $merge_result;
360        }
361
362        //followupflagged:PostgreSQL.before.find
363        public function reFilterFind (&$uri , &$params , &$criteria , $original ){
364                /**
365                 * Se o filtro incluir atributos da mensagem que o banco de dados não conhece, 
366                 * deve-se obter os messageId dos itens do resultado e passá-los num novo filtro
367                 * que o banco conheça
368                 */
369               
370                $folder = isset($uri['folder']) ? $uri['folder'] : 'INBOX';
371
372                if (self::in_arrayr('messageNumber', $criteria) || self::in_arrayr('folderName', $criteria)) {
373                        $result = Controller::find(array('concept' => 'message' , 'folder' =>  $folder), array('messageId'), array('filter' => $criteria['filter']));
374                        $idList = array();
375                        if(is_array($result))
376                                foreach ($result as $message)
377                                        $idList[] = $message['messageId'];
378                               
379                        $filter = array( 'IN' , 'messageId' , $idList );
380
381                        $criteria['filter'] =  $filter;
382                }       
383        }       
384
385        //label:before.create
386        //label:before.update
387        public function verifyNameLabel(&$uri , &$params , &$criteria , $original){
388                        $labels = Controller::find( array('concept' => 'label'), false, array('filter' => array('i=', 'name', $params['name'])));
389
390                        if (!empty($labels)){
391                                foreach ($labels as $i => $v){
392                                        if(!isset($params['id']) || $v['id'] != $params['id']){
393                                                throw new Exception('#LabelNameError');
394                                        }
395                                }
396                        }
397        }
398
399        //label:before.create
400        public function validateNumberSlots(&$uri , &$params , &$criteria , $original){
401       
402                        $used = Controller::read( array( 'concept' => 'label', 'id' => '1' ), array( 'id' ), array( 'uid' => Config::me('uidNumber') ) );
403
404                        if( !isset( $used['id'] ) )
405                        {
406                                $params['id'] = '1';
407                                return;
408                        }
409
410                        $slot = Controller::service('PostgreSQL')->execSql( 'SELECT label.slot + 1 as id FROM expressomail_label as label, phpgw_config as config WHERE label.user_id = '.Config::me('uidNumber').' AND config.config_name = \'expressoMail_limit_labels\' AND label.slot <= config.config_value::integer AND ( SELECT count(slot) FROM expressomail_label WHERE slot = label.slot + 1 AND user_id = '.Config::me('uidNumber').' ) = 0 limit 1', true );
411
412                        if( empty( $slot ) )
413                        {
414                                throw new Exception('#LabelSlotError');
415                        }
416
417                        $params['id'] = $slot['id'];
418        }
419}
420
421?>
Note: See TracBrowser for help on using the repository browser.