using System; using System.IO; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNet.Mvc; using Microsoft.Data.Entity; using Yavsc.Models; using Yavsc.Models.Billing; using Yavsc.ViewModels.Gen; namespace Yavsc.ViewComponents { public class EstimateViewComponent : ViewComponent { ApplicationDbContext dbContext; public EstimateViewComponent(ApplicationDbContext dbContext) { this.dbContext = dbContext; } public async Task InvokeAsync(long id) { return await InvokeAsync(id,"Html"); } public async Task InvokeAsync(long id, string outputFormat ="Html") { return await InvokeAsync(id,outputFormat,false,false); } public async Task InvokeAsync(long id, string outputFormat ="Html", bool asBill = false, bool acquitted = false) { return await Task.Run( ()=> { Estimate estimate = dbContext.Estimates.Include(x => x.Query) .Include(x => x.Query.Client) .Include(x => x.Query.PerformerProfile) .Include(x => x.Query.PerformerProfile.OrganizationAddress) .Include(x => x.Query.PerformerProfile.Performer) .Include(e => e.Bill).FirstOrDefault(x => x.Id == id); if (estimate == null) throw new Exception("No data"); var di = new DirectoryInfo(Startup.SiteSetup.UserFiles.Bills); var dia = new DirectoryInfo(Startup.SiteSetup.UserFiles.Avatars); ViewBag.BillsDir = di.FullName; ViewBag.AvatarsDir = dia.FullName; ViewBag.AsBill = asBill; ViewBag.Acquitted = acquitted; if (outputFormat == "LaTeX") { return this.View("Estimate_tex", estimate); } else if (outputFormat == "Pdf") { // Sorry for this code string tex = null; var oldWriter = ViewComponentContext.ViewContext.Writer; using (var writer = new StringWriter()) { this.ViewComponentContext.ViewContext.Writer = writer; var resultTex = View("Estimate_tex", estimate); resultTex.Execute(this.ViewComponentContext); tex = writer.ToString(); } ViewComponentContext.ViewContext.Writer = oldWriter; return this.View("Estimate_pdf", new PdfGenerationViewModel{ Temp = Startup.Temp, TeXSource = tex, DestDir = Startup.UserBillsDirName, BaseFileName = $"estimate-{id}" } ); } return View("Default",estimate); } ); } } }