コード例 #1
0
        public static List <Entities.Transaction> GetAll(Entities.Portfolio p)
        {
            List <Entities.Transaction> result = new List <Entities.Transaction>();
            string sql = "SELECT * FROM Transactions WHERE PortfolioID=@PortfolioID";

            SqlCommand cmdGetAllTransactions = new SqlCommand(sql, Globals.Db.conn);

            cmdGetAllTransactions.Parameters.Add("@PortfolioId", SqlDbType.Int).Value = p.PortfolioID;

            using (SqlDataReader reader = cmdGetAllTransactions.ExecuteReader())
            {
                while (reader.Read())
                {
                    int                  id               = (int)reader["Id"];
                    int                  portfolioID      = (int)reader["portfolioId"];
                    string               type             = (string)reader["Type"];
                    string               symbol           = (string)reader["Symbol"];
                    decimal              price            = (decimal)reader["BuySellPrice"];
                    int                  sharesBoughtSold = (int)reader["SharesBoughtSold"];
                    DateTime             date             = (DateTime)reader["date"];
                    Entities.Transaction t = new Entities.Transaction(id, portfolioID, type, symbol, price, sharesBoughtSold, date);
                    result.Add(t);
                }
            }
            return(result);
        }
コード例 #2
0
        public void CreateMany(IEnumerable <Transaction> transactions)
        {
            var entitiesByTransaction = new Dictionary <Transaction, Entities.Transaction>();

            foreach (Transaction transaction in transactions)
            {
                var transactionEntity = new Entities.Transaction
                {
                    CreditAccountId = transaction.CreditAccount.AccountId,
                    DebitAccountId  = transaction.DebitAccount.AccountId,
                    Amount          = transaction.Amount,
                    At = transaction.At
                };

                m_dbContext.Transactions.Add(transactionEntity);
                entitiesByTransaction.Add(transaction, transactionEntity);
            }

            m_dbContext.SaveChanges();

            foreach (KeyValuePair <Transaction, Entities.Transaction> entityByTransaction in entitiesByTransaction)
            {
                entityByTransaction.Key.TransactionId = entityByTransaction.Value.TransactionId;
            }
        }
コード例 #3
0
        private async void OnOk()
        {
            await ValidateAsync();

            if (HasErrors)
            {
                return;
            }

            Entities.Transaction selectedTransaction = SelectedTransaction;
            SelectedTransaction.Payment += UpdatePayment.GetValueOrDefault();
            _context.SaveChanges();
            UpdatePayment = null;
            LoadData();
            if (_isByCustomer)
            {
                Transactions        = _originalTransactions.Where(c => c.Customer.Id == SelectedCustomer.Id).ToList();
                SelectedTransaction = selectedTransaction;
            }
            else
            {
                Transactions        = _originalTransactions;
                SelectedTransaction = selectedTransaction;
            }
            UpdateCommand.RaiseCanExecuteChanged();
            CalculateTransaction();
            DialogHost.CloseDialogCommand.Execute(this, null);
        }
コード例 #4
0
 public void UpdateTransaction(Guid transactionId, int succeeded, string message)
 {
     Entities.Transaction transaction = _context.Transactions.FirstOrDefault(t => t.TransactionId == transactionId);
     transaction.Status        = (Entities.Status)succeeded;
     transaction.FailureReason = message;
     _context.SaveChanges();
 }
コード例 #5
0
        private static Entities.Transaction TransactionFromElement(
            XElement element,
            Dictionary <string, Entities.Account> accountsByShortName,
            Dictionary <int, Entities.Transaction> transactionsByIncomingId
            )
        {
            string incomingIdText = GetRequiredAttribute(element, "id").Value;
            int    incomingId     = Int32.Parse(incomingIdText);

            string at = GetRequiredAttribute(element, "at").Value;
            string creditAccountName = GetRequiredAttribute(element, "credit").Value;
            string amount            = GetRequiredAttribute(element, "amount").Value;
            string debitAccountName  = GetRequiredAttribute(element, "debit").Value;

            var transaction = new Entities.Transaction
            {
                At            = DateTime.Parse(at),
                CreditAccount = accountsByShortName[creditAccountName],
                Amount        = Decimal.Parse(amount),
                DebitAccount  = accountsByShortName[debitAccountName]
            };

            transactionsByIncomingId.Add(incomingId, transaction);

            return(transaction);
        }
コード例 #6
0
        public void Create(Entities.Transaction model)
        {
            var transactionId = "MX-" + model.Id;

            if (GetCurrentTransactions().Any(t => t.Id == transactionId))
            {
                throw new ArgumentException("Transaktionsnumret finns redan.");
            }
            var materialType = getMaterialType(model.MaterialTypeId);

            var transaction = new Entities.Transaction
            {
                Id                  = transactionId,
                Name                = model.Name,
                Description         = model.Description,
                MaterialTypeId      = materialType.Id,
                MaterialType        = materialType,
                MaterialTypeComment = model.MaterialTypeComment,
                ShippingDate        = model.ShippingDate,
                ExpectedWeight      = model.ExpectedWeight,
                ShippingMethod      = model.ShippingMethod,
                Supplier            = model.Supplier
            };

            repository.Transactions.Add(transaction);
            repository.SaveChanges();
        }
コード例 #7
0
        public Entities.Transaction Handle(InsertTransactionCommand command)
        {
            if (command is null)
            {
                throw new ArgumentNullException(nameof(command));
            }

            command.Validate();

            var account = _accountRepository.GetAccount(command.AccountId);

            UpdateValues(command.TransactionType, command.Value, account);

            var transaction = new Entities.Transaction
            {
                TransactionType = command.TransactionType,
                Value           = command.Value,
                Date            = command.Date,
                AccountId       = command.AccountId
            };

            _transactionRepository.InsertTransaction(transaction);
            _accountRepository.UpdateAccount(account);

            return(transaction);
        }
コード例 #8
0
 private static Transaction FromEntity(Entities.Transaction transactionEntity)
 {
     return(new Transaction
     {
         TransactionId = transactionEntity.TransactionId,
         CreditAccount = FromEntity(transactionEntity.CreditAccount),
         DebitAccount = FromEntity(transactionEntity.DebitAccount),
         Amount = transactionEntity.Amount,
         At = transactionEntity.At
     });
 }
コード例 #9
0
        public async Task <Guid> AddTransaction(TransactionModel transactionModel)
        {
            Entities.Transaction transaction = _mapper.Map <Entities.Transaction>(transactionModel);
            transaction.Date          = DateTime.Now;
            transaction.Status        = 0;
            transaction.TransactionId = Guid.NewGuid();
            _context.Transactions.Add(transaction);
            await _context.SaveChangesAsync();

            return(transaction.TransactionId);
        }
コード例 #10
0
        /// <summary>
        /// Creates a new <see cref="Transaction"/> of the given kind.
        /// </summary>
        /// <param name="orderId">The order id to which the fulfillments belong.</param>
        /// <param name="transaction">The transaction.</param>
        /// <param name="cancellationToken">Cancellation Token</param>
        /// <returns>The new <see cref="Transaction"/>.</returns>
        public virtual async Task <Entities.Transaction> CreateAsync(long orderId, Entities.Transaction transaction, CancellationToken cancellationToken = default)
        {
            var req     = PrepareRequest($"orders/{orderId}/transactions.json");
            var content = new JsonContent(new
            {
                transaction = transaction
            });
            var response = await ExecuteRequestAsync <Entities.Transaction>(req, HttpMethod.Post, cancellationToken, content, "transaction");

            return(response.Result);
        }
