public void MakeAffectedChangesByReceiptNotes(string drugStoreID, params int[] noteIds) { var allModiDeliveryItemIds = new List <int>(); var allModiReceiptItemIds = new List <int>(); var allModiDrugIds = new List <int>(); var refPriceRepo = IoC.Container.Resolve <BaseRepositoryV2 <MedReportContext, ReceiptDrugPriceRef> >(); using (var trans = TransactionScopeHelper.CreateReadUncommitted()) { var modiResult = GetAffectedNoteItemsByReceiptNotes(drugStoreID, noteIds); if (modiResult == null) { return; } var modiDItemIds = refPriceRepo.GetAll().Where(i => i.DrugStoreCode == drugStoreID && !i.IsDeleted && modiResult.ItemIds.Contains(i.ReceiptNoteItemId) && modiResult.DrugIds.Contains(i.DrugId)) .Select(i => i.DeliveryNoteItemId).Distinct().ToList(); var modiDeliveryResult = GetAffectedNoteItemsByDeliveryNoteItems(drugStoreID, modiDItemIds.ToArray()); allModiReceiptItemIds.AddRange(modiResult.ItemIds); allModiDrugIds.AddRange(modiResult.DrugIds); if (modiDeliveryResult != null) { allModiDeliveryItemIds.AddRange(modiDeliveryResult.ItemIds); allModiDrugIds.AddRange(modiDeliveryResult.DrugIds); } trans.Complete(); } UpdateAffectedItems(drugStoreID, allModiDeliveryItemIds, allModiReceiptItemIds, allModiDrugIds); }
public SynthesisReportResponse GetSynthesisReportData(string drugStoreCode, FilterObject filter) { GenerateReportData(drugStoreCode); var result = new SynthesisReportResponse(); using (var trans = TransactionScopeHelper.CreateReadUncommitted()) { var deliveryService = IoC.Container.Resolve <IDeliveryNoteService>(); var rpService = IoC.Container.Resolve <IReportService>(); var warehouseSysnthesis = rpService.GetDrugWarehouseSyntheises(drugStoreCode, filter); var inOutCommingSummary = rpService.GetInOutCommingValueSumary(drugStoreCode, filter); // I.1. Tổng giá trị nhập kho result.ReceiptValueTotal = warehouseSysnthesis.Values.Sum(i => i.ReceiptInventoryValueInPeriod); // I.2. Tổng giá trị xuất kho result.DeliveryValueTotal = warehouseSysnthesis.Values.Sum(i => i.DeliveryInventoryValueInPeriod); // I.3. Tổng giá trị kho hàng result.WarehousingValueTotal = warehouseSysnthesis.Values.Sum(i => i.LastInventoryValue); // I.4. Tổng nợ khách hàng // I.4.1 Nợ bán hàng result.DeliveryDueTotal = inOutCommingSummary.DeliveryDueTotal; // I.4.2 Các khoản nợ khác result.DeliveryOtherDueTotal = inOutCommingSummary.DeliveryOtherDueTotal; // I.5. Tổng nợ nhà cung cấp // I.5.1 Nợ mua hàng result.ReceiptDueTotal = inOutCommingSummary.ReceiptDueTotal; // I.5.2 Các khoản nợ khác result.ReceiptOtherDueTotal = inOutCommingSummary.ReceiptOtherDueTotal; // II.1. Tổng thu // II.1.1. Bán hàng hóa/dịch vụ result.DeliveryIncomingTotal = inOutCommingSummary.DeliveryIncomingTotal; // II.1.2. Các nguồn thu khác result.OtherIncommingTotal = inOutCommingSummary.OtherIncommingTotal; // II.2. Tổng chi // II.2.1. Mua hàng hóa/ dịch vụ result.ReceiptOutcomingTotal = inOutCommingSummary.ReceiptOutcomingTotal; // TODO: // II.2.2. Chi phí kinh doanh result.BusinessCostsTotal = inOutCommingSummary.BusinessCostsTotal; // II.2.3. Các khoản chi khác result.OtherOutcomingTotal = inOutCommingSummary.OtherOutcomingTotal; // II.3. Lãi gộp == II.3.1 + II.1.2 // II.3.1. Lợi nhuận bán thuốc result.DeliveryRevenueTotal = deliveryService.GetDeliveryRevenueTotal(drugStoreCode, filter); trans.Complete(); } return(result); }
public NearExpiredDrugResponse GetNearExpiredDrugWarningData(string drugStoreCode, DrugStoreSetting setting, FilterObject filter, int expiredOption = (int)ExpiredFilterType.OnlyExpired) { GenerateReportData(drugStoreCode); var result = new NearExpiredDrugResponse(); using (var trans = TransactionScopeHelper.CreateReadUncommitted()) { var resultItems = GetRemainQuantityReceiptDrugItems(drugStoreCode, setting); var totalCount = resultItems.Count; if (totalCount < 1) { trans.Complete(); result.PagingResultModel = new PagingResultModel <RemainQuantityReceiptDrugItem>(resultItems, totalCount); return(result); } var drugIds = resultItems.Select(i => i.ItemId).Distinct().ToArray(); var drugService = IoC.Container.Resolve <IDrugManagementService>(); var drugsDict = drugService.GetCacheDrugs(drugStoreCode, drugIds).ToDictionary(i => i.DrugId, i => i); trans.Complete(); resultItems.ForEach(i => { if (drugsDict.ContainsKey(i.ItemId)) { var drugItem = drugsDict[i.ItemId]; var retailUnit = drugItem.Units.Where(u => u.UnitId == drugItem.RetailUnitId).FirstOrDefault(); if (retailUnit != null) { i.UnitName = retailUnit.UnitName; } if (i.NoteTypeID == (int)NoteInOutType.InitialInventory) { i.ItemDate = drugItem.CreatedDateTime; } } }); if (expiredOption == (int)ExpiredFilterType.OnlyExpired) { resultItems = resultItems.Where(i => i.IsExpired || i.IsLittleTrans).ToList(); } else if (expiredOption == (int)ExpiredFilterType.All) { resultItems = resultItems.Where(i => i.ExpiredDate.HasValue).ToList(); } totalCount = resultItems.Count(); result.PagingResultModel = new PagingResultModel <RemainQuantityReceiptDrugItem>(resultItems, totalCount); } return(result); }
public DrugTransHistoryResponse GetDrugTransHistoryData(string drugStoreCode, FilterObject filter, int noteTypeId) { var drugTransHisItems = new List <DrugTransHistoryItem>(); var result = new DrugTransHistoryResponse(); var totalCount = 0; using (var trans = TransactionScopeHelper.CreateReadUncommitted()) { if (noteTypeId == (int)NoteInOutType.Receipt) { var drugTransHisQable = _dataFilterService.GetValidReceiptNoteItems(drugStoreCode, filter).Where(i => i.NoteNumber >= 0 && i.NoteDate > MedConstants.MinProductionDataDate); totalCount = drugTransHisQable.Count(); var candidates = drugTransHisQable.OrderByDescending(i => i.NoteDate).ToPagedQueryable(filter.PageIndex, filter.PageSize, totalCount); drugTransHisItems = candidates .Select(i => new DrugTransHistoryItem() { ItemId = i.NoteId, DrugId = i.DrugId, DrugName = i.DrugName, DrugCode = i.DrugCode, UnitId = i.UnitId, UnitName = i.UnitName, Price = i.Price, Quantity = i.Quantity, Discount = i.Discount, VAT = i.VAT, Amount = i.Quantity * i.Price * (1 - i.Discount / 100) * (1 + i.VAT / 100), ItemDate = i.NoteDate.Value, ItemNumber = (int)i.NoteNumber }).ToList(); } else if (noteTypeId == (int)NoteInOutType.Delivery) { var drugTransHisQable = _dataFilterService.GetValidDeliveryNoteItems(drugStoreCode, filter).Where(i => i.NoteNumber >= 0 && i.NoteDate > MedConstants.MinProductionDataDate); totalCount = drugTransHisQable.Count(); var candidates = drugTransHisQable.OrderByDescending(i => i.NoteDate).ToPagedQueryable(filter.PageIndex, filter.PageSize, totalCount); drugTransHisItems = candidates .Select(i => new DrugTransHistoryItem() { ItemId = i.NoteId, DrugId = i.DrugId, DrugName = i.DrugName, DrugCode = i.DrugCode, UnitId = i.UnitId, UnitName = i.UnitName, Price = i.Price, Quantity = i.Quantity, Discount = i.Discount, VAT = i.VAT, Amount = i.Quantity * i.Price * (1 - i.Discount / 100) * (1 + i.VAT / 100), ItemDate = i.NoteDate.Value, ItemNumber = (int)i.NoteNumber }).ToList(); } trans.Complete(); } var order = filter.PageIndex * filter.PageSize; drugTransHisItems.ForEach(i => { order++; i.Order = order; }); result.PagingResultModel = new PagingResultModel <DrugTransHistoryItem>(drugTransHisItems, totalCount); return(result); }
public RevenueDrugSynthesisResponse GetRevenueDrugSynthesis(string drugStoreCode, FilterObject filter) { var revenueDrugItems = new List <RevenueDrugItem>(); var result = new RevenueDrugSynthesisResponse() { Total = 0.0, Revenue = 0.0, DeliveryTotal = 0.0, DebtTotal = 0.0 }; var rpDataService = IoC.Container.Resolve <IReportGenDataService>(); rpDataService.GenerateReceiptDrugPriceRefs(drugStoreCode); using (var tran = TransactionScopeHelper.CreateReadUncommitted()) { var deliveryService = IoC.Container.Resolve <IDeliveryNoteService>(); var deliveryStatuses = new int[] { (int)NoteInOutType.Delivery }; var deliveryItems = deliveryService.GetDeliveryNoteItems(drugStoreCode, filter, deliveryStatuses); if (deliveryItems.Count <= 0) { result.PagingResultModel = new PagingResultModel <RevenueDrugItem>(revenueDrugItems, revenueDrugItems.Count); return(result); } var candidates = deliveryItems.OrderBy(i => i.NoteDate).GroupBy(i => i.NoteId); var order = 0; foreach (var cand in candidates) { order++; var idx = 0; var subItems = cand.ToList(); foreach (var di in subItems) { var revenueDrugItem = new RevenueDrugItem() { Order = idx == 0 ? order.ToString() : string.Empty, DeliveryNoteId = di.NoteId, CustomerName = idx == 0 ? di.CustomerName : string.Empty, DrugCode = di.DrugCode, DrugName = di.DrugName, UnitName = di.UnitName, //Quantity = di.FinalRealQuantity, Quantity = di.Quantity, Price = di.Price, Discount = di.Discount, Amount = di.FinalAmount, // Effected by discount & VAT Revenue = di.Revenue, NoteNumber = idx == 0 ? di.NoteNumber.ToString() : string.Empty, VAT = idx == 0 ? (double?)di.VAT : null, DebtAmount = idx == 0 ? di.DebtAmount : 0 }; revenueDrugItems.Add(revenueDrugItem); result.DeliveryTotal += revenueDrugItem.Amount; result.Revenue += revenueDrugItem.Revenue; result.DebtTotal += revenueDrugItem.DebtAmount; idx++; } } var receiptNoteService = IoC.Container.Resolve <IReceiptNoteService>(); var noteItemsReturnFromCustomers = receiptNoteService.GetReceiptNoteItems(drugStoreCode, filter, new int[] { (int)NoteInOutType.ReturnFromCustomer }); var returnedCandidates = noteItemsReturnFromCustomers.OrderBy(i => i.NoteDate).GroupBy(i => i.NoteId); foreach (var cand in returnedCandidates) { order++; var idx = 0; var subItems = cand.ToList(); foreach (var di in subItems) { var revenueDrugItem = new RevenueDrugItem() { Order = idx == 0 ? order.ToString() : string.Empty, DeliveryNoteId = di.NoteId, CustomerName = idx == 0 ? String.Format("{0} (trả hàng)", di.CustomerName) : string.Empty, DrugCode = di.DrugCode, DrugName = di.DrugName, UnitName = di.UnitName, Quantity = di.Quantity, Price = di.Price, Discount = di.Discount, Amount = -di.Amount, Revenue = 0, NoteNumber = idx == 0 ? di.NoteNumber.ToString() : string.Empty, VAT = idx == 0 ? (double?)di.VAT : null, IsReturnFromCustomer = true }; revenueDrugItems.Add(revenueDrugItem); result.DeliveryTotal += revenueDrugItem.Amount; //result.Revenue += -di.RetailAmount; idx++; } } } result.Total = result.DeliveryTotal - result.DebtTotal; result.PagingResultModel = new PagingResultModel <RevenueDrugItem>(revenueDrugItems, revenueDrugItems.Count); return(result); }
public DrugWarehouseResponse GetDrugWarehouses(string drugStoreCode, FilterObject filter) { GenerateReportData(drugStoreCode); var drugWarehouseItems = new List <DrugWarehouseItem>(); var result = new DrugWarehouseResponse(); var rpService = IoC.Container.Resolve <IReportService>(); var totalCount = 0; using (var trans = TransactionScopeHelper.CreateReadUncommitted()) { var drugUnitRep = IoC.Container.Resolve <BaseRepositoryV2 <MedDbContext, DonViTinh> >(); var drugQueryable = (from dr in _dataFilterService.GetValidDrugs(drugStoreCode, filter, false) join u in drugUnitRep.GetAll() on dr.DonViXuatLe_MaDonViTinh equals u.MaDonViTinh select new { DrugId = dr.ThuocId, DrugCode = dr.MaThuoc, DrugName = dr.TenThuoc, DrugRetailUnitName = u.TenDonViTinh, DrugGroupId = dr.NhomThuoc_MaNhomThuoc }); totalCount = drugQueryable.Count(); var drugCandidates = drugQueryable.OrderBy(i => i.DrugGroupId) .ThenByDescending(i => i.DrugName).ToPagedQueryable(filter.PageIndex, filter.PageSize, totalCount); var drugs = drugCandidates.ToDictionary(i => i.DrugId, i => i); var drugIds = drugs.Keys.ToArray(); filter.DrugIds = drugIds; var drugWarehouses = rpService.GetDrugWarehouseSyntheises(drugStoreCode, filter); var order = filter.PageIndex * filter.PageSize; drugWarehouses.ForEach(item => { order++; var cand = item.Value; var drug = drugs[cand.DrugId]; drugWarehouseItems.Add(new DrugWarehouseItem() { DrugId = cand.DrugId, Order = order, DrugCode = drug.DrugCode, DrugName = drug.DrugName, DrugRetailUnitName = drug.DrugRetailUnitName, FirstInventoryQuantity = cand.FirstInventoryQuantity, FirstInventoryValue = cand.FirstInventoryValue, ReceiptInventoryQuantityInPeriod = cand.ReceiptInventoryQuantityInPeriod, ReceiptInventoryValueInPeriod = cand.ReceiptInventoryValueInPeriod, DeliveryInventoryQuantityInPeriod = cand.DeliveryInventoryQuantityInPeriod, DeliveryInventoryValueInPeriod = cand.DeliveryInventoryValueInPeriod, LastInventoryQuantity = cand.LastInventoryQuantity, LastInventoryValue = cand.LastInventoryValue }); }); result.DeliveryValueTotal = drugWarehouseItems.Sum(i => i.DeliveryInventoryValueInPeriod); result.FirsInventoryValueTotal = drugWarehouseItems.Sum(i => i.FirstInventoryValue); result.LastInventoryValueTotal = drugWarehouseItems.Sum(i => i.LastInventoryValue); result.ReceiptValueTotal = drugWarehouseItems.Sum(i => i.ReceiptInventoryValueInPeriod); result.PagingResultModel = new PagingResultModel <DrugWarehouseItem>(drugWarehouseItems, totalCount); } return(result); }
public NegativeRevenueResponse GetNegativeRevenueWarningData(string drugStoreCode, FilterObject filter) { GenerateReportData(drugStoreCode); var result = new NegativeRevenueResponse(); var resultItems = new List <NegativeRevenueItem>(); var totalCount = 0; using (var trans = TransactionScopeHelper.CreateReadUncommitted()) { var deliverySnapshots = _dataFilterService.GetValidDeliveryItemSnapshots(drugStoreCode, filter); var deliveryItems = _dataFilterService.GetValidDeliveryNoteItems(drugStoreCode, null); var receiptItems = _dataFilterService.GetValidReceiptNoteItems(drugStoreCode, null); var priceRefItems = _dataFilterService.GetValidReceiptDrugPriceRefs(drugStoreCode, null); var drugs = _dataFilterService.GetValidDrugs(drugStoreCode, filter, false); var negCands = (from s in deliverySnapshots join p in priceRefItems on s.DeliveryNoteItemId equals p.DeliveryNoteItemId where s.NegativeRevenue == true select new NegativeRevenueInfo { DrugId = s.DrugId, DeliveryNoteItemId = s.DeliveryNoteItemId, ReceiptNoteItemId = p.ReceiptNoteItemId, Revenue = s.Revenue }).ToList(); var cands = negCands.GroupBy(i => i.DrugId).ToDictionary(i => i.Key, i => i.ToList()); var deliveryDrugIds = cands.Select(i => i.Key).ToList(); totalCount = deliveryDrugIds.Count(); if (totalCount < 1) { trans.Complete(); result.PagingResultModel = new PagingResultModel <NegativeRevenueItem>(resultItems, totalCount); return(result); } var deliveryNoteItemIds = negCands.Select(i => i.DeliveryNoteItemId).Distinct().ToList(); var receiptNoteItemIds = negCands.Select(i => i.ReceiptNoteItemId).Distinct().ToList(); var deliveryItemInfos = deliveryItems.Where(i => deliveryNoteItemIds.Contains(i.NoteItemId)) .Select(i => new { i.NoteId, i.NoteNumber, i.NoteItemId }) .ToList().GroupBy(i => i.NoteItemId).ToDictionary(i => i.Key, i => i.FirstOrDefault()); var receiptItemInfos = receiptItems.Where(i => receiptNoteItemIds.Contains(i.NoteItemId)) .Select(i => new { i.NoteId, i.NoteNumber, i.NoteItemId }) .ToList().GroupBy(i => i.NoteItemId).ToDictionary(i => i.Key, i => i.FirstOrDefault()); negCands.ForEach(i => { if (deliveryItemInfos.ContainsKey(i.DeliveryNoteItemId)) { i.DeliveryNoteId = deliveryItemInfos[i.DeliveryNoteItemId].NoteId; i.DeliveryNoteNumber = (int)deliveryItemInfos[i.DeliveryNoteItemId].NoteNumber; } if (receiptItemInfos.ContainsKey(i.ReceiptNoteItemId)) { i.ReceiptNoteId = receiptItemInfos[i.ReceiptNoteItemId].NoteId; i.ReceiptNoteNumber = (int)receiptItemInfos[i.ReceiptNoteItemId].NoteNumber; } }); var drugInfos = drugs.Where(i => deliveryDrugIds.Contains(i.ThuocId)) .Select(i => new { DrugId = i.ThuocId, DrugCode = i.MaThuoc, DrugName = i.TenThuoc }) .ToDictionary(i => i.DrugId, i => i); trans.Complete(); deliveryDrugIds.ForEach(i => { if (drugInfos.ContainsKey(i)) { var subCands = cands[i]; var drug = drugInfos[i]; var firstCand = subCands.FirstOrDefault(); var drugDeliveryNoteItemIds = subCands.Select(ii => ii.DeliveryNoteItemId).ToList(); var deliveryNumberPairs = deliveryItemInfos.Where(ii => drugDeliveryNoteItemIds.Contains(ii.Key)) .Select(ii => new NoteNumberIdPair() { NoteId = ii.Value.NoteId, NoteNumber = ii.Value.NoteNumber, }).DistinctBy(ii => ii.NoteId).ToList(); var drugReceiptNoteItemIds = subCands.Select(ii => ii.ReceiptNoteItemId).ToList(); var receiptNoteNumbers = receiptItemInfos.Where(ii => drugReceiptNoteItemIds.Contains(ii.Key)) .Select(ii => new NoteNumberIdPair() { NoteId = ii.Value.NoteId, NoteNumber = ii.Value.NoteNumber }).DistinctBy(ii => ii.NoteId).ToList(); var deliveryNoteNumbers = deliveryNumberPairs.Select(ii => new DeliveryNoteNumberPair() { DeliveryNumber = ii }).ToList(); deliveryNoteNumbers.ForEach(ii => { var refReceiptNoteIds = subCands.Where(c => c.DeliveryNoteId == ii.DeliveryNumber.NoteId) .Select(c => c.ReceiptNoteId).Distinct().ToList(); if (refReceiptNoteIds.Any()) { ii.RefReceiptNumbers = receiptNoteNumbers.Where(c => refReceiptNoteIds.Contains(c.NoteId)) .ToList(); } }); var revItem = new NegativeRevenueItem() { ItemCode = drug.DrugCode, ItemName = drug.DrugName, Amount = firstCand.Revenue, DeliveryNoteNumbers = deliveryNoteNumbers }; resultItems.Add(revItem); } }); } result.PagingResultModel = new PagingResultModel <NegativeRevenueItem>(resultItems, totalCount); return(result); }