And here is a library I wrote to provide quote, group, line, and subline discounting functionality to a discoutning front end I wrote. I can't provide the front end code as it is confidential for the client where as this is not. Note the use of the same Serializable object Deep Copy class.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.Configuration;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Web.Services.Protocols;
using Discounting.AEWebReference;
using Discounting;
using System.Reflection;
namespace Discounting
{
public static class SerializationCopier<T>
{
public static T DeepCopy(object objectToCopy)
{
using (MemoryStream _memoryStream = new MemoryStream())
{
BinaryFormatter _binaryFormatter = new BinaryFormatter();
_binaryFormatter.Serialize(_memoryStream, objectToCopy);
_memoryStream.Seek(0, SeekOrigin.Begin);
return (T)_binaryFormatter.Deserialize(_memoryStream);
}
}
}
public class DisplayGroup : object
{
public DisplayGroup()
{
}
public DisplayGroup(string _group, string _description)
{
group = _group;
description = _description;
}
private string group;
private string description;
public string Group
{
get { return group; }
set { group = value; }
}
public string Description
{
get { return description; }
set { description = value; }
}
}
public class CAEDiscountingLibrary
{
public enum DiscountType { Percentage, Amount, Override };
public enum QuoteLineOrder { Display, Price };
private List<QuoteLineItem> quoteLineItemList;
private List<QuoteLineItem> quoteLineItemListReadOnly;
private List<QuoteGroup> groupList;
private Quote activeQuote;
private AEWebReference.CRMWebService crmWebService;
public CAEDiscountingLibrary()
{
crmWebService = new AEWebReference.CRMWebService();
crmWebService.CookieContainer = new CookieContainer();
crmWebService.Login(ConfigurationManager.AppSettings["CRMUser"], ConfigurationManager.AppSettings["CRMPwd"]);
}
public CAEDiscountingLibrary(string quoteId)
{
crmWebService = new AEWebReference.CRMWebService();
crmWebService.CookieContainer = new CookieContainer();
crmWebService.Login(ConfigurationManager.AppSettings["CRMUser"], ConfigurationManager.AppSettings["CRMPwd"]);
LoadQuoteAndLines(quoteId);
}
public string GetFirstUserIDByType(string[] typecode)
{
FilterExpression _filter = new FilterExpression();
ConditionExpression[] _conditions;
ConditionExpression _userCondition = new ConditionExpression();
_userCondition.ConditionOperator = Operator.Equal;
_userCondition.FieldName = "Type";
_userCondition.Values = typecode;
_conditions = new ConditionExpression[] { _userCondition };
_filter.Conditions = _conditions;
User[] _u = crmWebService.UserFind(_filter, null);
if (_u != null && _u.Count() > 0 && _u[0].Id != null)
{
return _u[0].Id;
}
else
{
return null;
}
}
public void LoadQuoteAndLines(string quoteId)
{
try
{
activeQuote = crmWebService.QuoteGet(quoteId);
}
catch (Exception _exc)
{
}
if (activeQuote == null || activeQuote.Id == "") return;
{
FilterExpression _filter = new FilterExpression();
ConditionExpression[] _conditions;
string[] _quoteIds = { quoteId };
ConditionExpression _quoteIdCondition = new ConditionExpression();
_quoteIdCondition.ConditionOperator = Operator.Equal;
_quoteIdCondition.FieldName = "QuoteId";
_quoteIdCondition.Values = _quoteIds;
_conditions = new ConditionExpression[] { _quoteIdCondition };
_filter.Conditions = _conditions;
QuoteGroup[] _groups = crmWebService.QuoteGroupFind(_filter, null);
if (_groups != null && _groups.Count() > 0)
{
groupList = _groups.ToList();
}
else
{
groupList = null;
}
}
{
FilterExpression _filter = new FilterExpression();
ConditionExpression[] _conditions;
string[] _quoteIds = { quoteId };
ConditionExpression _quoteIdCondition = new ConditionExpression();
_quoteIdCondition.ConditionOperator = Operator.Equal;
_quoteIdCondition.FieldName = "QuoteId";
_quoteIdCondition.Values = _quoteIds;
_conditions = new ConditionExpression[] { _quoteIdCondition };
_filter.Conditions = _conditions;
QuoteLineItem[] _lines = crmWebService.QuoteLineItemFind(_filter, null);
quoteLineItemList = _lines.ToList();
quoteLineItemList = quoteLineItemList.FindAll(_qli => (_qli.IsExcludedFromQuoteAmount == null || _qli.IsExcludedFromQuoteAmount == false) || (_qli.SubLineItemNumber == null || _qli.SubLineItemNumber == 0));
quoteLineItemList.FindAll(_qli => _qli.SubLineItemNumber == null || _qli.SubLineItemNumber == 0).ForEach(_qli =>
{
_qli.UnitCost = GetLinePrice(_qli.Id);
_qli.UnitPrice = GetLineListPrice(_qli.Id);
_qli.ManualDiscountAmount = GetLineDiscountAmount(_qli.Id);
_qli.ExtendedAmount = GetLineNetPrice(_qli.Id);
});
//quoteLineItemList = quoteLineItemList.FindAll(_qli => _qli.UnitPrice != null && _qli.UnitCost != null && _qli.UnitPrice != 0 && _qli.UnitPrice == _qli.UnitCost);
quoteLineItemList = quoteLineItemList.FindAll(_qli => _qli.UnitPrice != null && _qli.UnitCost != null && _qli.UnitPrice != 0);
quoteLineItemList.ForEach(_qli => _qli.DiscountPercentage = 100 * _qli.ManualDiscountAmount / _qli.UnitPrice);
quoteLineItemListReadOnly = SerializationCopier<List<QuoteLineItem>>.DeepCopy(quoteLineItemList.FindAll(
_qli => (_qli.SubLineItemNumber != null && _qli.SubLineItemNumber > 0)
|| ((_qli.SubLineItemNumber == null || _qli.SubLineItemNumber == 0)
&& ((_qli.IsExcludedFromQuoteAmount == null) || (_qli.IsExcludedFromQuoteAmount == false)))));
}
}
private void RollUpSublines()
{
foreach (QuoteLineItem _line in quoteLineItemList)
{
_line.UnitPrice = GetLineListPrice(_line.Id);
_line.UnitCost = GetLinePrice(_line.Id);
_line.ExtendedAmount = GetLineNetPrice(_line.Id);
_line.ManualDiscountAmount = GetLineDiscountAmount(_line.Id);
_line.DiscountPercentage = GetLineDiscountPercent(_line.Id);
_line.Group = GetLineGroup(_line.Id);
}
}
//public bool VerifyDiscount(string quoteId, string userName)
//{
// bool retval = false;
// FilterExpression usersFilter = new FilterExpression();
// ConditionExpression userNameCondition = new ConditionExpression();
// userNameCondition.ConditionOperator = Operator.Equal;
// userNameCondition.FieldName = "";
// string[] usersFilterValues = { userName };
// userNameCondition.Values = usersFilterValues;
// ConditionExpression[] usersFilterConditions = { userNameCondition };
// usersFilter.Conditions = usersFilterConditions;
// User[] users = crmWebService.UserFind(usersFilter, null);
// User user = null;
// if (users != null && users.Count() > 0)
// {
// user = users[0];
// }
// if (user == null)
// {
// return retval;
// }
// string userType = user.Type;
// GuruAjaxServices guruAjaxService = new GuruAjaxServices();
// string ajaxControllerId = guruAjaxService.GetAjaxControllerId();
// guruAjaxService.InitializeEngine(ajaxControllerId);
// Quote quote = GetQuoteById(quoteId);
// List<QuoteLineItem> lines = GetQuoteLineItemsForQuoteId(quoteId, QuoteLineOrder.Display, true);
// return retval;
//}
public void ApplyQuoteDiscount(string discount, DiscountType discountType)
{
decimal? _quotePriceNullable;
decimal _quotePrice;
decimal _discountPct;
decimal _discountAmt;
_quotePriceNullable = GetQuoteListPrice();
_quotePrice = (_quotePriceNullable == null ? 0 : (decimal)_quotePriceNullable);
if (discount != null & discount.Trim() != "")
{
if (discountType == DiscountType.Amount)
{
_discountAmt = decimal.Parse(discount);
if (_quotePrice != 0)
{
_discountPct = Math.Round((_discountAmt / _quotePrice) * 10000) / 100;
}
else
{
_discountPct = (decimal)100.0;
}
}
else if (discountType == DiscountType.Override)
{
decimal _overrideAmt = decimal.Parse(discount);
_discountAmt = _quotePrice - _overrideAmt;
if (_quotePrice != 0)
{
_discountPct = Math.Round((_discountAmt / _quotePrice) * 10000) / 100;
}
else
{
_discountPct = (decimal)100.0;
}
}
else
{
_discountPct = decimal.Parse(discount);
_discountAmt = Math.Round(_quotePrice * (_discountPct)) / 100;
}
}
else
{
return;
}
List<QuoteLineItem> lines = GetQuoteLineItems(QuoteLineOrder.Price, false);
foreach (QuoteLineItem _line in lines)
{
if (lines.IndexOf(_line) == lines.Count - 1)
{
if (discountType == DiscountType.Percentage)
{
ApplyLineDiscount(_line.Id, _discountPct.ToString(), DiscountType.Percentage);
}
else
{
ApplyLineDiscount(_line.Id, _discountAmt.ToString(), DiscountType.Amount);
}
}
else
{
decimal? _lineDiscount = _line.UnitPrice * (((decimal?)_discountPct) / 100) * (_line.Quantity == null || _line.Quantity == 0 ? 1 : _line.Quantity);
if (discountType == DiscountType.Percentage)
{
ApplyLineDiscount(_line.Id, _discountPct.ToString(), DiscountType.Percentage);
}
else
{
ApplyLineDiscount(_line.Id, _lineDiscount.ToString(), DiscountType.Amount);
}
_discountAmt -= (decimal)_lineDiscount;
}
}
RollUpSublines();
}
public void ApplyGroupDiscount(string group, string discount, DiscountType discountType)
{
decimal? _groupPriceNullable;
decimal _groupPrice;
decimal _discountPct;
decimal _discountAmt;
_groupPriceNullable = GetGroupListPrice(group);
_groupPrice = (_groupPriceNullable == null ? 0 : (decimal)_groupPriceNullable);
if (discount != null & discount.Trim() != "")
{
if (discountType == DiscountType.Amount)
{
_discountAmt = decimal.Parse(discount);
if (_groupPrice != 0)
{
_discountPct = Math.Round((_discountAmt / _groupPrice) * 10000) / 100;
}
else
{
_discountPct = (decimal)100.0;
}
}
else if (discountType == DiscountType.Override)
{
decimal _overrideAmt = decimal.Parse(discount);
_discountAmt = _groupPrice - _overrideAmt;
if (_groupPrice != 0)
{
_discountPct = Math.Round((_discountAmt / _groupPrice) * 10000) / 100;
}
else
{
_discountPct = (decimal)100.0;
}
}
else
{
_discountPct = decimal.Parse(discount);
_discountAmt = Math.Round(_groupPrice * (_discountPct)) / 100;
}
}
else
{
return;
}
List<QuoteLineItem> lines = GetGroupLineItems(group, QuoteLineOrder.Price, false);
foreach (QuoteLineItem _line in lines)
{
if (lines.IndexOf(_line) == lines.Count - 1)
{
if (discountType == DiscountType.Percentage)
{
ApplyLineDiscount(_line.Id, _discountPct.ToString(), DiscountType.Percentage);
}
else
{
ApplyLineDiscount(_line.Id, _discountAmt.ToString(), DiscountType.Amount);
}
}
else
{
decimal? _lineDiscount = _line.UnitPrice * (((decimal?)_discountPct) / 100) * (_line.Quantity == null || _line.Quantity == 0 ? 1 : _line.Quantity);
if (discountType == DiscountType.Percentage)
{
ApplyLineDiscount(_line.Id, _discountPct.ToString(), DiscountType.Percentage);
}
else
{
ApplyLineDiscount(_line.Id, _lineDiscount.ToString(), DiscountType.Amount);
}
_discountAmt -= (decimal)_lineDiscount;
}
}
RollUpSublines();
}
public void ApplyLineDiscount(string quoteLineItemId, string discount, DiscountType discountType)
{
decimal? _linePriceNullable;
decimal _linePrice;
decimal _discountPct;
decimal _discountAmt;
_linePriceNullable = GetLineListPrice(quoteLineItemId);
_linePrice = (_linePriceNullable == null ? 0 : (decimal)_linePriceNullable);
if (discount != null & discount.Trim() != "")
{
if (discountType == DiscountType.Amount)
{
_discountAmt = decimal.Parse(discount);
if (_linePrice != 0)
{
_discountPct = Math.Round((_discountAmt / _linePrice) * 10000) / 100;
}
else
{
_discountPct = (decimal)100.0;
}
}
else if (discountType == DiscountType.Override)
{
decimal _overrideAmt = decimal.Parse(discount);
_discountAmt = _linePrice - _overrideAmt;
if (_linePrice != 0)
{
_discountPct = Math.Round((_discountAmt / _linePrice) * 10000) / 100;
}
else
{
_discountPct = (decimal)100.0;
}
}
else
{
_discountPct = decimal.Parse(discount);
_discountAmt = Math.Round(_linePrice * (_discountPct)) / 100;
}
}
else
{
return;
}
QuoteLineItem _quoteLineItem = GetQuoteLineItemById(quoteLineItemId);
List<QuoteLineItem> _sublines = GetSubLinesForLineId(quoteLineItemId, QuoteLineOrder.Price);
if ((_quoteLineItem.SubLineItemNumber == null || _quoteLineItem.SubLineItemNumber == 0) && (_sublines != null && _sublines.Count > 0))
{
foreach (QuoteLineItem _subline in _sublines)
{
if (_sublines.IndexOf(_subline) == _sublines.Count - 1)
{
if (discountType == DiscountType.Percentage)
{
ApplyLineDiscount(_subline.Id, _discountPct.ToString(), DiscountType.Percentage);
}
else
{
ApplyLineDiscount(_subline.Id, _discountAmt.ToString(), DiscountType.Amount);
}
}
else
{
decimal? _lineDiscount = _subline.UnitPrice * (((decimal?)_discountPct / 100)) * (_subline.Quantity == null || _subline.Quantity == 0 ? 1 : _subline.Quantity);
if (discountType == DiscountType.Percentage)
{
ApplyLineDiscount(_subline.Id, _discountPct.ToString(), DiscountType.Percentage);
}
else
{
ApplyLineDiscount(_subline.Id, _lineDiscount.ToString(), DiscountType.Amount);
}
_discountAmt -= (decimal)_lineDiscount;
}
}
}
else
{
_quoteLineItem.ExtendedAmount = (_quoteLineItem.UnitPrice * (_quoteLineItem.Quantity == null || _quoteLineItem.Quantity == 0 ? 1 : _quoteLineItem.Quantity)) - ((decimal?)_discountAmt);
_quoteLineItem.ManualDiscountAmount = _discountAmt;
_quoteLineItem.DiscountPercentage = null;
}
RollUpSublines();
}
public void SaveDiscounts()
{
quoteLineItemList.FindAll(
_qli => (_qli.SubLineItemNumber != null && _qli.SubLineItemNumber > 0)
|| ((_qli.SubLineItemNumber == null || _qli.SubLineItemNumber == 0)
&& ((_qli.IsExcludedFromQuoteAmount == null) || (_qli.IsExcludedFromQuoteAmount == false)))
).ForEach(_qli =>
{
if (quoteLineItemListReadOnly.Exists(_qlire => _qlire.Id == _qli.Id && _qlire.ExtendedAmount != _qli.ExtendedAmount))
{
_qli.IsPriceOverridden = true;
_qli.ExtendedAmount = _qli.UnitPrice - _qli.ManualDiscountAmount;
crmWebService.QuoteLineItemUpdate(_qli);
}
});
quoteLineItemListReadOnly = SerializationCopier<List<QuoteLineItem>>.DeepCopy(quoteLineItemList.FindAll(
_qli => (_qli.SubLineItemNumber != null && _qli.SubLineItemNumber > 0)
|| ((_qli.SubLineItemNumber == null || _qli.SubLineItemNumber == 0)
&& ((_qli.IsExcludedFromQuoteAmount == null) || (_qli.IsExcludedFromQuoteAmount == false)))));
}
public Quote GetQuote()
{
return activeQuote;
}
public Quote GetQuoteById(string quoteId)
{
Quote _retval = null;
try
{
_retval = crmWebService.QuoteGet(quoteId);
}
catch (Exception _exc)
{
}
return _retval;
}
public QuoteGroup GetGroupByGroup(string group)
{
QuoteGroup _retval = null;
QuoteGroup _group = groupList.Find(_n => _n.Group.Equals(group));
if (_group != null && _group.Id != "")
{
_retval = _group;
}
return _retval;
}
public List<QuoteLineItem> GetGroupLineItems(string groupName, QuoteLineOrder quoteLineOrder, bool includeSubLines)
{
List<QuoteLineItem> _retval = new List<QuoteLineItem>();
if (!includeSubLines)
{
List<QuoteLineItem> _filtered = quoteLineItemList.FindAll(_g => _g.Group != null && _g.Group.Equals(groupName));
//_filtered = _filtered.FindAll(lpc => lpc.UnitCost == lpc.UnitPrice);
_filtered = _filtered.FindAll(_slin => _slin.SubLineItemNumber.Equals(null));
if (_filtered != null && _filtered.Count > 0)
_retval.AddRange(_filtered);
_filtered = _filtered.FindAll(_slin => _slin.SubLineItemNumber.Equals(0));
if (_filtered != null && _filtered.Count > 0)
_retval.AddRange(_filtered);
}
else
{
_retval = quoteLineItemList.FindAll(_g => _g.Group.Equals(groupName));
}
if (quoteLineOrder == QuoteLineOrder.Display)
{
return _retval.OrderBy(lin => lin.LineItemNumber).ThenBy(slin => slin.SubLineItemNumber).ToList();
}
else if (quoteLineOrder == QuoteLineOrder.Price)
{
return _retval.OrderBy(up => up.UnitPrice).ToList();
}
else
{
return _retval;
}
}
public decimal? GetGroupPrice(string groupName)
{
decimal? _retval = 0;
List<QuoteLineItem> _lines = new List<QuoteLineItem>();
_lines = GetGroupLineItems(groupName, QuoteLineOrder.Display, false);
if (_lines != null && _lines.Count > 0)
{
foreach (QuoteLineItem _line in _lines)
{
//if (!(GetLineListPrice(_line.Id) > GetLinePrice(_line.Id)))
{
_retval += GetLinePrice(_line.Id);
}
}
}
return _retval;
}
public decimal? GetGroupListPrice(string groupName)
{
decimal? _retval = 0;
List<QuoteLineItem> _lines = new List<QuoteLineItem>();
_lines = GetGroupLineItems(groupName, QuoteLineOrder.Display, false);
if (_lines != null && _lines.Count > 0)
{
foreach (QuoteLineItem _line in _lines)
{
//if (!(GetLineListPrice(_line.Id) > GetLinePrice(_line.Id)))
{
_retval += GetLineListPrice(_line.Id);
}
}
}
return _retval;
}
public decimal? GetGroupNetPrice(string groupName)
{
decimal? _retval = 0;
List<QuoteLineItem> _lines = new List<QuoteLineItem>();
_lines = GetGroupLineItems(groupName, QuoteLineOrder.Display, false);
if (_lines != null && _lines.Count > 0)
{
foreach (QuoteLineItem _line in _lines)
{
//if (GetLineListPrice(_line.Id) <= GetLinePrice(_line.Id))
{
_retval += GetLineNetPrice(_line.Id);
}
}
}
return _retval;
}
public decimal? GetGroupDiscountAmount(string groupName)
{
decimal? _retval = 0;
List<QuoteLineItem> _lines = new List<QuoteLineItem>();
_lines = GetGroupLineItems(groupName, QuoteLineOrder.Display, false);
if (_lines != null && _lines.Count > 0)
{
foreach (QuoteLineItem _line in _lines)
{
if (!(GetLineListPrice(_line.Id) > GetLinePrice(_line.Id)))
{
_retval += GetLineDiscountAmount(_line.Id);
}
}
}
return _retval;
}
public decimal? GetGroupDiscountPercent(string groupName)
{
decimal? _retval = null;
decimal? _discount = 0;
decimal? _unitprice = 0;
List<QuoteLineItem> _lines = GetGroupLineItems(groupName, QuoteLineOrder.Display, false);
_retval = 0;
if (_lines != null && _lines.Count > 0)
{
foreach (QuoteLineItem _line in _lines)
{
_discount += GetLineDiscountAmount(_line.Id) == null ? 0 : GetLineDiscountAmount(_line.Id);
_unitprice += GetLineListPrice(_line.Id) == null ? 0 : GetLineListPrice(_line.Id);
}
_retval = (_unitprice == 0 ? 0 : _discount / _unitprice);
}
return _retval;
}
public List<QuoteLineItem> GetQuoteLineItems(QuoteLineOrder quoteLineOrder, bool includeSubLines)
{
List<QuoteLineItem> _retval = new List<QuoteLineItem>();
//List<QuoteLineItem> _filtered = quoteLineItemList.FindAll(_f => GetLineListPrice(_f.Id) == GetLinePrice(_f.Id));
List<QuoteLineItem> _filtered = quoteLineItemList;
if (!includeSubLines)
{
_filtered = _filtered.FindAll(_qlil => _qlil.SubLineItemNumber.Equals(null));
if (_filtered != null && _filtered.Count > 0)
_retval.AddRange(_filtered);
_filtered = quoteLineItemList.FindAll(_qlil => _qlil.SubLineItemNumber.Equals(0));
if (_filtered != null && _filtered.Count > 0)
_retval.AddRange(_filtered);
}
else
{
_retval = _filtered;
}
if (quoteLineOrder == QuoteLineOrder.Display)
{
return _retval.OrderBy(lin => lin.LineItemNumber).ThenBy(slin => slin.SubLineItemNumber).ToList();
}
else if (quoteLineOrder == QuoteLineOrder.Price)
{
return _retval.OrderBy(up => up.UnitPrice).ToList();
}
else
{
return _retval;
}
}
public decimal? GetQuotePrice()
{
decimal? _retval = 0;
List<QuoteLineItem> _lines = new List<QuoteLineItem>();
_lines = GetQuoteLineItems(QuoteLineOrder.Display, false);
if (_lines != null && _lines.Count > 0)
{
foreach (QuoteLineItem _line in _lines)
{
//if (!(GetLineListPrice(_line.Id) > GetLinePrice(_line.Id)))
{
_retval += GetLinePrice(_line.Id);
}
}
}
return _retval;
}
public decimal? GetQuoteListPrice()
{
decimal? _retval = 0;
List<QuoteLineItem> _lines = new List<QuoteLineItem>();
_lines = GetQuoteLineItems(QuoteLineOrder.Display, false);
if (_lines != null && _lines.Count > 0)
{
foreach (QuoteLineItem _line in _lines)
{
//if (!(GetLineListPrice(_line.Id) > GetLinePrice(_line.Id)))
{
_retval += GetLineListPrice(_line.Id);
}
}
}
return _retval;
}
public decimal? GetQuoteNetPrice()
{
decimal? _retval = 0;
List<QuoteLineItem> _lines = new List<QuoteLineItem>();
_lines = GetQuoteLineItems(QuoteLineOrder.Display, false);
if (_lines != null && _lines.Count > 0)
{
foreach (QuoteLineItem _line in _lines)
{
//if (GetLineListPrice(_line.Id) <= GetLinePrice(_line.Id))
{
_retval += GetLineNetPrice(_line.Id);
}
}
}
return _retval;
}
public decimal? GetQuoteDiscountAmount()
{
decimal? _retval = 0;
List<QuoteLineItem> _lines = GetQuoteLineItems(QuoteLineOrder.Display, false);
if (_lines != null && _lines.Count > 0)
{
_retval = 0;
foreach (QuoteLineItem _line in _lines)
{
_retval += GetLineDiscountAmount(_line.Id);
}
}
return _retval;
}
public decimal? GetQuoteDiscountPercent()
{
decimal? _retval = null;
decimal? _discount = 0;
decimal? _unitprice = 0;
List<QuoteLineItem> _lines = GetQuoteLineItems(QuoteLineOrder.Display, false);
_retval = 0;
if (_lines != null && _lines.Count > 0)
{
foreach (QuoteLineItem _line in _lines)
{
_discount += GetLineDiscountAmount(_line.Id) == null ? 0 : GetLineDiscountAmount(_line.Id);
_unitprice += GetLineListPrice(_line.Id) == null ? 0 : GetLineListPrice(_line.Id);
}
_retval = (_unitprice == 0 ? 0 : _discount / _unitprice);
} return _retval;
}
public QuoteLineItem GetQuoteLineItemById(string quoteLineItemId)
{
return quoteLineItemList.Find(_id => _id.Id.Equals(quoteLineItemId));
}
public List<QuoteLineItem> GetSubLinesForLineId(string quoteLineItemId, QuoteLineOrder quoteLineOrder)
{
List<QuoteLineItem> _retval = new List<QuoteLineItem>();
QuoteLineItem _line = quoteLineItemList.Find(qlil => qlil.Id == quoteLineItemId);
_retval = quoteLineItemList.FindAll(qlil => qlil.LineItemNumber == _line.LineItemNumber);
_retval = _retval.FindAll(_rv => _rv.SubLineItemNumber != null);
_retval = _retval.FindAll(_rv => _rv.SubLineItemNumber != 0);
//_retval = _retval.FindAll(_rv => _rv.UnitCost == _rv.UnitPrice);
if (quoteLineOrder == QuoteLineOrder.Display)
{
List<QuoteLineItem> _qli = _retval.OrderBy(lin => lin.LineItemNumber).ThenBy(slin => slin.SubLineItemNumber).ToList();
return _retval;
}
else if (quoteLineOrder == QuoteLineOrder.Price)
{
return _retval.OrderBy(up => up.UnitPrice).ToList();
}
else
{
return _retval;
}
}
public decimal? GetLinePrice(string quoteLineItemId)
{
decimal? _retval = 0;
QuoteLineItem _quoteLineItem = GetQuoteLineItemById(quoteLineItemId);
if (_quoteLineItem != null && _quoteLineItem.Id != "")
{
List<QuoteLineItem> _sublines = GetSubLinesForLineId(quoteLineItemId, QuoteLineOrder.Display);
if ((_quoteLineItem.SubLineItemNumber == null || _quoteLineItem.SubLineItemNumber == 0) && (_sublines != null && _sublines.Count > 0))
{
_retval = 0;
foreach (QuoteLineItem _subline in _sublines)
{
_retval += GetLinePrice(_subline.Id);
}
}
else
{
decimal? _listprice = GetLineListPrice(quoteLineItemId);
decimal? _discount = GetLineDiscountAmount(quoteLineItemId);
_retval = (_listprice != null ? _listprice : 0) - (_discount != null ? _discount : 0);
}
}
return _retval;
}
public decimal? GetLineListPrice(string quoteLineItemId)
{
decimal? _retval = 0;
QuoteLineItem _quoteLineItem = GetQuoteLineItemById(quoteLineItemId);
if (_quoteLineItem != null && _quoteLineItem.Id != "")
{
List<QuoteLineItem> _sublines = GetSubLinesForLineId(quoteLineItemId, QuoteLineOrder.Display);
if ((_quoteLineItem.SubLineItemNumber == null || _quoteLineItem.SubLineItemNumber == 0) && (_sublines != null && _sublines.Count > 0))
{
_retval = 0;
foreach (QuoteLineItem _subline in _sublines)
{
_retval += GetLineListPrice(_subline.Id);
}
}
else
{
_retval = _quoteLineItem.UnitPrice != null ? _quoteLineItem.UnitPrice : 0;
}
}
return _retval;
}
public decimal? GetLineNetPrice(string quoteLineItemId)
{
decimal? _retval = 0;
QuoteLineItem _quoteLineItem = GetQuoteLineItemById(quoteLineItemId);
if (_quoteLineItem != null && _quoteLineItem.Id != "")
{
List<QuoteLineItem> _sublines = GetSubLinesForLineId(quoteLineItemId, QuoteLineOrder.Display);
if ((_quoteLineItem.SubLineItemNumber == null || _quoteLineItem.SubLineItemNumber == 0) && (_sublines != null && _sublines.Count > 0))
{
_retval = 0;
foreach (QuoteLineItem _subline in _sublines)
{
_retval += GetLineNetPrice(_subline.Id);
}
}
else
{
_retval = _quoteLineItem.ExtendedAmount != null ? _quoteLineItem.ExtendedAmount : 0;
}
}
return _retval;
}
public decimal? GetLineDiscountAmount(string quoteLineItemId)
{
decimal? _retval = 0;
QuoteLineItem _quoteLineItem = GetQuoteLineItemById(quoteLineItemId);
if (_quoteLineItem != null && _quoteLineItem.Id != "")
{
List<QuoteLineItem> _sublines = GetSubLinesForLineId(quoteLineItemId, QuoteLineOrder.Display);
if ((_quoteLineItem.SubLineItemNumber == null || _quoteLineItem.SubLineItemNumber == 0) && (_sublines != null && _sublines.Count > 0))
{
_retval = 0;
foreach (QuoteLineItem _subline in _sublines)
{
_retval += GetLineDiscountAmount(_subline.Id);
}
}
else
{
_retval = _quoteLineItem.ManualDiscountAmount != null ? _quoteLineItem.ManualDiscountAmount : 0;
}
}
return _retval;
}
public decimal? GetLineDiscountPercent(string quoteLineItemId)
{
decimal? _discount = 0;
decimal? _listprice = 0;
decimal? _retval = null;
QuoteLineItem _quoteLineItem = GetQuoteLineItemById(quoteLineItemId);
if (_quoteLineItem != null && _quoteLineItem.Id != "")
{
_discount = GetLineDiscountAmount(quoteLineItemId) == null ? 0 : GetLineDiscountAmount(quoteLineItemId);
_listprice = GetLineListPrice(quoteLineItemId) == null ? 0 : GetLineListPrice(quoteLineItemId);
_retval = (_listprice == 0 ? 0 : _discount / _listprice);
}
return _retval;
}
private string GetLineGroup(string quoteLineItemId)
{
QuoteLineItem _quoteLineItem = GetQuoteLineItemById(quoteLineItemId);
return _quoteLineItem.Group;
}
}
}