public object Run(int agentId, int taskId, [System.Web.Http.FromBody] Dictionary <string, string> parameters)
        {
            var id   = User.Identity.GetUserId();
            var user = db.Query <UserDto>().Single(x => x.Id == id);

            if (!user.ConfigurationManager && !user.Administrator)
            {
                return(new { Success = false, Error = "Only an administrator or configuration manager can execute tasks" });
            }


            using (var session = WebApiApplication.Store.OpenSession())
            {
                var deploy = new MaintenanceTask()
                {
                    TemplatedTaskId = taskId,
                    AgentId         = agentId,
                    Status          = Status.Queud,
                    StartDate       = System.DateTime.UtcNow,
                    UserId          = User.Identity.GetUserId()
                };

                session.Save(deploy);

                session.Flush();

                BackgroundJob.Enqueue(() => MaintenanceJob.Execute(deploy.Id, parameters));
                return(new { Success = true });
            };
        }
Esempio n. 2
0
        public void Finish_Should_Finish_An_Existing_Job()
        {
            // arrange
            MaintenanceJobBuilder maintenanceJobBuilder = new MaintenanceJobBuilder();
            MaintenanceJob        sut = maintenanceJobBuilder
                                        .Build();

            DateTime actualStartTime = maintenanceJobBuilder.StartTime.AddMinutes(30);
            DateTime actualEndTime   = maintenanceJobBuilder.EndTime.AddMinutes(15);
            string   notes           = $"Mechanic notes {maintenanceJobBuilder.JobId}";

            // act
            sut.Finish(actualStartTime, actualEndTime, notes);

            // assert
            Assert.Equal(maintenanceJobBuilder.JobId, sut.Id);
            Assert.Equal(maintenanceJobBuilder.StartTime, sut.StartTime);
            Assert.Equal(maintenanceJobBuilder.EndTime, sut.EndTime);
            Assert.Equal(maintenanceJobBuilder.CustomerBuilder.Id, sut.Customer.Id);
            Assert.Equal(maintenanceJobBuilder.CustomerBuilder.Name, sut.Customer.Name);
            Assert.Equal(maintenanceJobBuilder.CustomerBuilder.TelephoneNumber, sut.Customer.TelephoneNumber);
            Assert.Equal(maintenanceJobBuilder.VehicleBuilder.LicenseNumber, sut.Vehicle.Id);
            Assert.Equal(maintenanceJobBuilder.VehicleBuilder.Brand, sut.Vehicle.Brand);
            Assert.Equal(maintenanceJobBuilder.VehicleBuilder.Type, sut.Vehicle.Type);
            Assert.Equal(maintenanceJobBuilder.VehicleBuilder.OwnerId, sut.Vehicle.OwnerId);
            Assert.Equal(maintenanceJobBuilder.Description, sut.Description);
            Assert.Equal(actualStartTime, sut.ActualStartTime.Value);
            Assert.Equal(actualEndTime, sut.ActualEndTime.Value);
            Assert.Equal(notes, sut.Notes);
            Assert.Equal("Completed", sut.Status);
        }
Esempio n. 3
0
 public static void FinishedMaintenanceJobCanNotBeFinished(this MaintenanceJob job)
 {
     if (job.Status == "Completed")
     {
         throw new BusinessRuleViolationException($"An already finished job can not be finished.");
     }
 }
