using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;
namespace TestableApplication.Testable.Dalc
{
public class InvoiceDalc : DalcBase<Invoice>, IInvoiceDalc
{
Invoice _invoice;
public InvoiceDalc(Invoice invoice)
{
_invoice = invoice;
}
public Invoice IssueInvoice(string description, ICustomer customer, List<InvoiceItem> items)
{
Console.WriteLine("--- IssueInvoice Method was invoked from object {0} ", this);
Console.WriteLine("press enter to continue ....");
Console.ReadLine();
List<SqlParameter> parameters = new List<SqlParameter>();
SqlParameter param = new SqlParameter("@DESCRIPTION", SqlDbType.NVarChar);
param.Value = description;
parameters.Add(param);
param = new SqlParameter("@CUS_ID", SqlDbType.Int);
param.Value = customer.ID; ;
parameters.Add(param);
DateTime issueDate = DateTime.Now;
param = new SqlParameter("@ISSUE_DATE", SqlDbType.DateTime);
param.Value = issueDate;
parameters.Add(param);
param = new SqlParameter("@DUE_DATE", SqlDbType.DateTime);
param.Value = issueDate.AddMonths(1); ;
parameters.Add(param);
object idObj = ExecuteStoredScalerProcedure("stp_add_invoice_header", parameters);
// for test only
idObj = DateTime.Now.Millisecond;
int invoiceNumber = int.Parse(idObj.ToString());
parameters.Clear();
int seq = 0;
foreach (InvoiceItem item in items)
{
param = new SqlParameter("@INV_ID", SqlDbType.Int);
param.Value = invoiceNumber;
parameters.Add(param);
param = new SqlParameter("@QTY", SqlDbType.Int);
param.Value = item.Quantity;
parameters.Add(param);
param = new SqlParameter("@SEQ_NUM", SqlDbType.Int);
param.Value = ++seq;
parameters.Add(param);
ExecuteStoredScalerProcedure("stp_add_invoice_line", parameters);
}
Invoice newInvoice = new Invoice(invoiceNumber, description, customer, issueDate, Status.Issued, items);
customer.Debt(newInvoice.TotalAmount, newInvoice.Description, newInvoice.InvoiceNumber, newInvoice.IssueDate);
return newInvoice;
}
public void PayOffInvoice(ICustomer customer)
{
Console.WriteLine("--- IssueInvoice Method was invoked from object {0} ", this);
Console.WriteLine("press enter to continue ....");
Console.ReadLine();
List<SqlParameter> parameters = new List<SqlParameter>();
SqlParameter param = new SqlParameter("@INV_ID", SqlDbType.Int);
param.Value = _invoice.InvoiceNumber;
parameters.Add(param);
param = new SqlParameter("@CUS_ID", SqlDbType.Int);
param.Value = customer.ID; ;
parameters.Add(param);
DateTime issueDate = DateTime.Now;
param = new SqlParameter("@PAY_OFF_DATE", SqlDbType.DateTime);
param.Value = DateTime.Now;
parameters.Add(param);
object idObj = ExecuteStoredScalerProcedure("stp_pay_off_invoice", parameters);
_invoice._status = Status.Paid;
customer.Credit(_invoice.TotalAmount, _invoice.Description, _invoice.InvoiceNumber, _invoice.IssueDate);
}
public override Invoice Make(DataRow dr)
{
// Customer cus = new Customer().GetCustomer(int.Parse(dr["CUS_ID"].ToString()));
// List<InvoiceItem> items = new InvoiceItem().GetItems(int.Parse(dr["INV_ID"].ToString()));
// return new Invoice(int.Parse(dr["INV_ID"].ToString()), dr["DESCRIPTION"].ToString(), cus, DateTime.Parse(dr["@ISSUE_DATE"].ToString()), (Status)Enum.Parse(typeof(Status), dr["STATUS"].ToString()), items);
return new Invoice(DateTime.Now.Millisecond, "qq", new Customer(1, "aa", "bb"));
}
public Invoice GetInvoice(int invoiceNomber)
{
List<SqlParameter> parameters = new List<SqlParameter>();
SqlParameter param = new SqlParameter("@ID", SqlDbType.Int);
param.Value = invoiceNomber;
parameters.Add(param);
DataTable dt = ExecuteStoredProcedure("stp_get_Invoice", parameters);
#region for test only
dt.Rows.Add(dt.NewRow());
#endregion
return Make(dt.Rows[0]);
}
public void Update()
{
throw new InvalidOperationException("Invoice Update method, This Error did in purpose as Example of Invoice Dependency Error");
Console.WriteLine("--- Update Method was invoked from object {0} ", this);
Console.WriteLine("press enter to continue ....");
Console.ReadLine();
List<SqlParameter> parameters = new List<SqlParameter>();
SqlParameter param = new SqlParameter("@INV_ID", SqlDbType.Int);
param.Value = _invoice.InvoiceNumber;
parameters.Add(param);
param = new SqlParameter("@DESCRIPTION", SqlDbType.NVarChar);
param.Value = _invoice.Description;
parameters.Add(param);
param = new SqlParameter("@CUS_ID", SqlDbType.Int);
param.Value = _invoice.Customer.ID;
parameters.Add(param);
param = new SqlParameter("@ISSUE_DATE", SqlDbType.DateTime);
param.Value = _invoice.IssueDate;
parameters.Add(param);
param = new SqlParameter("@DUE_DATE", SqlDbType.DateTime);
param.Value = _invoice.DueDate;
parameters.Add(param);
ExecuteStoredScalerProcedure("stp_update_invoice_header", parameters);
}
}
}