added new controllers

This commit is contained in:
npalOmega 2026-01-21 15:41:19 -06:00
parent 2e9716fe34
commit 9c78cd96fa
16 changed files with 960 additions and 7 deletions

View file

@ -0,0 +1,205 @@
using Api.SeaHavenIndustries.DTOs;
using Data.SeaHavenIndustries;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
[ApiController]
[Route("api/Account")]
public class AccountController : Controller
{
private readonly ApplicationDbContext _db;
public AccountController(ApplicationDbContext db)
{
_db = db;
}
// -----------------------------------
// POST: api/Account/AddAccounts
// -----------------------------------
[HttpPost("AddAccounts")]
public async Task<IActionResult> AddAccounts(Account_DTO dto)
{
try
{
var model = new Accounts
{
Name = dto.Name,
Type = dto.Type,
Importance = dto.Importance,
TerritoryId = dto.TerritoryId,
OwnerEmployeeId = dto.OwnerEmployeeId,
PrivacySetting = dto.PrivacySetting,
About = dto.About,
Tags = dto.Tags,
Phone = dto.Phone,
Email = dto.Email,
IndustryId = dto.IndustryId,
TimeZone = dto.TimeZone,
Website = dto.Website,
CurrencyCode = dto.CurrencyCode,
ServiceInstructions = dto.ServiceInstructions,
FacebookUrl = dto.FacebookUrl,
LinkedInUrl = dto.LinkedInUrl,
TwitterUrl = dto.TwitterUrl,
CreatedDate = DateTime.UtcNow
};
_db.Accounts.Add(model);
await _db.SaveChangesAsync();
return Ok(new DataResponse
{
Message = "Account added successfully.",
Status = "200"
});
}
catch (Exception ex)
{
return BadRequest(new Response
{
Status = "Error",
Message = ex.Message
});
}
}
// -----------------------------------
// POST: api/Account/EditAccounts
// -----------------------------------
[HttpPost("EditAccounts")]
public async Task<IActionResult> EditAccounts(EditAccount_DTO dto)
{
try
{
var account = await _db.Accounts.FirstOrDefaultAsync(a => a.Id == dto.Id);
if (account == null)
return BadRequest(new Response { Status = "Error", Message = "Account not found." });
account.Name = dto.Name;
account.Type = dto.Type;
account.Importance = dto.Importance;
account.TerritoryId = dto.TerritoryId;
account.OwnerEmployeeId = dto.OwnerEmployeeId;
account.PrivacySetting = dto.PrivacySetting;
account.About = dto.About;
account.Tags = dto.Tags;
account.Phone = dto.Phone;
account.Email = dto.Email;
account.IndustryId = dto.IndustryId;
account.TimeZone = dto.TimeZone;
account.Website = dto.Website;
account.CurrencyCode = dto.CurrencyCode;
account.ServiceInstructions = dto.ServiceInstructions;
account.FacebookUrl = dto.FacebookUrl;
account.LinkedInUrl = dto.LinkedInUrl;
account.TwitterUrl = dto.TwitterUrl;
account.LastModificationTime = DateTime.UtcNow;
await _db.SaveChangesAsync();
return Ok(new DataResponse
{
Message = "Account updated successfully.",
Status = "200"
});
}
catch (Exception ex)
{
return BadRequest(new Response
{
Status = "Error",
Message = ex.Message
});
}
}
// -----------------------------------
// GET: api/Account/DeleteAccounts?id=5
// -----------------------------------
[HttpGet("DeleteAccounts")]
public async Task<IActionResult> DeleteAccounts(int id)
{
try
{
var account = await _db.Accounts.FirstOrDefaultAsync(a => a.Id == id);
if (account == null)
return BadRequest(new Response { Status = "Error", Message = "Account not found." });
_db.Accounts.Remove(account);
await _db.SaveChangesAsync();
return Ok(new DataResponse
{
Message = "Account deleted successfully.",
Status = "200"
});
}
catch (Exception ex)
{
return BadRequest(new Response
{
Status = "Error",
Message = ex.Message
});
}
}
// -----------------------------------
// GET: api/Account/GetAccountList?search=&page=&pageSize=
// -----------------------------------
[HttpGet("GetAccountList")]
public IActionResult GetAccountList(string? search = "", int page = 1, int pageSize = 12)
{
search ??= "";
var query = _db.Accounts
.Where(a => a.IsDeleted == false || a.IsDeleted == null);
if (!string.IsNullOrWhiteSpace(search))
{
var s = search.ToLower();
query = query.Where(a =>
(a.Name ?? "").ToLower().Contains(s) ||
(a.Email ?? "").ToLower().Contains(s) ||
(a.Phone ?? "").Contains(s) ||
(a.Website ?? "").ToLower().Contains(s)
);
}
var totalCount = query.Count();
var data = query
.OrderByDescending(a => a.Id)
.Skip((page - 1) * pageSize)
.Take(pageSize)
.Select(a => new
{
a.Id,
a.Name,
a.Type,
a.Phone,
a.Email,
Industry = a.IndustryId,
a.Website
})
.ToList();
var viewModel = new Pagination_DTO
{
Data = data,
PageNumber = page,
PageSize = pageSize,
TotalCount = totalCount,
TotalPages = (int)Math.Ceiling(totalCount / (double)pageSize)
};
return Ok(viewModel);
}
}

