public IEnumerable <Event> PlanMaintenanceJob(PlanMaintenanceJob command) { // check business rules // maintenance jobs may not span multiple days if (command.StartTime.Date != command.EndTime.Date) { throw new BusinessRuleViolationException("Start-time and end-time of a Maintenance Job must be within a 1 day."); } // no more than 3 jobs can be planned at the same time (limited resources) if (Jobs.Count(j => (j.StartTime >= command.StartTime && j.StartTime <= command.EndTime) || (j.EndTime >= command.StartTime && j.EndTime <= command.EndTime)) >= MAX_PARALLEL_JOBS) { throw new BusinessRuleViolationException($"Maintenancejob overlaps with more than {MAX_PARALLEL_JOBS} other jobs."); } // only 1 maintenance job can be executed on a vehicle during a certain time-slot if (Jobs.Any(j => j.Vehicle.Matricula == command.VehicleInfo.Matricula && (j.StartTime >= command.StartTime && j.StartTime <= command.EndTime || j.EndTime >= command.StartTime && j.EndTime <= command.EndTime))) { throw new BusinessRuleViolationException($"Only 1 maintenance job can be executed on a vehicle during a certain time-slot."); } // handle event MaintenanceJobPlanned e = Mapper.Map <MaintenanceJobPlanned>(command); return(HandleEvent(e)); }
private async Task <bool> HandleAsync(MaintenanceJobPlanned e) { Log.Information("Register Maintenance Job: {JobId}, {StartTime}, {EndTime}, {CustomerName}, {LicenseNumber}", e.JobId, e.StartTime, e.EndTime, e.CustomerInfo.Name, e.VehicleInfo.LicenseNumber); try { using (var transaction = await _dbContext.Database.BeginTransactionAsync()) { // determine customer Customer customer = await _dbContext.Customers.FirstOrDefaultAsync(c => c.CustomerId == e.CustomerInfo.Id); if (customer == null) { customer = new Customer { CustomerId = e.CustomerInfo.Id, Name = e.CustomerInfo.Name, TelephoneNumber = e.CustomerInfo.TelephoneNumber }; } // determine vehicle Vehicle vehicle = await _dbContext.Vehicles.FirstOrDefaultAsync(v => v.LicenseNumber == e.VehicleInfo.LicenseNumber); if (vehicle == null) { vehicle = new Vehicle { LicenseNumber = e.VehicleInfo.LicenseNumber, Brand = e.VehicleInfo.Brand, Type = e.VehicleInfo.Type, OwnerId = customer.CustomerId }; } // insert maintetancejob await _dbContext.MaintenanceJobs.AddAsync(new MaintenanceJob { Id = e.JobId, StartTime = e.StartTime, EndTime = e.EndTime, Customer = customer, Vehicle = vehicle, WorkshopPlanningDate = e.StartTime.Date, Description = e.Description }); await _dbContext.SaveChangesAsync(); await transaction.CommitAsync(); } } catch (DbUpdateException) { Log.Warning("Skipped adding maintenance job with id {JobId}.", e.JobId); } return(true); }
private async Task <bool> HandleCommand(string calendarId, MaintenanceJobPlanned newEvent) { WorkshopCalendarEvent calendarEvent = new WorkshopCalendarEvent() { Id = newEvent.JobId, EventDate = calendarId, CustomerId = newEvent.CustomerInfo.Id, VehicleLicenseNumber = newEvent.VehicleInfo.LicenseNumber, Description = newEvent.Description, Note = newEvent.Description, PlannedEndDateTime = newEvent.StartTime, PlannedStartDateTime = newEvent.EndTime, ActualStartDateTime = new DateTime(), ActualEndDateTime = new DateTime(), MessageType = newEvent.MessageType }; try { await _context.WorkshopCalendarEvents.InsertOneAsync(calendarEvent); return(true); } catch (Exception ex) { throw ex; } }
private void Handle(MaintenanceJobPlanned e) { MaintenanceJob job = new MaintenanceJob(); Customer customer = new Customer(e.CustomerInfo.Id, e.CustomerInfo.Name, e.CustomerInfo.TelephoneNumber); Vehicle vehicle = new Vehicle(e.VehicleInfo.LicenseNumber, e.VehicleInfo.Brand, e.VehicleInfo.Type, customer.Id); job.Plan(e.JobId, e.StartTime, e.EndTime, vehicle, customer, e.Description); Jobs.Add(job); }
private IEnumerable <Event> Handle(MaintenanceJobPlanned e) { MaintenanceJob job = new MaintenanceJob(); Customer customer = new Customer(e.CustomerInfo.Id, e.CustomerInfo.Nombre, e.CustomerInfo.Telefono); Vehicle vehicle = new Vehicle(e.VehicleInfo.Matricula, e.VehicleInfo.Marca, e.VehicleInfo.Modelo, customer.CustomerId); job.Plan(e.JobId, e.StartTime, e.EndTime, vehicle, customer, e.Description); Jobs.Add(job); return(new Event[] { e }); }
private async Task <bool> HandleAsync(MaintenanceJobPlanned e) { Log.Information("Maintenance job planned: {JobId}, {StartTime}, {EndTime}, {CustomerName}, {LicenseNumber}", e.JobId, e.StartTime, e.EndTime, e.CustomerInfo.Nombre, e.VehicleInfo.Matricula); try { // determine customer Customer customer = await _dbContext.Customers.FirstOrDefaultAsync(c => c.CustomerId == e.CustomerInfo.Id); if (customer == null) { customer = new Customer { CustomerId = e.CustomerInfo.Id, Nombre = e.CustomerInfo.Nombre, Telefono = e.CustomerInfo.Telefono }; } // determine vehicle Vehicle vehicle = await _dbContext.Vehicles.FirstOrDefaultAsync(v => v.Matricula == e.VehicleInfo.Matricula); if (vehicle == null) { vehicle = new Vehicle { Matricula = e.VehicleInfo.Matricula, Marca = e.VehicleInfo.Marca, Modelo = e.VehicleInfo.Modelo, OwnerId = customer.CustomerId }; } // insert maintetancejob await _dbContext.MaintenanceJobs.AddAsync(new MaintenanceJob { Id = e.JobId, StartTime = e.StartTime, EndTime = e.EndTime, Customer = customer, Vehicle = vehicle, WorkshopPlanningDate = e.StartTime.Date, Description = e.Description }); await _dbContext.SaveChangesAsync(); } catch (DbUpdateException) { Log.Warning("Skipped adding maintenance job with id {JobId}.", e.JobId); } return(true); }
private async Task <bool> HandleAsync(MaintenanceJobPlanned e) { Console.WriteLine($"Maintenance job planned: JobId = {e.JobId}, StartTime = {e.StartTime}, EndTime = {e.EndTime}, Customer = {e.CustomerInfo.Name}, Vehicle = {e.VehicleInfo.LicenseNumber}"); try { // determine customer Customer customer = await _dbContext.Customers.FirstOrDefaultAsync(c => c.CustomerId == e.CustomerInfo.Id); if (customer == null) { customer = new Customer { CustomerId = e.CustomerInfo.Id, Name = e.CustomerInfo.Name, TelephoneNumber = e.CustomerInfo.TelephoneNumber }; } // determine vehicle Vehicle vehicle = await _dbContext.Vehicles.FirstOrDefaultAsync(v => v.LicenseNumber == e.VehicleInfo.LicenseNumber); if (vehicle == null) { vehicle = new Vehicle { LicenseNumber = e.VehicleInfo.LicenseNumber, Brand = e.VehicleInfo.Brand, Type = e.VehicleInfo.Type, OwnerId = customer.CustomerId }; } // insert maintetancejob await _dbContext.MaintenanceJobs.AddAsync(new MaintenanceJob { Id = e.JobId, StartTime = e.StartTime, EndTime = e.EndTime, Customer = customer, Vehicle = vehicle, WorkshopPlanningDate = e.StartTime.Date, Description = e.Description }); await _dbContext.SaveChangesAsync(); } catch (DbUpdateException) { Console.WriteLine($"Skipped adding maintenance job with id {e.JobId}."); } return(true); }
private IEnumerable <Event> Handle(MaintenanceJobPlanned e) { MaintenanceJob job = new MaintenanceJob(); Customer customer = new Customer(e.CustomerInfo.Id, e.CustomerInfo.Name, e.CustomerInfo.TelephoneNumber); Vehicle vehicle = new Vehicle(e.VehicleInfo.LicenseNumber, e.VehicleInfo.Brand, e.VehicleInfo.Type, customer.CustomerId); job.Plan(e.JobId, e.StartTime, e.EndTime, vehicle, customer, e.Description); Jobs.Add(job); return(new List <Event>(new Event[] { e })); }
public void PlanMaintenanceJob(PlanMaintenanceJob command) { // check business rules command.PlannedMaintenanceJobShouldFallWithinOneBusinessDay(); this.NumberOfParallelMaintenanceJobsMustNotExceedAvailableWorkStations(command); this.NumberOfParallelMaintenanceJobsOnAVehicleMustNotExceedOne(command); // handle event MaintenanceJobPlanned e = command.MapToMaintenanceJobPlanned(); RaiseEvent(e); }
private async Task HandleAsync(MaintenanceJobPlanned mjp) { MaintenanceJob job = new MaintenanceJob { JobId = mjp.JobId.ToString(), CustomerId = mjp.CustomerInfo.Id, LicenseNumber = mjp.VehicleInfo.LicenseNumber, Description = mjp.Description }; await _repo.RegisterMaintenanceJobAsync(job); }
public IEnumerable <Event> PlanMaintenanceJob(PlanMaintenanceJob command) { // check business rules this.PlannedMaintenanceJobShouldFallWithinOneBusinessDay(command); this.NumberOfParallelMaintenanceJobsMustNotExceedAvailableWorkStations(command); this.NumberOfParallelMaintenanceJobsOnAVehicleIsOne(command); // handle event MaintenanceJobPlanned e = command.MapToMaintenanceJobPlanned(); return(HandleEvent(e)); }
public MaintenanceJobPlanned Build() { var customer = CustomerBuilder .Build(); var vehicle = VehicleBuilder .WithOwnerId(customer.Id) .Build(); var job = MaintenanceJobBuilder .WithCustomer(customer) .WithVehicle(vehicle) .Build(); MaintenanceJobPlanned e = new MaintenanceJobPlanned( Guid.NewGuid(), job.Id, job.StartTime, job.EndTime, (customer.Id, customer.Name, customer.TelephoneNumber), (vehicle.Id, vehicle.Brand, vehicle.Type), job.Description ); return(e); }
private async Task HandleAsync(MaintenanceJobPlanned mjp) { Log.Information("Register Maintenance Job: {Id}, {Description}, {CustomerId}, {VehicleLicenseNumber}", mjp.JobId, mjp.Description, mjp.CustomerInfo.Id, mjp.VehicleInfo.LicenseNumber); MaintenanceJob job = new MaintenanceJob { JobId = mjp.JobId.ToString(), CustomerId = mjp.CustomerInfo.Id, LicenseNumber = mjp.VehicleInfo.LicenseNumber, Description = mjp.Description }; await _repo.RegisterMaintenanceJobAsync(job); }
private async Task HandleAsync(MaintenanceJobPlanned mjp) { MaintenanceJob job = new MaintenanceJob { JobId = mjp.JobId.ToString(), CustomerId = mjp.CustomerInfo.Id, LicenseNumber = mjp.VehicleInfo.LicenseNumber, StartTime = mjp.StartTime, Description = mjp.Description }; Log.Information("Register Maintenance Job: {Id}, {CustomerId}, {VehicleLicenseNumber}, {StartTime}, {Description}", job.JobId, job.CustomerId, job.LicenseNumber, job.StartTime, job.Description); await _repo.RegisterMaintenanceJobAsync(job); }
public void PlanMaintenanceJob(PlanMaintenanceJob command) { // check business rules command.PlannedMaintenanceJobShouldFallWithinOneBusinessDay(); this.NumberOfParallelMaintenanceJobsMustNotExceedAvailableWorkStations(command); this.NumberOfParallelMaintenanceJobsOnAVehicleMustNotExceedOne(command); // handle event MaintenanceJobPlanned e = new MaintenanceJobPlanned(command.MessageId, command.StartTime, command.EndTime, command.CustomerInfo, command.VehicleInfo, command.Description); RaiseEvent(e); }