Added new status and change expesne status from tenant scop to system scope

This commit is contained in:
ashutosh.nehete 2025-07-30 12:24:19 +05:30
parent 388979ef82
commit d28f37714f
19 changed files with 5018 additions and 416 deletions

View File

@ -397,8 +397,7 @@ namespace Marco.Pms.DataAccess.Data
Description = "Expense has been created but not yet submitted.",
Color = "#8592a3",
IsSystem = true,
IsActive = true,
TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")
IsActive = true
},
new ExpensesStatusMaster
{
@ -408,8 +407,17 @@ namespace Marco.Pms.DataAccess.Data
Description = "Reviewer is currently reviewing the expense.",
Color = "#696cff",
IsSystem = true,
IsActive = true,
TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")
IsActive = true
},
new ExpensesStatusMaster
{
Id = Guid.Parse("965eda62-7907-4963-b4a1-657fb0b2724b"),
Name = "Rejected by Reviewer",
DisplayName = "Reject",
Description = "Expense was declined, often with a reason(review rejected).",
Color = "#ff3e1d",
IsSystem = true,
IsActive = true
},
new ExpensesStatusMaster
{
@ -419,19 +427,17 @@ namespace Marco.Pms.DataAccess.Data
Description = "Review is completed, waiting for action of approver.",
Color = "#03c3ec",
IsSystem = true,
IsActive = true,
TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")
IsActive = true
},
new ExpensesStatusMaster
{
Id = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"),
Name = "Rejected",
Name = "Rejected by Approver",
DisplayName = "Reject",
Description = "Expense was declined, often with a reason(either review rejected or approval rejected.",
Description = "Expense was declined, often with a reason(approval rejected).",
Color = "#ff3e1d",
IsSystem = true,
IsActive = true,
TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")
IsActive = true
},
new ExpensesStatusMaster
{
@ -441,19 +447,17 @@ namespace Marco.Pms.DataAccess.Data
Description = "Approved expense is awaiting final payment.",
Color = "#ffab00",
IsSystem = true,
IsActive = true,
TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")
IsActive = true
},
new ExpensesStatusMaster
{
Id = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95"),
Name = "Paid",
DisplayName = "Mark as Paid",
Name = "Processed",
DisplayName = "Mark as Processed",
Description = "Expense has been settled.",
Color = "#71dd37",
IsSystem = true,
IsActive = true,
TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")
IsActive = true
}
);
@ -463,99 +467,108 @@ namespace Marco.Pms.DataAccess.Data
{
Id = Guid.Parse("5cf7f1df-9d1f-4289-add0-1775ad614f25"),
StatusId = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27"),
NextStatusId = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95"),
TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")
NextStatusId = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95")
},
// Approve to Rejected
// Rejected by Approver to Review
new ExpensesStatusMapping
{
Id = Guid.Parse("4ddddc10-0ffd-4884-accf-d4fa0bd97f54"),
StatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"),
NextStatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7")
},
// Approve to Rejected by Approver
new ExpensesStatusMapping
{
Id = Guid.Parse("36c00548-241c-43ec-bc95-cacebedb925c"),
StatusId = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"),
NextStatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"),
TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")
NextStatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729")
},
// Approve to Process
new ExpensesStatusMapping
{
Id = Guid.Parse("1fca1700-1266-477d-bba4-9ac3753aa33c"),
StatusId = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"),
NextStatusId = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27"),
TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")
NextStatusId = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27")
},
// Rejected to Review
// Rejected by Reviewer to Review
new ExpensesStatusMapping
{
Id = Guid.Parse("75bbda6a-6a53-47d1-ad71-5f5f9446a11e"),
StatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"),
NextStatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"),
TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")
Id = Guid.Parse("9e2ec648-1ca2-4747-9329-e911b18edb3e"),
StatusId = Guid.Parse("965eda62-7907-4963-b4a1-657fb0b2724b"),
NextStatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7")
},
// Review to Rejected
// Review to Rejected by Reviewer
new ExpensesStatusMapping
{
Id = Guid.Parse("fddaaf20-4ccc-4f4e-a724-dd310272b356"),
Id = Guid.Parse("6b867bec-66e6-42a7-9611-f4595af9b9ce"),
StatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"),
NextStatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"),
TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")
NextStatusId = Guid.Parse("965eda62-7907-4963-b4a1-657fb0b2724b")
},
// Review to Aprrove
new ExpensesStatusMapping
{
Id = Guid.Parse("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"),
StatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"),
NextStatusId = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"),
TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")
NextStatusId = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8")
},
// Draft to Review
new ExpensesStatusMapping
{
Id = Guid.Parse("af1e4492-98ee-4451-8ab7-fd8323f29c32"),
StatusId = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8"),
NextStatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"),
TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")
NextStatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7")
}
);
modelBuilder.Entity<StatusPermissionMapping>().HasData(
// Draft Permission Mapping
new StatusPermissionMapping
{
Id = Guid.Parse("722b0c3c-5a78-456d-b9bb-b6ba1b21d59b"),
PermissionId = Guid.Parse("0f57885d-bcb2-4711-ac95-d841ace6d5a7"),
StatusId = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8")
},
// Review Permission Mapping
new StatusPermissionMapping
{
Id = Guid.Parse("7deb0945-e1c9-411f-8b3c-c9bdbe3c3c2d"),
PermissionId = Guid.Parse("0f57885d-bcb2-4711-ac95-d841ace6d5a7"),
StatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7")
},
// Rejected by Reviewer Permission Mapping
new StatusPermissionMapping
{
Id = Guid.Parse("9e2ec648-1ca2-4747-9329-e911b18edb3e"),
PermissionId = Guid.Parse("1f4bda08-1873-449a-bb66-3e8222bd871b"),
StatusId = Guid.Parse("965eda62-7907-4963-b4a1-657fb0b2724b")
},
// Approval Pending Permission Mapping
new StatusPermissionMapping
{
Id = Guid.Parse("ed893799-1a5f-4311-a077-de93c86ca8fd"),
Id = Guid.Parse("0b7926fc-a34b-4a5b-8c7d-1003480cf0fa"),
PermissionId = Guid.Parse("1f4bda08-1873-449a-bb66-3e8222bd871b"),
StatusId = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"),
TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")
},
// Rejected Permission Mapping
new StatusPermissionMapping
{
Id = Guid.Parse("4652d73f-fc71-4fe1-9f2f-1e48b342d741"),
PermissionId = Guid.Parse("1f4bda08-1873-449a-bb66-3e8222bd871b"),
StatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"),
TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")
StatusId = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8")
},
// Rejected by Approver Permission Mapping
new StatusPermissionMapping
{
Id = Guid.Parse("cd15f9b9-be45-4deb-9c71-2f23f872dbcd"),
PermissionId = Guid.Parse("eaafdd76-8aac-45f9-a530-315589c6deca"),
StatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"),
TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")
StatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729")
},
// Process Pending Permission Mapping
// Payment Pending Permission Mapping
new StatusPermissionMapping
{
Id = Guid.Parse("f6f26b2f-2fa6-40b7-8601-cbd4bcdda0cc"),
PermissionId = Guid.Parse("eaafdd76-8aac-45f9-a530-315589c6deca"),
StatusId = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27"),
TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")
StatusId = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27")
},
// Processed Permission Mapping
new StatusPermissionMapping
{
Id = Guid.Parse("214354e5-daad-4569-ad69-eb5bf4e87fbc"),
PermissionId = Guid.Parse("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"),
StatusId = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95"),
TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")
StatusId = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95")
});
modelBuilder.Entity<ExpensesTypeMaster>().HasData(

View File

@ -0,0 +1,437 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional
namespace Marco.Pms.DataAccess.Migrations
{
/// <inheritdoc />
public partial class Change_ExpenseStatus_To_Be_System_Scope : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_ExpensesStatusMapping_Tenants_TenantId",
table: "ExpensesStatusMapping");
migrationBuilder.DropForeignKey(
name: "FK_ExpensesStatusMaster_Tenants_TenantId",
table: "ExpensesStatusMaster");
migrationBuilder.DropForeignKey(
name: "FK_StatusPermissionMapping_Tenants_TenantId",
table: "StatusPermissionMapping");
migrationBuilder.DropIndex(
name: "IX_StatusPermissionMapping_TenantId",
table: "StatusPermissionMapping");
migrationBuilder.DropIndex(
name: "IX_ExpensesStatusMaster_TenantId",
table: "ExpensesStatusMaster");
migrationBuilder.DropIndex(
name: "IX_ExpensesStatusMapping_TenantId",
table: "ExpensesStatusMapping");
migrationBuilder.DeleteData(
table: "ExpensesStatusMapping",
keyColumn: "Id",
keyValue: new Guid("75bbda6a-6a53-47d1-ad71-5f5f9446a11e"));
migrationBuilder.DeleteData(
table: "ExpensesStatusMapping",
keyColumn: "Id",
keyValue: new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"));
migrationBuilder.DeleteData(
table: "StatusPermissionMapping",
keyColumn: "Id",
keyValue: new Guid("4652d73f-fc71-4fe1-9f2f-1e48b342d741"));
migrationBuilder.DeleteData(
table: "StatusPermissionMapping",
keyColumn: "Id",
keyValue: new Guid("ed893799-1a5f-4311-a077-de93c86ca8fd"));
migrationBuilder.DropColumn(
name: "TenantId",
table: "StatusPermissionMapping");
migrationBuilder.DropColumn(
name: "TenantId",
table: "ExpensesStatusMaster");
migrationBuilder.DropColumn(
name: "TenantId",
table: "ExpensesStatusMapping");
migrationBuilder.AddColumn<Guid>(
name: "ApprovedById",
table: "Expenses",
type: "char(36)",
nullable: true,
collation: "ascii_general_ci");
migrationBuilder.AddColumn<Guid>(
name: "ProcessedById",
table: "Expenses",
type: "char(36)",
nullable: true,
collation: "ascii_general_ci");
migrationBuilder.AddColumn<Guid>(
name: "ReviewedById",
table: "Expenses",
type: "char(36)",
nullable: true,
collation: "ascii_general_ci");
migrationBuilder.InsertData(
table: "ExpensesStatusMapping",
columns: new[] { "Id", "NextStatusId", "StatusId" },
values: new object[] { new Guid("4ddddc10-0ffd-4884-accf-d4fa0bd97f54"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") });
migrationBuilder.UpdateData(
table: "ExpensesStatusMaster",
keyColumn: "Id",
keyValue: new Guid("61578360-3a49-4c34-8604-7b35a3787b95"),
columns: new[] { "DisplayName", "Name" },
values: new object[] { "Mark as Processed", "Processed" });
migrationBuilder.UpdateData(
table: "ExpensesStatusMaster",
keyColumn: "Id",
keyValue: new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"),
columns: new[] { "Description", "Name" },
values: new object[] { "Expense was declined, often with a reason(approval rejected).", "Rejected by Approver" });
migrationBuilder.InsertData(
table: "ExpensesStatusMaster",
columns: new[] { "Id", "Color", "Description", "DisplayName", "IsActive", "IsSystem", "Name" },
values: new object[] { new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), "#ff3e1d", "Expense was declined, often with a reason(review rejected).", "Reject", true, true, "Rejected by Reviewer" });
migrationBuilder.InsertData(
table: "StatusPermissionMapping",
columns: new[] { "Id", "PermissionId", "StatusId" },
values: new object[,]
{
{ new Guid("0b7926fc-a34b-4a5b-8c7d-1003480cf0fa"), new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") },
{ new Guid("722b0c3c-5a78-456d-b9bb-b6ba1b21d59b"), new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") },
{ new Guid("7deb0945-e1c9-411f-8b3c-c9bdbe3c3c2d"), new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") }
});
migrationBuilder.InsertData(
table: "ExpensesStatusMapping",
columns: new[] { "Id", "NextStatusId", "StatusId" },
values: new object[,]
{
{ new Guid("6b867bec-66e6-42a7-9611-f4595af9b9ce"), new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") },
{ new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") }
});
migrationBuilder.InsertData(
table: "StatusPermissionMapping",
columns: new[] { "Id", "PermissionId", "StatusId" },
values: new object[] { new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") });
migrationBuilder.CreateIndex(
name: "IX_Expenses_ApprovedById",
table: "Expenses",
column: "ApprovedById");
migrationBuilder.CreateIndex(
name: "IX_Expenses_ProcessedById",
table: "Expenses",
column: "ProcessedById");
migrationBuilder.CreateIndex(
name: "IX_Expenses_ReviewedById",
table: "Expenses",
column: "ReviewedById");
migrationBuilder.AddForeignKey(
name: "FK_Expenses_Employees_ApprovedById",
table: "Expenses",
column: "ApprovedById",
principalTable: "Employees",
principalColumn: "Id");
migrationBuilder.AddForeignKey(
name: "FK_Expenses_Employees_ProcessedById",
table: "Expenses",
column: "ProcessedById",
principalTable: "Employees",
principalColumn: "Id");
migrationBuilder.AddForeignKey(
name: "FK_Expenses_Employees_ReviewedById",
table: "Expenses",
column: "ReviewedById",
principalTable: "Employees",
principalColumn: "Id");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Expenses_Employees_ApprovedById",
table: "Expenses");
migrationBuilder.DropForeignKey(
name: "FK_Expenses_Employees_ProcessedById",
table: "Expenses");
migrationBuilder.DropForeignKey(
name: "FK_Expenses_Employees_ReviewedById",
table: "Expenses");
migrationBuilder.DropIndex(
name: "IX_Expenses_ApprovedById",
table: "Expenses");
migrationBuilder.DropIndex(
name: "IX_Expenses_ProcessedById",
table: "Expenses");
migrationBuilder.DropIndex(
name: "IX_Expenses_ReviewedById",
table: "Expenses");
migrationBuilder.DeleteData(
table: "ExpensesStatusMapping",
keyColumn: "Id",
keyValue: new Guid("4ddddc10-0ffd-4884-accf-d4fa0bd97f54"));
migrationBuilder.DeleteData(
table: "ExpensesStatusMapping",
keyColumn: "Id",
keyValue: new Guid("6b867bec-66e6-42a7-9611-f4595af9b9ce"));
migrationBuilder.DeleteData(
table: "ExpensesStatusMapping",
keyColumn: "Id",
keyValue: new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"));
migrationBuilder.DeleteData(
table: "StatusPermissionMapping",
keyColumn: "Id",
keyValue: new Guid("0b7926fc-a34b-4a5b-8c7d-1003480cf0fa"));
migrationBuilder.DeleteData(
table: "StatusPermissionMapping",
keyColumn: "Id",
keyValue: new Guid("722b0c3c-5a78-456d-b9bb-b6ba1b21d59b"));
migrationBuilder.DeleteData(
table: "StatusPermissionMapping",
keyColumn: "Id",
keyValue: new Guid("7deb0945-e1c9-411f-8b3c-c9bdbe3c3c2d"));
migrationBuilder.DeleteData(
table: "StatusPermissionMapping",
keyColumn: "Id",
keyValue: new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"));
migrationBuilder.DeleteData(
table: "ExpensesStatusMaster",
keyColumn: "Id",
keyValue: new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"));
migrationBuilder.DropColumn(
name: "ApprovedById",
table: "Expenses");
migrationBuilder.DropColumn(
name: "ProcessedById",
table: "Expenses");
migrationBuilder.DropColumn(
name: "ReviewedById",
table: "Expenses");
migrationBuilder.AddColumn<Guid>(
name: "TenantId",
table: "StatusPermissionMapping",
type: "char(36)",
nullable: false,
defaultValue: new Guid("00000000-0000-0000-0000-000000000000"),
collation: "ascii_general_ci");
migrationBuilder.AddColumn<Guid>(
name: "TenantId",
table: "ExpensesStatusMaster",
type: "char(36)",
nullable: false,
defaultValue: new Guid("00000000-0000-0000-0000-000000000000"),
collation: "ascii_general_ci");
migrationBuilder.AddColumn<Guid>(
name: "TenantId",
table: "ExpensesStatusMapping",
type: "char(36)",
nullable: false,
defaultValue: new Guid("00000000-0000-0000-0000-000000000000"),
collation: "ascii_general_ci");
migrationBuilder.UpdateData(
table: "ExpensesStatusMapping",
keyColumn: "Id",
keyValue: new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"),
column: "TenantId",
value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26"));
migrationBuilder.UpdateData(
table: "ExpensesStatusMapping",
keyColumn: "Id",
keyValue: new Guid("36c00548-241c-43ec-bc95-cacebedb925c"),
column: "TenantId",
value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26"));
migrationBuilder.UpdateData(
table: "ExpensesStatusMapping",
keyColumn: "Id",
keyValue: new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"),
column: "TenantId",
value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26"));
migrationBuilder.UpdateData(
table: "ExpensesStatusMapping",
keyColumn: "Id",
keyValue: new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"),
column: "TenantId",
value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26"));
migrationBuilder.UpdateData(
table: "ExpensesStatusMapping",
keyColumn: "Id",
keyValue: new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"),
column: "TenantId",
value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26"));
migrationBuilder.InsertData(
table: "ExpensesStatusMapping",
columns: new[] { "Id", "NextStatusId", "StatusId", "TenantId" },
values: new object[,]
{
{ new Guid("75bbda6a-6a53-47d1-ad71-5f5f9446a11e"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") },
{ new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }
});
migrationBuilder.UpdateData(
table: "ExpensesStatusMaster",
keyColumn: "Id",
keyValue: new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"),
column: "TenantId",
value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26"));
migrationBuilder.UpdateData(
table: "ExpensesStatusMaster",
keyColumn: "Id",
keyValue: new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"),
column: "TenantId",
value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26"));
migrationBuilder.UpdateData(
table: "ExpensesStatusMaster",
keyColumn: "Id",
keyValue: new Guid("61578360-3a49-4c34-8604-7b35a3787b95"),
columns: new[] { "DisplayName", "Name", "TenantId" },
values: new object[] { "Mark as Paid", "Paid", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") });
migrationBuilder.UpdateData(
table: "ExpensesStatusMaster",
keyColumn: "Id",
keyValue: new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"),
column: "TenantId",
value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26"));
migrationBuilder.UpdateData(
table: "ExpensesStatusMaster",
keyColumn: "Id",
keyValue: new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"),
columns: new[] { "Description", "Name", "TenantId" },
values: new object[] { "Expense was declined, often with a reason(either review rejected or approval rejected.", "Rejected", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") });
migrationBuilder.UpdateData(
table: "ExpensesStatusMaster",
keyColumn: "Id",
keyValue: new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"),
column: "TenantId",
value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26"));
migrationBuilder.UpdateData(
table: "StatusPermissionMapping",
keyColumn: "Id",
keyValue: new Guid("214354e5-daad-4569-ad69-eb5bf4e87fbc"),
column: "TenantId",
value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26"));
migrationBuilder.UpdateData(
table: "StatusPermissionMapping",
keyColumn: "Id",
keyValue: new Guid("cd15f9b9-be45-4deb-9c71-2f23f872dbcd"),
column: "TenantId",
value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26"));
migrationBuilder.UpdateData(
table: "StatusPermissionMapping",
keyColumn: "Id",
keyValue: new Guid("f6f26b2f-2fa6-40b7-8601-cbd4bcdda0cc"),
column: "TenantId",
value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26"));
migrationBuilder.InsertData(
table: "StatusPermissionMapping",
columns: new[] { "Id", "PermissionId", "StatusId", "TenantId" },
values: new object[,]
{
{ new Guid("4652d73f-fc71-4fe1-9f2f-1e48b342d741"), new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") },
{ new Guid("ed893799-1a5f-4311-a077-de93c86ca8fd"), new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }
});
migrationBuilder.CreateIndex(
name: "IX_StatusPermissionMapping_TenantId",
table: "StatusPermissionMapping",
column: "TenantId");
migrationBuilder.CreateIndex(
name: "IX_ExpensesStatusMaster_TenantId",
table: "ExpensesStatusMaster",
column: "TenantId");
migrationBuilder.CreateIndex(
name: "IX_ExpensesStatusMapping_TenantId",
table: "ExpensesStatusMapping",
column: "TenantId");
migrationBuilder.AddForeignKey(
name: "FK_ExpensesStatusMapping_Tenants_TenantId",
table: "ExpensesStatusMapping",
column: "TenantId",
principalTable: "Tenants",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "FK_ExpensesStatusMaster_Tenants_TenantId",
table: "ExpensesStatusMaster",
column: "TenantId",
principalTable: "Tenants",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "FK_StatusPermissionMapping_Tenants_TenantId",
table: "StatusPermissionMapping",
column: "TenantId",
principalTable: "Tenants",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
}
}

View File

@ -1330,6 +1330,9 @@ namespace Marco.Pms.DataAccess.Migrations
b.Property<double>("Amount")
.HasColumnType("double");
b.Property<Guid?>("ApprovedById")
.HasColumnType("char(36)");
b.Property<DateTime>("CreatedAt")
.HasColumnType("datetime(6)");
@ -1364,9 +1367,15 @@ namespace Marco.Pms.DataAccess.Migrations
b.Property<bool>("PreApproved")
.HasColumnType("tinyint(1)");
b.Property<Guid?>("ProcessedById")
.HasColumnType("char(36)");
b.Property<Guid>("ProjectId")
.HasColumnType("char(36)");
b.Property<Guid?>("ReviewedById")
.HasColumnType("char(36)");
b.Property<Guid>("StatusId")
.HasColumnType("char(36)");
@ -1385,6 +1394,8 @@ namespace Marco.Pms.DataAccess.Migrations
b.HasKey("Id");
b.HasIndex("ApprovedById");
b.HasIndex("CreatedById");
b.HasIndex("ExpensesTypeId");
@ -1393,8 +1404,12 @@ namespace Marco.Pms.DataAccess.Migrations
b.HasIndex("PaymentModeId");
b.HasIndex("ProcessedById");
b.HasIndex("ProjectId");
b.HasIndex("ReviewedById");
b.HasIndex("StatusId");
b.HasIndex("TenantId");
@ -1472,17 +1487,12 @@ namespace Marco.Pms.DataAccess.Migrations
b.Property<Guid>("StatusId")
.HasColumnType("char(36)");
b.Property<Guid>("TenantId")
.HasColumnType("char(36)");
b.HasKey("Id");
b.HasIndex("NextStatusId");
b.HasIndex("StatusId");
b.HasIndex("TenantId");
b.ToTable("ExpensesStatusMapping");
b.HasData(
@ -1490,50 +1500,49 @@ namespace Marco.Pms.DataAccess.Migrations
{
Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"),
NextStatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"),
StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"),
TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26")
StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27")
},
new
{
Id = new Guid("4ddddc10-0ffd-4884-accf-d4fa0bd97f54"),
NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"),
StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729")
},
new
{
Id = new Guid("36c00548-241c-43ec-bc95-cacebedb925c"),
NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"),
StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"),
TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26")
StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8")
},
new
{
Id = new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"),
NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"),
StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"),
TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26")
StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8")
},
new
{
Id = new Guid("75bbda6a-6a53-47d1-ad71-5f5f9446a11e"),
Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"),
NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"),
StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"),
TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26")
StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b")
},
new
{
Id = new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"),
NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"),
StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"),
TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26")
Id = new Guid("6b867bec-66e6-42a7-9611-f4595af9b9ce"),
NextStatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"),
StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7")
},
new
{
Id = new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"),
NextStatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"),
StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"),
TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26")
StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7")
},
new
{
Id = new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"),
NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"),
StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"),
TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26")
StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8")
});
});
@ -1549,54 +1558,56 @@ namespace Marco.Pms.DataAccess.Migrations
b.Property<Guid>("StatusId")
.HasColumnType("char(36)");
b.Property<Guid>("TenantId")
.HasColumnType("char(36)");
b.HasKey("Id");
b.HasIndex("PermissionId");
b.HasIndex("StatusId");
b.HasIndex("TenantId");
b.ToTable("StatusPermissionMapping");
b.HasData(
new
{
Id = new Guid("ed893799-1a5f-4311-a077-de93c86ca8fd"),
PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"),
StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"),
TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26")
Id = new Guid("722b0c3c-5a78-456d-b9bb-b6ba1b21d59b"),
PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"),
StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8")
},
new
{
Id = new Guid("4652d73f-fc71-4fe1-9f2f-1e48b342d741"),
Id = new Guid("7deb0945-e1c9-411f-8b3c-c9bdbe3c3c2d"),
PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"),
StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7")
},
new
{
Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"),
PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"),
StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"),
TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26")
StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b")
},
new
{
Id = new Guid("0b7926fc-a34b-4a5b-8c7d-1003480cf0fa"),
PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"),
StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8")
},
new
{
Id = new Guid("cd15f9b9-be45-4deb-9c71-2f23f872dbcd"),
PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"),
StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"),
TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26")
StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729")
},
new
{
Id = new Guid("f6f26b2f-2fa6-40b7-8601-cbd4bcdda0cc"),
PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"),
StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"),
TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26")
StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27")
},
new
{
Id = new Guid("214354e5-daad-4569-ad69-eb5bf4e87fbc"),
PermissionId = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"),
StatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"),
TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26")
StatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95")
});
});
@ -1918,13 +1929,8 @@ namespace Marco.Pms.DataAccess.Migrations
.IsRequired()
.HasColumnType("longtext");
b.Property<Guid>("TenantId")
.HasColumnType("char(36)");
b.HasKey("Id");
b.HasIndex("TenantId");
b.ToTable("ExpensesStatusMaster");
b.HasData(
@ -1936,8 +1942,7 @@ namespace Marco.Pms.DataAccess.Migrations
DisplayName = "Draft",
IsActive = true,
IsSystem = true,
Name = "Draft",
TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26")
Name = "Draft"
},
new
{
@ -1947,8 +1952,17 @@ namespace Marco.Pms.DataAccess.Migrations
DisplayName = "Submit",
IsActive = true,
IsSystem = true,
Name = "Review Pending",
TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26")
Name = "Review Pending"
},
new
{
Id = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"),
Color = "#ff3e1d",
Description = "Expense was declined, often with a reason(review rejected).",
DisplayName = "Reject",
IsActive = true,
IsSystem = true,
Name = "Rejected by Reviewer"
},
new
{
@ -1958,19 +1972,17 @@ namespace Marco.Pms.DataAccess.Migrations
DisplayName = "Mark as Reviewed",
IsActive = true,
IsSystem = true,
Name = "Approval Pending",
TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26")
Name = "Approval Pending"
},
new
{
Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"),
Color = "#ff3e1d",
Description = "Expense was declined, often with a reason(either review rejected or approval rejected.",
Description = "Expense was declined, often with a reason(approval rejected).",
DisplayName = "Reject",
IsActive = true,
IsSystem = true,
Name = "Rejected",
TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26")
Name = "Rejected by Approver"
},
new
{
@ -1980,19 +1992,17 @@ namespace Marco.Pms.DataAccess.Migrations
DisplayName = "Mark as Approved",
IsActive = true,
IsSystem = true,
Name = "Payment Pending",
TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26")
Name = "Payment Pending"
},
new
{
Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"),
Color = "#71dd37",
Description = "Expense has been settled.",
DisplayName = "Mark as Paid",
DisplayName = "Mark as Processed",
IsActive = true,
IsSystem = true,
Name = "Paid",
TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26")
Name = "Processed"
});
});
@ -3790,6 +3800,10 @@ namespace Marco.Pms.DataAccess.Migrations
modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b =>
{
b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy")
.WithMany()
.HasForeignKey("ApprovedById");
b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy")
.WithMany()
.HasForeignKey("CreatedById")
@ -3814,12 +3828,20 @@ namespace Marco.Pms.DataAccess.Migrations
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("Marco.Pms.Model.Employees.Employee", "ProcessedBy")
.WithMany()
.HasForeignKey("ProcessedById");
b.HasOne("Marco.Pms.Model.Projects.Project", "Project")
.WithMany()
.HasForeignKey("ProjectId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("Marco.Pms.Model.Employees.Employee", "ReviewedBy")
.WithMany()
.HasForeignKey("ReviewedById");
b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status")
.WithMany()
.HasForeignKey("StatusId")
@ -3832,6 +3854,8 @@ namespace Marco.Pms.DataAccess.Migrations
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("ApprovedBy");
b.Navigation("CreatedBy");
b.Navigation("ExpensesType");
@ -3840,8 +3864,12 @@ namespace Marco.Pms.DataAccess.Migrations
b.Navigation("PaymentMode");
b.Navigation("ProcessedBy");
b.Navigation("Project");
b.Navigation("ReviewedBy");
b.Navigation("Status");
b.Navigation("Tenant");
@ -3907,17 +3935,9 @@ namespace Marco.Pms.DataAccess.Migrations
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant")
.WithMany()
.HasForeignKey("TenantId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("NextStatus");
b.Navigation("Status");
b.Navigation("Tenant");
});
modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusPermissionMapping", b =>
@ -3934,17 +3954,9 @@ namespace Marco.Pms.DataAccess.Migrations
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant")
.WithMany()
.HasForeignKey("TenantId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Permission");
b.Navigation("Status");
b.Navigation("Tenant");
});
modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b =>
@ -4051,17 +4063,6 @@ namespace Marco.Pms.DataAccess.Migrations
b.Navigation("Tenant");
});
modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b =>
{
b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant")
.WithMany()
.HasForeignKey("TenantId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Tenant");
});
modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesTypeMaster", b =>
{
b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant")

View File

@ -35,6 +35,21 @@ namespace Marco.Pms.Model.Expenses
[ValidateNever]
[ForeignKey("CreatedById")]
public Employee? CreatedBy { get; set; }
public Guid? ReviewedById { get; set; }
[ValidateNever]
[ForeignKey("ReviewedById")]
public Employee? ReviewedBy { get; set; }
public Guid? ApprovedById { get; set; }
[ValidateNever]
[ForeignKey("ApprovedById")]
public Employee? ApprovedBy { get; set; }
public Guid? ProcessedById { get; set; }
[ValidateNever]
[ForeignKey("ProcessedById")]
public Employee? ProcessedBy { get; set; }
public DateTime TransactionDate { get; set; }
public DateTime CreatedAt { get; set; }
public string? TransactionId { get; set; }

View File

@ -1,11 +1,10 @@
using Marco.Pms.Model.Master;
using Marco.Pms.Model.Utilities;
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
using System.ComponentModel.DataAnnotations.Schema;
namespace Marco.Pms.Model.Expenses
{
public class ExpensesStatusMapping : TenantRelation
public class ExpensesStatusMapping
{
public Guid Id { get; set; }
public Guid StatusId { get; set; }

View File

@ -1,12 +1,11 @@
using Marco.Pms.Model.Entitlements;
using Marco.Pms.Model.Master;
using Marco.Pms.Model.Utilities;
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
using System.ComponentModel.DataAnnotations.Schema;
namespace Marco.Pms.Model.Expenses
{
public class StatusPermissionMapping : TenantRelation
public class StatusPermissionMapping
{
public Guid Id { get; set; }
public Guid StatusId { get; set; }

View File

@ -0,0 +1,11 @@
namespace Marco.Pms.Model.Master
{
public class CurrencyMaster
{
public Guid Id { get; set; }
public string CurrencyCode { get; set; } = string.Empty;
public string CurrencyName { get; set; } = string.Empty;
public string Symbol { get; set; } = string.Empty;
public bool IsActive { get; set; } = true;
}
}

View File

@ -1,8 +1,6 @@
using Marco.Pms.Model.Utilities;
namespace Marco.Pms.Model.Master
namespace Marco.Pms.Model.Master
{
public class ExpensesStatusMaster : TenantRelation
public class ExpensesStatusMaster
{
public Guid Id { get; set; }
public string Name { get; set; } = string.Empty;

View File

@ -8,6 +8,9 @@
public string PaymentModeId { get; set; } = string.Empty;
public string PaidById { get; set; } = string.Empty;
public string CreatedById { get; set; } = string.Empty;
public string? ReviewedById { get; set; }
public string? ApprovedById { get; set; }
public string? ProcessedById { get; set; }
public DateTime TransactionDate { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime ExpireAt { get; set; } = DateTime.UtcNow.Date.AddDays(1);

View File

@ -8,6 +8,5 @@
public string Description { get; set; } = string.Empty;
public string? Color { get; set; }
public bool IsSystem { get; set; } = false;
public string TenantId { get; set; } = string.Empty;
}
}

View File

@ -6,6 +6,7 @@
public List<Guid>? StatusIds { get; set; }
public List<Guid>? CreatedByIds { get; set; }
public List<Guid>? PaidById { get; set; }
public bool IsTransactionDate { get; set; } = false;
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
}

View File

@ -13,6 +13,9 @@ namespace Marco.Pms.Model.ViewModels.Expenses
public PaymentModeMatserVM? PaymentMode { get; set; }
public BasicEmployeeVM? PaidBy { get; set; }
public BasicEmployeeVM? CreatedBy { get; set; }
public BasicEmployeeVM? ReviewedBy { get; set; }
public BasicEmployeeVM? ApprovedBy { get; set; }
public BasicEmployeeVM? ProcessedBy { get; set; }
public DateTime TransactionDate { get; set; }
public DateTime CreatedAt { get; set; }
public string SupplerName { get; set; } = string.Empty;

View File

@ -12,6 +12,9 @@ namespace Marco.Pms.Model.ViewModels.Expanses
public PaymentModeMatserVM? PaymentMode { get; set; }
public BasicEmployeeVM? PaidBy { get; set; }
public BasicEmployeeVM? CreatedBy { get; set; }
public BasicEmployeeVM? ReviewedBy { get; set; }
public BasicEmployeeVM? ApprovedBy { get; set; }
public BasicEmployeeVM? ProcessedBy { get; set; }
public DateTime TransactionDate { get; set; }
public DateTime CreatedAt { get; set; }
public string SupplerName { get; set; } = string.Empty;

View File

@ -908,31 +908,7 @@ namespace Marco.Pms.Services.Controllers
public async Task<IActionResult> GetExpensesStatusList([FromQuery] bool isActive = true)
{
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
var response = await _masterService.GetExpensesStatusListAsync(loggedInEmployee, tenantId, isActive);
return StatusCode(response.StatusCode, response);
}
[HttpPost("expenses-status")]
public async Task<IActionResult> CreateExpensesStatus([FromBody] ExpensesStatusMasterDto dto)
{
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
var response = await _masterService.CreateExpensesStatusAsync(dto, loggedInEmployee, tenantId);
return StatusCode(response.StatusCode, response);
}
[HttpPut("expenses-status/edit/{id}")]
public async Task<IActionResult> UpdateExpensesStatus(Guid id, [FromBody] ExpensesStatusMasterDto dto)
{
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
var response = await _masterService.UpdateExpensesStatusAsync(id, dto, loggedInEmployee, tenantId);
return StatusCode(response.StatusCode, response);
}
[HttpDelete("expenses-status/delete/{id}")]
public async Task<IActionResult> DeleteExpensesStatus(Guid id, [FromQuery] bool isActive = false)
{
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
var response = await _masterService.DeleteExpensesStatusAsync(id, isActive, loggedInEmployee, tenantId);
var response = await _masterService.GetExpensesStatusListAsync(loggedInEmployee, tenantId);
return StatusCode(response.StatusCode, response);
}

View File

@ -145,6 +145,15 @@ namespace Marco.Pms.Services.MappingProfiles
dest => dest.CreatedById,
opt => opt.MapFrom(src => src.CreatedById.ToString()))
.ForMember(
dest => dest.ReviewedById,
opt => opt.MapFrom(src => src.ReviewedById.ToString()))
.ForMember(
dest => dest.ApprovedById,
opt => opt.MapFrom(src => src.ApprovedById.ToString()))
.ForMember(
dest => dest.ProcessedById,
opt => opt.MapFrom(src => src.ProcessedById.ToString()))
.ForMember(
dest => dest.StatusId,
opt => opt.MapFrom(src => src.StatusId.ToString()))
.ForMember(
@ -171,6 +180,15 @@ namespace Marco.Pms.Services.MappingProfiles
dest => dest.CreatedById,
opt => opt.MapFrom(src => Guid.Parse(src.CreatedById)))
.ForMember(
dest => dest.ReviewedById,
opt => opt.MapFrom(src => Guid.Parse(src.ReviewedById ?? "")))
.ForMember(
dest => dest.ApprovedById,
opt => opt.MapFrom(src => Guid.Parse(src.ApprovedById ?? "")))
.ForMember(
dest => dest.ProcessedById,
opt => opt.MapFrom(src => Guid.Parse(src.ProcessedById ?? "")))
.ForMember(
dest => dest.StatusId,
opt => opt.MapFrom(src => Guid.Parse(src.StatusId)))
.ForMember(
@ -229,10 +247,7 @@ namespace Marco.Pms.Services.MappingProfiles
CreateMap<ExpensesStatusMaster, ExpensesStatusMasterMongoDB>()
.ForMember(
dest => dest.Id,
opt => opt.MapFrom(src => src.Id.ToString()))
.ForMember(
dest => dest.TenantId,
opt => opt.MapFrom(src => src.TenantId.ToString()));
opt => opt.MapFrom(src => src.Id.ToString()));
CreateMap<ExpensesStatusMasterMongoDB, ExpensesStatusMasterVM>()
.ForMember(

View File

@ -135,12 +135,19 @@ namespace Marco.Pms.Services.Service
if (expenseFilter != null)
{
// CRITICAL FIX: Apply filters cumulatively using multiple `if` statements, not `if-else if`.
if (expenseFilter.StartDate.HasValue && expenseFilter.EndDate.HasValue)
{
if (expenseFilter.IsTransactionDate)
{
expensesQuery = expensesQuery.Where(e => e.TransactionDate.Date >= expenseFilter.StartDate.Value.Date && e.TransactionDate.Date <= expenseFilter.EndDate.Value.Date);
}
else
{
expensesQuery = expensesQuery.Where(e => e.CreatedAt.Date >= expenseFilter.StartDate.Value.Date && e.CreatedAt.Date <= expenseFilter.EndDate.Value.Date);
}
}
if (expenseFilter.ProjectIds?.Any() == true)
{
expensesQuery = expensesQuery.Where(e => expenseFilter.ProjectIds.Contains(e.ProjectId));
@ -464,7 +471,7 @@ namespace Marco.Pms.Services.Service
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
return await dbContext.ExpensesStatusMapping
.Include(s => s.NextStatus)
.FirstOrDefaultAsync(s => s.StatusId == existingExpense.StatusId && s.NextStatusId == model.StatusId && s.TenantId == tenantId);
.FirstOrDefaultAsync(s => s.StatusId == existingExpense.StatusId && s.NextStatusId == model.StatusId);
});
// Task to fetch all permissions required for the *target* status.
@ -472,7 +479,7 @@ namespace Marco.Pms.Services.Service
{
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
return await dbContext.StatusPermissionMapping
.Where(sp => sp.StatusId == model.StatusId && sp.TenantId == tenantId)
.Where(sp => sp.StatusId == model.StatusId)
.ToListAsync();
});
@ -598,7 +605,7 @@ namespace Marco.Pms.Services.Service
var dbContext = t.Result;
return dbContext.ExpensesStatusMapping
.Include(s => s.NextStatus)
.Where(s => s.StatusId == existingExpense.StatusId && s.NextStatus != null && s.TenantId == tenantId)
.Where(s => s.StatusId == existingExpense.StatusId && s.NextStatus != null)
.Select(s => s.NextStatus) // Select only the status object
.ToListAsync()
.ContinueWith(res =>
@ -756,7 +763,7 @@ namespace Marco.Pms.Services.Service
var dbContext = t.Result;
return dbContext.ExpensesStatusMapping
.Include(s => s.NextStatus)
.Where(s => s.StatusId == existingExpense.StatusId && s.NextStatus != null && s.TenantId == tenantId)
.Where(s => s.StatusId == existingExpense.StatusId && s.NextStatus != null)
.Select(s => s.NextStatus) // Select only the status object
.ToListAsync()
.ContinueWith(res =>
@ -958,7 +965,7 @@ namespace Marco.Pms.Services.Service
.Include(s => s.Status)
.Include(s => s.NextStatus)
.AsNoTracking()
.Where(es => statusIds.Contains(es.StatusId) && es.Status != null && es.TenantId == tenantId)
.Where(es => statusIds.Contains(es.StatusId) && es.Status != null)
.GroupBy(s => s.StatusId)
.Select(g => new
{
@ -972,14 +979,13 @@ namespace Marco.Pms.Services.Service
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
return await dbContext.ExpensesStatusMaster
.AsNoTracking()
.Where(es => statusIds.Contains(es.Id) && es.TenantId == tenantId)
.Where(es => statusIds.Contains(es.Id))
.ToListAsync();
});
var permissionStatusMappingTask = Task.Run(async () =>
{
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
return await dbContext.StatusPermissionMapping
.Where(ps => ps.TenantId == tenantId)
.GroupBy(ps => ps.StatusId)
.Select(g => new
{
@ -1066,7 +1072,7 @@ namespace Marco.Pms.Services.Service
.Include(s => s.Status)
.Include(s => s.NextStatus)
.AsNoTracking()
.Where(es => es.StatusId == Guid.Parse(model.StatusId) && es.Status != null && es.TenantId == tenantId)
.Where(es => es.StatusId == Guid.Parse(model.StatusId) && es.Status != null)
.GroupBy(s => s.StatusId)
.Select(g => new
{
@ -1079,13 +1085,12 @@ namespace Marco.Pms.Services.Service
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
return await dbContext.ExpensesStatusMaster
.AsNoTracking()
.FirstOrDefaultAsync(es => es.Id == Guid.Parse(model.StatusId) && es.TenantId == tenantId);
.FirstOrDefaultAsync(es => es.Id == Guid.Parse(model.StatusId));
});
var permissionStatusMappingTask = Task.Run(async () =>
{
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
return await dbContext.StatusPermissionMapping
.Where(ps => ps.TenantId == tenantId)
.GroupBy(ps => ps.StatusId)
.Select(g => new
{

View File

@ -4,7 +4,6 @@ using Marco.Pms.Helpers.Utility;
using Marco.Pms.Model.Dtos.Master;
using Marco.Pms.Model.Employees;
using Marco.Pms.Model.Entitlements;
using Marco.Pms.Model.Expenses;
using Marco.Pms.Model.Master;
using Marco.Pms.Model.MongoDBModels.Utility;
using Marco.Pms.Model.Utilities;
@ -247,9 +246,8 @@ namespace Marco.Pms.Services.Service
#endregion
#region =================================================================== Expenses Status APIs ===================================================================
public async Task<ApiResponse<object>> GetExpensesStatusListAsync(Employee loggedInEmployee, Guid tenantId, bool isActive)
public async Task<ApiResponse<object>> GetExpensesStatusListAsync(Employee loggedInEmployee, Guid tenantId)
{
try
{
// Validation if employee is taking action in same tenant
@ -260,7 +258,7 @@ namespace Marco.Pms.Services.Service
}
// Featching the list of Expenses Status.
var statusList = await _context.ExpensesStatusMaster.Where(es => es.TenantId == tenantId && es.IsActive == isActive).ToListAsync();
var statusList = await _context.ExpensesStatusMaster.ToListAsync();
var response = _mapper.Map<List<ExpensesStatusMasterVM>>(statusList);
var statusIds = statusList.Select(s => s.Id).ToList();
@ -287,223 +285,6 @@ namespace Marco.Pms.Services.Service
return ApiResponse<object>.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500);
}
}
public async Task<ApiResponse<object>> CreateExpensesStatusAsync(ExpensesStatusMasterDto model, Employee loggedInEmployee, Guid tenantId)
{
try
{
// Validation if employee is taking action in same tenant
if (tenantId != loggedInEmployee.TenantId)
{
_logger.LogWarning("Employee {EmployeeId} attempted to add new Expense Status in different tenant", loggedInEmployee.Id);
return ApiResponse<object>.ErrorResponse("Access Denied", "User do not have access for this information", 403);
}
var hasManagePermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id);
if (!hasManagePermission)
{
_logger.LogWarning("Access DENIED for employee {EmployeeId} for managing EXPENSE STATUS MASTER.", loggedInEmployee.Id);
return ApiResponse<object>.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403);
}
// Mapping the DTO to ExpensesStatusMaster Model
var expensesStatus = _mapper.Map<ExpensesStatusMaster>(model);
expensesStatus.TenantId = tenantId;
_context.ExpensesStatusMaster.Add(expensesStatus);
if (model.PermissionIds?.Any() ?? false)
{
var permissionStatusMappings = model.PermissionIds.Select(p => new StatusPermissionMapping
{
PermissionId = p,
StatusId = expensesStatus.Id,
TenantId = tenantId
}).ToList();
_context.StatusPermissionMapping.AddRange(permissionStatusMappings);
}
await _context.SaveChangesAsync();
_logger.LogInfo("New Expense Status {ExpensesStatusId} was added by employee {EmployeeId}", expensesStatus.Id, loggedInEmployee.Id);
// Mapping the ExpensesStatusMaster Model to View Model
var response = _mapper.Map<ExpensesStatusMasterVM>(expensesStatus);
return ApiResponse<object>.SuccessResponse(response, "Expense Status craeted Successfully", 201);
}
catch (DbUpdateException dbEx)
{
_logger.LogError(dbEx, "Database Exception occured while adding new Expense Status by employee {EmployeeId}", loggedInEmployee.Id);
return ApiResponse<object>.ErrorResponse("Internal Error occured", ExceptionMapper(dbEx), 500);
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception occured while adding new Expense Status by employee {EmployeeId}", loggedInEmployee.Id);
return ApiResponse<object>.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500);
}
}
public async Task<ApiResponse<object>> UpdateExpensesStatusAsync(Guid id, ExpensesStatusMasterDto model, Employee loggedInEmployee, Guid tenantId)
{
try
{
// Validation if employee is taking action in same tenant
if (tenantId != loggedInEmployee.TenantId)
{
_logger.LogWarning("Employee {EmployeeId} attempted to add new Expense Status in different tenant", loggedInEmployee.Id);
return ApiResponse<object>.ErrorResponse("Access Denied", "User do not have access for this information", 403);
}
// Checking permssion for managing masters
var hasManagePermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id);
if (!hasManagePermission)
{
_logger.LogWarning("Access DENIED for employee {EmployeeId} for managing EXPENSE STATUS MASTER.", loggedInEmployee.Id);
return ApiResponse<object>.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403);
}
// Validating the prvided data
if (model.Id != id)
{
_logger.LogWarning("Employee {EmployeeId} provide different Ids in payload and path variable", loggedInEmployee.Id);
return ApiResponse<object>.ErrorResponse("Invalid Data", "User has send invalid payload", 400);
}
// featching expenses status and permissions parallelly
var expensesStatusTask = Task.Run(async () =>
{
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
return await dbContext.ExpensesStatusMaster.AsNoTracking()
.FirstOrDefaultAsync(et => et.Id == model.Id.Value && et.TenantId == tenantId);
});
var permissionStatusMappingsTask = Task.Run(async () =>
{
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
return await dbContext.StatusPermissionMapping
.AsNoTracking()
.Where(ps => ps.StatusId == model.Id.Value && ps.TenantId == tenantId)
.ToListAsync();
});
await Task.WhenAll(expensesStatusTask, permissionStatusMappingsTask);
var expensesStatus = expensesStatusTask.Result;
// Checking if Expense Status exists
if (expensesStatus == null)
{
_logger.LogWarning("Employee {EmployeeId} tries to update Expense Status, but not found in database", loggedInEmployee.Id);
return ApiResponse<object>.ErrorResponse("Expense Status not found", "Expense Status not found", 404);
}
// Mapping ExpensesStatusMaster to BsonDocument
var existingEntityBson = _updateLogHelper.EntityToBsonDocument(expensesStatus);
// Mapping ExpensesStatusMasterDto to ExpensesStatusMaster
_mapper.Map(model, expensesStatus);
_context.ExpensesStatusMaster.Update(expensesStatus);
var permissionStatusMappings = permissionStatusMappingsTask.Result;
var permissionIds = permissionStatusMappings.Select(ps => ps.PermissionId).ToList();
if (model.PermissionIds != null)
{
var newPermissionStatusMappings = model.PermissionIds.Where(p => !permissionIds.Contains(p)).Select(p => new StatusPermissionMapping
{
PermissionId = p,
StatusId = expensesStatus.Id,
TenantId = tenantId
}).ToList();
var deletedPermissionStatusMappings = permissionStatusMappings.Where(ps => !model.PermissionIds.Contains(ps.PermissionId)).ToList();
_context.StatusPermissionMapping.AddRange(newPermissionStatusMappings);
_context.StatusPermissionMapping.RemoveRange(deletedPermissionStatusMappings);
}
await _context.SaveChangesAsync();
_logger.LogInfo("New Expense Status {ExpensesStatusId} was added by employee {EmployeeId}", expensesStatus.Id, loggedInEmployee.Id);
// Mapping the ExpensesStatusMaster Model to View Model
var response = _mapper.Map<ExpensesStatusMasterVM>(expensesStatus);
return ApiResponse<object>.SuccessResponse(response, "Expense Status craeted Successfully", 201);
}
catch (DbUpdateException dbEx)
{
_logger.LogError(dbEx, "Database Exception occured while adding new Expense Status by employee {EmployeeId}", loggedInEmployee.Id);
return ApiResponse<object>.ErrorResponse("Internal Error occured", ExceptionMapper(dbEx), 500);
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception occured while adding new Expense Status by employee {EmployeeId}", loggedInEmployee.Id);
return ApiResponse<object>.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500);
}
}
public async Task<ApiResponse<object>> DeleteExpensesStatusAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId)
{
string action = isActive ? "restore" : "delete";
try
{
// Validation if employee is taking action in same tenant
if (tenantId != loggedInEmployee.TenantId)
{
_logger.LogWarning("Employee {EmployeeId} attempted to {Action} Expense Status in different tenant", loggedInEmployee.Id, action);
return ApiResponse<object>.ErrorResponse("Access Denied", "User do not have access for this information", 403);
}
// Checking permssion for managing masters
var hasManagePermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id);
if (!hasManagePermission)
{
_logger.LogWarning("Access DENIED for employee {EmployeeId} for managing EXPENSE STATUS MASTER.", loggedInEmployee.Id);
return ApiResponse<object>.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403);
}
var expensesStatus = await _context.ExpensesStatusMaster.FirstOrDefaultAsync(et => et.Id == id && et.TenantId == tenantId);
// Checking if Expense Status exists
if (expensesStatus == null)
{
_logger.LogWarning("Employee {EmployeeId} tries to {Action} Expense Status, but not found in database", loggedInEmployee.Id, action);
return ApiResponse<object>.ErrorResponse("Expense Status not found", "Expense Status not found", 404);
}
if (expensesStatus.IsSystem)
{
_logger.LogWarning("Employee {Employee} attempts to {Action} Expense status, but status is system defined", loggedInEmployee.Id, action);
return ApiResponse<object>.ErrorResponse($"Expense Status is system defined cannot able to {action}", $"Expense Status is system defined cannot able to {action}", 400);
}
// Mapping ExpensesStatusMaster to BsonDocument
var existingEntityBson = _updateLogHelper.EntityToBsonDocument(expensesStatus);
expensesStatus.IsActive = isActive;
await _context.SaveChangesAsync();
_logger.LogInfo("Expense Status {ExpensesStatusId} was {Action}d by employee {EmployeeId}", expensesStatus.Id, action, loggedInEmployee.Id);
// Saving the old entity in mongoDB
var mongoDBTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject
{
EntityId = expensesStatus.Id.ToString(),
UpdatedById = loggedInEmployee.Id.ToString(),
OldObject = existingEntityBson,
UpdatedAt = DateTime.UtcNow
}, "ExpensesStatusMasterModificationLog");
// Mapping ExpensesStatusMaster to ExpensesStatusMasterVM
var response = _mapper.Map<ExpensesStatusMasterVM>(expensesStatus);
return ApiResponse<object>.SuccessResponse(response, $"Expense Status {action}d Successfully", 200);
}
catch (DbUpdateException dbEx)
{
_logger.LogError(dbEx, "Database Exception occured while {Action}ing Expense Status by employee {EmployeeId}", action, loggedInEmployee.Id);
return ApiResponse<object>.ErrorResponse("Internal Error occured", ExceptionMapper(dbEx), 500);
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception occured while {Action}ing Expense Status by employee {EmployeeId}", action, loggedInEmployee.Id);
return ApiResponse<object>.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500);
}
}
#endregion
#region =================================================================== Payment mode APIs ===================================================================

View File

@ -15,10 +15,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces
#endregion
#region =================================================================== Expenses Status APIs ===================================================================
Task<ApiResponse<object>> GetExpensesStatusListAsync(Employee loggedInEmployee, Guid tenantId, bool isActive);
Task<ApiResponse<object>> CreateExpensesStatusAsync(ExpensesStatusMasterDto model, Employee loggedInEmployee, Guid tenantId);
Task<ApiResponse<object>> UpdateExpensesStatusAsync(Guid id, ExpensesStatusMasterDto model, Employee loggedInEmployee, Guid tenantId);
Task<ApiResponse<object>> DeleteExpensesStatusAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId);
Task<ApiResponse<object>> GetExpensesStatusListAsync(Employee loggedInEmployee, Guid tenantId);
#endregion