Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<data name="AddedOn" xml:space="preserve"><value>أضيف في</value></data>
<data name="AddInventoryTypeButton" xml:space="preserve"><value>إضافة نوع مخزون</value></data>
<data name="AdjustInventory" xml:space="preserve"><value>تعديل المخزون</value></data>
<data name="AdjustmentAmountRequired" xml:space="preserve"><value>يجب تقديم تعديل مخزون غير صفري (العدد/الكمية).</value></data>
<data name="Amount" xml:space="preserve"><value>الكمية</value></data>
<data name="Batch" xml:space="preserve"><value>الدفعة</value></data>
<data name="BatchSerialNumber" xml:space="preserve"><value>الرقم التسلسلي للدفعة</value></data>
Expand All @@ -18,6 +19,7 @@
<data name="EditInventoryTypeButton" xml:space="preserve"><value>تعديل نوع المخزون</value></data>
<data name="ForItemsNoExpiry" xml:space="preserve"><value>للعناصر التي لا تنتهي صلاحيتها</value></data>
<data name="Group" xml:space="preserve"><value>المجموعة</value></data>
<data name="InventoryByUnitHeader" xml:space="preserve"><value>المخزون حسب الوحدة</value></data>
<data name="InventoryHistoryHeader" xml:space="preserve"><value>سجل المخزون</value></data>
<data name="InventoryTypesHeader" xml:space="preserve"><value>أنواع المخزون</value></data>
<data name="ItemExpiresDays" xml:space="preserve"><value>تنتهي صلاحية العنصر بعد (أيام)</value></data>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,9 @@
<data name="AdjustInventoryHeader" xml:space="preserve">
<value>Inventar anpassen</value>
</data>
<data name="AdjustmentAmountRequired" xml:space="preserve">
<value>Sie müssen eine von null abweichende Bestandsanpassung angeben (Anzahl/Menge).</value>
</data>
<data name="Amount" xml:space="preserve">
<value>Menge</value>
</data>
Expand Down Expand Up @@ -112,6 +115,9 @@
<data name="Group" xml:space="preserve">
<value>Gruppe</value>
</data>
<data name="InventoryByUnitHeader" xml:space="preserve">
<value>Inventar nach Einheit</value>
</data>
<data name="InventoryHistoryHeader" xml:space="preserve">
<value>Inventarverlauf</value>
</data>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,9 @@
<data name="AdjustInventoryHeader" xml:space="preserve">
<value>Adjust Inventory</value>
</data>
<data name="AdjustmentAmountRequired" xml:space="preserve">
<value>You must supply a non-zero inventory adjustment (count/amount).</value>
</data>
<data name="Amount" xml:space="preserve">
<value>Amount</value>
</data>
Expand Down Expand Up @@ -171,6 +174,9 @@
<data name="Group" xml:space="preserve">
<value>Group</value>
</data>
<data name="InventoryByUnitHeader" xml:space="preserve">
<value>Inventory by Unit</value>
</data>
<data name="InventoryHistoryHeader" xml:space="preserve">
<value>Inventory History</value>
</data>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,9 @@
<data name="AdjustInventoryHeader" xml:space="preserve">
<value>Ajustar inventario</value>
</data>
<data name="AdjustmentAmountRequired" xml:space="preserve">
<value>Debe proporcionar un ajuste de inventario distinto de cero (cantidad).</value>
</data>
<data name="Amount" xml:space="preserve">
<value>Cantidad</value>
</data>
Expand Down Expand Up @@ -112,6 +115,9 @@
<data name="Group" xml:space="preserve">
<value>Grupo</value>
</data>
<data name="InventoryByUnitHeader" xml:space="preserve">
<value>Inventario por unidad</value>
</data>
<data name="InventoryHistoryHeader" xml:space="preserve">
<value>Historial de inventario</value>
</data>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,9 @@
<data name="AdjustInventoryHeader" xml:space="preserve">
<value>Ajuster l'inventaire</value>
</data>
<data name="AdjustmentAmountRequired" xml:space="preserve">
<value>Vous devez fournir un ajustement d'inventaire non nul (nombre/quantité).</value>
</data>
<data name="Amount" xml:space="preserve">
<value>Quantité</value>
</data>
Expand Down Expand Up @@ -112,6 +115,9 @@
<data name="Group" xml:space="preserve">
<value>Groupe</value>
</data>
<data name="InventoryByUnitHeader" xml:space="preserve">
<value>Inventaire par unité</value>
</data>
<data name="InventoryHistoryHeader" xml:space="preserve">
<value>Historique de l'inventaire</value>
</data>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,9 @@
<data name="AdjustInventoryHeader" xml:space="preserve">
<value>Rettifica inventario</value>
</data>
<data name="AdjustmentAmountRequired" xml:space="preserve">
<value>È necessario fornire una rettifica di inventario diversa da zero (conteggio/quantità).</value>
</data>
<data name="Amount" xml:space="preserve">
<value>Quantità</value>
</data>
Expand Down Expand Up @@ -112,6 +115,9 @@
<data name="Group" xml:space="preserve">
<value>Gruppo</value>
</data>
<data name="InventoryByUnitHeader" xml:space="preserve">
<value>Inventario per unità</value>
</data>
<data name="InventoryHistoryHeader" xml:space="preserve">
<value>Cronologia inventario</value>
</data>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,9 @@
<data name="AdjustInventoryHeader" xml:space="preserve">
<value>Dostosuj inwentarz</value>
</data>
<data name="AdjustmentAmountRequired" xml:space="preserve">
<value>Musisz podać niezerową korektę stanu magazynowego (liczba/ilość).</value>
</data>
<data name="Amount" xml:space="preserve">
<value>Ilość</value>
</data>
Expand Down Expand Up @@ -112,6 +115,9 @@
<data name="Group" xml:space="preserve">
<value>Grupa</value>
</data>
<data name="InventoryByUnitHeader" xml:space="preserve">
<value>Inwentarz według jednostki</value>
</data>
<data name="InventoryHistoryHeader" xml:space="preserve">
<value>Historia inwentarza</value>
</data>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,9 @@
<data name="AdjustInventoryHeader" xml:space="preserve">
<value>Justera lager</value>
</data>
<data name="AdjustmentAmountRequired" xml:space="preserve">
<value>Du måste ange en lagerjustering som inte är noll (antal/mängd).</value>
</data>
<data name="Amount" xml:space="preserve">
<value>Antal</value>
</data>
Expand Down Expand Up @@ -112,6 +115,9 @@
<data name="Group" xml:space="preserve">
<value>Grupp</value>
</data>
<data name="InventoryByUnitHeader" xml:space="preserve">
<value>Inventering per enhet</value>
</data>
<data name="InventoryHistoryHeader" xml:space="preserve">
<value>Lagerhistorik</value>
</data>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,9 @@
<data name="AdjustInventoryHeader" xml:space="preserve">
<value>Коригувати інвентар</value>
</data>
<data name="AdjustmentAmountRequired" xml:space="preserve">
<value>Ви повинні вказати ненульове коригування запасів (кількість).</value>
</data>
<data name="Amount" xml:space="preserve">
<value>Кількість</value>
</data>
Expand Down Expand Up @@ -112,6 +115,9 @@
<data name="Group" xml:space="preserve">
<value>Група</value>
</data>
<data name="InventoryByUnitHeader" xml:space="preserve">
<value>Інвентар за підрозділом</value>
</data>
<data name="InventoryHistoryHeader" xml:space="preserve">
<value>Історія інвентарю</value>
</data>
Expand Down
10 changes: 0 additions & 10 deletions Core/Resgrid.Model/Providers/IAuditEventProvider.cs

