Beispiel #1
0
        /// <summary>
        /// Este metodo recupera los cobros y los pagos de la base de datos y los
        /// convierte en transacciones dobles para determinar los saldos
        /// </summary>
        /// <param name="customer"></param>
        /// <returns></returns>
        public static List <CustomerTransaction> ReadCustomerTransaction(Customer customer)
        {
            int      id;
            DateTime fecha;
            string   description;
            decimal  deuda = 0m;
            decimal  abono = 0m;

            List <CustomerTransaction> transactions = new List <CustomerTransaction>();
            string query1 = "SELECT debt_id, date_of_debt, description, amount FROM debt WHERE customer_id = " + customer.CustomerID;
            string query2 = "SELECT payment_id, date_of_payment, observation, amount FROM payment WHERE customer_id = " + customer.CustomerID;

            if (HacerConsulta(query1))
            {
                while (reader.Read())
                {
                    id          = reader.GetInt32("debt_id");
                    fecha       = reader.GetDateTime("date_of_debt");
                    description = reader.GetString("description");
                    deuda       = reader.GetDecimal("amount");
                    CustomerTransaction cT = new CustomerTransaction(id, fecha, description, deuda, abono);
                    transactions.Add(cT);
                }

                deuda = 0m;

                if (HacerConsulta(query2))
                {
                    while (reader.Read())
                    {
                        id          = reader.GetInt32("payment_id");
                        fecha       = reader.GetDateTime("date_of_payment");
                        description = reader.GetString("observation");
                        abono       = reader.GetDecimal("amount");
                        CustomerTransaction cT = new CustomerTransaction(id, fecha, description, deuda, abono);
                        transactions.Add(cT);
                    }

                    transactions.Sort((x, y) => x.Fecha.CompareTo(y.Fecha));
                    decimal saldo = 0m;
                    foreach (CustomerTransaction t in transactions)
                    {
                        saldo  += t.Deuda - t.Abono;
                        t.Saldo = saldo;
                    }
                }
                else
                {
                    transactions.Clear();
                }
            }

            return(transactions);
        }
        }//Fin del metodo

        /// <summary>
        /// Este metodo se encarga de normalizar los movimientos con el onjetivo que el sistema de puntuacion pueda
        /// establecerse correctamente, es decir, unificando los abonos y deudas ocurridos en un mismo día
        /// </summary>
        /// <param name="orignalTransactions"></param>
        /// <returns></returns>
        private static List <CustomerTransaction> NormalizeTransactions(List <CustomerTransaction> orignalTransactions)
        {
            List <CustomerTransaction> result = new List <CustomerTransaction>();
            decimal  debt        = 0m;
            decimal  payment     = 0m;
            decimal  balance     = 0m;
            DateTime currentDate = DateTime.Now;

            if (orignalTransactions.Count > 0)
            {
                currentDate = orignalTransactions[0].Fecha;

                foreach (CustomerTransaction t in orignalTransactions)
                {
                    if (t.Fecha == currentDate)
                    {
                        debt    += t.Deuda;
                        payment += t.Abono;
                    }
                    else
                    {
                        balance += debt - payment;
                        CustomerTransaction newT = new CustomerTransaction(0, currentDate, null, debt, payment)
                        {
                            Saldo = balance
                        };

                        result.Add(newT);

                        currentDate = t.Fecha;
                        debt        = t.Deuda;
                        payment     = t.Abono;
                    }
                }

                balance += debt - payment;
                CustomerTransaction transaction = new CustomerTransaction(0, currentDate, null, debt, payment)
                {
                    Saldo = balance
                };

                result.Add(transaction);
            }

            return(result);
        }