281 lines
11 KiB
C#
281 lines
11 KiB
C#
using MySqlConnector;
|
|
using UtopiaCanteenSystem.Models;
|
|
|
|
namespace UtopiaCanteenSystem.Services;
|
|
|
|
/// <summary>
|
|
/// Fetches lunch menu from HRMS: lunch_menu_week (by location_site_id) → lunch_menu_item → menu_item.
|
|
/// Uses IConfigService.GetHrmsLookupConnectionString(). Only current week is considered.
|
|
/// </summary>
|
|
//public class MenuLookupService : IMenuLookupService
|
|
//{
|
|
// private readonly IConfigService _configService;
|
|
|
|
// public MenuLookupService(IConfigService configService)
|
|
// {
|
|
// _configService = configService;
|
|
// }
|
|
|
|
// /// <inheritdoc />
|
|
// public async Task<IReadOnlyList<HrmsMenuItem>> GetMenuItemsForSiteAsync(int siteIdNumeric, CancellationToken cancellationToken = default)
|
|
// {
|
|
// // Backwards-compatible: use today's local date.
|
|
// return await GetMenuItemsForSiteAndDateAsync(siteIdNumeric, DateTime.Today, cancellationToken).ConfigureAwait(false);
|
|
// }
|
|
|
|
// /// <inheritdoc />
|
|
// public async Task<IReadOnlyList<HrmsMenuItem>> GetMenuItemsForSiteAndDateAsync(int siteIdNumeric, DateTime menuDateLocal, CancellationToken cancellationToken = default)
|
|
// {
|
|
// var connectionString = _configService.GetHrmsLookupConnectionString();
|
|
// if (string.IsNullOrWhiteSpace(connectionString))
|
|
// return Array.Empty<HrmsMenuItem>();
|
|
|
|
// //const string sql = @"
|
|
// // SELECT DISTINCT mi.id, mi.item_name, mi.item_type, mi.price
|
|
// // FROM lunch_menu_week w
|
|
// // JOIN lunch_menu_item li ON li.lunch_menu_week_id = w.id
|
|
// // JOIN menu_item mi ON mi.id = li.menu_item_id
|
|
// // WHERE w.location_site_id = @siteId
|
|
// // AND CURDATE() BETWEEN w.week_start_date AND w.week_end_date
|
|
// // ORDER BY mi.item_type, mi.item_name";
|
|
|
|
// const string sql = @"
|
|
// SELECT
|
|
// mi.id,
|
|
// mi.item_name,
|
|
// mi.item_type,
|
|
// mi.price,
|
|
// li.menu_date,
|
|
// li.day_of_week
|
|
// FROM lunch_menu_week w
|
|
// JOIN lunch_menu_item li ON li.lunch_menu_week_id = w.id
|
|
// JOIN menu_item mi ON mi.id = li.menu_item_id
|
|
// WHERE w.location_site_id = @siteId
|
|
// AND @menuDate BETWEEN w.week_start_date AND w.week_end_date
|
|
// AND li.menu_date = @menuDate
|
|
// ORDER BY mi.item_name;";
|
|
|
|
// //const string sql = @"
|
|
// // SELECT
|
|
// // mi.id,
|
|
// // mi.item_name,
|
|
// // mi.item_type,
|
|
// // mi.price,
|
|
// // li.meal_name,
|
|
// // li.menu_date,
|
|
// // li.day_of_week
|
|
// // FROM lunch_menu_week w
|
|
// // JOIN lunch_menu_item li ON li.lunch_menu_week_id = w.id
|
|
// // JOIN menu_item mi ON mi.id = li.menu_item_id
|
|
// // WHERE w.location_site_id = @siteId
|
|
// // AND @menuDate BETWEEN w.week_start_date AND w.week_end_date
|
|
// // AND li.menu_date = @menuDate
|
|
// // ORDER BY li.meal_name, mi.item_name;";
|
|
|
|
// await using var conn = new MySqlConnection(connectionString);
|
|
// await conn.OpenAsync(cancellationToken).ConfigureAwait(false);
|
|
// await using var cmd = new MySqlCommand(sql, conn);
|
|
// cmd.Parameters.AddWithValue("@siteId", siteIdNumeric);
|
|
// cmd.Parameters.AddWithValue("@menuDate", menuDateLocal.Date);
|
|
|
|
// var list = new List<HrmsMenuItem>();
|
|
// await using var reader = await cmd.ExecuteReaderAsync(cancellationToken).ConfigureAwait(false);
|
|
// while (await reader.ReadAsync(cancellationToken).ConfigureAwait(false))
|
|
// {
|
|
// //list.Add(new HrmsMenuItem
|
|
// //{
|
|
// // MenuItemId = reader.IsDBNull(0) ? 0 : reader.GetInt32(0),
|
|
// // ItemName = GetString(reader, 1),
|
|
// // ItemType = GetString(reader, 2),
|
|
// // Price = GetDecimal(reader, 3)
|
|
// //});
|
|
|
|
// list.Add(new HrmsMenuItem
|
|
// {
|
|
// MenuItemId = reader.IsDBNull(0) ? 0 : reader.GetInt32(0),
|
|
// ItemName = GetString(reader, 1),
|
|
// ItemType = GetString(reader, 2),
|
|
// Price = GetDecimal(reader, 3),
|
|
// MenuDate = GetString(reader, 4),
|
|
// DayOfWeek = GetString(reader, 5),
|
|
// MealName = string.Empty
|
|
// });
|
|
|
|
// //list.Add(new HrmsMenuItem
|
|
// //{
|
|
// // MenuItemId = reader.IsDBNull(0) ? 0 : reader.GetInt32(0),
|
|
// // ItemName = GetString(reader, 1),
|
|
// // ItemType = GetString(reader, 2),
|
|
// // Price = GetDecimal(reader, 3),
|
|
|
|
// // MealName = GetString(reader, 4),
|
|
// // MenuDate = GetString(reader, 5),
|
|
// // DayOfWeek = GetString(reader, 6),
|
|
// //});
|
|
// }
|
|
|
|
// return list;
|
|
// }
|
|
|
|
// private static string GetString(MySqlDataReader reader, int ordinal)
|
|
// {
|
|
// if (reader.IsDBNull(ordinal)) return string.Empty;
|
|
// var v = reader.GetValue(ordinal);
|
|
// return v?.ToString() ?? string.Empty;
|
|
// }
|
|
|
|
// private static decimal GetDecimal(MySqlDataReader reader, int ordinal)
|
|
// {
|
|
// if (reader.IsDBNull(ordinal)) return 0m;
|
|
// var v = reader.GetValue(ordinal);
|
|
// return v is decimal d ? d : Convert.ToDecimal(v);
|
|
// }
|
|
//}
|
|
|
|
|
|
|
|
public class MenuLookupService : IMenuLookupService
|
|
{
|
|
private readonly IConfigService _configService;
|
|
|
|
public MenuLookupService(IConfigService configService)
|
|
{
|
|
_configService = configService;
|
|
}
|
|
|
|
// Implementing the method for fetching menu items by site
|
|
public async Task<IReadOnlyList<HrmsMenuItem>> GetMenuItemsForSiteAsync(int siteIdNumeric, CancellationToken cancellationToken = default)
|
|
{
|
|
// Backwards-compatible: use today's local date.
|
|
return await GetMenuItemsForSiteAndDateAsync(siteIdNumeric, DateTime.Today, "NonManagement","no-active-meal-session", cancellationToken).ConfigureAwait(false);
|
|
}
|
|
|
|
// Implementing the method for fetching menu items by site, date, and gradeType
|
|
//public async Task<IReadOnlyList<HrmsMenuItem>> GetMenuItemsForSiteAndDateAsync(int siteIdNumeric, DateTime menuDateLocal, string gradeType, CancellationToken cancellationToken = default)
|
|
//{
|
|
// var connectionString = _configService.GetHrmsLookupConnectionString();
|
|
// if (string.IsNullOrWhiteSpace(connectionString))
|
|
// return Array.Empty<HrmsMenuItem>();
|
|
|
|
// const string sql = @"
|
|
// SELECT
|
|
// mi.id,
|
|
// mi.item_name,
|
|
// mi.item_type,
|
|
// mi.price,
|
|
// li.menu_date,
|
|
// li.day_of_week
|
|
// FROM lunch_menu_week w
|
|
// JOIN lunch_menu_item li ON li.lunch_menu_week_id = w.id
|
|
// JOIN menu_item mi ON mi.id = li.menu_item_id
|
|
// WHERE w.location_site_id = @siteId
|
|
// AND @menuDate BETWEEN w.week_start_date AND w.week_end_date
|
|
// AND li.menu_date = @menuDate
|
|
// AND mi.item_for = @itemFor
|
|
// ORDER BY mi.item_name;";
|
|
|
|
// var itemFor = GetItemForFromGradeType(gradeType);
|
|
|
|
// await using var conn = new MySqlConnection(connectionString);
|
|
// await conn.OpenAsync(cancellationToken).ConfigureAwait(false);
|
|
// await using var cmd = new MySqlCommand(sql, conn);
|
|
// cmd.Parameters.AddWithValue("@siteId", siteIdNumeric);
|
|
// cmd.Parameters.AddWithValue("@menuDate", menuDateLocal.Date);
|
|
// cmd.Parameters.AddWithValue("@itemFor", itemFor);
|
|
|
|
// var list = new List<HrmsMenuItem>();
|
|
// await using var reader = await cmd.ExecuteReaderAsync(cancellationToken).ConfigureAwait(false);
|
|
// while (await reader.ReadAsync(cancellationToken).ConfigureAwait(false))
|
|
// {
|
|
// list.Add(new HrmsMenuItem
|
|
// {
|
|
// MenuItemId = reader.IsDBNull(0) ? 0 : reader.GetInt32(0),
|
|
// ItemName = GetString(reader, 1),
|
|
// ItemType = GetString(reader, 2),
|
|
// Price = GetDecimal(reader, 3),
|
|
// MenuDate = GetString(reader, 4),
|
|
// DayOfWeek = GetString(reader, 5),
|
|
// MealName = string.Empty
|
|
// });
|
|
// }
|
|
|
|
// return list;
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
public async Task<IReadOnlyList<HrmsMenuItem>> GetMenuItemsForSiteAndDateAsync(
|
|
int siteIdNumeric,
|
|
DateTime menuDateLocal,
|
|
string gradeType,
|
|
string mealName, // Add mealName parameter
|
|
CancellationToken cancellationToken = default)
|
|
{
|
|
var connectionString = _configService.GetHrmsLookupConnectionString();
|
|
if (string.IsNullOrWhiteSpace(connectionString))
|
|
return Array.Empty<HrmsMenuItem>();
|
|
|
|
// Updated SQL to include meal_name filter and select meal_name
|
|
const string sql = @"
|
|
SELECT
|
|
mi.id,
|
|
mi.item_name,
|
|
mi.item_type,
|
|
mi.price,
|
|
li.menu_date,
|
|
li.day_of_week,
|
|
li.meal_name -- Add meal_name to SELECT
|
|
FROM lunch_menu_week w
|
|
JOIN lunch_menu_item li ON li.lunch_menu_week_id = w.id
|
|
JOIN menu_item mi ON mi.id = li.menu_item_id
|
|
WHERE w.location_site_id = @siteId
|
|
AND @menuDate BETWEEN w.week_start_date AND w.week_end_date
|
|
AND li.menu_date = @menuDate
|
|
AND li.meal_name = @mealName -- Filter by meal session
|
|
AND mi.item_for = @itemFor
|
|
ORDER BY mi.item_name;";
|
|
|
|
var itemFor = HrmsMenuItemForMapping.FromGradeType(gradeType);
|
|
|
|
await using var conn = new MySqlConnection(connectionString);
|
|
await conn.OpenAsync(cancellationToken).ConfigureAwait(false);
|
|
await using var cmd = new MySqlCommand(sql, conn);
|
|
cmd.Parameters.AddWithValue("@siteId", siteIdNumeric);
|
|
cmd.Parameters.AddWithValue("@menuDate", menuDateLocal.Date);
|
|
cmd.Parameters.AddWithValue("@mealName", mealName); // Add mealName parameter
|
|
cmd.Parameters.AddWithValue("@itemFor", itemFor);
|
|
|
|
var list = new List<HrmsMenuItem>();
|
|
await using var reader = await cmd.ExecuteReaderAsync(cancellationToken).ConfigureAwait(false);
|
|
while (await reader.ReadAsync(cancellationToken).ConfigureAwait(false))
|
|
{
|
|
list.Add(new HrmsMenuItem
|
|
{
|
|
MenuItemId = reader.IsDBNull(0) ? 0 : reader.GetInt32(0),
|
|
ItemName = GetString(reader, 1),
|
|
ItemType = GetString(reader, 2),
|
|
Price = GetDecimal(reader, 3),
|
|
MenuDate = GetString(reader, 4),
|
|
DayOfWeek = GetString(reader, 5),
|
|
MealName = GetString(reader, 6) // Map meal_name from column index 6
|
|
});
|
|
}
|
|
|
|
return list;
|
|
}
|
|
private static string GetString(MySqlDataReader reader, int ordinal)
|
|
{
|
|
if (reader.IsDBNull(ordinal)) return string.Empty;
|
|
var v = reader.GetValue(ordinal);
|
|
return v?.ToString() ?? string.Empty;
|
|
}
|
|
|
|
private static decimal GetDecimal(MySqlDataReader reader, int ordinal)
|
|
{
|
|
if (reader.IsDBNull(ordinal)) return 0m;
|
|
var v = reader.GetValue(ordinal);
|
|
return v is decimal d ? d : Convert.ToDecimal(v);
|
|
}
|
|
} |