public async Task <Guid> Handle(WydajCommand request, CancellationToken cancellationToken)
        {
            var numer = request.Model.KontrahentId.HasValue ?
                        await GetNumerDokumentuWZ(request.PrzedsiebiorstwoId, request.Model.Data.Year) :
                        await GetNumerDokumentuRW(request.PrzedsiebiorstwoId, request.Model.Data.Year);

            var stanyAktualne = await _stanyAktualneService.GetStanMagazynu(request.Model.MagazynId, request.PrzedsiebiorstwoId);

            var orderedStanyAktualne = stanyAktualne.Where(x => x.Ilosc > 0)
                                       .OrderBy(x => x.CenaNetto).ThenBy(x => x.CenaBrutto).ToList();

            var pozycjeDokumentuWydania = new List <PozycjaDokumentu>();

            foreach (var p in request.Model.Pozycje)
            {
                var iloscDoWydania = p.Ilosc;
                for (var i = 0; i < orderedStanyAktualne.Count(x => x.ProduktId == p.ProduktId) && iloscDoWydania > 0; i++)
                {
                    var stan                    = orderedStanyAktualne.Where(x => x.ProduktId == p.ProduktId).ToList()[i];
                    var iloscWydawana           = iloscDoWydania > stan.Ilosc ? stan.Ilosc : iloscDoWydania;
                    var pozycjaDokumentuWydania = new PozycjaDokumentu
                    {
                        Id            = Guid.NewGuid(),
                        CenaNetto     = stan.CenaNetto,
                        CenaBrutto    = stan.CenaBrutto,
                        Ilosc         = iloscWydawana,
                        ProduktId     = stan.ProduktId,
                        StawkaVat     = stan.StawkaVat,
                        WartoscNetto  = decimal.Round(stan.Ilosc * iloscWydawana),
                        WartoscVat    = decimal.Round(stan.Ilosc * iloscWydawana * stan.StawkaVat.GetStawkaVat()),
                        WartoscBrutto = decimal.Round(stan.Ilosc * iloscWydawana) + decimal.Round(stan.Ilosc * iloscWydawana * stan.StawkaVat.GetStawkaVat())
                    };
                    pozycjeDokumentuWydania.Add(pozycjaDokumentuWydania);

                    iloscDoWydania -= pozycjaDokumentuWydania.Ilosc;
                }

                if (iloscDoWydania > 0)
                {
                    throw new BussinessException("Niewystarczający stan magazynowy");
                }
            }

            var dokument = new Dokument
            {
                Id               = Guid.NewGuid(),
                Data             = request.Model.Data,
                MagazynId        = request.Model.MagazynId,
                Numer            = numer,
                TypDokumentu     = TypDokumentu.PrzesuniecieMiedzymagazynoweUjemne,
                PozycjeDokumentu = pozycjeDokumentuWydania
            };

            return(await _dokumentRepository.Save(dokument));
        }
        public async Task <List <StanAktualnyDto> > Handle(StanAktualnyMagazynuQuery request, CancellationToken cancellationToken)
        {
            var listaProduktow = await _produktRepository.GetList(request.PrzedsiebiorstwoId);

            var stanAktualny = await wydanieService.GetStanMagazynu(request.MagazynId, request.PrzedsiebiorstwoId);

            return(stanAktualny.GroupBy(x => x.ProduktId).Select((x, idx) => new StanAktualnyDto
            {
                Id = idx + 1,
                ProduktId = x.Key,
                Nazwa = listaProduktow.Single(p => p.Id == x.Key).Nazwa,
                Skrot = listaProduktow.Single(p => p.Id == x.Key).Skrot,
                JednostkaMiary = listaProduktow.Single(p => p.Id == x.Key).JednostkaMiary.Nazwa,
                Ilosc = x.Sum(pd => pd.Ilosc),
                WartoscNetto = x.Sum(pd => pd.WartoscNetto),
                WartoscVat = x.Sum(pd => pd.WartoscVat),
                WartoscBrutto = x.Sum(pd => pd.WartoscBrutto)
            }).ToList());
        }
        public async Task<Guid> Handle(PrzesunCommand request, CancellationToken cancellationToken)
        {
            var stanyAktualne = await _stanyAktualneService.GetStanMagazynu(request.Model.MagazynWydajacyId, request.PrzedsiebiorstwoId);
            var orderedStanyAktualne = stanyAktualne.Where(x => x.Ilosc > 0)
                .OrderBy(x => x.CenaNetto).ThenBy(x => x.CenaBrutto).ToList();

            var produkty = await _produktRepository.GetList(request.PrzedsiebiorstwoId);

            var pozycjeDokumentuWydania = new List<PozycjaDokumentu>();
            var pozycjeDokumentuPrzyjecia = new List<PozycjaDokumentu>();
            foreach (var p in request.Model.Pozycje)
            {
                var iloscDoWydania = p.Ilosc;
                for (var i = 0; i < orderedStanyAktualne.Count(x => x.ProduktId == p.ProduktId) && iloscDoWydania > 0; i++)
                {
                    var stan = orderedStanyAktualne.Where(x => x.ProduktId == p.ProduktId).ToList()[i];
                    var iloscWydawana = iloscDoWydania > stan.Ilosc ? stan.Ilosc : iloscDoWydania;
                    var pozycjaDokumentuWydania = new PozycjaDokumentu
                    {
                        Id = Guid.NewGuid(),
                        CenaNetto = stan.CenaNetto,
                        CenaBrutto = stan.CenaBrutto,
                        Ilosc = iloscWydawana,
                        ProduktId = stan.ProduktId,
                        StawkaVat = stan.StawkaVat,
                        WartoscNetto = decimal.Round(stan.Ilosc * iloscWydawana),
                        WartoscVat = decimal.Round(stan.Ilosc * iloscWydawana * stan.StawkaVat.GetStawkaVat()),
                        WartoscBrutto = decimal.Round(stan.Ilosc * iloscWydawana) + decimal.Round(stan.Ilosc * iloscWydawana * stan.StawkaVat.GetStawkaVat())
                    };
                    pozycjeDokumentuWydania.Add(pozycjaDokumentuWydania);

                    var pozycjaDokumentuPrzyjecia = new PozycjaDokumentu
                    {
                        Id = Guid.NewGuid(),
                        CenaNetto = stan.CenaNetto,
                        CenaBrutto = stan.CenaBrutto,
                        Ilosc = iloscWydawana,
                        ProduktId = await UtworzProduktNaMagazyniePrzyjecia(produkty, p.ProduktId, request.Model.MagazynPrzyjmujacyId),
                        StawkaVat = stan.StawkaVat,
                        WartoscBrutto = pozycjaDokumentuWydania.WartoscBrutto,
                        WartoscNetto = pozycjaDokumentuWydania.WartoscNetto,
                        WartoscVat = pozycjaDokumentuWydania.WartoscVat
                    };
                    pozycjeDokumentuPrzyjecia.Add(pozycjaDokumentuPrzyjecia);

                    iloscDoWydania -= pozycjaDokumentuWydania.Ilosc;
                }

                if (iloscDoWydania > 0)
                {
                    throw new BussinessException("Niewystarczający stan magazynowy");
                }
            }

            var dokumentMinus = new Dokument
            {
                Id = Guid.NewGuid(),
                Data = request.Model.Data,
                MagazynId = request.Model.MagazynWydajacyId,
                Numer = $"MM-/{await GetLicznikDokumentu(request.PrzedsiebiorstwoId, request.Model.Data.Year)}/{request.Model.Data.Year}",
                TypDokumentu = TypDokumentu.PrzesuniecieMiedzymagazynoweUjemne,
                PozycjeDokumentu = pozycjeDokumentuWydania
            };

            var dokumentPlus = new Dokument
            {
                Id = Guid.NewGuid(),
                Data = request.Model.Data,
                MagazynId = request.Model.MagazynPrzyjmujacyId,
                Numer = $"MM+/{await GetLicznikDokumentu(request.PrzedsiebiorstwoId, request.Model.Data.Year)}/{request.Model.Data.Year}",
                TypDokumentu = TypDokumentu.PrzesuniecieMiedzymagazynoweDodatnie,
                PozycjeDokumentu = pozycjeDokumentuPrzyjecia
            };

            await _dokumentRepository.Save(dokumentMinus);
            await _dokumentRepository.Save(dokumentPlus);

            return dokumentMinus.Id;
        }