コード例 #11
0
        public void Update(Transaction transaction)
        {
            Entities.Transaction transactionEntity = m_dbContext.Transactions
                                                     .Single(t => t.TransactionId == transaction.TransactionId);

            transactionEntity.CreditAccountId = transaction.CreditAccount.AccountId;
            transactionEntity.DebitAccountId  = transaction.DebitAccount.AccountId;
            transactionEntity.Amount          = transaction.Amount;
            transactionEntity.At = transaction.At;

            m_dbContext.SaveChanges();
        }
コード例 #12
0
        public void TestTransactionDelete()
        {
            ILoggerFactory loggerFactory = new LoggerFactory();

            using (var sqliteMemoryWrapper = new SqliteMemoryWrapper())
            {
                var currencyFactory   = new CurrencyFactory();
                var usdCurrencyEntity = currencyFactory.Create(CurrencyPrefab.Usd, true);
                currencyFactory.Add(sqliteMemoryWrapper.DbContext, usdCurrencyEntity);

                var accountFactory = new AccountFactory();
                Entities.Account incomeAccountEntity =
                    accountFactory.Create(AccountPrefab.Income, usdCurrencyEntity);
                Entities.Account checkingAccountEntity =
                    accountFactory.Create(AccountPrefab.Checking, usdCurrencyEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, incomeAccountEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, checkingAccountEntity);

                var transactionEntities = new Entities.Transaction[]
                {
                    new Entities.Transaction
                    {
                        CreditAccount = incomeAccountEntity,
                        DebitAccount  = checkingAccountEntity,
                        Amount        = 100m,
                        At            = new DateTime(2018, 1, 1, 8, 30, 0)
                    },
                    new Entities.Transaction
                    {
                        CreditAccount = incomeAccountEntity,
                        DebitAccount  = checkingAccountEntity,
                        Amount        = 60m,
                        At            = new DateTime(2018, 1, 1, 8, 31, 0)
                    }
                };

                sqliteMemoryWrapper.DbContext.Transactions.AddRange(transactionEntities);
                sqliteMemoryWrapper.DbContext.SaveChanges();

                var transactionService = new TransactionService(loggerFactory, sqliteMemoryWrapper.DbContext);

                transactionService.Delete(transactionEntities[0].TransactionId);

                List <Transaction> transactions = transactionService.GetAll().ToList();

                Assert.AreEqual(1, transactions.Count);
                Assert.AreEqual(transactionEntities[1].TransactionId, transactions[0].TransactionId);
                Assert.AreEqual(transactionEntities[1].Amount, transactions[0].Amount);
                Assert.AreEqual(transactionEntities[1].At, transactions[0].At);
                Assert.AreEqual(transactionEntities[1].CreditAccountId, transactions[0].CreditAccount.AccountId);
                Assert.AreEqual(transactionEntities[1].DebitAccountId, transactions[0].DebitAccount.AccountId);
            }
        }
        public async Task Handle(PaymentCompletedIntegrationEvent @event)
        {
            var account = await dbContext.Accounts.Include(x => x.Transactions).FirstOrDefaultAsync(x => x.Id == @event.AccountId);

            var trans = new Entities.Transaction {
                Amount = @event.Amount, DateTime = @event.PaymentTime
            };

            account.Transactions.Add(trans);

            await dbContext.SaveChangesAsync();
        }
コード例 #14
0
        private static XElement ElementFromTransaction(Entities.Transaction transaction)
        {
            var element = new XElement(XName.Get("Transaction"),
                                       new XAttribute(XName.Get("id"), transaction.TransactionId),
                                       new XAttribute(XName.Get("at"), transaction.At),
                                       new XAttribute(XName.Get("credit"), transaction.CreditAccount.Name),
                                       new XAttribute(XName.Get("amount"), transaction.Amount),
                                       new XAttribute(XName.Get("debit"), transaction.DebitAccount.Name)
                                       );

            return(element);
        }
コード例 #15
0
        public void Create(Transaction transaction)
        {
            var transactionEntity = new Entities.Transaction
            {
                CreditAccountId = transaction.CreditAccount.AccountId,
                DebitAccountId  = transaction.DebitAccount.AccountId,
                Amount          = transaction.Amount,
                At = transaction.At
            };

            m_dbContext.Transactions.Add(transactionEntity);
            m_dbContext.SaveChanges();

            transaction.TransactionId = transactionEntity.TransactionId;
        }
コード例 #16
0
        public void Delete(int transactionId)
        {
            Entities.Transaction transactionEntity =
                m_dbContext.Transactions.SingleOrDefault(t => t.TransactionId == transactionId);

            if (transactionEntity == null)
            {
                throw new ArgumentException(
                          $"No Transaction exists with TransactionId {transactionId}",
                          nameof(transactionId)
                          );
            }

            m_dbContext.Transactions.Remove(transactionEntity);
            m_dbContext.SaveChanges();
        }
コード例 #17
0
        public Transaction Get(int transactionId)
        {
            Entities.Transaction transactionEntity =
                m_dbContext.Transactions
                .Include(t => t.CreditAccount)
                .Include(t => t.DebitAccount)
                .SingleOrDefault(t => t.TransactionId == transactionId);

            if (transactionEntity == null)
            {
                throw new ArgumentException(
                          $"No Transaction exists with TransactionId {transactionId}",
                          nameof(transactionId));
            }

            return(FromEntity(transactionEntity));
        }
コード例 #18
0
        public bool Add(Entities.Transaction transaction)
        {
            using (var connection = Helpers.NewConnection())
            {
                SqlCommand command = new SqlCommand($"INSERT INTO Transactions (Id, Amount, Date, AccountId) VALUES ('{Guid.NewGuid()}',@amount, '{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}', @accountId)", connection);
                command.Parameters.AddWithValue("@amount", transaction.Amount);
                command.Parameters.AddWithValue("@accountId", transaction.AccountId);
                connection.Open();

                if (command.ExecuteNonQuery() != 1)
                {
                    return(false);
                }

                return(true);
            }
        }
コード例 #19
0
        private void addNewBatch(Entities.Transaction transaction, Entities.MaterialType materialType, Entities.LoadingPosition loadingPosition, string username)
        {
            string transactionId  = transaction.Id;
            int    materialTypeId = materialType.Id;
            var    batch          = new Entities.Batch
            {
                Id              = new Random().Next(1, 100000),
                MaterialTypeId  = materialTypeId,
                MaterialType    = materialType,
                LoadingPosition = loadingPosition,
                StartedAt       = DateTime.Now,
                StartedBy       = username,
                StoppedAt       = null,
                StoppedBy       = null,
                TransactionId   = transactionId,
                Transaction     = transaction
            };

            transaction.Batches.Add(batch);
        }
コード例 #20
0
        public async Task <TransactionDTO> Create([FromBody] TransactionDTO transactionRequestDTO)
        {
            Entities.Transaction newTransaction = new Entities.Transaction {
                WalletName   = transactionRequestDTO.WalletName,
                Amount       = transactionRequestDTO.Amount,
                CategoryName = transactionRequestDTO.CategoryName,
                Date         = transactionRequestDTO.Date,
                Note         = transactionRequestDTO.Note,
                UserId       = currentUserId
            };

            Entities.Transaction res = await transactionService.Create(newTransaction);

            return(new TransactionDTO
            {
                Errors = res.Errors,
                WalletName = res.WalletName,
                Note = res.Note,
                Date = res.Date,
                CategoryName = res.CategoryName,
                Amount = res.Amount
            });
        }
