public Rezervacija Insert(RezervacijaInsertRequest request) { var entity = _mapper.Map <Data.EntityModels.Rezervacija>(request); entity.KlijentId = _korisnikService.GetCurrentUser().Klijent.Id; if (request.ObradiIznajmljivanje) { var Stavke = GetTerminStavke(entity.KlijentId); foreach (var stavka in Stavke) { double cijena = 0; if (stavka.Bicikl != null) { cijena = stavka.Bicikl.CijenaPoDanu.Value * stavka.BrojDana; } entity.UkupniIznos += cijena * stavka.Kolicina; } double stopa_poreza = 17.0; entity.Osnovica = entity.UkupniIznos / (1 + stopa_poreza / 100); entity.UkupnoPoreza = entity.UkupniIznos - entity.Osnovica; entity.RezervacijaIznajmljenaBicikla = new List <Data.EntityModels.RezervacijaIznajmljenaBicikla>(); // Bicikla foreach (var naruceno_biciklo in Stavke.ToList()) { var bicikl_stanja = _context.BiciklStanje .Where(x => x.BiciklId == naruceno_biciklo.BiciklId) .Where(x => x.Aktivan == true) .Where(x => x.Kolicina > 0) .ToList(); if (bicikl_stanja.Sum(x => x.Kolicina) < naruceno_biciklo.Kolicina) { throw new UserException("Naručeno biciklo " + naruceno_biciklo.Bicikl.PuniNaziv + " nije dostupno u traženoj kolicini!"); } var trazena_kolicina = naruceno_biciklo.Kolicina; foreach (var bicikl_na_stanju in bicikl_stanja) { var dostupna_kolicina = Math.Min(trazena_kolicina, bicikl_na_stanju.Kolicina); bicikl_na_stanju.Kolicina -= dostupna_kolicina; trazena_kolicina -= dostupna_kolicina; for (int i = 0; i < dostupna_kolicina; i++) { entity.RezervacijaIznajmljenaBicikla.Add(new Data.EntityModels.RezervacijaIznajmljenaBicikla { BiciklStanjeId = bicikl_na_stanju.BiciklStanjeId, DatumPreuzimanja = naruceno_biciklo.DatumPreuzimanja, DatumVracanja = naruceno_biciklo.DatumVracanja }); } if (trazena_kolicina == 0) { break; } } } } else if (request.RezervacijaServis != null) { var DatumServisiranja = request.RezervacijaServis[0].DatumServisiranja; foreach (var stavka in request.RezervacijaServis) { var servis = _context.Servis.Where(x => x.ServisId == stavka.ServisId) .Where(x => x.IsDeleted == false).FirstOrDefault(); if (servis is null) { throw new UserException("Servis nije pronađen: " + stavka.ServisId); } stavka.DatumServisiranja = DatumServisiranja; DatumServisiranja = DatumServisiranja.AddHours(servis.Trajanje); entity.UkupniIznos += servis.Cijena; } double stopa_poreza = 17.0; entity.Osnovica = entity.UkupniIznos / (1 + stopa_poreza / 100); entity.UkupnoPoreza = entity.UkupniIznos - entity.Osnovica; entity.RezervacijaServis = new List <Data.EntityModels.RezervacijaServis>(); foreach (var rezervacija_servis in request.RezervacijaServis) { var item = _mapper.Map <Data.EntityModels.RezervacijaServis>(rezervacija_servis); entity.RezervacijaServis.Add(item); } } else { var Stavke = GetKorpaStavke(entity.KlijentId); foreach (var stavka in Stavke) { double cijena = 0; if (stavka.Bicikl != null) { cijena = stavka.Bicikl.Cijena.Value; } else if (stavka.Oprema != null) { cijena = stavka.Oprema.Cijena; } else if (stavka.Dio != null) { cijena = stavka.Dio.Cijena; } entity.UkupnoProizvodi += cijena * stavka.Kolicina; } double stopa_poreza = 17.0; entity.Postarina = 0.0; if (entity.NacinOtpremeId != 0) { entity.Postarina = _context.NacinOtpreme .Where(x => x.IsDeleted == false).Where(x => x.NacinOtpremeId == entity.NacinOtpremeId).Single()?.Cijena ?? 0.0; } entity.UkupniIznos = entity.UkupnoProizvodi; entity.Osnovica = entity.UkupniIznos / (1 + stopa_poreza / 100); entity.UkupnoPoreza = entity.UkupniIznos - entity.Osnovica; entity.UkupniIznos += entity.Postarina; entity.RezervacijaProdajaBicikla = new List <Data.EntityModels.RezervacijaProdajaBicikla>(); entity.RezervacijaProdajaDio = new List <Data.EntityModels.RezervacijaProdajaDio>(); entity.RezervacijaProdajaOprema = new List <Data.EntityModels.RezervacijaProdajaOprema>(); // Bicikla foreach (var naruceno_biciklo in Stavke.Where(x => x.BiciklId != null).ToList()) { var bicikl_stanja = _context.BiciklStanje .Where(x => x.BiciklId == naruceno_biciklo.BiciklId) .Where(x => x.Aktivan == true) .Where(x => x.Kolicina > 0) .ToList(); if (bicikl_stanja.Sum(x => x.Kolicina) < naruceno_biciklo.Kolicina) { throw new UserException("Naručeno biciklo " + naruceno_biciklo.Bicikl.PuniNaziv + " nije dostupno u traženoj kolicini!"); } var trazena_kolicina = naruceno_biciklo.Kolicina; foreach (var bicikl_na_stanju in bicikl_stanja) { var dostupna_kolicina = Math.Min(trazena_kolicina, bicikl_na_stanju.Kolicina); bicikl_na_stanju.Kolicina -= dostupna_kolicina; trazena_kolicina -= dostupna_kolicina; for (int i = 0; i < dostupna_kolicina; i++) { entity.RezervacijaProdajaBicikla.Add(new Data.EntityModels.RezervacijaProdajaBicikla { BiciklStanjeId = bicikl_na_stanju.BiciklStanjeId }); } if (trazena_kolicina == 0) { break; } } } // Dijelovi foreach (var naruceno_dio in Stavke.Where(x => x.DioId != null).ToList()) { var dio_stanja = _context.DioStanje .Where(x => x.DioId == naruceno_dio.DioId) .Where(x => x.Aktivan == true) .Where(x => x.KupacId == null) .Take(naruceno_dio.Kolicina) .ToList(); if (dio_stanja.Count < naruceno_dio.Kolicina) { throw new UserException("Naručeno dio " + naruceno_dio.Dio.Naziv + " nije dostupno u traženoj kolicini!"); } foreach (var dio_na_stanju in dio_stanja) { entity.RezervacijaProdajaDio.Add(new Data.EntityModels.RezervacijaProdajaDio { DioStanjeId = dio_na_stanju.DioStanjeId }); dio_na_stanju.Aktivan = false; dio_na_stanju.KupacId = entity.KlijentId; } } // Oprema foreach (var narucena_oprema in Stavke.Where(x => x.OpremaId != null).ToList()) { var oprema_stanja = _context.OpremaStanje .Where(x => x.OpremaId == narucena_oprema.OpremaId) .Where(x => x.Aktivan == true) .Where(x => x.KupacId == null) .Take(narucena_oprema.Kolicina) .ToList(); if (oprema_stanja.Count < narucena_oprema.Kolicina) { throw new UserException("Naručena oprema " + narucena_oprema.Oprema.Naziv + " nije dostupna u traženoj kolicini!"); } foreach (var oprema_na_stanju in oprema_stanja) { entity.RezervacijaProdajaOprema.Add(new Data.EntityModels.RezervacijaProdajaOprema { OpremaStanjeId = oprema_na_stanju.OpremaStanjeId }); oprema_na_stanju.Aktivan = false; oprema_na_stanju.KupacId = entity.KlijentId; } } } entity.DatumRezervacije = DateTime.Now; entity.StanjeRezervacije = Data.EntityModels.StanjeRezervacije.ekanje_uplate; if (entity.NacinOtpremeId == 0) { entity.NacinOtpremeId = _context.NacinOtpreme .Where(x => x.IsDeleted == false).First(x => x.Cijena == 0).NacinOtpremeId; } entity.NacinOtpreme = _context.NacinOtpreme.First(x => x.NacinOtpremeId == entity.NacinOtpremeId); _context.Rezervacija.Add(entity); _context.SaveChanges(); if (request.ObradiIznajmljivanje) { var termin_stavke = _context.TerminStavka.Where(x => x.KlijentId == entity.KlijentId).ToList(); foreach (var item in termin_stavke) { _context.TerminStavka.Remove(item); } } else if (request.RezervacijaServis != null) { // do nothing } else { var korpa_stavke = _context.KorpaStavka.Where(x => x.KlijentId == entity.KlijentId).ToList(); foreach (var item in korpa_stavke) { _context.KorpaStavka.Remove(item); } if (entity.NacinPlacanja != "online") { var zaposlenici = _context.Zaposlenik.Where(x => x.Korisnik.Aktivan == true).ToList(); foreach (var zaposlenik in zaposlenici) { var notifikacija = new Data.EntityModels.Notifikacija { ZaposlenikId = zaposlenik.Id, Tip = Data.EntityModels.TipNotifikacije.Nova_Narudzba, Rezervacija = entity, DatumVrijeme = DateTime.Now }; _context.Notifikacija.Add(notifikacija); } } } _context.SaveChanges(); return(_mapper.Map <Model.Rezervacija>(entity)); }
public ActionResult PotvrdiUplatu(PaymentIntentConfirmRequest request) { var narudzba = _context.Rezervacija.Where(x => x.RezervacijaId == request.RezervacijaId && x.StanjeRezervacije == Data.EntityModels.StanjeRezervacije.ekanje_uplate).FirstOrDefault(); if (narudzba == null) { return(new JsonResult(new { error = "Narudžba nije u ispravnom stanju." })); } var narudzba_iznos = (int)narudzba.UkupniIznos * 100; if (narudzba_iznos == 0) { return(new JsonResult(new { error = "Iznos narudžbe je neispravan." })); } var paymentIntents = new PaymentIntentService(); var paymentIntent = paymentIntents.Create(new PaymentIntentCreateOptions { Amount = narudzba_iznos, Currency = "usd", Confirm = true, Metadata = new Dictionary <string, string>(), PaymentMethod = request.PaymentMethodId }); paymentIntent.Metadata["RezervacijaId"] = request.RezervacijaId.ToString(); if (paymentIntent.Amount == narudzba_iznos && paymentIntent.Status == "succeeded") { narudzba.StanjeRezervacije = Data.EntityModels.StanjeRezervacije.U_obradi; if (narudzba.DatumUplate is null) { narudzba.DatumUplate = DateTime.Now; } _context.SaveChanges(); bool IsServisRezervacija = narudzba.RezervacijaServis.Any(), IsTerminRezervacija = narudzba.RezervacijaIznajmljenaBicikla.Any(); if (IsServisRezervacija || IsTerminRezervacija || narudzba.NacinPlacanja == "online") { var zaposlenici = _context.Zaposlenik.Where(x => x.Korisnik.Aktivan == true).ToList(); foreach (var zaposlenik in zaposlenici) { var notifikacija = new Data.EntityModels.Notifikacija { ZaposlenikId = zaposlenik.Id, Rezervacija = narudzba, DatumVrijeme = DateTime.Now }; if (IsServisRezervacija) { notifikacija.Tip = Data.EntityModels.TipNotifikacije.Novi_Servis; } else if (IsTerminRezervacija) { notifikacija.Tip = Data.EntityModels.TipNotifikacije.Novi_Termin; } else { notifikacija.Tip = Data.EntityModels.TipNotifikacije.Nova_Narudzba; } _context.Notifikacija.Add(notifikacija); } } return(new JsonResult(new { clientSecret = paymentIntent.ClientSecret })); } return(new JsonResult(new { error = paymentIntent.Status })); }