diff --git a/.claude/settings.local.json b/.claude/settings.local.json
deleted file mode 100644
index a8da82e..0000000
--- a/.claude/settings.local.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "permissions": {
- "allow": [
- "Bash(dotnet build:*)",
- "WebSearch",
- "Bash(dotnet add:*)"
- ],
- "deny": [],
- "ask": []
- }
-}
diff --git a/BMA.EHR.Recruit.csproj b/BMA.EHR.Recruit.Service.csproj
similarity index 95%
rename from BMA.EHR.Recruit.csproj
rename to BMA.EHR.Recruit.Service.csproj
index c148fa1..4f3c513 100644
--- a/BMA.EHR.Recruit.csproj
+++ b/BMA.EHR.Recruit.Service.csproj
@@ -7,6 +7,7 @@
d45c95ce-6b9d-4aa7-aaaf-62fe8b792934
Linux
True
+ BMA.EHR.Recruit.Service
@@ -22,10 +23,7 @@
-
-
-
diff --git a/BMA.EHR.Recruit.Service.csproj.user b/BMA.EHR.Recruit.Service.csproj.user
new file mode 100644
index 0000000..96e63d6
--- /dev/null
+++ b/BMA.EHR.Recruit.Service.csproj.user
@@ -0,0 +1,9 @@
+
+
+
+ https
+
+
+ ProjectDebugger
+
+
\ No newline at end of file
diff --git a/BMA.EHR.Recruit.Service.sln b/BMA.EHR.Recruit.Service.sln
index 65a413c..95679a8 100644
--- a/BMA.EHR.Recruit.Service.sln
+++ b/BMA.EHR.Recruit.Service.sln
@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.33424.131
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BMA.EHR.Recruit", "BMA.EHR.Recruit.csproj", "{3FBBE410-D10A-4FF6-9BEE-F663381CCA22}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BMA.EHR.Recruit.Service", "BMA.EHR.Recruit.Service.csproj", "{3FBBE410-D10A-4FF6-9BEE-F663381CCA22}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
diff --git a/CLAUDE.md b/CLAUDE.md
deleted file mode 100644
index 273523d..0000000
--- a/CLAUDE.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# CLAUDE.md
-
-This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
-
-## Build & Run
-
-```bash
-dotnet build BMA.EHR.Recruit.Service.sln
-dotnet build BMA.EHR.Recruit.Service.sln -c Release
-dotnet publish -c Release -o /app/publish /p:UseAppHost=false
-```
-
-No test projects exist in this solution.
-
-## Architecture
-
-**Stack:** ASP.NET Core 7.0 Web API / EF Core 7.0 / MySQL (Pomelo) / MinIO (S3) / Keycloak (JWT)
-
-**Pattern:** Controllers → Services → EF Core DbContext (no repository layer for main data)
-
-### Multiple DbContexts
-Three separate MySQL databases, each with its own `DbContext`:
-- `ApplicationDbContext` — Recruitment data (Recruits, Scores, Imports)
-- `OrgDbContext` — Organization data
-- `MetadataDbContext` — Metadata
-
-All registered as `Transient` lifetime. Auto-migration runs on startup.
-
-### Controllers
-- `BaseController` provides standardized `Success()` / `Error()` response methods returning `ResponseObject` (Status, Message, Result)
-- `RecruitController` is the sole business controller (route: `api/v{version}/recruit`)
-- API versioning enabled via `Microsoft.AspNetCore.Mvc.Versioning`
-
-### Background Import System
-Excel file imports run asynchronously through a Channel-based queue:
-- `ImportBackgroundService` (BackgroundService) — dequeues and processes jobs
-- `ImportJobQueue` — bounded Channel (capacity 100)
-- `ImportJobTracker` — in-memory ConcurrentDictionary tracking
-
-Four import types: `CandidateFile`, `CandidateFileById`, `ScoreFile`, `ResultFile`
-
-All imports use `EFCore.BulkExtensions.MySql` (v6.7.16) for bulk operations to handle 50,000+ rows without memory issues. Pattern:
-1. Insert parent/history entities via `SaveChangesAsync` (small operations)
-2. `ChangeTracker.Clear()` to release references
-3. Collect entities into separate `List` per table
-4. `BulkInsertAsync` with `SetOutputIdentity = true` for parent entities
-5. Assign generated Ids to child entities
-6. `BulkInsertAsync` for each child entity table separately
-7. Batch size: 500
-
-### Entity Models
-All entities inherit from `EntityBase` (Guid `Id` PK, audit fields: `CreatedAt`, `CreatedUserId`, `LastUpdatedAt`, etc.). Models are in `Models/` with subdirectories: `Recruits/`, `Documents/`, `HR/`, `MetaData/`, `Placement/`.
-
-Key relationships use navigation properties without explicit FK properties (EF shadow properties). Configured via fluent API in `OnModelCreating`.
-
-### External Services
-- **Authentication:** Keycloak JWT Bearer (`hrmsbkk-id.case-collection.com/realms/hrms`)
-- **File Storage:** MinIO via `MinIOService` (AWS S3 SDK)
-- **Search/Logging:** Elasticsearch (NEST client)
-- **Excel:** EPPlus for reading import files
-
-## Key Files
-
-- `Program.cs` — Service registration, middleware pipeline, auto-migration
-- `Data/ApplicationDbContext.cs` — EF Core fluent API relationship configuration
-- `Services/ImportBackgroundService.cs` — All bulk import logic (4 import methods)
-- `Services/RecruitService.cs` — Core business logic
-- `Controllers/BaseController.cs` — Standard response helpers
-- `Responses/ResponseObject.cs` — Standard API response envelope
-
-## Conventions
-
-- Language: C# with nullable reference types enabled
-- Naming: PascalCase properties, `_camelCase` parameters in service methods
-- API responses: Always wrapped in `ResponseObject`
-- Authorization: `[Authorize]` on controllers, user context from JWT claims
diff --git a/ConfigureSwaggerOptions.cs b/ConfigureSwaggerOptions.cs
index 7284102..17da340 100644
--- a/ConfigureSwaggerOptions.cs
+++ b/ConfigureSwaggerOptions.cs
@@ -4,7 +4,7 @@ using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Reflection;
-namespace BMA.EHR.Recruit
+namespace BMA.EHR.Recruit.Service
{
public class ConfigureSwaggerOptions : IConfigureNamedOptions
{
diff --git a/Controllers/BaseController.cs b/Controllers/BaseController.cs
index 033134e..89d5494 100644
--- a/Controllers/BaseController.cs
+++ b/Controllers/BaseController.cs
@@ -1,12 +1,11 @@
// using BMA.EHR.Core;
-
-using BMA.EHR.Recruit.Services;
+using BMA.EHR.Recruit.Service.Responses;
+using BMA.EHR.Recruit.Service.Services;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Net;
-using BMA.EHR.Recruit.Responses;
-namespace BMA.EHR.Recruit.Controllers
+namespace BMA.EHR.Recruit.Service.Controllers
{
public class BaseController : ControllerBase
{
diff --git a/Controllers/RecruitController.cs b/Controllers/RecruitController.cs
index 7d246ff..73b39df 100644
--- a/Controllers/RecruitController.cs
+++ b/Controllers/RecruitController.cs
@@ -1,6 +1,13 @@
using Amazon.S3.Model;
using BMA.EHR.MetaData.Service.Models;
using BMA.EHR.Profile.Service.Models.HR;
+using BMA.EHR.Recruit.Service.Core;
+using BMA.EHR.Recruit.Service.Data;
+using BMA.EHR.Recruit.Service.Extensions;
+using BMA.EHR.Recruit.Service.Models.Recruits;
+using BMA.EHR.Recruit.Service.Requests.Recruits;
+using BMA.EHR.Recruit.Service.Responses;
+using BMA.EHR.Recruit.Service.Services;
using BMA.EHR.Recurit.Service.Data;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
@@ -24,15 +31,8 @@ using System.Globalization;
using OfficeOpenXml.Style;
using System.Drawing;
using System.Linq;
-using BMA.EHR.Recruit.Core;
-using BMA.EHR.Recruit.Data;
-using BMA.EHR.Recruit.Extensions;
-using BMA.EHR.Recruit.Models.Recruits;
-using BMA.EHR.Recruit.Requests.Recruits;
-using BMA.EHR.Recruit.Responses;
-using BMA.EHR.Recruit.Services;
-namespace BMA.EHR.Recruit.Controllers
+namespace BMA.EHR.Recruit.Service.Controllers
{
[Route("api/v{version:apiVersion}/recruit")]
[ApiVersion("1.0")]
@@ -53,8 +53,6 @@ namespace BMA.EHR.Recruit.Controllers
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly ILogger _logger;
private readonly IConfiguration _configuration;
- private readonly ImportJobQueue _importJobQueue;
- private readonly ImportJobTracker _importJobTracker;
//private readonly DateTimeExtension;
#endregion
@@ -69,9 +67,7 @@ namespace BMA.EHR.Recruit.Controllers
IHttpContextAccessor httpContextAccessor,
ILogger logger,
IConfiguration configuration,
- PermissionRepository permission,
- ImportJobQueue importJobQueue,
- ImportJobTracker importJobTracker
+ PermissionRepository permission
//DateTimeExtension extensions
)
{
@@ -84,8 +80,6 @@ namespace BMA.EHR.Recruit.Controllers
_configuration = configuration;
_logger = logger;
_permission = permission;
- _importJobQueue = importJobQueue;
- _importJobTracker = importJobTracker;
//_extensions = extensions;
}
@@ -377,7 +371,6 @@ namespace BMA.EHR.Recruit.Controllers
try
{
var data = await _context.RecruitImports.AsQueryable()
- .AsNoTracking()
.Include(x => x.RecruitImages)
.ThenInclude(x => x.Document)
.Include(x => x.RecruitDocuments)
@@ -706,6 +699,7 @@ namespace BMA.EHR.Recruit.Controllers
Directory.CreateDirectory(tmpDir);
var importFile = Path.Combine(tmpDir, $"c_{DateTime.Now.ToString("ddMMyyyyHHmmss")}.xlsx");
+ var import_doc_id = "";
try
{
@@ -716,15 +710,11 @@ namespace BMA.EHR.Recruit.Controllers
var file = Request.Form.Files[0];
var doc = await _minioService.UploadFileAsync(file);
- var import_doc_id = doc.Id.ToString("D");
+ import_doc_id = doc.Id.ToString("D");
- // Write file to disk directly from IFormFile instead of downloading back from MinIO
- using (var stream = new FileStream(importFile, FileMode.Create))
- {
- await file.CopyToAsync(stream);
- }
+ var fileContent = (await _minioService.DownloadFileAsync(doc.Id)).FileContent;
- // สร้างรอบการบรรจุ
+ // สร้างรอบการบรรจุ โดยเอาเข้ามูลมาใส่จาก Request
var imported = new RecruitImport
{
Year = req.Year,
@@ -747,28 +737,164 @@ namespace BMA.EHR.Recruit.Controllers
};
await _context.RecruitImports.AddAsync(imported);
- await _context.SaveChangesAsync();
+ await _context.SaveChangesAsync(); // Save import first to get Id
- // Enqueue background job
- var job = _importJobTracker.CreateJob(new ImportJobInfo
+ // import datafile
+ System.IO.File.WriteAllBytes(importFile, fileContent);
+
+ using (var c_package = new ExcelPackage(new FileInfo(importFile)))
{
- JobType = ImportJobType.CandidateFile,
- ImportFile = importFile,
- RecruitImportId = imported.Id,
- ImportDocId = import_doc_id,
- UserId = UserId,
- FullName = FullName,
- Token = token,
- Request = req,
- });
- await _importJobQueue.EnqueueAsync(job);
+ // loop from sheet2 to end
+
+ for (int i = 0; i < c_package.Workbook.Worksheets.Count; i++)
+ {
+ var workSheet = c_package.Workbook.Worksheets[i];
+ var totalRows = workSheet.Dimension.Rows;
+ var cols = workSheet.GetHeaderColumns();
+
+ int row = 2;
+ int batchCount = 0;
+ const int batchSize = 500;
+
+ while (row <= totalRows)
+ {
+ var cell1 = workSheet?.Cells[row, 1]?.GetValue();
+ if (cell1 == "" || cell1 == null) break;
+
+ var r = new Models.Recruits.Recruit();
+ r.ExamId = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.ExamID)]?.GetValue();
+ r.CitizenId = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.PersonalID)]?.GetValue();
+ r.Prefix = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Prefix)]?.GetValue();
+ r.FirstName = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.FirstName)]?.GetValue();
+ r.LastName = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.LastName)]?.GetValue();
+ r.Gendor = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Gender)]?.GetValue();
+ r.National = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.National)]?.GetValue().IsNull("");
+ r.Race = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Race)]?.GetValue().IsNull("");
+ r.Religion = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Religion)]?.GetValue().IsNull("");
+ r.DateOfBirth = Convert.ToDateTime(workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.DateOfBirth)]?.GetValue().ToDateTime(DateTimeFormat.Ymd, "-"));
+ r.Marry = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Marry)]?.GetValue();
+ r.Isspecial = "N";
+ r.CitizenCardIssuer = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.PersonalCardIssue)]?.GetValue();
+ r.CitizenCardExpireDate = Convert.ToDateTime(workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.PersonalCardExpireDate)]?.GetValue().ToDateTime(DateTimeFormat.Ymd, "-"));
+ r.ApplyDate = (DateTime)workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.ApplyDate)]?.GetValue();
+ r.PositionName = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.PositionName)]?.GetValue().IsNull("");
+ r.PositionType = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.PositionType)]?.GetValue().IsNull("");
+ r.PositionLevel = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.PositionLevel)]?.GetValue().IsNull("");
+
+
+ // address
+ r.Addresses.Add(new RecruitAddress()
+ {
+ Address = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Address)]?.GetValue() ?? "",
+ Moo = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Moo)]?.GetValue() ?? "",
+ Soi = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Soi)]?.GetValue() ?? "",
+ Road = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Road)]?.GetValue() ?? "",
+ District = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.District)]?.GetValue() ?? "",
+ Amphur = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Amphur)]?.GetValue() ?? "",
+ Province = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Province)]?.GetValue() ?? "",
+ ZipCode = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.ZipCode)]?.GetValue() ?? "",
+ Telephone = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Telephone)]?.GetValue() ?? "",
+ Mobile = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Mobile)]?.GetValue() ?? "",
+ Address1 = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Address1)]?.GetValue() ?? "",
+ Moo1 = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Moo1)]?.GetValue() ?? "",
+ Soi1 = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Soi1)]?.GetValue() ?? "",
+ Road1 = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Road1)]?.GetValue() ?? "",
+ District1 = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.District1)]?.GetValue() ?? "",
+ Amphur1 = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Amphur1)]?.GetValue() ?? "",
+ Province1 = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Province1)]?.GetValue() ?? "",
+ ZipCode1 = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.ZipCode1)]?.GetValue() ?? "",
+ });
+
+ // payment
+ r.Payments.Add(new RecruitPayment()
+ {
+ PaymentId = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.PaymentID)]?.GetValue() ?? "",
+ CompanyCode = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.CompanyCode)]?.GetValue() ?? "",
+ TextFile = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.TextFile)]?.GetValue() ?? "",
+ BankCode = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.BankCode)]?.GetValue() ?? "",
+ AccountNumber = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.AccouontNumer)]?.GetValue() ?? "",
+ TransDate = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.TransDate)]?.GetValue() ?? "",
+ TransTime = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.TransTime)]?.GetValue() ?? "",
+ CustomerName = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.CustomerName)]?.GetValue() ?? "",
+ RefNo1 = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.RefNo1)]?.GetValue() ?? "",
+ TermBranch = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.TermBranch)]?.GetValue() ?? "",
+ TellerId = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.TellerID)]?.GetValue() ?? "",
+ CreditDebit = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.CreditDebit)]?.GetValue() ?? "",
+ PaymentType = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Type)]?.GetValue(),
+ ChequeNo = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.ChequeNo)]?.GetValue() ?? "",
+ Amount = (decimal)workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Amount)]?.GetValue(),
+ ChqueBankCode = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.ChqBankCode)]?.GetValue() ?? ""
+ });
+
+ // occupation
+ r.Occupations.Add(new RecruitOccupation()
+ {
+ Occupation = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Occupation)]?.GetValue() ?? "",
+ Position = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Position)]?.GetValue() ?? "",
+ Workplace = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Workplace)]?.GetValue() ?? "",
+ Telephone = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.WorkplaceTelephone)]?.GetValue() ?? "",
+ WorkAge = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.WorkAge)]?.GetValue() ?? "",
+ });
+
+ // certificate
+ r.Certificates.Add(new RecruitCertificate()
+ {
+ CertificateNo = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.CertificateNo)]?.GetValue() ?? "",
+ Description = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.CertificateDesc)]?.GetValue() ?? "",
+ IssueDate = Convert.ToDateTime(workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.CertificateIssueDate)]?.GetValue().ToDateTime(DateTimeFormat.Ymd, "-")),
+ ExpiredDate = Convert.ToDateTime(workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.CertificateExpireDate)]?.GetValue().ToDateTime(DateTimeFormat.Ymd, "-"))
+ });
+
+ r.Educations.Add(new RecruitEducation()
+ {
+ Degree = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Degree)]?.GetValue() ?? "",
+ Major = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.Major)]?.GetValue() ?? "",
+ MajorGroupId = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.MajorGroupID)]?.GetValue() ?? "",
+ MajorGroupName = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.MajorGroupName)]?.GetValue() ?? "",
+ University = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.University)]?.GetValue() ?? "",
+ GPA = (double)workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.GPA)]?.GetValue(),
+ Specialist = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.SpecialList)]?.GetValue() ?? "",
+ HighDegree = workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.HighDegree)]?.GetValue() ?? "",
+ BachelorDate = Convert.ToDateTime(workSheet?.Cells[row, GetColumnIndex(cols, CandidateFileHeader.BachelorDate)]?.GetValue().ToDateTime(DateTimeFormat.Ymd, "-"))
+ });
+
+ r.RecruitImport = imported;
+ _context.Recruits.Add(r);
+
+ //imported.Recruits.Add(r);
+ row++;
+ batchCount++;
+
+ // Batch save to prevent OutOfMemoryException on large imports
+ if (batchCount >= batchSize)
+ {
+ _context.SaveChanges();
+ _context.ChangeTracker.Clear();
+ // Re-attach the import entity as Unchanged after clearing the tracker
+ _context.Entry(imported).State = EntityState.Unchanged;
+ batchCount = 0;
+ }
+
+ }
+ }
+ }
+
+ // Save remaining records in the last batch
+ _context.SaveChanges();
+
+ return Success();
- return Success(new { jobId = job.JobId, status = "queued" });
}
catch (Exception ex)
{
+ await _minioService.DeleteFileAsync(Guid.Parse(import_doc_id));
return Error(ex);
}
+ finally
+ {
+ if (System.IO.File.Exists(importFile))
+ System.IO.File.Delete(importFile);
+ }
}
///
@@ -907,6 +1033,7 @@ namespace BMA.EHR.Recruit.Controllers
Directory.CreateDirectory(tmpDir);
var importFile = Path.Combine(tmpDir, $"c_{DateTime.Now.ToString("ddMMyyyyHHmmss")}.xlsx");
+ var import_doc_id = "";
try
{
@@ -919,6 +1046,16 @@ namespace BMA.EHR.Recruit.Controllers
.Include(x => x.ImportHostories)
.Include(x => x.ImportFile)
.Include(x => x.Recruits)
+ .ThenInclude(x => x.Addresses)
+ .Include(x => x.Recruits)
+ .ThenInclude(x => x.Occupations)
+ .Include(x => x.Recruits)
+ .ThenInclude(x => x.Certificates)
+ .Include(x => x.Recruits)
+ .ThenInclude(x => x.Educations)
+ .Include(x => x.Recruits)
+ .ThenInclude(x => x.Payments)
+ .Include(x => x.Recruits)
.FirstOrDefaultAsync(x => x.Id == id);
if (imported == null)
@@ -926,39 +1063,225 @@ namespace BMA.EHR.Recruit.Controllers
if (imported.Recruits != null)
{
+ // remove old score data
_context.Recruits.RemoveRange(imported.Recruits);
await _context.SaveChangesAsync();
}
var file = Request.Form.Files[0];
var doc = await _minioService.UploadFileAsync(file);
- var import_doc_id = doc.Id.ToString("D");
+ import_doc_id = doc.Id.ToString("D");
- // Write file to disk directly from IFormFile instead of downloading back from MinIO
- using (var stream = new FileStream(importFile, FileMode.Create))
+ var fileContent = (await _minioService.DownloadFileAsync(doc.Id)).FileContent;
+
+ // สร้างรอบการบรรจุ โดยเอาเข้ามูลมาใส่จาก Request
+ imported.ImportHostories.Add(new RecruitImportHistory
{
- await file.CopyToAsync(stream);
+ Description = "นำเข้าข้อมูลผู้สมัครสอบแข่งขัน",
+ CreatedAt = DateTime.Now,
+ CreatedUserId = UserId ?? "",
+ CreatedFullName = FullName ?? "System Administrator",
+ LastUpdatedAt = DateTime.Now,
+ LastUpdateUserId = UserId ?? "",
+ LastUpdateFullName = FullName ?? "System Administrator",
+ });
+
+ //await _context.RecruitImports.AddAsync(imported);
+
+ // import datafile
+ System.IO.File.WriteAllBytes(importFile, fileContent);
+
+ using (var c_package = new ExcelPackage(new FileInfo(importFile)))
+ {
+ // loop from sheet2 to end
+
+ for (int i = 0; i < c_package.Workbook.Worksheets.Count; i++)
+ {
+ var workSheet = c_package.Workbook.Worksheets[i];
+ var totalRows = workSheet.Dimension.Rows;
+ var cols = workSheet.GetHeaderColumns();
+
+ int row = 2;
+ int batchCount = 0;
+ const int batchSize = 500;
+
+ while (row <= totalRows)
+ {
+ var cell1 = workSheet?.Cells[row, 1]?.GetValue();
+ if (cell1 == "" || cell1 == null) break;
+
+ var r = new Models.Recruits.Recruit();
+ r.ExamId = workSheet?.Cells[row, 1]?.GetValue() ?? "";
+ r.PositionName = workSheet?.Cells[row, 3]?.GetValue() ?? "";
+ r.HddPosition = workSheet?.Cells[row, 4]?.GetValue() ?? "";
+ r.Prefix = workSheet?.Cells[row, 5]?.GetValue() == "อื่น ๆ" ? workSheet?.Cells[row, 6]?.GetValue() ?? "" : workSheet?.Cells[row, 5]?.GetValue() ?? "";
+ r.FirstName = workSheet?.Cells[row, 7]?.GetValue() ?? "";
+ r.LastName = workSheet?.Cells[row, 8]?.GetValue() ?? "";
+ r.Gendor = workSheet?.Cells[row, 98]?.GetValue() ?? "";
+ r.National = workSheet?.Cells[row, 9]?.GetValue() ?? "";
+ r.Race = "";
+ r.Religion = workSheet?.Cells[row, 10]?.GetValue() ?? "";
+ r.DateOfBirth = !string.IsNullOrWhiteSpace(workSheet?.Cells[row, 11]?.GetValue()) ? _recruitService.CheckDateTime(workSheet?.Cells[row, 11]?.GetValue() ?? "", "dd/MM/yyyy") : null;
+ r.CitizenId = workSheet?.Cells[row, 12]?.GetValue() ?? "";
+ r.typeTest = workSheet?.Cells[row, 13]?.GetValue() ?? "";
+ r.Marry = "";
+ r.Isspecial = "N";
+ r.CitizenCardExpireDate = null;
+ r.ModifiedDate = null;
+ r.ApplyDate = !string.IsNullOrWhiteSpace(workSheet?.Cells[row, 87]?.GetValue()) ? _recruitService.CheckDateTime(workSheet?.Cells[row, 87]?.GetValue() ?? "", "dd/MM/yyyy") : null;
+ r.PositionType = "";
+ r.PositionLevel = "";
+ r.CreatedAt = DateTime.Now;
+ r.CreatedUserId = UserId ?? "";
+ r.CreatedFullName = FullName ?? "System Administrator";
+ r.LastUpdatedAt = DateTime.Now;
+ r.LastUpdateUserId = UserId ?? "";
+ r.LastUpdateFullName = FullName ?? "System Administrator";
+
+ // education
+ r.Educations.Add(new RecruitEducation()
+ {
+ Degree = workSheet?.Cells[row, 18]?.GetValue() ?? "",
+ Major = workSheet?.Cells[row, 19]?.GetValue() == "อื่น ๆ" ? workSheet?.Cells[row, 20]?.GetValue() ?? "" : workSheet?.Cells[row, 19]?.GetValue() ?? "",
+ MajorGroupId = "",
+ MajorGroupName = "",
+ University = workSheet?.Cells[row, 21]?.GetValue() == "อื่น ๆ" ? workSheet?.Cells[row, 22]?.GetValue() ?? "" : workSheet?.Cells[row, 21]?.GetValue() ?? "",
+ GPA = (double)workSheet?.Cells[row, 26]?.GetValue(),
+ Specialist = "",
+ HighDegree = workSheet?.Cells[row, 27]?.GetValue() ?? "",
+ BachelorDate = !string.IsNullOrWhiteSpace(workSheet?.Cells[row, 25]?.GetValue()) ? _recruitService.CheckDateTime(workSheet?.Cells[row, 25]?.GetValue() ?? "", "dd/MM/yyyy") : null,
+ CreatedAt = DateTime.Now,
+ CreatedUserId = UserId ?? "",
+ CreatedFullName = FullName ?? "System Administrator",
+ LastUpdatedAt = DateTime.Now,
+ LastUpdateUserId = UserId ?? "",
+ LastUpdateFullName = FullName ?? "System Administrator"
+ });
+
+ // occupation
+ r.Occupations.Add(new RecruitOccupation()
+ {
+ Occupation = workSheet?.Cells[row, 33]?.GetValue() == "อื่น ๆ" ? workSheet?.Cells[row, 34]?.GetValue() ?? "" : workSheet?.Cells[row, 33]?.GetValue() ?? "",
+ Position = workSheet?.Cells[row, 37]?.GetValue() ?? "",
+ Workplace = $"{(workSheet?.Cells[row, 36]?.GetValue() ?? "")} {(workSheet?.Cells[row, 35]?.GetValue() ?? "")}",
+ Telephone = workSheet?.Cells[row, 9999]?.GetValue() ?? "",
+ WorkAge = workSheet?.Cells[row, 9999]?.GetValue() ?? "",
+ CreatedAt = DateTime.Now,
+ CreatedUserId = UserId ?? "",
+ CreatedFullName = FullName ?? "System Administrator",
+ LastUpdatedAt = DateTime.Now,
+ LastUpdateUserId = UserId ?? "",
+ LastUpdateFullName = FullName ?? "System Administrator"
+ });
+
+ // address
+ r.Addresses.Add(new RecruitAddress()
+ {
+ Address = $"{(workSheet?.Cells[row, 49]?.GetValue() ?? "")} {(workSheet?.Cells[row, 50]?.GetValue() ?? "")}",
+ Moo = workSheet?.Cells[row, 51]?.GetValue() ?? "",
+ Soi = workSheet?.Cells[row, 52]?.GetValue() ?? "",
+ Road = workSheet?.Cells[row, 53]?.GetValue() ?? "",
+ District = workSheet?.Cells[row, 54]?.GetValue() ?? "",
+ Amphur = workSheet?.Cells[row, 55]?.GetValue() ?? "",
+ Province = workSheet?.Cells[row, 56]?.GetValue() ?? "",
+ ZipCode = (workSheet?.Cells[row, 57]?.GetValue() ?? "").Trim(),
+ Telephone = workSheet?.Cells[row, 58]?.GetValue() ?? "",
+ Mobile = "",
+ Address1 = $"{(workSheet?.Cells[row, 61]?.GetValue() ?? "")} {(workSheet?.Cells[row, 62]?.GetValue() ?? "")}",
+ Moo1 = workSheet?.Cells[row, 63]?.GetValue() ?? "",
+ Soi1 = workSheet?.Cells[row, 64]?.GetValue() ?? "",
+ Road1 = workSheet?.Cells[row, 65]?.GetValue() ?? "",
+ District1 = workSheet?.Cells[row, 66]?.GetValue() ?? "",
+ Amphur1 = workSheet?.Cells[row, 67]?.GetValue() ?? "",
+ Province1 = workSheet?.Cells[row, 68]?.GetValue() ?? "",
+ ZipCode1 = (workSheet?.Cells[row, 69]?.GetValue() ?? "").Trim(),
+ CreatedAt = DateTime.Now,
+ CreatedUserId = UserId ?? "",
+ CreatedFullName = FullName ?? "System Administrator",
+ LastUpdatedAt = DateTime.Now,
+ LastUpdateUserId = UserId ?? "",
+ LastUpdateFullName = FullName ?? "System Administrator"
+ });
+
+ // payment
+ r.Payments.Add(new RecruitPayment()
+ {
+ PaymentId = workSheet?.Cells[row, 104]?.GetValue() ?? "",
+ CompanyCode = workSheet?.Cells[row, 105]?.GetValue() ?? "",
+ TextFile = workSheet?.Cells[row, 106]?.GetValue() ?? "",
+ BankCode = workSheet?.Cells[row, 107]?.GetValue() ?? "",
+ AccountNumber = workSheet?.Cells[row, 108]?.GetValue() ?? "",
+ TransDate = workSheet?.Cells[row, 109]?.GetValue() ?? "",
+ TransTime = workSheet?.Cells[row, 110]?.GetValue() ?? "",
+ CustomerName = workSheet?.Cells[row, 111]?.GetValue() ?? "",
+ RefNo1 = workSheet?.Cells[row, 112]?.GetValue() ?? "",
+ TermBranch = workSheet?.Cells[row, 113]?.GetValue() ?? "",
+ TellerId = workSheet?.Cells[row, 114]?.GetValue() ?? "",
+ CreditDebit = workSheet?.Cells[row, 115]?.GetValue() ?? "",
+ PaymentType = workSheet?.Cells[row, 116]?.GetValue() ?? "",
+ ChequeNo = workSheet?.Cells[row, 117]?.GetValue() ?? "",
+ Amount = (decimal)workSheet?.Cells[row, 118]?.GetValue(),
+ ChqueBankCode = workSheet?.Cells[row, 119]?.GetValue() ?? "",
+ CreatedAt = DateTime.Now,
+ CreatedUserId = UserId ?? "",
+ CreatedFullName = FullName ?? "System Administrator",
+ LastUpdatedAt = DateTime.Now,
+ LastUpdateUserId = UserId ?? "",
+ LastUpdateFullName = FullName ?? "System Administrator"
+ });
+ /*Comment ข้อมูลใบประกอบวิชาชีพ เพราะในไฟล์นำเข้ายังไม่มีคอลัมน์ที่ระบุข้อมูลส่วนนี้*/
+ //// certificate
+ //r.Certificates.Add(new RecruitCertificate()
+ //{
+ // CertificateNo = workSheet?.Cells[row, 9999]?.GetValue() ?? "",
+ // Description = workSheet?.Cells[row, 9999]?.GetValue() ?? "",
+ // IssueDate = Convert.ToDateTime(workSheet?.Cells[row, 9999]?.GetValue().ToDateTime(DateTimeFormat.Ymd, "-")),
+ // ExpiredDate = Convert.ToDateTime(workSheet?.Cells[row, 9999]?.GetValue().ToDateTime(DateTimeFormat.Ymd, "-")),
+ // CreatedAt = DateTime.Now,
+ // CreatedUserId = UserId ?? "",
+ // CreatedFullName = FullName ?? "System Administrator",
+ // LastUpdatedAt = DateTime.Now,
+ // LastUpdateUserId = UserId ?? "",
+ // LastUpdateFullName = FullName ?? "System Administrator"
+ //});
+
+ r.RecruitImport = imported;
+ _context.Recruits.Add(r);
+
+ //imported.Recruits.Add(r);
+ row++;
+ batchCount++;
+
+ // Batch save to prevent OutOfMemoryException on large imports
+ if (batchCount >= batchSize)
+ {
+ _context.SaveChanges();
+ _context.ChangeTracker.Clear();
+ // Re-attach the import entity as Unchanged after clearing the tracker
+ _context.Entry(imported).State = EntityState.Unchanged;
+ batchCount = 0;
+ }
+
+ }
+ }
}
- // Enqueue background job
- var job = _importJobTracker.CreateJob(new ImportJobInfo
- {
- JobType = ImportJobType.CandidateFileById,
- ImportFile = importFile,
- RecruitImportId = id,
- ImportDocId = import_doc_id,
- UserId = UserId,
- FullName = FullName,
- Token = token,
- });
- await _importJobQueue.EnqueueAsync(job);
+ // Save remaining records in the last batch
+ _context.SaveChanges();
+
+ return Success();
- return Success(new { jobId = job.JobId, status = "queued" });
}
catch (Exception ex)
{
+ await _minioService.DeleteFileAsync(Guid.Parse(import_doc_id));
return Error(ex);
}
+ finally
+ {
+ if (System.IO.File.Exists(importFile))
+ System.IO.File.Delete(importFile);
+ }
}
#endregion
@@ -1001,35 +1324,209 @@ namespace BMA.EHR.Recruit.Controllers
}
var rec_import = await _context.RecruitImports.AsQueryable()
+ .Include(x => x.ScoreImport)
+ .ThenInclude(x => x.Scores)
+ .Include(x => x.ImportHostories)
.FirstOrDefaultAsync(x => x.Id == id);
if (rec_import == null)
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
- var file = Request.Form.Files[0];
- using (var stream = new FileStream(importFile, FileMode.Create))
+ if (rec_import.ScoreImport != null)
{
- await file.CopyToAsync(stream);
+ // remove old score data
+ if (rec_import.ScoreImport.Scores != null)
+ {
+ _context.RecruitScores.RemoveRange(rec_import.ScoreImport.Scores);
+ await _context.SaveChangesAsync();
+ }
}
- var job = _importJobTracker.CreateJob(new ImportJobInfo
- {
- JobType = ImportJobType.ScoreFile,
- ImportFile = importFile,
- RecruitImportId = id,
- ImportDocId = import_doc_id,
- UserId = UserId,
- FullName = FullName,
- Token = token,
- });
- await _importJobQueue.EnqueueAsync(job);
+ var file = Request.Form.Files[0];
+ var doc = await _minioService.UploadFileAsync(file);
+ import_doc_id = doc.Id.ToString("D");
+
+ Console.WriteLine($"file id = {import_doc_id}");
+
+ var fileContent = (await _minioService.DownloadFileAsync(doc.Id)).FileContent;
+
+ // create import history
+ rec_import.ImportHostories.Add(new RecruitImportHistory
+ {
+ Description = "นำเข้าข้อมูลผลคะแนนสอบ",
+ CreatedAt = DateTime.Now,
+ CreatedUserId = UserId ?? "",
+ CreatedFullName = FullName ?? "System Administrator",
+ LastUpdatedAt = DateTime.Now,
+ LastUpdateUserId = UserId ?? "",
+ LastUpdateFullName = FullName ?? "System Administrator",
+ });
+
+ // create new file import
+ var imported = new ScoreImport
+ {
+ Year = rec_import.Year,
+ ImportFile = doc,
+ CreatedAt = DateTime.Now,
+ CreatedUserId = UserId ?? "",
+ CreatedFullName = FullName ?? "System Administrator",
+ LastUpdatedAt = DateTime.Now,
+ LastUpdateUserId = UserId ?? "",
+ LastUpdateFullName = FullName ?? "System Administrator",
+ Scores = new List()
+ };
+
+ // preload recruits ทั้งหมดของครั้งเดียว และ Group ExamId เอาเฉพาะ key ที่ไม่ซ้ำ
+ var recruitsDict = await _context.Recruits
+ .Where(x => x.RecruitImport.Id == rec_import.Id)
+ .GroupBy(x => x.ExamId)
+ .Where(g => g.Count() == 1)
+ .Select(g => g.First())
+ .ToDictionaryAsync(x => x.ExamId, x => x);
+
+ // import datafile
+ System.IO.File.WriteAllBytes(importFile, fileContent);
+
+ using (var c_package = new ExcelPackage(new FileInfo(importFile)))
+ {
+ for (int i = 0; i < c_package.Workbook.Worksheets.Count; i++)
+ {
+ var workSheet = c_package.Workbook.Worksheets[i];
+ //var totalRows = workSheet.Dimension.Rows;
+ var cols = workSheet.GetHeaderColumns();
+
+ int row = 8;
+ int batchCount = 0;
+ const int batchSize = 500;
+ var endRow = workSheet.Dimension.End.Row; // แถวสุดท้ายที่มีข้อมูล
+ while (row <= endRow)
+ {
+ var cell1 = workSheet?.Cells[row, 1]?.GetValue();
+ if (cell1 == "" || cell1 == null) break;
+
+ var r = new RecruitScore();
+
+ #region นำเข้าผลคะแนนสอบแข่งขัน old
+
+ //r.ExamId = workSheet?.Cells[row, 2]?.GetValue();
+
+ //r.FullA = (int)workSheet?.Cells[7, 7]?.GetValue().Replace("(", "").Replace(")", "").Replace("คะแนน", "").Trim().ToInteger();
+ //r.SumA = workSheet?.Cells[row, 7]?.GetValue() == "ขส." ? 0.00 : (double)workSheet?.Cells[row, 7]?.GetValue();
+ //r.PercentageA = workSheet?.Cells[row, 8]?.GetValue() == "ขส." ? 0.0 : (double)workSheet?.Cells[row, 8]?.GetValue();
+ //r.AStatus = workSheet?.Cells[row, 9]?.GetValue();
+
+ //r.FullB = (int)workSheet?.Cells[7, 12]?.GetValue().Replace("(", "").Replace(")", "").Replace("คะแนน", "").Trim().ToInteger();
+ //r.SumB = workSheet?.Cells[row, 12]?.GetValue() == "ขส." ? 0.00 : (double)workSheet?.Cells[row, 12]?.GetValue();
+ //r.PercentageB = workSheet?.Cells[row, 13]?.GetValue() == "ขส." ? 0.0 : (double)workSheet?.Cells[row, 13]?.GetValue();
+ //r.BStatus = workSheet?.Cells[row, 14]?.GetValue();
+
+ //r.SumAB = workSheet?.Cells[row, 15]?.GetValue() == "ขส." ? 0.00 : (double)workSheet?.Cells[row, 15]?.GetValue();
+ //r.ABStatus = workSheet?.Cells[row, 17]?.GetValue();
+
+ //r.FullC = (int)workSheet?.Cells[7, 20]?.GetValue().Replace("(", "").Replace(")", "").Replace("คะแนน", "").Trim().ToInteger();
+ //r.SumC = workSheet?.Cells[row, 20]?.GetValue() == "ขส." ? 0.00 : (double)workSheet?.Cells[row, 20]?.GetValue();
+ //r.PercentageC = workSheet?.Cells[row, 21]?.GetValue() == "ขส." ? 0.0 : (double)workSheet?.Cells[row, 21]?.GetValue();
+ //r.CStatus = workSheet?.Cells[row, 22]?.GetValue();
+
+ //r.ExamStatus = workSheet?.Cells[row, 24]?.GetValue();
+ //r.Number = workSheet?.Cells[row, 25]?.GetValue() ?? ""; // ตัดนำเข้า ลำดับที่สอบได้ เพราะจะแยกเป็นอีกส่วน #1787
+
+ //r.Major = workSheet.Name;
+
+ #endregion
+
+ r.ExamId = workSheet?.Cells[row, 2]?.GetValue();
+
+ // ใช้ dictionary lookup แทน query DB ทีละรอบ
+ if (!string.IsNullOrEmpty(r.ExamId) && recruitsDict.TryGetValue(r.ExamId, out var recruit))
+ {
+ r.CitizenId = workSheet?.Cells[row, 3]?.GetValue()?.Trim();
+
+ // ภาคความรู้ความสามารถที่ใช้เฉพาะตำแหน่ง
+ r.FullA = 200;
+ r.SumA = string.IsNullOrWhiteSpace(workSheet?.Cells[row, 5]?.GetValue()) ? 0.00 : Math.Round(workSheet.Cells[row, 5].GetValue(), 2);
+ r.PercentageA = string.IsNullOrWhiteSpace(workSheet?.Cells[row, 6]?.GetValue()) ? 0.00 : Math.Round(workSheet.Cells[row, 6].GetValue(), 2);
+ r.AStatus = string.IsNullOrWhiteSpace(workSheet?.Cells[row, 7]?.GetValue()) ? "" : workSheet?.Cells[row, 7]?.GetValue();
+ r.SumAB = string.IsNullOrWhiteSpace(workSheet?.Cells[row, 5]?.GetValue()) ? 0.00 : Math.Round(workSheet.Cells[row, 5].GetValue(), 2);
+ r.ABStatus = string.IsNullOrWhiteSpace(workSheet?.Cells[row, 7]?.GetValue()) ? "" : workSheet?.Cells[row, 7]?.GetValue();
+
+ // ภาคความเหมาะสมกับตำแหน่ง
+ r.FullC = 50;
+ r.SumC = string.IsNullOrWhiteSpace(workSheet?.Cells[row, 8]?.GetValue()) ? 0.00 : Math.Round(workSheet.Cells[row, 8].GetValue(), 2);
+ r.FullD = 50;
+ r.SumD = string.IsNullOrWhiteSpace(workSheet?.Cells[row, 9]?.GetValue()) ? 0.00 : Math.Round(workSheet.Cells[row, 9].GetValue(), 2);
+ r.SumCD = string.IsNullOrWhiteSpace(workSheet?.Cells[row, 10]?.GetValue()) ? 0.00 : Math.Round(workSheet.Cells[row, 10].GetValue(), 2);
+ r.PercentageC = string.IsNullOrWhiteSpace(workSheet?.Cells[row, 11]?.GetValue()) ? 0.00 : Math.Round(workSheet.Cells[row, 11].GetValue(), 2);
+ r.CStatus = string.IsNullOrWhiteSpace(workSheet?.Cells[row, 12]?.GetValue()) ? "" : workSheet?.Cells[row, 12]?.GetValue();
+ r.FullScore = 300;
+ r.TotalScore = string.IsNullOrWhiteSpace(workSheet?.Cells[row, 13]?.GetValue()) ? 0.00 : Math.Round(workSheet.Cells[row, 13].GetValue(), 2);
+
+ var examStatusCol7 = workSheet?.Cells[row, 7]?.GetValue()?.Trim();
+ var examStatusCol14 = workSheet?.Cells[row, 14]?.GetValue()?.Trim();
+ r.ExamStatus =
+ examStatusCol7 == "ขาดสอบ" ? "ขส." :
+ examStatusCol14 == "ได้" ? "ผ่าน" :
+ examStatusCol14 == "ตก" ? "ไม่ผ่าน" : "-";
+
+ r.RemarkScore = string.IsNullOrWhiteSpace(workSheet?.Cells[row, 15]?.GetValue()) ? string.Empty : workSheet?.Cells[row, 15]?.GetValue();
+
+ var examAttr = workSheet?.Cells[row, 16]?.GetValue()?.Trim();
+ r.ExamAttribute =
+ examAttr == "ผ่าน" ? "มีคุณสมบัติ" :
+ examAttr == "ไม่ผ่าน" ? "ไม่มีคุณสมบัติ" : "";
+
+ r.Major = workSheet.Name;
+
+ r.CreatedAt = DateTime.Now;
+ r.CreatedUserId = UserId ?? "";
+ r.CreatedFullName = FullName ?? "System Administrator";
+ r.LastUpdatedAt = DateTime.Now;
+ r.LastUpdateUserId = UserId ?? "";
+ r.LastUpdateFullName = FullName ?? "System Administrator";
+
+ imported.Scores.Add(r);
+ }
+
+ row++;
+ batchCount++;
+
+ // Batch save to prevent OutOfMemoryException on large imports
+ if (batchCount >= batchSize)
+ {
+ rec_import.ScoreImport = imported;
+ await _context.SaveChangesAsync();
+ _context.ChangeTracker.Clear();
+ // Re-attach entities after clearing the tracker
+ _context.Attach(rec_import);
+ _context.Attach(imported);
+ imported.Scores.Clear();
+ batchCount = 0;
+ }
+
+ } // end of sheet loop
+ } // end of all file loop
+ }
+
+ // Save remaining records in the last batch
+ if (imported.Scores.Count > 0)
+ {
+ rec_import.ScoreImport = imported;
+ await _context.SaveChangesAsync();
+ }
+
+ return Success();
- return Success(new { jobId = job.JobId, status = "queued" });
}
catch (Exception ex)
{
+ //await _minioService.DeleteFileAsync(Guid.Parse(import_doc_id));
return Error(ex);
}
+ finally
+ {
+ if (System.IO.File.Exists(importFile))
+ System.IO.File.Delete(importFile);
+ }
}
#endregion
@@ -1058,12 +1555,6 @@ namespace BMA.EHR.Recruit.Controllers
return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden);
}
- var tmpDir = Path.Combine(_webHostEnvironment.ContentRootPath, "tmp");
- if (!Directory.Exists(tmpDir))
- Directory.CreateDirectory(tmpDir);
-
- var importFile = Path.Combine(tmpDir, $"r_{DateTime.Now.ToString("ddMMyyyyHHmmss")}.xlsx");
-
try
{
if (Request.Form.Files == null || Request.Form.Files.Count == 0)
@@ -1072,29 +1563,103 @@ namespace BMA.EHR.Recruit.Controllers
}
var rec_import = await _context.RecruitImports.AsQueryable()
+ .Include(x => x.ScoreImport)
+ .ThenInclude(x => x.Scores)
.FirstOrDefaultAsync(x => x.Id == id);
if (rec_import == null)
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
- var file = Request.Form.Files[0];
- using (var stream = new FileStream(importFile, FileMode.Create))
+ // update ฟิลด์ลำดับที่สอบได้และหมายเหตุจากลำดับที่สอบได้อันเก่าก่อน
+ if (rec_import.ScoreImport != null && rec_import.ScoreImport.Scores != null)
{
- await file.CopyToAsync(stream);
+ var _oldScores = rec_import.ScoreImport.Scores
+ .Where(x => !string.IsNullOrEmpty(x.Number))
+ .ToList();
+ if (_oldScores.Count > 0)
+ {
+ foreach (var x in _oldScores)
+ {
+ x.Number = string.Empty;
+ x.RemarkExamOrder = string.Empty;
+ }
+ await _context.SaveChangesAsync();
+ }
}
- var job = _importJobTracker.CreateJob(new ImportJobInfo
+ // create import history
+ rec_import.ImportHostories.Add(new RecruitImportHistory
{
- JobType = ImportJobType.ResultFile,
- ImportFile = importFile,
- RecruitImportId = id,
- UserId = UserId,
- FullName = FullName,
- Token = token,
+ Description = "นำเข้าข้อมูลผลการสอบ",
+ CreatedAt = DateTime.Now,
+ CreatedUserId = UserId ?? "",
+ CreatedFullName = FullName ?? "System Administrator",
+ LastUpdatedAt = DateTime.Now,
+ LastUpdateUserId = UserId ?? "",
+ LastUpdateFullName = FullName ?? "System Administrator",
});
- await _importJobQueue.EnqueueAsync(job);
- return Success(new { jobId = job.JobId, status = "queued" });
+ // preload score
+ var score = rec_import.ScoreImport.Scores
+ .Where(s => !string.IsNullOrEmpty(s.ExamId))
+ .GroupBy(x => x.ExamId)
+ .Where(g => g.Count() == 1)
+ .Select(g => g.First())
+ .ToDictionary(s => s.ExamId, s => s);
+
+ // ถ้าไม่มีผลคะแนนสอบแข่งขันให้จบการทำงาน
+ if (score.Count == 0) return Success();
+
+ var file = Request.Form.Files[0];
+ using (var stream = file.OpenReadStream())
+ using (var c_package = new ExcelPackage(stream))
+ {
+ foreach (var workSheet in c_package.Workbook.Worksheets)
+ {
+ //var totalRows = workSheet.Dimension.Rows;
+ int row = 7; // เริ่มที่ row 7 ตามตัวอย่างไฟล์
+ int batchCount = 0;
+ const int batchSize = 500;
+ var endRow = workSheet.Dimension.End.Row; // แถวสุดท้ายที่มีข้อมูล
+
+ while (row <= endRow)
+ {
+ var examId = workSheet?.Cells[row, 2]?.GetValue();
+ if (string.IsNullOrWhiteSpace(examId))
+ {
+ row++;
+ continue;
+ }
+
+ if (score.TryGetValue(examId, out var existingScore))
+ {
+ existingScore.Number = workSheet?.Cells[row, 1]?.GetValue();
+ existingScore.RemarkExamOrder = workSheet?.Cells[row, 4]?.GetValue() ?? string.Empty;
+ existingScore.LastUpdatedAt = DateTime.Now;
+ existingScore.LastUpdateUserId = UserId ?? "";
+ existingScore.LastUpdateFullName = FullName ?? "System Administrator";
+ batchCount++;
+ }
+
+ row++;
+
+ // Batch save to prevent OutOfMemoryException on large imports
+ if (batchCount >= batchSize)
+ {
+ await _context.SaveChangesAsync();
+ _context.ChangeTracker.Clear();
+ // Re-attach the import entity as Unchanged after clearing the tracker
+ _context.Entry(rec_import).State = EntityState.Unchanged;
+ batchCount = 0;
+ }
+ }
+ }
+ }
+
+ // Save remaining records in the last batch
+ await _context.SaveChangesAsync();
+ return Success();
+
}
catch (Exception ex)
{
@@ -1104,37 +1669,6 @@ namespace BMA.EHR.Recruit.Controllers
#endregion
- #region " Import Status "
-
- ///
- /// ตรวจสอบสถานะการนำเข้าข้อมูล
- ///
- /// รหัสงานนำเข้า
- ///
- [HttpGet("import/status/{jobId}")]
- [ProducesResponseType(StatusCodes.Status200OK)]
- [ProducesResponseType(StatusCodes.Status404NotFound)]
- public ActionResult GetImportStatus(string jobId)
- {
- var job = _importJobTracker.GetJob(jobId);
- if (job == null)
- return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
-
- return Success(new
- {
- jobId = job.JobId,
- jobType = job.JobType.ToString(),
- status = job.Status.ToString(),
- processedCount = job.ProcessedCount,
- totalCount = job.TotalCount,
- errorMessage = job.ErrorMessage,
- createdAt = job.CreatedAt,
- completedAt = job.CompletedAt,
- });
- }
-
- #endregion
-
#region " Exam Information "
///
@@ -2010,7 +2544,6 @@ namespace BMA.EHR.Recruit.Controllers
public async Task> ExportExamAsync(Guid id)
{
var data = await _context.RecruitImports.AsQueryable()
- .AsNoTracking()
.Include(x => x.Recruits)
.FirstOrDefaultAsync(x => x.Id == id);
@@ -2519,7 +3052,6 @@ namespace BMA.EHR.Recruit.Controllers
public async Task GetCandidateNewListReportAsync(Guid id)
{
var data = await _context.Recruits.AsQueryable()
- .AsNoTracking()
.Include(x => x.RecruitImport)
.Where(x => x.RecruitImport.Id == id)
.OrderBy(x => x.ExamId)
diff --git a/Core/DateTimeFixConverter.cs b/Core/DateTimeFixConverter.cs
index b52dd56..60c8af6 100644
--- a/Core/DateTimeFixConverter.cs
+++ b/Core/DateTimeFixConverter.cs
@@ -1,7 +1,7 @@
using System.Text.Json;
using System.Text.Json.Serialization;
-namespace BMA.EHR.Recruit.Core
+namespace BMA.EHR.Recruit.Service.Core
{
public class DateTimeFixConverter : JsonConverter
{
diff --git a/Core/GlobalMessages.cs b/Core/GlobalMessages.cs
index aa496da..b37b5e8 100644
--- a/Core/GlobalMessages.cs
+++ b/Core/GlobalMessages.cs
@@ -1,4 +1,4 @@
-namespace BMA.EHR.Recruit.Core
+namespace BMA.EHR.Recruit.Service.Core
{
public class GlobalMessages
{
diff --git a/Core/RequestLoggingMiddleware.cs b/Core/RequestLoggingMiddleware.cs
index 27013fd..8ffc72f 100644
--- a/Core/RequestLoggingMiddleware.cs
+++ b/Core/RequestLoggingMiddleware.cs
@@ -8,7 +8,7 @@ using System.Text.Encodings.Web;
using System.Text.Json;
using JsonSerializer = System.Text.Json.JsonSerializer;
-namespace BMA.EHR.Recruit.Core
+namespace BMA.EHR.Recruit.Service.Core
{
public class RequestLoggingMiddleware
{
diff --git a/Data/ApplicationDbContext.cs b/Data/ApplicationDbContext.cs
index d386d19..2c64fb6 100644
--- a/Data/ApplicationDbContext.cs
+++ b/Data/ApplicationDbContext.cs
@@ -1,8 +1,8 @@
-using BMA.EHR.Recruit.Models.Documents;
-using BMA.EHR.Recruit.Models.Recruits;
+using BMA.EHR.Recruit.Service.Models.Documents;
+using BMA.EHR.Recruit.Service.Models.Recruits;
using Microsoft.EntityFrameworkCore;
-namespace BMA.EHR.Recruit.Data
+namespace BMA.EHR.Recruit.Service.Data
{
public class ApplicationDbContext : DbContext
{
@@ -20,7 +20,6 @@ namespace BMA.EHR.Recruit.Data
modelBuilder.Entity().HasMany(x => x.Addresses).WithOne(x => x.Recruit).OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity().HasMany(x => x.Certificates).WithOne(x => x.Recruit).OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity().HasMany(x => x.Payments).WithOne(x => x.Recruit).OnDelete(DeleteBehavior.Cascade);
- modelBuilder.Entity().HasMany(x => x.Scores).WithOne(x => x.ScoreImport).HasForeignKey(x => x.ScoreImportId).OnDelete(DeleteBehavior.Cascade);
}
public DbSet Documents { get; set; }
diff --git a/Dockerfile b/Dockerfile
index 0ee996f..e45a6f8 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -8,21 +8,16 @@ EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY ["nuget.config", "."]
-COPY ["BMA.EHR.Recruit.csproj", "."]
-RUN dotnet restore "./BMA.EHR.Recruit.csproj"
+COPY ["BMA.EHR.Recruit.Service.csproj", "."]
+RUN dotnet restore "./BMA.EHR.Recruit.Service.csproj"
COPY . .
WORKDIR "/src/."
-RUN dotnet build "BMA.EHR.Recruit.csproj" -c Release -o /app/build
+RUN dotnet build "BMA.EHR.Recruit.Service.csproj" -c Release -o /app/build
FROM build AS publish
-RUN dotnet publish "BMA.EHR.Recruit.csproj" -c Release -o /app/publish /p:UseAppHost=false
+RUN dotnet publish "BMA.EHR.Recruit.Service.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
-
-# GC configuration for better memory management in containers
-#ENV DOTNET_GCHeapHardLimit=1073741824
-#ENV DOTNET_GCConserveMemory=9
-
-ENTRYPOINT ["dotnet", "BMA.EHR.Recruit.dll"]
\ No newline at end of file
+ENTRYPOINT ["dotnet", "BMA.EHR.Recruit.Service.dll"]
\ No newline at end of file
diff --git a/Extensions/DataReaderExtension.cs b/Extensions/DataReaderExtension.cs
index 5b8d194..4768e5a 100644
--- a/Extensions/DataReaderExtension.cs
+++ b/Extensions/DataReaderExtension.cs
@@ -1,6 +1,6 @@
using System.Data.Common;
-namespace BMA.EHR.Recruit.Extensions
+namespace BMA.EHR.Recruit.Service.Extensions
{
public static class DataReaderExtension
{
diff --git a/Extensions/DateTimeExtension.cs b/Extensions/DateTimeExtension.cs
index a5b524a..df6379d 100644
--- a/Extensions/DateTimeExtension.cs
+++ b/Extensions/DateTimeExtension.cs
@@ -2,7 +2,7 @@ using System;
using System.Globalization;
using System.Text;
-namespace BMA.EHR.Recruit.Extensions
+namespace BMA.EHR.Recruit.Service.Extensions
{
public static class DateTimeExtension
{
diff --git a/Extensions/DoubleExtension.cs b/Extensions/DoubleExtension.cs
index 255bb66..0483704 100644
--- a/Extensions/DoubleExtension.cs
+++ b/Extensions/DoubleExtension.cs
@@ -1,7 +1,7 @@
using System;
using System.Text;
-namespace BMA.EHR.Recruit.Extensions
+namespace BMA.EHR.Recruit.Service.Extensions
{
public static class DoubleExtension
{
diff --git a/Extensions/ExcelWorksheetExtension.cs b/Extensions/ExcelWorksheetExtension.cs
index fcd6524..4d30d04 100644
--- a/Extensions/ExcelWorksheetExtension.cs
+++ b/Extensions/ExcelWorksheetExtension.cs
@@ -2,7 +2,7 @@
using System;
using System.Collections.Generic;
-namespace BMA.EHR.Recruit.Extensions
+namespace BMA.EHR.Recruit.Service.Extensions
{
public static class ExcelWorksheetExtension
{
diff --git a/Extensions/IntegerExtension.cs b/Extensions/IntegerExtension.cs
index 2a465a1..555eb68 100644
--- a/Extensions/IntegerExtension.cs
+++ b/Extensions/IntegerExtension.cs
@@ -1,7 +1,7 @@
using System.Text;
// using GreatFriends.ThaiBahtText;
-namespace BMA.EHR.Recruit.Extensions
+namespace BMA.EHR.Recruit.Service.Extensions
{
public static class IntegerExtension
{
diff --git a/Extensions/ListExtension.cs b/Extensions/ListExtension.cs
index 3ca9307..d8b8f95 100644
--- a/Extensions/ListExtension.cs
+++ b/Extensions/ListExtension.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
-namespace BMA.EHR.Recruit.Extensions
+namespace BMA.EHR.Recruit.Service.Extensions
{
public static class ListExtension
{
diff --git a/Extensions/ObjectExtension.cs b/Extensions/ObjectExtension.cs
index 7f51c6e..f1285d4 100644
--- a/Extensions/ObjectExtension.cs
+++ b/Extensions/ObjectExtension.cs
@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
-namespace BMA.EHR.Recruit.Extensions
+namespace BMA.EHR.Recruit.Service.Extensions
{
public static class ObjectExtension
{
diff --git a/Extensions/StreamExtension.cs b/Extensions/StreamExtension.cs
index 1eecba9..dbdd563 100644
--- a/Extensions/StreamExtension.cs
+++ b/Extensions/StreamExtension.cs
@@ -1,7 +1,7 @@
using System;
using System.IO;
-namespace BMA.EHR.Recruit.Extensions
+namespace BMA.EHR.Recruit.Service.Extensions
{
public static class StreamExtension
{
diff --git a/Extensions/StringExtension.cs b/Extensions/StringExtension.cs
index 68b1515..f1c1f0d 100644
--- a/Extensions/StringExtension.cs
+++ b/Extensions/StringExtension.cs
@@ -3,7 +3,7 @@ using System.Globalization;
using System.IO;
using System.Text.RegularExpressions;
-namespace BMA.EHR.Recruit.Extensions
+namespace BMA.EHR.Recruit.Service.Extensions
{
public enum DateTimeFormat
{
diff --git a/Extensions/TimeSpanExtension.cs b/Extensions/TimeSpanExtension.cs
index 7a9eaae..63d74de 100644
--- a/Extensions/TimeSpanExtension.cs
+++ b/Extensions/TimeSpanExtension.cs
@@ -1,6 +1,6 @@
using System;
-namespace BMA.EHR.Recruit.Extensions
+namespace BMA.EHR.Recruit.Service.Extensions
{
public static class TimeSpanExtension
{
diff --git a/Migrations/20230313045824_Initial Project.Designer.cs b/Migrations/20230313045824_Initial Project.Designer.cs
index 26dbe61..79b2984 100644
--- a/Migrations/20230313045824_Initial Project.Designer.cs
+++ b/Migrations/20230313045824_Initial Project.Designer.cs
@@ -1,6 +1,6 @@
//
using System;
-using BMA.EHR.Recruit.Data;
+using BMA.EHR.Recruit.Service.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
@@ -8,7 +8,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
-namespace BMA.EHR.Recruit.Migrations
+namespace BMA.EHR.Recruit.Service.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20230313045824_Initial Project")]
@@ -22,7 +22,7 @@ namespace BMA.EHR.Recruit.Migrations
.HasAnnotation("ProductVersion", "7.0.3")
.HasAnnotation("Relational:MaxIdentifierLength", 64);
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Documents.Document", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Documents.Document", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -58,7 +58,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("Documents");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.Recruit", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -197,7 +197,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("Recruits");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitAddress", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitAddress", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -344,7 +344,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitAddresses");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitCertificate", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitCertificate", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -417,7 +417,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitCertificates");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitDocument", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitDocument", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -482,7 +482,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitDocuments");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitEducation", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitEducation", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -580,7 +580,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitEducations");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitImport", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitImport", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -672,7 +672,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitImports");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitOccupation", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitOccupation", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -754,7 +754,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitOccupations");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitPayment", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitPayment", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -889,7 +889,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitPayments");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitScore", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitScore", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -996,7 +996,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitScores");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.ScoreImport", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.ScoreImport", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -1056,9 +1056,9 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("ScoreImports");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.Recruit", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.RecruitImport", "RecruitImport")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.RecruitImport", "RecruitImport")
.WithMany("Recruits")
.HasForeignKey("RecruitImportId")
.OnDelete(DeleteBehavior.Cascade);
@@ -1066,9 +1066,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("RecruitImport");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitAddress", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitAddress", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.Recruit", "Recruit")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", "Recruit")
.WithMany("Addresses")
.HasForeignKey("RecruitId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1077,9 +1077,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Recruit");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitCertificate", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitCertificate", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.Recruit", "Recruit")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", "Recruit")
.WithMany("Certificates")
.HasForeignKey("RecruitId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1088,15 +1088,15 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Recruit");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitDocument", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitDocument", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Documents.Document", "DocumentFile")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Documents.Document", "DocumentFile")
.WithMany()
.HasForeignKey("DocumentFileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.Recruit", "Recruit")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", "Recruit")
.WithMany("Documents")
.HasForeignKey("RecruitId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1107,9 +1107,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Recruit");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitEducation", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitEducation", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.Recruit", "Recruit")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", "Recruit")
.WithMany("Educations")
.HasForeignKey("RecruitId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1118,9 +1118,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Recruit");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitImport", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitImport", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Documents.Document", "ImportFile")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Documents.Document", "ImportFile")
.WithMany()
.HasForeignKey("ImportFileId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1129,9 +1129,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("ImportFile");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitOccupation", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitOccupation", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.Recruit", "Recruit")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", "Recruit")
.WithMany("Occupations")
.HasForeignKey("RecruitId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1140,9 +1140,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Recruit");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitPayment", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitPayment", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.Recruit", "Recruit")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", "Recruit")
.WithMany("Payments")
.HasForeignKey("RecruitId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1151,9 +1151,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Recruit");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitScore", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitScore", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.ScoreImport", "ScoreImport")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.ScoreImport", "ScoreImport")
.WithMany("Scores")
.HasForeignKey("ScoreImportId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1162,9 +1162,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("ScoreImport");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.ScoreImport", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.ScoreImport", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Documents.Document", "ImportFile")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Documents.Document", "ImportFile")
.WithMany()
.HasForeignKey("ImportFileId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1173,7 +1173,7 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("ImportFile");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.Recruit", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", b =>
{
b.Navigation("Addresses");
@@ -1188,12 +1188,12 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Payments");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitImport", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitImport", b =>
{
b.Navigation("Recruits");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.ScoreImport", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.ScoreImport", b =>
{
b.Navigation("Scores");
});
diff --git a/Migrations/20230313045824_Initial Project.cs b/Migrations/20230313045824_Initial Project.cs
index 8a8f221..6a24dbe 100644
--- a/Migrations/20230313045824_Initial Project.cs
+++ b/Migrations/20230313045824_Initial Project.cs
@@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
-namespace BMA.EHR.Recruit.Migrations
+namespace BMA.EHR.Recruit.Service.Migrations
{
///
public partial class InitialProject : Migration
diff --git a/Migrations/20230323020854_Update recruit import table.Designer.cs b/Migrations/20230323020854_Update recruit import table.Designer.cs
index 9d3858a..1f7b02b 100644
--- a/Migrations/20230323020854_Update recruit import table.Designer.cs
+++ b/Migrations/20230323020854_Update recruit import table.Designer.cs
@@ -1,6 +1,6 @@
//
using System;
-using BMA.EHR.Recruit.Data;
+using BMA.EHR.Recruit.Service.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
@@ -8,7 +8,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
-namespace BMA.EHR.Recruit.Migrations
+namespace BMA.EHR.Recruit.Service.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20230323020854_Update recruit import table")]
@@ -22,7 +22,7 @@ namespace BMA.EHR.Recruit.Migrations
.HasAnnotation("ProductVersion", "7.0.3")
.HasAnnotation("Relational:MaxIdentifierLength", 64);
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Documents.Document", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Documents.Document", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -58,7 +58,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("Documents");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.Recruit", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -197,7 +197,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("Recruits");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitAddress", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitAddress", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -344,7 +344,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitAddresses");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitCertificate", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitCertificate", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -417,7 +417,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitCertificates");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitDocument", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitDocument", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -482,7 +482,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitDocuments");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitEducation", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitEducation", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -580,7 +580,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitEducations");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitImport", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitImport", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -654,7 +654,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitImports");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitOccupation", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitOccupation", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -736,7 +736,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitOccupations");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitPayment", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitPayment", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -871,7 +871,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitPayments");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitScore", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitScore", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -978,7 +978,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitScores");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.ScoreImport", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.ScoreImport", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -1038,9 +1038,9 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("ScoreImports");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.Recruit", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.RecruitImport", "RecruitImport")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.RecruitImport", "RecruitImport")
.WithMany("Recruits")
.HasForeignKey("RecruitImportId")
.OnDelete(DeleteBehavior.Cascade);
@@ -1048,9 +1048,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("RecruitImport");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitAddress", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitAddress", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.Recruit", "Recruit")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", "Recruit")
.WithMany("Addresses")
.HasForeignKey("RecruitId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1059,9 +1059,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Recruit");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitCertificate", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitCertificate", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.Recruit", "Recruit")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", "Recruit")
.WithMany("Certificates")
.HasForeignKey("RecruitId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1070,15 +1070,15 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Recruit");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitDocument", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitDocument", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Documents.Document", "DocumentFile")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Documents.Document", "DocumentFile")
.WithMany()
.HasForeignKey("DocumentFileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.Recruit", "Recruit")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", "Recruit")
.WithMany("Documents")
.HasForeignKey("RecruitId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1089,9 +1089,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Recruit");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitEducation", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitEducation", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.Recruit", "Recruit")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", "Recruit")
.WithMany("Educations")
.HasForeignKey("RecruitId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1100,9 +1100,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Recruit");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitImport", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitImport", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Documents.Document", "ImportFile")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Documents.Document", "ImportFile")
.WithMany()
.HasForeignKey("ImportFileId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1111,9 +1111,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("ImportFile");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitOccupation", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitOccupation", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.Recruit", "Recruit")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", "Recruit")
.WithMany("Occupations")
.HasForeignKey("RecruitId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1122,9 +1122,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Recruit");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitPayment", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitPayment", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.Recruit", "Recruit")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", "Recruit")
.WithMany("Payments")
.HasForeignKey("RecruitId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1133,9 +1133,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Recruit");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitScore", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitScore", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.ScoreImport", "ScoreImport")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.ScoreImport", "ScoreImport")
.WithMany("Scores")
.HasForeignKey("ScoreImportId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1144,9 +1144,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("ScoreImport");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.ScoreImport", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.ScoreImport", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Documents.Document", "ImportFile")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Documents.Document", "ImportFile")
.WithMany()
.HasForeignKey("ImportFileId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1155,7 +1155,7 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("ImportFile");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.Recruit", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", b =>
{
b.Navigation("Addresses");
@@ -1170,12 +1170,12 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Payments");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitImport", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitImport", b =>
{
b.Navigation("Recruits");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.ScoreImport", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.ScoreImport", b =>
{
b.Navigation("Scores");
});
diff --git a/Migrations/20230323020854_Update recruit import table.cs b/Migrations/20230323020854_Update recruit import table.cs
index 01c9a51..4e59f97 100644
--- a/Migrations/20230323020854_Update recruit import table.cs
+++ b/Migrations/20230323020854_Update recruit import table.cs
@@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
-namespace BMA.EHR.Recruit.Migrations
+namespace BMA.EHR.Recruit.Service.Migrations
{
///
public partial class Updaterecruitimporttable : Migration
diff --git a/Migrations/20230325122648_Change Document Table Def.Designer.cs b/Migrations/20230325122648_Change Document Table Def.Designer.cs
index 0684b96..edbd39c 100644
--- a/Migrations/20230325122648_Change Document Table Def.Designer.cs
+++ b/Migrations/20230325122648_Change Document Table Def.Designer.cs
@@ -1,6 +1,6 @@
//
using System;
-using BMA.EHR.Recruit.Data;
+using BMA.EHR.Recruit.Service.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
@@ -8,7 +8,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
-namespace BMA.EHR.Recruit.Migrations
+namespace BMA.EHR.Recruit.Service.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20230325122648_Change Document Table Def")]
@@ -22,7 +22,7 @@ namespace BMA.EHR.Recruit.Migrations
.HasAnnotation("ProductVersion", "7.0.3")
.HasAnnotation("Relational:MaxIdentifierLength", 64);
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Documents.Document", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Documents.Document", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -56,7 +56,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("Documents");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.Recruit", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -195,7 +195,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("Recruits");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitAddress", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitAddress", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -342,7 +342,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitAddresses");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitCertificate", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitCertificate", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -415,7 +415,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitCertificates");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitDocument", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitDocument", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -480,7 +480,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitDocuments");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitEducation", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitEducation", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -578,7 +578,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitEducations");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitImport", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitImport", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -652,7 +652,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitImports");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitOccupation", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitOccupation", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -734,7 +734,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitOccupations");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitPayment", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitPayment", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -869,7 +869,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitPayments");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitScore", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitScore", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -976,7 +976,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("RecruitScores");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.ScoreImport", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.ScoreImport", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -1036,9 +1036,9 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("ScoreImports");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.Recruit", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.RecruitImport", "RecruitImport")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.RecruitImport", "RecruitImport")
.WithMany("Recruits")
.HasForeignKey("RecruitImportId")
.OnDelete(DeleteBehavior.Cascade);
@@ -1046,9 +1046,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("RecruitImport");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitAddress", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitAddress", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.Recruit", "Recruit")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", "Recruit")
.WithMany("Addresses")
.HasForeignKey("RecruitId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1057,9 +1057,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Recruit");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitCertificate", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitCertificate", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.Recruit", "Recruit")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", "Recruit")
.WithMany("Certificates")
.HasForeignKey("RecruitId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1068,15 +1068,15 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Recruit");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitDocument", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitDocument", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Documents.Document", "DocumentFile")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Documents.Document", "DocumentFile")
.WithMany()
.HasForeignKey("DocumentFileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.Recruit", "Recruit")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", "Recruit")
.WithMany("Documents")
.HasForeignKey("RecruitId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1087,9 +1087,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Recruit");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitEducation", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitEducation", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.Recruit", "Recruit")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", "Recruit")
.WithMany("Educations")
.HasForeignKey("RecruitId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1098,9 +1098,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Recruit");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitImport", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitImport", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Documents.Document", "ImportFile")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Documents.Document", "ImportFile")
.WithMany()
.HasForeignKey("ImportFileId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1109,9 +1109,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("ImportFile");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitOccupation", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitOccupation", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.Recruit", "Recruit")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", "Recruit")
.WithMany("Occupations")
.HasForeignKey("RecruitId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1120,9 +1120,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Recruit");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitPayment", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitPayment", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.Recruit", "Recruit")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", "Recruit")
.WithMany("Payments")
.HasForeignKey("RecruitId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1131,9 +1131,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Recruit");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitScore", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitScore", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Recruits.ScoreImport", "ScoreImport")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Recruits.ScoreImport", "ScoreImport")
.WithMany("Scores")
.HasForeignKey("ScoreImportId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1142,9 +1142,9 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("ScoreImport");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.ScoreImport", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.ScoreImport", b =>
{
- b.HasOne("BMA.EHR.Recruit.Models.Documents.Document", "ImportFile")
+ b.HasOne("BMA.EHR.Recruit.Service.Models.Documents.Document", "ImportFile")
.WithMany()
.HasForeignKey("ImportFileId")
.OnDelete(DeleteBehavior.Cascade)
@@ -1153,7 +1153,7 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("ImportFile");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.Recruit", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", b =>
{
b.Navigation("Addresses");
@@ -1168,12 +1168,12 @@ namespace BMA.EHR.Recruit.Migrations
b.Navigation("Payments");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.RecruitImport", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.RecruitImport", b =>
{
b.Navigation("Recruits");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.ScoreImport", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.ScoreImport", b =>
{
b.Navigation("Scores");
});
diff --git a/Migrations/20230325122648_Change Document Table Def.cs b/Migrations/20230325122648_Change Document Table Def.cs
index c3418ca..3aa3729 100644
--- a/Migrations/20230325122648_Change Document Table Def.cs
+++ b/Migrations/20230325122648_Change Document Table Def.cs
@@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
-namespace BMA.EHR.Recruit.Migrations
+namespace BMA.EHR.Recruit.Service.Migrations
{
///
public partial class ChangeDocumentTableDef : Migration
diff --git a/Migrations/20230403104559_Update Recruit Score Relationship.Designer.cs b/Migrations/20230403104559_Update Recruit Score Relationship.Designer.cs
index 1cfa351..a596d94 100644
--- a/Migrations/20230403104559_Update Recruit Score Relationship.Designer.cs
+++ b/Migrations/20230403104559_Update Recruit Score Relationship.Designer.cs
@@ -1,6 +1,6 @@
//
using System;
-using BMA.EHR.Recruit.Data;
+using BMA.EHR.Recruit.Service.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
@@ -8,7 +8,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
-namespace BMA.EHR.Recruit.Migrations
+namespace BMA.EHR.Recruit.Service.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20230403104559_Update Recruit Score Relationship")]
@@ -22,7 +22,7 @@ namespace BMA.EHR.Recruit.Migrations
.HasAnnotation("ProductVersion", "7.0.3")
.HasAnnotation("Relational:MaxIdentifierLength", 64);
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Documents.Document", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Documents.Document", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
@@ -56,7 +56,7 @@ namespace BMA.EHR.Recruit.Migrations
b.ToTable("Documents");
});
- modelBuilder.Entity("BMA.EHR.Recruit.Models.Recruits.Recruit", b =>
+ modelBuilder.Entity("BMA.EHR.Recruit.Service.Models.Recruits.Recruit", b =>
{
b.Property