This file was deleted.

17 changes: 16 additions & 1 deletion Core/Resgrid.Model/Repositories/IAuditLogsRepository.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
namespace Resgrid.Model.Repositories
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Resgrid.Model.Repositories
{
/// <summary>
/// Interface IAuditLogsRepository
Expand All @@ -7,5 +11,16 @@
/// <seealso cref="Resgrid.Model.Repositories.IRepository{Resgrid.Model.AuditLog}" />
public interface IAuditLogsRepository: IRepository<AuditLog>
{
/// <summary>
/// Gets a date-ranged, optionally type-filtered, paged set of audit logs for a department.
/// </summary>
/// <param name="departmentId">The department identifier.</param>
/// <param name="startDate">Inclusive lower bound on LoggedOn (UTC).</param>
/// <param name="endDate">Exclusive upper bound on LoggedOn (UTC).</param>
/// <param name="logType">Optional LogType filter; when null all types are returned.</param>
/// <param name="page">1-based page number.</param>
/// <param name="pageSize">Page size.</param>
/// <returns>Task&lt;IEnumerable&lt;AuditLog&gt;&gt;.</returns>
Task<IEnumerable<AuditLog>> GetAuditLogsForDepartmentPagedAsync(int departmentId, DateTime startDate, DateTime endDate, int? logType, int page, int pageSize);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
namespace Resgrid.Model.Repositories
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Resgrid.Model.Repositories
{
/// <summary>
/// Interface IPaymentProviderEventsRepository
Expand All @@ -7,5 +10,11 @@
/// <seealso cref="Resgrid.Model.Repositories.IRepository{Resgrid.Model.PaymentProviderEvent}" />
public interface IPaymentProviderEventsRepository: IRepository<PaymentProviderEvent>
{
/// <summary>
/// Gets all provider events for a payment-provider customer id (e.g. a Stripe customer), newest first.
/// </summary>
/// <param name="customerId">The payment-provider customer identifier.</param>
/// <returns>Task&lt;IEnumerable&lt;PaymentProviderEvent&gt;&gt;.</returns>
Task<IEnumerable<PaymentProviderEvent>> GetByCustomerIdAsync(string customerId);
}
}
27 changes: 26 additions & 1 deletion Core/Resgrid.Model/Repositories/ISystemAuditsRepository.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
namespace Resgrid.Model.Repositories
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Resgrid.Model.Repositories
{
/// <summary>
/// Interface ISystemAuditsRepository
Expand All @@ -7,5 +11,26 @@
/// <seealso cref="Resgrid.Model.Repositories.IRepository{Resgrid.Model.SystemAudit}" />
public interface ISystemAuditsRepository : IRepository<SystemAudit>
{
/// <summary>
/// Gets a date-ranged, paged set of system audits for a user (e.g. a login timeline).
/// </summary>
/// <param name="userId">The user identifier.</param>
/// <param name="startDate">Inclusive lower bound on LoggedOn (UTC).</param>
/// <param name="endDate">Exclusive upper bound on LoggedOn (UTC).</param>
/// <param name="page">1-based page number.</param>
/// <param name="pageSize">Page size.</param>
/// <returns>Task&lt;IEnumerable&lt;SystemAudit&gt;&gt;.</returns>
Task<IEnumerable<SystemAudit>> GetByUserIdPagedAsync(string userId, DateTime startDate, DateTime endDate, int page, int pageSize);

/// <summary>
/// Gets a date-ranged, paged set of system audits for a department.
/// </summary>
/// <param name="departmentId">The department identifier.</param>
/// <param name="startDate">Inclusive lower bound on LoggedOn (UTC).</param>
/// <param name="endDate">Exclusive upper bound on LoggedOn (UTC).</param>
/// <param name="page">1-based page number.</param>
/// <param name="pageSize">Page size.</param>
/// <returns>Task&lt;IEnumerable&lt;SystemAudit&gt;&gt;.</returns>
Task<IEnumerable<SystemAudit>> GetByDepartmentIdPagedAsync(int departmentId, DateTime startDate, DateTime endDate, int page, int pageSize);
}
}
6 changes: 0 additions & 6 deletions Core/Resgrid.Model/Services/IAuditEventService.cs

This file was deleted.

14 changes: 13 additions & 1 deletion Core/Resgrid.Model/Services/IAuditService.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

Expand All @@ -10,5 +11,16 @@ public interface IAuditService
Task<List<AuditLog>> GetAllAuditLogsForDepartmentAsync(int departmentId);
string GetAuditLogTypeString(AuditLogTypes logType);
Task<AuditLog> GetAuditLogByIdAsync(int auditLogId);

/// <summary>
/// Gets a date-ranged, optionally type-filtered, paged set of audit logs for a department.
/// </summary>
/// <param name="departmentId">The department identifier.</param>
/// <param name="startDate">Inclusive lower bound on LoggedOn (UTC).</param>
/// <param name="endDate">Exclusive upper bound on LoggedOn (UTC).</param>
/// <param name="logType">Optional LogType filter; when null all types are returned.</param>
/// <param name="page">1-based page number.</param>
/// <param name="pageSize">Page size.</param>
Task<List<AuditLog>> GetAuditLogsForDepartmentPagedAsync(int departmentId, DateTime startDate, DateTime endDate, AuditLogTypes? logType, int page, int pageSize);
}
}
26 changes: 0 additions & 26 deletions Core/Resgrid.Services/AuditEventService.cs

