public void DeleteVehicle(VehicleViewModel vehicle, int userId)
        {
            DateTime serverTime = DateTime.Now;

            vehicle.ModifyDate = serverTime;
            vehicle.ModifyUserId = userId;
            vehicle.Status = (int)DbConstant.DefaultDataStatus.Deleted;
            Vehicle entity = _vehicleRepository.GetById(vehicle.Id);
            Map(vehicle, entity);
            _vehicleRepository.Update(entity);

            _unitOfWork.SaveChanges();
        }
        public void UpdateVehicleDetail(VehicleDetailViewModel vehicleDetail, VehicleViewModel vehicle, int userId)
        {
            DateTime serverTime = DateTime.Now;

            //set current active detail to expired if any
            VehicleDetail toBeExpired = _vehicleDetailRepository.GetMany(vd => vd.Status == (int)DbConstant.LicenseNumberStatus.Active).FirstOrDefault();
            if (toBeExpired != null)
            {
                toBeExpired.ModifyDate = serverTime;
                toBeExpired.ModifyUserId = userId;
                toBeExpired.Status = (int)DbConstant.LicenseNumberStatus.Expired;

                _vehicleDetailRepository.AttachNavigation<Vehicle>(toBeExpired.Vehicle);
                _vehicleDetailRepository.Update(toBeExpired);
                _unitOfWork.SaveChanges();
            }

            //insert new detail as active detail
            vehicleDetail.CreateDate = serverTime;
            vehicleDetail.CreateUserId = userId;
            vehicleDetail.ModifyUserId = userId;
            vehicleDetail.VehicleId = vehicle.Id;
            vehicleDetail.Status = (int)DbConstant.LicenseNumberStatus.Active;
            VehicleDetail entityDetail = new VehicleDetail();

            Map(vehicleDetail, entityDetail);

            _vehicleDetailRepository.AttachNavigation<Vehicle>(entityDetail.Vehicle);
            _vehicleDetailRepository.Add(entityDetail);
            _unitOfWork.SaveChanges();

            //update active license number in vehicle
            if (vehicle != null)
            {
                vehicle.ModifyDate = serverTime;
                vehicle.ModifyUserId = userId;
                vehicle.ActiveLicenseNumber = vehicleDetail.LicenseNumber;
                Vehicle entity = _vehicleRepository.GetById(vehicle.Id);
                Map(vehicle, entity);

                _vehicleRepository.AttachNavigation<Customer>(entity.Customer);
                _vehicleRepository.Update(entity);
                _unitOfWork.SaveChanges();
            }

            _unitOfWork.SaveChanges();
        }
        public void DeleteVehicle(VehicleViewModel vehicle, int userId)
        {
            DateTime serverTime = DateTime.Now;

            vehicle.ModifyDate = serverTime;
            vehicle.ModifyUserId = userId;
            vehicle.Status = (int)DbConstant.DefaultDataStatus.Deleted;
            Vehicle entity = _vehicleRepository.GetById(vehicle.Id);
            Map(vehicle, entity);

            _vehicleRepository.AttachNavigation(entity.Brand);
            _vehicleRepository.AttachNavigation(entity.Type);
            _vehicleRepository.AttachNavigation(entity.VehicleGroup);
            _vehicleRepository.AttachNavigation(entity.Customer);
            _vehicleRepository.AttachNavigation(entity.CreateUser);
            _vehicleRepository.AttachNavigation(entity.ModifyUser);
            _vehicleRepository.Update(entity);
            _unitOfWork.SaveChanges();

            foreach (var item in _vehicleWheelRepository.GetMany(vw => vw.VehicleId == vehicle.Id && vw.Status ==(int) DbConstant.DefaultDataStatus.Active))
            {
                item.ModifyDate = serverTime;
                item.ModifyUserId = userId;
                item.Status = (int)DbConstant.DefaultDataStatus.Deleted;

                _vehicleWheelRepository.AttachNavigation(item.Vehicle);
                _vehicleWheelRepository.AttachNavigation(item.WheelDetail);
                _vehicleWheelRepository.AttachNavigation(item.CreateUser);
                _vehicleWheelRepository.AttachNavigation(item.ModifyUser);
                _vehicleWheelRepository.Update(item);
                _unitOfWork.SaveChanges();

                SpecialSparepartDetail wdEntity = _specialSparepartDetailRepository.GetById(item.WheelDetailId);
                wdEntity.ModifyDate = serverTime;
                wdEntity.ModifyUserId = userId;
                wdEntity.Status = (int)DbConstant.WheelDetailStatus.Ready;

                _specialSparepartDetailRepository.AttachNavigation(wdEntity.SpecialSparepart);
                _specialSparepartDetailRepository.AttachNavigation(wdEntity.SparepartDetail);
                _specialSparepartDetailRepository.AttachNavigation(wdEntity.CreateUser);
                _specialSparepartDetailRepository.AttachNavigation(wdEntity.ModifyUser);
                _specialSparepartDetailRepository.Update(wdEntity);
                _unitOfWork.SaveChanges();

                SparepartDetail spdEntity = _sparepartDetailRepository.GetById(wdEntity.SparepartDetailId);
                spdEntity.ModifyDate = serverTime;
                spdEntity.ModifyUserId = userId;
                spdEntity.Status = (int)DbConstant.SparepartDetailDataStatus.Active;

                _sparepartDetailRepository.AttachNavigation(spdEntity.Sparepart);
                _sparepartDetailRepository.AttachNavigation(spdEntity.SparepartManualTransaction);
                _sparepartDetailRepository.AttachNavigation(spdEntity.PurchasingDetail);
                _sparepartDetailRepository.AttachNavigation(spdEntity.CreateUser);
                _sparepartDetailRepository.AttachNavigation(spdEntity.ModifyUser);
                _sparepartDetailRepository.Update(spdEntity);
                _unitOfWork.SaveChanges();

                Sparepart spEntity = _sparepartRepository.GetById(wdEntity.SparepartDetail.SparepartId);
                spEntity.ModifyDate = serverTime;
                spEntity.ModifyUserId = userId;
                spEntity.StockQty = spEntity.StockQty + 1;

                _sparepartRepository.AttachNavigation(spEntity.UnitReference);
                _sparepartRepository.AttachNavigation(spEntity.CategoryReference);
                _sparepartRepository.AttachNavigation(spEntity.CreateUser);
                _sparepartRepository.AttachNavigation(spEntity.ModifyUser);
                _sparepartRepository.Update(spEntity);
                _unitOfWork.SaveChanges();

                SparepartStockCard stockCard = new SparepartStockCard();
                Reference transactionReferenceTable = _referenceRepository.GetMany(r => r.Code == DbConstant.MODUL_VEHICLE).FirstOrDefault();

                stockCard.CreateUserId = userId;
                stockCard.CreateDate = serverTime;
                stockCard.PrimaryKeyValue = vehicle.Id;
                stockCard.ReferenceTableId = transactionReferenceTable.Id;
                stockCard.SparepartId = spEntity.Id;
                stockCard.Description = "Delete Vehicle";
                stockCard.QtyIn = 1;

                SparepartStockCard lastStockCard = _sparepartStokCardRepository.RetrieveLastCard(spEntity.Id);
                double lastStock = 0;
                if (lastStockCard != null)
                {
                    lastStock = lastStockCard.QtyLast;
                }
                stockCard.QtyFirst = lastStock;
                stockCard.QtyLast = lastStock + stockCard.QtyIn;
                _sparepartStokCardRepository.AttachNavigation(stockCard.CreateUser);
                _sparepartStokCardRepository.AttachNavigation(stockCard.Sparepart);
                _sparepartStokCardRepository.AttachNavigation(stockCard.ReferenceTable);
                _sparepartStokCardRepository.Add(stockCard);
                _unitOfWork.SaveChanges();
            }
        }
        public void UpdateVehicle(VehicleViewModel vehicle, List<VehicleWheelViewModel> vehicleWheels,
            List<VehicleWheelViewModel> vehicleWheelExchanged, int userId)
        {
            DateTime serverTime = DateTime.Now;

            vehicle.ModifyDate = serverTime;
            vehicle.ModifyUserId = userId;
            Vehicle entity = _vehicleRepository.GetById(vehicle.Id);
            Map(vehicle, entity);

            _vehicleRepository.AttachNavigation(entity.Brand);
            _vehicleRepository.AttachNavigation(entity.Type);
            _vehicleRepository.AttachNavigation(entity.VehicleGroup);
            _vehicleRepository.AttachNavigation(entity.Customer);
            _vehicleRepository.AttachNavigation(entity.CreateUser);
            _vehicleRepository.AttachNavigation(entity.ModifyUser);
            _vehicleRepository.Update(entity);
            _unitOfWork.SaveChanges();

            if (vehicleWheelExchanged.Count > 0)
            {
                foreach (var vw in vehicleWheelExchanged)
                {
                    VehicleWheel vwEntity = _vehicleWheelRepository.GetById(vw.Id);
                    vwEntity.WheelDetailId = vw.WheelDetailId;
                    vwEntity.ModifyDate = serverTime;
                    vwEntity.ModifyUserId = userId;
                    vwEntity.Notes = vw.Notes;

                    _vehicleWheelRepository.AttachNavigation(vwEntity.Vehicle);
                    _vehicleWheelRepository.AttachNavigation(vwEntity.WheelDetail);
                    _vehicleWheelRepository.AttachNavigation(vwEntity.CreateUser);
                    _vehicleWheelRepository.AttachNavigation(vwEntity.ModifyUser);
                    _vehicleWheelRepository.Update(vwEntity);
                    _unitOfWork.SaveChanges();
                }
            }

            foreach (var vw in vehicleWheels)
            {
                if (vw.Id > 0)
                {
                    VehicleWheel vwEntity = _vehicleWheelRepository.GetById(vw.Id);
                    vwEntity.WheelDetailId = vw.WheelDetailId;
                    vwEntity.ModifyDate = serverTime;
                    vwEntity.ModifyUserId = userId;
                    vwEntity.Notes = vw.Notes;

                    _vehicleWheelRepository.AttachNavigation(vwEntity.Vehicle);
                    _vehicleWheelRepository.AttachNavigation(vwEntity.WheelDetail);
                    _vehicleWheelRepository.AttachNavigation(vwEntity.CreateUser);
                    _vehicleWheelRepository.AttachNavigation(vwEntity.ModifyUser);
                    _vehicleWheelRepository.Update(vwEntity);
                    _unitOfWork.SaveChanges();
                }
                else
                {
                    VehicleWheel vwEntity = new VehicleWheel();
                    Map(vw, vwEntity);
                    vwEntity.Notes = vw.Notes;
                    vwEntity.VehicleId = vehicle.Id;
                    vwEntity.CreateDate = vwEntity.ModifyDate = serverTime;
                    vwEntity.CreateUserId = vwEntity.ModifyUserId = userId;
                    vwEntity.Status = (int)DbConstant.DefaultDataStatus.Active;

                    _vehicleWheelRepository.AttachNavigation(vwEntity.Vehicle);
                    _vehicleWheelRepository.AttachNavigation(vwEntity.WheelDetail);
                    _vehicleWheelRepository.AttachNavigation(vwEntity.CreateUser);
                    _vehicleWheelRepository.AttachNavigation(vwEntity.ModifyUser);
                    _vehicleWheelRepository.Add(vwEntity);
                    _unitOfWork.SaveChanges();

                    SpecialSparepartDetail wdEntity = _specialSparepartDetailRepository.GetById(vw.WheelDetailId);
                    wdEntity.ModifyDate = serverTime;
                    wdEntity.ModifyUserId = userId;
                    wdEntity.Status = (int)DbConstant.WheelDetailStatus.Installed;

                    _specialSparepartDetailRepository.AttachNavigation(wdEntity.SpecialSparepart);
                    _specialSparepartDetailRepository.AttachNavigation(wdEntity.SparepartDetail);
                    _specialSparepartDetailRepository.AttachNavigation(wdEntity.CreateUser);
                    _specialSparepartDetailRepository.AttachNavigation(wdEntity.ModifyUser);
                    _specialSparepartDetailRepository.Update(wdEntity);
                    _unitOfWork.SaveChanges();

                    SparepartDetail spdEntity = _sparepartDetailRepository.GetById(wdEntity.SparepartDetailId);
                    spdEntity.ModifyDate = serverTime;
                    spdEntity.ModifyUserId = userId;
                    spdEntity.Status = (int)DbConstant.SparepartDetailDataStatus.OutInstalled;

                    _sparepartDetailRepository.AttachNavigation(spdEntity.Sparepart);
                    _sparepartDetailRepository.AttachNavigation(spdEntity.SparepartManualTransaction);
                    _sparepartDetailRepository.AttachNavigation(spdEntity.PurchasingDetail);
                    _sparepartDetailRepository.AttachNavigation(spdEntity.CreateUser);
                    _sparepartDetailRepository.AttachNavigation(spdEntity.ModifyUser);
                    _sparepartDetailRepository.Update(spdEntity);
                    _unitOfWork.SaveChanges();

                    Sparepart spEntity = _sparepartRepository.GetById(wdEntity.SparepartDetail.SparepartId);
                    spEntity.ModifyDate = serverTime;
                    spEntity.ModifyUserId = userId;
                    spEntity.StockQty = spEntity.StockQty - 1;

                    _sparepartRepository.AttachNavigation(spEntity.UnitReference);
                    _sparepartRepository.AttachNavigation(spEntity.CategoryReference);
                    _sparepartRepository.AttachNavigation(spEntity.CreateUser);
                    _sparepartRepository.AttachNavigation(spEntity.ModifyUser);
                    _sparepartRepository.Update(spEntity);
                    _unitOfWork.SaveChanges();
                }
            }

            _unitOfWork.SaveChanges();
        }
        public bool IsLicenseNumberExist(string licenseNumber, VehicleViewModel selectedVehicle)
        {
            Vehicle result = new Vehicle();

            if (selectedVehicle != null)
            {
                result = _vehicleRepository.GetMany(v =>
                   v.Status == (int)DbConstant.DefaultDataStatus.Active &&
                   v.ActiveLicenseNumber.ToLower() == licenseNumber.ToLower() &&
                   v.Id != selectedVehicle.Id
                   ).FirstOrDefault();
            }
            else
            {
                result = _vehicleRepository.GetMany(v =>
                   v.Status == (int)DbConstant.DefaultDataStatus.Active &&
                   v.ActiveLicenseNumber.ToLower() == licenseNumber.ToLower()
                   ).FirstOrDefault();
            }

            return result != null;
        }
        public void InsertVehicle(VehicleViewModel vehicle, DateTime expirationDate,
            List<VehicleWheelViewModel> vehicleWheels, int userId)
        {
            DateTime serverTime = DateTime.Now;

            Vehicle entity = new Vehicle();
            Map(vehicle, entity);
            entity.CreateDate = entity.ModifyDate = serverTime;
            entity.CreateUserId = entity.ModifyUserId = userId;
            entity.Status = (int)DbConstant.DefaultDataStatus.Active;

            _vehicleRepository.AttachNavigation(entity.Brand);
            _vehicleRepository.AttachNavigation(entity.Type);
            _vehicleRepository.AttachNavigation(entity.VehicleGroup);
            _vehicleRepository.AttachNavigation(entity.Customer);
            _vehicleRepository.AttachNavigation(entity.CreateUser);
            _vehicleRepository.AttachNavigation(entity.ModifyUser);
            var insertedVehicle = _vehicleRepository.Add(entity);
            _unitOfWork.SaveChanges();

            VehicleDetail vehicleDetail = new VehicleDetail
            {
                VehicleId = insertedVehicle.Id,
                LicenseNumber = insertedVehicle.ActiveLicenseNumber,
                ExpirationDate = expirationDate,
                CreateDate = serverTime,
                ModifyDate = serverTime,
                ModifyUserId = userId,
                CreateUserId = userId,
                Status = (int)DbConstant.LicenseNumberStatus.Active
            };

            _vehicleDetailRepository.AttachNavigation(vehicleDetail.Vehicle);
            _vehicleDetailRepository.AttachNavigation(vehicleDetail.CreateUser);
            _vehicleDetailRepository.AttachNavigation(vehicleDetail.ModifyUser);
            _vehicleDetailRepository.Add(vehicleDetail);
            _unitOfWork.SaveChanges();

            foreach (var vw in vehicleWheels)
            {
                if (vw.WheelDetailId > 0)
                {
                    VehicleWheel vwEntity = new VehicleWheel();
                    Map(vw, vwEntity);
                    vwEntity.Notes = vw.Notes;
                    vwEntity.WheelDetailId = vw.WheelDetailId;
                    vwEntity.CreateDate = vwEntity.ModifyDate = serverTime;
                    vwEntity.CreateUserId = vwEntity.ModifyUserId = userId;
                    vwEntity.VehicleId = insertedVehicle.Id;
                    vwEntity.Status = (int)DbConstant.DefaultDataStatus.Active;

                    _vehicleWheelRepository.AttachNavigation(vwEntity.Vehicle);
                    _vehicleWheelRepository.AttachNavigation(vwEntity.WheelDetail);
                    _vehicleWheelRepository.AttachNavigation(vwEntity.CreateUser);
                    _vehicleWheelRepository.AttachNavigation(vwEntity.ModifyUser);
                    _vehicleWheelRepository.Add(vwEntity);
                    _unitOfWork.SaveChanges();

                    SpecialSparepartDetail wdEntity = _specialSparepartDetailRepository.GetById(vw.WheelDetailId);
                    wdEntity.ModifyDate = serverTime;
                    wdEntity.ModifyUserId = userId;
                    wdEntity.Status = (int)DbConstant.WheelDetailStatus.Installed;

                    _specialSparepartDetailRepository.AttachNavigation(wdEntity.SpecialSparepart);
                    _specialSparepartDetailRepository.AttachNavigation(wdEntity.SparepartDetail);
                    _specialSparepartDetailRepository.AttachNavigation(wdEntity.CreateUser);
                    _specialSparepartDetailRepository.AttachNavigation(wdEntity.ModifyUser);
                    _specialSparepartDetailRepository.Update(wdEntity);
                    _unitOfWork.SaveChanges();

                    SparepartDetail spdEntity = _sparepartDetailRepository.GetById(wdEntity.SparepartDetailId);
                    spdEntity.ModifyDate = serverTime;
                    spdEntity.ModifyUserId = userId;
                    spdEntity.Status = (int)DbConstant.SparepartDetailDataStatus.OutInstalled;

                    _sparepartDetailRepository.AttachNavigation(spdEntity.Sparepart);
                    _sparepartDetailRepository.AttachNavigation(spdEntity.SparepartManualTransaction);
                    _sparepartDetailRepository.AttachNavigation(spdEntity.PurchasingDetail);
                    _sparepartDetailRepository.AttachNavigation(spdEntity.CreateUser);
                    _sparepartDetailRepository.AttachNavigation(spdEntity.ModifyUser);
                    _sparepartDetailRepository.Update(spdEntity);
                    _unitOfWork.SaveChanges();

                    Sparepart spEntity = _sparepartRepository.GetById(wdEntity.SparepartDetail.SparepartId);
                    spEntity.ModifyDate = serverTime;
                    spEntity.ModifyUserId = userId;
                    spEntity.StockQty = spEntity.StockQty - 1;

                    _sparepartRepository.AttachNavigation(spEntity.UnitReference);
                    _sparepartRepository.AttachNavigation(spEntity.CategoryReference);
                    _sparepartRepository.AttachNavigation(spEntity.CreateUser);
                    _sparepartRepository.AttachNavigation(spEntity.ModifyUser);
                    _sparepartRepository.Update(spEntity);
                    _unitOfWork.SaveChanges();

                    SparepartStockCard stockCard = new SparepartStockCard();
                    Reference transactionReferenceTable = _referenceRepository.GetMany(r => r.Code == DbConstant.MODUL_VEHICLE).FirstOrDefault();

                    stockCard.CreateUserId = userId;
                    stockCard.CreateDate = serverTime;
                    stockCard.PrimaryKeyValue = wdEntity.Id;
                    stockCard.ReferenceTableId = transactionReferenceTable.Id;
                    stockCard.SparepartId = spEntity.Id;
                    stockCard.Description = "Vehicle Insert";
                    stockCard.QtyOut = 1;

                    SparepartStockCard lastStockCard = _sparepartStokCardRepository.RetrieveLastCard(spEntity.Id);
                    double lastStock = 0;
                    if (lastStockCard != null)
                    {
                        lastStock = lastStockCard.QtyLast;
                    }

                    stockCard.QtyFirst = lastStock;
                    stockCard.QtyLast = lastStock - stockCard.QtyOut;
                    _sparepartStokCardRepository.AttachNavigation(stockCard.CreateUser);
                    _sparepartStokCardRepository.AttachNavigation(stockCard.Sparepart);
                    _sparepartStokCardRepository.AttachNavigation(stockCard.ReferenceTable);
                    _sparepartStokCardRepository.Add(stockCard);
                    _unitOfWork.SaveChanges();
                }
            }

            _unitOfWork.SaveChanges();
        }
 public override void RefreshDataView()
 {
     if (!bgwMain.IsBusy)
     {
         MethodBase.GetCurrentMethod().Info("Fecthing vehicle data...");
         _selectedVehicle = null;
         FormHelpers.CurrentMainForm.UpdateStatusInformation("Memuat data kendaraan...", false);
         bgwMain.RunWorkerAsync();
     }
 }