This commit is contained in:
Sedat ÖZTÜRK 2025-10-22 15:16:34 +03:00
parent 3c0971f38f
commit 65af5fa231
15 changed files with 952 additions and 20 deletions

View file

@ -14498,7 +14498,7 @@
"DisplayName": "App.Coordinator.Assignments", "DisplayName": "App.Coordinator.Assignments",
"Order": 4, "Order": 4,
"Url": "/admin/coordinator/assignments", "Url": "/admin/coordinator/assignments",
"Icon": "FcTodoList", "Icon": "FcTodoList",
"RequiredPermissionName": "App.Coordinator.Assignments", "RequiredPermissionName": "App.Coordinator.Assignments",
"IsDisabled": false "IsDisabled": false
}, },
@ -14508,7 +14508,7 @@
"DisplayName": "App.Coordinator.Tests", "DisplayName": "App.Coordinator.Tests",
"Order": 5, "Order": 5,
"Url": "/admin/coordinator/tests", "Url": "/admin/coordinator/tests",
"Icon": "FcCheckmark", "Icon": "FcCheckmark",
"RequiredPermissionName": "App.Coordinator.Tests", "RequiredPermissionName": "App.Coordinator.Tests",
"IsDisabled": false "IsDisabled": false
}, },

View file

@ -33489,15 +33489,6 @@ public class ListFormsSeeder : IDataSeedContributor, ITransientDependency
Value = "true", Value = "true",
CustomValueType = FieldCustomValueTypeEnum.Value } CustomValueType = FieldCustomValueTypeEnum.Value }
}), }),
CommandColumnJson = JsonSerializer.Serialize(new CommandColumnDto[] {
new CommandColumnDto() {
Hint = "Personel Listesi",
Text ="Personel Listesi",
UrlTarget="_blank",
AuthName = AppCodes.Hr.Employee,
Url="/admin/list/list-employees/@Id"
},
}),
} }
); );
@ -35284,6 +35275,654 @@ public class ListFormsSeeder : IDataSeedContributor, ITransientDependency
} }
#endregion #endregion
#region Leave
if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == ListFormCodes.Lists.Leave))
{
var listFormLeave = await _listFormRepository.InsertAsync(
new ListForm()
{
ListFormType = ListFormTypeEnum.List,
IsSubForm = true,
LayoutJson = JsonSerializer.Serialize(new LayoutDto()
{
Grid = true,
Card = true,
Pivot = true,
Chart = true,
DefaultLayout = "grid",
CardLayoutColumn = 3
}),
CultureName = LanguageCodes.En,
ListFormCode = ListFormCodes.Lists.Leave,
Name = AppCodes.Hr.Leave,
Title = AppCodes.Hr.Leave,
DataSourceCode = SeedConsts.DataSources.DefaultCode,
IsTenant = true,
IsBranch = false,
IsOrganizationUnit = false,
Description = AppCodes.Hr.Leave,
SelectCommandType = SelectCommandTypeEnum.Table,
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Leave)),
KeyFieldName = "Id",
KeyFieldDbSourceType = DbType.Guid,
DefaultFilter = "\"IsDeleted\" = 'false'",
SortMode = GridOptions.SortModeSingle,
FilterRowJson = JsonSerializer.Serialize(new GridFilterRowDto { Visible = true }),
HeaderFilterJson = JsonSerializer.Serialize(new { Visible = true }),
SearchPanelJson = JsonSerializer.Serialize(new { Visible = true }),
GroupPanelJson = JsonSerializer.Serialize(new { Visible = true }),
SelectionJson = JsonSerializer.Serialize(new SelectionDto
{
Mode = GridOptions.SelectionModeSingle,
AllowSelectAll = false
}),
ColumnOptionJson = JsonSerializer.Serialize(new
{
ColumnFixingEnabled = true,
ColumnAutoWidth = true,
ColumnChooserEnabled = true,
AllowColumnResizing = true,
AllowColumnReordering = true,
ColumnResizingMode = "widget",
}),
PermissionJson = JsonSerializer.Serialize(new PermissionCrudDto
{
C = AppCodes.Hr.Leave + ".Create",
R = AppCodes.Hr.Leave,
U = AppCodes.Hr.Leave + ".Update",
D = AppCodes.Hr.Leave + ".Delete",
E = AppCodes.Hr.Leave + ".Export",
I = AppCodes.Hr.Leave + ".Import",
A = AppCodes.Hr.Leave + ".Activity",
}),
DeleteCommand = $"UPDATE \"{TableNameResolver.GetFullTableName(nameof(TableNameEnum.Leave))}\" SET \"DeleterId\"=@DeleterId, \"DeletionTime\"=CURRENT_TIMESTAMP, \"IsDeleted\"='true' WHERE \"Id\"=@Id",
DeleteFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] {
new() {
FieldName = "DeleterId",
FieldDbType = DbType.Guid,
Value = "@USERID",
CustomValueType = FieldCustomValueTypeEnum.CustomKey },
new() {
FieldName = "Id",
FieldDbType = DbType.Guid,
Value = "@ID",
CustomValueType = FieldCustomValueTypeEnum.CustomKey }
}),
PagerOptionJson = JsonSerializer.Serialize(new GridPagerOptionDto
{
Visible = true,
AllowedPageSizes = "10,20,50,100",
ShowPageSizeSelector = true,
ShowNavigationButtons = true,
ShowInfo = false,
InfoText = "Page {0} of {1} ({2} items)",
DisplayMode = GridColumnOptions.PagerDisplayModeAdaptive,
ScrollingMode = GridColumnOptions.ScrollingModeStandard,
LoadPanelEnabled = "auto",
LoadPanelText = "Loading..."
}),
EditingOptionJson = JsonSerializer.Serialize(new GridEditingDto
{
Popup = new GridEditingPopupDto()
{
Title = "Leave Form",
Width = 500,
Height = 520
},
AllowDeleting = true,
AllowAdding = true,
AllowUpdating = true,
SendOnlyChangedFormValuesUpdate = false,
}),
InsertFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] {
new() {
FieldName = "CreationTime",
FieldDbType = DbType.DateTime,
Value = "@NOW",
CustomValueType = FieldCustomValueTypeEnum.CustomKey },
new() {
FieldName = "CreatorId",
FieldDbType = DbType.Guid,
Value = "@USERID",
CustomValueType = FieldCustomValueTypeEnum.CustomKey },
new() {
FieldName = "IsDeleted",
FieldDbType = DbType.Boolean,
Value = "false",
CustomValueType = FieldCustomValueTypeEnum.Value }
}),
EditingFormJson = JsonSerializer.Serialize(new List<EditingFormDto>()
{
new() {
Order=1, ColCount=1, ColSpan=2, ItemType="group", Items =
[
new EditingFormItemDto { Order = 1, DataField = "AppliedDate", ColSpan = 2, IsRequired=true, EditorType2 = EditorTypes.dxDateBox},
new EditingFormItemDto { Order = 2, DataField = "EmployeeId", ColSpan = 2, IsRequired = true, EditorType2 = EditorTypes.dxSelectBox },
new EditingFormItemDto { Order = 3, DataField = "LeaveType", ColSpan = 2, IsRequired = true, EditorType2 = EditorTypes.dxSelectBox },
new EditingFormItemDto { Order = 4, DataField = "StartDate", ColSpan = 2, IsRequired=true, EditorType2 = EditorTypes.dxDateBox},
new EditingFormItemDto { Order = 5, DataField = "EndDate", ColSpan = 2, IsRequired=true, EditorType2 = EditorTypes.dxDateBox},
new EditingFormItemDto { Order = 6, DataField = "TotalDays", ColSpan = 2, EditorType2 = EditorTypes.dxNumberBox},
new EditingFormItemDto { Order = 7, DataField = "IsHalfDay", ColSpan = 2, EditorType2 = EditorTypes.dxCheckBox},
new EditingFormItemDto { Order = 8, DataField = "Reason", ColSpan = 2, IsRequired = true, EditorType2 = EditorTypes.dxTextArea},
new EditingFormItemDto { Order = 9, DataField = "Status", ColSpan = 2, IsRequired = true, EditorType2 = EditorTypes.dxSelectBox},
]
}
}),
FormFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] {
new() {
FieldName = "Status",
FieldDbType = DbType.String,
Value = "Pending",
CustomValueType = FieldCustomValueTypeEnum.Value },
new() {
FieldName = "AppliedDate",
FieldDbType = DbType.Date,
Value = "@NOW",
CustomValueType = FieldCustomValueTypeEnum.CustomKey },
new() {
FieldName = "IsHalfDay",
FieldDbType = DbType.Boolean,
Value = "false",
CustomValueType = FieldCustomValueTypeEnum.Value }
}),
CommandColumnJson = JsonSerializer.Serialize(new CommandColumnDto[] {
new() {
ButtonPosition = UiCommandButtonPositionTypeEnum.Toolbar,
Hint = "Toplu İzin",
Text ="Toplu İzin",
AuthName = AppCodes.Hr.Leave + ".Update",
DialogName = "CollectiveLeave",
DialogParameters = JsonSerializer.Serialize(new {
name = "@Name",
id = "@Id"
})
},
new() {
Hint = "Accept",
Text ="Accept",
UrlTarget="_blank",
AuthName = AppCodes.Hr.Leave + ".Update",
Url="/admin/list/list-employees/@Id"
},
new() {
Hint = "Reject",
Text ="Reject",
UrlTarget="_blank",
AuthName = AppCodes.Hr.Leave + ".Update",
Url="/admin/list/list-employees/@Id"
},
}),
}
);
#region Leave Fields
await _listFormFieldRepository.InsertManyAsync([
new() {
ListFormCode = listFormLeave.ListFormCode,
RoleId = null,
UserId = null,
CultureName = LanguageCodes.En,
SourceDbType = DbType.Guid,
FieldName = "Id",
Width = 100,
ListOrderNo = 1,
Visible = false,
IsActive = true,
IsDeleted = false,
SortIndex = 0,
ValidationRuleJson = JsonSerializer.Serialize(new ValidationRuleDto[] {
new ValidationRuleDto() { Type = Enum.GetName(UiColumnValidationRuleTypeEnum.required) }
}),
ColumnCustomizationJson = JsonSerializer.Serialize(new ColumnCustomizationDto
{
AllowReordering = true,
}),
PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto
{
C = AppCodes.Hr.Leave + ".Create",
R = AppCodes.Hr.Leave,
U = AppCodes.Hr.Leave + ".Update",
E = true,
I = true,
Deny = false
}),
PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto
{
IsPivot = true
})
},
new() {
ListFormCode = listFormLeave.ListFormCode,
RoleId = null,
UserId = null,
CultureName = LanguageCodes.En,
SourceDbType = DbType.Guid,
FieldName = "EmployeeId",
Width = 200,
ListOrderNo = 2,
Visible = true,
IsActive = true,
IsDeleted = false,
SortIndex = 0,
ValidationRuleJson = JsonSerializer.Serialize(new ValidationRuleDto[] {
new ValidationRuleDto() { Type = Enum.GetName(UiColumnValidationRuleTypeEnum.required) }
}),
ColumnCustomizationJson = JsonSerializer.Serialize(new ColumnCustomizationDto
{
AllowReordering = true,
}),
LookupJson = JsonSerializer.Serialize(new LookupDto
{
DataSourceType = UiLookupDataSourceTypeEnum.Query,
DisplayExpr = "name",
ValueExpr = "key",
LookupQuery = LookUpQueryValues.EmployeeValues
}),
PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto
{
C = AppCodes.Hr.Leave + ".Create",
R = AppCodes.Hr.Leave,
U = AppCodes.Hr.Leave + ".Update",
E = true,
I = true,
Deny = false
}),
PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto
{
IsPivot = true
})
},
new() {
ListFormCode = listFormLeave.ListFormCode,
RoleId = null,
UserId = null,
CultureName = LanguageCodes.En,
SourceDbType = DbType.String,
FieldName = "LeaveType",
Width = 150,
ListOrderNo = 3,
Visible = true,
IsActive = true,
IsDeleted = false,
AllowSearch = true,
LookupJson = JsonSerializer.Serialize(new LookupDto
{
DataSourceType = UiLookupDataSourceTypeEnum.StaticData,
DisplayExpr = "name",
ValueExpr = "key",
LookupQuery = JsonSerializer.Serialize(new LookupDataDto[] {
new () { Key= "Annual", Name= "ANNUAL" },
new () { Key= "Sick", Name= "SICK" },
new () { Key= "Maternity", Name= "MATERNITY"},
new () { Key= "Paternity", Name= "PATERNITY" },
new () { Key= "Personal", Name= "PERSONAL" },
new () { Key= "Emergency", Name= "EMERGENCY" },
new () { Key= "Study", Name= "STUDY" },
new () { Key= "Unpaid", Name="UNPAID" }
}),
}),
ValidationRuleJson = JsonSerializer.Serialize(new ValidationRuleDto[] {
new ValidationRuleDto() { Type = Enum.GetName(UiColumnValidationRuleTypeEnum.required) }
}),
ColumnCustomizationJson = JsonSerializer.Serialize(new ColumnCustomizationDto
{
AllowReordering = true,
}),
PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto
{
C = AppCodes.Hr.Leave + ".Create",
R = AppCodes.Hr.Leave,
U = AppCodes.Hr.Leave + ".Update",
E = true,
I = true,
Deny = false
}),
PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto
{
IsPivot = true
})
},
new() {
ListFormCode = listFormLeave.ListFormCode,
RoleId = null,
UserId = null,
CultureName = LanguageCodes.En,
SourceDbType = DbType.Date,
FieldName = "StartDate",
Width = 150,
ListOrderNo = 4,
Visible = true,
IsActive = true,
IsDeleted = false,
ValidationRuleJson = JsonSerializer.Serialize(new ValidationRuleDto[] {
new ValidationRuleDto() { Type = Enum.GetName(UiColumnValidationRuleTypeEnum.required) }
}),
ColumnCustomizationJson = JsonSerializer.Serialize(new ColumnCustomizationDto
{
AllowReordering = true,
}),
PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto
{
C = AppCodes.Hr.Leave + ".Create",
R = AppCodes.Hr.Leave,
U = AppCodes.Hr.Leave + ".Update",
E = true,
I = true,
Deny = false
}),
PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto
{
IsPivot = true
})
},
new() {
ListFormCode = listFormLeave.ListFormCode,
RoleId = null,
UserId = null,
CultureName = LanguageCodes.En,
SourceDbType = DbType.Date,
FieldName = "EndDate",
Width = 150,
ListOrderNo = 5,
Visible = true,
IsActive = true,
IsDeleted = false,
AllowSearch = true,
ValidationRuleJson = JsonSerializer.Serialize(new ValidationRuleDto[] {
new ValidationRuleDto() { Type = Enum.GetName(UiColumnValidationRuleTypeEnum.required) }
}),
ColumnCustomizationJson = JsonSerializer.Serialize(new ColumnCustomizationDto
{
AllowReordering = true,
}),
PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto
{
C = AppCodes.Hr.Leave + ".Create",
R = AppCodes.Hr.Leave,
U = AppCodes.Hr.Leave + ".Update",
E = true,
I = true,
Deny = false
}),
PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto
{
IsPivot = true
})
},
new() {
ListFormCode = listFormLeave.ListFormCode,
RoleId = null,
UserId = null,
CultureName = LanguageCodes.En,
SourceDbType = DbType.Int32,
FieldName = "TotalDays",
Width = 100,
ListOrderNo = 6,
Visible = true,
IsActive = true,
IsDeleted = false,
AllowSearch = true,
ValidationRuleJson = JsonSerializer.Serialize(new ValidationRuleDto[] {
new ValidationRuleDto() { Type = Enum.GetName(UiColumnValidationRuleTypeEnum.required) }
}),
ColumnCustomizationJson = JsonSerializer.Serialize(new ColumnCustomizationDto
{
AllowReordering = true,
}),
PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto
{
C = AppCodes.Hr.Leave + ".Create",
R = AppCodes.Hr.Leave,
U = AppCodes.Hr.Leave + ".Update",
E = true,
I = true,
Deny = false
}),
PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto
{
IsPivot = true
})
},
new() {
ListFormCode = listFormLeave.ListFormCode,
RoleId = null,
UserId = null,
CultureName = LanguageCodes.En,
SourceDbType = DbType.Boolean,
FieldName = "IsHalfDay",
Width = 100,
ListOrderNo = 7,
Visible = true,
IsActive = true,
IsDeleted = false,
AllowSearch = true,
ColumnCustomizationJson = JsonSerializer.Serialize(new ColumnCustomizationDto
{
AllowReordering = true,
}),
PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto
{
C = AppCodes.Hr.Leave + ".Create",
R = AppCodes.Hr.Leave,
U = AppCodes.Hr.Leave + ".Update",
E = true,
I = true,
Deny = false
}),
PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto
{
IsPivot = true
})
},
new() {
ListFormCode = listFormLeave.ListFormCode,
RoleId = null,
UserId = null,
CultureName = LanguageCodes.En,
SourceDbType = DbType.String,
FieldName = "Reason",
Width = 250,
ListOrderNo = 8,
Visible = true,
IsActive = true,
IsDeleted = false,
AllowSearch = true,
ValidationRuleJson = JsonSerializer.Serialize(new ValidationRuleDto[] {
new ValidationRuleDto() { Type = Enum.GetName(UiColumnValidationRuleTypeEnum.required) }
}),
ColumnCustomizationJson = JsonSerializer.Serialize(new ColumnCustomizationDto
{
AllowReordering = true,
}),
PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto
{
C = AppCodes.Hr.Leave + ".Create",
R = AppCodes.Hr.Leave,
U = AppCodes.Hr.Leave + ".Update",
E = true,
I = true,
Deny = false
}),
PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto
{
IsPivot = true
})
},
new() {
ListFormCode = listFormLeave.ListFormCode,
RoleId = null,
UserId = null,
CultureName = LanguageCodes.En,
SourceDbType = DbType.String,
FieldName = "Status",
Width = 100,
ListOrderNo = 9,
Visible = true,
IsActive = true,
IsDeleted = false,
AllowSearch = true,
ValidationRuleJson = JsonSerializer.Serialize(new ValidationRuleDto[] {
new ValidationRuleDto() { Type = Enum.GetName(UiColumnValidationRuleTypeEnum.required) }
}),
ColumnCustomizationJson = JsonSerializer.Serialize(new ColumnCustomizationDto
{
AllowReordering = true,
}),
LookupJson = JsonSerializer.Serialize(new LookupDto
{
DataSourceType = UiLookupDataSourceTypeEnum.StaticData,
DisplayExpr = "name",
ValueExpr = "key",
LookupQuery = JsonSerializer.Serialize(new LookupDataDto[] {
new () { Key= "Pending", Name= "PENDING" },
new () { Key= "Approved", Name= "APPROVED" },
new () { Key= "Rejected", Name= "REJECTED"},
new () { Key= "Cancelled", Name= "CANCELLED" },
}),
}),
PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto
{
C = AppCodes.Hr.Leave + ".Create",
R = AppCodes.Hr.Leave,
U = AppCodes.Hr.Leave + ".Update",
E = true,
I = true,
Deny = false
}),
PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto
{
IsPivot = true
})
},
new() {
ListFormCode = listFormLeave.ListFormCode,
RoleId = null,
UserId = null,
CultureName = LanguageCodes.En,
SourceDbType = DbType.Date,
FieldName = "AppliedDate",
Width = 100,
ListOrderNo = 10,
Visible = true,
IsActive = true,
IsDeleted = false,
AllowSearch = true,
ColumnCustomizationJson = JsonSerializer.Serialize(new ColumnCustomizationDto
{
AllowReordering = true,
}),
PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto
{
C = AppCodes.Hr.Leave + ".Create",
R = AppCodes.Hr.Leave,
U = AppCodes.Hr.Leave + ".Update",
E = true,
I = true,
Deny = false
}),
PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto
{
IsPivot = true
})
},
new() {
ListFormCode = listFormLeave.ListFormCode,
RoleId = null,
UserId = null,
CultureName = LanguageCodes.En,
SourceDbType = DbType.String,
FieldName = "ApprovedBy",
Width = 100,
ListOrderNo = 11,
Visible = true,
IsActive = true,
IsDeleted = false,
AllowSearch = true,
ColumnCustomizationJson = JsonSerializer.Serialize(new ColumnCustomizationDto
{
AllowReordering = true,
}),
PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto
{
C = AppCodes.Hr.Leave + ".Create",
R = AppCodes.Hr.Leave,
U = AppCodes.Hr.Leave + ".Update",
E = true,
I = true,
Deny = false
}),
PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto
{
IsPivot = true
})
},
new() {
ListFormCode = listFormLeave.ListFormCode,
RoleId = null,
UserId = null,
CultureName = LanguageCodes.En,
SourceDbType = DbType.Date,
FieldName = "ApprovedDate",
Width = 100,
ListOrderNo = 12,
Visible = true,
IsActive = true,
IsDeleted = false,
AllowSearch = true,
ColumnCustomizationJson = JsonSerializer.Serialize(new ColumnCustomizationDto
{
AllowReordering = true,
}),
PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto
{
C = AppCodes.Hr.Leave + ".Create",
R = AppCodes.Hr.Leave,
U = AppCodes.Hr.Leave + ".Update",
E = true,
I = true,
Deny = false
}),
PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto
{
IsPivot = true
})
},
new() {
ListFormCode = listFormLeave.ListFormCode,
RoleId = null,
UserId = null,
CultureName = LanguageCodes.En,
SourceDbType = DbType.String,
FieldName = "RejectionReason",
Width = 250,
ListOrderNo = 13,
Visible = true,
IsActive = true,
IsDeleted = false,
AllowSearch = true,
ColumnCustomizationJson = JsonSerializer.Serialize(new ColumnCustomizationDto
{
AllowReordering = true,
}),
PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto
{
C = AppCodes.Hr.Leave + ".Create",
R = AppCodes.Hr.Leave,
U = AppCodes.Hr.Leave + ".Update",
E = true,
I = true,
Deny = false
}),
PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto
{
IsPivot = true
})
},
]);
#endregion
}
#endregion
#endregion #endregion
} }
} }

