| Incident # ").Append(E(deployment.IncidentNumber)).Append(" | Resource order # ").Append(E(deployment.ResourceOrderNumber)).Append(" | Request # ").Append(E(deployment.RequestNumber)).Append(" |
| Cost code ").Append(E(deployment.CostCode)).Append(" | Point of hire ").Append(E(deployment.PointOfHire)).Append(" | Window ").Append(D(deployment.StartOn)).Append(" → ").Append(D(deployment.EndOn)).Append(" |
No units rostered.
"); + else + { + sb.Append("| Unit | Type | Call sign | Crew | Notes |
|---|---|---|---|---|
| ").Append(E(detail?.Name ?? unit.UnitName ?? unit.UnitId.ToString())).Append(" | ").Append(E(detail?.Type)).Append(" | ").Append(E(unit.CallSign)).Append(" | ") + .Append(activePeople.Count(p => p.DeploymentUnitId == unit.DeploymentUnitId)).Append(" | ").Append(E(unit.Notes)).Append(" |
No personnel rostered.
"); + else + { + sb.Append("| Name | Unit | Seat | Certification | Call sign | Fill |
|---|---|---|---|---|---|
| ").Append(E(person.DisplayName ?? person.UserId)).Append(" | ").Append(E(unitName)).Append(" | ") + .Append(E(person.UnitRoleId.HasValue && seatNames.TryGetValue(person.UnitRoleId.Value, out var seat) ? seat : string.Empty)).Append(" | ").Append(E(person.CertificationCode)).Append(" | ") + .Append(E(person.CallSign)).Append(" | ").Append(E(person.RmsExternalOrderFillId)).Append(" |
| Item | Unit | Issued | Notes |
|---|---|---|---|
| ").Append(E(item.FreeTextName ?? item.InventoryAssetId ?? item.InventoryItemId)).Append(" | ").Append(E(unitName)).Append(" | ").Append(D(item.IssuedOn)).Append(" | ").Append(E(item.Notes)).Append(" |
Generated ").Append(D(DateTime.UtcNow)).Append("
"); + return sb.ToString(); + } + } +} diff --git a/Core/Resgrid.Services/Invoicing/DeploymentService.Protection.cs b/Core/Resgrid.Services/Invoicing/DeploymentService.Protection.cs new file mode 100644 index 00000000..2813a4ea --- /dev/null +++ b/Core/Resgrid.Services/Invoicing/DeploymentService.Protection.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Resgrid.Framework; +using Resgrid.Model; +using Resgrid.Model.Invoicing; +using Resgrid.Model.Repositories; + +namespace Resgrid.Services.Invoicing +{ + ///