Esempio n. 4
0
        public void Finish_Should_Finish_An_Existing_Job()
        {
            // arrange
            CustomerBuilder       customerBuilder       = new CustomerBuilder();
            VehicleBuilder        vehicleBuilder        = new VehicleBuilder();
            MaintenanceJobBuilder maintenanceJobBuilder = new MaintenanceJobBuilder();
            Customer customer = customerBuilder
                                .Build();
            Vehicle vehicle = vehicleBuilder
                              .WithCustomerId(customer.CustomerId)
                              .Build();
            MaintenanceJob sut = maintenanceJobBuilder
                                 .WithCustomer(customer)
                                 .WithVehicle(vehicle)
                                 .Build();

            DateTime actualStartTime = maintenanceJobBuilder.StartTime.AddMinutes(30);
            DateTime actualEndTime   = maintenanceJobBuilder.EndTime.AddMinutes(15);
            string   notes           = $"Mechanic notes {maintenanceJobBuilder.Id}";

            // act
            sut.Finish(actualStartTime, actualEndTime, notes);

            // assert
            Assert.Equal(maintenanceJobBuilder.Id, sut.Id);
            Assert.Equal(maintenanceJobBuilder.StartTime, sut.StartTime);
            Assert.Equal(maintenanceJobBuilder.EndTime, sut.EndTime);
            Assert.Equal(customer, sut.Customer);
            Assert.Equal(vehicle, sut.Vehicle);
            Assert.Equal(maintenanceJobBuilder.Description, sut.Description);
            Assert.Equal(actualStartTime, sut.ActualStartTime.Value);
            Assert.Equal(actualEndTime, sut.ActualEndTime.Value);
            Assert.Equal(notes, sut.Notes);
            Assert.Equal("Completed", sut.Status);
        }
Esempio n. 5
0
        public void Update_Should_Update_Existing_Job()
        {
            // arrange
            MaintenanceJobBuilder maintenanceJobBuilder = new MaintenanceJobBuilder();
            MaintenanceJob        sut = maintenanceJobBuilder
                                        .Build();

            var description = "Description has been updated";

            // act
            sut.Update(sut.StartTime, sut.EndTime, sut.Vehicle, sut.Customer, description);

            // assert
            Assert.Equal(maintenanceJobBuilder.JobId, sut.Id);
            Assert.Equal(maintenanceJobBuilder.StartTime, sut.StartTime);
            Assert.Equal(maintenanceJobBuilder.EndTime, sut.EndTime);
            Assert.Equal(maintenanceJobBuilder.CustomerBuilder.Id, sut.Customer.Id);
            Assert.Equal(maintenanceJobBuilder.CustomerBuilder.Name, sut.Customer.Name);
            Assert.Equal(maintenanceJobBuilder.CustomerBuilder.TelephoneNumber, sut.Customer.TelephoneNumber);
            Assert.Equal(maintenanceJobBuilder.VehicleBuilder.LicenseNumber, sut.Vehicle.Id);
            Assert.Equal(maintenanceJobBuilder.VehicleBuilder.Brand, sut.Vehicle.Brand);
            Assert.Equal(maintenanceJobBuilder.VehicleBuilder.Type, sut.Vehicle.Type);
            Assert.Equal(maintenanceJobBuilder.VehicleBuilder.OwnerId, sut.Vehicle.OwnerId);
            Assert.Equal(description, sut.Description);
            Assert.Null(sut.ActualStartTime);
            Assert.Null(sut.ActualEndTime);
            Assert.Null(sut.Notes);
            Assert.Equal("Planned", sut.Status);
        }
Esempio n. 6
0
        public void Plan_Should_Create_A_New_Job()
        {
            // arrange
            MaintenanceJobBuilder maintenanceJobBuilder = new MaintenanceJobBuilder();
            MaintenanceJob        sut = maintenanceJobBuilder
                                        .Build();

            // act
            // sut.Plan() is called by the Testdata Builder

            // assert
            Assert.Equal(maintenanceJobBuilder.JobId, sut.Id);
            Assert.Equal(maintenanceJobBuilder.StartTime, sut.StartTime);
            Assert.Equal(maintenanceJobBuilder.EndTime, sut.EndTime);
            Assert.Equal(maintenanceJobBuilder.CustomerBuilder.Id, sut.Customer.Id);
            Assert.Equal(maintenanceJobBuilder.CustomerBuilder.Name, sut.Customer.Name);
            Assert.Equal(maintenanceJobBuilder.CustomerBuilder.TelephoneNumber, sut.Customer.TelephoneNumber);
            Assert.Equal(maintenanceJobBuilder.VehicleBuilder.LicenseNumber, sut.Vehicle.Id);
            Assert.Equal(maintenanceJobBuilder.VehicleBuilder.Brand, sut.Vehicle.Brand);
            Assert.Equal(maintenanceJobBuilder.VehicleBuilder.Type, sut.Vehicle.Type);
            Assert.Equal(maintenanceJobBuilder.VehicleBuilder.OwnerId, sut.Vehicle.OwnerId);
            Assert.Equal(maintenanceJobBuilder.Description, sut.Description);
            Assert.Null(sut.ActualStartTime);
            Assert.Null(sut.ActualEndTime);
            Assert.Null(sut.Notes);
            Assert.Equal("Planned", sut.Status);
        }
