Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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;
            }
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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 });
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 8
0
        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 }));
        }
Ejemplo n.º 9
0
    public void PlanMaintenanceJob(PlanMaintenanceJob command)
    {
        // check business rules
        command.PlannedMaintenanceJobShouldFallWithinOneBusinessDay();
        this.NumberOfParallelMaintenanceJobsMustNotExceedAvailableWorkStations(command);
        this.NumberOfParallelMaintenanceJobsOnAVehicleMustNotExceedOne(command);

        // handle event
        MaintenanceJobPlanned e = command.MapToMaintenanceJobPlanned();

        RaiseEvent(e);
    }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 13
0
    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);
    }
Ejemplo n.º 14
0
        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);
        }