public static void Main()
this.InstanceId = "APP_Proc_" + DateTime.Now.ToString("MMM dd yyyy");
Log("Initiating average part price process, append is " + append.ToString());
PartSvcContract partSvc = ServiceRenderer.GetService<PartSvcContract>(Db);
OrderDtlSearchSvcContract orderDtlSearchSvc = ServiceRenderer.GetService<OrderDtlSearchSvcContract>(Db);
PartListTableset partsList = partSvc.GetList("MtlAnalysisCode = '9' or MtlAnalysisCode = '14' or MtlAnalysisCode = '17'", 0, 0, out morePages);
Log("About to loop over part list");
foreach (PartListRow partListRow in partsList.PartList)
Log("Getting by ID for part " + partListRow.PartNum.ToString());
PartTableset parts = partSvc.GetByID(partListRow.PartNum);
PartRow part = parts.Part.FirstOrDefault();
DateTime yesterday = DateTime.Now.AddDays(-1);
Decimal netPriceTotal = 0;
Log("Getting order detials for part " + part.PartNum.ToString());
var orderDtls = (from row in Db.OrderDtl where row.Company == Session.CompanyID && row.PartNum == part.PartNum && row.RequestDate == yesterday && row.SellingQuantity > 0 select row);
if (orderDtls.Count() > 0)
Log("Order detail count: " + orderDtls.Count().ToString());
foreach (var orderDtl in orderDtls)
netPriceTotal += (orderDtl.DocUnitPrice - (orderDtl.DocDiscount / orderDtl.SellingQuantity)) * orderDtl.SellingQuantity;
unitsTotal += orderDtl.SellingQuantity;
Log("Calculating average price");
part["NetPriceTotal_c"] = netPriceTotal + (decimal)part["NetPriceTotal_c"];
part["UnitsTotal_c"] = unitsTotal + (decimal)part["UnitsTotal_c"];
part["AvgPrice_c"] = (decimal)part["NetPriceTotal_c"] / (decimal)part["UnitsTotal_c"];
part["AvgPriceRunDate_c"] = yesterday;
Log("About to update part " + part.PartNum.ToString());
partSvc.Update(ref parts);
while (start < DateTime.Now)
DateTime next = start.AddMonths(1) < DateTime.Now ? start.AddMonths(1) : DateTime.Now;
Log("Getting order details for part " + part.PartNum.ToString() + "from " + start.ToString() + " to " + next.ToString());
var orderDtls = (from row in Db.OrderDtl where row.Company == Session.CompanyID && row.PartNum == part.PartNum && row.RequestDate >= start && row.RequestDate < next && row.SellingQuantity > 0 select row);
if (orderDtls.Count() > 0)
foreach (var orderDtl in orderDtls)
Log("Order detail count: " + orderDtls.Count().ToString());
netPriceTotal += (orderDtl.DocUnitPrice - (orderDtl.DocDiscount / orderDtl.SellingQuantity)) * orderDtl.SellingQuantity;
unitsTotal += orderDtl.SellingQuantity;
start = start.AddMonths(1);
Log("Calculating average price");
part["NetPriceTotal_c"] = netPriceTotal;
part["UnitsTotal_c"] = unitsTotal;
part["AvgPrice_c"] = netPriceTotal / unitsTotal;
part["AvgPriceCalcDate_c"] = date;
part["AvgPriceRunDate_c"] = yesterday;
Log("About to update part " + part.PartNum.ToString());
partSvc.Update(ref parts);