View file

@ -0,0 +1,154 @@
using Api.SeaHavenIndustries.DTOs;
using Data.SeaHavenIndustries;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
[ApiController]
[Route("api/Employee")]
public class EmployeeController : Controller
{
private readonly ApplicationDbContext _db;
public EmployeeController(ApplicationDbContext db)
{
_db = db;
}
// -----------------------------------
// POST: api/Employee/AddEmployees
// -----------------------------------
[HttpPost("AddEmployees")]
public async Task<IActionResult> AddEmployees(AddEmployee_DTO dto)
{
var employee = new Employee
{
FirstName = dto.FirstName,
LastName = dto.LastName,
JobTitleId = dto.JobTitleId,
PermissionGroupId = dto.PermissionGroupId,
Status = dto.Status,
LastLogin = dto.LastLogin,
CreatedDate = DateTime.UtcNow
};
if (!string.IsNullOrWhiteSpace(dto.Email))
{
employee.Emails.Add(new EmployeeEmail
{
Address = dto.Email,
IsPrimary = true,
EmailTypeId = 1
});
}
if (!string.IsNullOrWhiteSpace(dto.Phone))
{
employee.Phones.Add(new EmployeePhone
{
Number = dto.Phone,
Extension = dto.PhoneExtension,
IsPrimary = true,
PhoneTypeId = 1
});
}
_db.Employees.Add(employee);
await _db.SaveChangesAsync();
return Ok(new { Message = "Employee added successfully" });
}
// -----------------------------------
// POST: api/Employee/EditEmployees
// -----------------------------------
[HttpPost("EditEmployees")]
public async Task<IActionResult> EditEmployees(EditEmployee_DTO dto)
{
var employee = await _db.Employees
.Include(e => e.Emails)
.Include(e => e.Phones)
.FirstOrDefaultAsync(e => e.Id == dto.Id);
if (employee == null)
return BadRequest("Employee not found");
employee.FirstName = dto.FirstName;
employee.LastName = dto.LastName;
employee.JobTitleId = dto.JobTitleId;
employee.PermissionGroupId = dto.PermissionGroupId;
employee.Status = dto.Status;
employee.LastLogin = dto.LastLogin;
employee.LastModificationTime = DateTime.UtcNow;
await _db.SaveChangesAsync();
return Ok(new { Message = "Employee updated successfully" });
}
// -----------------------------------
// GET: api/Employee/GetEmployeeList
// -----------------------------------
[HttpGet("GetEmployeeList")]
public IActionResult GetEmployeeList(string? search = "")
{
search ??= "";
var data = _db.Employees
.Include(e => e.JobTitle)
.Include(e => e.Emails)
.Include(e => e.Phones)
.Where(e => !e.IsDeleted.HasValue || e.IsDeleted == false)
.Select(e => new EmployeeListItem_DTO
{
Id = e.Id,
Name = e.FirstName + " " + e.LastName,
JobTitle = e.JobTitle != null ? e.JobTitle.Name : "",
Role = "",
Email = e.Emails.Where(x => x.IsPrimary == true).Select(x => x.Address).FirstOrDefault(),
Phone = e.Phones.Where(x => x.IsPrimary == true)
.Select(x => x.Number + (x.Extension != null ? " ext. " + x.Extension : ""))
.FirstOrDefault(),
Status = e.Status,
LastLogin = e.LastLogin
})
.ToList();
return Ok(data);
}
// -----------------------------------
// GET: api/Employee/DeleteEmployees?id=5
// -----------------------------------
[HttpGet("DeleteEmployees")]
public async Task<IActionResult> DeleteEmployees(int id)
{
try
{
var employee = await _db.Employees
.FirstOrDefaultAsync(e => e.Id == id);
if (employee == null)
return BadRequest(new Response
{
Status = "Error",
Message = "Employee not found."
});
_db.Employees.Remove(employee);
await _db.SaveChangesAsync();
return Ok(new DataResponse
{
Message = "Employee deleted successfully.",
Status = "200"
});
}
catch (Exception ex)
{
return BadRequest(new Response
{
Status = "Error",
Message = ex.Message
});
}
}
}

