123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296 |
- <?php
- /* Copyright (C) 2018 Destailleur Laurent <eldy@users.sourceforge.net>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- */
- /**
- * \file htdocs/dav/dav.class.php
- * \ingroup dav
- * \brief Server DAV
- */
- /**
- * Define Common function to access calendar items and format it in vCalendar
- */
- class CdavLib
- {
- private $db;
- private $user;
- private $langs;
- /**
- * Constructor
- *
- * @param User $user user
- * @param DoliDB $db Database handler
- * @param Translate $langs translation
- */
- public function __construct($user, $db, $langs)
- {
- $this->user = $user;
- $this->db = $db;
- $this->langs = $langs;
- }
- /**
- * Base sql request for calendar events
- *
- * @param int $calid Calendard id
- * @param int|boolean $oid Oid
- * @param int|boolean $ouri Ouri
- * @return string
- */
- public function getSqlCalEvents($calid, $oid = false, $ouri = false)
- {
- // TODO : replace GROUP_CONCAT by
- $sql = 'SELECT
- a.tms AS lastupd,
- a.*,
- sp.firstname,
- sp.lastname,
- sp.address,
- sp.zip,
- sp.town,
- co.label country_label,
- sp.phone,
- sp.phone_perso,
- sp.phone_mobile,
- s.nom AS soc_nom,
- s.address soc_address,
- s.zip soc_zip,
- s.town soc_town,
- cos.label soc_country_label,
- s.phone soc_phone,
- ac.sourceuid,
- (SELECT GROUP_CONCAT(u.login) FROM '.MAIN_DB_PREFIX.'actioncomm_resources ar
- LEFT OUTER JOIN '.MAIN_DB_PREFIX.'user AS u ON (u.rowid=fk_element)
- WHERE ar.element_type=\'user\' AND fk_actioncomm=a.id) AS other_users
- FROM '.MAIN_DB_PREFIX.'actioncomm AS a';
- if (!$this->user->rights->societe->client->voir) { //FIXME si 'voir' on voit plus de chose ?
- $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).')
- LEFT JOIN '.MAIN_DB_PREFIX.'societe AS s ON (s.rowid = sc.fk_soc)
- LEFT JOIN '.MAIN_DB_PREFIX.'socpeople AS sp ON (sp.fk_soc = sc.fk_soc AND sp.rowid = a.fk_contact)
- LEFT JOIN '.MAIN_DB_PREFIX.'actioncomm_cdav AS ac ON (a.id = ac.fk_object)';
- } else {
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'societe AS s ON (s.rowid = a.fk_soc)
- LEFT JOIN '.MAIN_DB_PREFIX.'socpeople AS sp ON (sp.rowid = a.fk_contact)
- LEFT JOIN '.MAIN_DB_PREFIX.'actioncomm_cdav AS ac ON (a.id = ac.fk_object)';
- }
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_country as co ON co.rowid = sp.fk_pays
- LEFT JOIN '.MAIN_DB_PREFIX.'c_country as cos ON cos.rowid = s.fk_pays
- 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).')
- AND a.code IN (SELECT cac.code FROM '.MAIN_DB_PREFIX.'c_actioncomm cac WHERE cac.type<>\'systemauto\')
- AND a.entity IN ('.getEntity('societe', 1).')';
- if ($oid !== false) {
- if ($ouri === false) {
- $sql .= ' AND a.id = '.intval($oid);
- } else {
- $sql .= ' AND (a.id = '.intval($oid).' OR ac.uuidext = \''.$this->db->escape($ouri).'\')';
- }
- }
- return $sql;
- }
- /**
- * Convert calendar row to VCalendar string
- *
- * @param int $calid Calendar id
- * @param Object $obj Object id
- * @return string
- */
- public function toVCalendar($calid, $obj)
- {
- /*$categ = array();
- if($obj->soc_client)
- {
- $nick[] = $obj->soc_code_client;
- $categ[] = $this->langs->transnoentitiesnoconv('Customer');
- }*/
- $location = $obj->location;
- // contact address
- if (empty($location) && !empty($obj->address)) {
- $location = trim(str_replace(array("\r", "\t", "\n"), ' ', $obj->address));
- $location = trim($location.', '.$obj->zip);
- $location = trim($location.' '.$obj->town);
- $location = trim($location.', '.$obj->country_label);
- }
- // contact address
- if (empty($location) && !empty($obj->soc_address)) {
- $location = trim(str_replace(array("\r", "\t", "\n"), ' ', $obj->soc_address));
- $location = trim($location.', '.$obj->soc_zip);
- $location = trim($location.' '.$obj->soc_town);
- $location = trim($location.', '.$obj->soc_country_label);
- }
- $address = explode("\n", $obj->address, 2);
- foreach ($address as $kAddr => $vAddr) {
- $address[$kAddr] = trim(str_replace(array("\r", "\t"), ' ', str_replace("\n", ' | ', trim($vAddr))));
- }
- $address[] = '';
- $address[] = '';
- if ($obj->percent == -1 && trim($obj->datep) != '') {
- $type = 'VEVENT';
- } else {
- $type = 'VTODO';
- }
- $timezone = date_default_timezone_get();
- $caldata = "BEGIN:VCALENDAR\n";
- $caldata .= "VERSION:2.0\n";
- $caldata .= "METHOD:PUBLISH\n";
- $caldata .= "PRODID:-//Dolibarr CDav//FR\n";
- $caldata .= "BEGIN:".$type."\n";
- $caldata .= "CREATED:".gmdate('Ymd\THis', strtotime($obj->datec))."Z\n";
- $caldata .= "LAST-MODIFIED:".gmdate('Ymd\THis', strtotime($obj->lastupd))."Z\n";
- $caldata .= "DTSTAMP:".gmdate('Ymd\THis', strtotime($obj->lastupd))."Z\n";
- if ($obj->sourceuid == '') {
- $caldata .= "UID:".$obj->id.'-ev-'.$calid.'-cal-'.constant('CDAV_URI_KEY')."\n";
- } else {
- $caldata .= "UID:".$obj->sourceuid."\n";
- }
- $caldata .= "SUMMARY:".$obj->label."\n";
- $caldata .= "LOCATION:".$location."\n";
- $caldata .= "PRIORITY:".$obj->priority."\n";
- if ($obj->fulldayevent) {
- $caldata .= "DTSTART;VALUE=DATE:".date('Ymd', strtotime($obj->datep))."\n";
- if ($type == 'VEVENT') {
- if (trim($obj->datep2) != '') {
- $caldata .= "DTEND;VALUE=DATE:".date('Ymd', strtotime($obj->datep2) + 1)."\n";
- } else {
- $caldata .= "DTEND;VALUE=DATE:".date('Ymd', strtotime($obj->datep) + (25 * 3600))."\n";
- }
- } elseif (trim($obj->datep2) != '') {
- $caldata .= "DUE;VALUE=DATE:".date('Ymd', strtotime($obj->datep2) + 1)."\n";
- }
- } else {
- $caldata .= "DTSTART;TZID=".$timezone.":".strtr($obj->datep, array(" "=>"T", ":"=>"", "-"=>""))."\n";
- if ($type == 'VEVENT') {
- if (trim($obj->datep2) != '') {
- $caldata .= "DTEND;TZID=".$timezone.":".strtr($obj->datep2, array(" "=>"T", ":"=>"", "-"=>""))."\n";
- } else {
- $caldata .= "DTEND;TZID=".$timezone.":".strtr($obj->datep, array(" "=>"T", ":"=>"", "-"=>""))."\n";
- }
- } elseif (trim($obj->datep2) != '') {
- $caldata .= "DUE;TZID=".$timezone.":".strtr($obj->datep2, array(" "=>"T", ":"=>"", "-"=>""))."\n";
- }
- }
- $caldata .= "CLASS:PUBLIC\n";
- if ($obj->transparency == 1) {
- $caldata .= "TRANSP:TRANSPARENT\n";
- } else {
- $caldata .= "TRANSP:OPAQUE\n";
- }
- if ($type == 'VEVENT') {
- $caldata .= "STATUS:CONFIRMED\n";
- } elseif ($obj->percent == 0) {
- $caldata .= "STATUS:NEEDS-ACTION\n";
- } elseif ($obj->percent == 100) {
- $caldata .= "STATUS:COMPLETED\n";
- } else {
- $caldata .= "STATUS:IN-PROCESS\n";
- $caldata .= "PERCENT-COMPLETE:".$obj->percent."\n";
- }
- $caldata .= "DESCRIPTION:";
- $caldata .= strtr($obj->note, array("\n"=>"\\n", "\r"=>""));
- if (!empty($obj->soc_nom)) {
- $caldata .= "\\n*DOLIBARR-SOC: ".$obj->soc_nom;
- }
- if (!empty($obj->soc_phone)) {
- $caldata .= "\\n*DOLIBARR-SOC-TEL: ".$obj->soc_phone;
- }
- if (!empty($obj->firstname) || !empty($obj->lastname)) {
- $caldata .= "\\n*DOLIBARR-CTC: ".trim($obj->firstname.' '.$obj->lastname);
- }
- if (!empty($obj->phone) || !empty($obj->phone_perso) || !empty($obj->phone_mobile)) {
- $caldata .= "\\n*DOLIBARR-CTC-TEL: ".trim($obj->phone.' '.$obj->phone_perso.' '.$obj->phone_mobile);
- }
- if (strpos($obj->other_users, ',')) { // several
- $caldata .= "\\n*DOLIBARR-USR: ".$obj->other_users;
- }
- $caldata .= "\n";
- $caldata .= "END:".$type."\n";
- $caldata .= "END:VCALENDAR\n";
- return $caldata;
- }
- /**
- * getFullCalendarObjects
- *
- * @param int $calendarId Calendar id
- * @param int $bCalendarData Add calendar data
- * @return array|string[][]
- */
- public function getFullCalendarObjects($calendarId, $bCalendarData)
- {
- $calid = ($calendarId * 1);
- $calevents = array();
- if (!$this->user->rights->agenda->myactions->read) {
- return $calevents;
- }
- if ($calid != $this->user->id && (!isset($this->user->rights->agenda->allactions->read) || !$this->user->rights->agenda->allactions->read)) {
- return $calevents;
- }
- $sql = $this->getSqlCalEvents($calid);
- $result = $this->db->query($sql);
- if ($result) {
- while ($obj = $this->db->fetch_object($result)) {
- $calendardata = $this->toVCalendar($calid, $obj);
- if ($bCalendarData) {
- $calevents[] = array(
- 'calendardata' => $calendardata,
- 'uri' => $obj->id.'-ev-'.constant('CDAV_URI_KEY'),
- 'lastmodified' => strtotime($obj->lastupd),
- 'etag' => '"'.md5($calendardata).'"',
- 'calendarid' => $calendarId,
- 'size' => strlen($calendardata),
- 'component' => strpos($calendardata, 'BEGIN:VEVENT') > 0 ? 'vevent' : 'vtodo',
- );
- } else {
- $calevents[] = array(
- // 'calendardata' => $calendardata, not necessary because etag+size are present
- 'uri' => $obj->id.'-ev-'.constant('CDAV_URI_KEY'),
- 'lastmodified' => strtotime($obj->lastupd),
- 'etag' => '"'.md5($calendardata).'"',
- 'calendarid' => $calendarId,
- 'size' => strlen($calendardata),
- 'component' => strpos($calendardata, 'BEGIN:VEVENT') > 0 ? 'vevent' : 'vtodo',
- );
- }
- }
- }
- return $calevents;
- }
- }
|