public CashRegisterWindow(Model.User userLoggedIn, Model.Statement statement, Model.Patient patient)
		{
			this.InitializeComponent();

            FillPatients();

            _userLoggedIn = userLoggedIn;
            _statement = statement;
            _selectedPatient = patient;
            _isStatement = _statement != null;

            if (_statement != null)
            {
                this.Title = "Abonar/Liquidar estado de cuenta";
                lblAccountStatusNumber.ToolTip = lblAccountStatusNumber.Content = _statement.StatementId.ToString();
                gbAccountStatusNumber.Visibility = System.Windows.Visibility.Visible;
                btnClearForm.Visibility = System.Windows.Visibility.Hidden;
                cbPatients.IsEnabled = false;
                FillTreatments();
                FillPayments();

                SelectPatient();
            }
            else
            {
                gbAccountStatusNumber.Header = "Estado de cuenta activo";
            }

            UpdateTotals();
        }
        public StatementExpirationDateModal(Model.Statement statement, Model.Patient patient, Model.User user)
		{
			this.InitializeComponent();

            _statement = statement;
            _patient = patient;
            _user = user;
		}
        public ChangeStatementExpirationDateModal(Model.Statement statement)
        {
            this.InitializeComponent();

            _statement = statement;

            dtpCreationDate.SelectedDate = _statement.CreationDate;
            dtpExpirationDate.SelectedDate = _statement.ExpirationDate;
        }
        public ViewStatementWindow(Model.Statement statement, Model.User userLoggedIn)
        {
            this.InitializeComponent();

            _statement = statement;
            _userLoggedIn = userLoggedIn;

            lblPatientName.ToolTip = lblPatientName.Content = string.Format("(Exp. No. {0}) {1} {2}", _statement.Patient.AssignedId, _statement.Patient.FirstName, _statement.Patient.LastName);
            lblAccountStatusNumber.ToolTip = lblAccountStatusNumber.Content = _statement.StatementId.ToString();

            UpdateStatementInfo();
            LoadPatientPicture();
        }
 /// <summary>
 /// Handles verbs with special requirements
 /// </summary>
 public void HandleSpecialVerbs()
 {
     if (this.Verb.Equals("passed"))
     {
         result = (result == null) ? new Result() : result;
         VerifySuccessAndCompletionValues(result, "passed", true, true);
         result.Success = true;
         result.Completion = true;
     }
     else if (this.Verb.Equals("failed"))
     {
         result = (result == null) ? new Result() : result;
         VerifySuccessAndCompletionValues(result, "failed", false, true);
         result.Success = false;
         result.Completion = true;
     }
     else if (this.Verb.Equals("completed"))
     {
         result = (result == null) ? new Result() : result;
         VerifyCompletionValue(result, "completed", true);
         result.Completion = true;
     }
 }
        private void FinishTransaction()
        {
            try
            {
                if (_selectedPatient == null)
                {
                    MessageBox.Show("Seleccione un paciente para poder guardar", "Información", MessageBoxButton.OK, MessageBoxImage.Information);
                    return;
                }

                List<PaymentControl> paymentsToSave = GetPaymentsToSave();
                List<TreatmentPriceControl> treatmentsToSave = GetTreatmentsToSave();

                if (_statement == null)
                {
                    if (treatmentsToSave.Count == 0)
                    {
                        MessageBox.Show("Agregue al menos un tratamiento para poder guardar", "Información", MessageBoxButton.OK, MessageBoxImage.Information);
                    }
                    else if (_grandTotal == 0m)
                    {
                        if (_positiveBalance > 0m
                            && MessageBox.Show("Existe un saldo a favor\n¿Desea que se guarde para el paciente seleccionado?",
                                            "Advertencia",
                                            MessageBoxButton.YesNo,
                                            MessageBoxImage.Warning
                                        ) == MessageBoxResult.No)
                        {
                            return;
                        }

                        CreatePaymentFolio();
                        SavePayments(paymentsToSave);
                        SaveTreatments(treatmentsToSave);
                        SavePositiveBalance();
                        PrepareWindowToPrintFolio();

                        MessageBox.Show("Datos guardados\n\nNúmero de folio generado: " + _paymentFolioGenerated.FolioNumber, "Información", MessageBoxButton.OK, MessageBoxImage.Information);
                        SendMail();
                    }
                    else
                    {
                        Model.Statement currentStatement = _selectedPatient.Statements
                                                            .Where(s => s.IsPaid == false)
                                                            .FirstOrDefault();

                        if (currentStatement == null)
                        {
                            currentStatement = new Model.Statement();

                            if (MessageBox.Show("No se ha saldado por completo el monto de los tratamientos\n¿Desea abrir un estado de cuenta para este paciente?",
                                                    "Advertencia",
                                                    MessageBoxButton.YesNo,
                                                    MessageBoxImage.Warning
                                                ) == MessageBoxResult.Yes)
                            {
                                new StatementExpirationDateModal(currentStatement, _selectedPatient, _userLoggedIn).ShowDialog();

                                if (currentStatement.PatientId != 0)
                                {
                                    CreatePaymentFolio();
                                    CreateStatement(currentStatement);
                                    _statement = currentStatement;
                                    SavePayments(paymentsToSave);
                                    SaveTreatments(treatmentsToSave);
                                    PrepareWindowToPrintFolio();
                                    ShowStatementNumberGenerated();

                                    MessageBox.Show("Datos guardados\n\nNúmero de folio generado: " + _paymentFolioGenerated.FolioNumber
                                                    + "\nNúmero del estado de cuenta generado: " + _statement.StatementId
                                                    , "Información", MessageBoxButton.OK, MessageBoxImage.Information);
                                    SendMail();
                                }
                            }
                        }
                        else if (currentStatement.ExpirationDate < DateTime.Now.Date)
                        {
                            MessageBox.Show("Este paciente posee un estado de cuenta que ha expirado (Estado de cuenta número: " + currentStatement.StatementId + ")" +
                                            "\nEl monto faltante no puede ser agregado al estado de cuenta, por tal motivo tiene que liquidar los tratamientos seleccionados en este momento.",
                                            "Información", MessageBoxButton.OK, MessageBoxImage.Information);
                        }
                        else
                        {
                            if (MessageBox.Show("Este paciente posee un estado de cuenta con número: " + currentStatement.StatementId +
                                                "\n¿Desea guardar el monto faltante en el estado de cuenta del paciente?",
                                                    "Advertencia",
                                                    MessageBoxButton.YesNo,
                                                    MessageBoxImage.Warning
                                                ) == MessageBoxResult.Yes)
                            {
                                CreatePaymentFolio();
                                _statement = currentStatement;
                                SavePayments(paymentsToSave);
                                SaveTreatments(treatmentsToSave);
                                PrepareWindowToPrintFolio();                                                               

                                ShowStatementNumberGenerated();

                                MessageBox.Show("Datos guardados\n\nNúmero de folio generado: " + _paymentFolioGenerated.FolioNumber
                                                    + "\nNúmero del estado de cuenta modificado: " + _statement.StatementId
                                                    , "Información", MessageBoxButton.OK, MessageBoxImage.Information);
                                SendMail();
                            }
                        }
                    }
                }
                else
                {
                    if (paymentsToSave.Count == 0 && treatmentsToSave.Count == 0)
                    {
                        MessageBox.Show("Agregue al menos un pago o un tratamiento para poder guardar", "Información", MessageBoxButton.OK, MessageBoxImage.Information);
                    }
                    else if (_grandTotal == 0m)
                    {
                        if (_positiveBalance > 0m
                            && MessageBox.Show("Existe un saldo a favor\n¿Desea que se guarde para el paciente seleccionado?",
                                            "Advertencia",
                                            MessageBoxButton.YesNo,
                                            MessageBoxImage.Warning
                                        ) == MessageBoxResult.No)
                        {
                            return;
                        }

                        CreatePaymentFolio();
                        _statement.IsPaid = true;
                        UpdateStatement(_statement);
                        SavePayments(paymentsToSave);
                        SaveTreatments(treatmentsToSave);                        
                        SavePositiveBalance();
                        PrepareWindowToPrintFolio();

                        MessageBox.Show("Datos guardados\n\nEl estado de cuenta fue marcado como liquidado.\nNúmero de folio generado: " + _paymentFolioGenerated.FolioNumber, "Información", MessageBoxButton.OK, MessageBoxImage.Information);
                        SendMail();
                    }
                    else
                    {
                        if (MessageBox.Show("¿Está seguro(a) que desea guardar los cambios realizados en el estado de cuenta del paciente?",
                                            "Advertencia",
                                            MessageBoxButton.YesNo,
                                            MessageBoxImage.Warning
                                        ) == MessageBoxResult.Yes)
                        {
                            CreatePaymentFolio();
                            SavePayments(paymentsToSave);
                            SaveTreatments(treatmentsToSave);
                            PrepareWindowToPrintFolio();

                            MessageBox.Show("Datos guardados\n\nNúmero de folio generado: " + _paymentFolioGenerated.FolioNumber, "Información", MessageBoxButton.OK, MessageBoxImage.Information);
                            SendMail();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al tratar de guardar la información de la caja.\nDetalle del error:\n" + ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        private void ClearForm()
        {
            _statement = null;
            _paymentFolioGenerated = null;

            btnSave.IsEnabled = true;
            cbPatients.IsEnabled = true;
            btnAddTreatment.IsEnabled = true;
            btnAddCashPayment.IsEnabled = true;
            btnAddCreditCardPayment.IsEnabled = true;
            btnAddCheckPayment.IsEnabled = true;
            btnPrintMail.IsEnabled = false;
            lblPaymentFolioNumber.ToolTip = lblPaymentFolioNumber.Text = string.Empty;

            spTreatments.Children.Clear();
            spPayments.Children.Clear();

            lblGeneratedStatementNumberCaption.Visibility = System.Windows.Visibility.Hidden;
            lblGeneratedStatementNumber.ToolTip = lblGeneratedStatementNumber.Text = string.Empty;

            cbPatients.SelectedIndex = -1;

            UpdateTotals();
        }