View file

@ -0,0 +1,148 @@
using Api.SeaHavenIndustries.DTOs;
using Data.SeaHavenIndustries;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
[ApiController]
[Route("api/FollowUp")]
public class FollowUpController : ControllerBase
{
private readonly ApplicationDbContext _db;
public FollowUpController(ApplicationDbContext db)
{
_db = db;
}
[HttpGet("GetFollowUpList")]
public IActionResult GetFollowUps(
string? search = "",
bool completed = false,
int page = 1,
int pageSize = 12)
{
var status = completed ? "Completed" : "Open";
var query = _db.FollowUps
.Include(x => x.Employee)
.Include(x => x.Account)
.Include(x => x.Location)
.Include(x => x.WorkOrder)
.Where(x => x.Status == status);
if (!string.IsNullOrWhiteSpace(search))
{
search = search.ToLower();
query = query.Where(x =>
(x.Reason ?? "").ToLower().Contains(search) ||
(x.Account != null && (x.Account.Name ?? "").ToLower().Contains(search)) ||
(x.Employee != null &&
(
((x.Employee.FirstName ?? "") + " " + (x.Employee.LastName ?? ""))
.ToLower()
.Contains(search)
)
)
);
}
var totalCount = query.Count();
var data = query
.OrderByDescending(x => x.Id)
.Skip((page - 1) * pageSize)
.Take(pageSize)
.Select(x => new
{
x.Id,
x.Reason,
x.ScheduleDate,
Account = x.Account != null ? x.Account.Name : "",
AssignedTo = x.Employee != null
? (x.Employee.FirstName + " " + x.Employee.LastName)
: "",
LocationName = x.Location != null ? x.Location.Name : "",
WorkOrderNumber = x.WorkOrder != null ? x.WorkOrder.WorkerOrderNumber : "",
x.Status
})
.ToList();
return Ok(new Pagination_DTO
{
Data = data,
PageNumber = page,
PageSize = pageSize,
TotalCount = totalCount,
TotalPages = (int)Math.Ceiling(totalCount / (double)pageSize)
});
}
[HttpPost("Create")]
public async Task<IActionResult> Create(FollowUp_DTO dto)
{
var model = new FollowUps
{
Reason = dto.Reason,
ScheduleDate = dto.ScheduleDate,
ScheduleStartTime = dto.ScheduleStartTime,
EmployeeId = dto.EmployeeId,
WorkOrderId = dto.WorkOrderId,
AccountId = dto.AccountId,
LocationId = dto.LocationId,
Status = "Open",
CreatedDate = DateTime.UtcNow
};
_db.FollowUps.Add(model);
await _db.SaveChangesAsync();
return Ok(new DataResponse { Status = "200", Message = "Follow Up created" });
}
[HttpPost("Update")]
public async Task<IActionResult> Update(FollowUp_DTO dto)
{
var model = await _db.FollowUps.FindAsync(dto.Id);
if (model == null) return NotFound();
model.Reason = dto.Reason;
model.ScheduleDate = dto.ScheduleDate;
model.ScheduleStartTime = dto.ScheduleStartTime;
model.EmployeeId = dto.EmployeeId;
model.WorkOrderId = dto.WorkOrderId;
model.AccountId = dto.AccountId;
model.LocationId = dto.LocationId;
model.LastModificationTime = DateTime.UtcNow;
await _db.SaveChangesAsync();
return Ok(new DataResponse { Status = "200", Message = "Follow Up updated" });
}
[HttpPost("Complete")]
public async Task<IActionResult> Complete(int id)
{
var model = await _db.FollowUps.FindAsync(id);
if (model == null) return NotFound();
model.Status = "Completed";
model.LastModificationTime = DateTime.UtcNow;
await _db.SaveChangesAsync();
return Ok();
}
[HttpPost("Cancel")]
public async Task<IActionResult> Cancel(int id)
{
var model = await _db.FollowUps.FindAsync(id);
if (model == null) return NotFound();
model.Status = "Cancelled";
model.LastModificationTime = DateTime.UtcNow;
await _db.SaveChangesAsync();
return Ok();
}
}