View file

@ -110,5 +110,6 @@ public enum TableNameEnum
Department, Department,
Badge, Badge,
CostCenter, CostCenter,
Employee Employee,
Leave
} }

View file

@ -505,6 +505,7 @@ public static class PlatformConsts
public const string Badge = "list-badge"; public const string Badge = "list-badge";
public const string CostCenter = "list-costcenter"; public const string CostCenter = "list-costcenter";
public const string Employee = "list-employee"; public const string Employee = "list-employee";
public const string Leave = "list-leave";
} }
} }

View file

@ -128,6 +128,7 @@ public static class TableNameResolver
{ nameof(TableNameEnum.Badge), (PlatformConsts.TablePrefix.TenantByName, MenuPrefix.Hr) }, { nameof(TableNameEnum.Badge), (PlatformConsts.TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.CostCenter), (PlatformConsts.TablePrefix.TenantByName, MenuPrefix.Hr) }, { nameof(TableNameEnum.CostCenter), (PlatformConsts.TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.Employee), (PlatformConsts.TablePrefix.TenantByName, MenuPrefix.Hr) }, { nameof(TableNameEnum.Employee), (PlatformConsts.TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.Leave), (PlatformConsts.TablePrefix.TenantByName, MenuPrefix.Hr) },
// 🔹 ACCOUNTING // 🔹 ACCOUNTING
{ nameof(TableNameEnum.Bank), (PlatformConsts.TablePrefix.TenantByName, MenuPrefix.Accounting) }, { nameof(TableNameEnum.Bank), (PlatformConsts.TablePrefix.TenantByName, MenuPrefix.Accounting) },