コード例 #21
0
ファイル: CartController.cs プロジェクト: RcBuilder/Scripts
        public async Task <string> ProcessCardcomTransaction()
        {
            #region ### IPN Parameters ###

            /*
             *  GET https://localhost:44373/Purchase/ProcessCardcomTransaction?terminalnumber=1000&lowprofilecode=2467a885-1f97-40d5-8b5f-42222ce64c80&Operation=2&DealRespone=0&DealResponse=0&TokenResponse=0&InvoiceResponseCode=0&OperationResponse=0&OperationResponseText=OK&ReturnValue=39.90%7c3%7c1%7c98F41F8F-6F6C-4A0A-A7D4-D719A41A6BD7
             *
             *  ---
             *
             *  terminalnumber=1000
             *  lowprofilecode=2467a885-1f97-40d5-8b5f-42222ce64c80
             *  Operation=2
             *  DealResponse=0
             *  TokenResponse=0
             *  InvoiceResponseCode=0
             *  OperationResponse=0
             *  OperationResponseText=OK
             *  ReturnValue=39.90|3|1|98F41F8F-6F6C-4A0A-A7D4-D719A41A6BD7
             */
            #endregion

            var step        = 0;
            var transaction = new Entities.Transaction();
            var httpResult  = "";

            var transactionsBLL = new TransactionsBLL();
            var ordersBLL       = new OrdersBLL();

            try
            {
                LoggerSingleton.Instance.Info("Cardcom", "Process-Transaction", new List <string> {
                    $"QueryString: {Request.QueryString}"
                });

                step = 1;

                var cardcomManager = new CardcomManager(ConfigSingleton.Instance.CardcomTerminal, ConfigSingleton.Instance.CardcomUserName);

                step = 2;

                // Collect basic details
                transaction.Raw            = Request.QueryString?.ToString();
                transaction.Code           = Request.QueryString["lowprofilecode"];
                transaction.StatusCode     = Convert.ToInt32(Request.QueryString["OperationResponse"]);
                transaction.StatusCodeCard = Convert.ToInt32(Request.QueryString["DealResponse"]);

                step = 3;

                if (transaction.StatusCode != 0)
                {
                    throw new Exception($"[StatusCode Error] StatusCode {transaction.StatusCode} ({transaction.Code})");
                }

                step = 4;

                // Collect extra details
                var detailsResponse = cardcomManager.GetTransactionDetails(transaction.Code);
                transaction.StatusCodeDetails = Convert.ToInt32(detailsResponse.Details["ResponseCode"]);
                transaction.RawDetails        = detailsResponse.Raw;

                step = 5;

                // add invoice details
                transaction.InvoiceStatusCode = Convert.ToInt32(detailsResponse.Details["InvoiceResponseCode"]);
                transaction.InvoiceNumber     = detailsResponse.Details["InvoiceNumber"] ?? "";
                transaction.InvoiceType       = Convert.ToInt32(detailsResponse.Details["InvoiceType"] ?? "0");

                step = 6;

                if (transaction.StatusCodeDetails != 0)
                {
                    throw new Exception($"[StatusCode Error] StatusCodeDetails {transaction.StatusCodeDetails} ({transaction.Code})");
                }

                step = 7;

                transaction.CardOwnerId = detailsResponse.Details["CardOwnerID"] ?? "";

                // fix format > MM (e.g: 7 to 07)
                var CardValidityMonth = detailsResponse.Details["CardValidityMonth"] ?? "";
                if (CardValidityMonth.Length == 1)
                {
                    CardValidityMonth = $"0{CardValidityMonth}";
                }

                transaction.CardExpiry    = $"{detailsResponse.Details["CardValidityYear"] ?? ""}{CardValidityMonth}";
                transaction.CardSuffix    = detailsResponse.Details["ExtShvaParams.CardNumber5"] ?? "";
                transaction.NumOfPayments = Convert.ToInt32(detailsResponse.Details["NumOfPayments"] ?? "1");

                step = 8;

                // load ReturnValue field > extract order-id
                var returnValue = detailsResponse.Details["ReturnValue"].Trim();
                var orderId     = Convert.ToInt32(returnValue);

                step = 9;

                // load related order
                var order = await ordersBLL.Get(orderId);

                step = 10;

                // Collect custom details
                transaction.Price   = order.Total;
                transaction.OrderId = order.Details.Id;

                step = 11;

                // update Order Status
                order.Details.Status = Entities.eOrderStatus.APPROVED;
                order.Details.IsPaid = true;
                var orderUpdated = await ordersBLL.SaveDetails(order.Details) > 0;

                if (!orderUpdated)
                {
                    LoggerSingleton.Instance.Info("Cardcom", "Save Order Details Failed", new List <string> {
                        $"#{orderId}", "Status: APPROVED", $"Code: {transaction.Code}"
                    });
                }

                step = 12;

                // send sms
                if (orderUpdated)
                {
                    SMSManager.OrderStatusChanged(order);
                }

                step = 13;

                httpResult = "OK";
            }
            catch (Exception ex)
            {
                ex.Data.Add("step", step);
                ex.Data.Add("Method", "ProcessCardcomTransaction");
                LoggerSingleton.Instance.Error("Cardcom", ex);
                httpResult = ex.Message;
            }

            try {
                // add a transaction
                var transactionId = await transactionsBLL.Create(transaction);

                if (transactionId <= 0)
                {
                    throw new Exception($"Error while trying to save an incoming transaction ({transaction.Code})");
                }
            }
            catch (Exception ex)
            {
                ex.Data.Add("Action", "CreateTransaction");
                ex.Data.Add("Method", "ProcessCardcomTransaction");
                LoggerSingleton.Instance.Error("Cardcom", ex);
                httpResult = ex.Message;
            }

            Response.StatusCode = httpResult == "OK" ? (int)HttpStatusCode.OK : (int)HttpStatusCode.InternalServerError;
            return(httpResult);
        }
コード例 #22
0
        public async Task <ActionResult> AskTransaction(int id)
        {
            // Find the requested service
            Service service = await db.Services.Include(s => s.Supplier).Where(x => x.Id == id).FirstOrDefaultAsync();

            // If this action is not already requested and not responded

            if (!db.Transactions.Where(x => x.Service.Id == id && x.Sender_Id == user.Id && x.Status == 0).Any())
            {
                if (service != null)
                {
                    // To be able to request a transaction the user must have enough credits to cover
                    // the cost of all pending requests plus this one.
                    decimal?pendingRequestsValue = db.Transactions.Where(t => t.Sender_Id == user.Id && (t.Status == Transaction.TransactionStatus.Accepted || t.Status == Transaction.TransactionStatus.New)).Sum(t => (decimal?)t.CreditValue);

                    if (pendingRequestsValue == null)
                    {
                        pendingRequestsValue = 0;
                    }
                    bool HasEnoughCredits = (user.CreditsOwned - pendingRequestsValue - service.CreditWorth > 0);

                    if (HasEnoughCredits)
                    {
                        var newTransaction = new Entities.Transaction
                        {
                            Status      = 0,
                            Sender_Id   = User.Identity.GetUserId(),
                            Service_Id  = id,
                            CreditValue = service.CreditWorth
                        };
                        db.Transactions.Add(newTransaction);
                        db.SaveChanges();

                        // Send a message to Provider
                        Message newMessage = new Message()
                        {
                            SenderID        = User.Identity.GetUserId(),
                            ReceiverID      = service.Supplier.Id,
                            TransactionId   = newTransaction.Id,
                            ParentMessageID = null,
                            SentDate        = DateTimeOffset.Now,
                            ReceiverStatus  = MessageStatus.Available,
                            SenderStatus    = MessageStatus.Available,
                            Subject         = "New Request",
                            Content         = $"You have a new request for your service \"{service.Title}\"."
                        };
                        db.Messages.Add(newMessage);
                        db.SaveChanges();
                    }
                    else
                    {
                        return(RedirectToAction("Error", "Mistakes", new { mistake = $"You do not have enough credits to ask for this service! You own {user.CreditsOwned} credits, the sum of the pending requests you've asked for is {pendingRequestsValue} credits, so your available credits are {user.CreditsOwned - pendingRequestsValue}. This service is worth {service.CreditWorth} credits." }));
                    }
                }
            }
            else
            {
                return(RedirectToAction("Error", "Mistakes", routeValues: new { mistake = "You have already asked for that service" }));
            }
            return(RedirectToAction("Index"));
        }