View file

@ -0,0 +1,69 @@
using Api.SeaHavenIndustries.DTOs;
using Data.SeaHavenIndustries;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
[ApiController]
[Route("api/PMSchedule")]
public class PMScheduleController : ControllerBase
{
private readonly ApplicationDbContext _db;
public PMScheduleController(ApplicationDbContext db)
{
_db = db;
}
[HttpGet("GetList")]
public IActionResult GetList()
{
var data = _db.PMSchedules
.Include(x => x.Asset)
.Include(x => x.Location)
.OrderByDescending(x => x.Id)
.Select(x => new
{
x.Id,
x.Name,
x.Frequency,
x.StartDate,
x.IsActive,
Asset = x.Asset != null ? x.Asset.Name : null,
Location = x.Location != null ? x.Location.Name : null
})
.ToList();
return Ok(data);
}
[HttpPost("Save")]
public async Task<IActionResult> Save(PMSchedule_DTO dto)
{
PMSchedules model;
if (dto.Id == 0)
{
model = new PMSchedules
{
CreatedDate = DateTime.UtcNow
};
_db.PMSchedules.Add(model);
}
else
{
model = await _db.PMSchedules.FindAsync(dto.Id);
if (model == null) return NotFound();
model.LastModificationTime = DateTime.UtcNow;
}
model.Name = dto.Name;
model.Frequency = dto.Frequency;
model.StartDate = dto.StartDate;
model.IsActive = dto.IsActive;
model.AssetId = dto.AssetId;
model.LocationId = dto.LocationId;
await _db.SaveChangesAsync();
return Ok();
}
}

View file

@ -0,0 +1,30 @@
namespace Api.SeaHavenIndustries.DTOs
{
public class Account_DTO
{
public string? Name { get; set; }
public string? Type { get; set; }
public int? Importance { get; set; }
public int? TerritoryId { get; set; }
public int? OwnerEmployeeId { get; set; }
public string? PrivacySetting { get; set; }
public string? About { get; set; }
public string? Tags { get; set; }
public string? Phone { get; set; }
public string? Email { get; set; }
public int? IndustryId { get; set; }
public string? TimeZone { get; set; }
public string? Website { get; set; }
public string? CurrencyCode { get; set; }
public string? ServiceInstructions { get; set; }
public string? FacebookUrl { get; set; }
public string? LinkedInUrl { get; set; }
public string? TwitterUrl { get; set; }
}
public class EditAccount_DTO : Account_DTO
{
public int Id { get; set; }
}
}

