public void InsertSparepartManualTransaction(SparepartManualTransactionViewModel sparepartManualTransaction, decimal totalPrice, int userId)
        {
            using (var trans = _unitOfWork.BeginTransaction())
            {
                try
                {
                    DateTime serverTime = DateTime.Now;
                    sparepartManualTransaction.CreateDate = serverTime;
                    sparepartManualTransaction.CreateUserId = userId;
                    sparepartManualTransaction.ModifyDate = serverTime;
                    sparepartManualTransaction.ModifyUserId = userId;
                    sparepartManualTransaction.TransactionDate = serverTime;
                    Reference updateType = _referenceRepository.GetById(sparepartManualTransaction.UpdateTypeId);
                    Sparepart sparepartUpdated = _sparepartRepository.GetById(sparepartManualTransaction.SparepartId);
                    if (updateType != null && sparepartUpdated != null)
                    {
                        SparepartManualTransaction entity = new SparepartManualTransaction();
                        Map(sparepartManualTransaction, entity);

                        _sparepartManualTransactionRepository.AttachNavigation(entity.CreateUser);
                        _sparepartManualTransactionRepository.AttachNavigation(entity.ModifyUser);
                        _sparepartManualTransactionRepository.AttachNavigation(entity.Sparepart);
                        _sparepartManualTransactionRepository.AttachNavigation(entity.UpdateType);
                        SparepartManualTransaction manualTransaction = _sparepartManualTransactionRepository.Add(entity);
                        _unitOfWork.SaveChanges();

                        //Reference referenceTransaction = _referenceRepository.GetMany(x=>x.Code == DbConstant.REF_TRANSTBL_SPAREPARTMANUAL).FirstOrDefault();
                        //Transaction transaction = new Transaction();
                        //transaction.CreateDate = serverTime;
                        //transaction.CreateUserId = userId;
                        //transaction.ModifyDate = serverTime;
                        //transaction.ModifyUserId = userId;
                        //transaction.Description = "Transaksi sparepart manual";
                        //transaction.ReferenceTableId = referenceTransaction.Id;
                        //transaction.PrimaryKeyValue = 0;
                        //transaction.TotalPayment = totalPrice.AsDouble();
                        //transaction.TotalTransaction = totalPrice.AsDouble();
                        //transaction.TransactionDate = serverTime;
                        //transaction.Status = (int)DbConstant.DefaultDataStatus.Active;
                        //transaction =_transactionRepository.Add(transaction);

                        Reference transactionReferenceTable = _referenceRepository.GetMany(c => c.Code == DbConstant.REF_TRANSTBL_SPAREPARTMANUAL).FirstOrDefault();
                        SparepartStockCard stockCard = new SparepartStockCard();
                        stockCard.CreateUserId = userId;
                        stockCard.CreateDate = serverTime;
                        stockCard.PrimaryKeyValue = manualTransaction.Id;
                        stockCard.ReferenceTableId = transactionReferenceTable.Id;
                        stockCard.SparepartId = manualTransaction.SparepartId;

                        if (updateType.Code == DbConstant.REF_SPAREPART_TRANSACTION_MANUAL_TYPE_PLUS)
                        {
                            stockCard.Description = "Penambahan stok awal";
                            //TransactionDetail transDebit = new TransactionDetail();
                            //transDebit.Debit = totalPrice;
                            //transDebit.JournalId = _journalMasterRepository.GetMany(x => x.Code == "1.01.04.01").FirstOrDefault().Id;
                            //transDebit.Parent = transaction;
                            //_transactionDetailRepository.Add(transDebit);

                            //TransactionDetail transCredit = new TransactionDetail();
                            //transCredit.Credit = totalPrice;
                            //transCredit.JournalId = _journalMasterRepository.GetMany(x => x.Code == "9.9").FirstOrDefault().Id;
                            //transCredit.Parent = transaction;
                            //_transactionDetailRepository.Add(transCredit);

                            sparepartUpdated.StockQty += sparepartManualTransaction.Qty;
                            stockCard.QtyIn = sparepartManualTransaction.Qty;

                            SparepartDetail lastSPDetail = _sparepartDetailRepository.
                            GetMany(c => c.SparepartId == sparepartManualTransaction.SparepartId).OrderByDescending(c => c.Id)
                            .FirstOrDefault();
                            string lastSPID = string.Empty;
                            if (lastSPDetail != null) lastSPID = lastSPDetail.Code;
                            for (int i = 1; i <= sparepartManualTransaction.Qty; i++)
                            {
                                SparepartDetail spDetail = new SparepartDetail();
                                if (string.IsNullOrEmpty(lastSPID))
                                {
                                    lastSPID = sparepartUpdated.Code + "0000000001";
                                }
                                else
                                {
                                    lastSPID = sparepartUpdated.Code + (Convert.ToInt32(lastSPID.Substring(lastSPID.Length - 10)) + 1)
                                        .ToString("D10");
                                }
                                spDetail.SparepartManualTransaction = manualTransaction;
                                spDetail.SparepartId = sparepartUpdated.Id;
                                spDetail.Code = lastSPID;
                                spDetail.CreateDate = serverTime;
                                spDetail.CreateUserId = userId;
                                spDetail.ModifyUserId = userId;
                                spDetail.ModifyDate = serverTime;
                                spDetail.Status = (int)DbConstant.SparepartDetailDataStatus.Active;

                                _sparepartDetailRepository.AttachNavigation(spDetail.CreateUser);
                                _sparepartDetailRepository.AttachNavigation(spDetail.ModifyUser);
                                _sparepartDetailRepository.AttachNavigation(spDetail.PurchasingDetail);
                                _sparepartDetailRepository.AttachNavigation(spDetail.Sparepart);
                                _sparepartDetailRepository.AttachNavigation(spDetail.SparepartManualTransaction);
                                SparepartDetail insertedSpDetail = _sparepartDetailRepository.Add(spDetail);

                                if (!string.IsNullOrEmpty(sparepartManualTransaction.SerialNumber))
                                {
                                    SpecialSparepart specialSparepart = _specialSparepartRepository.GetMany(w => w.SparepartId == sparepartUpdated.Id && w.Status == (int)DbConstant.DefaultDataStatus.Active ).FirstOrDefault();

                                    if (specialSparepart != null)
                                    {
                                        SpecialSparepartDetail wDetail = new SpecialSparepartDetail();
                                        wDetail.SparepartDetail = insertedSpDetail;
                                        wDetail.SpecialSparepartId = specialSparepart.Id;
                                        wDetail.SerialNumber = sparepartManualTransaction.SerialNumber;
                                        wDetail.CreateDate = serverTime;
                                        wDetail.CreateUserId = userId;
                                        wDetail.ModifyUserId = userId;
                                        wDetail.ModifyDate = serverTime;
                                        wDetail.Status = (int)DbConstant.WheelDetailStatus.Ready;

                                        _specialSparepartDetailRepository.AttachNavigation(spDetail.CreateUser);
                                        _specialSparepartDetailRepository.AttachNavigation(spDetail.ModifyUser);
                                        _specialSparepartDetailRepository.AttachNavigation(spDetail.PurchasingDetail);
                                        _specialSparepartDetailRepository.AttachNavigation(spDetail.Sparepart);
                                        _specialSparepartDetailRepository.AttachNavigation(spDetail.SparepartManualTransaction);
                                        _specialSparepartDetailRepository.Add(wDetail);

                                        _unitOfWork.SaveChanges();
                                    }
                                }

                            }
                        }
                        else if (updateType.Code == DbConstant.REF_SPAREPART_TRANSACTION_MANUAL_TYPE_MINUS)
                        {
                            stockCard.Description = "Pengurangan stok awal";
                            //TransactionDetail transCredit = new TransactionDetail();
                            //transCredit.Credit = totalPrice;
                            //transCredit.JournalId = _journalMasterRepository.GetMany(x => x.Code == "1.01.04.01").FirstOrDefault().Id;
                            //transCredit.Parent = transaction;
                            //_transactionDetailRepository.Add(transCredit);

                            //TransactionDetail transDebit = new TransactionDetail();
                            //transDebit.Debit = totalPrice;
                            //transDebit.JournalId = _journalMasterRepository.GetMany(x => x.Code == "9.9").FirstOrDefault().Id;
                            //transDebit.Parent = transaction;
                            //_transactionDetailRepository.Add(transDebit);

                            sparepartUpdated.StockQty -= sparepartManualTransaction.Qty;
                            stockCard.QtyOut = sparepartManualTransaction.Qty;

                            List<SparepartDetail> spDetails = _sparepartDetailRepository.
                            GetMany(c => c.SparepartId == sparepartManualTransaction.SparepartId).OrderByDescending(c => c.Id)
                            .Take(sparepartManualTransaction.Qty).ToList();
                            foreach (var spDetail in spDetails)
                            {
                                spDetail.ModifyUserId = userId;
                                spDetail.ModifyDate = serverTime;
                                spDetail.Status = (int)DbConstant.SparepartDetailDataStatus.Deleted;
                                _sparepartDetailRepository.Update(spDetail);
                            }
                        }

                        SparepartStockCard lastStockCard = _sparepartStokCardRepository.RetrieveLastCard(manualTransaction.SparepartId);
                        double lastStock = 0;
                        if (lastStockCard != null)
                        {
                            lastStock = lastStockCard.QtyLast;
                        }
                        stockCard.QtyFirst = lastStock;
                        stockCard.QtyLast = lastStock + (stockCard.QtyIn - stockCard.QtyOut);
                        _sparepartStokCardRepository.AttachNavigation(stockCard.CreateUser);
                        _sparepartStokCardRepository.AttachNavigation(stockCard.Sparepart);
                        _sparepartStokCardRepository.AttachNavigation(stockCard.ReferenceTable);
                        _sparepartStokCardRepository.Add(stockCard);

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

                        //transaction.PrimaryKeyValue = manualTransaction.Id;
                        //_transactionRepository.Update(transaction);
                        //_unitOfWork.SaveChanges();
                        trans.Commit();
                    }
                }
                catch (Exception)
                {
                    trans.Rollback();
                    throw;
                }
            }
        }
        public void UpdateSparepartManualTransaction(SparepartManualTransactionViewModel sparepartManualTransaction, int userId)
        {
            DateTime serverTime = DateTime.Now;
            sparepartManualTransaction.ModifyDate = serverTime;
            sparepartManualTransaction.ModifyUserId = userId;
            Reference updateTypeNew = _referenceRepository.GetById(sparepartManualTransaction.UpdateTypeId);
            SparepartManualTransaction manualTransactionOld = _sparepartManualTransactionRepository.GetById(sparepartManualTransaction.Id);
            Sparepart sparepartUpdated = _sparepartRepository.GetById(sparepartManualTransaction.SparepartId);
            if (manualTransactionOld != null && updateTypeNew != null && sparepartUpdated != null)
            {
                Reference updateTypeOld = _referenceRepository.GetById(manualTransactionOld.UpdateTypeId);

                Reference transactionReferenceTable = _referenceRepository.GetMany(c => c.Code == DbConstant.REF_TRANSTBL_SPAREPARTMANUAL).FirstOrDefault();
                SparepartStockCard stockCard = new SparepartStockCard();
                stockCard.CreateUserId = userId;
                stockCard.CreateDate = serverTime;
                stockCard.ReferenceTableId = transactionReferenceTable.Id;
                stockCard.PrimaryKeyValue = manualTransactionOld.Id;
                stockCard.SparepartId = sparepartManualTransaction.SparepartId;

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

                stockCard.QtyFirst = lastStock;

                if (updateTypeOld.Code == (DbConstant.REF_SPAREPART_TRANSACTION_MANUAL_TYPE_PLUS))
                {
                    stockCard.Description = "Revisi pembatalan penambahan stok awal";
                    stockCard.QtyOut = manualTransactionOld.Qty;
                    sparepartUpdated.StockQty -= manualTransactionOld.Qty;
                }
                else if (updateTypeOld.Code == DbConstant.REF_SPAREPART_TRANSACTION_MANUAL_TYPE_MINUS)
                {
                    stockCard.Description = "Revisi pembatalan pengurangan stok awal";
                    stockCard.QtyIn = manualTransactionOld.Qty;
                    sparepartUpdated.StockQty += manualTransactionOld.Qty;
                }

                stockCard.QtyLast = stockCard.QtyFirst + (stockCard.QtyIn - stockCard.QtyOut);

                _sparepartStokCardRepository.AttachNavigation(stockCard.CreateUser);
                _sparepartStokCardRepository.AttachNavigation(stockCard.Sparepart);
                _sparepartStokCardRepository.AttachNavigation(stockCard.ReferenceTable);
                _sparepartStokCardRepository.Add(stockCard);
                _unitOfWork.SaveChanges();

                SparepartStockCard revStockCard = new SparepartStockCard();
                revStockCard.CreateUserId = userId;
                revStockCard.CreateDate = serverTime;
                revStockCard.ReferenceTableId = transactionReferenceTable.Id;
                revStockCard.PrimaryKeyValue = manualTransactionOld.Id;
                revStockCard.SparepartId = sparepartManualTransaction.SparepartId;

                lastStockCard = _sparepartStokCardRepository.RetrieveLastCard(sparepartManualTransaction.SparepartId);
                lastStock = 0;
                if (lastStockCard != null)
                {
                    lastStock = lastStockCard.QtyLast;
                }

                revStockCard.QtyFirst = lastStock;

                if (updateTypeNew.Code == DbConstant.REF_SPAREPART_TRANSACTION_MANUAL_TYPE_PLUS)
                {
                    revStockCard.Description = "Revisi penambahan stok awal";
                    revStockCard.QtyIn = sparepartManualTransaction.Qty;
                    sparepartUpdated.StockQty += sparepartManualTransaction.Qty;
                }
                else if (updateTypeNew.Code == DbConstant.REF_SPAREPART_TRANSACTION_MANUAL_TYPE_MINUS)
                {
                    revStockCard.Description = "Revisi pengurangan stok awal";
                    revStockCard.QtyOut = sparepartManualTransaction.Qty;
                    sparepartUpdated.StockQty -= sparepartManualTransaction.Qty;
                }

                revStockCard.QtyLast = revStockCard.QtyFirst + (revStockCard.QtyIn - revStockCard.QtyOut);

                _sparepartStokCardRepository.AttachNavigation(revStockCard.CreateUser);
                _sparepartStokCardRepository.AttachNavigation(revStockCard.Sparepart);
                _sparepartStokCardRepository.AttachNavigation(revStockCard.ReferenceTable);
                _sparepartStokCardRepository.Add(revStockCard);

                SparepartManualTransaction entity = new SparepartManualTransaction();
                Map(sparepartManualTransaction, entity);
                _sparepartManualTransactionRepository.Update(entity);
                _sparepartRepository.Update(sparepartUpdated);
                _unitOfWork.SaveChanges();
            }
        }