View file

@ -457,6 +457,11 @@ public static class SeedConsts
public const string EmploymentType = Default + ".EmploymentType"; public const string EmploymentType = Default + ".EmploymentType";
public const string Badge = Default + ".Badge"; public const string Badge = Default + ".Badge";
public const string CostCenter = Default + ".CostCenter"; public const string CostCenter = Default + ".CostCenter";
public const string Leave = Default + ".Leave";
public const string Overtime = Default + ".Overtime";
public const string Payrool = Default + ".Payrool";
public const string Template360 = Default + ".Template360";
public const string Evulation360 = Default + ".Evulation360";
} }
public static class Accounting public static class Accounting

View file

@ -0,0 +1,25 @@
// Domain/Entities/HrLeave.cs
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
namespace Kurs.Platform.Entities;
public class Leave : FullAuditedEntity<Guid>, IMultiTenant
{
public Guid? TenantId { get; set; }
public Guid EmployeeId { get; set; }
public string LeaveType { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public double TotalDays { get; set; }
public bool IsHalfDay { get; set; }
public string? Reason { get; set; }
public string Status { get; set; }
public DateTime AppliedDate { get; set; }
public string? ApprovedBy { get; set; }
public DateTime? ApprovedDate { get; set; }
public string? RejectionReason { get; set; }
public string? Attachments { get; set; } // JSON string (from string[])
}

View file

@ -1,5 +1,6 @@
using System; using System;
using System.Data; using System.Data;
using System.Globalization;
using System.Linq; using System.Linq;
using System.Text.Json; using System.Text.Json;
@ -57,12 +58,24 @@ public class QueryHelper
case DbType.DateTime: case DbType.DateTime:
case DbType.DateTime2: case DbType.DateTime2:
case DbType.DateTimeOffset: case DbType.DateTimeOffset:
//"2025-01-03" var dateTimeValues = values.Select(a =>
// var dateValues = values.Select(a => DateTimeOffset.ParseExact(a.ToString(), "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToUniversalTime()).ToArray(); {
// value = isArray ? dateValues : dateValues[0]; if (a == null) return (DateTimeOffset?)null;
// break;
//"2025-01-03T11:58:00+03:00" var s = a as string ?? a.ToString();
var dateTimeValues = values.Select(a => DateTimeOffset.Parse(a.ToString()).ToUniversalTime()).ToArray(); if (string.IsNullOrWhiteSpace(s)) return (DateTimeOffset?)null;
// İlk olarak TryParseExact ile kısa format "yyyy-MM-dd" kontrolü
if (DateTimeOffset.TryParseExact(s, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var dto))
return dto.ToUniversalTime();
// Genel parse denemesi
if (DateTimeOffset.TryParse(s, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out dto))
return dto.ToUniversalTime();
// Başarısızsa null dön
return (DateTimeOffset?)null;
}).ToArray();
value = isArray ? dateTimeValues : dateTimeValues[0]; value = isArray ? dateTimeValues : dateTimeValues[0];
break; break;
case DbType.Int16: case DbType.Int16:

