using Soneta.Business; using Soneta.Business.App; using Soneta.Business.UI; using Soneta.Core; using Soneta.Ksiega; using Soneta.Tools; using Soneta.Types; using System; using System.Linq; namespace FX2_SP_WORKERS.PrzeksiegowanieKoszty { internal static class PrzeksiegowanieKosztyFun { public static object Start(Context context, PrzeksiegowanieKosztyParams parametry) { if (parametry.DefPK is null) throw new InvalidOperationException("Nie wybrano definicji dokumentu PK."); DokEwidencji dok = (DokEwidencji)context[typeof(DokEwidencji)]; KsiegaModule km = KsiegaModule.GetInstance(context.Session); CoreModule cm = CoreModule.GetInstance(context.Session); OkresObrachunkowy okres = km.OkresyObrach.WgSymbolu[dok.DataEwidencji.Year.ToString()]; using (ITransaction tran = context.Session.Logout(true)) { #region Tworzenie dokumentu PK ewidencji Progress(0.33m, "Tworzenie dokumentu PK"); PKEwidencja pkk; try { pkk = new PKEwidencja(); cm.DokEwidencja.AddRow(pkk); pkk.Definicja = parametry.DefPK; pkk.Podmiot = dok.Podmiot; pkk.NumerDokumentu = dok.Numer.Pelny; pkk.Opis = dok.Opis; pkk.Features["PrzeksiegowanyDokumentKoszty"] = dok; if (dok.Typ == TypDokumentu.ZakupEwidencja && dok.OpisAnalityczny.ToArray() .Any(x => x.Data.Month != dok.DataEwidencji.Month)) pkk.DataEwidencji = pkk.DataDokumentu = pkk.DataOperacji = pkk.DataWplywu = dok.OpisAnalityczny.ToArray() .Where(x => x.Data.Month != dok.DataEwidencji.Month) .OrderBy(x => x.ID) .Min(x => x.Data); else pkk.DataEwidencji = pkk.DataDokumentu = pkk.DataOperacji = pkk.DataWplywu = dok.DataEwidencji; } catch (Exception ex) { return Error("Przeksięgowanie - błąd tworzenia dokumentu PK", ex); } #endregion Tworzenie dokumentu PK ewidencji #region Dekretacja ze względu na różny miesiąc elementów opisu analitycznego if (dok.Typ == TypDokumentu.ZakupEwidencja && dok.OpisAnalityczny.ToArray() .Any(x => x.Data.Month != dok.DataEwidencji.Month)) { try { Progress(0.66m, "Tworzenie dekretu ze względu na różny miesiąc elementów opisu analitycznego."); Dekret dekr = DekretacjaPrzelomMiesiecy.Dekretuj(km, pkk, dok, okres, context); pkk.Stan = StanEwidencji.Bufor; pkk.Wartosc = dekr.KwotaOperacjiGospodarczej; pkk.Stan = StanEwidencji.Predekretowany; } catch (Exception ex) { return Error("Przeksięgowanie - błąd tworzenia dekretu", ex); } } Progress(1.00m, "Finalizowanie procesu"); dok.Features["PrzeksiegowanyDokumentKoszty"] = pkk; tran.CommitUI(); } #endregion Dekretacja ze względu na różny miesiąc elementów opisu analitycznego return new MessageBoxInformation("Przeksięgowanie kosztów") { Type = MessageBoxInformationType.Information, Text = "Proces wykonany pomyślnie", OKHandler = () => null }; } private static readonly string[] listaBazSQL = { //DEV "DEV WSCHODNI FRONT", //PRODUKCJA "WSCHODNI FRONT", "PAN VIKING", "TANOSHII", "FLOTA VIKINGA", "VIKING POINT", "VIKING SOFTWARE", //TESTY "TEST WSCHODNI FRONT" }; public static bool Visible(Context cx) { DokEwidencji dok = (DokEwidencji)cx[typeof(DokEwidencji)]; return dok.Typ is TypDokumentu.ZakupEwidencja or TypDokumentu.SprzedażEwidencja && listaBazSQL.Any(x => x.Trim().ToUpper() == ((Login)cx[typeof(Login)]).Database.Name.Trim().ToUpper()); } public static bool Enabled(Context cx) { DokEwidencji dok = (DokEwidencji)cx[typeof(DokEwidencji)]; return (dok.Stan == StanEwidencji.Predekretowany && (DokEwidencji)dok.Features["PrzeksiegowanyDokumentKoszty"] is null); } private static MessageBoxInformation Error(string title, Exception ex) => new(title) { Type = MessageBoxInformationType.Error, Text = ex.Message, OKHandler = () => null }; private static void Progress(decimal percent, string message) { TraceInfo.SetProgressBar(new Percent(percent)); TraceInfo.WriteProgress($"{(int)percent * 100}% {message}"); } } }