public async Task <Models.Aktion> BezahlungBearbeiten(BenutzerID?benutzer, string kontokorrentId, string id, GeaenderteBezahlung request)
        {
            if (benutzer.HasValue && !await kontokorrentsService.HasAccess(benutzer.Value, kontokorrentId))
            {
                return(null);
            }
            var payment = kontokorrentV2Context.Aktionen.Where(v => v.KontokorrentId == kontokorrentId && v.BezahlungId == id)
                          .Select(v => v.Bezahlung)
                          .SingleOrDefault();

            if (null == payment)
            {
                return(null);
            }
            await CheckEditierbar(id);

            var personIds = request.BezahlendePersonId != null?request.EmpfaengerIds.Union(new[] { request.BezahlendePersonId }) : request.EmpfaengerIds;

            await CheckPersons(personIds, kontokorrentId);

            var aktion = new EFV2.Aktion()
            {
                KontokorrentId         = kontokorrentId,
                BearbeiteteBezahlungId = id,
                Bezahlung = new EFV2.Bezahlung()
                {
                    Id                 = Guid.NewGuid().ToString(),
                    Beschreibung       = request.Beschreibung,
                    BezahlendePersonId = request.BezahlendePersonId != null ? request.BezahlendePersonId : payment.BezahlendePersonId,
                    Emfpaenger         = request.EmpfaengerIds.Select(p => new EmfpaengerInBezahlung()
                    {
                        EmpfaengerId = p
                    }).ToList(),
                    Wert      = request.Wert,
                    Zeitpunkt = request.Zeitpunkt.UtcDateTime,
                },
                LaufendeNummer = await NeueLaufNummer(kontokorrentId)
            };

            kontokorrentV2Context.Aktionen.Add(aktion);
            await kontokorrentV2Context.SaveChangesAsync();

            var b = await kontokorrentV2Context.Bezahlung
                    .Include(v => v.BezahlendePerson)
                    .Include(v => v.Emfpaenger)
                    .ThenInclude(v => v.Empfaenger)
                    .Where(b => b.Id == aktion.Bezahlung.Id).SingleAsync();

            return(new Models.Aktion()
            {
                GeloeschteBezahlungId = null,
                BearbeiteteBezahlungId = aktion.BearbeiteteBezahlungId,
                Bezahlung = MapBezahlung(b),
                LaufendeNummer = aktion.LaufendeNummer
            });
        }
        public async Task <Models.Aktion> BezahlungHinzufuegen(BenutzerID?benutzer, string kontokorrentId, NeueBezahlung bezahlung)
        {
            if (benutzer.HasValue && !await kontokorrentsService.HasAccess(benutzer.Value, kontokorrentId))
            {
                return(null);
            }
            var personIds = bezahlung.EmpfaengerIds.Union(new[] { bezahlung.BezahlendePersonId });

            await CheckPersons(personIds, kontokorrentId);

            var sem = locks.GetOrAdd(kontokorrentId, new SemaphoreSlim(1));

            try
            {
                await sem.WaitAsync();

                var a = new EFV2.Aktion()
                {
                    KontokorrentId = kontokorrentId,
                    LaufendeNummer = await NeueLaufNummer(kontokorrentId),
                    Bezahlung      = new EFV2.Bezahlung()
                    {
                        Beschreibung       = bezahlung.Beschreibung,
                        BezahlendePersonId = bezahlung.BezahlendePersonId,
                        Emfpaenger         = bezahlung.EmpfaengerIds.Select(p => new EmfpaengerInBezahlung()
                        {
                            EmpfaengerId = p
                        }).ToList(),
                        Id        = bezahlung.Id ?? Guid.NewGuid().ToString(),
                        Wert      = bezahlung.Wert,
                        Zeitpunkt = bezahlung.Zeitpunkt.UtcDateTime,
                    }
                };
                kontokorrentV2Context.Aktionen.Add(a);
                await kontokorrentV2Context.SaveChangesAsync();

                var b = await kontokorrentV2Context.Bezahlung
                        .Include(v => v.BezahlendePerson)
                        .Include(v => v.Emfpaenger)
                        .ThenInclude(v => v.Empfaenger)
                        .Where(b => b.Id == a.Bezahlung.Id).SingleAsync();

                return(new Models.Aktion()
                {
                    GeloeschteBezahlungId = null,
                    BearbeiteteBezahlungId = null,
                    Bezahlung = MapBezahlung(b),
                    LaufendeNummer = a.LaufendeNummer
                });
            }
            finally
            {
                sem.Release();
            }
        }
        public async Task <Models.Aktion> BezahlungLoeschen(BenutzerID?benutzer, string kontokorrentId, string id)
        {
            if (benutzer.HasValue && !await kontokorrentsService.HasAccess(benutzer.Value, kontokorrentId))
            {
                return(null);
            }
            var b = await kontokorrentV2Context.Aktionen.Where(p => p.KontokorrentId == kontokorrentId && p.BezahlungId == id).SingleOrDefaultAsync();

            if (null == b)
            {
                return(null);
            }
            await CheckEditierbar(id);

            var sem = locks.GetOrAdd(b.KontokorrentId, new SemaphoreSlim(1));

            try
            {
                await sem.WaitAsync();

                var loeschung = new EFV2.Aktion()
                {
                    KontokorrentId        = kontokorrentId,
                    GeloeschteBezahlungId = id,
                    LaufendeNummer        = await NeueLaufNummer(b.KontokorrentId)
                };
                kontokorrentV2Context.Aktionen.Add(loeschung);
                await kontokorrentV2Context.SaveChangesAsync();

                return(new Models.Aktion()
                {
                    LaufendeNummer = loeschung.LaufendeNummer,
                    GeloeschteBezahlungId = loeschung.GeloeschteBezahlungId
                });
            }
            finally
            {
                sem.Release();
            }
        }