コード例 #23
0
        public async Task <ActionResult <IEnumerable <ExpenseAccount> > > Get()
        {
            List <Entities.Account> accountEntities = await m_dbContext.Accounts.ToListAsync();

            Dictionary <int, Entities.Account> accountEntitiesById = accountEntities.ToDictionary(a => a.AccountId, a => a);

            List <Entities.AccountRelationship> accountRelationships = await m_dbContext.AccountRelationships
                                                                       .ToListAsync();

            List <Entities.AccountRelationship> prepaymentExpenseRelationships = accountRelationships
                                                                                 .Where(ar => ar.Type == AccountRelationshipType.PrepaymentToExpense)
                                                                                 .ToList();
            Dictionary <int, int> expenseAccountIdByPrepaymentAccountId =
                prepaymentExpenseRelationships.ToDictionary(p => p.SourceAccountId, p => p.DestinationAccountId);

            List <Entities.AccountRelationship> physicalToLogicalRelationships = accountRelationships
                                                                                 .Where(ar => ar.Type == AccountRelationshipType.PhysicalToLogical)
                                                                                 .ToList();
            Dictionary <int, int> physicalAccountIdByLogicalAccountId =
                physicalToLogicalRelationships.ToDictionary(p => p.DestinationAccountId, p => p.SourceAccountId);

            // cache all prepayment transactions that were credit card payoff transactions
            List <Entities.TransactionRelationship> creditCardPaymentRelationships = await m_dbContext.TransactionRelationships
                                                                                     .Where(tr => tr.Type == TransactionRelationshipType.CreditCardPayment)
                                                                                     .ToListAsync();

            Dictionary <int, int> expenseTransactionIdsByPrepaymentTransactionId =
                creditCardPaymentRelationships.ToDictionary(p => p.DestinationTransactionId, p => p.SourceTransactionId);

            var interestingAccountIds = new List <int>();

            interestingAccountIds.AddRange(expenseAccountIdByPrepaymentAccountId.Keys);
            interestingAccountIds.AddRange(expenseAccountIdByPrepaymentAccountId.Values);

            List <Entities.Transaction> transactionEntities = await m_dbContext.Transactions
                                                              .Include(t => t.CreditAccount)
                                                              .Include(t => t.DebitAccount)
                                                              .Where(t => interestingAccountIds.Contains(t.CreditAccountId) || interestingAccountIds.Contains(t.DebitAccountId))
                                                              .ToListAsync();

            var apiResponse = new List <ExpenseAccount>();

            foreach (Entities.Account accountEntity in accountEntities.Where(a => expenseAccountIdByPrepaymentAccountId.ContainsKey(a.AccountId)))
            {
                int prepaymentAccountId = accountEntity.AccountId;
                int expenseAccountId    = expenseAccountIdByPrepaymentAccountId[prepaymentAccountId];
                int physicalAccountId   = physicalAccountIdByLogicalAccountId[prepaymentAccountId];

                List <Entities.Transaction> prepaymentAccountTransactionEntities = transactionEntities
                                                                                   .Where(t => t.CreditAccountId == prepaymentAccountId || t.DebitAccountId == prepaymentAccountId)
                                                                                   .ToList();

                // Process prepayment transactions

                var expenseTransactions = new List <ExpenseTransaction>();
                foreach (Entities.Transaction accountTransactionEntity in prepaymentAccountTransactionEntities)
                {
                    int      id             = accountTransactionEntity.TransactionId;
                    DateTime at             = accountTransactionEntity.At;
                    decimal  amount         = 0;
                    int      otherAccountId = 0;

                    if (accountTransactionEntity.DebitAccountId == expenseAccountId &&
                        accountTransactionEntity.CreditAccountId == prepaymentAccountId)
                    {
                        // direct payment from prepayment to expense
                        otherAccountId = physicalAccountId;
                        amount         = -accountTransactionEntity.Amount;
                    }
                    else if (accountTransactionEntity.CreditAccountId == expenseAccountId &&
                             accountTransactionEntity.DebitAccountId == prepaymentAccountId)
                    {
                        // direct payment from expense to prepayment (rare but must be handled)

                        otherAccountId = physicalAccountId;
                        amount         = accountTransactionEntity.Amount;
                    }
                    else if (accountTransactionEntity.DebitAccountId == prepaymentAccountId)
                    {
                        // a prepayment account transaction
                        otherAccountId = accountTransactionEntity.CreditAccountId;
                        amount         = accountTransactionEntity.Amount;
                    }
                    else if (accountTransactionEntity.CreditAccountId == prepaymentAccountId)
                    {
                        // a prepayment account transaction
                        otherAccountId = accountTransactionEntity.DebitAccountId;
                        amount         = -accountTransactionEntity.Amount;
                    }

                    // lookup matching expense transaction & substitute details (as they are typically more accurate)
                    if (expenseTransactionIdsByPrepaymentTransactionId.ContainsKey(accountTransactionEntity.TransactionId))
                    {
                        Entities.Transaction expenseTransaction = transactionEntities
                                                                  .Single(e => e.TransactionId == expenseTransactionIdsByPrepaymentTransactionId[accountTransactionEntity.TransactionId]);

                        if (expenseTransaction.DebitAccountId == expenseAccountId)
                        {
                            id             = expenseTransaction.TransactionId;
                            at             = expenseTransaction.At;
                            otherAccountId = expenseTransaction.CreditAccountId;
                        }
                        else if (expenseTransaction.CreditAccountId == expenseAccountId)
                        {
                            id             = expenseTransaction.TransactionId;
                            at             = expenseTransaction.At;
                            otherAccountId = expenseTransaction.DebitAccountId;
                        }
                        else
                        {
                            // we should never get here
                        }
                    }

                    expenseTransactions.Add(
                        new ExpenseTransaction
                    {
                        Id               = id,
                        At               = at,
                        Amount           = amount,
                        Balance          = -666,// to make it clear this is wrong
                        OtherAccountName = accountEntitiesById[otherAccountId].Name
                    }
                        );
                }

                // TODO: look for recent expense only transactions
                if (expenseTransactions.Count == 0)
                {
                    continue;
                }

                DateTime lastPrepaymentTransactionAt = expenseTransactions.Max(t => t.At);

                List <Entities.Transaction> expenseAccountTransactionEntities = transactionEntities
                                                                                .Where(t => t.At > lastPrepaymentTransactionAt && (t.CreditAccountId == expenseAccountId || t.DebitAccountId == expenseAccountId))
                                                                                .ToList();
                foreach (Entities.Transaction accountTransactionEntity in expenseAccountTransactionEntities)
                {
                    int      id             = accountTransactionEntity.TransactionId;
                    DateTime at             = accountTransactionEntity.At;
                    decimal  amount         = 0;
                    int      otherAccountId = 0;

                    if (accountTransactionEntity.DebitAccountId == expenseAccountId)
                    {
                        // a prepament account transaction
                        otherAccountId = accountTransactionEntity.CreditAccountId;
                        amount         = -accountTransactionEntity.Amount;
                    }
                    else if (accountTransactionEntity.CreditAccountId == expenseAccountId)
                    {
                        // a prepayment account transaction
                        otherAccountId = accountTransactionEntity.DebitAccountId;
                        amount         = accountTransactionEntity.Amount;
                    }

                    expenseTransactions.Add(
                        new ExpenseTransaction
                    {
                        Id               = id,
                        At               = at,
                        Amount           = amount,
                        Balance          = -666,// to make it clear this is wrong
                        OtherAccountName = accountEntitiesById[otherAccountId].Name
                    }
                        );
                }

                decimal balance = 0;
                foreach (ExpenseTransaction expenseTransaction in expenseTransactions.OrderBy(t => t.At).ThenBy(t => t.Id))
                {
                    balance += expenseTransaction.Amount;
                    expenseTransaction.Balance = balance;
                }

                List <ExpenseTransaction> recentTransactions = expenseTransactions
                                                               .Where(et => et.At >= m_minTransactionAt)
                                                               .OrderByDescending(t => t.At).ThenByDescending(t => t.Id)
                                                               .ToList();

                if (balance == 0 && recentTransactions.Count == 0)
                {
                    continue;
                }

                apiResponse.Add(new ExpenseAccount
                {
                    Id           = accountEntity.AccountId,
                    Name         = accountEntity.Name,
                    Balance      = balance,
                    Transactions = recentTransactions
                });
            }

            return(apiResponse);
        }
