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<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;
        }
Пример #3
0
        public ActionResult SaveOrder(Dokument dok)
        {
            if (!MusicStore.Models.Module.User.IsAuthenticated) return RedirectToAction("Index", "Home");
            if (MusicStore.Models.Module.User.GetCurrentRole() != MusicStore.Models.Module.User.Klient) return RedirectToAction("Index", "Home");

            DbModule module = DbModule.GetInstance();
            dok.DataZamowienia = DateTime.Now;
            dok.NumerDokumentu = Dokument.GetLastNumber();
            module.AddRow(dok);

            string[] koszyk = Request.Cookies["Cart"].Value.ToString().Split(',');
            var dict = new System.Collections.Generic.Dictionary<int, int>();

            if (!String.IsNullOrEmpty(Request.Cookies["Cart"].Value))
                foreach (string Ids in koszyk)
                {
                    int Id = int.Parse(Ids);
                    if (!dict.ContainsKey(Id))
                    {
                        dict.Add(Id, 1);
                    }
                    else
                    {
                        dict[Id] += 1;
                    }
                }

            var dict2 = new System.Collections.Generic.Dictionary<Album, int>();
            decimal wartosc = 0;
            string waluta = "";
            foreach (var obiekt in dict)
            {
                var album = module.Albumy.Where(x => x.Id == obiekt.Key).First();
                dict2.Add(album, obiekt.Value);
                wartosc += album.BruttoValue * obiekt.Value;

                if (waluta == "")
                {
                    waluta = album.BruttoSymbol;
                }
                else if (waluta != album.BruttoSymbol)
                {
                    waluta = "(Wiele walut)";
                    wartosc = 0;
                }
            }
            int lp = 1;
            foreach(var poz in dict2)
            {
                PozycjaDokumentu pozycja = new PozycjaDokumentu(dok);
                pozycja.AlbumName = poz.Key.Nazwa + " (" + poz.Key.Artysta.Nazwa + ")";
                pozycja.CenaBrutto = poz.Key.BruttoValue;
                pozycja.Ilosc = poz.Value;
                pozycja.Lp = lp;
                pozycja.State = RowState.Added;
                pozycja.Waluta = poz.Key.BruttoSymbol;

                module.AddRow(pozycja);

                var album = poz.Key;
                album.StanIlosc -= pozycja.Ilosc;
                module.Update(album);
                lp++;
            }
            ViewBag.NumerDokumentu = dok.NumerDokumentu;
            return View();
        }