This commit is contained in:
12
server/AyaNova/biz/PMTimeUnit.cs
Normal file
12
server/AyaNova/biz/PMTimeUnit.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
namespace AyaNova.Biz
|
||||
{
|
||||
|
||||
public enum PMTimeUnit : int
|
||||
{
|
||||
Minutes = 2,
|
||||
Hours = 3,
|
||||
Days = 4,
|
||||
Months = 6,
|
||||
Years = 7
|
||||
}
|
||||
}//eons
|
||||
@@ -26,8 +26,10 @@ namespace AyaNova.Models
|
||||
public bool[] ExcludeDaysOfWeek { get; set; }//Monday to Sunday (0-6 index)
|
||||
public bool Active { get; set; }
|
||||
public DateTime NextServiceDate { get; set; }
|
||||
public TimeSpan Repeat { get; set; }//was generate span
|
||||
public TimeSpan GenerateBefore { get; set; }//was threshold span
|
||||
public PMTimeUnit RepeatUnit { get; set; }
|
||||
public PMTimeUnit GenerateBeforeUnit { get; set; }
|
||||
public int RepeatInterval { get; set; }
|
||||
public int GenerateBeforeInterval { get; set; }
|
||||
public DateTime? GenerateDate { get; set; }//Internal, not exposed to UI and is the date to do the next generate on that takes into account generatebefore and next service date and is calcd when generate happens for next time see pmbiz top with reference v7 code
|
||||
//----
|
||||
|
||||
@@ -73,7 +75,7 @@ namespace AyaNova.Models
|
||||
|
||||
|
||||
//UTILITY FIELDS
|
||||
|
||||
|
||||
[NotMapped]
|
||||
public string AlertViz { get; set; } = null;
|
||||
|
||||
|
||||
@@ -3664,23 +3664,437 @@ namespace AyaNova.Util
|
||||
|
||||
|
||||
|
||||
private long GetRandomUnitForCustomer(long customerId)
|
||||
|
||||
|
||||
/*
|
||||
██████╗ ███╗ ███╗
|
||||
██╔══██╗████╗ ████║
|
||||
██████╔╝██╔████╔██║
|
||||
██╔═══╝ ██║╚██╔╝██║
|
||||
██║ ██║ ╚═╝ ██║
|
||||
╚═╝ ╚═╝ ╚═╝
|
||||
*/
|
||||
private int TotalSeededPMs = 0;
|
||||
//////////////////////////////////////////////////////
|
||||
//PM
|
||||
//
|
||||
public async Task SeedPMAsync(ILogger log, int count)
|
||||
{
|
||||
var l = CustomerUnits.Where(x => x.Key == customerId).FirstOrDefault();//Fake.Random.Long(1, TotalSeededUnits);
|
||||
var numUnits = l.Value.Count();
|
||||
//because faker values are INCLUSIVE and this is going to be used as an index on an array need to -1 each end of the range
|
||||
var i = Fake.Random.Int(0, numUnits - 1);
|
||||
return l.Value[i];
|
||||
DateTime seedStartWindow = DateTime.UtcNow;
|
||||
DateTime seedEndWindow = DateTime.UtcNow.AddDays(3);
|
||||
for (int x = 0; x < count; x++)
|
||||
{
|
||||
PM o = new PM();
|
||||
o.Notes = Fake.Lorem.Sentence();
|
||||
o.Tags = RandomTags();
|
||||
if (Fake.Random.Bool())//50% have projects
|
||||
o.ProjectId = Fake.Random.Long(1, TotalSeededProjects);
|
||||
var tempDate = Fake.Date.Between(seedStartWindow, seedEndWindow);
|
||||
var tempHour = Fake.Random.Int(9, 17);//9am to 5 pm (except some times may be in different dst state so this will be out by an hour for example depending on time of year and time zone in question)
|
||||
var woDate = DesiredTimeInUtc(new DateTime(tempDate.Year, tempDate.Month, tempDate.Day, tempHour, 0, 0));
|
||||
|
||||
o.CreatedDate = DateTime.UtcNow;
|
||||
|
||||
o.CustomerId = GetRandomCustomerId();//Fake.Random.Long(1, TotalSeededCustomers);
|
||||
|
||||
//------
|
||||
o.StopGeneratingDate=woDate.AddYears(1);
|
||||
o.ExcludeDaysOfWeek= new bool[]{true,true,true,true,true,false,false};//Monday to Sunday (0-6 index)
|
||||
o.Active=true;
|
||||
o.NextServiceDate=woDate.AddDays(1);
|
||||
o.Repeat=new TimeSpan()
|
||||
// public TimeSpan Repeat { get; set; }//was generate span
|
||||
// public TimeSpan GenerateBefore { get; set; }//was threshold span
|
||||
// public DateTime? GenerateDate { get; set; }//Internal, not exposed to UI and is the date to do the next generate on that takes into account generatebefore and next service date and is calcd when generate happens for next time see pmbiz top with reference v7 code
|
||||
//------
|
||||
|
||||
|
||||
using (AyContext ct = ServiceProviderProvider.DBContext)
|
||||
{
|
||||
var cust = await ct.Customer.AsNoTracking().FirstAsync(z => z.Id == o.CustomerId);
|
||||
o.Latitude = cust.Latitude;
|
||||
o.Longitude = cust.Longitude;
|
||||
o.Address = cust.Address;
|
||||
o.City = cust.City;
|
||||
o.Region = cust.Region;
|
||||
o.Country = cust.Country;
|
||||
|
||||
|
||||
if (cust.BillHeadOffice && cust.HeadOfficeId != null)
|
||||
{
|
||||
var head = await ct.HeadOffice.AsNoTracking().FirstAsync(z => z.Id == cust.HeadOfficeId);
|
||||
o.PostAddress = head.PostAddress;
|
||||
o.PostCity = head.PostCity;
|
||||
o.PostRegion = head.PostRegion;
|
||||
o.PostCountry = head.PostCountry;
|
||||
o.PostCode = head.PostCode;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
o.PostAddress = cust.PostAddress;
|
||||
o.PostCity = cust.PostCity;
|
||||
o.PostRegion = cust.PostRegion;
|
||||
o.PostCountry = cust.PostCountry;
|
||||
o.PostCode = cust.PostCode;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
o.CustomerReferenceNumber = "crf-" + Fake.Finance.Account(4);
|
||||
o.InternalReferenceNumber = "irf-" + Fake.Finance.Account(4);
|
||||
//o.ServiceDate = woDate;
|
||||
|
||||
int woItemCount = Fake.Random.Int(1, 2);
|
||||
for (int y = 0; y < woItemCount; y++)
|
||||
{
|
||||
var woItem = new PMItem()
|
||||
{
|
||||
Sequence = y + 1,
|
||||
Notes = $"itemnotes - {y} ",
|
||||
TechNotes = $"technotes - {y}",
|
||||
RequestDate = woDate.AddMinutes(y),
|
||||
WorkOrderItemPriorityId = Fake.Random.Long(1, 5),//there are 5 different sample priorities
|
||||
WorkOrderItemStatusId = Fake.Random.Long(1, 3)//there are 3 different sample woitem status
|
||||
};
|
||||
|
||||
//UNITS
|
||||
var woItemUnit = new PMItemUnit()
|
||||
{
|
||||
UnitId = GetRandomUnitForCustomer(o.CustomerId),
|
||||
Notes = Fake.Lorem.Sentence()
|
||||
};
|
||||
woItem.Units.Add(woItemUnit);
|
||||
|
||||
woItemUnit = new PMItemUnit()
|
||||
{
|
||||
UnitId = GetRandomUnitForCustomer(o.CustomerId),
|
||||
Notes = Fake.Lorem.Sentence()
|
||||
};
|
||||
woItem.Units.Add(woItemUnit);
|
||||
|
||||
//SCHEDULED USERS
|
||||
var woItemScheduledUser = new PMItemScheduledUser()
|
||||
{
|
||||
UserId = RandomServiceTechUserId(),
|
||||
EstimatedQuantity = 1,
|
||||
StartDate = woDate,
|
||||
StopDate = woDate.AddHours(1)
|
||||
};
|
||||
woItem.ScheduledUsers.Add(woItemScheduledUser);
|
||||
|
||||
|
||||
woItemScheduledUser = new PMItemScheduledUser()
|
||||
{
|
||||
UserId = RandomServiceTechUserId(),
|
||||
EstimatedQuantity = 2,
|
||||
StartDate = woDate,
|
||||
StopDate = woDate.AddHours(1)
|
||||
};
|
||||
woItem.ScheduledUsers.Add(woItemScheduledUser);
|
||||
|
||||
if (y == 1)
|
||||
{
|
||||
//known tech and subcontractor on every item
|
||||
woItemScheduledUser = new PMItemScheduledUser()
|
||||
{
|
||||
UserId = KnownUserTechId,
|
||||
EstimatedQuantity = 2,
|
||||
StartDate = woDate,
|
||||
StopDate = woDate.AddHours(2)
|
||||
};
|
||||
woItem.ScheduledUsers.Add(woItemScheduledUser);
|
||||
|
||||
woItemScheduledUser = new PMItemScheduledUser()
|
||||
{
|
||||
UserId = KnownUserSubContractorId,
|
||||
EstimatedQuantity = 2,
|
||||
StartDate = woDate,
|
||||
StopDate = woDate.AddHours(2)
|
||||
};
|
||||
woItem.ScheduledUsers.Add(woItemScheduledUser);
|
||||
}
|
||||
|
||||
if (y == 3)
|
||||
{
|
||||
//known restricted tech and subcontractor on some items
|
||||
woItemScheduledUser = new PMItemScheduledUser()
|
||||
{
|
||||
UserId = KnownUserTechRestrictedId,
|
||||
EstimatedQuantity = 2,
|
||||
StartDate = woDate,
|
||||
StopDate = woDate.AddHours(2)
|
||||
};
|
||||
woItem.ScheduledUsers.Add(woItemScheduledUser);
|
||||
|
||||
woItemScheduledUser = new PMItemScheduledUser()
|
||||
{
|
||||
UserId = KnownUserSubContractorRestrictedId,
|
||||
EstimatedQuantity = 2,
|
||||
StartDate = woDate,
|
||||
StopDate = woDate.AddHours(2)
|
||||
};
|
||||
woItem.ScheduledUsers.Add(woItemScheduledUser);
|
||||
}
|
||||
|
||||
//PARTS
|
||||
var woItemPart = new PMItemPart()
|
||||
{
|
||||
|
||||
Quantity = 1,
|
||||
PartId = Fake.Random.Long(1, TotalSeededParts),
|
||||
PartWarehouseId = 1
|
||||
};
|
||||
woItem.Parts.Add(woItemPart);
|
||||
|
||||
woItemPart = new PMItemPart()
|
||||
{
|
||||
|
||||
Quantity = 1,
|
||||
PartId = Fake.Random.Long(1, TotalSeededParts),
|
||||
PartWarehouseId = 1
|
||||
};
|
||||
woItem.Parts.Add(woItemPart);
|
||||
|
||||
|
||||
|
||||
//LOANERS
|
||||
var woItemLoan = new PMItemLoan()
|
||||
{
|
||||
OutDate = woDate.AddHours(1),
|
||||
DueDate = woDate.AddHours(4),
|
||||
Quantity = 4,
|
||||
Rate = LoanUnitRateUnit.Hours,
|
||||
LoanUnitId = Fake.Random.Long(1, TotalSeededLoanUnits)
|
||||
};
|
||||
woItem.Loans.Add(woItemLoan);
|
||||
|
||||
woItemLoan = new PMItemLoan()
|
||||
{
|
||||
OutDate = woDate.AddHours(2),
|
||||
DueDate = woDate.AddHours(3),
|
||||
Quantity = 1,
|
||||
Rate = LoanUnitRateUnit.Hours,
|
||||
LoanUnitId = Fake.Random.Long(1, TotalSeededLoanUnits)
|
||||
};
|
||||
woItem.Loans.Add(woItemLoan);
|
||||
|
||||
|
||||
//LABOR
|
||||
var techId = RandomServiceTechUserId();
|
||||
var woItemLabor = new PMItemLabor()
|
||||
{
|
||||
UserId = techId,
|
||||
ServiceRateQuantity = 1,
|
||||
ServiceStartDate = woDate,
|
||||
ServiceStopDate = woDate.AddHours(1),
|
||||
ServiceRateId = Fake.Random.Long(1, TotalSeededServiceRates),
|
||||
ServiceDetails = Fake.Lorem.Sentence()
|
||||
};
|
||||
woItem.Labors.Add(woItemLabor);
|
||||
|
||||
woItemLabor = new PMItemLabor()
|
||||
{
|
||||
UserId = RandomServiceTechUserId(),
|
||||
ServiceRateQuantity = 2,
|
||||
ServiceStartDate = woDate,
|
||||
ServiceStopDate = woDate.AddHours(1),
|
||||
ServiceRateId = Fake.Random.Long(1, TotalSeededServiceRates),
|
||||
ServiceDetails = Fake.Lorem.Sentence()
|
||||
};
|
||||
woItem.Labors.Add(woItemLabor);
|
||||
|
||||
|
||||
//TRAVEL
|
||||
var woItemTravel = new PMItemTravel()
|
||||
{
|
||||
UserId = techId,
|
||||
TravelRateQuantity = 1,
|
||||
TravelStartDate = woDate,
|
||||
TravelStopDate = woDate.AddHours(1),
|
||||
TravelRateId = Fake.Random.Long(1, TotalSeededTravelRates),
|
||||
TravelDetails = Fake.Lorem.Sentence(),
|
||||
Distance = Fake.Random.Decimal(1.0m, 20.0m)
|
||||
};
|
||||
woItem.Travels.Add(woItemTravel);
|
||||
|
||||
woItemTravel = new PMItemTravel()
|
||||
{
|
||||
UserId = RandomServiceTechUserId(),
|
||||
TravelRateQuantity = 2,
|
||||
TravelStartDate = woDate,
|
||||
TravelStopDate = woDate.AddHours(1),
|
||||
TravelRateId = Fake.Random.Long(1, TotalSeededTravelRates),
|
||||
TravelDetails = Fake.Lorem.Sentence(),
|
||||
Distance = Fake.Random.Decimal(1.0m, 20.0m)
|
||||
};
|
||||
woItem.Travels.Add(woItemTravel);
|
||||
|
||||
//TASKS
|
||||
var woItemTask = new PMItemTask()
|
||||
{
|
||||
CompletedByUserId = techId,
|
||||
Task = "Dis-assemble",
|
||||
Sequence = 1,
|
||||
Status = WorkorderItemTaskCompletionType.Incomplete
|
||||
};
|
||||
woItem.Tasks.Add(woItemTask);
|
||||
|
||||
woItemTask = new PMItemTask()
|
||||
{
|
||||
CompletedByUserId = techId,
|
||||
Task = "Lubricate",
|
||||
Sequence = 2,
|
||||
Status = WorkorderItemTaskCompletionType.Incomplete
|
||||
};
|
||||
woItem.Tasks.Add(woItemTask);
|
||||
|
||||
|
||||
woItemTask = new PMItemTask()
|
||||
{
|
||||
CompletedByUserId = techId,
|
||||
Task = "Repair",
|
||||
Sequence = 3,
|
||||
Status = WorkorderItemTaskCompletionType.Incomplete
|
||||
};
|
||||
woItem.Tasks.Add(woItemTask);
|
||||
|
||||
woItemTask = new PMItemTask()
|
||||
{
|
||||
CompletedByUserId = techId,
|
||||
Task = "Re-assemble",
|
||||
Sequence = 4,
|
||||
Status = WorkorderItemTaskCompletionType.Incomplete
|
||||
};
|
||||
woItem.Tasks.Add(woItemTask);
|
||||
|
||||
woItemTask = new PMItemTask()
|
||||
{
|
||||
CompletedByUserId = techId,
|
||||
Task = "Test and confirm repair",
|
||||
Sequence = 5,
|
||||
Status = WorkorderItemTaskCompletionType.Incomplete
|
||||
};
|
||||
woItem.Tasks.Add(woItemTask);
|
||||
|
||||
|
||||
|
||||
|
||||
//EXPENSES
|
||||
var cost = Fake.Random.Decimal(1, 10);
|
||||
var woItemExpense = new PMItemExpense()
|
||||
{
|
||||
UserId = RandomServiceTechUserId(),
|
||||
//TotalCost = cost,
|
||||
ChargeAmount = cost * 1.2m,
|
||||
ChargeToCustomer = true,
|
||||
ReimburseUser = true,
|
||||
ChargeTaxCodeId = TCGoods,
|
||||
Name = Fake.Commerce.ProductName()
|
||||
|
||||
};
|
||||
woItem.Expenses.Add(woItemExpense);
|
||||
|
||||
woItemExpense = new PMItemExpense()
|
||||
{
|
||||
UserId = RandomServiceTechUserId(),
|
||||
// TotalCost = cost * 2m,
|
||||
ChargeAmount = cost * 2.2m,
|
||||
ChargeToCustomer = true,
|
||||
ReimburseUser = true,
|
||||
ChargeTaxCodeId = TCGoods,
|
||||
Name = Fake.Commerce.ProductName()
|
||||
|
||||
};
|
||||
woItem.Expenses.Add(woItemExpense);
|
||||
|
||||
|
||||
//OUTSIDE SERVICES
|
||||
var ShippingCost = Fake.Random.Decimal(5, 20);
|
||||
var RepairCost = Fake.Random.Decimal(50, 1000);
|
||||
var woItemOutsideService = new PMItemOutsideService()
|
||||
{
|
||||
UnitId = GetRandomUnitForCustomer(o.CustomerId),
|
||||
Notes = Fake.Lorem.Sentence(),
|
||||
VendorSentToId = Fake.Random.Long(1, TotalSeededVendors),
|
||||
VendorSentViaId = Fake.Random.Long(1, TotalSeededVendors),
|
||||
RMANumber = "RMA" + Fake.Finance.Account(6),
|
||||
TrackingNumber = "TR" + Fake.Finance.Account(8),
|
||||
RepairCost = RepairCost,
|
||||
RepairPrice = RepairCost * 1.5m,
|
||||
ShippingCost = ShippingCost,
|
||||
ShippingPrice = ShippingCost * 1.5m,
|
||||
SentDate = woDate,
|
||||
ETADate = woDate.AddDays(7),
|
||||
ReturnDate = woDate.AddDays(8),
|
||||
TaxCodeId = 1
|
||||
};
|
||||
woItem.OutsideServices.Add(woItemOutsideService);
|
||||
|
||||
ShippingCost = Fake.Random.Decimal(5, 20);
|
||||
RepairCost = Fake.Random.Decimal(50, 1000);
|
||||
woItemOutsideService = new PMItemOutsideService()
|
||||
{
|
||||
UnitId = GetRandomUnitForCustomer(o.CustomerId),
|
||||
Notes = Fake.Lorem.Sentence(),
|
||||
VendorSentToId = Fake.Random.Long(1, TotalSeededVendors),
|
||||
VendorSentViaId = Fake.Random.Long(1, TotalSeededVendors),
|
||||
RMANumber = "RMA" + Fake.Finance.Account(6),
|
||||
TrackingNumber = "TR" + Fake.Finance.Account(8),
|
||||
RepairCost = RepairCost,
|
||||
RepairPrice = RepairCost * 1.5m,
|
||||
ShippingCost = ShippingCost,
|
||||
ShippingPrice = ShippingCost * 1.5m,
|
||||
SentDate = woDate,
|
||||
ETADate = woDate.AddDays(7),
|
||||
ReturnDate = woDate.AddDays(8),
|
||||
TaxCodeId = 1
|
||||
};
|
||||
woItem.OutsideServices.Add(woItemOutsideService);
|
||||
|
||||
o.Items.Add(woItem);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//This seems wrong to do in a loop but is 4 times faster this way ?!?
|
||||
using (AyContext ct = ServiceProviderProvider.DBContext)
|
||||
{
|
||||
PMBiz biz = PMBiz.GetBiz(ct);
|
||||
var NewObject = await biz.PMCreateAsync(o, false);
|
||||
TotalSeededPMs++;
|
||||
if (NewObject == null)
|
||||
{
|
||||
var err = $"Seeder::SeedPM error creating {o.Serial}\r\n{biz.GetErrorsAsString()}";
|
||||
log.LogError(err);
|
||||
throw new System.Exception(err);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private long GetRandomCustomerId()
|
||||
{
|
||||
//return any random customer except for the shadow unit one
|
||||
long ret = KnownCustomerForShadownUnitsId;
|
||||
while (ret == KnownCustomerForShadownUnitsId)
|
||||
ret = Fake.Random.Long(1, TotalSeededCustomers);
|
||||
return ret;
|
||||
}
|
||||
//---------------------- /PM ------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
private long GetRandomUnitForCustomer(long customerId)
|
||||
{
|
||||
var l = CustomerUnits.Where(x => x.Key == customerId).FirstOrDefault();//Fake.Random.Long(1, TotalSeededUnits);
|
||||
var numUnits = l.Value.Count();
|
||||
//because faker values are INCLUSIVE and this is going to be used as an index on an array need to -1 each end of the range
|
||||
var i = Fake.Random.Int(0, numUnits - 1);
|
||||
return l.Value[i];
|
||||
}
|
||||
|
||||
private long GetRandomCustomerId()
|
||||
{
|
||||
//return any random customer except for the shadow unit one
|
||||
long ret = KnownCustomerForShadownUnitsId;
|
||||
while (ret == KnownCustomerForShadownUnitsId)
|
||||
ret = Fake.Random.Long(1, TotalSeededCustomers);
|
||||
return ret;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
Reference in New Issue
Block a user