public async Task <IActionResult> MyComponent(int?userComponentTypeId, int?defaultComponentTypeId)
        {
            var componentTypes = _componentTypeService.GetAll()
                                 .Include(x => x.Details)
                                 .Where(x => x.Details.Count(s => s.IsPrimary) > 0)
                                 .ToList();

            var multipliers = _unitMultiplierService.GetAll();

            var userComponent = await _userComponentTypeService.GetByIdAsync(userComponentTypeId);

            if (userComponent == null)
            {
                var defaultModel = new MyComponentInputModel
                {
                    ComponentTypes  = componentTypes,
                    ComponentTypeId = defaultComponentTypeId ?? 0
                };

                return(View(defaultModel));
            }
            else
            {
                var details      = _userComponentTypeDetailService.GetByUserComponentTypeId(userComponent.Id);
                var inputDetails = details.Select(x => new MyComponentDetailInputModel
                {
                    DetailId     = x.Id,
                    Name         = x.ComponentTypeDetail.Name,
                    MultiplierId = x.UnitMultiplierId,
                    Unit         = x.ComponentTypeDetail.Unit,
                    Value        = x.Value
                }).ToList();

                var model = new MyComponentInputModel
                {
                    Id = userComponent.Id,
                    ComponentTypeId = userComponent.ComponentTypeId,
                    Quantity        = userComponent.Quantity,
                    UnitPrice       = userComponent.UnitPrice,
                    ComponentTypes  = componentTypes,
                    UnitMultipliers = multipliers,
                    Details         = inputDetails
                };

                return(View(model));
            }
        }
        public async Task <IActionResult> MyComponent(MyComponentInputModel model)
        {
            if (!ModelState.IsValid)
            {
                var componentTypes = _componentTypeService.GetAll()
                                     .Include(x => x.Details);

                var multipliers = _unitMultiplierService.GetAll();

                model.ComponentTypes  = componentTypes;
                model.UnitMultipliers = multipliers;

                return(View(model));
            }

            var userComponent = await _userComponentTypeService.GetByIdAsync(model.Id);

            var userId = _userManager.GetUserId(User);

            if (userComponent == null)
            {
                userComponent = new UserComponentType
                {
                    ComponentTypeId = model.ComponentTypeId,
                    Quantity        = model.Quantity,
                    UnitPrice       = model.UnitPrice,
                    CreatedByUserId = userId,
                    CreatedDateTime = DateTime.UtcNow,
                    IsActive        = true
                };

                await _userComponentTypeService.SaveComponentAsync(userComponent);

                var type = await _componentTypeService.GetByIdAsync(model.ComponentTypeId);

                var details = _componentTypeDetailService.GetByComponentTypeId(type.Id);

                var userDetails = details.Select(x => new UserComponentTypeDetail
                {
                    UserComponentTypeId   = userComponent.Id,
                    UnitMultiplierId      = 1,
                    ComponentTypeDetailId = x.Id,
                    Value           = 0,
                    CreatedByUserId = userId,
                    CreatedDateTime = DateTime.UtcNow,
                    IsActive        = true
                });

                await _userComponentTypeDetailService.SaveDetailsAsync(userDetails);

                return(Redirect($"/MyComponents/MyComponent?userComponentTypeId={userComponent.Id}"));
            }
            else
            {
                userComponent.Quantity            = model.Quantity;
                userComponent.UnitPrice           = model.UnitPrice;
                userComponent.LastUpdatedByUserId = userId;
                userComponent.LastUpdatedDateTime = DateTime.UtcNow;

                var details = _userComponentTypeDetailService.GetByUserComponentTypeId(userComponent.Id);
                foreach (var detail in details)
                {
                    var detailModel = model.Details.SingleOrDefault(x => x.DetailId == detail.Id);
                    detail.UnitMultiplierId = detailModel.MultiplierId;
                    detail.Value            = detailModel.Value;

                    detail.LastUpdatedByUserId = userId;
                    detail.LastUpdatedDateTime = DateTime.UtcNow;
                }

                await _userComponentTypeService.UpdateComponentAsync(userComponent);

                await _userComponentTypeDetailService.UpdateRangeAsync(details);

                return(Redirect($"/MyComponents/Index"));
            }
        }