View file

@ -1773,8 +1773,23 @@ public class PlatformDbContext :
.HasForeignKey(x => x.BankAccountId) .HasForeignKey(x => x.BankAccountId)
.OnDelete(DeleteBehavior.Restrict) .OnDelete(DeleteBehavior.Restrict)
.IsRequired(false); .IsRequired(false);
});
// b.HasOne(x => x.WorkSchedule).WithMany().HasForeignKey(x => x.WorkScheduleId); builder.Entity<Leave>(b =>
{
b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.Leave)), Prefix.DbSchema);
b.ConfigureByConvention();
b.Property(x => x.EmployeeId).IsRequired().HasMaxLength(20);
b.Property(x => x.LeaveType).IsRequired();
b.Property(x => x.StartDate).IsRequired();
b.Property(x => x.EndDate).IsRequired();
b.Property(x => x.TotalDays).IsRequired();
b.Property(x => x.Reason).HasMaxLength(500);
b.Property(x => x.Status).IsRequired().HasMaxLength(20);
b.Property(x => x.RejectionReason).HasMaxLength(500);
b.Property(x => x.ApprovedBy).HasMaxLength(100);
b.Property(x => x.Attachments).HasMaxLength(2000);
}); });
} }
} }

View file

@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore;
namespace Kurs.Platform.Migrations namespace Kurs.Platform.Migrations
{ {
[DbContext(typeof(PlatformDbContext))] [DbContext(typeof(PlatformDbContext))]
[Migration("20251022080448_Initial")] [Migration("20251022102859_Initial")]
partial class Initial partial class Initial
{ {
/// <inheritdoc /> /// <inheritdoc />
@ -4243,6 +4243,98 @@ namespace Kurs.Platform.Migrations
b.ToTable("T_Adm_Lawyer", (string)null); b.ToTable("T_Adm_Lawyer", (string)null);
}); });
modelBuilder.Entity("Kurs.Platform.Entities.Leave", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("AppliedDate")
.HasColumnType("datetime2");
b.Property<string>("ApprovedBy")
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<DateTime?>("ApprovedDate")
.HasColumnType("datetime2");
b.Property<string>("Attachments")
.HasMaxLength(2000)
.HasColumnType("nvarchar(2000)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<Guid>("EmployeeId")
.HasMaxLength(20)
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("EndDate")
.HasColumnType("datetime2");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<bool>("IsHalfDay")
.HasColumnType("bit");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("LeaveType")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Reason")
.HasMaxLength(500)
.HasColumnType("nvarchar(500)");
b.Property<string>("RejectionReason")
.HasMaxLength(500)
.HasColumnType("nvarchar(500)");
b.Property<DateTime>("StartDate")
.HasColumnType("datetime2");
b.Property<string>("Status")
.IsRequired()
.HasMaxLength(20)
.HasColumnType("nvarchar(20)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<double>("TotalDays")
.HasColumnType("float");
b.HasKey("Id");
b.ToTable("T_Hr_Leave", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.LessonPeriod", b => modelBuilder.Entity("Kurs.Platform.Entities.LessonPeriod", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")

View file

@ -1798,6 +1798,38 @@ namespace Kurs.Platform.Migrations
table.PrimaryKey("PK_T_Hr_EmploymentType", x => x.Id); table.PrimaryKey("PK_T_Hr_EmploymentType", x => x.Id);
}); });
migrationBuilder.CreateTable(
name: "T_Hr_Leave",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
EmployeeId = table.Column<Guid>(type: "uniqueidentifier", maxLength: 20, nullable: false),
LeaveType = table.Column<string>(type: "nvarchar(max)", nullable: false),
StartDate = table.Column<DateTime>(type: "datetime2", nullable: false),
EndDate = table.Column<DateTime>(type: "datetime2", nullable: false),
TotalDays = table.Column<double>(type: "float", nullable: false),
IsHalfDay = table.Column<bool>(type: "bit", nullable: false),
Reason = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: true),
Status = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: false),
AppliedDate = table.Column<DateTime>(type: "datetime2", nullable: false),
ApprovedBy = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: true),
ApprovedDate = table.Column<DateTime>(type: "datetime2", nullable: true),
RejectionReason = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: true),
Attachments = table.Column<string>(type: "nvarchar(2000)", maxLength: 2000, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_T_Hr_Leave", x => x.Id);
});
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "T_P_Activity", name: "T_P_Activity",
columns: table => new columns: table => new
@ -4887,6 +4919,9 @@ namespace Kurs.Platform.Migrations
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "T_Crd_QuestionTag"); name: "T_Crd_QuestionTag");
migrationBuilder.DropTable(
name: "T_Hr_Leave");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "T_P_Activity"); name: "T_P_Activity");

