2020-04-16 19:41:37 +00:00
/ *
*
* ( c ) Copyright Ascensio System Limited 2010 - 2018
*
* This program is freeware . You can redistribute it and / or modify it under the terms of the GNU
* General Public License ( GPL ) version 3 as published by the Free Software Foundation ( https : //www.gnu.org/copyleft/gpl.html).
* In accordance with Section 7 ( a ) of the GNU GPL its Section 15 shall be amended to the effect that
* Ascensio System SIA expressly excludes the warranty of non - infringement of any third - party rights .
*
* THIS PROGRAM IS DISTRIBUTED WITHOUT ANY WARRANTY ; WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR
* FITNESS FOR A PARTICULAR PURPOSE . For more details , see GNU GPL at https : //www.gnu.org/copyleft/gpl.html
*
* You can contact Ascensio System SIA by email at sales @onlyoffice . com
*
* The interactive user interfaces in modified source and object code versions of ONLYOFFICE must display
* Appropriate Legal Notices , as required under Section 5 of the GNU GPL version 3.
*
* Pursuant to Section 7 § 3 ( b ) of the GNU GPL you must retain the original ONLYOFFICE logo which contains
* relevant author attributions when distributing the software . If the display of the logo in its graphic
* form is not reasonably feasible for technical reasons , you must include the words "Powered by ONLYOFFICE"
* in every copy of the program you distribute .
* Pursuant to Section 7 § 3 ( e ) we decline to grant you any rights under trademark law for use of our trademarks .
*
* /
2020-04-18 17:49:09 +00:00
using ASC.Api.Core ;
2020-04-16 19:41:37 +00:00
using ASC.Api.CRM.Wrappers ;
2020-04-18 17:49:09 +00:00
using ASC.Api.Documents ;
2020-04-16 19:41:37 +00:00
using ASC.Common.Web ;
using ASC.CRM.Core ;
using ASC.CRM.Core.Entities ;
using ASC.CRM.Core.Enums ;
using ASC.MessagingSystem ;
using ASC.Web.Api.Routing ;
using ASC.Web.CRM.Services.NotifyService ;
using ASC.Web.Files.Classes ;
using ASC.Web.Files.Utils ;
2020-04-22 20:46:49 +00:00
using Microsoft.AspNetCore.Http ;
2020-04-16 19:41:37 +00:00
using System ;
using System.Collections ;
using System.Collections.Generic ;
using System.IO ;
using System.Linq ;
using System.Net.Mime ;
using System.Text ;
using System.Text.RegularExpressions ;
using OrderBy = ASC . CRM . Core . Entities . OrderBy ;
namespace ASC.Api.CRM
{
public partial class CRMController
{
/// <summary>
/// Returns the list of all events matching the parameters specified in the request
/// </summary>
/// <short>
/// Get event list
/// </short>
/// <category>History</category>
/// <param optional="true" name="entityType" remark="Allowed values: opportunity, contact or case">Related entity type</param>
/// <param optional="true" name="entityId">Related entity ID</param>
/// <param optional="true" name="categoryId">Task category ID</param>
/// <param optional="true" name="createBy">Event author</param>
/// <param optional="true" name="fromDate">Earliest task due date</param>
/// <param optional="true" name="toDate">Latest task due date</param>
/// <returns>
/// Event list
/// </returns>
[Read(@"history/filter")]
public IEnumerable < RelationshipEventWrapper > GetHistory (
string entityType ,
int entityId ,
int categoryId ,
Guid createBy ,
ApiDateTime fromDate ,
ApiDateTime toDate )
{
var entityTypeObj = ToEntityType ( entityType ) ;
switch ( entityTypeObj ) {
case EntityType . Contact :
var contact = DaoFactory . GetContactDao ( ) . GetByID ( entityId ) ;
if ( contact = = null | | ! CRMSecurity . CanAccessTo ( contact ) )
throw new ItemNotFoundException ( ) ;
break ;
case EntityType . Case :
var cases = DaoFactory . GetCasesDao ( ) . GetByID ( entityId ) ;
if ( cases = = null | | ! CRMSecurity . CanAccessTo ( cases ) )
throw new ItemNotFoundException ( ) ;
break ;
case EntityType . Opportunity :
var deal = DaoFactory . GetDealDao ( ) . GetByID ( entityId ) ;
if ( deal = = null | | ! CRMSecurity . CanAccessTo ( deal ) )
throw new ItemNotFoundException ( ) ;
break ;
default :
if ( entityId ! = 0 )
{
throw new ArgumentException ( ) ;
}
break ;
}
RelationshipEventByType eventByType ;
IEnumerable < RelationshipEventWrapper > result ;
OrderBy eventOrderBy ;
2020-04-18 17:49:09 +00:00
if ( ASC . CRM . Classes . EnumExtension . TryParse ( ApiContext . SortBy , true , out eventByType ) )
2020-04-16 19:41:37 +00:00
{
eventOrderBy = new OrderBy ( eventByType , ! ApiContext . SortDescending ) ;
}
else if ( string . IsNullOrEmpty ( ApiContext . SortBy ) )
{
eventOrderBy = new OrderBy ( RelationshipEventByType . Created , false ) ;
}
else
{
eventOrderBy = null ;
}
if ( eventOrderBy ! = null )
{
result = ToListRelationshipEventWrapper ( DaoFactory . GetRelationshipEventDao ( ) . GetItems (
ApiContext . FilterValue ,
entityTypeObj ,
entityId ,
createBy ,
categoryId ,
fromDate ,
toDate ,
( int ) ApiContext . StartIndex ,
( int ) ApiContext . Count ,
eventOrderBy ) ) ;
ApiContext . SetDataPaginated ( ) ;
ApiContext . SetDataFiltered ( ) ;
ApiContext . SetDataSorted ( ) ;
}
else
{
result = ToListRelationshipEventWrapper ( DaoFactory . GetRelationshipEventDao ( ) . GetItems (
ApiContext . FilterValue ,
entityTypeObj ,
entityId ,
createBy ,
categoryId ,
fromDate ,
toDate ,
0 ,
0 ,
null ) ) ;
}
2020-04-18 17:49:09 +00:00
return result ;
2020-04-16 19:41:37 +00:00
}
/// <summary>
/// Deletes the event with the ID specified in the request and all the files associated with this event
/// </summary>
/// <short>
/// Delete event and related files
/// </short>
/// <category>History</category>
/// <param name="id">Event ID</param>
/// <exception cref="ArgumentException"></exception>
/// <exception cref="ItemNotFoundException"></exception>
/// <returns>
/// Event
/// </returns>
[Delete(@"history/{id:int}")]
public RelationshipEventWrapper DeleteHistory ( int id )
{
if ( id < = 0 ) throw new ArgumentException ( ) ;
var item = DaoFactory . GetRelationshipEventDao ( ) . GetByID ( id ) ;
if ( item = = null ) throw new ItemNotFoundException ( ) ;
2020-04-18 17:49:09 +00:00
var wrapper = RelationshipEventWrapperHelper . Get ( item ) ;
2020-04-16 19:41:37 +00:00
DaoFactory . GetRelationshipEventDao ( ) . DeleteItem ( id ) ;
var messageAction = GetHistoryDeletedAction ( item . EntityType , item . ContactID ) ;
var entityTitle = wrapper . Contact = = null ? wrapper . Entity . EntityTitle : wrapper . Contact . DisplayName ;
MessageService . Send ( messageAction , MessageTarget . Create ( item . ID ) , entityTitle , wrapper . Category . Title ) ;
return wrapper ;
}
/// <summary>
/// Creates a text (.txt) file in the selected folder with the title and contents sent in the request
/// </summary>
/// <short>Create txt</short>
/// <category>Files</category>
/// <param name="entityType">Entity type</param>
/// <param name="entityid">Entity ID</param>
/// <param name="title">File title</param>
/// <param name="content">File contents</param>
/// <returns>
/// File info
/// </returns>
[Create(@"{entityType:(contact|opportunity|case)}/{entityid:int}/files/text")]
2020-04-18 17:49:09 +00:00
public FileWrapper < int > CreateTextFile ( string entityType , int entityid , string title , string content )
2020-04-16 19:41:37 +00:00
{
if ( title = = null ) throw new ArgumentNullException ( "title" ) ;
if ( content = = null ) throw new ArgumentNullException ( "content" ) ;
var folderid = GetRootFolderID ( ) ;
2020-04-18 17:49:09 +00:00
FileWrapper < int > result ;
2020-04-16 19:41:37 +00:00
var extension = ".txt" ;
if ( ! string . IsNullOrEmpty ( content ) )
{
if ( Regex . IsMatch ( content , @"<([^\s>]*)(\s[^<]*)>" ) )
{
extension = ".html" ;
}
}
using ( var memStream = new MemoryStream ( Encoding . UTF8 . GetBytes ( content ) ) )
{
title = title . EndsWith ( extension , StringComparison . OrdinalIgnoreCase ) ? title : ( title + extension ) ;
result = SaveFile ( folderid , memStream , title ) ;
}
AttachFiles ( entityType , entityid , new List < int > { ( int ) result . Id } ) ;
return result ;
}
2020-04-22 20:46:49 +00:00
/// <summary>
/// Upload file
/// </summary>
/// <short>Upload file</short>
/// <category>Files</category>
/// <remarks>
/// <![CDATA[
/// Upload can be done in 2 different ways:
/// <ol>
/// <li>Single file upload. You should set Content-Type & Content-Disposition header to specify filename and content type, and send file in request body</li>
/// <li>Using standart multipart/form-data method</li>
/// </ol>]]>
/// </remarks>
/// <param name="entityType">Entity type</param>
/// <param name="entityid">Entity ID</param>
/// <param name="file" visible="false">Request Input stream</param>
/// <param name="contentType" visible="false">Content-Type Header</param>
/// <param name="contentDisposition" visible="false">Content-Disposition Header</param>
/// <param name="files" visible="false">List of files when posted as multipart/form-data</param>
/// <param name="storeOriginalFileFlag" visible="false">If True, upload documents in original formats as well</param>
/// <returns>
/// File info
/// </returns>
[Create(@"{entityType:(contact|opportunity|case)}/{entityid:int}/files/upload")]
public FileWrapper < int > UploadFileInCRM (
string entityType ,
int entityid ,
Stream file ,
ContentType contentType ,
ContentDisposition contentDisposition ,
IEnumerable < IFormFile > files ,
bool storeOriginalFileFlag
)
{
FilesSettings . StoreOriginalFilesSetting = storeOriginalFileFlag ;
var folderid = GetRootFolderID ( ) ;
var fileNames = new List < string > ( ) ;
FileWrapper < int > uploadedFile = null ;
if ( files ! = null & & files . Any ( ) )
{
//For case with multiple files
foreach ( var postedFile in files )
{
using var fileStream = postedFile . OpenReadStream ( ) ;
uploadedFile = SaveFile ( folderid , fileStream , postedFile . FileName ) ;
fileNames . Add ( uploadedFile . Title ) ;
}
}
else if ( file ! = null )
{
uploadedFile = SaveFile ( folderid , file , contentDisposition . FileName ) ;
fileNames . Add ( uploadedFile . Title ) ;
}
return uploadedFile ;
}
2020-04-18 17:49:09 +00:00
private FileWrapper < int > SaveFile ( int folderid , Stream file , string fileName )
2020-04-16 19:41:37 +00:00
{
2020-04-18 17:49:09 +00:00
var resultFile = FileUploader . Exec < int > ( folderid , fileName , file . Length , file ) ;
2020-04-16 19:41:37 +00:00
2020-04-18 17:49:09 +00:00
return FileWrapperHelper . Get < int > ( resultFile ) ;
2020-04-16 19:41:37 +00:00
}
/// <summary>
/// Creates the event with the parameters specified in the request
/// </summary>
/// <short>
/// Create event
/// </short>
/// <category>History</category>
/// <param optional="true" name="contactId">Contact ID</param>
/// <param optional="true" name="entityType" remark="Allowed values: opportunity or case">Related entity type</param>
/// <param optional="true" name="entityId">Related entity ID</param>
/// <remarks>
/// <![CDATA[
/// You should obligatorily set the value for 'contactId' if 'entityId' is not set or the value for parameters 'entityId' and 'entityType' if 'contactId' is not set.
/// ]]>
/// </remarks>
/// <param optional="false" name="content">Contents</param>
/// <param optional="false" name="categoryId">Category ID</param>
/// <param optional="true" name="created">Event creation date</param>
/// <param optional="true" name="fileId">List of IDs of the files associated with the event</param>
/// <param optional="true" name="notifyUserList">User field list</param>
/// <returns>
/// Created event
/// </returns>
[Create(@"history")]
public RelationshipEventWrapper AddHistoryTo (
string entityType ,
int entityId ,
int contactId ,
string content ,
int categoryId ,
ApiDateTime created ,
IEnumerable < int > fileId ,
IEnumerable < Guid > notifyUserList )
{
if ( ! string . IsNullOrEmpty ( entityType ) & &
! (
string . Compare ( entityType , "opportunity" , StringComparison . OrdinalIgnoreCase ) = = 0 | |
string . Compare ( entityType , "case" , StringComparison . OrdinalIgnoreCase ) = = 0 )
)
throw new ArgumentException ( ) ;
var entityTypeObj = ToEntityType ( entityType ) ;
var entityTitle = "" ;
if ( contactId > 0 ) {
var contact = DaoFactory . GetContactDao ( ) . GetByID ( contactId ) ;
if ( contact = = null | | ! CRMSecurity . CanAccessTo ( contact ) )
throw new ArgumentException ( ) ;
entityTitle = contact . GetTitle ( ) ;
}
if ( entityTypeObj = = EntityType . Case ) {
var cases = DaoFactory . GetCasesDao ( ) . GetByID ( entityId ) ;
if ( cases = = null | | ! CRMSecurity . CanAccessTo ( cases ) )
throw new ArgumentException ( ) ;
if ( contactId < = 0 )
{
entityTitle = cases . Title ;
}
}
if ( entityTypeObj = = EntityType . Opportunity )
{
var deal = DaoFactory . GetDealDao ( ) . GetByID ( entityId ) ;
if ( deal = = null | | ! CRMSecurity . CanAccessTo ( deal ) )
throw new ArgumentException ( ) ;
if ( contactId < = 0 )
{
entityTitle = deal . Title ;
}
}
var relationshipEvent = new RelationshipEvent
{
CategoryID = categoryId ,
EntityType = entityTypeObj ,
EntityID = entityId ,
Content = content ,
ContactID = contactId ,
CreateOn = created ,
2020-04-18 17:49:09 +00:00
CreateBy = SecurityContext . CurrentAccount . ID
2020-04-16 19:41:37 +00:00
} ;
var category = DaoFactory . GetListItemDao ( ) . GetByID ( categoryId ) ;
if ( category = = null ) throw new ArgumentException ( ) ;
var item = DaoFactory . GetRelationshipEventDao ( ) . CreateItem ( relationshipEvent ) ;
notifyUserList = notifyUserList ! = null ? notifyUserList . ToList ( ) : new List < Guid > ( ) ;
var needNotify = notifyUserList . Any ( ) ;
var fileListInfoHashtable = new Hashtable ( ) ;
if ( fileId ! = null )
{
var fileIds = fileId . ToList ( ) ;
2020-04-18 17:49:09 +00:00
var files = FilesDaoFactory . GetFileDao < int > ( ) . GetFiles ( fileIds . ToArray ( ) ) ;
2020-04-16 19:41:37 +00:00
if ( needNotify )
{
foreach ( var file in files )
{
var extension = Path . GetExtension ( file . Title ) ;
if ( extension = = null ) continue ;
var fileInfo = string . Format ( "{0} ({1})" , file . Title , extension . ToUpper ( ) ) ;
if ( ! fileListInfoHashtable . ContainsKey ( fileInfo ) )
{
fileListInfoHashtable . Add ( fileInfo , file . DownloadUrl ) ;
}
else
{
fileInfo = string . Format ( "{0} ({1}, {2})" , file . Title , extension . ToUpper ( ) , file . UniqID ) ;
fileListInfoHashtable . Add ( fileInfo , file . DownloadUrl ) ;
}
}
}
DaoFactory . GetRelationshipEventDao ( ) . AttachFiles ( item . ID , fileIds . ToArray ( ) ) ;
if ( files . Any ( ) )
{
var fileAttachAction = GetFilesAttachAction ( entityTypeObj , contactId ) ;
MessageService . Send ( fileAttachAction , MessageTarget . Create ( item . ID ) , entityTitle , files . Select ( x = > x . Title ) ) ;
}
}
if ( needNotify )
{
NotifyClient . SendAboutAddRelationshipEventAdd ( item , fileListInfoHashtable , DaoFactory , notifyUserList . ToArray ( ) ) ;
}
2020-04-18 17:49:09 +00:00
var wrapper = RelationshipEventWrapperHelper . Get ( item ) ;
2020-04-16 19:41:37 +00:00
var historyCreatedAction = GetHistoryCreatedAction ( entityTypeObj , contactId ) ;
MessageService . Send ( historyCreatedAction , MessageTarget . Create ( item . ID ) , entityTitle , category . Title ) ;
return wrapper ;
}
/// <summary>
/// Associates the selected file(s) with the entity with the ID or type specified in the request
/// </summary>
/// <short>
/// Associate file with entity
/// </short>
/// <param name="entityType">Entity type</param>
/// <param name="entityid">Entity ID</param>
/// <param name="fileids">List of IDs of the files</param>
/// <category>Files</category>
/// <returns>Entity with the file attached</returns>
[Create(@"{entityType:(contact|opportunity|case)}/{entityid:int}/files")]
public RelationshipEventWrapper AttachFiles ( string entityType , int entityid , IEnumerable < int > fileids )
{
if ( entityid < = 0 | | fileids = = null ) throw new ArgumentException ( ) ;
2020-04-18 17:49:09 +00:00
var files = FilesDaoFactory . GetFileDao < int > ( ) . GetFiles ( fileids . ToArray ( ) ) ;
2020-04-16 19:41:37 +00:00
var folderid = GetRootFolderID ( ) ;
if ( files . Exists ( file = > file . FolderID . ToString ( ) ! = folderid . ToString ( ) ) )
throw new ArgumentException ( "invalid file folder" ) ;
var entityTypeObj = ToEntityType ( entityType ) ;
DomainObject entityObj ;
var entityTitle = GetEntityTitle ( entityTypeObj , entityid , true , out entityObj ) ;
switch ( entityTypeObj )
{
case EntityType . Contact :
var relationshipEvent1 = DaoFactory . GetRelationshipEventDao ( ) . AttachFiles ( entityid , EntityType . Any , 0 , fileids . ToArray ( ) ) ;
var messageAction = entityObj is Company ? MessageAction . CompanyAttachedFiles : MessageAction . PersonAttachedFiles ;
MessageService . Send ( messageAction , MessageTarget . Create ( entityid ) , entityTitle , files . Select ( x = > x . Title ) ) ;
2020-04-18 17:49:09 +00:00
return RelationshipEventWrapperHelper . Get ( relationshipEvent1 ) ;
2020-04-16 19:41:37 +00:00
case EntityType . Opportunity :
var relationshipEvent2 = DaoFactory . GetRelationshipEventDao ( ) . AttachFiles ( 0 , entityTypeObj , entityid , fileids . ToArray ( ) ) ;
MessageService . Send ( MessageAction . OpportunityAttachedFiles , MessageTarget . Create ( entityid ) , entityTitle , files . Select ( x = > x . Title ) ) ;
2020-04-18 17:49:09 +00:00
return RelationshipEventWrapperHelper . Get ( relationshipEvent2 ) ;
2020-04-16 19:41:37 +00:00
case EntityType . Case :
var relationshipEvent3 = DaoFactory . GetRelationshipEventDao ( ) . AttachFiles ( 0 , entityTypeObj , entityid , fileids . ToArray ( ) ) ;
MessageService . Send ( MessageAction . CaseAttachedFiles , MessageTarget . Create ( entityid ) , entityTitle , files . Select ( x = > x . Title ) ) ;
2020-04-18 17:49:09 +00:00
return RelationshipEventWrapperHelper . Get ( relationshipEvent3 ) ;
2020-04-16 19:41:37 +00:00
default :
throw new ArgumentException ( ) ;
}
}
/// <summary>
/// Returns the ID for the root folder used to store the files for the CRM module
/// </summary>
/// <short>Get root folder ID</short>
/// <category>Files</category>
/// <returns>
/// Root folder ID
/// </returns>
[Read(@"files/root")]
2020-04-18 17:49:09 +00:00
public int GetRootFolderID ( )
2020-04-16 19:41:37 +00:00
{
return DaoFactory . GetFileDao ( ) . GetRoot ( ) ;
}
/// <summary>
/// Returns the list of all files for the entity with the ID or type specified in the request
/// </summary>
/// <param name="entityType">Entity type</param>
/// <param name="entityid">Entity ID</param>
/// <short>Get file list</short>
/// <category>Files</category>
/// <returns>
/// File list
/// </returns>
[Read(@"{entityType:(contact|opportunity|case)}/{entityid:int}/files")]
2020-04-18 17:49:09 +00:00
public IEnumerable < FileWrapper < int > > GetFiles ( string entityType , int entityid )
2020-04-16 19:41:37 +00:00
{
if ( entityid < = 0 ) throw new ArgumentException ( ) ;
var entityTypeObj = ToEntityType ( entityType ) ;
switch ( entityTypeObj )
{
case EntityType . Contact :
2020-04-18 17:49:09 +00:00
return DaoFactory . GetRelationshipEventDao ( ) . GetAllFiles ( new [ ] { entityid } , EntityType . Any , 0 ) . ConvertAll ( file = > FileWrapperHelper . Get < int > ( file ) ) ;
2020-04-16 19:41:37 +00:00
case EntityType . Opportunity :
case EntityType . Case :
2020-04-18 17:49:09 +00:00
return DaoFactory . GetRelationshipEventDao ( ) . GetAllFiles ( null , entityTypeObj , entityid ) . ConvertAll ( file = > FileWrapperHelper . Get < int > ( file ) ) ;
2020-04-16 19:41:37 +00:00
default :
throw new ArgumentException ( ) ;
}
}
/// <summary>
/// Deletes the file with the ID specified in the request
/// </summary>
/// <short>Delete file</short>
/// <category>Files</category>
/// <param name="fileid">File ID</param>
/// <exception cref="ArgumentException"></exception>
/// <exception cref="ItemNotFoundException"></exception>
/// <returns>
/// File Info
/// </returns>
[Delete(@"files/{fileid:int}")]
2020-04-18 17:49:09 +00:00
public FileWrapper < int > DeleteCRMFile ( int fileid )
2020-04-16 19:41:37 +00:00
{
if ( fileid < 0 ) throw new ArgumentException ( ) ;
2020-04-18 17:49:09 +00:00
var file = FilesDaoFactory . GetFileDao < int > ( ) . GetFile ( fileid ) ;
2020-04-16 19:41:37 +00:00
if ( file = = null ) throw new ItemNotFoundException ( ) ;
2020-04-18 17:49:09 +00:00
var result = FileWrapperHelper . Get < int > ( file ) ;
2020-04-16 19:41:37 +00:00
var _eventsDao = DaoFactory . GetRelationshipEventDao ( ) ;
var eventIDs = _eventsDao . RemoveFile ( file ) ;
var events = new List < RelationshipEvent > ( ) ;
eventIDs . ForEach ( id = > events . Add ( _eventsDao . GetByID ( id ) ) ) ;
foreach ( var evt in events )
{
DomainObject entityObj ;
var entityTitle = evt . ContactID > 0
? GetEntityTitle ( EntityType . Contact , evt . ContactID , false , out entityObj )
: GetEntityTitle ( evt . EntityType , evt . EntityID , false , out entityObj ) ;
var messageAction = GetFilesDetachAction ( evt . EntityType , evt . ContactID ) ;
MessageService . Send ( messageAction , MessageTarget . Create ( file . ID ) , entityTitle , file . Title ) ;
}
return result ;
}
private IEnumerable < RelationshipEventWrapper > ToListRelationshipEventWrapper ( List < RelationshipEvent > itemList )
{
if ( itemList . Count = = 0 ) return new List < RelationshipEventWrapper > ( ) ;
var result = new List < RelationshipEventWrapper > ( ) ;
var contactIDs = new List < int > ( ) ;
var eventIDs = new List < int > ( ) ;
var categoryIDs = new List < int > ( ) ;
var entityWrappersIDs = new Dictionary < EntityType , List < int > > ( ) ;
foreach ( var item in itemList )
{
eventIDs . Add ( item . ID ) ;
if ( ! categoryIDs . Contains ( item . CategoryID ) )
{
categoryIDs . Add ( item . CategoryID ) ;
}
if ( item . ContactID > 0 & & ! contactIDs . Contains ( item . ContactID ) )
{
contactIDs . Add ( item . ContactID ) ;
}
if ( item . EntityID < = 0 ) continue ;
if ( ! entityWrappersIDs . ContainsKey ( item . EntityType ) )
{
entityWrappersIDs . Add ( item . EntityType , new List < int >
{
item . EntityID
} ) ;
}
else if ( ! entityWrappersIDs [ item . EntityType ] . Contains ( item . EntityID ) )
{
entityWrappersIDs [ item . EntityType ] . Add ( item . EntityID ) ;
}
}
var entityWrappers = new Dictionary < string , EntityWrapper > ( ) ;
foreach ( var entityType in entityWrappersIDs . Keys )
{
switch ( entityType )
{
case EntityType . Opportunity :
DaoFactory . GetDealDao ( ) . GetDeals ( entityWrappersIDs [ entityType ] . Distinct ( ) . ToArray ( ) )
. ForEach ( item = >
{
if ( item = = null ) return ;
entityWrappers . Add (
string . Format ( "{0}_{1}" , ( int ) entityType , item . ID ) ,
new EntityWrapper
{
EntityId = item . ID ,
EntityTitle = item . Title ,
EntityType = "opportunity"
} ) ;
} ) ;
break ;
case EntityType . Case :
DaoFactory . GetCasesDao ( ) . GetByID ( entityWrappersIDs [ entityType ] . ToArray ( ) )
. ForEach ( item = >
{
if ( item = = null ) return ;
entityWrappers . Add (
string . Format ( "{0}_{1}" , ( int ) entityType , item . ID ) ,
new EntityWrapper
{
EntityId = item . ID ,
EntityTitle = item . Title ,
EntityType = "case"
} ) ;
} ) ;
break ;
default :
throw new ArgumentException ( ) ;
}
}
var categories = DaoFactory . GetListItemDao ( ) . GetItems ( categoryIDs . ToArray ( ) ) . ToDictionary ( x = > x . ID , x = > new HistoryCategoryBaseWrapper ( x ) ) ;
var files = DaoFactory . GetRelationshipEventDao ( ) . GetFiles ( eventIDs . ToArray ( ) ) ;
2020-04-22 20:46:49 +00:00
var contacts = DaoFactory . GetContactDao ( ) . GetContacts ( contactIDs . ToArray ( ) ) . ToDictionary ( item = > item . ID , x = > ContactWrapperHelper . GetContactBaseWrapper ( x ) ) ;
2020-04-16 19:41:37 +00:00
foreach ( var item in itemList )
{
2020-04-18 17:49:09 +00:00
var eventObjWrap = RelationshipEventWrapperHelper . Get ( item ) ;
2020-04-16 19:41:37 +00:00
if ( contacts . ContainsKey ( item . ContactID ) )
{
eventObjWrap . Contact = contacts [ item . ContactID ] ;
}
if ( item . EntityID > 0 )
{
var entityStrKey = string . Format ( "{0}_{1}" , ( int ) item . EntityType , item . EntityID ) ;
if ( entityWrappers . ContainsKey ( entityStrKey ) )
{
eventObjWrap . Entity = entityWrappers [ entityStrKey ] ;
}
}
2020-04-18 17:49:09 +00:00
eventObjWrap . Files = files . ContainsKey ( item . ID ) ? files [ item . ID ] . ConvertAll ( file = >
FileWrapperHelper . Get < int > ( file ) ) : new List < FileWrapper < int > > ( ) ;
2020-04-16 19:41:37 +00:00
if ( categories . ContainsKey ( item . CategoryID ) )
{
eventObjWrap . Category = categories [ item . CategoryID ] ;
}
result . Add ( eventObjWrap ) ;
}
return result ;
}
private EntityWrapper ToEntityWrapper ( EntityType entityType , int entityID )
{
if ( entityID = = 0 ) return null ;
var result = new EntityWrapper
{
EntityId = entityID
} ;
switch ( entityType )
{
case EntityType . Case :
var caseObj = DaoFactory . GetCasesDao ( ) . GetByID ( entityID ) ;
if ( caseObj = = null )
return null ;
result . EntityType = "case" ;
result . EntityTitle = caseObj . Title ;
break ;
case EntityType . Opportunity :
var dealObj = DaoFactory . GetDealDao ( ) . GetByID ( entityID ) ;
2020-04-22 20:46:49 +00:00
2020-04-16 19:41:37 +00:00
if ( dealObj = = null )
return null ;
result . EntityType = "opportunity" ;
result . EntityTitle = dealObj . Title ;
break ;
default :
return null ;
}
return result ;
}
private MessageAction GetHistoryCreatedAction ( EntityType entityType , int contactId )
{
if ( contactId > 0 )
{
var contact = DaoFactory . GetContactDao ( ) . GetByID ( contactId ) ;
return contact is Company ? MessageAction . CompanyCreatedHistoryEvent : MessageAction . PersonCreatedHistoryEvent ;
}
switch ( entityType )
{
case EntityType . Opportunity :
return MessageAction . OpportunityCreatedHistoryEvent ;
case EntityType . Case :
return MessageAction . CaseCreatedHistoryEvent ;
case EntityType . Any :
var contact = DaoFactory . GetContactDao ( ) . GetByID ( contactId ) ;
return contact is Company ? MessageAction . CompanyCreatedHistoryEvent : MessageAction . PersonCreatedHistoryEvent ;
default :
throw new ArgumentException ( "Invalid entityType: " + entityType ) ;
}
}
private MessageAction GetHistoryDeletedAction ( EntityType entityType , int contactId )
{
if ( contactId > 0 )
{
var contact = DaoFactory . GetContactDao ( ) . GetByID ( contactId ) ;
return contact is Company ? MessageAction . CompanyDeletedHistoryEvent : MessageAction . PersonDeletedHistoryEvent ;
}
switch ( entityType )
{
case EntityType . Opportunity :
return MessageAction . OpportunityDeletedHistoryEvent ;
case EntityType . Case :
return MessageAction . CaseDeletedHistoryEvent ;
case EntityType . Any :
var contact = DaoFactory . GetContactDao ( ) . GetByID ( contactId ) ;
return contact is Company ? MessageAction . CompanyDeletedHistoryEvent : MessageAction . PersonDeletedHistoryEvent ;
default :
throw new ArgumentException ( "Invalid entityType: " + entityType ) ;
}
}
private MessageAction GetFilesAttachAction ( EntityType entityType , int contactId )
{
if ( contactId > 0 )
{
var contact = DaoFactory . GetContactDao ( ) . GetByID ( contactId ) ;
return contact is Company ? MessageAction . CompanyAttachedFiles : MessageAction . PersonAttachedFiles ;
}
switch ( entityType )
{
case EntityType . Opportunity :
return MessageAction . OpportunityAttachedFiles ;
case EntityType . Case :
return MessageAction . CaseAttachedFiles ;
case EntityType . Any :
var contact = DaoFactory . GetContactDao ( ) . GetByID ( contactId ) ;
return contact is Company ? MessageAction . CompanyAttachedFiles : MessageAction . PersonAttachedFiles ;
default :
throw new ArgumentException ( "Invalid entityType: " + entityType ) ;
}
}
private MessageAction GetFilesDetachAction ( EntityType entityType , int contactId )
{
if ( contactId > 0 )
{
var contact = DaoFactory . GetContactDao ( ) . GetByID ( contactId ) ;
return contact is Company ? MessageAction . CompanyDetachedFile : MessageAction . PersonDetachedFile ;
}
switch ( entityType )
{
case EntityType . Opportunity :
return MessageAction . OpportunityDetachedFile ;
case EntityType . Case :
return MessageAction . CaseDetachedFile ;
case EntityType . Any :
var contact = DaoFactory . GetContactDao ( ) . GetByID ( contactId ) ;
return contact is Company ? MessageAction . CompanyDetachedFile : MessageAction . PersonAttachedFiles ;
default :
throw new ArgumentException ( "Invalid entityType: " + entityType ) ;
}
}
}
}