Passed
Branch develop (72ff6f)
by
unknown
83:09
created

CdavLib::toVCalendar()   F

Complexity

Conditions 27
Paths > 20000

Size

Total Lines 124
Code Lines 79

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 27
eloc 79
nop 2
dl 0
loc 124
rs 0
c 0
b 0
f 0
nc 32768

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/* Copyright (C) 2018	Destailleur Laurent	<[email protected]>
3
 *
4
 * This program is free software; you can redistribute it and/or modify
5
 * it under the terms of the GNU General Public License as published by
6
 * the Free Software Foundation; either version 3 of the License, or
7
 * (at your option) any later version.
8
 *
9
 * This program is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 * GNU General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU General Public License
15
 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16
 */
17
18
/**
19
 *      \file       htdocs/dav/dav.class.php
20
 *      \ingroup    dav
21
 *      \brief      Server DAV
22
 */
23
24
25
/**
26
 * Define Common function to access calendar items and format it in vCalendar
27
 */
28
class CdavLib
29
{
30
31
	private $db;
32
33
	private $user;
34
35
	private $langs;
36
37
	/**
38
	 * Constructor
39
	 *
40
	 * @param   User        $user   user
41
	 * @param   DoliDB      $db     Database handler
42
	 * @param   Translate   $langs  translation
43
	 */
44
	public function __construct($user, $db, $langs)
45
	{
46
		$this->user = $user;
47
		$this->db = $db;
48
		$this->langs = $langs;
49
	}
50
51
	/**
52
	 * Base sql request for calendar events
53
	 *
54
	 * @param 	int 		$calid 			Calendard id
55
	 * @param 	int|boolean	$oid			Oid
56
	 * @param	int|boolean	$ouri			Ouri
57
	 * @return string
58
	 */
59
	public function getSqlCalEvents($calid, $oid = false, $ouri = false)
60
	{
61
		// TODO : replace GROUP_CONCAT by
62
		$sql = 'SELECT
63
					a.tms AS lastupd,
64
					a.*,
65
					sp.firstname,
66
					sp.lastname,
67
					sp.address,
68
					sp.zip,
69
					sp.town,
70
					co.label country_label,
71
					sp.phone,
72
					sp.phone_perso,
73
					sp.phone_mobile,
74
					s.nom AS soc_nom,
75
					s.address soc_address,
76
					s.zip soc_zip,
77
					s.town soc_town,
78
					cos.label soc_country_label,
79
					s.phone soc_phone,
80
					ac.sourceuid,
81
					(SELECT GROUP_CONCAT(u.login) FROM '.MAIN_DB_PREFIX.'actioncomm_resources ar
82
						LEFT OUTER JOIN '.MAIN_DB_PREFIX.'user AS u ON (u.rowid=fk_element)
83
						WHERE ar.element_type=\'user\' AND fk_actioncomm=a.id) AS other_users
84
				FROM '.MAIN_DB_PREFIX.'actioncomm AS a';
85
		if (!$this->user->rights->societe->client->voir) { //FIXME si 'voir' on voit plus de chose ?
86
			$sql .= ' LEFT OUTER JOIN '.MAIN_DB_PREFIX.'societe_commerciaux AS sc ON (a.fk_soc = sc.fk_soc AND sc.fk_user='.((int) $this->user->id).')
87
					LEFT JOIN '.MAIN_DB_PREFIX.'societe AS s ON (s.rowid = sc.fk_soc)
88
					LEFT JOIN '.MAIN_DB_PREFIX.'socpeople AS sp ON (sp.fk_soc = sc.fk_soc AND sp.rowid = a.fk_contact)
89
					LEFT JOIN '.MAIN_DB_PREFIX.'actioncomm_cdav AS ac ON (a.id = ac.fk_object)';
90
		} else {
91
			$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'societe AS s ON (s.rowid = a.fk_soc)
92
					LEFT JOIN '.MAIN_DB_PREFIX.'socpeople AS sp ON (sp.rowid = a.fk_contact)
93
					LEFT JOIN '.MAIN_DB_PREFIX.'actioncomm_cdav AS ac ON (a.id = ac.fk_object)';
94
		}
95
96
		$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_country as co ON co.rowid = sp.fk_pays
97
				LEFT JOIN '.MAIN_DB_PREFIX.'c_country as cos ON cos.rowid = s.fk_pays
98
				WHERE 	a.id IN (SELECT ar.fk_actioncomm FROM '.MAIN_DB_PREFIX.'actioncomm_resources ar WHERE ar.element_type=\'user\' AND ar.fk_element='.((int) $calid).')
99
						AND a.code IN (SELECT cac.code FROM '.MAIN_DB_PREFIX.'c_actioncomm cac WHERE cac.type<>\'systemauto\')
100
						AND a.entity IN ('.getEntity('societe', 1).')';
101
		if ($oid !== false) {
102
			if ($ouri === false) {
103
				$sql .= ' AND a.id = '.intval($oid);
104
			} else {
105
				$sql .= ' AND (a.id = '.intval($oid).' OR ac.uuidext = \''.$this->db->escape($ouri).'\')';
106
			}
107
		}
108
109
		return $sql;
110
	}
111
112
	/**
113
	 * Convert calendar row to VCalendar string
114
	 *
115
	 * @param 	int		$calid		Calendar id
116
	 * @param	Object	$obj		Object id
117
	 * @return string
118
	 */
119
	public function toVCalendar($calid, $obj)
120
	{
121
		/*$categ = array();
122
		if($obj->soc_client)
123
		{
124
			$nick[] = $obj->soc_code_client;
125
			$categ[] = $this->langs->transnoentitiesnoconv('Customer');
126
		}*/
127
128
		$location = $obj->location;
129
130
		// contact address
131
		if (empty($location) && !empty($obj->address)) {
132
			$location = trim(str_replace(array("\r", "\t", "\n"), ' ', $obj->address));
133
			$location = trim($location.', '.$obj->zip);
134
			$location = trim($location.' '.$obj->town);
135
			$location = trim($location.', '.$obj->country_label);
136
		}
137
138
		// contact address
139
		if (empty($location) && !empty($obj->soc_address)) {
140
			$location = trim(str_replace(array("\r", "\t", "\n"), ' ', $obj->soc_address));
141
			$location = trim($location.', '.$obj->soc_zip);
142
			$location = trim($location.' '.$obj->soc_town);
143
			$location = trim($location.', '.$obj->soc_country_label);
144
		}
145
146
		/*
147
		$address = explode("\n", $obj->address, 2);
148
		foreach ($address as $kAddr => $vAddr) {
149
			$address[$kAddr] = trim(str_replace(array("\r", "\t"), ' ', str_replace("\n", ' | ', trim($vAddr))));
150
		}
151
		$address[] = '';
152
		$address[] = '';
153
		*/
154
155
		if ($obj->percent == -1 && trim($obj->datep) != '') {
156
			$type = 'VEVENT';
157
		} else {
158
			$type = 'VTODO';
159
		}
160
161
		$timezone = date_default_timezone_get();
162
163
		$caldata = "BEGIN:VCALENDAR\n";
164
		$caldata .= "VERSION:2.0\n";
165
		$caldata .= "METHOD:PUBLISH\n";
166
		$caldata .= "PRODID:-//Dolibarr CDav//FR\n";
167
		$caldata .= "BEGIN:".$type."\n";
168
		$caldata .= "CREATED:".gmdate('Ymd\THis', strtotime($obj->datec))."Z\n";
169
		$caldata .= "LAST-MODIFIED:".gmdate('Ymd\THis', strtotime($obj->lastupd))."Z\n";
170
		$caldata .= "DTSTAMP:".gmdate('Ymd\THis', strtotime($obj->lastupd))."Z\n";
171
		if ($obj->sourceuid == '') {
172
			$caldata .= "UID:".$obj->id.'-ev-'.$calid.'-cal-'.constant('CDAV_URI_KEY')."\n";
173
		} else {
174
			$caldata .= "UID:".$obj->sourceuid."\n";
175
		}
176
		$caldata .= "SUMMARY:".$obj->label."\n";
177
		$caldata .= "LOCATION:".$location."\n";
178
		$caldata .= "PRIORITY:".$obj->priority."\n";
179
		if ($obj->fulldayevent) {
180
			$caldata .= "DTSTART;VALUE=DATE:".date('Ymd', strtotime($obj->datep))."\n";
181
			if ($type == 'VEVENT') {
182
				if (trim($obj->datep2) != '') {
183
					$caldata .= "DTEND;VALUE=DATE:".date('Ymd', strtotime($obj->datep2) + 1)."\n";
184
				} else {
185
					$caldata .= "DTEND;VALUE=DATE:".date('Ymd', strtotime($obj->datep) + (25 * 3600))."\n";
186
				}
187
			} elseif (trim($obj->datep2) != '') {
188
				$caldata .= "DUE;VALUE=DATE:".date('Ymd', strtotime($obj->datep2) + 1)."\n";
189
			}
190
		} else {
191
			$caldata .= "DTSTART;TZID=".$timezone.":".strtr($obj->datep, array(" "=>"T", ":"=>"", "-"=>""))."\n";
192
			if ($type == 'VEVENT') {
193
				if (trim($obj->datep2) != '') {
194
					$caldata .= "DTEND;TZID=".$timezone.":".strtr($obj->datep2, array(" "=>"T", ":"=>"", "-"=>""))."\n";
195
				} else {
196
					$caldata .= "DTEND;TZID=".$timezone.":".strtr($obj->datep, array(" "=>"T", ":"=>"", "-"=>""))."\n";
197
				}
198
			} elseif (trim($obj->datep2) != '') {
199
				$caldata .= "DUE;TZID=".$timezone.":".strtr($obj->datep2, array(" "=>"T", ":"=>"", "-"=>""))."\n";
200
			}
201
		}
202
		$caldata .= "CLASS:PUBLIC\n";
203
		if ($obj->transparency == 1) {
204
			$caldata .= "TRANSP:TRANSPARENT\n";
205
		} else {
206
			$caldata .= "TRANSP:OPAQUE\n";
207
		}
208
209
		if ($type == 'VEVENT') {
210
			$caldata .= "STATUS:CONFIRMED\n";
211
		} elseif ($obj->percent == 0) {
212
			$caldata .= "STATUS:NEEDS-ACTION\n";
213
		} elseif ($obj->percent == 100) {
214
			$caldata .= "STATUS:COMPLETED\n";
215
		} else {
216
			$caldata .= "STATUS:IN-PROCESS\n";
217
			$caldata .= "PERCENT-COMPLETE:".$obj->percent."\n";
218
		}
219
220
		$caldata .= "DESCRIPTION:";
221
		$caldata .= strtr($obj->note, array("\n"=>"\\n", "\r"=>""));
222
		if (!empty($obj->soc_nom)) {
223
			$caldata .= "\\n*DOLIBARR-SOC: ".$obj->soc_nom;
224
		}
225
		if (!empty($obj->soc_phone)) {
226
			$caldata .= "\\n*DOLIBARR-SOC-TEL: ".$obj->soc_phone;
227
		}
228
		if (!empty($obj->firstname) || !empty($obj->lastname)) {
229
			$caldata .= "\\n*DOLIBARR-CTC: ".trim($obj->firstname.' '.$obj->lastname);
230
		}
231
		if (!empty($obj->phone) || !empty($obj->phone_perso) || !empty($obj->phone_mobile)) {
232
			$caldata .= "\\n*DOLIBARR-CTC-TEL: ".trim($obj->phone.' '.$obj->phone_perso.' '.$obj->phone_mobile);
233
		}
234
		if (strpos($obj->other_users, ',')) { // several
235
			$caldata .= "\\n*DOLIBARR-USR: ".$obj->other_users;
236
		}
237
		$caldata .= "\n";
238
239
		$caldata .= "END:".$type."\n";
240
		$caldata .= "END:VCALENDAR\n";
241
242
		return $caldata;
243
	}
244
245
	/**
246
	 * getFullCalendarObjects
247
	 *
248
	 * @param int	 	$calendarId			Calendar id
249
	 * @param int		$bCalendarData		Add calendar data
250
	 * @return array|string[][]
251
	 */
252
	public function getFullCalendarObjects($calendarId, $bCalendarData)
253
	{
254
		$calid = ($calendarId * 1);
255
		$calevents = array();
256
257
		if (!$this->user->rights->agenda->myactions->read) {
258
			return $calevents;
259
		}
260
261
		if ($calid != $this->user->id && (!isset($this->user->rights->agenda->allactions->read) || !$this->user->rights->agenda->allactions->read)) {
262
			return $calevents;
263
		}
264
265
		$sql = $this->getSqlCalEvents($calid);
266
267
		$result = $this->db->query($sql);
268
269
		if ($result) {
270
			while ($obj = $this->db->fetch_object($result)) {
271
				$calendardata = $this->toVCalendar($calid, $obj);
272
273
				if ($bCalendarData) {
274
					$calevents[] = array(
275
						'calendardata' => $calendardata,
276
						'uri' => $obj->id.'-ev-'.constant('CDAV_URI_KEY'),
277
						'lastmodified' => strtotime($obj->lastupd),
278
						'etag' => '"'.md5($calendardata).'"',
279
						'calendarid'   => $calendarId,
280
						'size' => strlen($calendardata),
281
						'component' => strpos($calendardata, 'BEGIN:VEVENT') > 0 ? 'vevent' : 'vtodo',
282
					);
283
				} else {
284
					$calevents[] = array(
285
						// 'calendardata' => $calendardata,  not necessary because etag+size are present
286
						'uri' => $obj->id.'-ev-'.constant('CDAV_URI_KEY'),
287
						'lastmodified' => strtotime($obj->lastupd),
288
						'etag' => '"'.md5($calendardata).'"',
289
						'calendarid'   => $calendarId,
290
						'size' => strlen($calendardata),
291
						'component' => strpos($calendardata, 'BEGIN:VEVENT') > 0 ? 'vevent' : 'vtodo',
292
					);
293
				}
294
			}
295
		}
296
		return $calevents;
297
	}
298
}
299