// GET: BackOffice/Specimens/Create
        public async Task<ActionResult> Create(int imageId = 0, int formatId = 0, int processId = 0)
        {
            var s = new Specimen();

            if (imageId > 0)
            {
                var image = await db.Set<Image>().FirstOrDefaultAsync(i => i.Id == imageId);

                if (image != null)
                {
                    s.ImageId = image.Id;

                    var doc = image.Document;
                    var collection = doc.Collection;

                    s.ReferenceCode = CodeGenerator.SuggestSpecimenCode(imageId);
                }
                else
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest, SpecimenStrings.Error_UnknownImage);
                }
            }

            if (formatId != 0)
            {
                s.FormatId = formatId;
            }

            if (processId != 0)
            {
                s.ProcessId = processId;
            }

            s.Translations.Add(new SpecimenTranslation
                {
                    LanguageCode = LanguageDefinitions.DefaultLanguage
                });

            return View(GenerateViewModel(s));
        }
 private bool DoesCodeAlreadyExist(Specimen s)
 {
     return db.Entities
         .Any(d => d.ReferenceCode == s.ReferenceCode && d.Id != s.Id);
 }
        public async Task<ActionResult> Edit(Specimen specimen)
        {
            if (DoesCodeAlreadyExist(specimen))
            {
                ModelState.AddModelError("ReferenceCode", SpecimenStrings.CodeAlreadyExists);
            }

            if (ModelState.IsValid)
            {
                db.Update(specimen);

                foreach (var t in specimen.Translations)
                {
                    db.UpdateTranslation(t);
                }

                await db.SaveChangesAsync();
                return RedirectToAction("Index");
            }

            return View(GenerateViewModel(specimen));
        }
        private SpecimenEditViewModel GenerateViewModel(Specimen specimen)
        {
            var model = new SpecimenEditViewModel();

            model.AvailableImages.Add(new SelectListItem
                {
                    Value = "",
                    Text = LayoutStrings.ChooseOne,
                    Selected = true
                });

            model.AvailableImages.AddRange(
                db.Set<Image>()
                   .OrderBy(i => i.Id)
                   .Select(i => new SelectListItem
                   {
                       Value = i.Id.ToString(),
                       Text = i.ImageCode,
                       Selected = specimen.ImageId == i.Id
                   }));

            model.AvailableProcesses.Add(new SelectListItem
            {
                Value = "",
                Text = LayoutStrings.ChooseOne,
                Selected = true
            });

            model.AvailableProcesses.AddRange(
                db.Set<Process>()
                .Select(p => new TranslatedViewModel<Process, ProcessTranslation>
                {
                    Entity = p
                })
                .ToList()
                .Select(vm => new SelectListItem
                {
                    Value = vm.Entity.Id.ToString(),
                    Text = vm.Translation.Value,
                    Selected = specimen.ProcessId == vm.Entity.Id
                }));


            //model.AvailableProcesses.AddRange(
            //    db.Set<ProcessTranslation>()
            //       .Where(pt => pt.LanguageCode == LanguageDefinitions.DefaultLanguage)
            //       .OrderBy(pt => pt.ProcessId)
            //       .Select(pt => new SelectListItem
            //    {
            //        Value = pt.ProcessId.ToString(),
            //        Text = pt.Value,
            //        Selected = specimen.ProcessId == pt.ProcessId
            //    }));

            model.AvailableFormats.Add(new SelectListItem
            {
                Value = "",
                Text = LayoutStrings.ChooseOne,
                Selected = true
            });

            model.AvailableFormats.AddRange(db.Set<Format>()
                .OrderBy(f => f.Id)
                .Select(f => new SelectListItem
                {
                    Value = f.Id.ToString(),
                    Text = f.FormatDescription,
                    Selected = specimen.FormatId == f.Id
                }));

            model.Specimen = specimen;

            return model;
        }
        public async Task<ActionResult> Create(Specimen specimen)
        {
            if (DoesCodeAlreadyExist(specimen))
            {
                ModelState.AddModelError("ReferenceCode", SpecimenStrings.CodeAlreadyExists);
            }

            if (ModelState.IsValid)
            {
                db.Add(specimen);

                await db.SaveChangesAsync();
                return RedirectToAction("Index");
            }

            return View(GenerateViewModel(specimen));
        }