summaryrefslogtreecommitdiff
path: root/src/app/Cmpp298.Assignment3.Desktop.Presentation/NewInvoicePresenter.cs
blob: 83f30dcb8624a386912900322ab75b9458d953dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using Cmpp298.Assignment3.Domain;
using Cmpp298.Assignment3.Dto;
using Cmpp298.Assignment3.Task;

namespace Cmpp298.Assignment3.Presentation {
	public class NewInvoicePresenter {
		private readonly string _vendorId;
		private readonly INewInvoiceView _view;
		private readonly IInvoiceTask _invoiceTask;
		private readonly IVendorTask _vendorTask;
		private readonly ITermTask _termTask;

		public NewInvoicePresenter( string vendorId, INewInvoiceView view )
			: this( vendorId, view, new InvoiceTask( ), new VendorTask( ), new TermTask( ) ) {}

		public NewInvoicePresenter( string vendorId, INewInvoiceView view, IInvoiceTask invoiceTask, IVendorTask vendorTask,
		                            ITermTask termTask ) {
			_vendorId = vendorId;
			_view = view;
			_invoiceTask = invoiceTask;
			_vendorTask = vendorTask;
			_termTask = termTask;
		}

		public void Load( ) {
			_view.BindTo( _vendorTask.FindVendorNameBy( _vendorId ) );
			_view.InvoiceNumber = Guid.NewGuid( ).ToString( );
			_view.Terms.BindTo( _termTask.GetAll( ) );
		}

		public void SaveInvoice( ) {
			if ( IsValidInput( ) ) {
				_invoiceTask.SaveNewInvoice( CreateDtoFromView( ) );
			}
			else {
				_view.ShowError( "Invalid input detected!" );
			}
		}

		private bool IsValidInput( ) {
			AmountEntrySpecification specification = new AmountEntrySpecification( );
			return
				specification.IsSatisfiedBy( _view.CreditTotal )
				&& specification.IsSatisfiedBy( _view.PaymentTotal )
				&& specification.IsSatisfiedBy( _view.InvoiceTotal );
		}

		private SaveInvoiceDto CreateDtoFromView( ) {
			return new SaveInvoiceDto( _vendorId, _view.InvoiceNumber, _view.InvoiceDate, _view.InvoiceTotal, _view.PaymentTotal,
			                           _view.CreditTotal, _view.DueDate, _view.PaymentDate, _view.Terms.SelectedItem.Value );
		}
	}
}