View file

@ -0,0 +1,35 @@
namespace Api.SeaHavenIndustries.DTOs
{
public class AddEmployee_DTO
{
public string FirstName { get; set; } = null!;
public string LastName { get; set; } = null!;
public int? JobTitleId { get; set; }
public int? PermissionGroupId { get; set; }
public string? Email { get; set; }
public string? Phone { get; set; }
public string? PhoneExtension { get; set; }
public string? Status { get; set; }
public DateTime? LastLogin { get; set; }
}
public class EditEmployee_DTO : AddEmployee_DTO
{
public int Id { get; set; }
}
public class EmployeeListItem_DTO
{
public int Id { get; set; }
public string Name { get; set; } = "";
public string JobTitle { get; set; } = "";
public string Role { get; set; } = "";
public string? Email { get; set; }
public string? Phone { get; set; }
public string? Status { get; set; }
public DateTime? LastLogin { get; set; }
}
}

View file

@ -0,0 +1,17 @@
namespace Api.SeaHavenIndustries.DTOs
{
public class FollowUp_DTO
{
public int Id { get; set; }
public string Reason { get; set; } = null!;
public DateTime ScheduleDate { get; set; }
public TimeSpan ScheduleStartTime { get; set; }
public int? EmployeeId { get; set; }
public int? WorkOrderId { get; set; }
public int? AccountId { get; set; }
public int? LocationId { get; set; }
}
}

View file

@ -0,0 +1,13 @@
namespace Api.SeaHavenIndustries.DTOs
{
public class PMSchedule_DTO
{
public int Id { get; set; }
public string Name { get; set; } = null!;
public string Frequency { get; set; } = null!;
public DateTime StartDate { get; set; }
public bool IsActive { get; set; }
public int? AssetId { get; set; }
public int? LocationId { get; set; }
}
}

View file

@ -30,13 +30,22 @@ namespace Data.SeaHavenIndustries
public DbSet<Contacts> Contacts { get; set; }
public DbSet<WorkOrder> workOrders { get; set; }
public DbSet<Template> Templates { get; set; }
public DbSet<Comments> Comments { get; set; }
public DbSet<Quotes> Quotes { get; set; }
public DbSet<QuotesLineItems> QuotesLines { get; set; }
public DbSet<ForgetPasswordCode> ForgetPasswordCodes { get; set; }
public DbSet<WorkOrderContacts> WorkOrderContacts { get; set; }
public DbSet<WorkOrderCategories> workOrderCategories { get; set; }
public DbSet<WorkOrderAttachments> workOrderAttachments { get; set; }
public DbSet<Comments> Comments { get; set; }
public DbSet<Quotes> Quotes { get; set; }
public DbSet<QuotesLineItems> QuotesLines { get; set; }
public DbSet<ForgetPasswordCode> ForgetPasswordCodes { get; set; }
public DbSet<WorkOrderContacts> WorkOrderContacts { get; set; }
public DbSet<WorkOrderCategories> workOrderCategories { get; set; }
public DbSet<WorkOrderAttachments> workOrderAttachments { get; set; }
// New DbSets for added entities
public DbSet<Accounts> Accounts { get; set; }
public DbSet<Addresses> Addresses { get; set; }
public DbSet<Assets> Assets { get; set; }
public DbSet<Employee> Employees { get; set; }
public DbSet<FollowUps> FollowUps { get; set; }
public DbSet<PMSchedules> PMSchedules { get; set; }
public DbSet<ContactDetails> ContactDetails { get; set; }
}
public class ApplicationUser : IdentityUser

