예제 #1
0
        public PurchaseDTO Pay(int clientId, int purchaseId)
        {
            ClientService.CheckCredentials(clientId);
            Purchase purchase = PurchaseService.FindEntity(purchaseId);

            if (purchase.PayingTime != null)
            {
                throw new AppException("Already payed", 400);
            }
            decimal       amount = purchase.Amount;
            ClientAccount source = ClientService.GetAccount(clientId);

            if (amount > source.Balance)
            {
                throw new AppException("Not enough money", 400);
            }
            TraderAccount target = TraderService.GetAccount(purchase.CommercialLink.TraderId);

            PaymentMonitor.Remove(purchaseId);
            source.Balance     -= amount;
            target.Balance     += amount;
            purchase.PayingTime = DateTime.Now;
            ClientAccountService.Update(source);
            TraderAccountService.Update(target);
            purchase = PurchaseService.Update(purchase);
            return(PurchaseService.EntityToDTO(purchase));
        }
예제 #2
0
        public (PurchaseDTO, int) SavePurchase(int clientId, int traderId, decimal amount)
        {
            TraderService.CheckCredentials(traderId);
            (CommercialLink cl, _, _) = FindOrCreateCl(clientId, traderId);
            Purchase purchase = PurchaseService.Save(new Purchase()
            {
                CommercialLinkId = cl.Id,
                PayingTime       = null,
                Amount           = amount
            });

            return(PurchaseService.EntityToDTO(purchase), purchase.Id);
        }
예제 #3
0
        public TraderForClients MarkTrader(int clientId, int traderId, bool?bookMark)
        {
            ClientService.CheckCredentials(clientId);
            if (bookMark == null)
            {
                throw new AppException("Missing parameters", 400);
            }
            (CommercialLink cl, _, Trader trader) = FindOrCreateCl(clientId, traderId);
            cl.Status = cl.Status.SetBit(CommercialLink.BOOKMARK, (bool)bookMark);
            ClService.QuickUpdate(cl.Id, cl);
            PrivateTrader    dto      = TraderService.EntityToDTO(cl.Trader);
            TraderForClients extended = dto.CastAs <TraderForClients>();

            extended.CommercialRelation = ClService.GetClStatus(cl);
            return(extended);
        }
예제 #4
0
        private (CommercialLink, Client, Trader) FindOrCreateCl(int clientId, int traderId)
        {
            Client         client = ClientService.FindEntity(clientId);
            Trader         trader = TraderService.FindEntity(traderId);
            CommercialLink cl     = ClService.FindWithBoth(clientId, traderId);

            if (cl == null)
            {
                cl = new CommercialLink()
                {
                    ClientId = clientId,
                    TraderId = traderId,
                    Status   = CommercialLink.DEFAULT_STATUS
                };
                ClService.QuickSave(cl);
            }
            return(cl, client, trader);
        }
예제 #5
0
 public MultiService(
     ClientService clientService,
     TraderService traderService,
     CommercialLinkService clService,
     RelatedToBothService <Purchase, PurchaseDTO> purchaseService,
     AccountService <ClientAccount, ClientAccountDTO> clientAccountService,
     AccountService <TraderAccount, TraderAccountDTO> traderAccountService,
     PaymentMonitor paymentMonitor,
     Credentials credentials
     )
 {
     ClService            = clService;
     ClientService        = clientService;
     TraderService        = traderService;
     PurchaseService      = purchaseService;
     ClientAccountService = clientAccountService;
     TraderAccountService = traderAccountService;
     PaymentMonitor       = paymentMonitor;
     Credentials          = credentials;
 }
예제 #6
0
        public IEnumerable <ClientForTraders> ClientsForTrader(int id, string filter)
        {
            TraderService.CheckCredentials(id);
            Trader trader = TraderService.FindEntity(id);

            TraderService.CollectCl(trader);
            var ret = new List <ClientForTraders>();
            Func <ClientForTraders, bool> test = filter.ToTest <ClientForTraders>();

            foreach (CommercialLink cl in trader.CommercialLink)
            {
                PrivateClient    privateClient   = ClientService.EntityToDTO(cl.Client);
                ClientForTraders clientForTrader = privateClient.CastAs <ClientForTraders>();
                clientForTrader.CommercialRelation = ClService.GetClStatus(cl);
                if (test(clientForTrader))
                {
                    ret.Add(clientForTrader);
                }
            }
            return(ret);
        }
예제 #7
0
        public IEnumerable <TraderForClients> TradersForClient(int id, string filter)
        {
            ClientService.CheckCredentials(id);
            Client client = ClientService.FindEntity(id);

            ClientService.CollectCl(client);
            var ret = new List <TraderForClients>();
            Func <TraderForClients, bool> test = filter.ToTest <TraderForClients>();

            foreach (CommercialLink cl in client.CommercialLink)
            {
                PrivateTrader    privateTrader   = TraderService.EntityToDTO(cl.Trader);
                TraderForClients traderForClient = privateTrader.CastAs <TraderForClients>();
                traderForClient.CommercialRelation = ClService.GetClStatus(cl);
                if (test(traderForClient))
                {
                    ret.Add(traderForClient);
                }
            }
            return(ret);
        }