View file

@ -4240,6 +4240,98 @@ namespace Kurs.Platform.Migrations
b.ToTable("T_Adm_Lawyer", (string)null); b.ToTable("T_Adm_Lawyer", (string)null);
}); });
modelBuilder.Entity("Kurs.Platform.Entities.Leave", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("AppliedDate")
.HasColumnType("datetime2");
b.Property<string>("ApprovedBy")
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<DateTime?>("ApprovedDate")
.HasColumnType("datetime2");
b.Property<string>("Attachments")
.HasMaxLength(2000)
.HasColumnType("nvarchar(2000)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<Guid>("EmployeeId")
.HasMaxLength(20)
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("EndDate")
.HasColumnType("datetime2");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<bool>("IsHalfDay")
.HasColumnType("bit");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("LeaveType")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Reason")
.HasMaxLength(500)
.HasColumnType("nvarchar(500)");
b.Property<string>("RejectionReason")
.HasMaxLength(500)
.HasColumnType("nvarchar(500)");
b.Property<DateTime>("StartDate")
.HasColumnType("datetime2");
b.Property<string>("Status")
.IsRequired()
.HasMaxLength(20)
.HasColumnType("nvarchar(20)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<double>("TotalDays")
.HasColumnType("float");
b.HasKey("Id");
b.ToTable("T_Hr_Leave", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.LessonPeriod", b => modelBuilder.Entity("Kurs.Platform.Entities.LessonPeriod", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")

View file

@ -299,6 +299,9 @@ function JsonRowOpDialogEditForm({
"• setFormData({ ...formData, Path: (v => v === '1' ? '1-deneme' : v === '0' ? '0-deneme' : '')(e.value) })" "• setFormData({ ...formData, Path: (v => v === '1' ? '1-deneme' : v === '0' ? '0-deneme' : '')(e.value) })"
} }
</pre> </pre>
<pre>
{`• (() => {const d=v=>!v?null:(v instanceof Date?v:new Date(v));const nf={...formData,[editor.dataField]:e?.value};const s=d(nf.StartDate),t=d(nf.EndDate);setFormData({...formData,TotalDays: s&&t?Math.max(0,Math.floor((Date.UTC(t.getFullYear(),t.getMonth(),t.getDate())-Date.UTC(s.getFullYear(),s.getMonth(),s.getDate()))/(24*60*60*1000))+1):null});})(); `}
</pre>
</div> </div>
</div> </div>

View file

@ -718,6 +718,8 @@ const Grid = (props: GridProps) => {
.flatMap((group) => group.items || []) .flatMap((group) => group.items || [])
.find((i) => i.dataField === editor.dataField) .find((i) => i.dataField === editor.dataField)
console.log(formItem?.dataField, formItem?.script)
if (formItem?.script) { if (formItem?.script) {
const prevHandler = editor.editorOptions.onValueChanged // varsa önceki handler'ı sakla const prevHandler = editor.editorOptions.onValueChanged // varsa önceki handler'ı sakla

View file

@ -75,6 +75,14 @@ const DialogShowComponent = (): JSX.Element => {
{...dialogContext.config?.props} {...dialogContext.config?.props}
></QuestionDialog> ></QuestionDialog>
) )
case 'CollectiveLeave':
return (
<QuestionDialog
open={true}
onDialogClose={handleDialogClose}
{...dialogContext.config?.props}
></QuestionDialog>
)
default: default:
return <></> return <></>
} }