main
 1using System.Linq;
 2using gorilla.commons.utility;
 3using MoMoney.Domain.Core;
 4using MoMoney.Domain.repositories;
 5using MoMoney.DTO;
 6using MoMoney.Service.Contracts.Application;
 7
 8namespace MoMoney.Service.Application
 9{
10    public class AddNewIncomeCommand : IAddNewIncomeCommand
11    {
12        readonly IGetTheCurrentCustomerQuery query;
13        readonly Notification notification;
14        readonly IIncomeRepository all_income;
15        readonly ICompanyRepository companys;
16
17        public AddNewIncomeCommand(IGetTheCurrentCustomerQuery query, Notification notification, IIncomeRepository all_income,
18                                   ICompanyRepository companys)
19        {
20            this.query = query;
21            this.notification = notification;
22            this.all_income = all_income;
23            this.companys = companys;
24        }
25
26        public void run(IncomeSubmissionDTO item)
27        {
28            if (similar_income_has_been_submitted(item))
29            {
30                notification.notify("You have already submitted this income");
31            }
32            else
33            {
34                companys
35                    .find_company_by(item.company_id)
36                    .pay(
37                    query.fetch(),
38                    item.amount.as_money(),
39                    item.recieved_date
40                    );
41            }
42        }
43
44        bool similar_income_has_been_submitted(IncomeSubmissionDTO income)
45        {
46            if (all_income.all().Count() == 0) return false;
47            return all_income
48                       .all()
49                       .where(x => x.amount_tendered.Equals(income.amount.as_money()))
50                       .where(x => x.company.id.Equals(income.company_id))
51                       .where(x => x.date_of_issue.Equals(income.recieved_date))
52                       .Count() > 0;
53        }
54    }
55}