using System.ComponentModel; using System.Threading.Tasks; using ModelContextProtocol.Protocol; using ModelContextProtocol.Server; using Sozsoft.Mcp.Dtos; namespace Sozsoft.Mcp.Tools; /// /// Rapor kategorisi ve DynamicReport sablonu araclari. Sablon HTML'dir ve /// /admin/reports/DynamicReport/view/{Id} ile basilir; bir ekran kaydiyla acildiginda /// {{AlanAdi}} yer tutuculari o kaydin alanlariyla doldurulur. /// [McpServerToolType] public sealed class McpReportTools(IMcpReportAppService reportAppService) { [McpServerTool(Name = McpToolNames.ListReportTemplates, ReadOnly = true)] [Description("Rapor kategorilerini ve rapor sablonlarini listeler; HTML dondurmez. Sablon kaydederken kategori adi buradan secilir.")] public async Task ListReportTemplatesAsync( [Description("Sablon adi ya da aciklamasi icinde aranacak metin. Bos birakilabilir.")] string? search = null) => McpToolResult.From(await reportAppService.GetReportTemplatesAsync(search)); [McpServerTool(Name = McpToolNames.GetReportTemplate, ReadOnly = true)] [Description("Bir rapor sablonunun HTML icerigini, yer tutucularini ve goruntuleme adresini dondurur. Degistirmeden once oku.")] public async Task GetReportTemplateAsync( [Description("Sablonun Id'si ya da adi.")] string template) => McpToolResult.From(await reportAppService.GetReportTemplateAsync(template)); [McpServerTool(Name = McpToolNames.SaveReportCategory, Destructive = true, Idempotent = true)] [Description("Rapor kategorisini ada gore kaydeder: yoksa ekler, varsa gunceller. Kayit bir ekran kaydindan basilan HTML sablonu ise var olan 'Raporlar' kategorisini kullan; yeni kategori yalnizca istenince acilir.")] public async Task SaveReportCategoryAsync( [Description("Kategorinin adi; kimligidir.")] string name, [Description("Aciklama.")] string? description = null, [Description("Ikon adi.")] string? icon = null) => McpToolResult.From(await reportAppService.SaveReportCategoryAsync(new McpReportCategorySaveRequestDto { Name = name, Description = description, Icon = icon })); [McpServerTool(Name = McpToolNames.SaveReportTemplate, Destructive = true, Idempotent = true)] [Description("DynamicReport sablonunu ada gore kaydeder: yoksa ekler, varsa gunceller; guncellemede verilmeyen alanlar korunur. Sablon A4'e basilan HTML'dir (Standard Taahhutname gibi). listFormCode verilirse HTML icindeki {{AlanAdi}} yer tutuculari o ekranin alanlarina gore dogrulanir ve cevapta rowButton doner: bu butonu ekranin CommandColumnJson listesine ekle (deploy_wizard), VisibleExpression ile kosullandir. Sozlesme icin get_dev_guide 9.12.")] public async Task SaveReportTemplateAsync( [Description("Sablonun adi; kimligidir.")] string name, [Description("Kategori adi ya da Id'si. Yeni sablonda zorunlu; kayit HTML'i icin 'Raporlar'.")] string? category = null, [Description("Basilacak HTML. Kayit alanlari {{AlanAdi}} ile, rapor tarihi @@date ile yazilir. Yeni sablonda zorunlu, guncellemede bos birakilirsa mevcut icerik korunur.")] string? htmlContent = null, [Description("Aciklama.")] string? description = null, [Description("'active' ya da 'passive'. Yeni sablonda varsayilan 'active'.")] string? status = null, [Description("Sablonun basilacagi ekranin kodu (ornegin katilimci listesi). Verilirse yer tutucular dogrulanir ve satir butonu doner.")] string? listFormCode = null, [Description("Satir butonunun dil anahtari. Verilmezse App.Platform.View.")] string? buttonText = null) => McpToolResult.From(await reportAppService.SaveReportTemplateAsync(new McpReportTemplateSaveRequestDto { Name = name, Category = category, HtmlContent = htmlContent, Description = description, Status = status, ListFormCode = listFormCode, ButtonText = buttonText })); [McpServerTool(Name = McpToolNames.DeleteReportTemplate, Destructive = true, Idempotent = false)] [Description("Rapor sablonunu siler. Sablonu acan satir butonlari ekranlardan ayrica kaldirilir.")] public async Task DeleteReportTemplateAsync( [Description("Sablonun Id'si ya da adi.")] string template) => McpToolResult.From(await reportAppService.DeleteReportTemplateAsync(template)); }