using Soneta.Business; using Soneta.Business.App; using Soneta.Business.UI; using Soneta.Core; using Soneta.Handel; using Soneta.Kasa; using Soneta.Ksiega; using Soneta.Tools; using Soneta.Types; using System; using System.Linq; namespace FX2_SP_WORKERS.PrzeksięgowanieProwizje { internal static class PrzeksiegowanieFun { public static object Start(Context context, PrzeksiegowanieParams parametry) { DokEwidencji dok = (DokEwidencji)context[typeof(DokEwidencji)]; //Warunki kluczowe if (dok == null || (DokEwidencji)dok.Features["PrzeksiegowanyDokument"] is not null) return null; string tanoshiiPrefix = ((Login)context[typeof(Login)]).Database.Name.Trim().ToUpper() == "TANOSHII" ? "001-" : ""; KsiegaModule km = KsiegaModule.GetInstance(context.Session); CoreModule cm = CoreModule.GetInstance(context.Session); OkresObrachunkowy okres = km.OkresyObrach.WgSymbolu[parametry.DataPrzyksiegowania.Year.ToString()]; string syntetyczne201203 = parametry.KontoKsiegowania == "202" ? "201" : "203"; KontoBase syntkonto201203 = FindKonto(km, syntetyczne201203, okres); KontoBase syntkonto201 = FindKonto(km, "201", okres); #region Sprawdzanie warunków wstępnych Progress(0m, "Sprawdzanie warunków wstępnych"); try { if (parametry.DefPK is null) throw new InvalidOperationException("Nie wybrano definicji dokumentu PK."); if (parametry.PunktPointaWschodni is null) throw new InvalidOperationException(dok.Typ == TypDokumentu.SprzedażEwidencja ? "Nie wybrano kontrahenta." : "Nie wybrano punktu POINT."); if (!dok.Dekrety.Any) throw new InvalidOperationException("Dokument nie posiada dekretów."); if (dok.Typ == TypDokumentu.ZakupEwidencja && !((Dekret)dok.Dekrety.GetFirst()).Zapisy.Any(x => x.Konto.AccessRight != AccessRights.Denied && x.Konto.Symbol.StartsWith($"{parametry.KontoKsiegowania}-{tanoshiiPrefix}"))) throw new InvalidOperationException($"Dokument nie posiada dekretu z zapisem na koncie {parametry.KontoKsiegowania}"); if (syntkonto201203 is null) throw new InvalidOperationException($"Brak syntetycznego konta {syntetyczne201203} w planie kont."); if (syntkonto201 is null) throw new InvalidOperationException($"Brak syntetycznego konta 201 w planie kont."); if (okres is null) throw new InvalidOperationException("Brak okresu obrachunkowego dla roku dokumentu."); } catch (Exception ex) { return Error("Przeksięgowanie - błąd warunków wstępnych", ex); } #endregion Sprawdzanie warunków wstępnych using (ITransaction tran = context.Session.Logout(true)) { #region Tworzenie dokumentu PK ewidencji Progress(0.20m, "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.Wartosc = parametry.SumaRaportu; pkk.Features["PrzeksiegowanyDokument"] = dok; pkk.DataEwidencji = pkk.DataOperacji = pkk.DataWplywu = parametry.DataPrzyksiegowania; if (pkk.Dokument is not DokumentHandlowy) pkk.DataDokumentu = parametry.DataPrzyksiegowania; } catch (Exception ex) { return Error("Przeksięgowanie - błąd tworzenia dokumentu PK", ex); } #endregion Tworzenie dokumentu PK ewidencji #region Tworzenie dekretu Progress(0.40m, "Tworzenie dekretu dokumentu PK"); Dekret dekretPK; ZapisKsiegowy zapis202Dok; string konto202_204 = $"{parametry.KontoKsiegowania}-{tanoshiiPrefix}{dok.Podmiot.Kod}"; try { zapis202Dok = ((Dekret)dok.Dekrety.GetFirst()).Zapisy .FirstOrDefault(x => x.Konto.AccessRight != AccessRights.Denied && x.Konto.Symbol == konto202_204); dekretPK = new Dekret(okres, pkk); pkk.Dekrety.BaseTable.AddRow(dekretPK); dekretPK.Opis = pkk.Opis; dekretPK.Data = parametry.DataPrzyksiegowania; } catch (Exception ex) { return Error("Przeksięgowanie - błąd tworzenia dekretu PK", ex); } #endregion Tworzenie dekretu #region Tworzenie zapisów dekretu Progress(0.60m, "Tworzenie zapisów dekretu dokumentu PK"); Zapis zapis202 = null; Zapis zapis201Ma = null; Zapis zapis201Winien = null; Zapis zapis201PMa = null; Zapis zapis201PWinien = null; try { KontoBase konto201F = FindKonto(km, $"{syntetyczne201203}-{tanoshiiPrefix}{dok.Podmiot.Kod}", okres); KontoBase konto201P = FindKonto(km, $"201-{tanoshiiPrefix}{parametry.PunktPointaWschodni.Kod}", okres); if (konto201F is null) throw new InvalidOperationException($"Brak konta {syntetyczne201203}-{tanoshiiPrefix}{dok.Podmiot.Kod} w planie kont. ({dok.Podmiot.Nazwa})"); if (konto201P is null) throw new InvalidOperationException($"Brak konta 201-{tanoshiiPrefix}{parametry.PunktPointaWschodni.Kod} w planie kont. ({parametry.PunktPointaWschodni.Nazwa})"); if (dok.Typ == TypDokumentu.ZakupEwidencja) { KontoBase konto202F = km.Konta.WgOkres[okres][new FieldCondition.Equal("Symbol", konto202_204)].FirstOrDefault(x => x.AccessRight != AccessRights.Denied); if (konto202F is null) throw new System.InvalidOperationException($"Brak konta {parametry.KontoKsiegowania}-" + tanoshiiPrefix + dok.Podmiot.Kod + " w planie kont. ( " + dok.Podmiot.Nazwa + " )"); //Dodanie zapisu na koncie 202F zapis202 = new Zapis(dekretPK); km.ZapisyKsiegowe.AddRow(zapis202); zapis202.Konto = konto202F; zapis202.WinienOperacji = zapis202Dok.MaOperacji; zapis202.DataPodatkowa = parametry.DataPrzyksiegowania; zapis202.Opis = pkk.Opis; if (zapis202.WinienOperacji.Symbol != "PLN") zapis202.Kurs = zapis202Dok.Kurs; //Dodanie zapisu na koncie 201F Ma zapis201Ma = new Zapis(dekretPK); km.ZapisyKsiegowe.AddRow(zapis201Ma); zapis201Ma.Konto = konto201F; zapis201Ma.MaOperacji = zapis202Dok.MaOperacji; zapis201Ma.DataPodatkowa = parametry.DataPrzyksiegowania; zapis201Ma.Opis = pkk.Opis; if (zapis201Ma.MaOperacji.Symbol != "PLN") zapis201Ma.Kurs = zapis202Dok.Kurs; //Dodanie zapisu na koncie 201F Winien zapis201Winien = new Zapis(dekretPK); km.ZapisyKsiegowe.AddRow(zapis201Winien); zapis201Winien.Konto = konto201F; zapis201Winien.WinienOperacji = new Currency(parametry.SumaRaportu); zapis201Winien.DataPodatkowa = parametry.DataPrzyksiegowania; zapis201Winien.Opis = pkk.Opis; //Dodanie zapisu na koncie 201P Ma zapis201PMa = new Zapis(dekretPK); km.ZapisyKsiegowe.AddRow(zapis201PMa); zapis201PMa.Konto = konto201P; zapis201PMa.MaOperacji = new Currency(parametry.SumaRaportu); zapis201PMa.DataPodatkowa = parametry.DataPrzyksiegowania; zapis201PMa.Opis = pkk.Opis; } else if (dok.Typ == TypDokumentu.SprzedażEwidencja) { //Dodanie zapisu na koncie 201F Ma zapis201Ma = new Zapis(dekretPK); km.ZapisyKsiegowe.AddRow(zapis201Ma); zapis201Ma.Konto = konto201F; zapis201Ma.MaOperacji = new Currency(parametry.SumaRaportu); zapis201Ma.DataPodatkowa = parametry.DataPrzyksiegowania; zapis201Ma.Opis = pkk.Opis; //Dodanie zapisu na koncie 201P Winien zapis201PWinien = new Zapis(dekretPK); km.ZapisyKsiegowe.AddRow(zapis201PWinien); zapis201PWinien.Konto = konto201P; zapis201PWinien.WinienOperacji = new Currency(parametry.SumaRaportu); zapis201PWinien.DataPodatkowa = parametry.DataPrzyksiegowania; zapis201PWinien.Opis = pkk.Opis; } } catch (Exception ex) { return Error("Przeksięgowanie - błąd tworzenia zapisów dekretu PK", ex); } #endregion Tworzenie zapisów dekretu #region Tworzenie należności i zobowiązań Progress(0.80m, "Tworzenie płatności dokumentu PK"); try { if (dok.Typ == TypDokumentu.ZakupEwidencja) { Zapis[] zapisyDoPlatnosci = { zapis202, zapis201Ma, zapis201Winien, zapis201PMa }; UtworzPlatnosci(zapisyDoPlatnosci, pkk); } else if (dok.Typ == TypDokumentu.SprzedażEwidencja) { Zapis[] zapisyDoPlatnosci = { zapis201Ma, zapis201PWinien }; UtworzPlatnosci(zapisyDoPlatnosci, pkk); } //Przeniesienie do bufora i z powrotem aby platnosci sie zatwierdzily pkk.Stan = StanEwidencji.Bufor; pkk.Stan = StanEwidencji.Predekretowany; } catch (Exception ex) { return Error("Przeksięgowanie - błąd tworzenia płatności dekretu PK", ex); } #endregion Tworzenie należności i zobowiązań Progress(1.00m, "Finalizowanie procesu"); dok.Features["PrzeksiegowanyDokument"] = pkk; tran.CommitUI(); } return new MessageBoxInformation("Przeksięgowanie") { Type = MessageBoxInformationType.Information, Text = "Proces wykonany pomyślnie", OKHandler = () => null }; } public static bool Visible(Context cx) { DokEwidencji dok = (DokEwidencji)cx[typeof(DokEwidencji)]; return dok.Typ is TypDokumentu.ZakupEwidencja or TypDokumentu.SprzedażEwidencja; } public static bool Enabled(Context cx) { DokEwidencji dok = (DokEwidencji)cx[typeof(DokEwidencji)]; return (dok.Stan == StanEwidencji.Predekretowany && (DokEwidencji)dok.Features["PrzeksiegowanyDokument"] 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}"); } private static KontoBase FindKonto(KsiegaModule km, string symbol, OkresObrachunkowy okres) { return km.Konta.WgOkres[okres].FirstOrDefault(x => x.AccessRight != AccessRights.Denied && x.Symbol == symbol); } private static void UtworzPlatnosci(Zapis[] zapisy, PKEwidencja pkk) { UtworzPlatnoscZZapisuWorker platnoscZZapisuWorker = new UtworzPlatnoscZZapisuWorker(); foreach (Zapis z in zapisy) { platnoscZZapisuWorker.Zapis = z; platnoscZZapisuWorker.Utworz(); z.ElementKsiegowalny = pkk.Platnosci.ToArray() .OrderBy(x => x.ID) .LastOrDefault(); } } } }