View file

@ -0,0 +1,33 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace Data.SeaHavenIndustries
{
public class Accounts : FullAuditEntity
{
public string? Name { get; set; }
public string? Type { get; set; } // e.g., Customer, Vendor
public int? Importance { get; set; } // 1-5
public int? TerritoryId { get; set; }
public int? OwnerEmployeeId { get; set; }
public string? PrivacySetting { get; set; }
public string? About { get; set; }
public string? Tags { get; set; }
public string? Phone { get; set; }
public string? Email { get; set; }
public int? IndustryId { get; set; }
public string? TimeZone { get; set; }
public string? Website { get; set; }
public string? CurrencyCode { get; set; }
public string? ServiceInstructions { get; set; }
public string? FacebookUrl { get; set; }
public string? LinkedInUrl { get; set; }
public string? TwitterUrl { get; set; }
// Relationships
public ICollection<Contacts>? Contacts { get; set; }
public ICollection<Addresses>? Addresses { get; set; }
}
}

View file

@ -0,0 +1,26 @@
using System.ComponentModel.DataAnnotations.Schema;
namespace Data.SeaHavenIndustries
{
public class Addresses : FullAuditEntity
{
public string? AddressType { get; set; } // Billing / Shipping / Other
public string? Address1 { get; set; }
public string? Address2 { get; set; }
public string? City { get; set; }
public string? State { get; set; }
public string? Zip { get; set; }
public string? Country { get; set; }
public string? County { get; set; }
// Foreign Keys
public int? AccountId { get; set; }
public int? ContactId { get; set; }
[ForeignKey(nameof(AccountId))]
public virtual Accounts? Account { get; set; }
[ForeignKey(nameof(ContactId))]
public virtual Contacts? Contact { get; set; }
}
}

View file

@ -0,0 +1,21 @@
using System.Collections.Generic;
namespace Data.SeaHavenIndustries
{
public class Assets : FullAuditEntity
{
public string AssetCode { get; set; } = null!;
public string Name { get; set; } = null!;
public string? Description { get; set; }
public int? AccountId { get; set; }
public int? LocationId { get; set; }
public bool IsActive { get; set; } = true;
public Accounts? Account { get; set; }
public Locations? Location { get; set; }
public ICollection<PMSchedules> PMSchedules { get; set; } = new List<PMSchedules>();
}
}

View file

@ -0,0 +1,23 @@
using System;
using System.ComponentModel.DataAnnotations.Schema;
namespace Data.SeaHavenIndustries
{
public class ContactDetails : FullAuditEntity
{
public int ContactId { get; set; }
[ForeignKey(nameof(ContactId))]
public Contacts Contact { get; set; }
public string? Gender { get; set; }
public DateTime? DateOfBirth { get; set; }
public string? Territory { get; set; }
public string? PrivacySetting { get; set; }
public string? About { get; set; }
public string? Tags { get; set; }
public string? FacebookUrl { get; set; }
public string? LinkedInUrl { get; set; }
public string? TwitterUrl { get; set; }
}
}

View file

