Current Path : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/dav/classes/general/ |
Current File : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/dav/classes/general/addressbookcrmbase.php |
<?php /** * Class CDavAddressbookCrmResource */ abstract class CDavAddressbookCrmBase extends CDavAddressbookBaseLimited { private $multiFieldEntityId; protected static $vCardValueTypeMap = array( 'pref' => 'HOME', 'work' => 'WORK', 'VOICE' => 'OTHER', 'PAGER' => 'PAGER', 'FAX' => 'FAX', 'MAIN' => 'MOBILE', ); /** * Handler for PUT request of DAV protocol * @param $id * @param CDavICalendarComponent $card * @return bool */ public function Put($id, $card) { //TODO: in future, when iOS client will have correct put functionality with groups, then there we can add crm entities from phone addressbook return parent::Put($id, $card); $entityParams = $this->PrepareEntityParamsFromVCard($id, $card); $photoProperty = $card->GetProperties('PHOTO'); if (!empty($photoProperty[0])) { $photo = $photoProperty[0]; } if (intval($id) && $oldEntity = $this->LoadEntityById($id)) { $multiFields = $this->LoadMultiFields($id); $oldEntityParams = $this->AttachMultiFieldsToEntityForImport($multiFields, $oldEntity); if (isset($photo)) $oldEntityParams = $this->AttachToEntityImgId($oldEntityParams, $photo->Value(), $photo->Parameter('TYPE')); $mergedEntityParams = $this->Merge($entityParams, $oldEntityParams); return $this->UpdateEntity($id, $mergedEntityParams); } else { if (isset($photo)) $entityParams = $this->AttachToEntityImgId($entityParams, $photo->Value(), $photo->Parameter('TYPE')); return $this->AddEntity($entityParams); } } /** * @param $id * @return array|bool|false|mixed|null */ abstract protected function LoadEntityById($id); /** * @param $entityParams * @param $fileContent * @param $fileExtension * @return mixed * @internal param $card */ abstract protected function AttachToEntityImgId($entityParams, $fileContent, $fileExtension); /** * @param $fields * @return bool|int */ abstract protected function AddEntity($fields); /** * @param $id * @param $fields * @return bool */ abstract protected function UpdateEntity($id, $fields); /** * @param $entityParams * @param $oldEntityParams * @return array */ abstract protected function Merge($entityParams, $oldEntityParams); /** * @param $content * @param $type * @return bool|int|string */ protected function SaveImg($content, $type) { $fileContent = base64_decode($content); if ($fileContent !== false && strlen($fileContent) > 0) { $fileName = CTempFile::GetFileName(substr(md5(mt_rand()), 0, 3) . '.' . $type); if (CheckDirPath($fileName)) { file_put_contents($fileName, $fileContent); $photo = CFile::MakeFileArray($fileName); $photo['MODULE_ID'] = 'crm'; $photo['del'] = 'Y'; return CFile::SaveFile($photo, 'crm'); } } return false; } /** * @return mixed */ protected function GetMultiFieldEntityId() { return $this->multiFieldEntityId; } /** * @param $id */ protected function SetMultiFieldEntityId($id) { $this->multiFieldEntityId = $id; } /** * Catalog getctag property for DAV protocol * @param $collectionId * @param array $filter * @return string getctag property */ public function GetCTag($collectionId, $filter = array()) { //@TODO: change ctag if change crm permissions, now crm permissions have not time tag, and it is now not possible. return parent::GetCTag($collectionId, $filter); } /** * Return entities array * @param $collectionId * @param $account * @param array $filter * @param $maxCount * @return mixed */ protected function LoadLimitedEntitiesList($collectionId, $account, $filter = array(), $maxCount) { $result = array(); $crmResourceEntitiesList = $this->LoadCrmResourceEntitiesList($collectionId, $account, $filter, $maxCount); while ($crmResourceEntity = $crmResourceEntitiesList->Fetch()) { $crmResourceEntityMultiFields = $this->LoadMultiFields($crmResourceEntity['ID']); $result[] = $this->AttachMultiFieldsToEntityForExport($crmResourceEntityMultiFields, $crmResourceEntity); } return $result; } /** * Add checking if user has access to CRM * @param $principal * @return bool */ protected function AdditionalPrivilegesCheck($principal) { return parent::AdditionalPrivilegesCheck($principal) && CCrmPerms::IsAccessEnabled(); } /** * Map: key=>value vCard properties of entity * @param $entity * @return mixed */ protected function GetVCardDataMap($entity) { $map = array(); if (!empty($entity["PHONE_MOBILE"])) { foreach ($entity["PHONE_MOBILE"] as $number) $map["TEL"][] = array( "VALUE" => $number, "PARAMETERS" => array("TYPE" => "CELL") ); } if (!empty($entity["PHONE_WORK"])) { foreach ($entity["PHONE_WORK"] as $number) $map["TEL"][] = array( "VALUE" => $number, "PARAMETERS" => array("TYPE" => "WORK") ); } if (!empty($entity["PHONE_FAX"])) { foreach ($entity["PHONE_FAX"] as $number) $map["TEL"][] = array( "VALUE" => $number, "PARAMETERS" => array("TYPE" => "FAX") ); } if (!empty($entity["PHONE_HOME"])) { foreach ($entity["PHONE_HOME"] as $number) $map["TEL"][] = array( "VALUE" => $number, "PARAMETERS" => array("TYPE" => "HOME") ); } if (!empty($entity["PHONE_PAGER"])) { foreach ($entity["PHONE_PAGER"] as $number) $map["TEL"][] = array( "VALUE" => $number, "PARAMETERS" => array("TYPE" => "PAGER") ); } if (!empty($entity["PHONE_OTHER"])) { foreach ($entity["PHONE_OTHER"] as $number) $map["TEL"][] = array( "VALUE" => $number, ); } if (!empty($entity["EMAIL_WORK"])) { foreach ($entity["EMAIL_WORK"] as $number) $map["EMAIL"][] = array( "VALUE" => $number, "PARAMETERS" => array("TYPE" => "WORK") ); } if (!empty($entity["EMAIL_HOME"])) { foreach ($entity["EMAIL_HOME"] as $number) $map["EMAIL"][] = array( "VALUE" => $number, "PARAMETERS" => array("TYPE" => "HOME") ); } if (!empty($entity["EMAIL_OTHER"])) { foreach ($entity["EMAIL_OTHER"] as $number) $map["EMAIL"][] = array( "VALUE" => $number, "PARAMETERS" => array("TYPE" => "INTERNET") ); } if (!empty($entity["WEB_HOME"])) { foreach ($entity["WEB_HOME"] as $url) $map["URL"][] = array( "VALUE" => $url, "PARAMETERS" => array("TYPE" => "HOME") ); } if (!empty($entity["WEB_WORK"])) { foreach ($entity["WEB_WORK"] as $url) $map["URL"][] = array( "VALUE" => $url, "PARAMETERS" => array("TYPE" => "WORK") ); } if (!empty($entity["WEB_OTHER"])) { foreach ($entity["WEB_OTHER"] as $url) $map["URL"][] = array( "VALUE" => $url, "PARAMETERS" => array("TYPE" => "OTHER") ); } if (!empty($entity["WEB_FACEBOOK"])) { foreach ($entity["WEB_FACEBOOK"] as $url) $map["URL"][] = array( "VALUE" => $url, "PARAMETERS" => array("TYPE" => "OTHER") ); } if (!empty($entity["WEB_VK"])) { foreach ($entity["WEB_VK"] as $url) $map["URL"][] = array( "VALUE" => $url, "PARAMETERS" => array("TYPE" => "OTHER") ); } if (!empty($entity["WEB_LIVEJOURNAL"])) { foreach ($entity["WEB_LIVEJOURNAL"] as $url) $map["URL"][] = array( "VALUE" => $url, "PARAMETERS" => array("TYPE" => "OTHER") ); } if (!empty($entity["WEB_TWITTER"])) { foreach ($entity["WEB_TWITTER"] as $url) $map["URL"][] = array( "VALUE" => $url, "PARAMETERS" => array("TYPE" => "OTHER") ); } return $map; } /** * @param $id * @param CDavICalendarComponent $card * @return array */ protected function PrepareEntityParamsFromVCard($id, $card) { $fields = parent::PrepareEntityParamsFromVCard($id, $card); $idProperty = $card->GetProperties('UID'); $fields['ID'] = $idProperty[0]->Value(); $telNumbersObjects = $card->GetProperties('TEL'); $i = 0; foreach ($telNumbersObjects as $numberObject) { $fields['FM']['PHONE']['n' . ++$i] = array( 'VALUE_TYPE' => !empty(self::$vCardValueTypeMap[$numberObject->Parameter('type')]) ? self::$vCardValueTypeMap[$numberObject->Parameter('type')] : 'OTHER', 'VALUE' => $numberObject->Value(), ); } $emailObjects = $card->GetProperties('EMAIL'); $i = 0; foreach ($emailObjects as $emailObject) { $fields['FM']['EMAIL']['n' . ++$i] = array( 'VALUE_TYPE' => !empty(self::$vCardValueTypeMap[$emailObject->Parameter('type')]) ? self::$vCardValueTypeMap[$emailObject->Parameter('type')] : 'OTHER', 'VALUE' => $emailObject->Value(), ); } return $fields; } /** * Date of last modification * @param $entity * @return string */ protected function EntityLastModifiedAt($entity) { return $entity['DATE_MODIFY']; } /** * Date of last modification of catalog = last modification of entities in this catalog * @param $collectionId * @param array $filter * @return string */ protected function CatalogLastModifiedAt($collectionId = '', $filter = array()) { if (!empty($filter['XML_ID'])) unset($filter['XML_ID']); $lastEditedEntity = $this->LoadCrmResourceEntitiesListByParams(array('DATE_MODIFY' => "DESC"), $filter, array('DATE_MODIFY'), 1); if ($entity = $lastEditedEntity->Fetch()) return $entity["DATE_MODIFY"]; return \Bitrix\Main\Type\Date::createFromTimestamp(0)->toString(); } /** * @param $collectionId * @param $account * @param array $filter * @param $maxCount * @return mixed */ abstract protected function LoadCrmResourceEntitiesList($collectionId, $account, $filter = array(), $maxCount); /** * @param $order * @param $filter * @param $selectParams * @param $maxCount * @return CDBResult */ abstract protected function LoadCrmResourceEntitiesListByParams($order, $filter, $selectParams = array(), $maxCount); /** * * @param $entityId * @return bool|CDBResult */ protected function LoadMultiFields($entityId) { return CCrmFieldMulti::GetList(array('ID' => 'asc'), array('ENTITY_ID' => $this->GetMultiFieldEntityId(), 'ELEMENT_ID' => $entityId)); } /** * Attach to entity multi fields for export with CardDAV * @param $multiFields CDBResult * @param $entity * @return array */ protected function AttachMultiFieldsToEntityForExport($multiFields, $entity) { while ($multiField = $multiFields->Fetch()) { $entity[$multiField['COMPLEX_ID']][] = $multiField['VALUE']; } return $entity; } /** * Attach to entity multi fields for import from VCard * @param $multiFields CDBResult * @param $entity * @return mixed */ protected function AttachMultiFieldsToEntityForImport($multiFields, $entity) { while ($multiField = $multiFields->Fetch()) { $entity['FM'][$multiField['TYPE_ID']][] = array( 'VALUE_TYPE' => $multiField['VALUE_TYPE'], 'VALUE' => $multiField['VALUE'], ); } return $entity; } }