Пример #1
0
        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));
        }
Пример #2
0
        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 }));
        }