feature: Barcode/QR Cover Sheet System
This commit is contained in:
@@ -17,6 +17,7 @@ public class DigitizationBatchesController : ControllerBase
|
||||
private readonly IDocumentStorageService _storage;
|
||||
private readonly IPromotionService _promotion;
|
||||
private readonly IBatchEventService _batchEventService;
|
||||
private readonly ICoverSheetService _coverSheets;
|
||||
private readonly AppDbContext _db;
|
||||
|
||||
private static readonly HashSet<string> _allowedMimeTypes = new()
|
||||
@@ -29,13 +30,15 @@ public class DigitizationBatchesController : ControllerBase
|
||||
IDocumentStorageService storage,
|
||||
IPromotionService promotion,
|
||||
IBatchEventService batchEventService,
|
||||
AppDbContext db)
|
||||
AppDbContext db,
|
||||
ICoverSheetService coverSheets)
|
||||
{
|
||||
_batches = batches;
|
||||
_storage = storage;
|
||||
_promotion = promotion;
|
||||
_batchEventService = batchEventService;
|
||||
_db = db;
|
||||
_coverSheets = coverSheets;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -60,10 +63,40 @@ public class DigitizationBatchesController : ControllerBase
|
||||
return BadRequest(ApiResponse<object>.Fail(400,
|
||||
"Accepted formats: PDF, JPEG, PNG.", "INVALID_MIME_TYPE"));
|
||||
|
||||
var parsedBatchType = BatchTypeExtensions.FromDbString(form.BatchType.ToUpperInvariant());
|
||||
var parsedTrack = string.IsNullOrEmpty(form.Track)
|
||||
? BatchTrack.Backfill
|
||||
: BatchTrackExtensions.FromDbString(form.Track.ToUpperInvariant());
|
||||
CoverSheet? coverSheet = null;
|
||||
BatchType parsedBatchType;
|
||||
BatchTrack parsedTrack;
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(form.CoverSheetCode))
|
||||
{
|
||||
coverSheet = await _coverSheets.LookupByCodeAsync(form.CoverSheetCode);
|
||||
if (coverSheet is null)
|
||||
return NotFound(ApiResponse<object>.Fail(404,
|
||||
"Cover sheet not found.", "COVER_SHEET_NOT_FOUND"));
|
||||
|
||||
if (coverSheet.IsUsed)
|
||||
return Conflict(ApiResponse<object>.Fail(409,
|
||||
$"Cover sheet {coverSheet.Code} has already been used.",
|
||||
"COVER_SHEET_ALREADY_USED"));
|
||||
|
||||
parsedBatchType = coverSheet.BatchType;
|
||||
parsedTrack = coverSheet.Track;
|
||||
if (coverSheet.PatientId.HasValue)
|
||||
form.PatientId ??= coverSheet.PatientId;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(form.BatchType))
|
||||
return BadRequest(ApiResponse<object>.Fail(400,
|
||||
"BatchType is required when no cover sheet code is provided.",
|
||||
"MISSING_BATCH_TYPE"));
|
||||
|
||||
parsedBatchType = BatchTypeExtensions.FromDbString(form.BatchType.ToUpperInvariant());
|
||||
parsedTrack = string.IsNullOrEmpty(form.Track)
|
||||
? BatchTrack.Backfill
|
||||
: BatchTrackExtensions.FromDbString(form.Track.ToUpperInvariant());
|
||||
}
|
||||
|
||||
var actorUserId = Guid.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier)!);
|
||||
|
||||
using var stream = form.File.OpenReadStream();
|
||||
@@ -71,8 +104,17 @@ public class DigitizationBatchesController : ControllerBase
|
||||
stream, form.File.ContentType, parsedBatchType, parsedTrack,
|
||||
form.PatientId, form.SupersedesBatchId, actorUserId);
|
||||
|
||||
var batch = result.Batch;
|
||||
if (coverSheet is not null)
|
||||
{
|
||||
await _coverSheets.RedeemAsync(coverSheet.Id, batch.Id);
|
||||
|
||||
if (coverSheet.AssignToUserId.HasValue)
|
||||
batch = await _batches.AssignAsync(batch.Id, coverSheet.AssignToUserId.Value, actorUserId);
|
||||
}
|
||||
|
||||
return StatusCode(201, ApiResponse<BatchDetailResponse>.Created(
|
||||
BatchDetailResponse.FromEntity(result.Batch, supersession: result.Supersession)));
|
||||
BatchDetailResponse.FromEntity(batch, supersession: result.Supersession)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
Reference in New Issue
Block a user