using FrameworkBLL.User;
using FrameworkDAL.CustomCode.Menu;
using GB5Shared.Tree;
using FrameworkDAL.CustomCode.User;
using FrameworkDAL.DTO.Menu;
using GB5Shared.DTO.Framework.Criteria;
using GB5Shared.DTO.Framework.Login;
using GB5Shared.GenerateAutoNumber;
using GB5Shared.Resource.Response;
using GB5Shared.Telemetry;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using static GB5Shared.GB5Constant.Constant;
namespace FrameworkBLL.Menu
{
///
/// MenuBLL
///
///
public class MenuBLL : IMenuBLL
{
private readonly IMenuDAL _MenuDAL;
private readonly AutoNumber _autoNumber;
///
/// Initializes a new instance of the class.
///
public MenuBLL(IMenuDAL MenuDAL, AutoNumber autoNumber)
{
_MenuDAL = MenuDAL;
_autoNumber = autoNumber;
}
///
/// Gets the menu for a user module.
///
/// The user identifier.
/// The module identifier.
/// The login data transfer object.
/// A JSON string representing the menu tree.
public async Task GetMenuForUserModule(int UserId, int ModuleId, LoginDTO LoginDTO)
{
try
{
if (LoginDTO.ModeOfOperation == 0)
{
// FindModuleWiseLicnese(UserId, ModuleId, LoginDTO);//Currently commented since we dont have provision to generate license
}
List MenuTreeDTOs = new List();
List menuList = (await _MenuDAL.GetMenuForUserModule(UserId, ModuleId, LoginDTO)).ToList(); // Convert to List
for (int i = 0; i < menuList.Count; i++)
{
LoadMenuListDTO menu = menuList[i];
MenuTreeDTO menuTreeDTO = new MenuTreeDTO();
menuTreeDTO.Id = menu.MenuId;
menuTreeDTO.Code = menu.MenuCode;
menuTreeDTO.data = menu.MenuName;
menuTreeDTO.MenuType = menu.MenuMenuType;
menuTreeDTO.ModuleId = menu.ModuleId;
menuTreeDTO.ModuleCode = menu.ModuleCode;
menuTreeDTO.ModuleName = menu.ModuleName;
menuTreeDTO.DisplayName = menu.MenuDisplayName;
menuTreeDTO.MenuObjectModelName = menu.MenuObjectModelName;
menuTreeDTO.Section = menu.MenuSection;
menuTreeDTO.ReportId = menu.ReportId;
menuTreeDTO.ReportName = menu.ReportName;
menuTreeDTO.BizTransactionClassId = menu.MenuBizTransactionClassId;
menuTreeDTO.BizTransactionClassName = menu.MenuBizTransactionClassName;
menuTreeDTO.MenuObjectModelFileLocation = menu.MenuObjectModelFileLocation;
menuTreeDTO.Level = menu.MenuLevel;
menuTreeDTO.WebFormId = menu.WebFormId;
menuTreeDTO.WebFormName = menu.WebFormName;
menuTreeDTO.WebFormURL = menu.WebFormURL;
menuTreeDTO.WebFormSecondURL = menu.WebFormSecondURL;
menuTreeDTO.MenuDescription = menu.MenuDescription;
menuTreeDTO.GcmTypeId = menu.GcmTypeId;
menuTreeDTO.GcmTypeCode = menu.GcmTypeCode;
menuTreeDTO.GcmTypeName = menu.GcmTypeName;
menuTreeDTO.HelpUrl = menu.HelpUrl;
menuTreeDTO.ImageId = menu.ImageId;
menuTreeDTO.ImageName = menu.ImageName;
menuTreeDTO.ImageLinkURL = menu.ImageLinkURL;
menuTreeDTO.MenuSortOrder = menu.MenuSortOrder;
menuTreeDTO.EntityId = menu.EntityId;
menuTreeDTO.InchargeId = menu.InchargeId;
menuTreeDTO.InchargeCode = menu.InchargeCode;
menuTreeDTO.InchargeName = menu.InchargeName;
menuTreeDTO.AnalysisWebServiceId = menu.AnalysisWebServiceId;
menuTreeDTO.UserVsMenuId = menu.UserVsMenuId;
menuTreeDTO.DefaultMenuId = menu.DefaultMenuId;
menuTreeDTO.DefaultMenuCode = menu.DefaultMenuCode;
menuTreeDTO.DefaultMenuName = menu.DefaultMenuName;
menuTreeDTO.DefaultMenuMenuNature = menu.DefaultMenuMenuNature;
menuTreeDTO.DefaultMenuMenuType = menu.DefaultMenuMenuType;
menuTreeDTO.DefaultMenuSection = menu.DefaultMenuSection;
menuTreeDTO.DefaultMenuReportId = menu.DefaultMenuReportId;
menuTreeDTO.DefaultMenuEntityId = menu.DefaultMenuEntityId;
menuTreeDTO.DefaultMenuBizTransactionClassId = menu.DefaultMenuBizTransactionClassId;
menuTreeDTO.DefaultMenuBizTransactionClassName = menu.DefaultMenuBizTransactionClassName;
menuTreeDTO.DefaultMenuGCMTypeId = menu.DefaultMenuGCMTypeId;
menuTreeDTO.DefaultMenuWebFormId = menu.DefaultMenuWebFormId;
menuTreeDTO.DefaultMenuWebFormName = menu.DefaultMenuWebFormName;
menuTreeDTO.DefaultMenuWebFormUrl = menu.DefaultMenuWebFormUrl;
menuTreeDTO.DefaultMenuHelpUrl = menu.DefaultMenuHelpUrl;
menuTreeDTO.DefaultMenuImageId = menu.DefaultMenuImageId;
menuTreeDTO.MenuWebFormObjectModelIds = menu.MenuWebFormObjectModelIds;
menuTreeDTO.MenuWebFormObjectModelNames = menu.MenuWebFormObjectModelNames;
menuTreeDTO.DefaultWebFormObjectModelIds = menu.DefaultWebFormObjectModelIds;
menuTreeDTO.DefaultWebFormObjectModelNames = menu.DefaultWebFormObjectModelNames;
menuTreeDTO.ListMenuId = menu.ListMenuId;
menuTreeDTO.PageCode = menu.PageCode;
menuTreeDTO.PageId = menu.PageId;
menuTreeDTO.PageName = menu.PageName;
menuTreeDTO.TargetType = menu.TargetType;
menuTreeDTO.TargetId = menu.TargetId;
menuTreeDTO.MenuIconName = menu.MenuIconName;
if (menu.ParentId != -1)
{
MenuTreeDTO parentMenuTreeDTO = new MenuTreeDTO();
parentMenuTreeDTO.Id = menu.ParentId;
parentMenuTreeDTO.UserVsMenuId = menu.UserVsMenuId;
parentMenuTreeDTO.DefaultMenuId = menu.DefaultMenuId;
parentMenuTreeDTO.DefaultMenuCode = menu.DefaultMenuCode;
parentMenuTreeDTO.DefaultMenuName = menu.DefaultMenuName;
parentMenuTreeDTO.DefaultMenuMenuNature = menu.DefaultMenuMenuNature;
parentMenuTreeDTO.DefaultMenuMenuType = menu.DefaultMenuMenuType;
parentMenuTreeDTO.DefaultMenuSection = menu.DefaultMenuSection;
parentMenuTreeDTO.DefaultMenuReportId = menu.DefaultMenuReportId;
parentMenuTreeDTO.DefaultMenuEntityId = menu.DefaultMenuEntityId;
parentMenuTreeDTO.DefaultMenuBizTransactionClassId = menu.DefaultMenuBizTransactionClassId;
parentMenuTreeDTO.DefaultMenuBizTransactionClassName = menu.DefaultMenuBizTransactionClassName;
parentMenuTreeDTO.DefaultMenuGCMTypeId = menu.DefaultMenuGCMTypeId;
parentMenuTreeDTO.DefaultMenuWebFormId = menu.DefaultMenuWebFormId;
parentMenuTreeDTO.DefaultMenuWebFormName = menu.DefaultMenuWebFormName;
parentMenuTreeDTO.DefaultMenuWebFormUrl = menu.DefaultMenuWebFormUrl;
parentMenuTreeDTO.DefaultMenuHelpUrl = menu.DefaultMenuHelpUrl;
parentMenuTreeDTO.DefaultMenuImageId = menu.DefaultMenuImageId;
parentMenuTreeDTO.MenuWebFormObjectModelIds = menu.MenuWebFormObjectModelIds;
parentMenuTreeDTO.MenuWebFormObjectModelNames = menu.MenuWebFormObjectModelNames;
parentMenuTreeDTO.DefaultWebFormObjectModelIds = menu.DefaultWebFormObjectModelIds;
parentMenuTreeDTO.DefaultWebFormObjectModelNames = menu.DefaultWebFormObjectModelNames;
menuTreeDTO.Parent = parentMenuTreeDTO;
}
MenuTreeAttributeDTO attr = new MenuTreeAttributeDTO();
attr.Id = menuTreeDTO.Id;
attr.Code = menuTreeDTO.Code;
attr.Nature = menu.MenuMenuNature;
menuTreeDTO.attr = attr;
MenuTreeDTOs.Add(menuTreeDTO);
}
string Json1 = JsonConvert.SerializeObject(MenuTreeDTOs);
IList TreeTopLevelCategory = TreeHelper.ConvertToTree(MenuTreeDTOs);
string Json = JsonConvert.SerializeObject(TreeTopLevelCategory);
return Json;
}
catch (Exception)
{
throw;
}
}
public async Task GetMenu(int MenuId, LoginDTO LoginDTO)
{
try
{
return await _MenuDAL.GetMenu(MenuId, LoginDTO);
}
catch (Exception)
{
throw;
}
}
public async Task GetReportCriteriaForMenu(int UserId, int MenuId, int IsFromScreen, LoginDTO LoginDTO)
{
try
{
return await _MenuDAL.GetReportCriteriaForMenu(UserId, MenuId, IsFromScreen, LoginDTO);
}
catch (Exception)
{
throw;
}
}
///
/// Retrieves a list of Menu records based on filter criteria.
/// Typically used for populating dropdowns or selection lists in the UI.
///
/// Filter criteria for selecting Menus.
/// The current user's login details.
/// A JSON string representing the list of Menus.
public async Task GetSelectListMenu(CriteriaDTO CriteriaDTO, LoginDTO LoginDTO)
{
try
{
return await _MenuDAL.GetSelectListMenu(CriteriaDTO, LoginDTO);
}
catch (Exception)
{
throw;
}
}
public async Task GetMenuListBasedMenuSetForTree(int Type, int ModuleId, CriteriaDTO CriteriaDTO, LoginDTO LoginDTO)
{
try
{
List MenuTreeDTOs = new List();
List menuList = (await _MenuDAL.GetMenuListBasedMenuSetForTree(ModuleId, CriteriaDTO, LoginDTO)).ToList();
for (int i = 0; i < menuList.Count; i++)
{
LoadMenuListDTO menu = menuList[i];
MenuTreeDTO menuTreeDTO = new MenuTreeDTO();
menuTreeDTO.Id = menu.MenuId;
menuTreeDTO.Code = menu.MenuCode;
menuTreeDTO.data = menu.MenuDisplayName;
menuTreeDTO.MenuType = menu.MenuMenuType;
menuTreeDTO.ModuleId = menu.ModuleId;
menuTreeDTO.ModuleCode = menu.ModuleCode;
menuTreeDTO.ModuleName = menu.ModuleName;
menuTreeDTO.DisplayName = menu.MenuDisplayName;
menuTreeDTO.Section = menu.MenuSection;
menuTreeDTO.ReportId = menu.ReportId;
menuTreeDTO.ReportName = menu.ReportName;
menuTreeDTO.BizTransactionClassId = menu.MenuBizTransactionClassId;
menuTreeDTO.BizTransactionClassName = menu.MenuBizTransactionClassName;
menuTreeDTO.Level = menu.MenuLevel;
menuTreeDTO.WebFormId = menu.WebFormId;
menuTreeDTO.WebFormName = menu.WebFormName;
menuTreeDTO.MenuDescription = menu.MenuDescription;
menuTreeDTO.GcmTypeId = menu.GcmTypeId;
menuTreeDTO.GcmTypeCode = menu.GcmTypeCode;
menuTreeDTO.GcmTypeName = menu.GcmTypeName;
if (menu.ParentId != -1)
{
menuTreeDTO.Parent = new MenuTreeDTO();
menuTreeDTO.Parent.Id = menu.ParentId;
}
MenuTreeAttributeDTO attr = new MenuTreeAttributeDTO();
attr.Id = menuTreeDTO.Id;
attr.Code = menuTreeDTO.Code;
attr.Nature = menu.MenuMenuNature;
menuTreeDTO.attr = attr;
MenuTreeDTOs.Add(menuTreeDTO);
}
if (Type == 0)
{
IList TreeTopLevelCategory = TreeHelper.ConvertToTree(MenuTreeDTOs);
return JsonConvert.SerializeObject(TreeTopLevelCategory);
}
else
{
return JsonConvert.SerializeObject(MenuTreeDTOs);
}
}
catch (Exception)
{
throw;
}
}
public async Task GetMenuAdmin(int menuId, LoginDTO LoginDTO, CancellationToken ct)
=> await _MenuDAL.GetMenuAdmin(menuId, LoginDTO).ConfigureAwait(false);
public async Task SaveMenu(MenuAdminDTO dto, LoginDTO LoginDTO, CancellationToken ct)
{
if (dto is null) throw new ArgumentNullException(nameof(dto));
if (string.IsNullOrWhiteSpace(dto.MenuCode)) throw new ArgumentException("MenuCode is required.", nameof(dto));
if (string.IsNullOrWhiteSpace(dto.MenuName)) throw new ArgumentException("MenuName is required.", nameof(dto));
try
{
var now = DateTime.UtcNow;
bool isNew = dto.MenuId <= 0;
GB5Trace.Step("save-menu", new { dto.MenuId, isNew });
dto.ModifiedById = LoginDTO.UserId;
dto.ModifiedOn = now;
if (isNew)
{
var auto = await _autoNumber.GetNumberAsync(1, AUTONUMBERCONSTANT.MENU, LoginDTO).ConfigureAwait(false);
dto.MenuId = auto.StartNumber;
dto.CreatedById = LoginDTO.UserId;
dto.CreatedOn = now;
await _MenuDAL.SaveMenu(dto, LoginDTO).ConfigureAwait(false);
}
else
{
await _MenuDAL.UpdateMenu(dto, LoginDTO).ConfigureAwait(false);
}
return isNew ? $"{SuccessResponse.SaveSuccessMessage} {dto.MenuId}" : SuccessResponse.UpdateSuccess;
}
catch (Exception ex)
{
GB5Trace.MarkFailed("save-menu-failed", ex);
throw;
}
}
public async Task DeleteMenu(int menuId, LoginDTO LoginDTO, CancellationToken ct)
{
try
{
GB5Trace.Step("delete-menu", new { menuId });
await _MenuDAL.DeleteMenu(menuId, LoginDTO).ConfigureAwait(false);
return SuccessResponse.DeleteSuccessMessage;
}
catch (Exception ex)
{
GB5Trace.MarkFailed("delete-menu-failed", ex);
throw;
}
}
}
}