コード例 #24
0
        public void Save(List <ImportProductModel> datas)
        {
            var mess = datas.Count(x => x.Error != null && x.Error.Length > 0);

            if (mess > 0)
            {
                return;
            }
            var products = _db.Products.ToList();
            var units    = _db.Units.ToList();

            List <Product>           adds        = new List <Product>();
            List <Product>           edits       = new List <Product>();
            List <ProductHistory>    histories   = new List <ProductHistory>();
            List <TransactionDetail> tranDetails = new List <TransactionDetail>();
            Product product;

            var options = new TransactionOptions {
                IsolationLevel = IsolationLevel.ReadCommitted
            };

            using (var scope = new TransactionScope(TransactionScopeOption.Required, options))
            {
                // transaction
                Entities.Transaction tran = new Entities.Transaction()
                {
                    CreatedAt = DateTime.Now,
                    CreatedBy = "Administrator",
                    Type      = Constants.PURCHASE,
                    SuplierId = 0,
                    IsPayment = FrmImportProduct._dialogModel.IsDebt ? Constants.NOT_PAY : Constants.PAID,
                    Amount    = FrmImportProduct._dialogModel.Total,
                    Payment   = FrmImportProduct._dialogModel.Payment,
                    PayBack   = FrmImportProduct._dialogModel.Payback
                };
                _db.Transactions.Add(tran);
                _db.SaveChanges();

                List <Product>    discounts;
                TransactionDetail tranDetail;
                foreach (var elm in datas)
                {
                    discounts = elm.ToDiscount();
                    // product + history
                    product = products.FirstOrDefault(x => x.Barcode.Equals(elm.Barcode));
                    // not exist
                    if (product == null)
                    {
                        var add = elm.ToProduct();
                        add.CreatedAt = DateTime.Now;
                        add.CreatedBy = "Administrator";
                        adds.Add(add);
                        histories.Add(elm.ToProductHistory());
                    }
                    else
                    {
                        elm.DumpProduct(ref product);
                        _db.Entry(product).State = System.Data.Entity.EntityState.Modified;
                        histories.Add(elm.ToProductHistory(product));
                    }

                    // transaction detail
                    tranDetail = elm.ToTransactionDetail(tran.Id);

                    // discount
                    foreach (var discount in discounts)
                    {
                        product = products.First(x => x.Barcode.Equals(discount.Barcode));

                        histories.Add(new ProductHistory()
                        {
                            Barcode     = discount.Barcode,
                            QuantityOld = product.Quantity,
                            QuantityNew = product.Quantity + discount.Quantity
                        });

                        if (discount.Barcode.Equals(elm.Barcode))
                        {
                            tranDetail.Quantity += discount.Quantity;
                        }
                        else
                        {
                            tranDetails.Add(new TransactionDetail()
                            {
                                Barcode       = discount.Barcode,
                                TracsactionId = tran.Id,
                                Quantity      = discount.Quantity,
                                IsDiscount    = true,
                                Amount        = product.PriceBuy.Value * discount.Quantity,
                                Unit          = product.Unit,
                                CreatedAt     = DateTime.Now,
                                CreatedBy     = "Administrator"
                            });
                        }

                        product.Quantity        += discount.Quantity;
                        product.UpdatedAt        = DateTime.Now;
                        _db.Entry(product).State = System.Data.Entity.EntityState.Modified;
                    }
                    tranDetails.Add(tranDetail);
                }

                // insert
                if (adds.Count > 0)
                {
                    _db.Products.AddRange(adds);
                }
                _db.ProductHistories.AddRange(histories);
                _db.TransactionDetails.AddRange(tranDetails);
                _db.SaveChanges();

                scope.Complete();
                MessageUtil.UpdateSuccess();
            }
        }
コード例 #25
0
        public void TestReloadTransaction()
        {
            const string   path          = "TestData/TransactionReload.xml";
            ILoggerFactory loggerFactory = new LoggerFactory();

            var currencyFactory = new CurrencyFactory();

            Entities.Currency usdCurrencyEntity = currencyFactory.Create(CurrencyPrefab.Usd, true);

            var accountFactory = new AccountFactory();

            Entities.Account checkingAccountEntity =
                accountFactory.Create(AccountPrefab.Checking, usdCurrencyEntity);
            Entities.Account rentPrepaymentAccountEntity =
                accountFactory.Create(AccountPrefab.RentPrepayment, usdCurrencyEntity);

            var accountRelationship = new Entities.AccountRelationship
            {
                SourceAccount      = checkingAccountEntity,
                DestinationAccount = rentPrepaymentAccountEntity,
                Type = AccountRelationshipType.PhysicalToLogical
            };
            var transaction = new Entities.Transaction
            {
                CreditAccount = checkingAccountEntity,
                Amount        = 10m,
                DebitAccount  = rentPrepaymentAccountEntity,
                At            = new DateTime(2018, 1, 1, 8, 30, 0)
            };

            using (var sqliteMemoryWrapper = new SqliteMemoryWrapper())
            {
                currencyFactory.Add(sqliteMemoryWrapper.DbContext, usdCurrencyEntity);

                accountFactory.Add(sqliteMemoryWrapper.DbContext, checkingAccountEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, rentPrepaymentAccountEntity);

                sqliteMemoryWrapper.DbContext.AccountRelationships.Add(accountRelationship);
                sqliteMemoryWrapper.DbContext.SaveChanges();

                sqliteMemoryWrapper.DbContext.Transactions.Add(transaction);
                sqliteMemoryWrapper.DbContext.SaveChanges();

                var service = new DatabaseSerializationXmlService(loggerFactory, sqliteMemoryWrapper.DbContext);
                service.Save(path);
            }

            using (var sqliteMemoryWrapper = new SqliteMemoryWrapper())
            {
                var service = new DatabaseSerializationXmlService(loggerFactory, sqliteMemoryWrapper.DbContext);
                service.Load(path);

                List <Entities.Account>             accounts             = sqliteMemoryWrapper.DbContext.Accounts.ToList();
                List <Entities.AccountRelationship> accountRelationships = sqliteMemoryWrapper.DbContext.AccountRelationships.ToList();
                List <Entities.Currency>            currencies           = sqliteMemoryWrapper.DbContext.Currencies.ToList();
                List <Entities.Transaction>         transactions         = sqliteMemoryWrapper.DbContext.Transactions.ToList();

                Assert.AreEqual(2, accounts.Count);
                Assert.AreEqual(1, accountRelationships.Count);
                Assert.AreEqual(1, currencies.Count);
                Assert.AreEqual(1, transactions.Count);

                Assert.AreEqual(checkingAccountEntity.Name, transactions[0].CreditAccount.Name);
                Assert.AreEqual(transaction.Amount, transactions[0].Amount);
                Assert.AreEqual(rentPrepaymentAccountEntity.Name, transactions[0].DebitAccount.Name);
                Assert.AreEqual(transaction.At, transactions[0].At);
            }
        }
