public ActionResult Edit(int? id, int? patientId, int? y, int? m, int? d)
        {
            ReceiptViewModel viewModel;

            if (id != null)
                viewModel = GetViewModel(
                    (from r in this.db.Receipts where r.Id == id select r).First(),
                    this.GetToLocalDateTimeConverter());
            else
                viewModel = new ReceiptViewModel()
                {
                    Id = null,
                    PatientId = patientId,
                    IssuanceDate = DateTimeHelper.CreateDate(y, m, d) ?? this.GetPracticeLocalNow(),
                };

            return this.View("Edit", viewModel);
        }
        public ActionResult Edit(ReceiptViewModel[] receipts)
        {
            var formModel = receipts.Single();

            Receipt receipt;

            if (formModel.PrescriptionMedicines == null)
                this.ModelState.AddModelError("Medicines", "A receita deve ter pelo menos um medicamento");

            // we cannot trust that the autocomplete has removed incorrect
            // value from the client.
            for (var i = 0; i < formModel.PrescriptionMedicines.Count; i++)
            {
                var medication = formModel.PrescriptionMedicines[i];
                if (medication.MedicineId != null)
                    continue;
                // it's necessary to remove this value from the ModelState to
                // prevent it from "reappearing"
                // http://stackoverflow.com/questions/9163445/my-html-editors-are-ignoring-any-value-i-set-and-are-always-taking-their-values
                this.ModelState.Remove(string.Format("ReceiptMedicines[{0}].MedicineId", i));
                medication.MedicineText = string.Empty;
            }

            if (formModel.Id == null)
            {
                Debug.Assert(formModel.PatientId != null, "formModel.PatientId != null");
                receipt = new Receipt()
                {
                    CreatedOn = this.GetUtcNow(),
                    PatientId = formModel.PatientId.Value,
                    PracticeId = this.DbUser.PracticeId,
                };
                this.db.Receipts.AddObject(receipt);
            }
            else
                receipt = this.db.Receipts.FirstOrDefault(r => r.Id == formModel.Id);

            if (formModel.PrescriptionMedicines.Count == 0)
            {
                this.ModelState.AddModelError(
                    () => formModel.PrescriptionMedicines,
                    "Não é possível criar uma receita sem medicamentos.");
            }

            if (this.ModelState.IsValid)
            {
                // Updating receipt medicines. This is only possible when view-model is valid,
                // otherwise this is going to throw exceptions.
                Debug.Assert(receipt != null, "receipt != null");
                receipt.ReceiptMedicines.Update(
                        formModel.PrescriptionMedicines,
                        (vm, m) => vm.Id == m.Id,
                        (vm, m) =>
                        {
                            m.PracticeId = this.DbPractice.Id;
                            m.MedicineId = vm.MedicineId.Value;
                            m.Quantity = vm.Quantity;
                            m.Observations = vm.Observations;
                            m.Prescription = vm.Prescription;
                        },
                        m => this.db.ReceiptMedicines.DeleteObject(m)
                    );

                receipt.Patient.IsBackedUp = false;
                receipt.IssuanceDate = this.ConvertToUtcDateTime(formModel.IssuanceDate.Value);
                this.db.SaveChanges();

                return this.View("Details", GetViewModel(receipt, this.GetToLocalDateTimeConverter()));
            }

            return this.View("Edit", formModel);
        }
 public ActionResult Create(ReceiptViewModel[] receipts)
 {
     return this.Edit(receipts);
 }