1: | <?php |
2: | |
3: | |
4: | |
5: | |
6: | |
7: | |
8: | namespace Aurora\Modules\Contacts\Models; |
9: | |
10: | use Aurora\System\Classes\Model; |
11: | use Aurora\Modules\Contacts\Classes\VCard\Helper; |
12: | use Aurora\Modules\Contacts\Enums\StorageType; |
13: | use Aurora\Modules\Contacts\Models\Group; |
14: | use Aurora\Modules\Core\Models\User; |
15: | use Aurora\System\EventEmitter; |
16: | |
17: | class Contact extends Model |
18: | { |
19: | public $GroupsContacts = array(); |
20: | |
21: | public $ExtendedInformation = array(); |
22: | |
23: | protected $foreignModel = User::class; |
24: | protected $foreignModelIdColumn = 'IdUser'; |
25: | |
26: | protected $fillable = [ |
27: | 'Id', |
28: | 'UUID', |
29: | 'IdUser', |
30: | 'IdTenant', |
31: | 'Storage', |
32: | 'AddressBookId', |
33: | 'FullName', |
34: | 'UseFriendlyName', |
35: | 'PrimaryEmail', |
36: | 'PrimaryPhone', |
37: | 'PrimaryAddress', |
38: | 'ViewEmail', |
39: | |
40: | 'Title', |
41: | 'FirstName', |
42: | 'LastName', |
43: | 'NickName', |
44: | 'Skype', |
45: | 'Facebook', |
46: | |
47: | 'PersonalEmail', |
48: | 'PersonalAddress', |
49: | 'PersonalCity', |
50: | 'PersonalState', |
51: | 'PersonalZip', |
52: | 'PersonalCountry', |
53: | 'PersonalWeb', |
54: | 'PersonalFax', |
55: | 'PersonalPhone', |
56: | 'PersonalMobile', |
57: | |
58: | 'BusinessEmail', |
59: | 'BusinessCompany', |
60: | 'BusinessAddress', |
61: | 'BusinessCity', |
62: | 'BusinessState', |
63: | 'BusinessZip', |
64: | 'BusinessCountry', |
65: | 'BusinessJobTitle', |
66: | 'BusinessDepartment', |
67: | 'BusinessOffice', |
68: | 'BusinessPhone', |
69: | 'BusinessFax', |
70: | 'BusinessWeb', |
71: | |
72: | 'OtherEmail', |
73: | 'Notes', |
74: | |
75: | 'BirthDay', |
76: | 'BirthMonth', |
77: | 'BirthYear', |
78: | |
79: | 'ETag', |
80: | 'Auto', |
81: | 'Frequency', |
82: | 'DateModified', |
83: | 'Properties' |
84: | ]; |
85: | |
86: | protected $casts = [ |
87: | 'Properties' => 'array', |
88: | 'Auto' => 'boolean', |
89: | 'UseFriendlyName' => 'boolean' |
90: | ]; |
91: | |
92: | protected $appends = [ |
93: | 'AgeScore' |
94: | ]; |
95: | |
96: | public function getAgeScoreAttribute() |
97: | { |
98: | return 0; |
99: | } |
100: | |
101: | public function getNotesAttribute() |
102: | { |
103: | if (is_null($this->attributes['Notes'])) { |
104: | $this->attributes['Notes'] = ''; |
105: | } |
106: | |
107: | return $this->attributes['Notes']; |
108: | } |
109: | |
110: | |
111: | |
112: | |
113: | |
114: | protected function addGroupsFromNames($aGroupNames) |
115: | { |
116: | $aNonExistingGroups = []; |
117: | if (is_array($aGroupNames) && count($aGroupNames) > 0) { |
118: | $oContactsDecorator = \Aurora\Modules\Contacts\Module::Decorator(); |
119: | $oApiContactsManager = $oContactsDecorator ? $oContactsDecorator->GetApiContactsManager() : null; |
120: | if ($oApiContactsManager) { |
121: | foreach ($aGroupNames as $sGroupName) { |
122: | $oGroups = $oApiContactsManager->getGroups($this->IdUser, Group::firstWhere('Name', $sGroupName)); |
123: | if ($oGroups && count($oGroups) > 0) { |
124: | $this->Groups()->sync( |
125: | $oGroups->map(function ($oGroup) { |
126: | return $oGroup->Id; |
127: | })->toArray(), |
128: | false |
129: | ); |
130: | } |
131: | |
132: | |
133: | |
134: | |
135: | elseif (!empty($sGroupName)) { |
136: | $oGroup = new Group(); |
137: | $oGroup->IdUser = $this->IdUser; |
138: | $oGroup->Name = $sGroupName; |
139: | $aNonExistingGroups[] = $oGroup; |
140: | } |
141: | } |
142: | } |
143: | } |
144: | |
145: | return $aNonExistingGroups; |
146: | } |
147: | |
148: | |
149: | |
150: | |
151: | |
152: | public function addGroups($aGroupUUIDs, $aGroupNames, $bCreateNonExistingGroups = false) |
153: | { |
154: | if (isset($aGroupUUIDs) && is_array($aGroupUUIDs)) { |
155: | $this->Groups()->sync(Group::whereIn('UUID', $aGroupUUIDs) |
156: | ->get()->map( |
157: | function ($oGroup) { |
158: | return $oGroup->Id; |
159: | } |
160: | )->toArray()); |
161: | } |
162: | $aNonExistingGroups = []; |
163: | if (isset($aGroupNames)) { |
164: | $aNonExistingGroups = $this->addGroupsFromNames($aGroupNames); |
165: | } |
166: | |
167: | if ($bCreateNonExistingGroups && is_array($aNonExistingGroups) && count($aNonExistingGroups) > 0) { |
168: | $oContactsDecorator = \Aurora\Modules\Contacts\Module::Decorator(); |
169: | $oApiContactsManager = $oContactsDecorator ? $oContactsDecorator->GetApiContactsManager() : null; |
170: | if ($oApiContactsManager) { |
171: | $oContactsDecorator = \Aurora\Modules\Contacts\Module::Decorator(); |
172: | $oApiContactsManager = $oContactsDecorator ? $oContactsDecorator->GetApiContactsManager() : null; |
173: | if ($oApiContactsManager) { |
174: | $aGroupIds = []; |
175: | foreach ($aNonExistingGroups as $oGroup) { |
176: | $oApiContactsManager->createGroup($oGroup); |
177: | $aGroupIds[] = $oGroup->Id; |
178: | } |
179: | if (count($aGroupIds) > 0) { |
180: | $this->Groups()->sync($aGroupIds, false); |
181: | } |
182: | } |
183: | } |
184: | } |
185: | } |
186: | |
187: | |
188: | |
189: | |
190: | |
191: | protected function getViewEmail() |
192: | { |
193: | switch ((int) $this->PrimaryEmail) { |
194: | default: |
195: | case \Aurora\Modules\Contacts\Enums\PrimaryEmail::Personal: |
196: | return (string) $this->PersonalEmail; |
197: | case \Aurora\Modules\Contacts\Enums\PrimaryEmail::Business: |
198: | return (string) $this->BusinessEmail; |
199: | case \Aurora\Modules\Contacts\Enums\PrimaryEmail::Other: |
200: | return (string) $this->OtherEmail; |
201: | } |
202: | } |
203: | |
204: | |
205: | |
206: | |
207: | public function SetViewEmail() |
208: | { |
209: | $this->ViewEmail = $this->getViewEmail(); |
210: | } |
211: | |
212: | |
213: | |
214: | |
215: | |
216: | |
217: | |
218: | public function InitFromVCardStr($iUserId, $sData, $sUid = '') |
219: | { |
220: | $oUser = \Aurora\Modules\Core\Module::Decorator()->GetUserUnchecked($iUserId); |
221: | if ($oUser instanceof \Aurora\Modules\Core\Models\User) { |
222: | $this->IdUser = $oUser->Id; |
223: | $this->IdTenant = $oUser->IdTenant; |
224: | } |
225: | |
226: | if (!empty($sUid)) { |
227: | $this->UUID = $sUid; |
228: | } |
229: | |
230: | $this->populate( |
231: | Helper::GetContactDataFromVcard( |
232: | \Sabre\VObject\Reader::read( |
233: | $sData, |
234: | \Sabre\VObject\Reader::OPTION_IGNORE_INVALID_LINES |
235: | ) |
236: | ) |
237: | ); |
238: | } |
239: | |
240: | |
241: | |
242: | |
243: | |
244: | public function populate($aContact, $bCreateNonExistingGroups = false) |
245: | { |
246: | $aNonExistingGroups = []; |
247: | $aStorageParts = \explode('-', $aContact['Storage']); |
248: | if (isset($aStorageParts[0]) && $aStorageParts[0] === StorageType::AddressBook) { |
249: | $aContact['AddressBookId'] = (int) $aStorageParts[1]; |
250: | $aContact['Storage'] = StorageType::AddressBook; |
251: | } |
252: | parent::populate($aContact); |
253: | |
254: | if (!empty($aContact['UUID'])) { |
255: | $this->UUID = $aContact['UUID']; |
256: | } elseif (empty($this->UUID)) { |
257: | $this->UUID = \Sabre\DAV\UUIDUtil::getUUID(); |
258: | } |
259: | $this->SetViewEmail(); |
260: | |
261: | EventEmitter::getInstance()->emit('Contacts', 'PopulateContactModel', $this); |
262: | } |
263: | |
264: | |
265: | |
266: | |
267: | |
268: | |
269: | public function toResponseArray() |
270: | { |
271: | |
272: | |
273: | $aRes = parent::toResponseArray(); |
274: | if (is_null($aRes['Notes'])) { |
275: | $aRes['Notes'] = ''; |
276: | } |
277: | $aRes['GroupUUIDs'] = $this->Groups->map(function ($oGroup) { |
278: | return $oGroup->UUID; |
279: | }); |
280: | |
281: | foreach ($this->ExtendedInformation as $sKey => $mValue) { |
282: | $aRes[$sKey] = $mValue; |
283: | } |
284: | |
285: | $aArgs = ['Contact' => $this]; |
286: | \Aurora\System\Api::GetModule('Core')->broadcastEvent( |
287: | 'Contacts::Contact::ToResponseArray', |
288: | $aArgs, |
289: | $aRes |
290: | ); |
291: | |
292: | return $aRes; |
293: | } |
294: | |
295: | public function calculateETag() |
296: | { |
297: | $this->ETag = \md5(\json_encode($this)); |
298: | } |
299: | |
300: | public function Groups() |
301: | { |
302: | return $this->belongsToMany(Group::class, 'contacts_group_contact', 'ContactId', 'GroupId'); |
303: | } |
304: | |
305: | public function getStorageWithId() |
306: | { |
307: | if ($this->Storage === StorageType::AddressBook) { |
308: | return $this->Storage . $this->AddressBookId; |
309: | } else { |
310: | return $this->Storage; |
311: | } |
312: | } |
313: | } |
314: | |