init
This commit is contained in:
commit
e124a47765
19374 changed files with 9806149 additions and 0 deletions
369
Kreta.Job.Tasks/SapJob.cs
Normal file
369
Kreta.Job.Tasks/SapJob.cs
Normal file
|
@ -0,0 +1,369 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using Kreta.Core;
|
||||
using Kreta.Core.Exceptions;
|
||||
using Kreta.Core.SAP;
|
||||
using Kreta.DataAccessManual;
|
||||
using Kreta.DataAccessManual.Interfaces;
|
||||
using Kreta.DataAccessManual.ParameterClasses;
|
||||
using Kreta.Enums.ManualEnums;
|
||||
using Kreta.Job.Tasks.Core;
|
||||
using Kreta.Job.Tasks.Core.Models;
|
||||
using Kreta.Job.Tasks.Models;
|
||||
using Kreta.Resources;
|
||||
|
||||
namespace Kreta.Job.Tasks
|
||||
{
|
||||
public class SapJob : ISapJob
|
||||
{
|
||||
private ISAPService SapServiceClient { get; }
|
||||
private ISAPConfiguration SapConfiguration { get; }
|
||||
|
||||
public SapJob(ISAPService sapService, ISAPConfiguration sapConfiguration)
|
||||
{
|
||||
SapServiceClient = sapService ?? throw new ArgumentNullException(nameof(sapService));
|
||||
SapConfiguration = sapConfiguration ?? throw new ArgumentNullException(nameof(sapService));
|
||||
}
|
||||
|
||||
public void SyncJobKeretEsTavollet()
|
||||
{
|
||||
var exceptions = new List<Exception>();
|
||||
|
||||
var now = DateTime.Now;
|
||||
foreach (var azonosito in KretaServer.KretaServer.Instance.GetOsszesIntezmeny())
|
||||
{
|
||||
Dal.OrganizationConnection.Run(azonosito, h =>
|
||||
{
|
||||
try
|
||||
{
|
||||
var icDal = h.IntezmenyConfigDAL();
|
||||
var dal = h.IntezmenyDal();
|
||||
|
||||
var intezmenyId = dal.GetIntezmenyIdByAzonosito(azonosito);
|
||||
if (!bool.Parse(icDal.GetIntezmenyConfig(intezmenyId.Value, IntezmenyConfigModulEnum.HRModul.ToString(), IntezmenyConfigTipusEnum.IsEnabled.ToString())))
|
||||
return;
|
||||
|
||||
var ds = dal.GetIntezmenyIdAktivTanevIdByAzonosito(azonosito);
|
||||
if (ds.Tables[0].Rows.Count > 0)
|
||||
{
|
||||
var pco = new TavolletSearchPco
|
||||
{
|
||||
TanevId = ds.Tables[0].Rows[0].Field<int>("AktivTanevId"),
|
||||
IntezmenyId = ds.Tables[0].Rows[0].Field<int>("IntezmenyId"),
|
||||
IntezmenyAzonosito = azonosito,
|
||||
NaptariEv = new int[] { now.Year },
|
||||
};
|
||||
|
||||
SyncSzabadsagKeret(h, null, pco);
|
||||
SyncTavollet(h, null, pco);
|
||||
}
|
||||
}
|
||||
catch (BlException ex)
|
||||
{
|
||||
exceptions.Add(ex);
|
||||
//TODO: Üzleti logika által dobott hiba egyéb kezelése! Ha kell a job-nál ezzel valamit kezdeni, akkor...
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
exceptions.Add(ex);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (exceptions.Any())
|
||||
{
|
||||
var blExceptions = exceptions.FindAll(e => e is BlException).Cast<BlException>();
|
||||
|
||||
if (blExceptions.Any())
|
||||
{
|
||||
//UzenetekHelper.cs ??
|
||||
SendNotificationEmail(blExceptions);
|
||||
}
|
||||
|
||||
var aggregateException = new AggregateException(exceptions);
|
||||
throw aggregateException.Flatten();
|
||||
}
|
||||
}
|
||||
|
||||
private void SendNotificationEmail(IEnumerable<BlException> blExceptions)
|
||||
{
|
||||
var aggregateBlException = new AggregateException(blExceptions).ToString();
|
||||
|
||||
var emailModel = new EmailModel
|
||||
{
|
||||
Message = aggregateBlException,
|
||||
Subject = $"{EmailResource.SapSyncJob}",
|
||||
Bcc = SapConfiguration.NotificationEmailsBussinessLogic
|
||||
};
|
||||
|
||||
Hangfire.BackgroundJob.Enqueue<IEmailJob>(email => email.SendMailAsync(emailModel));
|
||||
}
|
||||
|
||||
private int SyncSzabadsagKeret(IDalHandler dalHandler, int? alkalmazottId, TavolletSearchPco pco)
|
||||
{
|
||||
int missingSzTSz = 0;
|
||||
|
||||
var aDal = dalHandler.Alkalmazott();
|
||||
DataSet ds = aDal.GetAlkalmazottakSapAzonositoi(alkalmazottId, pco.TanevId, pco.IntezmenyId);
|
||||
|
||||
if (ds.Tables[0].Rows.Count > 0)
|
||||
{
|
||||
var funkcioTeruletek = new HashSet<string>();
|
||||
var keretek = new Dictionary<string, (int alkalmazottId, int keret)>();
|
||||
var requestQ = new List<TavolletRequestModel>();
|
||||
|
||||
var now = DateTime.Now;
|
||||
foreach (DataRow row in ds.Tables[0].Rows)
|
||||
{
|
||||
string intezmenySapAzonosito = row["IntezmenySAPKod"].ToString();
|
||||
string szTSzAzonosito = row["SzTSzKod"].ToString();
|
||||
if (string.IsNullOrWhiteSpace(intezmenySapAzonosito))
|
||||
{
|
||||
throw new BlException(string.Format(HRModulResource.IntezmenySapAzonositoHiany, pco.IntezmenyAzonosito));
|
||||
}
|
||||
if (string.IsNullOrWhiteSpace(szTSzAzonosito))
|
||||
{
|
||||
missingSzTSz++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!keretek.ContainsKey(szTSzAzonosito))
|
||||
{
|
||||
keretek.Add(szTSzAzonosito, (row.Field<int>("AlkalmazottId"), row.Field<int>("SzabadsagKeret")));
|
||||
}
|
||||
|
||||
if (!funkcioTeruletek.Contains(intezmenySapAzonosito))
|
||||
{
|
||||
funkcioTeruletek.Add(intezmenySapAzonosito);
|
||||
for (int i = 0; i < pco.NaptariEv.Length; i++)
|
||||
{
|
||||
// Időszak: január 1 - ma
|
||||
DateTime kezdet = new DateTime(pco.NaptariEv[i], 1, 1);
|
||||
DateTime vege = pco.NaptariEv[i] == now.Year ? now : new DateTime(pco.NaptariEv[i], 1, 1);
|
||||
|
||||
requestQ.Add(new TavolletRequestModel
|
||||
{
|
||||
IntezmenyAzonosito = intezmenySapAzonosito,
|
||||
SzTSzAzonosito = alkalmazottId.HasValue ? szTSzAzonosito : null,
|
||||
Kezdet = kezdet,
|
||||
Vege = vege
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var response = SapServiceClient.LekerdezesKeret(requestQ.ToArray());
|
||||
|
||||
if (response != null && response.Any())
|
||||
{
|
||||
var updateKeretDict = new Dictionary<int, int>();
|
||||
var sapErrorList = new List<string>();
|
||||
foreach (var item in response)
|
||||
{
|
||||
if (ResultCode.Success == item.ErrCode)
|
||||
{
|
||||
if (keretek.TryGetValue(item.SzTSzAzonosito, out (int alkalmazottId, int keret) value) && value.keret != item.SzabadKeret)
|
||||
{
|
||||
updateKeretDict.Add(value.alkalmazottId, item.SzabadKeret);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Ha hiba van, akkor egy listában gyűjtjük az üzeneteket.
|
||||
sapErrorList.Add(item.ErrText);
|
||||
}
|
||||
}
|
||||
|
||||
if (sapErrorList != null && sapErrorList.Count > 0)
|
||||
{
|
||||
throw new BlException(HRModulResource.ASzinkronizacioNemSikerult, new BlException(string.Join(Environment.NewLine, sapErrorList)));
|
||||
}
|
||||
aDal.UpdateAlkalmazottSzabadsagKeret(updateKeretDict);
|
||||
}
|
||||
}
|
||||
|
||||
return missingSzTSz;
|
||||
}
|
||||
|
||||
private int SyncTavollet(IDalHandler dalHandler, int? alkalmazottId, TavolletSearchPco pco)
|
||||
{
|
||||
int missingSzTSz = 0;
|
||||
|
||||
IAlkalmazottDal alkalmazaottDal = dalHandler.Alkalmazott();
|
||||
DataSet ds = alkalmazaottDal.GetAlkalmazottakSapAzonositoi(alkalmazottId, pco.TanevId, pco.IntezmenyId);
|
||||
|
||||
if (ds.Tables[0].Rows.Count > 0)
|
||||
{
|
||||
var sztszError = new HashSet<string>(); //Adathibák!!!
|
||||
var sapAzonositok = ds.Tables[0].Rows.OfType<DataRow>();
|
||||
var requestQ = new List<TavolletRequestModel>();
|
||||
|
||||
foreach (DataRow row in sapAzonositok)
|
||||
{
|
||||
string intezmenySapAzonosito = row["IntezmenySAPKod"].ToString();
|
||||
string szTSzAzonosito = row["SzTSzKod"].ToString();
|
||||
if (string.IsNullOrWhiteSpace(intezmenySapAzonosito))
|
||||
{
|
||||
throw new BlException(string.Format(HRModulResource.IntezmenySapAzonositoHiany, pco.IntezmenyAzonosito));
|
||||
}
|
||||
if (string.IsNullOrWhiteSpace(szTSzAzonosito))
|
||||
{
|
||||
missingSzTSz++;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Időszak: január 1 - december 31
|
||||
for (int i = 0; i < pco.NaptariEv.Length; i++)
|
||||
{
|
||||
DateTime kezdet = new DateTime(pco.NaptariEv[i], 1, 1);
|
||||
DateTime vege = kezdet.AddYears(1).AddSeconds(-1);
|
||||
|
||||
requestQ.Add(new TavolletRequestModel
|
||||
{
|
||||
IntezmenyAzonosito = intezmenySapAzonosito,
|
||||
SzTSzAzonosito = szTSzAzonosito,
|
||||
Kezdet = kezdet,
|
||||
Vege = vege
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
var response = SapServiceClient.Lekerdezes(requestQ.ToArray());
|
||||
|
||||
if (response != null && response.Any())
|
||||
{
|
||||
ISapTavolletDal sapTavolletDal = dalHandler.SapTavolletDal();
|
||||
|
||||
var tavolletTipusDict = new Dictionary<string, int>();
|
||||
foreach (DataRow row in sapTavolletDal.GetTavolletTipusDataSet(pco.TanevId, pco.IntezmenyId).Tables[0].Rows)
|
||||
{
|
||||
tavolletTipusDict.Add(row.Field<string>("SapCode"), row.Field<int>("ID"));
|
||||
}
|
||||
// 'Na' érték SAP kódja
|
||||
string naTavollettipus = "0000";
|
||||
|
||||
var tavolletListDict = new Dictionary<string, List<TavolletModel>>();
|
||||
var sapErrorList = new List<string>();
|
||||
foreach (var item in response)
|
||||
{
|
||||
if (ResultCode.Success == item.ErrCode)
|
||||
{
|
||||
DataRow sapAzonosito;
|
||||
try
|
||||
{
|
||||
sapAzonosito = sapAzonositok.Single(d => d.Field<string>("SzTSzKod") == item.SzTSzAzonosito);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
if (!sztszError.Contains(item.SzTSzAzonosito))
|
||||
{
|
||||
sztszError.Add(item.SzTSzAzonosito);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
TavolletModel e = new TavolletModel
|
||||
{
|
||||
AlkalmazottId = sapAzonosito.Field<int>("AlkalmazottId"),
|
||||
ElozoTaneviAlkalmazottId = sapAzonosito.Field<int?>("ElozoTaneviAlkalmazottId"),
|
||||
TanevId = pco.TanevId,
|
||||
IntezmenyId = pco.IntezmenyId,
|
||||
TavolletKezdete = item.Kezdet,
|
||||
TavolletVege = item.Vege,
|
||||
TavolletIdotartamNap = item.TavolletIdotartamNap,
|
||||
TavolletIdotartamOra = item.TavolletIdotartamOra,
|
||||
TavolletTipusId = tavolletTipusDict.TryGetValue(item.TavolletKod.WithLeadZeros(), out int value)
|
||||
? value
|
||||
: tavolletTipusDict[naTavollettipus]
|
||||
};
|
||||
|
||||
if (!tavolletListDict.ContainsKey(item.SzTSzAzonosito))
|
||||
{
|
||||
tavolletListDict.Add(item.SzTSzAzonosito, new List<TavolletModel>());
|
||||
}
|
||||
tavolletListDict[item.SzTSzAzonosito].Add(e);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Ha hiba van, akkor egy listában gyűjtjük az üzeneteket.
|
||||
sapErrorList.Add(item.ErrText);
|
||||
}
|
||||
}
|
||||
|
||||
if (sapErrorList != null && sapErrorList.Count > 0)
|
||||
{
|
||||
throw new BlException(HRModulResource.ASzinkronizacioNemSikerult, new BlException(string.Join(Environment.NewLine, sapErrorList)));
|
||||
}
|
||||
|
||||
var checklistTavolletDict = new Dictionary<string, List<TavolletModel>>();
|
||||
foreach (DataRow row in sapTavolletDal.GetSAPTavolletDataSet(alkalmazottId, pco).Tables[0].Rows)
|
||||
{
|
||||
TavolletModel c = new TavolletModel
|
||||
{
|
||||
AlkalmazottId = row.Field<int>("AlkalmazottId"),
|
||||
IntezmenyId = row.Field<int>("IntezmenyId"),
|
||||
TavolletKezdete = row.Field<DateTime>("TavolletKezdete"),
|
||||
TavolletVege = row.Field<DateTime>("TavolletVege"),
|
||||
TavolletIdotartamNap = row.Field<int?>("TavolletIdotartamNap"),
|
||||
TavolletIdotartamOra = row.Field<int?>("TavolletIdotartamOra"),
|
||||
TavolletTipusId = row.Field<int>("TavolletTipusId")
|
||||
};
|
||||
|
||||
if (!checklistTavolletDict.ContainsKey(row.Field<string>("SzTSzKod")))
|
||||
{
|
||||
checklistTavolletDict.Add(row.Field<string>("SzTSzKod"), new List<TavolletModel>());
|
||||
}
|
||||
checklistTavolletDict[row.Field<string>("SzTSzKod")].Add(c);
|
||||
}
|
||||
|
||||
var syncKeys = new List<string>();
|
||||
foreach (var key in tavolletListDict.Keys)
|
||||
{
|
||||
int th = tavolletListDict[key].AsReadOnly().GetSequenceHashCode();
|
||||
int ch = checklistTavolletDict.TryGetValue(key, out List<TavolletModel> list) ? list.AsReadOnly().GetSequenceHashCode() : 0;
|
||||
|
||||
if (th != ch)
|
||||
{
|
||||
syncKeys.Add(key);
|
||||
}
|
||||
}
|
||||
|
||||
if (syncKeys.Count > 0)
|
||||
{
|
||||
sapTavolletDal.SyncSapTavollet(ConvertModelToPco(tavolletListDict.Where(d => syncKeys.Contains(d.Key))), pco);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return missingSzTSz;
|
||||
}
|
||||
|
||||
private Dictionary<string, List<SAPTavolletPco>> ConvertModelToPco(IEnumerable<KeyValuePair<string, List<TavolletModel>>> coList)
|
||||
{
|
||||
var result = new Dictionary<string, List<SAPTavolletPco>>();
|
||||
|
||||
foreach (var co in coList)
|
||||
{
|
||||
result.Add(co.Key, new List<SAPTavolletPco>());
|
||||
foreach (var item in co.Value)
|
||||
{
|
||||
result[co.Key].Add(new SAPTavolletPco
|
||||
{
|
||||
AlkalmazottId = item.AlkalmazottId,
|
||||
ElozoTaneviAlkalmazottId = item.ElozoTaneviAlkalmazottId,
|
||||
TanevId = item.TanevId,
|
||||
IntezmenyId = item.IntezmenyId,
|
||||
TavolletKezdete = item.TavolletKezdete,
|
||||
TavolletVege = item.TavolletVege,
|
||||
TavolletIdotartamNap = item.TavolletIdotartamNap,
|
||||
TavolletIdotartamOra = item.TavolletIdotartamOra,
|
||||
TavolletTipusId = item.TavolletTipusId
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue