Exemplo n.º 1
0
        public ComputeChangeResponse ComputeChange(ComputeChangeRequest request)
        {
            ComputeChangeResponse response = new ComputeChangeResponse();

            Logger.Log(request);

            try {
                // Verifica se os dados recebidos são válidos.
                if (request.IsValid == false)
                {
                    response.OperationReport = request.ValidationReport;
                    return(response);
                }

                uint change                      = CalculateTotalChangeAmount(request.ReceivedAmount, request.ProductAmount);
                uint totalChangeAmount           = change;
                List <ChangeData> changeDataList = new List <ChangeData>();

                while (change > 0)
                {
                    AbstractProcessor processor = ProcessorFactory.Create(change);

                    if (processor == null)
                    {
                        Report report = new Report();
                        report.Message = "Ocorreu um erro: Não há troco disponível";
                        response.OperationReport.Add(report);
                        return(response);
                    }

                    Dictionary <uint, uint> changeDictionary = processor.Calculate(change);

                    ChangeData changeData = new ChangeData()
                    {
                        Name             = processor.GetName(),
                        ChangeDictionary = changeDictionary
                    };

                    changeDataList.Add(changeData);
                    long totalCurrentAmount = changeDictionary.Sum(p => (p.Value * p.Key));

                    change -= (uint)totalCurrentAmount;
                }
                response.ChangeDataList    = changeDataList;
                response.TotalChangeAmount = totalChangeAmount;
                response.Success           = true;
            }
            catch (Exception e) {
                Logger.Log(e);
                Report report = new Report();
                report.Message = "Ocorreu um erro: não foi possível processar sua operação.";
                response.OperationReport.Add(report);
            }

            Logger.Log(response);
            return(response);
        }
Exemplo n.º 2
0
        private void UxBtnCalculate_Click(object sender, EventArgs e)
        {
            this.UxTxtChange.Text             = "";
            this.UxTxtChangeDetailAmount.Text = "";
            uint receivedAmount = uint.Parse(this.UxTxtReceivedAmount.Text);
            uint productAmount  = uint.Parse(this.UxTxtProductAmount.Text);

            TrocofyManager       manager = new TrocofyManager();
            ComputeChangeRequest request = new ComputeChangeRequest();

            request.ReceivedAmount = receivedAmount;
            request.ProductAmount  = productAmount;
            ComputeChangeResponse response = manager.ComputeChange(request);

            if (response.Success == false)
            {
                string validationMessage = "";
                foreach (Report error in response.OperationReport)
                {
                    validationMessage += "Campo: " + error.Field + Environment.NewLine +
                                         "Mensagem: " + error.Message + "\n\n\r";
                }
                MessageBox.Show(validationMessage, "Trocofy - Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                this.UxTxtChange.Text = response.TotalChangeAmount.ToString();

                foreach (ChangeData changeData in response.ChangeDataList)
                {
                    this.UxTxtChangeDetailAmount.Text += changeData.Name + Environment.NewLine;
                    foreach (KeyValuePair <uint, uint> kvPair in changeData.ChangeDictionary)
                    {
                        this.UxTxtChangeDetailAmount.Text += kvPair.Key.ToString() + ": " + kvPair.Value.ToString() + Environment.NewLine;
                    }
                    this.UxTxtChangeDetailAmount.Text += Environment.NewLine;
                }
            }
        }