@ -0,0 +1,122 @@
using System.ComponentModel.DataAnnotations;
namespace Data.SeaHavenIndustries
{
public class Employee
{
public int Id { get; set; }
// General
[Required]
public string FirstName { get; set; } = null!;
public string? MiddleName { get; set; }
[Required]
public string LastName { get; set; } = null!;
public int? DepartmentId { get; set; }
public string? TimeZone { get; set; }
public int? Gender { get; set; }
public DateTime? DateOfBirth { get; set; }
public int? JobTitleId { get; set; }
public string? EmployeeNumber { get; set; }
public DateTime? HireDate { get; set; }
public int? RegionId { get; set; }
public bool? CanChangeProviderNumber { get; set; }
public string? About { get; set; }
// Login & Role
public int? PermissionGroupId { get; set; }
public string? UserName { get; set; }
public string? ConfirmUserName { get; set; }
// Additional
public string? SMSAddress { get; set; }
public string? Website { get; set; }
// Social
public string? FacebookUrl { get; set; }
public string? LinkedInUrl { get; set; }
public string? TwitterUrl { get; set; }
// Status
public string? Status { get; set; }
public DateTime? LastLogin { get; set; }
// Audit
public bool? IsDeleted { get; set; }
public string? CreatedBy { get; set; }
public DateTime? CreatedDate { get; set; }
public DateTime? LastModificationTime { get; set; }
public int? LastModifierUserId { get; set; }
// Navigation
public Department? Department { get; set; }
public JobTitle? JobTitle { get; set; }
public Region? Region { get; set; }
public EmployeeAddress? Address { get; set; }
public ICollection<EmployeePhone> Phones { get; set; } = new List<EmployeePhone>();
public ICollection<EmployeeEmail> Emails { get; set; } = new List<EmployeeEmail>();
}
public class EmployeeAddress
{
public int Id { get; set; }
public int EmployeeId { get; set; }
public string? Street { get; set; }
public string? StreetLineTwo { get; set; }
public string? City { get; set; }
public string? Zip { get; set; }
public string? CountryCode { get; set; }
public string? StateCode { get; set; }
public int? CountyId { get; set; }
public Employee Employee { get; set; } = null!;
}
public class EmployeePhone
{
public int Id { get; set; }
public int EmployeeId { get; set; }
public int? PhoneTypeId { get; set; }
public string? Number { get; set; }
public string? Extension { get; set; }
public bool? IsPrimary { get; set; }
public Employee Employee { get; set; } = null!;
}
public class EmployeeEmail : FullAuditEntity
{
public int EmployeeId { get; set; }
public Employee? Employee { get; set; }
public int? EmailTypeId { get; set; }
[MaxLength(256)]
public string? Address { get; set; }
public bool? IsPrimary { get; set; }
}
public class Department : FullAuditEntity
{
[MaxLength(200)]
public string Name { get; set; } = null!;
public ICollection<Employee>? Employees { get; set; }
}
public class JobTitle : FullAuditEntity
{
[MaxLength(200)]
public string Name { get; set; } = null!;
public ICollection<Employee>? Employees { get; set; }
}
public class Region : FullAuditEntity
{
[MaxLength(200)]
public string Name { get; set; } = null!;
public ICollection<Employee>? Employees { get; set; }
}
}

View file

@ -0,0 +1,32 @@
using System;
using System.ComponentModel.DataAnnotations.Schema;
namespace Data.SeaHavenIndustries
{
public class FollowUps : FullAuditEntity
{
public string Reason { get; set; } = null!;
public DateTime ScheduleDate { get; set; }
public TimeSpan ScheduleStartTime { get; set; }
public string Status { get; set; } = "Open"; // Open | Completed | Cancelled
public int? EmployeeId { get; set; }
public int? WorkOrderId { get; set; }
public int? AccountId { get; set; }
public int? LocationId { get; set; }
[ForeignKey(nameof(EmployeeId))]
public Employee? Employee { get; set; }
[ForeignKey(nameof(WorkOrderId))]
public WorkOrder? WorkOrder { get; set; }
[ForeignKey(nameof(AccountId))]
public Accounts? Account { get; set; }
[ForeignKey(nameof(LocationId))]
public Locations? Location { get; set; }
}
}

View file

@ -0,0 +1,16 @@
namespace Data.SeaHavenIndustries
{
public class PMSchedules : FullAuditEntity
{
public string Name { get; set; } = null!;
public string Frequency { get; set; } = null!; // Monthly, Quarterly, etc
public DateTime StartDate { get; set; }
public bool IsActive { get; set; } = true;
public int? AssetId { get; set; }
public int? LocationId { get; set; }
public Assets? Asset { get; set; }
public Locations? Location { get; set; }
}
}