public List <SPKDetailSparepartDetail> getRandomSPKDetails(int sparepartId, int qty, int ssDetailId) { List <SparepartManualTransaction> spManuals = new List <SparepartManualTransaction>(); List <PurchasingDetail> purchasingDetails = new List <PurchasingDetail>(); List <SPKDetailSparepartDetail> result = new List <SPKDetailSparepartDetail>(); if (qty > 0 && sparepartId > 0) { int qtyRemains = qty; List <SparepartManualTransaction> spManual = _sparepartManualTransactionRepository .GetMany( spd => spd.SparepartId == sparepartId && spd.QtyRemaining > 0 ) .OrderBy(spd => spd.CreateDate).ToList(); foreach (var itemManual in spManual) { if (itemManual.QtyRemaining > qtyRemains) { itemManual.QtyRemaining = itemManual.QtyRemaining - qtyRemains; SPKDetailSparepartDetail spkspd = new SPKDetailSparepartDetail { SparepartManualTransaction = itemManual, SparepartManualTransactionId = itemManual.Id, SPKDetailSparepartId = itemManual.SparepartId, Qty = qtyRemains }; if (ssDetailId > 0) { spkspd.SpecialSparepartDetailId = ssDetailId; } result.Add(spkspd); qtyRemains = 0; } else { SPKDetailSparepartDetail spkspd = new SPKDetailSparepartDetail { SparepartManualTransaction = itemManual, SparepartManualTransactionId = itemManual.Id, SPKDetailSparepartId = itemManual.SparepartId, Qty = itemManual.QtyRemaining }; if (ssDetailId > 0) { spkspd.SpecialSparepartDetailId = ssDetailId; } result.Add(spkspd); qtyRemains -= itemManual.QtyRemaining; itemManual.QtyRemaining = 0; } if (qtyRemains == 0) { break; } } if (qtyRemains > 0) { List <PurchasingDetail> purchasingDetail = _purchasingDetailRepository .GetMany( spd => spd.SparepartId == sparepartId && spd.QtyRemaining > 0 ) .OrderBy(spd => spd.CreateDate).ToList(); foreach (var itemPD in purchasingDetail) { if (itemPD.QtyRemaining > qtyRemains) { itemPD.QtyRemaining = itemPD.QtyRemaining - qtyRemains; SPKDetailSparepartDetail spkspd = new SPKDetailSparepartDetail { PurchasingDetail = itemPD, PurchasingDetailId = itemPD.Id, SPKDetailSparepartId = itemPD.SparepartId, Qty = qtyRemains }; if (ssDetailId > 0) { spkspd.SpecialSparepartDetailId = ssDetailId; } result.Add(spkspd); qtyRemains = 0; } else { SPKDetailSparepartDetail spkspd = new SPKDetailSparepartDetail { PurchasingDetail = itemPD, PurchasingDetailId = itemPD.Id, SPKDetailSparepartId = itemPD.SparepartId, Qty = itemPD.QtyRemaining }; if (ssDetailId > 0) { spkspd.SpecialSparepartDetailId = ssDetailId; } result.Add(spkspd); qtyRemains -= itemPD.QtyRemaining; itemPD.QtyRemaining = 0; } if (qtyRemains == 0) { break; } } } } return(result); }
public void RepairInvoice() { DateTime start = new DateTime(2018, 11, 1); DateTime serverTime = DateTime.Now; List <Invoice> invList = _invoiceRepository.GetMany(i => i.CreateDate >= start).ToList(); using (var trans = _unitOfWork.BeginTransaction()) { try { foreach (Invoice inv in invList) { List <InvoiceDetail> invDetails = _invoiceDetailRepository.GetMany(ivd => ivd.InvoiceId == inv.Id).ToList(); List <SPKDetailSparepart> spkSps = _spkDetailSparepartRepository.GetMany(spkspd => spkspd.SPKId == inv.SPKId).ToList(); List <int> spkSpsId = spkSps.Select(x => x.Id).ToList(); List <SPKDetailSparepartDetail> spkSPDetails = _spkDetailSparepartDetailRepository.GetMany(spkspdt => spkSpsId.Contains(spkspdt.SPKDetailSparepartId)).ToList(); if (spkSPDetails.Count < spkSps.Count) { spkSps = spkSps.Where(spksp => !spkSPDetails.Any(spkspdt => spkspdt.SPKDetailSparepartId == spksp.Id)).ToList(); foreach (SPKDetailSparepart item in spkSps) { SpecialSparepartDetail sspd = _specialSparepartDetailRepository.GetMany(e => e.SparepartId == item.SparepartId).FirstOrDefault(); List <SPKDetailSparepartDetail> newSPKdetailSparepartDetails = getRandomSPKDetails(item.SparepartId, item.TotalQuantity, sspd != null? sspd.Id : 0); foreach (SPKDetailSparepartDetail spkDetailSparepartDetail in newSPKdetailSparepartDetails) { SPKDetailSparepartDetail newSPKSparepartDetail = new SPKDetailSparepartDetail(); newSPKSparepartDetail.CreateDate = item.CreateDate; newSPKSparepartDetail.CreateUserId = item.CreateUserId; newSPKSparepartDetail.ModifyDate = serverTime; newSPKSparepartDetail.ModifyUserId = item.ModifyUserId; newSPKSparepartDetail.Status = (int)DbConstant.DefaultDataStatus.Active; newSPKSparepartDetail.SPKDetailSparepartId = item.Id; newSPKSparepartDetail.Qty = spkDetailSparepartDetail.Qty; if (sspd != null) { newSPKSparepartDetail.SpecialSparepartDetailId = sspd.Id; sspd.Status = (int)DbConstant.WheelDetailStatus.Installed; _specialSparepartDetailRepository.Update(sspd); } if (spkDetailSparepartDetail.PurchasingDetailId.HasValue) { newSPKSparepartDetail.PurchasingDetailId = spkDetailSparepartDetail.PurchasingDetailId; PurchasingDetail pdt = spkDetailSparepartDetail.PurchasingDetail; pdt.ModifyDate = serverTime; pdt.ModifyUserId = item.CreateUserId; _purchasingDetailRepository.Update(pdt); } else if (spkDetailSparepartDetail.SparepartManualTransactionId.HasValue) { newSPKSparepartDetail.SparepartManualTransactionId = spkDetailSparepartDetail.SparepartManualTransactionId; SparepartManualTransaction spm = spkDetailSparepartDetail.SparepartManualTransaction; spm.ModifyDate = serverTime; spm.ModifyUserId = item.CreateUserId; _sparepartManualTransactionRepository.Update(spm); } SPKDetailSparepartDetail insertedSPKSpDtl = _spkDetailSparepartDetailRepository.Add(newSPKSparepartDetail); InvoiceDetail invcDtl = new InvoiceDetail(); invcDtl.InvoiceId = inv.Id; invcDtl.SPKDetailSparepartDetail = insertedSPKSpDtl; if (spkDetailSparepartDetail.PurchasingDetailId > 0) { invcDtl.SubTotalPrice = spkDetailSparepartDetail.PurchasingDetail.Price.AsDouble(); } else { invcDtl.SubTotalPrice = spkDetailSparepartDetail.SparepartManualTransaction.Price.AsDouble(); } invcDtl.Status = (int)DbConstant.DefaultDataStatus.Active; invcDtl.FeePctg = 0; invcDtl.CreateDate = serverTime; invcDtl.ModifyDate = serverTime; invcDtl.ModifyUserId = item.CreateUserId; invcDtl.CreateUserId = item.CreateUserId; _invoiceDetailRepository.Add(invcDtl); _unitOfWork.SaveChanges(); } } } } trans.Commit(); } catch (Exception ex) { trans.Rollback(); throw; } } }