620 lines
21 KiB
C#
620 lines
21 KiB
C#
/*
|
|
*
|
|
* (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.
|
|
*
|
|
*/
|
|
|
|
|
|
using ASC.Api.Core;
|
|
using ASC.Common;
|
|
using ASC.CRM.Classes;
|
|
using ASC.CRM.Core;
|
|
using ASC.CRM.Core.Entities;
|
|
using ASC.CRM.Core.Enums;
|
|
using ASC.Web.Api.Models;
|
|
using ASC.Web.CRM;
|
|
using ASC.Web.CRM.Classes;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Runtime.Serialization;
|
|
using Contact = ASC.CRM.Core.Entities.Contact;
|
|
|
|
namespace ASC.Api.CRM.Wrappers
|
|
{
|
|
/// <summary>
|
|
/// Person
|
|
/// </summary>
|
|
[DataContract(Name = "person", Namespace = "")]
|
|
public class PersonWrapper : ContactWrapper
|
|
{
|
|
public PersonWrapper()
|
|
{
|
|
|
|
}
|
|
|
|
public static PersonWrapper ToPersonWrapperQuick(Person person)
|
|
{
|
|
var result = new PersonWrapper(person.ID);
|
|
|
|
result.DisplayName = person.GetTitle();
|
|
result.IsPrivate = CRMSecurity.IsPrivate(person);
|
|
result.IsShared = person.ShareType == ShareType.ReadWrite || person.ShareType == ShareType.Read;
|
|
result.ShareType = person.ShareType;
|
|
|
|
if (result.IsPrivate)
|
|
{
|
|
result.AccessList = CRMSecurity.GetAccessSubjectTo(person)
|
|
.Select(item => EmployeeWraper.Get(item.Key));
|
|
}
|
|
result.Currency = !String.IsNullOrEmpty(person.Currency) ?
|
|
new CurrencyInfoWrapper(CurrencyProvider.Get(person.Currency)) :
|
|
null;
|
|
|
|
result.SmallFotoUrl = String.Format("{0}HttpHandlers/filehandler.ashx?action=contactphotoulr&cid={1}&isc={2}&ps=1", PathProvider.BaseAbsolutePath, person.ID, false).ToLower();
|
|
result.MediumFotoUrl = String.Format("{0}HttpHandlers/filehandler.ashx?action=contactphotoulr&cid={1}&isc={2}&ps=2", PathProvider.BaseAbsolutePath, person.ID, false).ToLower();
|
|
result.IsCompany = false;
|
|
result.CanEdit = CRMSecurity.CanEdit(person);
|
|
//result.CanDelete = CRMSecurity.CanDelete(contact);
|
|
|
|
result.CreateBy = EmployeeWraper.Get(person.CreateBy);
|
|
result.Created = (ApiDateTime)person.CreateOn;
|
|
result.About = person.About;
|
|
result.Industry = person.Industry;
|
|
|
|
|
|
result.FirstName = person.FirstName;
|
|
result.LastName = person.LastName;
|
|
result.Title = person.JobTitle;
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
[DataMember(IsRequired = true, EmitDefaultValue = false)]
|
|
public String FirstName { get; set; }
|
|
|
|
[DataMember(IsRequired = true, EmitDefaultValue = false)]
|
|
public String LastName { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public ContactBaseWrapper Company { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public String Title { get; set; }
|
|
|
|
public new static PersonWrapper GetSample()
|
|
{
|
|
return new PersonWrapper(0)
|
|
{
|
|
IsPrivate = true,
|
|
IsShared = false,
|
|
IsCompany = false,
|
|
FirstName = "Tadjeddine",
|
|
LastName = "Bachir",
|
|
Company = CompanyWrapper.GetSample(),
|
|
Title = "Programmer",
|
|
About = "",
|
|
Created = ApiDateTime.GetSample(),
|
|
CreateBy = EmployeeWraper.GetSample(),
|
|
ShareType = ShareType.None
|
|
};
|
|
}
|
|
}
|
|
|
|
|
|
public class PersonWrapperHelper
|
|
{
|
|
public PersonWrapperHelper()
|
|
{
|
|
}
|
|
|
|
public PersonWrapper Get(Person person)
|
|
{
|
|
|
|
FirstName = person.FirstName;
|
|
LastName = person.LastName;
|
|
Title = person.JobTitle;
|
|
|
|
|
|
return new PersonWrapper
|
|
{
|
|
FirstName = person.FirstName,
|
|
LastName = person.LastName,
|
|
Title = person.JobTitle
|
|
};
|
|
}
|
|
}
|
|
|
|
public static class PersonWrapperHelperHelperExtension
|
|
{
|
|
public static DIHelper AddPersonWrapperHelperService(this DIHelper services)
|
|
{
|
|
services.TryAddTransient<PersonWrapperHelper>();
|
|
|
|
return services;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// Company
|
|
/// </summary>
|
|
[DataContract(Name = "company", Namespace = "")]
|
|
public class CompanyWrapper : ContactWrapper
|
|
{
|
|
public CompanyWrapper(int id) :
|
|
base(id)
|
|
{
|
|
}
|
|
|
|
public CompanyWrapper(Company company)
|
|
: base(company)
|
|
{
|
|
CompanyName = company.CompanyName;
|
|
// PersonsCount = Global.DaoFactory.ContactDao.GetMembersCount(company.ID);
|
|
}
|
|
|
|
|
|
public static CompanyWrapper ToCompanyWrapperQuick(Company company)
|
|
{
|
|
var result = new CompanyWrapper(company.ID);
|
|
|
|
result.DisplayName = company.GetTitle();
|
|
result.IsPrivate = CRMSecurity.IsPrivate(company);
|
|
result.IsShared = company.ShareType == ShareType.ReadWrite || company.ShareType == ShareType.Read;
|
|
result.ShareType = company.ShareType;
|
|
|
|
if (result.IsPrivate)
|
|
{
|
|
result.AccessList = CRMSecurity.GetAccessSubjectTo(company)
|
|
.Select(item => EmployeeWraper.Get(item.Key));
|
|
}
|
|
result.Currency = !String.IsNullOrEmpty(company.Currency) ?
|
|
new CurrencyInfoWrapper(CurrencyProvider.Get(company.Currency)) :
|
|
null;
|
|
|
|
result.SmallFotoUrl = String.Format("{0}HttpHandlers/filehandler.ashx?action=contactphotoulr&cid={1}&isc={2}&ps=1", PathProvider.BaseAbsolutePath, company.ID, true).ToLower();
|
|
result.MediumFotoUrl = String.Format("{0}HttpHandlers/filehandler.ashx?action=contactphotoulr&cid={1}&isc={2}&ps=2", PathProvider.BaseAbsolutePath, company.ID, true).ToLower();
|
|
result.IsCompany = true;
|
|
result.CanEdit = CRMSecurity.CanEdit(company);
|
|
//result.CanDelete = CRMSecurity.CanDelete(contact);
|
|
|
|
|
|
result.CompanyName = company.CompanyName;
|
|
|
|
result.CreateBy = EmployeeWraper.Get(company.CreateBy);
|
|
result.Created = (ApiDateTime)company.CreateOn;
|
|
result.About = company.About;
|
|
result.Industry = company.Industry;
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
[DataMember(IsRequired = true, EmitDefaultValue = false)]
|
|
public String CompanyName { get; set; }
|
|
|
|
[DataMember(IsRequired = true, EmitDefaultValue = false)]
|
|
public IEnumerable<ContactBaseWrapper> Persons { get; set; }
|
|
|
|
[DataMember(IsRequired = true, EmitDefaultValue = false)]
|
|
public int PersonsCount { get; set; }
|
|
|
|
public new static CompanyWrapper GetSample()
|
|
{
|
|
return new CompanyWrapper(0)
|
|
{
|
|
IsPrivate = true,
|
|
IsShared = false,
|
|
IsCompany = true,
|
|
About = "",
|
|
CompanyName = "Food and Culture Project",
|
|
PersonsCount = 0
|
|
};
|
|
}
|
|
}
|
|
|
|
[DataContract(Name = "contact", Namespace = "")]
|
|
[KnownType(typeof(PersonWrapper))]
|
|
[KnownType(typeof(CompanyWrapper))]
|
|
public abstract class ContactWrapper : ContactBaseWrapper
|
|
{
|
|
protected ContactWrapper()
|
|
{
|
|
}
|
|
|
|
protected ContactWrapper(Contact contact)
|
|
: base(contact)
|
|
{
|
|
CreateBy = EmployeeWraper.Get(contact.CreateBy);
|
|
Created = (ApiDateTime)contact.CreateOn;
|
|
About = contact.About;
|
|
Industry = contact.Industry;
|
|
}
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public IEnumerable<Address> Addresses { get; set; }
|
|
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public EmployeeWraper CreateBy { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public ApiDateTime Created { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public String About { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public String Industry { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public ContactStatusBaseWrapper ContactStatus { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public ContactTypeBaseWrapper ContactType { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public IEnumerable<ContactInfoWrapper> CommonData { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public IEnumerable<CustomFieldBaseWrapper> CustomFields { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public IEnumerable<String> Tags { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public int TaskCount { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = true)]
|
|
public bool HaveLateTasks { get; set; }
|
|
|
|
public new static ContactWrapper GetSample()
|
|
{
|
|
return new PersonWrapper(0)
|
|
{
|
|
IsPrivate = true,
|
|
IsShared = false,
|
|
IsCompany = false,
|
|
FirstName = "Tadjeddine",
|
|
LastName = "Bachir",
|
|
Company = CompanyWrapper.GetSample(),
|
|
Title = "Programmer",
|
|
About = "",
|
|
Created = ApiDateTime.GetSample(),
|
|
CreateBy = EmployeeWraper.GetSample(),
|
|
CommonData = new List<ContactInfoWrapper>() { ContactInfoWrapper.GetSample() },
|
|
CustomFields = new List<CustomFieldBaseWrapper>() { CustomFieldBaseWrapper.GetSample() },
|
|
ShareType = ShareType.None,
|
|
CanDelete = true,
|
|
CanEdit = true,
|
|
TaskCount = 0,
|
|
HaveLateTasks = false
|
|
};
|
|
}
|
|
}
|
|
|
|
[DataContract(Name = "contactBase", Namespace = "")]
|
|
public class ContactBaseWithEmailWrapper : ContactBaseWrapper
|
|
{
|
|
protected ContactBaseWithEmailWrapper()
|
|
{
|
|
}
|
|
|
|
public ContactBaseWithEmailWrapper(Contact contact)
|
|
: base(contact)
|
|
{
|
|
}
|
|
|
|
public ContactBaseWithEmailWrapper(ContactWrapper contactWrapper)
|
|
{
|
|
AccessList = contactWrapper.AccessList;
|
|
CanEdit = contactWrapper.CanEdit;
|
|
DisplayName = contactWrapper.DisplayName;
|
|
IsCompany = contactWrapper.IsCompany;
|
|
IsPrivate = contactWrapper.IsPrivate;
|
|
IsShared = contactWrapper.IsShared;
|
|
ShareType = contactWrapper.ShareType;
|
|
MediumFotoUrl = contactWrapper.MediumFotoUrl;
|
|
SmallFotoUrl = contactWrapper.SmallFotoUrl;
|
|
|
|
if (contactWrapper.CommonData != null && contactWrapper.CommonData.Count() != 0)
|
|
{
|
|
Email = contactWrapper.CommonData.FirstOrDefault(item => item.InfoType == ContactInfoType.Email && item.IsPrimary);
|
|
}
|
|
else
|
|
{
|
|
Email = null;
|
|
}
|
|
}
|
|
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public ContactInfoWrapper Email { get; set; }
|
|
}
|
|
|
|
|
|
[DataContract(Name = "contactBase", Namespace = "")]
|
|
public class ContactBaseWithPhoneWrapper : ContactBaseWrapper
|
|
{
|
|
protected ContactBaseWithPhoneWrapper(int id)
|
|
: base(id)
|
|
{
|
|
}
|
|
|
|
public ContactBaseWithPhoneWrapper(Contact contact)
|
|
: base(contact)
|
|
{
|
|
}
|
|
|
|
public ContactBaseWithPhoneWrapper(ContactWrapper contactWrapper)
|
|
: base(contactWrapper.ID)
|
|
{
|
|
AccessList = contactWrapper.AccessList;
|
|
CanEdit = contactWrapper.CanEdit;
|
|
DisplayName = contactWrapper.DisplayName;
|
|
IsCompany = contactWrapper.IsCompany;
|
|
IsPrivate = contactWrapper.IsPrivate;
|
|
IsShared = contactWrapper.IsShared;
|
|
ShareType = contactWrapper.ShareType;
|
|
MediumFotoUrl = contactWrapper.MediumFotoUrl;
|
|
SmallFotoUrl = contactWrapper.SmallFotoUrl;
|
|
|
|
if (contactWrapper.CommonData != null && contactWrapper.CommonData.Count() != 0)
|
|
{
|
|
Phone = contactWrapper.CommonData.FirstOrDefault(item => item.InfoType == ContactInfoType.Phone && item.IsPrimary);
|
|
}
|
|
else
|
|
{
|
|
Phone = null;
|
|
}
|
|
}
|
|
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public ContactInfoWrapper Phone { get; set; }
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// Contact base information
|
|
/// </summary>
|
|
[DataContract(Name = "contactBase", Namespace = "")]
|
|
public class ContactBaseWrapper
|
|
{
|
|
public ContactBaseWrapper()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
[DataMember(Name = "id")]
|
|
public int Id { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public String SmallFotoUrl { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public String MediumFotoUrl { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = true)]
|
|
public String DisplayName { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = true)]
|
|
public bool IsCompany { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public IEnumerable<EmployeeWraper> AccessList { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = true)]
|
|
public bool IsPrivate { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = true)]
|
|
public bool IsShared { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = true)]
|
|
public ShareType ShareType { get; set; }
|
|
|
|
[DataMember]
|
|
public CurrencyInfoWrapper Currency { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = true)]
|
|
public bool CanEdit { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = true)]
|
|
public bool CanDelete { get; set; }
|
|
|
|
public static ContactBaseWrapper GetSample()
|
|
{
|
|
return new ContactBaseWrapper
|
|
{
|
|
IsPrivate = true,
|
|
IsShared = false,
|
|
IsCompany = false,
|
|
DisplayName = "Tadjeddine Bachir",
|
|
SmallFotoUrl = "url to foto"
|
|
};
|
|
}
|
|
}
|
|
|
|
|
|
[DataContract(Name = "contact_task", Namespace = "")]
|
|
public class ContactWithTaskWrapper
|
|
{
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public TaskBaseWrapper Task { get; set; }
|
|
|
|
[DataMember(IsRequired = false, EmitDefaultValue = false)]
|
|
public ContactWrapper Contact { get; set; }
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public class ContactBaseWrapperHelper
|
|
{
|
|
public ContactBaseWrapperHelper(ApiDateTimeHelper apiDateTimeHelper,
|
|
EmployeeWraperHelper employeeWraperHelper,
|
|
CRMSecurity cRMSecurity,
|
|
CurrencyProvider currencyProvider,
|
|
PathProvider pathProvider,
|
|
CurrencyInfoWrapperHelper currencyInfoWrapperHelper)
|
|
{
|
|
ApiDateTimeHelper = apiDateTimeHelper;
|
|
EmployeeWraperHelper = employeeWraperHelper;
|
|
CRMSecurity = cRMSecurity;
|
|
CurrencyProvider = currencyProvider;
|
|
PathProvider = pathProvider;
|
|
CurrencyInfoWrapperHelper = currencyInfoWrapperHelper;
|
|
}
|
|
|
|
public CurrencyInfoWrapperHelper CurrencyInfoWrapperHelper { get; }
|
|
public CRMSecurity CRMSecurity { get; }
|
|
public ApiDateTimeHelper ApiDateTimeHelper { get; }
|
|
public EmployeeWraperHelper EmployeeWraperHelper { get; }
|
|
public CurrencyProvider CurrencyProvider { get; }
|
|
public PathProvider PathProvider { get; }
|
|
|
|
public ContactBaseWrapper GetQuick(Contact contact)
|
|
{
|
|
var result = new ContactBaseWrapper
|
|
{
|
|
Id = contact.ID,
|
|
DisplayName = contact.GetTitle(),
|
|
IsPrivate = CRMSecurity.IsPrivate(contact),
|
|
IsShared = contact.ShareType == ShareType.ReadWrite || contact.ShareType == ShareType.Read,
|
|
ShareType = contact.ShareType,
|
|
Currency = !String.IsNullOrEmpty(contact.Currency) ?
|
|
CurrencyInfoWrapperHelper.Get(CurrencyProvider.Get(contact.Currency)) : null,
|
|
SmallFotoUrl = String.Format("{0}HttpHandlers/filehandler.ashx?action=contactphotoulr&cid={1}&isc={2}&ps=1", PathProvider.BaseAbsolutePath, contact.ID, contact is Company).ToLower(),
|
|
MediumFotoUrl = String.Format("{0}HttpHandlers/filehandler.ashx?action=contactphotoulr&cid={1}&isc={2}&ps=2", PathProvider.BaseAbsolutePath, contact.ID, contact is Company).ToLower(),
|
|
IsCompany = contact is Company,
|
|
CanEdit = CRMSecurity.CanEdit(contact),
|
|
// CanDelete = CRMSecurity.CanDelete(contact),
|
|
};
|
|
|
|
if (result.IsPrivate)
|
|
{
|
|
result.AccessList = CRMSecurity.GetAccessSubjectTo(contact)
|
|
.Select(item => EmployeeWraperHelper.Get(item.Key));
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
public ContactBaseWrapper Get(Contact contact)
|
|
{
|
|
var result = new ContactBaseWrapper
|
|
{
|
|
Id = contact.ID,
|
|
DisplayName = contact.GetTitle(),
|
|
IsPrivate = CRMSecurity.IsPrivate(contact),
|
|
IsShared = contact.ShareType == ShareType.ReadWrite || contact.ShareType == ShareType.Read,
|
|
ShareType = contact.ShareType,
|
|
Currency = !String.IsNullOrEmpty(contact.Currency) ?
|
|
CurrencyInfoWrapperHelper.Get(CurrencyProvider.Get(contact.Currency)) : null,
|
|
SmallFotoUrl = String.Format("{0}HttpHandlers/filehandler.ashx?action=contactphotoulr&cid={1}&isc={2}&ps=1", PathProvider.BaseAbsolutePath, contact.ID, contact is Company).ToLower(),
|
|
MediumFotoUrl = String.Format("{0}HttpHandlers/filehandler.ashx?action=contactphotoulr&cid={1}&isc={2}&ps=2", PathProvider.BaseAbsolutePath, contact.ID, contact is Company).ToLower(),
|
|
IsCompany = contact is Company,
|
|
CanEdit = CRMSecurity.CanEdit(contact),
|
|
CanDelete = CRMSecurity.CanDelete(contact),
|
|
};
|
|
|
|
if (result.IsPrivate)
|
|
{
|
|
result.AccessList = CRMSecurity.GetAccessSubjectTo(contact)
|
|
.Select(item => EmployeeWraperHelper.Get(item.Key));
|
|
}
|
|
|
|
return result;
|
|
}
|
|
}
|
|
|
|
public static class ContactBaseWrapperHelperExtension
|
|
{
|
|
public static DIHelper AddContactBaseWrapperHelperService(this DIHelper services)
|
|
{
|
|
services.TryAddTransient<ContactBaseWrapperHelper>();
|
|
|
|
return services.AddApiDateTimeHelper()
|
|
.AddEmployeeWraper()
|
|
.AddCRMSecurityService()
|
|
.AddCurrencyProviderService()
|
|
.AddCRMPathProviderService();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
} |