Esempio n. 7
0
    private void Handle(MaintenanceJobFinished e)
    {
        MaintenanceJob job            = Jobs.FirstOrDefault(j => j.Id == e.JobId);
        Timeslot       actualTimeslot = Timeslot.Create(e.StartTime, e.EndTime);

        job.Finish(actualTimeslot, e.Notes);
    }
Esempio n. 8
0
        public void Plan_Should_Create_A_New_Job()
        {
            // arrange
            CustomerBuilder       customerBuilder       = new CustomerBuilder();
            VehicleBuilder        vehicleBuilder        = new VehicleBuilder();
            MaintenanceJobBuilder maintenanceJobBuilder = new MaintenanceJobBuilder();
            Customer customer = customerBuilder
                                .Build();
            Vehicle vehicle = vehicleBuilder
                              .WithCustomerId(customer.CustomerId)
                              .Build();
            MaintenanceJob sut = maintenanceJobBuilder
                                 .WithCustomer(customer)
                                 .WithVehicle(vehicle)
                                 .Build();

            // act
            // sut.Plan() is called by the Testdata Builder

            // assert
            Assert.Equal(maintenanceJobBuilder.Id, sut.Id);
            Assert.Equal(maintenanceJobBuilder.StartTime, sut.StartTime);
            Assert.Equal(maintenanceJobBuilder.EndTime, sut.EndTime);
            Assert.Equal(customer, sut.Customer);
            Assert.Equal(vehicle, sut.Vehicle);
            Assert.Equal(maintenanceJobBuilder.Description, sut.Description);
            Assert.Null(sut.ActualStartTime);
            Assert.Null(sut.ActualEndTime);
            Assert.Null(sut.Notes);
            Assert.Equal("Planned", sut.Status);
        }
Esempio n. 9
0
 public async Task RegisterMaintenanceJobAsync(MaintenanceJob job)
 {
     using (SqlConnection conn = new SqlConnection(_connectionString))
     {
         string sql =
             "insert into MaintenanceJob(JobId, LicenseNumber, CustomerId, Description, Finished, InvoiceSent) " +
             "values(@JobId, @LicenseNumber, @CustomerId, @Description, 0, 0);";
         await conn.ExecuteAsync(sql, job);
     }
 }
Esempio n. 10
0
    private void Handle(MaintenanceJobPlanned e)
    {
        MaintenanceJob job             = new MaintenanceJob(e.JobId);
        Customer       customer        = new Customer(e.CustomerInfo.Id, e.CustomerInfo.Name, e.CustomerInfo.TelephoneNumber);
        LicenseNumber  licenseNumber   = LicenseNumber.Create(e.VehicleInfo.LicenseNumber);
        Vehicle        vehicle         = new Vehicle(licenseNumber, e.VehicleInfo.Brand, e.VehicleInfo.Type, customer.Id);
        Timeslot       plannedTimeslot = Timeslot.Create(e.StartTime, e.EndTime);

        job.Plan(plannedTimeslot, vehicle, customer, e.Description);
        Jobs.Add(job);
    }
Esempio n. 11
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);
        }
Esempio n. 12
0
 public static MaintenanceJobDTO MapToDTO(this MaintenanceJob source) =>
 new MaintenanceJobDTO
 {
     Id              = source.Id,
     StartTime       = source.PlannedTimeslot.StartTime,
     EndTime         = source.PlannedTimeslot.EndTime,
     Vehicle         = source.Vehicle.MapToDTO(),
     Customer        = source.Customer.MapToDTO(),
     Description     = source.Description,
     ActualStartTime = source?.ActualTimeslot?.StartTime,
     ActualEndTime   = source?.ActualTimeslot?.EndTime,
     Notes           = source.Notes
 };
