/* * * (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 System; using System.Collections.Generic; using System.Linq; using System.Security; using System.Text.Json; using ASC.Api.CRM; using ASC.Common.Threading.Progress; using ASC.Core.Common.Settings; using ASC.CRM.ApiModels; using ASC.CRM.Core; using ASC.CRM.Core.Dao; using ASC.CRM.Core.EF; using ASC.CRM.Core.Entities; using ASC.CRM.Core.Enums; using ASC.CRM.Resources; using ASC.MessagingSystem; using ASC.Web.Api.Routing; using ASC.Web.Core.Utility; using ASC.Web.CRM.Classes; using AutoMapper; using Microsoft.AspNetCore.Mvc; namespace ASC.CRM.Api { public class UtilsController : BaseApiController { private readonly ExportToCsv _exportToCsv; private readonly ImportFromCSV _importFromCSV; private readonly Global _global; private readonly OrganisationLogoManager _organisationLogoManager; private readonly ImportFromCSVManager _importFromCSVManager; private readonly InvoiceSetting _invoiceSetting; private readonly SettingsManager _settingsManager; private readonly CurrencyProvider _currencyProvider; private readonly MessageService _messageService; public UtilsController(CrmSecurity crmSecurity, DaoFactory daoFactory, MessageService messageService, SettingsManager settingsManager, CurrencyProvider currencyProvider, InvoiceSetting invoiceSetting, ImportFromCSVManager importFromCSVManager, OrganisationLogoManager organisationLogoManager, Global global, ImportFromCSV importFromCSV, ExportToCsv exportToCsv, IMapper mapper) : base(daoFactory, crmSecurity, mapper) { _messageService = messageService; _currencyProvider = currencyProvider; _settingsManager = settingsManager; _invoiceSetting = invoiceSetting; _importFromCSVManager = importFromCSVManager; _organisationLogoManager = organisationLogoManager; _global = global; _importFromCSV = importFromCSV; _exportToCsv = exportToCsv; } /// /// Returns the list of all currencies currently available on the portal /// /// Get currency list /// Common /// /// List of available currencies /// [Read(@"settings/currency")] public IEnumerable GetAvaliableCurrency() { return _currencyProvider.GetAll().ConvertAll(item => _mapper.Map(item)); } /// /// Returns the result of convertation from one currency to another /// /// Amount to convert /// Old currency key /// New currency key /// Get the result of convertation /// Common /// /// Decimal result of convertation /// [Read(@"settings/currency/convert")] public Decimal ConvertAmount(Decimal amount, String fromcurrency, String tocurrency) { return _currencyProvider.MoneyConvert(amount, fromcurrency, tocurrency); } /// /// Returns the summary table with rates for selected currency /// /// Currency (Abbreviation) /// Get the summary table /// Common /// /// Dictionary of currencies and rates /// /// [Read(@"settings/currency/summarytable")] public IEnumerable GetSummaryTable(String currency) { var result = new List(); if (string.IsNullOrEmpty(currency)) { throw new ArgumentException(); } var cur = _currencyProvider.Get(currency.ToUpper()); if (cur == null) throw new ArgumentException(); var table = _currencyProvider.MoneyConvert(cur).ToList(); foreach (var row in table) { var currencyInfoDto = _mapper.Map(row.Key); currencyInfoDto.Rate = row.Value; result.Add(currencyInfoDto); } return result; } /// /// /// /// Change contact status group auto /// /// Contacts /// /// ChangeContactStatusGroupAuto setting value (true, false or null) /// /// [Update(@"contact/status/settings")] public Boolean? UpdateCRMContactStatusSettings(Boolean? changeContactStatusGroupAuto) { var tenantSettings = _settingsManager.Load(); tenantSettings.ChangeContactStatusGroupAuto = changeContactStatusGroupAuto; _settingsManager.Save(tenantSettings); _messageService.Send(MessageAction.ContactTemperatureLevelSettingsUpdated); return changeContactStatusGroupAuto; } /// /// /// /// Write mail to history auto /// /// Contacts /// /// WriteMailToHistoryAuto setting value (true or false) /// /// [Update(@"contact/mailtohistory/settings")] public Boolean UpdateCRMWriteMailToHistorySettings(Boolean writeMailToHistoryAuto) { var tenantSettings = _settingsManager.Load(); tenantSettings.WriteMailToHistoryAuto = writeMailToHistoryAuto; _settingsManager.Save(tenantSettings); //MessageService.Send( MessageAction.ContactTemperatureLevelSettingsUpdated); return writeMailToHistoryAuto; } /// /// /// /// add tag to contact group auto /// /// Contacts /// /// AddTagToContactGroupAuto setting value (true, false or null) /// /// [Update(@"contact/tag/settings")] public Boolean? UpdateCRMContactTagSettings(Boolean? addTagToContactGroupAuto) { var tenantSettings = _settingsManager.Load(); tenantSettings.AddTagToContactGroupAuto = addTagToContactGroupAuto; _settingsManager.Save(tenantSettings); _messageService.Send(MessageAction.ContactsTagSettingsUpdated); return addTagToContactGroupAuto; } /// /// Set IsConfiguredPortal tenant setting and website contact form key specified in the request /// /// Set tenant settings /// Common /// /// IsConfiguredPortal setting value (true or false) /// [Update(@"settings")] public Boolean SetIsPortalConfigured(Boolean? configured, Guid? webFormKey) { if (!_crmSecurity.IsAdmin) throw _crmSecurity.CreateSecurityException(); var tenantSettings = _settingsManager.Load(); tenantSettings.IsConfiguredPortal = configured ?? true; tenantSettings.WebFormKey = webFormKey ?? Guid.NewGuid(); _settingsManager.Save(tenantSettings); return tenantSettings.IsConfiguredPortal; } /// /// Save organisation company name /// /// Organisation company name /// Save organisation company name /// Organisation /// Organisation company name /// [Update(@"settings/organisation/base")] public String UpdateOrganisationSettingsCompanyName(String companyName) { if (!_crmSecurity.IsAdmin) throw _crmSecurity.CreateSecurityException(); var tenantSettings = _settingsManager.Load(); if (tenantSettings.InvoiceSetting == null) { tenantSettings.InvoiceSetting = _invoiceSetting.DefaultSettings; } tenantSettings.InvoiceSetting.CompanyName = companyName; _settingsManager.Save(tenantSettings); _messageService.Send(MessageAction.OrganizationProfileUpdatedCompanyName, companyName); return companyName; } /// /// Save organisation company address /// /// Organisation company street/building/apartment address /// City /// State /// Zip /// Country /// Save organisation company address /// Organisation /// Returns a JSON object with the organization company address details /// [Update(@"settings/organisation/address")] public String UpdateOrganisationSettingsCompanyAddress(String street, String city, String state, String zip, String country) { if (!_crmSecurity.IsAdmin) throw _crmSecurity.CreateSecurityException(); var tenantSettings = _settingsManager.Load(); if (tenantSettings.InvoiceSetting == null) { tenantSettings.InvoiceSetting = _invoiceSetting.DefaultSettings; } var companyAddress = JsonSerializer.Serialize(new { type = AddressCategory.Billing.ToString(), street, city, state, zip, country }); tenantSettings.InvoiceSetting.CompanyAddress = companyAddress; _settingsManager.Save(tenantSettings); _messageService.Send(MessageAction.OrganizationProfileUpdatedAddress); return companyAddress; } /// /// Save organisation logo /// /// Reset organisation logo /// Save organisation logo /// Organisation /// Organisation logo ID /// /// [Update(@"settings/organisation/logo")] public Int32 UpdateOrganisationSettingsLogo(bool reset) { if (!_crmSecurity.IsAdmin) throw _crmSecurity.CreateSecurityException(); int companyLogoID; if (!reset) { companyLogoID = _organisationLogoManager.TryUploadOrganisationLogoFromTmp(_daoFactory); if (companyLogoID == 0) { throw new Exception("Downloaded image not found"); } } else { companyLogoID = 0; } var tenantSettings = _settingsManager.Load(); if (tenantSettings.InvoiceSetting == null) { tenantSettings.InvoiceSetting = _invoiceSetting.DefaultSettings; } tenantSettings.InvoiceSetting.CompanyLogoID = companyLogoID; _settingsManager.Save(tenantSettings); _messageService.Send(MessageAction.OrganizationProfileUpdatedInvoiceLogo); return companyLogoID; } /// /// Get organisation logo in base64 format (if 'id' is 0 then take current logo) /// /// organisation logo id /// Get organisation logo /// Organisation /// Organisation logo content in base64 /// [Read(@"settings/organisation/logo")] public String GetOrganisationSettingsLogo(int id) { if (id != 0) { return _organisationLogoManager.GetOrganisationLogoBase64(id); } else { var tenantSettings = _settingsManager.Load(); if (tenantSettings.InvoiceSetting == null) { return string.Empty; } return _organisationLogoManager.GetOrganisationLogoBase64(tenantSettings.InvoiceSetting.CompanyLogoID); } } /// /// Change Website Contact Form key /// /// Change web form key /// Common /// Web form key /// [Update(@"settings/webformkey/change")] public string ChangeWebToLeadFormKey() { if (!_crmSecurity.IsAdmin) throw _crmSecurity.CreateSecurityException(); var tenantSettings = _settingsManager.Load(); tenantSettings.WebFormKey = Guid.NewGuid(); _settingsManager.Save(tenantSettings); _messageService.Send(MessageAction.WebsiteContactFormUpdatedKey); return tenantSettings.WebFormKey.ToString(); } /// /// Change default CRM currency /// /// Currency (Abbreviation) /// Change currency /// Common /// currency /// /// [Update(@"settings/currency")] public CurrencyInfoDto UpdateCRMCurrency(String currency) { if (!_crmSecurity.IsAdmin) throw _crmSecurity.CreateSecurityException(); if (string.IsNullOrEmpty(currency)) { throw new ArgumentException(); } currency = currency.ToUpper(); var cur = _currencyProvider.Get(currency); if (cur == null) throw new ArgumentException(); _global.SaveDefaultCurrencySettings(cur); _messageService.Send(MessageAction.CrmDefaultCurrencyUpdated); return _mapper.Map(cur); } /// false [Create(@"{entityType:regex(contact|opportunity|case|task)}/import/start")] public string StartImportFromCSV([FromRoute] string entityType, [FromForm] string csvFileURI, [FromForm] string jsonSettings) { EntityType entityTypeObj; if (string.IsNullOrEmpty(entityType) || string.IsNullOrEmpty(csvFileURI) || string.IsNullOrEmpty(jsonSettings)) throw new ArgumentException(); switch (entityType.ToLower()) { case "contact": entityTypeObj = EntityType.Contact; break; case "opportunity": entityTypeObj = EntityType.Opportunity; break; case "case": entityTypeObj = EntityType.Case; break; case "task": entityTypeObj = EntityType.Task; break; default: throw new ArgumentException(); } _importFromCSVManager.StartImport(entityTypeObj, csvFileURI, jsonSettings); return ""; } /// false [Read(@"{entityType:regex(contact|opportunity|case|task)}/import/status")] public IProgressItem GetImportFromCSVStatus(string entityType) { EntityType entityTypeObj; if (string.IsNullOrEmpty(entityType)) throw new ArgumentException(); switch (entityType.ToLower()) { case "contact": entityTypeObj = EntityType.Contact; break; case "opportunity": entityTypeObj = EntityType.Opportunity; break; case "case": entityTypeObj = EntityType.Case; break; case "task": entityTypeObj = EntityType.Task; break; default: throw new ArgumentException(); } return _importFromCSV.GetStatus(entityTypeObj); } /// false [Read(@"import/samplerow")] public String GetImportFromCSVSampleRow(string csvFileURI, int indexRow, string jsonSettings) { if (String.IsNullOrEmpty(csvFileURI) || indexRow < 0) throw new ArgumentException(); if (!_global.GetStore().IsFile("temp", csvFileURI)) throw new ArgumentException(); var CSVFileStream = _global.GetStore().GetReadStream("temp", csvFileURI); return _importFromCSV.GetRow(CSVFileStream, indexRow, jsonSettings); } /// false [Create(@"import/uploadfake")] public FileUploadResult ProcessUploadFake([FromForm] string csvFileURI, [FromForm] string jsonSettings) { return _importFromCSVManager.ProcessUploadFake(csvFileURI, jsonSettings); } /// false [Read(@"export/status")] public IProgressItem GetExportStatus() { if (!_crmSecurity.IsAdmin) throw _crmSecurity.CreateSecurityException(); return _exportToCsv.GetStatus(false); } /// false [Update(@"export/cancel")] public IProgressItem CancelExport() { if (!_crmSecurity.IsAdmin) throw _crmSecurity.CreateSecurityException(); _exportToCsv.Cancel(false); return _exportToCsv.GetStatus(false); } /// false [Create(@"export/start")] public IProgressItem StartExport() { if (!_crmSecurity.IsAdmin) throw _crmSecurity.CreateSecurityException(); _messageService.Send(MessageAction.CrmAllDataExported); return _exportToCsv.Start(null, CRMSettingResource.Export + ".zip"); } /// false [Read(@"export/partial/status")] public IProgressItem GetPartialExportStatus() { return _exportToCsv.GetStatus(true); } /// false [Update(@"export/partial/cancel")] public IProgressItem CancelPartialExport() { _exportToCsv.Cancel(true); return _exportToCsv.GetStatus(true); } /// false [Create(@"export/partial/{entityType:regex(contact|opportunity|case|task|invoiceitem)}/start")] public IProgressItem StartPartialExport([FromRoute] string entityType, [FromForm] string base64FilterString) { if (string.IsNullOrEmpty(base64FilterString)) throw new ArgumentException(); FilterObject filterObject; String fileName; switch (entityType.ToLower()) { case "contact": filterObject = new ContactFilterObject(base64FilterString); fileName = CRMContactResource.Contacts + ".csv"; _messageService.Send(MessageAction.ContactsExportedToCsv); break; case "opportunity": filterObject = new DealFilterObject(base64FilterString); fileName = CRMCommonResource.DealModuleName + ".csv"; _messageService.Send(MessageAction.OpportunitiesExportedToCsv); break; case "case": filterObject = new CasesFilterObject(base64FilterString); fileName = CRMCommonResource.CasesModuleName + ".csv"; _messageService.Send(MessageAction.CasesExportedToCsv); break; case "task": filterObject = new TaskFilterObject(base64FilterString); fileName = CRMCommonResource.TaskModuleName + ".csv"; _messageService.Send(MessageAction.CrmTasksExportedToCsv); break; case "invoiceitem": fileName = CRMCommonResource.ProductsAndServices + ".csv"; filterObject = new InvoiceItemFilterObject(base64FilterString); break; default: throw new ArgumentException(); } return _exportToCsv.Start(filterObject, fileName); } } }