This file was deleted.

6 changes: 6 additions & 0 deletions Core/Resgrid.Services/AuditService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@ public async Task<List<AuditLog>> GetAllAuditLogsForDepartmentAsync(int departme
return logs.ToList();
}

public async Task<List<AuditLog>> GetAuditLogsForDepartmentPagedAsync(int departmentId, DateTime startDate, DateTime endDate, AuditLogTypes? logType, int page, int pageSize)
{
var logs = await _auditLogsRepository.GetAuditLogsForDepartmentPagedAsync(departmentId, startDate, endDate, (int?)logType, page, pageSize);
return logs.ToList();
}
Comment on lines +40 to +44
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Validate/clamp page and pageSize before delegating.

This is the single entry point feeding the paged repository methods. Without a guard, page <= 0 propagates a negative Offset to the SQL builders and fails at execution on both SQL Server and PostgreSQL. Likewise a non-positive pageSize produces an invalid LIMIT/FETCH NEXT.

🛡️ Suggested guard
 public async Task<List<AuditLog>> GetAuditLogsForDepartmentPagedAsync(int departmentId, DateTime startDate, DateTime endDate, AuditLogTypes? logType, int page, int pageSize)
 {
+	if (page < 1) page = 1;
+	if (pageSize < 1) pageSize = 1;
 	var logs = await _auditLogsRepository.GetAuditLogsForDepartmentPagedAsync(departmentId, startDate, endDate, (int?)logType, page, pageSize);
 	return logs.ToList();
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Core/Resgrid.Services/AuditService.cs` around lines 40 - 44,
GetAuditLogsForDepartmentPagedAsync should validate/clamp the incoming paging
parameters before calling the repository: ensure page is at least 1 (if <=0 set
to 1) and ensure pageSize is a positive value (e.g., set to a min of 1 and
optionally clamp to a sensible max like 1000) to avoid generating negative
OFFSET or invalid LIMIT/FETCH; update GetAuditLogsForDepartmentPagedAsync to
compute safePage and safePageSize and pass those to
_auditLogsRepository.GetAuditLogsForDepartmentPagedAsync(departmentId,
startDate, endDate, (int?)logType, safePage, safePageSize).


public string GetAuditLogTypeString(AuditLogTypes logType)
{
switch (logType)
Expand Down
12 changes: 11 additions & 1 deletion Core/Resgrid.Services/InventoryService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,14 @@ public class InventoryService: IInventoryService
private readonly IInventoryTypesRepository _inventoryTypesRepository;
private readonly IInventoryRepository _inventoryRepository;
private readonly IDepartmentGroupsService _departmentGroupsService;
private readonly IUnitsService _unitsService;

public InventoryService(IInventoryTypesRepository inventoryTypesRepository, IInventoryRepository inventoryRepository, IDepartmentGroupsService departmentGroupsService)
public InventoryService(IInventoryTypesRepository inventoryTypesRepository, IInventoryRepository inventoryRepository, IDepartmentGroupsService departmentGroupsService, IUnitsService unitsService)
{
_inventoryTypesRepository = inventoryTypesRepository;
_inventoryRepository = inventoryRepository;
_departmentGroupsService = departmentGroupsService;
_unitsService = unitsService;
}

public async Task<InventoryType> GetTypeByIdAsync(int typeId)
Expand All @@ -38,6 +40,9 @@ public async Task<Inventory> GetInventoryByIdAsync(int inventoryId)
if (inventory != null && inventory.GroupId > 0)
inventory.Group = await _departmentGroupsService.GetGroupByIdAsync(inventory.GroupId);

if (inventory != null && inventory.UnitId.HasValue && inventory.UnitId.Value > 0)
inventory.Unit = await _unitsService.GetUnitByIdAsync(inventory.UnitId.Value);

return inventory;
}

Expand Down Expand Up @@ -65,9 +70,14 @@ public async Task<List<Inventory>> GetAllTransactionsForDepartmentAsync(int depa
{
var inventories = await _inventoryRepository.GetAllInventoriesByDepartmentIdAsync(departmentId);

var units = await _unitsService.GetUnitsForDepartmentAsync(departmentId);

foreach (var inventory in inventories)
{
inventory.Group = await _departmentGroupsService.GetGroupByIdAsync(inventory.GroupId);

if (inventory.UnitId.HasValue && inventory.UnitId.Value > 0)
inventory.Unit = units?.FirstOrDefault(x => x.UnitId == inventory.UnitId.Value);
}

return inventories.ToList();
Expand Down
Loading
Loading