コード例 #26
0
        public void TestGetAllTransactionsFilteredByAccountAndDateRange()
        {
            ILoggerFactory loggerFactory = new LoggerFactory();

            using (var sqliteMemoryWrapper = new SqliteMemoryWrapper())
            {
                var currencyFactory   = new CurrencyFactory();
                var usdCurrencyEntity = currencyFactory.Create(CurrencyPrefab.Usd, true);
                currencyFactory.Add(sqliteMemoryWrapper.DbContext, usdCurrencyEntity);

                var accountFactory = new AccountFactory();
                Entities.Account incomeAccountEntity =
                    accountFactory.Create(AccountPrefab.Income, usdCurrencyEntity);
                Entities.Account checkingAccountEntity =
                    accountFactory.Create(AccountPrefab.Checking, usdCurrencyEntity);
                Entities.Account rentPrepaymentAccountEntity =
                    accountFactory.Create(AccountPrefab.RentPrepayment, usdCurrencyEntity);
                Entities.Account groceriesPrepaymentAccountEntity =
                    accountFactory.Create(AccountPrefab.GroceriesPrepayment, usdCurrencyEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, incomeAccountEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, checkingAccountEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, rentPrepaymentAccountEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, groceriesPrepaymentAccountEntity);

                var transactionEntities = new Entities.Transaction[]
                {
                    new Entities.Transaction
                    {
                        CreditAccount = incomeAccountEntity,
                        DebitAccount  = checkingAccountEntity,
                        Amount        = 100m,
                        At            = new DateTime(2018, 1, 1, 8, 30, 0)
                    },
                    new Entities.Transaction
                    {
                        CreditAccount = checkingAccountEntity,
                        DebitAccount  = rentPrepaymentAccountEntity,
                        Amount        = 60m,
                        At            = new DateTime(2018, 1, 1, 8, 35, 0)
                    },
                    new Entities.Transaction
                    {
                        CreditAccount = checkingAccountEntity,
                        DebitAccount  = rentPrepaymentAccountEntity,
                        Amount        = 10m,
                        At            = new DateTime(2018, 1, 1, 9, 45, 0)
                    },
                    new Entities.Transaction
                    {
                        CreditAccount = checkingAccountEntity,
                        DebitAccount  = rentPrepaymentAccountEntity,
                        Amount        = 10m,
                        At            = new DateTime(2018, 1, 1, 11, 15, 0)
                    }
                };

                sqliteMemoryWrapper.DbContext.Transactions.AddRange(transactionEntities);
                sqliteMemoryWrapper.DbContext.SaveChanges();

                var checkingToRentPrepaymentRelationship = new Entities.AccountRelationship
                {
                    SourceAccount      = checkingAccountEntity,
                    DestinationAccount = rentPrepaymentAccountEntity,
                    Type = AccountRelationshipType.PhysicalToLogical
                };
                var checkingToGroceriesPrepaymentRelationship = new Entities.AccountRelationship
                {
                    SourceAccount      = checkingAccountEntity,
                    DestinationAccount = groceriesPrepaymentAccountEntity,
                    Type = AccountRelationshipType.PhysicalToLogical
                };

                sqliteMemoryWrapper.DbContext.AccountRelationships.Add(checkingToRentPrepaymentRelationship);
                sqliteMemoryWrapper.DbContext.AccountRelationships.Add(checkingToGroceriesPrepaymentRelationship);
                sqliteMemoryWrapper.DbContext.SaveChanges();

                var transactionService = new TransactionService(loggerFactory, sqliteMemoryWrapper.DbContext);

                int[] accountIds = new int[1] {
                    rentPrepaymentAccountEntity.AccountId
                };
                List <Transaction> transactions = transactionService
                                                  .GetAll(
                    accountIds,
                    new DateTime(2018, 1, 1, 8, 35, 0),
                    new DateTime(2018, 1, 1, 10, 0, 0)
                    )
                                                  .ToList();

                Assert.AreEqual(2, transactions.Count);

                Assert.AreEqual(2, transactions[0].TransactionId);
                Assert.AreEqual(checkingAccountEntity.AccountId, transactions[0].CreditAccount.AccountId);
                Assert.AreEqual(rentPrepaymentAccountEntity.AccountId, transactions[0].DebitAccount.AccountId);
                Assert.AreEqual(transactionEntities[1].Amount, transactions[0].Amount);
                Assert.AreEqual(transactionEntities[1].At, transactions[0].At);
                Assert.AreEqual(checkingAccountEntity.AccountId, transactions[1].CreditAccount.AccountId);
                Assert.AreEqual(rentPrepaymentAccountEntity.AccountId, transactions[1].DebitAccount.AccountId);
                Assert.AreEqual(transactionEntities[2].Amount, transactions[1].Amount);
                Assert.AreEqual(transactionEntities[2].At, transactions[1].At);
            }
        }
