using System; using System.ComponentModel.DataAnnotations; using System.IO; using System.Reflection; using Kreta.Core.Iktato.Poszeidon.Factory.Interface; using Kreta.Core.Iktato.Poszeidon.Infrastructure.Interface; using Kreta.DataAccess.Interfaces; using Kreta.DataAccessManual; using Kreta.DataAccessManual.Interfaces; using Kreta.Enums; using Kreta.Framework; using Kreta.Job.Tasks.Core; using Kreta.Job.Tasks.Helpers; using Kreta.Job.Tasks.Helpers.Iktatas; namespace Kreta.Job.Tasks { public class IktatasJob : IktatasJobBase, IIktatasJob { public IktatasJob(IIktatoRepositoryFactory iktatoRepositoryFactory, IWcfServiceContext wcfServiceContext, Kreta.Core.IktatoServiceConfiguration iktatoServiceConfiguration) : base(iktatoRepositoryFactory, wcfServiceContext, iktatoServiceConfiguration) { } [Hangfire.AutomaticRetry(Attempts = 2)] [JobStateWatcher(typeof(IktatasJob), nameof(WriteFailedJobId))] public void FoszamosIktatasDal(int iktatottDokumentumId, int iktatoId, int partnerId, string intezmenyAzonosito, int intezmenyId, int tanevId, Hangfire.Server.PerformContext context) { var jobId = context.BackgroundJob.Id; Dal.OrganizationConnection.Run(intezmenyAzonosito, (h) => { UserContext.Instance.SetIntezmenyEsTanev(intezmenyId, tanevId, tanevId); var intezmenyDal = h.IntezmenyDal(); var intezmeny = intezmenyDal.Get(intezmenyId); var tanevDal = h.TanevDal(); var tanev = tanevDal.Get(tanevId); var iktatottDokumentumDal = h.IktatottDokumentumDal(); var iktatottDokumentum = iktatottDokumentumDal.Get(iktatottDokumentumId); var iktato = iktatottDokumentum.IktatoSzemely; var kulcsszavak = GetDokumentumKulcsszavak(h, iktatottDokumentumId, intezmenyId, tanevId, tanev.Nev, iktato.NyomtatasiNev); string iratfajtaNev = GetIratfajtaNev(iktatottDokumentum); var irattariTetelszam = h.AdatszotarDAL().GetAdatszotarById(iktatottDokumentum.DokumentumTipus, iktatottDokumentum.IntezmenyId, iktatottDokumentum.TanevId).Tables[0].Rows[0]["Code"].ToString(); var iratRequest = new Kreta.Core.Iktato.Poszeidon.Domain.Model.IratRequest() { Iratfajta = Constants.Iktatas.IrattargyfajtaNev, Irattargyfajta = iratfajtaNev, Targy = iktatottDokumentum.DokumentumNeve, IrattariTetelszam = irattariTetelszam + "." }; var elektronikusPeldanyRequest = new Kreta.Core.Iktato.Poszeidon.Domain.Model.ElektronikusPeldanyRequest() { BirtokloSzervezetKod = intezmeny.IktatoSzervezetAzonosito }; Kreta.Core.Iktato.Poszeidon.Domain.Model.FoszamosIktatasRequest foszamosIktatasRequest = new Kreta.Core.Iktato.Poszeidon.Domain.Model.FoszamosIktatasRequest() { IktatoSzervezetKod = intezmeny.IktatoSzervezetAzonosito, Kulcsszavak = kulcsszavak, IratRequest = iratRequest, ElektronikusPeldanyRequest = elektronikusPeldanyRequest }; var iktatoRepositoryConfiguration = GetIktatoRepositoryConfiguration(intezmeny.IktatoSzervezetAzonosito, intezmeny.PoszeidonBejelentkezesiNev); var iktatasResponse = IktatoRepositoryFactory.GetIktatoRepository(iktatoRepositoryConfiguration).FoszamosIktatas(foszamosIktatasRequest); iktatottDokumentum.IsFoszamos = true; iktatottDokumentum.DokumentumStatusz = (int)DokumentumStatuszEnum.IktatasraVar; iktatottDokumentum.ElektronikusPeldanyId = Convert.ToInt32(iktatasResponse.ElektronikusPeldanyId); iktatottDokumentum.IktatasDatuma = DateTime.Now; iktatottDokumentum.Iktatoszam = iktatasResponse.Iktatoszam; iktatottDokumentum.Vonalkod = iktatasResponse.Iktatoszam; iktatottDokumentum.FailedJobId = null; iktatottDokumentum.IratId = iktatasResponse.IratId; iktatottDokumentum.UgyiratId = iktatottDokumentum.UgyiratId; #region Iktatoszám és vonalkód kitöltése //string formatum = iktatottDokumentum.DokumentumTartalomTipus; IDokumentum generaltDokumentum = IktatoszamVonalkodKitoltes(h, Path.GetExtension(iktatottDokumentum.FajlNev), iktatottDokumentum.GeneraltDokumentumId.Value, iktatottDokumentum.Iktatoszam, iktatottDokumentum.DokumentumTipus); #endregion var nyomtatvanyokDal = h.NyomtatvanyokDal(); nyomtatvanyokDal.FullUpdate(generaltDokumentum); nyomtatvanyokDal.FullUpdate(iktatottDokumentum); string id = Hangfire.BackgroundJob.ContinueWith(jobId, (iktatas) => iktatas.FeltoltesUjVerzioDal(iktatottDokumentumId, intezmenyAzonosito, intezmenyId, tanevId)); }); } [Hangfire.AutomaticRetry(Attempts = 2)] [JobStateWatcher(typeof(IktatasJob), nameof(WriteFailedJobId))] public void AlszamosIktatasDal(int iktatottDokumentumId, int parentDokumentumId, int iktatoId, int partnerId, string intezmenyAzonosito, int intezmenyId, int tanevId, Hangfire.Server.PerformContext context) { var jobId = context.BackgroundJob.Id; Dal.OrganizationConnection.Run(intezmenyAzonosito, (h) => { UserContext.Instance.SetIntezmenyEsTanev(intezmenyId, tanevId, tanevId); var intezmenyDal = h.IntezmenyDal(); var intezmeny = intezmenyDal.Get(intezmenyId); var tanevDal = h.TanevDal(); var tanev = tanevDal.Get(tanevId); var iktatottDokumentumDal = h.IktatottDokumentumDal(); var iktatottDokumentum = iktatottDokumentumDal.Get(iktatottDokumentumId); var parentIktatottDokumentum = iktatottDokumentumDal.Get(parentDokumentumId); var iktato = iktatottDokumentum.IktatoSzemely; var kulcsszavak = GetDokumentumKulcsszavak(h, iktatottDokumentumId, intezmenyId, tanevId, tanev.Nev, iktato.NyomtatasiNev); var foszam = GetFoszam(parentIktatottDokumentum.Iktatoszam); string iratfajtaNev = GetIratfajtaNev(iktatottDokumentum); var irattariTetelszam = h.AdatszotarDAL().GetAdatszotarById(iktatottDokumentum.DokumentumTipus, iktatottDokumentum.IntezmenyId, iktatottDokumentum.TanevId).Tables[0].Rows[0]["Code"].ToString(); var iratRequest = new Kreta.Core.Iktato.Poszeidon.Domain.Model.IratRequest() { Iratfajta = Constants.Iktatas.IrattargyfajtaNev, Irattargyfajta = iratfajtaNev, Targy = iktatottDokumentum.DokumentumNeve, IrattariTetelszam = irattariTetelszam + "." }; var elektronikusPeldanyRequest = new Kreta.Core.Iktato.Poszeidon.Domain.Model.ElektronikusPeldanyRequest() { BirtokloSzervezetKod = intezmeny.IktatoSzervezetAzonosito }; Kreta.Core.Iktato.Poszeidon.Domain.Model.AlszamosIktatasRequest alszamosIktatasRequest = new Kreta.Core.Iktato.Poszeidon.Domain.Model.AlszamosIktatasRequest() { IktatoSzervezetKod = intezmeny.IktatoSzervezetAzonosito, Kulcsszavak = kulcsszavak, Foszam = foszam, SzovegesIktatoszam = parentIktatottDokumentum.Iktatoszam, IratRequest = iratRequest, ElektronikusPeldanyRequest = elektronikusPeldanyRequest }; var iktatoRepositoryConfiguration = GetIktatoRepositoryConfiguration(intezmeny.IktatoSzervezetAzonosito, intezmeny.PoszeidonBejelentkezesiNev); var iktatasResponse = IktatoRepositoryFactory.GetIktatoRepository(iktatoRepositoryConfiguration).AlszamosIktatas(alszamosIktatasRequest); iktatottDokumentum.IsFoszamos = iktatasResponse.IsFoszamos; iktatottDokumentum.DokumentumStatusz = (int)DokumentumStatuszEnum.IktatasraVar; iktatottDokumentum.ElektronikusPeldanyId = Convert.ToInt32(iktatasResponse.ElektronikusPeldanyId); iktatottDokumentum.IktatasDatuma = DateTime.Now; iktatottDokumentum.Iktatoszam = iktatasResponse.Iktatoszam; iktatottDokumentum.Vonalkod = iktatasResponse.Iktatoszam; iktatottDokumentum.FailedJobId = null; iktatottDokumentum.IratId = iktatasResponse.IratId; iktatottDokumentum.UgyiratId = iktatottDokumentum.UgyiratId; #region Iktatoszám és vonalkód kitöltése IDokumentum generaltDokumentum = IktatoszamVonalkodKitoltes(h, Path.GetExtension(iktatottDokumentum.FajlNev), iktatottDokumentum.GeneraltDokumentumId.Value, iktatottDokumentum.Iktatoszam, iktatottDokumentum.DokumentumTipus); #endregion var nyomtatvanyokDal = h.NyomtatvanyokDal(); nyomtatvanyokDal.FullUpdate(generaltDokumentum); nyomtatvanyokDal.FullUpdate(iktatottDokumentum); string id = Hangfire.BackgroundJob.ContinueWith(jobId, (iktatas) => iktatas.FeltoltesUjVerzioDal(iktatottDokumentumId, intezmenyAzonosito, intezmenyId, tanevId)); }); } private static string GetIratfajtaNev(IIktatottDokumentum iktatottDokumentum) { string iratfajtaNev; switch (iktatottDokumentum.DokumentumKategoria) { case (int)DokumentumKategoriaEnum.Naplok: switch (iktatottDokumentum.DokumentumTipus) { case (int)DokumentumTipusEnum.Osztalynaplo: case (int)DokumentumTipusEnum.HaladasiNaplo: case (int)DokumentumTipusEnum.OsztalyozoNaplo: iratfajtaNev = GetDisplayName(Enums.ManualEnums.PoszeidonIratfajtakEnum.Osztalynaplo); break; default: iratfajtaNev = GetDisplayName(Enums.ManualEnums.PoszeidonIratfajtakEnum.Csoportnaplo); break; } break; case (int)DokumentumKategoriaEnum.Orarendek: iratfajtaNev = GetDisplayName(Enums.ManualEnums.PoszeidonIratfajtakEnum.Orarend); break; case (int)DokumentumKategoriaEnum.Tanulok: iratfajtaNev = GetDisplayName(Enums.ManualEnums.PoszeidonIratfajtakEnum.Tanulokkal_kapcsolatos_dokumentum); break; case (int)DokumentumKategoriaEnum.Pedagogusok: iratfajtaNev = GetDisplayName(Enums.ManualEnums.PoszeidonIratfajtakEnum.Pedagogusokkal_kapcsolatos_dokumentum); break; case (int)DokumentumKategoriaEnum.Statisztikak: iratfajtaNev = GetDisplayName(Enums.ManualEnums.PoszeidonIratfajtakEnum.Statisztika); break; case (int)DokumentumKategoriaEnum.ErtesitokTorzslapBizonyitvany: iratfajtaNev = GetDisplayName(Enums.ManualEnums.PoszeidonIratfajtakEnum.Ertesito_tozslap_bizonyitvany); break; case (int)DokumentumKategoriaEnum.IgazolasokMulasztasiErtesitok: iratfajtaNev = GetDisplayName(Enums.ManualEnums.PoszeidonIratfajtakEnum.Igazolas_mulasztasi_ertesito); break; case (int)DokumentumKategoriaEnum.TanugyiEllenorzes: iratfajtaNev = GetDisplayName(Enums.ManualEnums.PoszeidonIratfajtakEnum.Tanugyi_ellenorzessel_kapcsolatos_dokumentum); break; case (int)DokumentumKategoriaEnum.Alapdokumentumok: iratfajtaNev = GetDisplayName(Enums.ManualEnums.PoszeidonIratfajtakEnum.Alapdokumentum); break; case (int)DokumentumKategoriaEnum.szemelyzeti_ugyek: iratfajtaNev = GetDisplayName(Enums.ManualEnums.PoszeidonIratfajtakEnum.Szemelyzeti_Ugyek); break; default: throw new ApplicationException(Resources.ErrorResource.HianyzoDokumentumKategoriaPoszeidonIratfajtaOsszerendeles); } return iratfajtaNev; } public int GetFoszam(string iktatoszam) { string[] parts = iktatoszam.Split("/".ToCharArray()); var foszamStr = parts[parts.Length - 2].Split("-".ToCharArray())[0]; if (!int.TryParse(foszamStr, out int foszam)) { throw new FormatException(string.Format(Resources.ErrorResource.HibasformatumuFoszam, iktatoszam)); } return foszam; } public static void WriteFailedJobId(string jobId) { var jobDetails = Hangfire.JobStorage.Current.GetMonitoringApi().JobDetails(jobId); var offset = 0; if (jobDetails.Job.Method.Name == nameof(AlszamosIktatasDal)) { offset = 1; } var iktatottDokumentumId = (int)jobDetails.Job.Args[0]; var intezmenyAzonosito = (string)jobDetails.Job.Args[3 + offset]; var intezmenyId = (int)jobDetails.Job.Args[4 + offset]; var tanevId = (int)jobDetails.Job.Args[5 + offset]; Dal.OrganizationConnection.Run(intezmenyAzonosito, (h) => { UserContext.Instance.SetIntezmenyEsTanev(intezmenyId, tanevId, tanevId); var iktatottDokumentumDal = h.IktatottDokumentumDal(); var iktatottDokumentum = iktatottDokumentumDal.Get(iktatottDokumentumId); iktatottDokumentum.FailedJobId = int.Parse(jobId); iktatottDokumentum.DokumentumStatusz = (int)DokumentumStatuszEnum.Hibas; iktatottDokumentum.ElektronikusPeldanyFeltoltesDatuma = DateTime.Now; var nyomtatvanyokDal = h.NyomtatvanyokDal(); nyomtatvanyokDal.Update(iktatottDokumentum); }); } private static IDokumentum IktatoszamVonalkodKitoltes(IDalHandler handler, string kiterjesztes, int generaltDokumentumId, string iktatoszam, int dokumentumTipus) { bool isLablecben; switch (dokumentumTipus) { case (int)DokumentumTipusEnum.AlapitoOkirat: case (int)DokumentumTipusEnum.SzervezetiEsMukodesiSzabalyzat: case (int)DokumentumTipusEnum.PedagogiaiProgram: case (int)DokumentumTipusEnum.Hazirend: case (int)DokumentumTipusEnum.Munkaterv: case (int)DokumentumTipusEnum.tavollet: case (int)DokumentumTipusEnum.mukodesi_engedely: isLablecben = true; break; default: isLablecben = false; break; } switch (kiterjesztes) { case ".xls": return IktatoszamVonalkodExcelKitoltes(handler, generaltDokumentumId, iktatoszam); case ".doc": return IktatoszamVonalkodDocKitoltes(handler, generaltDokumentumId, iktatoszam, isLablecben); case ".docx": return IktatoszamVonalkodDocxKitoltes(handler, generaltDokumentumId, iktatoszam, isLablecben); case ".pdf": return IktatoszamVonalkodPlaceholderKitoltes(handler, generaltDokumentumId, iktatoszam); case ".xlsx": return IktatoszamVonalkodExcelXKitoltes(handler, generaltDokumentumId, iktatoszam); default: return handler.DokumentumDal().Get(generaltDokumentumId); } } private static IDokumentum IktatoszamVonalkodDocKitoltes(IDalHandler handler, int generaltDokumentumId, string iktatoszam, bool isLablecben) { return IktatoszamVonalkodWordKitoltes(handler, generaltDokumentumId, iktatoszam, isLablecben, true); } private static IDokumentum IktatoszamVonalkodDocxKitoltes(IDalHandler handler, int generaltDokumentumId, string iktatoszam, bool isLablecben) { return IktatoszamVonalkodWordKitoltes(handler, generaltDokumentumId, iktatoszam, isLablecben, false); } private static IDokumentum IktatoszamVonalkodWordKitoltes(IDalHandler handler, int generaltDokumentumId, string iktatoszam, bool isLablecben, bool isDoc) { IDokumentum generaltDokumentum = handler.DokumentumDal().Get(generaltDokumentumId); using (var ret = new MemoryStream()) using (var ms = new MemoryStream(generaltDokumentum.Tartalom)) { var loadOptions = new Aspose.Words.LoadOptions(); loadOptions.LoadFormat = (isDoc) ? Aspose.Words.LoadFormat.Doc : Aspose.Words.LoadFormat.Docx; Aspose.Words.Document doc = new Aspose.Words.Document(ms, loadOptions); Aspose.Words.Story footer = (isLablecben) ? doc.FirstSection.HeadersFooters[Aspose.Words.HeaderFooterType.FooterPrimary] : (Aspose.Words.Story)doc.FirstSection.Body; Aspose.Words.Replacing.FindReplaceOptions options = new Aspose.Words.Replacing.FindReplaceOptions { MatchCase = true, FindWholeWordsOnly = false, ReplacingCallback = new WordIktatoszamVonalkodTextReplacer() }; footer.Range.Replace(new System.Text.RegularExpressions.Regex("{iktatoSzam}|{vonalkod}"), iktatoszam, options); var saveFormat = (isDoc) ? Aspose.Words.SaveFormat.Doc : Aspose.Words.SaveFormat.Docx; doc.Save(ret, saveFormat); ret.Position = 0; generaltDokumentum.Tartalom = ret.ToArray(); } return generaltDokumentum; } private static IDokumentum IktatoszamVonalkodExcelKitoltes(IDalHandler handler, int generaltDokumentumId, string iktatoszam) { IDokumentum generaltDokumentum = handler.DokumentumDal().Get(generaltDokumentumId); using (var ms = new MemoryStream(generaltDokumentum.Tartalom)) { Aspose.Cells.Workbook workbook = new Aspose.Cells.Workbook(ms); foreach (var worksheet in workbook.Worksheets) { worksheet.PageSetup.SetFooter(0, string.Format("&16{0}", iktatoszam)); worksheet.PageSetup.SetFooter(2, string.Format("&\"Code 128\"&20{0}", iktatoszam)); } var ret = workbook.SaveToStream(); generaltDokumentum.Tartalom = ret.GetBuffer(); } return generaltDokumentum; } private static IDokumentum IktatoszamVonalkodExcelXKitoltes(IDalHandler handler, int generaltDokumentumId, string iktatoszam) { IDokumentum generaltDokumentum = handler.DokumentumDal().Get(generaltDokumentumId); using (var ms = new MemoryStream(generaltDokumentum.Tartalom)) { Aspose.Cells.Workbook workbook = new Aspose.Cells.Workbook(ms, new Aspose.Cells.LoadOptions(Aspose.Cells.LoadFormat.Xlsx)); foreach (var worksheet in workbook.Worksheets) { worksheet.PageSetup.SetFooter(0, string.Format("&16{0}", iktatoszam)); worksheet.PageSetup.SetFooter(2, string.Format("&\"Code 128\"&20{0}", iktatoszam)); } var ret = new MemoryStream(); workbook.Save(ret, Aspose.Cells.SaveFormat.Xlsx); ret.Seek(0, SeekOrigin.Begin); generaltDokumentum.Tartalom = ret.ToArray(); } return generaltDokumentum; } private static IDokumentum IktatoszamVonalkodPlaceholderKitoltes(IDalHandler handler, int generaltDokumentumId, string iktatoszam) { IDokumentum generaltDokumentum = handler.DokumentumDal().Get(generaltDokumentumId); using (var ms = new MemoryStream(generaltDokumentum.Tartalom)) using (var ret = new MemoryStream()) { Aspose.Pdf.Document doc = new Aspose.Pdf.Document(ms); var fragmentAbsober = new Aspose.Pdf.Text.TextFragmentAbsorber("{iktatoSzam}"); doc.Pages.Accept(fragmentAbsober); var fragmentCollection = fragmentAbsober.TextFragments; foreach (var text in fragmentCollection) { text.Text = iktatoszam; text.TextState.ForegroundColor = Aspose.Pdf.Color.Black; } fragmentAbsober.Phrase = "{vonalkod}"; doc.Pages.Accept(fragmentAbsober); fragmentCollection = fragmentAbsober.TextFragments; var code128Path = System.Web.Hosting.HostingEnvironment.MapPath("~/fonts/code128.ttf"); var font = Aspose.Pdf.Text.FontRepository.OpenFont(code128Path); foreach (var text in fragmentCollection) { text.Text = iktatoszam; text.TextState.Font = font; text.TextState.ForegroundColor = Aspose.Pdf.Color.Black; } //foreach (var page in doc.Pages) //{ // Aspose.Pdf.Text.TextBuilder textBuilder = new Aspose.Pdf.Text.TextBuilder(page); // Aspose.Pdf.Text.TextFragment textFragment = new Aspose.Pdf.Text.TextFragment("Laci"); // if (page.Footer == null) // { // Aspose.Pdf.HeaderFooter footer = new Aspose.Pdf.HeaderFooter(); // page.Footer = footer; // } // page.Footer.Paragraphs.Add(textFragment); //} doc.Save(ret); generaltDokumentum.Tartalom = ret.ToArray(); } return generaltDokumentum; } private static string GetDisplayName(T enumValue) where T : Enum { string result; FieldInfo fieldInfo = enumValue.GetType().GetField(enumValue.ToString()); DisplayAttribute[] displayAttributeArray = (DisplayAttribute[])fieldInfo.GetCustomAttributes(typeof(DisplayAttribute), false); if (displayAttributeArray.Length > 0) { result = displayAttributeArray[0].GetName(); return result; } result = enumValue.ToString(); return result; } } }