This commit is contained in:
2021-07-28 15:28:09 +00:00
parent bc96af14f4
commit bf490dbaf8
3 changed files with 445 additions and 17 deletions

View File

@@ -0,0 +1,12 @@
namespace AyaNova.Biz
{
public enum PMTimeUnit : int
{
Minutes = 2,
Hours = 3,
Days = 4,
Months = 6,
Years = 7
}
}//eons

View File

@@ -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;

View File

@@ -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;
}
//////////////////////////////////////////////////////////////////////////////////////////////////