コード例 #27
0
        public void TestGetPendingCreditCardTransactionsOneResult()
        {
            using (var sqliteMemoryWrapper = new SqliteMemoryWrapper())
            {
                var currencyFactory = new CurrencyFactory();
                Entities.Currency usdCurrencyEntity = currencyFactory.Create(CurrencyPrefab.Usd, true);
                currencyFactory.Add(sqliteMemoryWrapper.DbContext, usdCurrencyEntity);

                var accountFactory = new AccountFactory();
                Entities.Account incomeAccountEntity =
                    accountFactory.Create(AccountPrefab.Income, usdCurrencyEntity);
                Entities.Account checkingAccountEntity =
                    accountFactory.Create(AccountPrefab.Checking, usdCurrencyEntity);
                Entities.Account rentPrepaymentAccountEntity =
                    accountFactory.Create(AccountPrefab.RentPrepayment, usdCurrencyEntity);
                Entities.Account rentExpenseAccountEntity =
                    accountFactory.Create(AccountPrefab.RentExpense, usdCurrencyEntity);
                Entities.Account creditCardAccountEntity =
                    accountFactory.Create(AccountPrefab.CreditCard, usdCurrencyEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, incomeAccountEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, checkingAccountEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, rentPrepaymentAccountEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, rentExpenseAccountEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, creditCardAccountEntity);

                var checkingToRentPrepaymentRelationship = new Entities.AccountRelationship
                {
                    SourceAccount      = checkingAccountEntity,
                    DestinationAccount = rentPrepaymentAccountEntity,
                    Type = AccountRelationshipType.PhysicalToLogical
                };
                var rentPrepaymentToExpenseRelationship = new Entities.AccountRelationship
                {
                    SourceAccount      = rentPrepaymentAccountEntity,
                    DestinationAccount = rentExpenseAccountEntity,
                    Type = AccountRelationshipType.PrepaymentToExpense
                };

                sqliteMemoryWrapper.DbContext.AccountRelationships.Add(checkingToRentPrepaymentRelationship);
                sqliteMemoryWrapper.DbContext.AccountRelationships.Add(rentPrepaymentToExpenseRelationship);
                sqliteMemoryWrapper.DbContext.SaveChanges();

                var transactionsToAdd = new Entities.Transaction[4]
                {
                    new Entities.Transaction
                    {
                        CreditAccount = incomeAccountEntity,
                        DebitAccount  = checkingAccountEntity,
                        Amount        = 100m,
                        At            = new DateTime(2018, 1, 1, 8, 30, 1)
                    },
                    new Entities.Transaction
                    {
                        CreditAccount = checkingAccountEntity,
                        DebitAccount  = rentPrepaymentAccountEntity,
                        Amount        = 50m,
                        At            = new DateTime(2018, 1, 1, 8, 30, 2)
                    },
                    new Entities.Transaction
                    {
                        CreditAccount = creditCardAccountEntity,
                        DebitAccount  = rentExpenseAccountEntity,
                        Amount        = 20m,
                        At            = new DateTime(2018, 1, 1, 8, 30, 3)
                    },
                    new Entities.Transaction
                    {
                        CreditAccount = rentPrepaymentAccountEntity,
                        DebitAccount  = creditCardAccountEntity,
                        Amount        = 20m,
                        At            = new DateTime(2018, 1, 1, 8, 30, 4)
                    }
                };

                sqliteMemoryWrapper.DbContext.Transactions.AddRange(transactionsToAdd);
                sqliteMemoryWrapper.DbContext.SaveChanges();

                ILoggerFactory     loggerFactory      = new LoggerFactory();
                TransactionService transactionService = new TransactionService(loggerFactory, sqliteMemoryWrapper.DbContext);

                List <Payment> pendingPayments =
                    transactionService.GetPendingCreditCardPayments(creditCardAccountEntity.AccountId).ToList();

                Assert.AreEqual(1, pendingPayments.Count);
                Assert.AreEqual(creditCardAccountEntity.AccountId, pendingPayments[0].OriginalTransaction.CreditAccount.AccountId);
                Assert.AreEqual(rentExpenseAccountEntity.AccountId, pendingPayments[0].OriginalTransaction.DebitAccount.AccountId);
                Assert.AreEqual(transactionsToAdd[2].Amount, pendingPayments[0].OriginalTransaction.Amount);
                Assert.AreEqual(rentPrepaymentAccountEntity.AccountId, pendingPayments[0].PaymentTransaction.CreditAccount.AccountId);
                Assert.AreEqual(creditCardAccountEntity.AccountId, pendingPayments[0].PaymentTransaction.DebitAccount.AccountId);
                Assert.AreEqual(transactionsToAdd[2].Amount, pendingPayments[0].PaymentTransaction.Amount);
            }
        }
コード例 #28
0
        public void TestReconcileBalance()
        {
            ILoggerFactory loggerFactory = new LoggerFactory();

            using (var sqliteMemoryWrapper = new SqliteMemoryWrapper())
            {
                var currencyFactory   = new CurrencyFactory();
                var usdCurrencyEntity = currencyFactory.Create(CurrencyPrefab.Usd, true);
                currencyFactory.Add(sqliteMemoryWrapper.DbContext, usdCurrencyEntity);

                var accountFactory = new AccountFactory();
                Entities.Account incomeAccountEntity   = accountFactory.Create(AccountPrefab.Income, usdCurrencyEntity);
                Entities.Account checkingAccountEntity = accountFactory.Create(AccountPrefab.Checking, usdCurrencyEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, incomeAccountEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, checkingAccountEntity);

                var transactionEntities = new Entities.Transaction[]
                {
                    new Entities.Transaction
                    {
                        CreditAccount = incomeAccountEntity,
                        DebitAccount  = checkingAccountEntity,
                        Amount        = 100m,
                        At            = new DateTime(2018, 1, 1, 8, 30, 0)
                    }
                };

                sqliteMemoryWrapper.DbContext.Transactions.AddRange(transactionEntities);
                sqliteMemoryWrapper.DbContext.SaveChanges();

                var accountService = new AccountService(
                    loggerFactory,
                    sqliteMemoryWrapper.DbContext);

                var currencyService = new CurrencyService(
                    loggerFactory,
                    sqliteMemoryWrapper.DbContext);

                var transactionService = new TransactionService(
                    loggerFactory,
                    sqliteMemoryWrapper.DbContext);

                var viewModel = new ReconcileBalanceViewModel(
                    loggerFactory,
                    accountService,
                    currencyService,
                    transactionService,
                    new Concrete.StubAccountLinkViewModelFactory(),
                    new Mock <IForeignAmountViewService>().Object,
                    checkingAccountEntity.AccountId);
                viewModel.Balance = 140m;
                viewModel.At      = new DateTime(2018, 1, 2, 7, 0, 0);
                viewModel.OKCommand.Execute(null);
                Transaction newTransaction = viewModel.ToTransaction();

                Assert.AreEqual(1, viewModel.Accounts.Count);
                Assert.AreEqual(40m, newTransaction.Amount);
                Assert.AreEqual(incomeAccountEntity.AccountId, newTransaction.CreditAccount.AccountId);
                Assert.AreEqual(checkingAccountEntity.AccountId, newTransaction.DebitAccount.AccountId);
                Assert.AreEqual(viewModel.At, newTransaction.At);
            }
        }
