コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
        }