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; }