コード例 #29
0
        public void TestAccountTransactionListViewModelAccountWithLogicalsAndTransactions()
        {
            ILoggerFactory loggerFactory = new LoggerFactory();

            using (var sqliteMemoryWrapper = new SqliteMemoryWrapper())
            {
                var currencyFactory   = new CurrencyFactory();
                var usdCurrencyEntity = currencyFactory.Create(CurrencyPrefab.Usd, true);
                currencyFactory.Add(sqliteMemoryWrapper.DbContext, usdCurrencyEntity);

                var accountFactory = new AccountFactory();
                Entities.Account incomeAccountEntity =
                    accountFactory.Create(AccountPrefab.Income, usdCurrencyEntity);
                Entities.Account checkingAccountEntity =
                    accountFactory.Create(AccountPrefab.Checking, usdCurrencyEntity);
                Entities.Account rentPrepaymentAccountEntity =
                    accountFactory.Create(AccountPrefab.RentPrepayment, usdCurrencyEntity);
                Entities.Account groceriesPrepaymentAccountEntity =
                    accountFactory.Create(AccountPrefab.GroceriesPrepayment, usdCurrencyEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, incomeAccountEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, checkingAccountEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, rentPrepaymentAccountEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, groceriesPrepaymentAccountEntity);

                var transactionEntities = new Entities.Transaction[]
                {
                    new Entities.Transaction
                    {
                        CreditAccount = incomeAccountEntity,
                        DebitAccount  = checkingAccountEntity,
                        Amount        = 100m,
                        At            = new DateTime(2018, 1, 1, 8, 30, 0)
                    },
                    new Entities.Transaction
                    {
                        CreditAccount = checkingAccountEntity,
                        DebitAccount  = rentPrepaymentAccountEntity,
                        Amount        = 60m,
                        At            = new DateTime(2018, 1, 1, 8, 31, 0)
                    },
                    new Entities.Transaction
                    {
                        CreditAccount = checkingAccountEntity,
                        DebitAccount  = groceriesPrepaymentAccountEntity,
                        Amount        = 10m,
                        At            = new DateTime(2018, 1, 1, 8, 32, 0)
                    }
                };

                sqliteMemoryWrapper.DbContext.Transactions.AddRange(transactionEntities);
                sqliteMemoryWrapper.DbContext.SaveChanges();

                var checkingToRentPrepaymentRelationship = new Entities.AccountRelationship
                {
                    SourceAccount      = checkingAccountEntity,
                    DestinationAccount = rentPrepaymentAccountEntity,
                    Type = AccountRelationshipType.PhysicalToLogical
                };
                var checkingToGroceriesPrepaymentRelationship = new Entities.AccountRelationship
                {
                    SourceAccount      = checkingAccountEntity,
                    DestinationAccount = groceriesPrepaymentAccountEntity,
                    Type = AccountRelationshipType.PhysicalToLogical
                };

                sqliteMemoryWrapper.DbContext.AccountRelationships.Add(checkingToRentPrepaymentRelationship);
                sqliteMemoryWrapper.DbContext.AccountRelationships.Add(checkingToGroceriesPrepaymentRelationship);
                sqliteMemoryWrapper.DbContext.SaveChanges();

                var accountService = new AccountService(
                    loggerFactory,
                    sqliteMemoryWrapper.DbContext);

                var transactionService = new TransactionService(
                    loggerFactory,
                    sqliteMemoryWrapper.DbContext);


                IAccountTransactionItemViewModelFactory accountTransactionViewModelFactory =
                    new Concrete.StubAccountTransactionItemViewModelFactory();

                var viewModel = new AccountTransactionListViewModel(
                    loggerFactory,
                    accountService,
                    transactionService,
                    accountTransactionViewModelFactory,
                    new Mock <IDeleteConfirmationViewService>().Object,
                    new Mock <ITransactionCreateViewService>().Object,
                    new Mock <ITransactionEditViewService>().Object,
                    new Mock <IReconcileBalanceViewService>().Object,
                    checkingAccountEntity.AccountId);

                Assert.AreEqual(true, viewModel.HasLogicalAcounts);
                Assert.AreEqual(3, viewModel.Transactions.Count);
                Assert.AreEqual(100m, viewModel.Transactions[0].Balance);
                Assert.AreEqual(100m, viewModel.Transactions[1].Balance);
                Assert.AreEqual(100m, viewModel.Transactions[2].Balance);
            }
        }
コード例 #30
0
        public void TestAccountTransactionListViewModelPostDeleteBalanceRefresh()
        {
            ILoggerFactory loggerFactory = new LoggerFactory();

            using (var sqliteMemoryWrapper = new SqliteMemoryWrapper())
            {
                var currencyFactory   = new CurrencyFactory();
                var usdCurrencyEntity = currencyFactory.Create(CurrencyPrefab.Usd, true);
                currencyFactory.Add(sqliteMemoryWrapper.DbContext, usdCurrencyEntity);

                var accountFactory = new AccountFactory();
                Entities.Account incomeAccountEntity =
                    accountFactory.Create(AccountPrefab.Income, usdCurrencyEntity);
                Entities.Account checkingAccountEntity =
                    accountFactory.Create(AccountPrefab.Checking, usdCurrencyEntity);
                Entities.Account rentExpenseAccountEntity =
                    accountFactory.Create(AccountPrefab.RentExpense, usdCurrencyEntity);

                accountFactory.Add(sqliteMemoryWrapper.DbContext, incomeAccountEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, checkingAccountEntity);
                accountFactory.Add(sqliteMemoryWrapper.DbContext, rentExpenseAccountEntity);

                var transactionEntities = new Entities.Transaction[]
                {
                    new Entities.Transaction
                    {
                        CreditAccount = incomeAccountEntity,
                        DebitAccount  = checkingAccountEntity,
                        Amount        = 100m,
                        At            = new DateTime(2018, 1, 1, 8, 30, 0)
                    },
                    new Entities.Transaction
                    {
                        CreditAccount = checkingAccountEntity,
                        DebitAccount  = rentExpenseAccountEntity,
                        Amount        = 60m,
                        At            = new DateTime(2018, 1, 1, 8, 31, 0)
                    },
                    new Entities.Transaction
                    {
                        CreditAccount = checkingAccountEntity,
                        DebitAccount  = rentExpenseAccountEntity,
                        Amount        = 10m,
                        At            = new DateTime(2018, 1, 1, 8, 32, 0)
                    }
                };

                sqliteMemoryWrapper.DbContext.Transactions.AddRange(transactionEntities);
                sqliteMemoryWrapper.DbContext.SaveChanges();

                var accountService = new AccountService(
                    loggerFactory,
                    sqliteMemoryWrapper.DbContext);

                var transactionService = new TransactionService(
                    loggerFactory,
                    sqliteMemoryWrapper.DbContext);

                IAccountTransactionItemViewModelFactory accountTransactionViewModelFactory =
                    new Concrete.StubAccountTransactionItemViewModelFactory();

                // Force transaction deletion to always confirm
                var mockDeleteConfirmationViewService = new Mock <IDeleteConfirmationViewService>();
                mockDeleteConfirmationViewService
                .Setup(s => s.Show(It.IsAny <string>()))
                .Returns(true);

                var viewModel = new AccountTransactionListViewModel(
                    loggerFactory,
                    accountService,
                    transactionService,
                    accountTransactionViewModelFactory,
                    mockDeleteConfirmationViewService.Object,
                    new Mock <ITransactionCreateViewService>().Object,
                    new Mock <ITransactionEditViewService>().Object,
                    new Mock <IReconcileBalanceViewService>().Object,
                    checkingAccountEntity.AccountId
                    );

                // Delete the first transaction
                viewModel.SelectedTransaction = viewModel.Transactions.OrderBy(t => t.At).First();
                viewModel.DeleteCommand.Execute(this);

                var transactionViewModels = new List <IAccountTransactionItemViewModel>(viewModel.Transactions.OrderBy(t => t.At));

                Assert.AreEqual(2, transactionViewModels.Count);
                Assert.AreEqual(transactionEntities[1].CreditAccount.AccountId, transactionViewModels[0].CreditAccount.AccountId);
                Assert.AreEqual(transactionEntities[1].DebitAccount.AccountId, transactionViewModels[0].DebitAccount.AccountId);
                Assert.AreEqual(transactionEntities[1].Amount, transactionViewModels[0].Amount);
                Assert.AreEqual(transactionEntities[1].At, transactionViewModels[0].At);
                Assert.AreEqual(-60m, transactionViewModels[0].Balance);
                Assert.AreEqual(transactionEntities[2].CreditAccount.AccountId, transactionViewModels[1].CreditAccount.AccountId);
                Assert.AreEqual(transactionEntities[2].DebitAccount.AccountId, transactionViewModels[1].DebitAccount.AccountId);
                Assert.AreEqual(transactionEntities[2].Amount, transactionViewModels[1].Amount);
                Assert.AreEqual(transactionEntities[2].At, transactionViewModels[1].At);
                Assert.AreEqual(-70m, transactionViewModels[1].Balance);
            }
        }