Merge branch 'pu/2013.10-groupimport'
[tine20] / tine20 / Tinebase / Model / Import.php
1 <?php
2 /**
3  * Tine 2.0
4  * 
5  * @package     Tinebase
6  * @subpackage  Record
7  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
8  * @copyright   Copyright (c) 2014 Metaways Infosystems GmbH (http://www.metaways.de)
9  * @author      Michael Spahn <m.spahn@metaways.de
10  * 
11  */
12
13 /**
14  * class Tinebase_Model_Import
15  * 
16  * @package     Tinebase
17  * @subpackage  Record
18  */
19 class Tinebase_Model_Import extends Tinebase_Record_Abstract 
20 {
21     /**
22      * identifier field name
23      *
24      * @var string
25      */
26     protected $_identifier = 'id';
27     
28     /**
29      * application the record belongs to
30      *
31      * @var string
32      */
33     protected $_application = 'Tinebase';
34     
35     /**
36      * Type is uploaded file
37      */
38     const SOURCETYPE_UPLOAD = 'upload';
39     
40     /**
41      * Source is at remote
42      *  - http / https?
43      */
44     const SOURCETYPE_REMOTE = 'remote';
45     
46     /**
47      * Source is at the local filesystem
48      */
49     const SOURCETYPE_LOCAL = 'local';
50     
51     /**
52      * Sync daily
53      */
54     const INTERVAL_DAILY = 'daily';
55     
56     /**
57      * Sync minutely
58      */
59     const INTERVAL_WEEKLY = 'weekly';
60     
61     /**
62      * Sync hourly
63      */
64     const INTERVAL_HOURLY = 'hourly';
65     
66     /**
67      * Sync once
68      */
69     const INTERVAL_ONCE = 'once';
70     
71     /**
72      * record validators
73      * 
74      * @var array
75      */
76     protected $_validators = array(
77         'id'                    => array(Zend_Filter_Input::ALLOW_EMPTY => true, Zend_Filter_Input::DEFAULT_VALUE => NULL),
78         'timestamp'          => array('allowEmpty' => false),
79         'user_id'            => array('presence' => 'required'),
80         'model'              => array('presence' => 'required'),
81         'application_id'     => array('presence' => 'required'),
82         'synctoken'          => array('allowEmpty' => true),
83         'interval'           => array('allowEmpty' => false, array(
84             'InArray', array(Tinebase_Model_Import::INTERVAL_DAILY,
85                 Tinebase_Model_Import::INTERVAL_HOURLY,
86                 Tinebase_Model_Import::INTERVAL_ONCE,
87                 Tinebase_Model_Import::INTERVAL_WEEKLY)
88             )
89         ),
90         'container_id'       => array('presence' => 'required'),
91         'sourcetype'         => array('presence' => 'required'),
92         'options'            => array('allowEmpty' => true),
93         'source'             => array('allowEmpty' => true),
94         'created_by'         => array('allowEmpty' => true),
95         'creation_time'      => array('allowEmpty' => true),
96         'last_modified_by'   => array('allowEmpty' => true),
97         'last_modified_time' => array('allowEmpty' => true),
98         'is_deleted'         => array('allowEmpty' => true),
99         'deleted_time'       => array('allowEmpty' => true),
100         'deleted_by'         => array('allowEmpty' => true),
101         'seq'                => array('allowEmpty' => true),
102     );
103     
104     /**
105      * datetime fields
106      *
107      * @var array
108      */
109     protected $_datetimeFields = array(
110         'timestamp'
111     );
112
113     /**
114      * sets an option
115      * 
116      * @param string|array $_key
117      * @param scalar|array of scalar $_value
118      */
119     public function setOption($_key, $_value = null)
120     {
121         $options = $this->options ? Zend_Json::decode($this->options) : array();
122         
123         $_key = is_array($_key) ?: array($_key => $_value);
124         foreach ($_key as $key => $value) {
125             $options[$key] = $value;
126         }
127         
128         $this->options = Zend_Json::encode($options);
129     }
130     
131     /**
132      * gets an option
133      * 
134      * @param  string $_key
135      * @return scalar|array of scalar
136      */
137     public function getOption($_key)
138     {
139         $options = $this->options ? Zend_Json::decode($this->options) : array();
140         return isset($options[$_key]) ? $options[$_key] : NULL;
141     }
142     
143     /**
144      * sets the record related properties from user generated input.
145      *
146      * Input-filtering and validation by Zend_Filter_Input can enabled and disabled
147      *
148      * @param array $_data            the new data to set
149      * @throws Tinebase_Exception_Record_Validation when content contains invalid or missing data
150      *
151      * @todo remove custom fields handling (use Tinebase_Record_RecordSet for them)
152      */
153     public function setFromArray(array $_data)
154     {
155         parent::setFromArray($_data);
156         $now = Tinebase_DateTime::now();
157         
158         // set timestamp according to interval, if it is not set
159         if (! isset($_data['timestamp'])) {
160             switch ($_data['interval']) {
161                 case Tinebase_Model_Import::INTERVAL_DAILY:
162                     $now->subDay(1)->subSecond(1);
163                     break;
164                 case Tinebase_Model_Import::INTERVAL_WEEKLY:
165                     $now->subWeek(1)->subSecond(1);
166                     break;
167                 case Tinebase_Model_Import::INTERVAL_HOURLY:
168                     $now->subHour(1)->subSecond(1);
169                     break;
170                 default:
171             }
172             
173             $this->timestamp = $now;
174         }
175     }
176 }