Esempio n. 13
0
        public async Task UpdateMaintenanceJobAsync(MaintenanceJob job)
        {
            using (SqlConnection conn = new SqlConnection(_connectionString))
            {
                var sql = "UPDATE MaintenanceJob SET ";
                sql += "LicenseNumber = @LicenseNumber, ";
                sql += "CustomerId = @CustomerId, ";
                sql += "StartTime = @StartTime, ";
                sql += "Description = @Description ";
                sql += "WHERE JobId = @JobId ";

                await conn.ExecuteAsync(sql, job);
            }
        }
Esempio n. 14
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);
    }
 public async Task <IActionResult> Finish(DateTime planningDate, string jobId)
 {
     return(await _resiliencyHelper.ExecuteResilient(async() =>
     {
         string dateStr = planningDate.ToString("yyyy-MM-dd");
         MaintenanceJob job = await _workshopManagementAPI.GetMaintenanceJob(dateStr, jobId);
         var model = new WorkshopManagementFinishViewModel
         {
             Id = job.Id,
             Date = planningDate,
             ActualStartTime = job.StartTime,
             ActualEndTime = job.EndTime
         };
         return View(model);
     }, View("Offline", new WorkshopManagementOfflineViewModel())));
 }
 public async Task <IActionResult> Finish(DateTime date, string jobId)
 {
     return(await ExecuteWithFallback(async() =>
     {
         string dateStr = date.ToString("yyyy-MM-dd");
         MaintenanceJob job = await _workshopManagementAPI.GetMaintenanceJob(dateStr, jobId);
         var model = new WorkshopManagementFinishViewModel
         {
             Id = job.Id,
             Date = date,
             ActualStartTime = job.StartTime,
             ActualEndTime = job.EndTime
         };
         return View(model);
     }));
 }
Esempio n. 17
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);
        }
Esempio n. 18
0
        private async Task HandleAsync(MaintenanceJobUpdated mju)
        {
            var job = new MaintenanceJob
            {
                JobId         = mju.JobId.ToString(),
                CustomerId    = mju.CustomerInfo.Id,
                LicenseNumber = mju.VehicleInfo.LicenseNumber,
                StartTime     = mju.StartTime,
                Description   = mju.Description
            };

            Log.Information("Update Maintenance Job: {Id}, {CustomerId}, {VehicleLicenseNumber}, {StartTime}, {Description}",
                            job.JobId, job.CustomerId, job.LicenseNumber, job.StartTime, job.Description);

            await _repo.UpdateMaintenanceJobAsync(job);
        }
Esempio n. 19
0
        public MaintenanceJob Build()
        {
            if (Customer == null)
            {
                throw new InvalidOperationException("You must specify a customer using the 'WithCustomer' method.");
            }

            if (Vehicle == null)
            {
                throw new InvalidOperationException("You must specify a vehicle using the 'WithVehicle' method.");
            }

            var job = new MaintenanceJob();

            job.Plan(Id, StartTime, EndTime, Vehicle, Customer, Description);
            return(job);
        }
Esempio n. 20
0
    public void FinishMaintenanceJob(FinishMaintenanceJob command)
    {
        // find job
        MaintenanceJob job = Jobs.FirstOrDefault(j => j.Id == command.JobId);

        if (job == null)
        {
            throw new MaintenanceJobNotFoundException($"Maintenance job with id {command.JobId} found.");
        }

        // check business rules
        job.FinishedMaintenanceJobCanNotBeFinished();

        // handle event
        MaintenanceJobFinished e = command.MapToMaintenanceJobFinished();

        RaiseEvent(e);
    }
        public MaintenanceJob Build()
        {
            if (CustomerBuilder == null)
            {
                throw new InvalidOperationException("You must specify a customerbuilder using the 'WithCustomerBuilder' method.");
            }

            if (VehicleBuilder == null)
            {
                throw new InvalidOperationException("You must specify a vehiclebuilder using the 'WithVehicleBuilder' method.");
            }

            Customer customer = CustomerBuilder.Build();
            Vehicle  vehicle  = VehicleBuilder.Build();

            var      job             = new MaintenanceJob();
            Timeslot plannedTimeslot = Timeslot.Create(StartTime, EndTime);

            job.Plan(JobId, plannedTimeslot, vehicle, customer, Description);
            return(job);
        }